arcaea-offline-pyside-ui/ui/implements/tabs/tabDb/tabDb_ScoreTableViewer.py

122 lines
4.2 KiB
Python

from PySide6.QtCore import Qt, Slot
from PySide6.QtGui import QColor, QPalette
from PySide6.QtWidgets import QMessageBox
from ui.extends.shared.delegates.chartDelegate import ChartDelegate
from ui.extends.shared.delegates.scoreDelegate import ScoreDelegate
from ui.extends.shared.language import LanguageChangeEventFilter
from ui.extends.shared.models.tables.score import (
DbScoreTableModel,
DbScoreTableSortFilterProxyModel,
)
from ui.implements.components.dbTableViewer import DbTableViewer
class TableChartDelegate(ChartDelegate):
def getChart(self, index):
return index.data(DbScoreTableModel.ChartRole)
def getSong(self, index):
return index.data(DbScoreTableModel.SongRole)
def getDifficulty(self, index):
return index.data(DbScoreTableModel.DifficultyRole)
class TableScoreDelegate(ScoreDelegate):
def getChart(self, index):
return index.data(DbScoreTableModel.ChartRole)
def getScore(self, index):
return index.data(DbScoreTableModel.ScoreRole)
def setModelData(self, editor, model, index):
if super().confirmSetModelData(editor):
model.setData(index, editor.value(), DbScoreTableModel.ScoreRole)
class DbScoreTableViewer(DbTableViewer):
def __init__(self, parent=None):
super().__init__(parent)
self.languageChangeEventFilter = LanguageChangeEventFilter(self)
self.installEventFilter(self.languageChangeEventFilter)
self.tableModel = DbScoreTableModel(self)
self.tableProxyModel = DbScoreTableSortFilterProxyModel(self)
self.tableProxyModel.setSourceModel(self.tableModel)
self.tableView.setModel(self.tableProxyModel)
self.tableView.setItemDelegateForColumn(1, TableChartDelegate(self.tableView))
self.tableView.setItemDelegateForColumn(2, TableScoreDelegate(self.tableView))
tableViewPalette = QPalette(self.tableView.palette())
highlightColor = QColor(tableViewPalette.color(QPalette.ColorRole.Highlight))
highlightColor.setAlpha(25)
tableViewPalette.setColor(QPalette.ColorRole.Highlight, highlightColor)
self.tableView.setPalette(tableViewPalette)
self.tableModel.rowsInserted.connect(self.resizeTableView)
self.tableModel.dataChanged.connect(self.resizeTableView)
self.fillSortComboBox()
def fillSortComboBox(self):
self.sort_comboBox.addItem("ID", [0, 1])
self.sort_comboBox.addItem(
"Score", [2, DbScoreTableSortFilterProxyModel.Sort_C2_ScoreRole]
)
self.sort_comboBox.addItem(
"Time", [2, DbScoreTableSortFilterProxyModel.Sort_C2_TimeRole]
)
self.sort_comboBox.addItem("Potential", [3, 1])
self.sort_comboBox.setCurrentIndex(0)
self.on_sort_comboBox_activated()
@Slot()
def resizeTableView(self):
self.tableView.resizeRowsToContents()
self.tableView.resizeColumnsToContents()
@Slot()
def on_sort_comboBox_activated(self):
self.sortProxyModel()
@Slot()
def on_sort_descendingCheckBox_toggled(self):
self.sortProxyModel()
@Slot()
def sortProxyModel(self):
if self.sort_comboBox.currentIndex() > -1:
column, role = self.sort_comboBox.currentData()
self.tableProxyModel.setSortRole(role)
self.tableProxyModel.sort(
column,
Qt.SortOrder.DescendingOrder
if self.sort_descendingCheckBox.isChecked()
else Qt.SortOrder.AscendingOrder,
)
@Slot()
def on_action_removeSelectedButton_clicked(self):
rows = [
srcIndex.row()
for srcIndex in [
self.tableProxyModel.mapToSource(proxyIndex)
for proxyIndex in self.tableView.selectionModel().selectedRows()
]
]
result = QMessageBox.warning(
self,
"Warning",
f"Removing {len(rows)} row(s). Are you sure?",
QMessageBox.StandardButton.Yes,
QMessageBox.StandardButton.No,
)
if result == QMessageBox.StandardButton.Yes:
self.tableModel.removeRowList(rows)
@Slot()
def on_refreshButton_clicked(self):
self.tableModel.syncDb()
self.resizeTableView()