fix: DbB30TableModel

This commit is contained in:
283375 2023-10-23 16:08:51 +08:00
parent 38d2e4ad5a
commit d460e935b4
Signed by: 283375
SSH Key Fingerprint: SHA256:UcX0qg6ZOSDOeieKPGokA5h7soykG61nz2uxuQgVLSk
3 changed files with 93 additions and 94 deletions

View File

@ -1,6 +1,5 @@
from arcaea_offline.models import Chart, Score, ScoreBest from arcaea_offline.models import Chart, Score, ScoreBest
from PySide6.QtCore import QCoreApplication, QModelIndex, QSortFilterProxyModel, Qt from PySide6.QtCore import QCoreApplication, QModelIndex, QSortFilterProxyModel, Qt
from sqlalchemy import select
from .base import DbTableModel from .base import DbTableModel
@ -18,50 +17,45 @@ class DbB30TableModel(DbTableModel):
def retranslateHeaders(self): def retranslateHeaders(self):
self._horizontalHeaders = [ self._horizontalHeaders = [
# fmt: off # fmt: off
QCoreApplication.translate("DB30TableModel", "horizontalHeader.id"), QCoreApplication.translate("DbB30TableModel", "horizontalHeader.id"),
QCoreApplication.translate("DB30TableModel", "horizontalHeader.chart"), QCoreApplication.translate("DbB30TableModel", "horizontalHeader.chart"),
QCoreApplication.translate("DB30TableModel", "horizontalHeader.score"), QCoreApplication.translate("DbB30TableModel", "horizontalHeader.score"),
QCoreApplication.translate("DB30TableModel", "horizontalHeader.potential"), QCoreApplication.translate("DbB30TableModel", "horizontalHeader.potential"),
# fmt: on # fmt: on
] ]
def syncDb(self): def syncDb(self):
self.beginResetModel()
self.beginRemoveRows(QModelIndex(), 0, self.rowCount())
self.__items.clear() self.__items.clear()
self.endRemoveRows()
self.endResetModel()
with self._db.sessionmaker() as session: with self._db.sessionmaker() as session:
results = list( results = (
session.scalars( session.query(ScoreBest, Chart)
select(ScoreBest).order_by(ScoreBest.potential.desc()).limit(40) .join(
Chart,
(ScoreBest.song_id == Chart.song_id)
& (ScoreBest.rating_class == Chart.rating_class),
) )
.order_by(ScoreBest.potential)
.limit(50)
.all()
) )
songIds = [r.id for r in results] self.beginInsertRows(QModelIndex(), 0, len(results) - 1)
ptts = [r.potential for r in results] for scoreBest, chart in results:
self.__items.append(
for scoreId, ptt in zip(songIds, ptts): {
score = self._db.get_score(scoreId) self.IdRole: scoreBest.id,
chart = self._db.get_chart(score.song_id, score.rating_class) self.ChartRole: chart,
self.ScoreRole: scoreBest,
self.beginInsertRows(QModelIndex(), self.rowCount(), self.rowCount()) self.PttRole: scoreBest.potential,
self.__items.append( }
{ )
self.IdRole: score.id,
self.ChartRole: chart,
self.ScoreRole: score,
self.PttRole: ptt,
}
)
self.endInsertRows() self.endInsertRows()
# trigger view update
topLeft = self.index(0, 0)
bottomRight = self.index(self.rowCount() - 1, self.columnCount() - 1)
self.dataChanged.emit(
topLeft,
bottomRight,
[Qt.ItemDataRole.DisplayRole, self.IdRole, self.ChartRole, self.ScoreRole],
)
def rowCount(self, *args): def rowCount(self, *args):
return len(self.__items) return len(self.__items)
@ -117,30 +111,35 @@ class DbB30TableSortFilterProxyModel(QSortFilterProxyModel):
return super().headerData(section, orientation, role) return super().headerData(section, orientation, role)
return section + 1 return section + 1
def lessThan(self, source_left, source_right) -> bool: def lessThan(self, sourceLeft: QModelIndex, sourceRight: QModelIndex) -> bool:
if source_left.column() != source_right.column(): if sourceLeft.column() != sourceRight.column():
return return
column = source_left.column() column = sourceLeft.column()
if column == 0: if column == 0:
return source_left.data(DbB30TableModel.IdRole) < source_right.data( return sourceLeft.data(DbB30TableModel.IdRole) < sourceRight.data(
DbB30TableModel.IdRole DbB30TableModel.IdRole
) )
elif column == 2: elif column == 2:
score_left = source_left.data(DbB30TableModel.ScoreRole) scoreLeft = sourceLeft.data(DbB30TableModel.ScoreRole)
score_right = source_right.data(DbB30TableModel.ScoreRole) scoreRight = sourceRight.data(DbB30TableModel.ScoreRole)
if isinstance(score_left, Score) and isinstance(score_right, Score): if isinstance(scoreLeft, Score) and isinstance(scoreRight, Score):
if self.sortRole() == self.Sort_C2_ScoreRole: if self.sortRole() == self.Sort_C2_ScoreRole:
return score_left.score < score_right.score return scoreLeft.score < scoreRight.score
elif self.sortRole() == self.Sort_C2_TimeRole: elif self.sortRole() == self.Sort_C2_TimeRole:
if score_left.date and score_right.date: if scoreLeft.date and scoreRight.date:
return score_left.date < score_right.date return scoreLeft.date < scoreRight.date
elif score_left.date: elif scoreLeft.date:
return False return False
else: else:
return True return True
elif column == 3: elif column == 3:
return source_left.data(DbB30TableModel.PttRole) < source_right.data( pttLeft = sourceLeft.data(DbB30TableModel.PttRole)
DbB30TableModel.PttRole pttRight = sourceRight.data(DbB30TableModel.PttRole)
) if pttLeft and pttRight:
return super().lessThan(source_left, source_right) return pttLeft < pttRight
elif pttLeft:
return False
else:
return True
return super().lessThan(sourceLeft, sourceRight)

