action buttons in table columns to have a fixed size fitting the content

This commit is contained in:
Bernd 2025-07-19 23:48:57 +05:00
parent 9822a217b6
commit 5b40e57a25
3 changed files with 41 additions and 13 deletions

4
.gitignore vendored
View File

@ -1,3 +1,3 @@
anime_backlog.db anime_backlog.db
./images images/
./__pycache__ __pycache__/

View File

@ -6,10 +6,10 @@ import hashlib
import html import html
from datetime import datetime from datetime import datetime
from PyQt5.QtWidgets import ( from PyQt5.QtWidgets import (
QMainWindow, QTabWidget, QWidget, QVBoxLayout, QTableWidget, QTableWidgetItem, QMainWindow, QTabWidget, QScrollArea, QWidget, QVBoxLayout, QTableWidget, QTableWidgetItem,
QLabel, QToolButton, QHBoxLayout, QDialog, QFormLayout, QLineEdit, QSpinBox, QLabel, QToolButton, QHBoxLayout, QDialog, QFormLayout, QLineEdit, QSpinBox,
QComboBox, QTextEdit, QDialogButtonBox, QAction, QFileDialog, QMessageBox, QComboBox, QTextEdit, QDialogButtonBox, QAction, QFileDialog, QMessageBox,
QInputDialog, QApplication, QAbstractItemView QInputDialog, QApplication, QAbstractItemView, QSizePolicy, QHeaderView
) )
from PyQt5.QtCore import Qt, QUrl, QEvent from PyQt5.QtCore import Qt, QUrl, QEvent
from PyQt5.QtGui import QColor, QIcon from PyQt5.QtGui import QColor, QIcon
@ -140,11 +140,14 @@ class AnimeTracker(QMainWindow):
self.tab_widget.clear() self.tab_widget.clear()
# Pre-2010 tab # Pre-2010 tab
pre_entries = self.backend.get_pre_2010_entries() pre_entries = self.backend.get_pre_2010_entries()
pre_tab = QWidget() pre_tab = QScrollArea()
layout = QVBoxLayout(pre_tab) pre_tab.setWidgetResizable(True)
pre_content = QWidget()
pre_layout = QVBoxLayout(pre_content)
if pre_entries: if pre_entries:
table = self.create_table_widget(pre_entries, is_pre=True) 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" tab_text = "Pre-2010"
completed = False completed = False
total = len(pre_entries) total = len(pre_entries)
@ -160,8 +163,10 @@ class AnimeTracker(QMainWindow):
# Years >= 2010 # Years >= 2010
years = self.backend.get_years() years = self.backend.get_years()
for year in years: for year in years:
year_tab = QWidget() year_tab = QScrollArea()
layout = QVBoxLayout(year_tab) year_tab.setWidgetResizable(True)
content = QWidget()
layout = QVBoxLayout(content)
total_entries = 0 total_entries = 0
comp_entries = 0 comp_entries = 0
for season in ['winter', 'spring', 'summer', 'fall', '']: for season in ['winter', 'spring', 'summer', 'fall', '']:
@ -174,6 +179,7 @@ class AnimeTracker(QMainWindow):
layout.addWidget(table) layout.addWidget(table)
total_entries += len(entries) total_entries += len(entries)
comp_entries += sum(1 for e in entries if e[4] == 'completed') comp_entries += sum(1 for e in entries if e[4] == 'completed')
year_tab.setWidget(content)
if total_entries > 0: if total_entries > 0:
perc = (comp_entries / total_entries * 100) if total_entries > 0 else 0 perc = (comp_entries / total_entries * 100) if total_entries > 0 else 0
tab_text = f"{year} ({perc:.0f}%)" tab_text = f"{year} ({perc:.0f}%)"
@ -189,8 +195,24 @@ class AnimeTracker(QMainWindow):
table.setHorizontalHeaderLabels(headers) table.setHorizontalHeaderLabels(headers)
table.setAlternatingRowColors(True) table.setAlternatingRowColors(True)
table.setShowGrid(True) table.setShowGrid(True)
table.horizontalHeader().setStretchLastSection(True) header = table.horizontalHeader()
header.setStretchLastSection(False)
table.setSelectionBehavior(QAbstractItemView.SelectRows) 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): for row, entry in enumerate(entries):
col = 0 col = 0
if is_pre: if is_pre:
@ -219,6 +241,12 @@ class AnimeTracker(QMainWindow):
actions_widget = self.create_actions_widget(entry[0], entry[4]) actions_widget = self.create_actions_widget(entry[0], entry[4])
table.setCellWidget(row, col, actions_widget) table.setCellWidget(row, col, actions_widget)
table.resizeColumnsToContents() 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 # Apply status colors
status_col = 3 if is_pre else 2 status_col = 3 if is_pre else 2
for r in range(table.rowCount()): for r in range(table.rowCount()):
@ -350,7 +378,7 @@ class AnimeTracker(QMainWindow):
return return
tab_text = self.tab_widget.tabText(self.tab_widget.currentIndex()) tab_text = self.tab_widget.tabText(self.tab_widget.currentIndex())
is_pre = 'Pre-2010' in tab_text 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) tables = current_widget.findChildren(QTableWidget)
name_col = 1 if is_pre else 0 name_col = 1 if is_pre else 0
status_col = 3 if is_pre else 2 status_col = 3 if is_pre else 2