mirror of
https://github.com/283375/arcaea-offline-pyside-ui.git
synced 2025-04-19 09:10:18 +00:00
fix: DbB30TableModel
This commit is contained in:
parent
38d2e4ad5a
commit
d460e935b4
@ -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)
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user