View File

@ -27,29 +27,6 @@
<translation>Reset</translation> <translation>Reset</translation>
</message> </message>
</context> </context>
<context>
<name>DB30TableModel</name>
<message>
<location filename="../../extends/shared/models/tables/b30.py" line="21"/>
<source>horizontalHeader.id</source>
<translation>ID</translation>
</message>
<message>
<location filename="../../extends/shared/models/tables/b30.py" line="22"/>
<source>horizontalHeader.chart</source>
<translation>Chart</translation>
</message>
<message>
<location filename="../../extends/shared/models/tables/b30.py" line="23"/>
<source>horizontalHeader.score</source>
<translation>Score</translation>
</message>
<message>
<location filename="../../extends/shared/models/tables/b30.py" line="24"/>
<source>horizontalHeader.potential</source>
<translation>Potential</translation>
</message>
</context>
<context> <context>
<name>DatabaseChecker</name> <name>DatabaseChecker</name>
<message> <message>
@ -103,6 +80,29 @@
<translation>Database file does not exist. Create now?</translation> <translation>Database file does not exist. Create now?</translation>
</message> </message>
</context> </context>
<context>
<name>DbB30TableModel</name>
<message>
<location filename="../../extends/shared/models/tables/b30.py" line="20"/>
<source>horizontalHeader.id</source>
<translation>ID</translation>
</message>
<message>
<location filename="../../extends/shared/models/tables/b30.py" line="21"/>
<source>horizontalHeader.chart</source>
<translation>Chart</translation>
</message>
<message>
<location filename="../../extends/shared/models/tables/b30.py" line="22"/>
<source>horizontalHeader.score</source>
<translation>Score</translation>
</message>
<message>
<location filename="../../extends/shared/models/tables/b30.py" line="23"/>
<source>horizontalHeader.potential</source>
<translation>Potential</translation>
</message>
</context>
<context> <context>
<name>DbScoreTableModel</name> <name>DbScoreTableModel</name>
<message> <message>

View File

@ -27,29 +27,6 @@
<translation></translation> <translation></translation>
</message> </message>
</context> </context>
<context>
<name>DB30TableModel</name>
<message>
<location filename="../../extends/shared/models/tables/b30.py" line="21"/>
<source>horizontalHeader.id</source>
<translation>ID</translation>
</message>
<message>
<location filename="../../extends/shared/models/tables/b30.py" line="22"/>
<source>horizontalHeader.chart</source>
<translation></translation>
</message>
<message>
<location filename="../../extends/shared/models/tables/b30.py" line="23"/>
<source>horizontalHeader.score</source>
<translation></translation>
</message>
<message>
<location filename="../../extends/shared/models/tables/b30.py" line="24"/>
<source>horizontalHeader.potential</source>
<translation> PTT</translation>
</message>
</context>
<context> <context>
<name>DatabaseChecker</name> <name>DatabaseChecker</name>
<message> <message>
@ -103,6 +80,29 @@
<translation></translation> <translation></translation>
</message> </message>
</context> </context>
<context>
<name>DbB30TableModel</name>
<message>
<location filename="../../extends/shared/models/tables/b30.py" line="20"/>
<source>horizontalHeader.id</source>
<translation>ID</translation>
</message>
<message>
<location filename="../../extends/shared/models/tables/b30.py" line="21"/>
<source>horizontalHeader.chart</source>
<translation></translation>
</message>
<message>
<location filename="../../extends/shared/models/tables/b30.py" line="22"/>
<source>horizontalHeader.score</source>
<translation></translation>
</message>
<message>
<location filename="../../extends/shared/models/tables/b30.py" line="23"/>
<source>horizontalHeader.potential</source>
<translation> PTT</translation>
</message>
</context>
<context> <context>
<name>DbScoreTableModel</name> <name>DbScoreTableModel</name>
<message> <message>