action buttons in table columns to have a fixed size fitting the content
This commit is contained in:
parent
9822a217b6
commit
5b40e57a25
4
.gitignore
vendored
4
.gitignore
vendored
@ -1,3 +1,3 @@
|
||||
anime_backlog.db
|
||||
./images
|
||||
./__pycache__
|
||||
images/
|
||||
__pycache__/
|
||||
|
@ -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)
|
48
frontend.py
48
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_())
|
Loading…
Reference in New Issue
Block a user