From 5b40e57a255f9a1c1cb290444745df08b0608aa2 Mon Sep 17 00:00:00 2001 From: Bernd Date: Sat, 19 Jul 2025 23:48:57 +0500 Subject: [PATCH] action buttons in table columns to have a fixed size fitting the content --- .gitignore | 4 ++-- backend.py | 2 +- frontend.py | 48 ++++++++++++++++++++++++++++++++++++++---------- 3 files changed, 41 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index e1d80f1..fb1768e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ anime_backlog.db -./images -./__pycache__ +images/ +__pycache__/ diff --git a/backend.py b/backend.py index 9fc28d6..3b142a7 100644 --- a/backend.py +++ b/backend.py @@ -112,4 +112,4 @@ class AnimeBackend: with open(file_name, 'w', newline='') as f: writer = csv.writer(f) writer.writerow(['id', 'name', 'year', 'season', 'status', 'type', 'comment', 'url']) - writer.writerows(rows) + writer.writerows(rows) \ No newline at end of file diff --git a/frontend.py b/frontend.py index 141e3a9..3c3928b 100644 --- a/frontend.py +++ b/frontend.py @@ -6,10 +6,10 @@ import hashlib import html from datetime import datetime from PyQt5.QtWidgets import ( - QMainWindow, QTabWidget, QWidget, QVBoxLayout, QTableWidget, QTableWidgetItem, + QMainWindow, QTabWidget, QScrollArea, QWidget, QVBoxLayout, QTableWidget, QTableWidgetItem, QLabel, QToolButton, QHBoxLayout, QDialog, QFormLayout, QLineEdit, QSpinBox, QComboBox, QTextEdit, QDialogButtonBox, QAction, QFileDialog, QMessageBox, - QInputDialog, QApplication, QAbstractItemView + QInputDialog, QApplication, QAbstractItemView, QSizePolicy, QHeaderView ) from PyQt5.QtCore import Qt, QUrl, QEvent from PyQt5.QtGui import QColor, QIcon @@ -140,11 +140,14 @@ class AnimeTracker(QMainWindow): self.tab_widget.clear() # Pre-2010 tab pre_entries = self.backend.get_pre_2010_entries() - pre_tab = QWidget() - layout = QVBoxLayout(pre_tab) + pre_tab = QScrollArea() + pre_tab.setWidgetResizable(True) + pre_content = QWidget() + pre_layout = QVBoxLayout(pre_content) if pre_entries: table = self.create_table_widget(pre_entries, is_pre=True) - layout.addWidget(table) + pre_layout.addWidget(table) + pre_tab.setWidget(pre_content) tab_text = "Pre-2010" completed = False total = len(pre_entries) @@ -160,8 +163,10 @@ class AnimeTracker(QMainWindow): # Years >= 2010 years = self.backend.get_years() for year in years: - year_tab = QWidget() - layout = QVBoxLayout(year_tab) + year_tab = QScrollArea() + year_tab.setWidgetResizable(True) + content = QWidget() + layout = QVBoxLayout(content) total_entries = 0 comp_entries = 0 for season in ['winter', 'spring', 'summer', 'fall', '']: @@ -174,6 +179,7 @@ class AnimeTracker(QMainWindow): layout.addWidget(table) total_entries += len(entries) comp_entries += sum(1 for e in entries if e[4] == 'completed') + year_tab.setWidget(content) if total_entries > 0: perc = (comp_entries / total_entries * 100) if total_entries > 0 else 0 tab_text = f"{year} ({perc:.0f}%)" @@ -189,8 +195,24 @@ class AnimeTracker(QMainWindow): table.setHorizontalHeaderLabels(headers) table.setAlternatingRowColors(True) table.setShowGrid(True) - table.horizontalHeader().setStretchLastSection(True) + header = table.horizontalHeader() + header.setStretchLastSection(False) table.setSelectionBehavior(QAbstractItemView.SelectRows) + table.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) + table.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) + if is_pre: + header.setSectionResizeMode(0, QHeaderView.ResizeToContents) # Year + header.setSectionResizeMode(1, QHeaderView.Stretch) # Name + header.setSectionResizeMode(2, QHeaderView.ResizeToContents) # Type + header.setSectionResizeMode(3, QHeaderView.ResizeToContents) # Status + header.setSectionResizeMode(4, QHeaderView.Stretch) # Comment + header.setSectionResizeMode(5, QHeaderView.ResizeToContents) # Actions + else: + header.setSectionResizeMode(0, QHeaderView.Stretch) # Name + header.setSectionResizeMode(1, QHeaderView.ResizeToContents) # Type + header.setSectionResizeMode(2, QHeaderView.ResizeToContents) # Status + header.setSectionResizeMode(3, QHeaderView.Stretch) # Comment + header.setSectionResizeMode(4, QHeaderView.ResizeToContents) # Actions for row, entry in enumerate(entries): col = 0 if is_pre: @@ -219,6 +241,12 @@ class AnimeTracker(QMainWindow): actions_widget = self.create_actions_widget(entry[0], entry[4]) table.setCellWidget(row, col, actions_widget) table.resizeColumnsToContents() + table.resizeRowsToContents() + # Calculate fixed height + height = table.horizontalHeader().height() + 2 # small margin + for i in range(table.rowCount()): + height += table.rowHeight(i) + table.setFixedHeight(height) # Apply status colors status_col = 3 if is_pre else 2 for r in range(table.rowCount()): @@ -350,7 +378,7 @@ class AnimeTracker(QMainWindow): return tab_text = self.tab_widget.tabText(self.tab_widget.currentIndex()) is_pre = 'Pre-2010' in tab_text - current_widget = self.tab_widget.currentWidget() + current_widget = self.tab_widget.currentWidget().widget() if isinstance(self.tab_widget.currentWidget(), QScrollArea) else self.tab_widget.currentWidget() tables = current_widget.findChildren(QTableWidget) name_col = 1 if is_pre else 0 status_col = 3 if is_pre else 2 @@ -383,4 +411,4 @@ if __name__ == '__main__': app = QApplication(sys.argv) window = AnimeTracker() window.show() - sys.exit(app.exec_()) + sys.exit(app.exec_()) \ No newline at end of file