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
|
anime_backlog.db
|
||||||
./images
|
images/
|
||||||
./__pycache__
|
__pycache__/
|
||||||
|
@ -112,4 +112,4 @@ class AnimeBackend:
|
|||||||
with open(file_name, 'w', newline='') as f:
|
with open(file_name, 'w', newline='') as f:
|
||||||
writer = csv.writer(f)
|
writer = csv.writer(f)
|
||||||
writer.writerow(['id', 'name', 'year', 'season', 'status', 'type', 'comment', 'url'])
|
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
|
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
|
||||||
@ -383,4 +411,4 @@ if __name__ == '__main__':
|
|||||||
app = QApplication(sys.argv)
|
app = QApplication(sys.argv)
|
||||||
window = AnimeTracker()
|
window = AnimeTracker()
|
||||||
window.show()
|
window.show()
|
||||||
sys.exit(app.exec_())
|
sys.exit(app.exec_())
|
Loading…
Reference in New Issue
Block a user