From a9d2b5f75daac41fb803fe98cd68078058f33d8a Mon Sep 17 00:00:00 2001 From: 283375 Date: Tue, 29 Aug 2023 21:26:31 +0800 Subject: [PATCH] wip: arcaea-offline==0.2.0 - fix viewing/database read references of `ScoreInsert` --- ui/extends/components/ocrQueue.py | 2 +- ui/extends/shared/delegates/chartDelegate.py | 8 +++--- ui/extends/shared/delegates/scoreDelegate.py | 6 ++-- ui/extends/shared/models/tables/b30.py | 29 ++++++++++++-------- ui/extends/shared/models/tables/score.py | 25 ++++++++--------- ui/extends/tabs/tabOcr/tabOcr_Device.py | 16 +++++------ ui/implements/components/scoreEditor.py | 2 +- ui/implements/tabs/tabOcr/tabOcr_Device.py | 7 ++--- 8 files changed, 49 insertions(+), 46 deletions(-) diff --git a/ui/extends/components/ocrQueue.py b/ui/extends/components/ocrQueue.py index 0ed77f6..83d1dd6 100644 --- a/ui/extends/components/ocrQueue.py +++ b/ui/extends/components/ocrQueue.py @@ -236,7 +236,7 @@ class OcrQueueModel(QAbstractListModel): chart = index.data(self.ChartRole) score = index.data(self.ScoreRole) if isinstance(chart, Chart) and isinstance(score, Score): - scoreRange = calculate_score_range(chart, score.pure, score.far) + scoreRange = calculate_score_range(chart.note, score.pure, score.far) scoreValidateOk = scoreRange[0] <= score.score <= scoreRange[1] self.setData(index, scoreValidateOk, self.ScoreValidateOkRole) else: diff --git a/ui/extends/shared/delegates/chartDelegate.py b/ui/extends/shared/delegates/chartDelegate.py index 36934ff..3b03d88 100644 --- a/ui/extends/shared/delegates/chartDelegate.py +++ b/ui/extends/shared/delegates/chartDelegate.py @@ -20,9 +20,9 @@ from .base import TextSegmentDelegate def chartToRichText(chart: Chart): if isinstance(chart, Chart): - text = f"{chart.name_en} [{rating_class_to_short_text(chart.rating_class)}]" + text = f"{chart.title} [{rating_class_to_short_text(chart.rating_class)}]" text += "
" - text += f'({chart.song_id}, {chart.package_id})' + text += f'({chart.song_id}, {chart.set})' else: text = "(unknown chart)" return text @@ -94,7 +94,7 @@ class ChartDelegate(TextSegmentDelegate): return [ [ - {self.TextRole: f"{chart.name_en}"}, + {self.TextRole: f"{chart.title}"}, ], [ { @@ -104,7 +104,7 @@ class ChartDelegate(TextSegmentDelegate): ], [ { - self.TextRole: f"({chart.song_id}, {chart.package_id})", + self.TextRole: f"({chart.song_id}, {chart.set})", self.ColorRole: option.widget.palette().placeholderText().color(), }, ], diff --git a/ui/extends/shared/delegates/scoreDelegate.py b/ui/extends/shared/delegates/scoreDelegate.py index db59fc7..d9bc8a3 100644 --- a/ui/extends/shared/delegates/scoreDelegate.py +++ b/ui/extends/shared/delegates/scoreDelegate.py @@ -95,7 +95,7 @@ class ScoreDelegate(TextSegmentDelegate): chart = self.getChart(index) if isinstance(score, Score) and isinstance(chart, Chart): - scoreRange = calculate_score_range(chart, score.pure, score.far) + scoreRange = calculate_score_range(chart.note, score.pure, score.far) return scoreRange[0] <= score.score <= scoreRange[1] def getScoreGradeGradientWrapper(self, score: int): @@ -152,9 +152,11 @@ class ScoreDelegate(TextSegmentDelegate): ], [ { - self.TextRole: QDateTime.fromSecsSinceEpoch(score.time).toString( + self.TextRole: QDateTime.fromSecsSinceEpoch(score.date).toString( "yyyy-MM-dd hh:mm:ss" ) + if score.date + else "-- No Date --" } ], ] diff --git a/ui/extends/shared/models/tables/b30.py b/ui/extends/shared/models/tables/b30.py index 3294184..ea248cb 100644 --- a/ui/extends/shared/models/tables/b30.py +++ b/ui/extends/shared/models/tables/b30.py @@ -1,5 +1,6 @@ -from arcaea_offline.models import Chart, Score +from arcaea_offline.models import Chart, Score, ScoreBest from PySide6.QtCore import QCoreApplication, QModelIndex, QSortFilterProxyModel, Qt +from sqlalchemy import select from .base import DbTableModel @@ -27,18 +28,19 @@ class DbB30TableModel(DbTableModel): def syncDb(self): self.__items.clear() - results = self._db.conn.execute( - 'SELECT * FROM calculated GROUP BY "potential" ORDER BY "potential" DESC LIMIT 40' - ).fetchall() + with self._db.sessionmaker() as session: + results = list( + session.scalars( + select(ScoreBest).order_by(ScoreBest.potential.desc()).limit(40) + ) + ) - songIds = [r[0] for r in results] - ptts = [r[-1] for r in results] + songIds = [r.id for r in results] + ptts = [r.potential for r in results] for scoreId, ptt in zip(songIds, ptts): - score = Score.from_db_row(self._db.get_scores(score_id=scoreId)[0]) - chart = Chart.from_db_row( - self._db.get_chart(score.song_id, score.rating_class) - ) + score = self._db.get_score_by_id(scoreId) + chart = self._db.get_chart(score.song_id, score.rating_class) self.beginInsertRows(QModelIndex(), self.rowCount(), self.rowCount()) self.__items.append( @@ -131,7 +133,12 @@ class DbB30TableSortFilterProxyModel(QSortFilterProxyModel): if self.sortRole() == self.Sort_C2_ScoreRole: return score_left.score < score_right.score elif self.sortRole() == self.Sort_C2_TimeRole: - return score_left.time < score_right.time + if score_left.date and score_right.date: + return score_left.date < score_right.date + elif score_left.date: + return False + else: + return True elif column == 3: return source_left.data(DbB30TableModel.PttRole) < source_right.data( DbB30TableModel.PttRole diff --git a/ui/extends/shared/models/tables/score.py b/ui/extends/shared/models/tables/score.py index b22cdcf..2223cf2 100644 --- a/ui/extends/shared/models/tables/score.py +++ b/ui/extends/shared/models/tables/score.py @@ -1,4 +1,4 @@ -# from arcaea_offline.calculate import calculate_score +from arcaea_offline.calculate import calculate_potential from arcaea_offline.models import Chart, Score from PySide6.QtCore import QCoreApplication, QModelIndex, QSortFilterProxyModel, Qt @@ -27,19 +27,15 @@ class DbScoreTableModel(DbTableModel): ] def syncDb(self): - newScores = [Score.from_db_row(dbRow) for dbRow in self._db.get_scores()] + newScores = self._db.get_scores() newScores = sorted(newScores, key=lambda x: x.id) newCharts = [ - Chart.from_db_row(dbRow) - for dbRow in [ - self._db.get_chart(score.song_id, score.rating_class) - for score in newScores - ] + self._db.get_chart(score.song_id, score.rating_class) for score in newScores ] newPtts = [] for chart, score in zip(newCharts, newScores): if isinstance(chart, Chart) and isinstance(score, Score): - newPtts.append(calculate_score(chart, score).potential) + newPtts.append(calculate_potential(chart.constant / 10, score.score)) else: newPtts.append(None) @@ -117,11 +113,7 @@ class DbScoreTableModel(DbTableModel): if not (index.isValid() and self.checkIndex(index)): return False - if ( - index.column() == 2 - and isinstance(value, ScoreInsert) - and role == self.ScoreRole - ): + if index.column() == 2 and isinstance(value, Score) and role == self.ScoreRole: self._db.update_score(self.__items[index.row()][self.IdRole], value) self.syncDb() return True @@ -189,7 +181,12 @@ class DbScoreTableSortFilterProxyModel(QSortFilterProxyModel): if self.sortRole() == self.Sort_C2_ScoreRole: return score_left.score < score_right.score elif self.sortRole() == self.Sort_C2_TimeRole: - return score_left.time < score_right.time + if score_left.date and score_right.date: + return score_left.date < score_right.date + elif score_left.date: + return False + else: + return True elif column == 3: return source_left.data(DbScoreTableModel.PttRole) < source_right.data( DbScoreTableModel.PttRole diff --git a/ui/extends/tabs/tabOcr/tabOcr_Device.py b/ui/extends/tabs/tabOcr/tabOcr_Device.py index eadde12..0b1f93b 100644 --- a/ui/extends/tabs/tabOcr/tabOcr_Device.py +++ b/ui/extends/tabs/tabOcr/tabOcr_Device.py @@ -50,22 +50,22 @@ def getImageDate(imagePath: str) -> QDateTime: return datetime -class ScoreInsertConverter: +class ScoreConverter: @staticmethod def deviceV2(imagePath: str, _, result: DeviceOcrResult) -> Tuple[Chart, Score]: db = Database() - scoreInsert = ScoreInsert( + score = Score( song_id=result.song_id, rating_class=result.rating_class, score=result.score, pure=result.pure, far=result.far, lost=result.lost, - time=getImageDate(imagePath).toSecsSinceEpoch(), + date=getImageDate(imagePath).toSecsSinceEpoch(), max_recall=result.max_recall, - clear_type=None, + r10_clear_type=None, + comment=f"OCR {QFileInfo(imagePath).fileName()}", ) - chart = Chart.from_db_row( - db.get_chart(scoreInsert.song_id, scoreInsert.rating_class) - ) - return (chart, scoreInsert) + print(f"OCR {QFileInfo(imagePath).fileName()}") + chart = db.get_chart(score.song_id, score.rating_class) + return (chart, score) diff --git a/ui/implements/components/scoreEditor.py b/ui/implements/components/scoreEditor.py index bdd7233..23f089e 100644 --- a/ui/implements/components/scoreEditor.py +++ b/ui/implements/components/scoreEditor.py @@ -132,7 +132,7 @@ class ScoreEditor(Ui_ScoreEditor, QWidget): score = self.value() - score_range = calculate_score_range(self.__chart, score.pure, score.far) + score_range = calculate_score_range(self.__chart.note, score.pure, score.far) score_in_range = score_range[0] <= score.score <= score_range[1] note_in_range = score.pure + score.far + score.lost <= self.__chart.note if not score_in_range or not note_in_range: diff --git a/ui/implements/tabs/tabOcr/tabOcr_Device.py b/ui/implements/tabs/tabOcr/tabOcr_Device.py index 87fd302..356c659 100644 --- a/ui/implements/tabs/tabOcr/tabOcr_Device.py +++ b/ui/implements/tabs/tabOcr/tabOcr_Device.py @@ -12,10 +12,7 @@ from PySide6.QtWidgets import QFileDialog, QWidget from ui.designer.tabs.tabOcr.tabOcr_Device_ui import Ui_TabOcr_Device from ui.extends.components.ocrQueue import OcrQueueModel from ui.extends.shared.settings import Settings -from ui.extends.tabs.tabOcr.tabOcr_Device import ( - ScoreInsertConverter, - TabDeviceV2OcrRunnable, -) +from ui.extends.tabs.tabOcr.tabOcr_Device import ScoreConverter, TabDeviceV2OcrRunnable logger = logging.getLogger(__name__) @@ -104,7 +101,7 @@ class TabOcr_Device(Ui_TabOcr_Device, QWidget): self.ocrQueueModel.setData(index, runnable, OcrQueueModel.OcrRunnableRole) self.ocrQueueModel.setData( index, - ScoreInsertConverter.deviceV2, + ScoreConverter.deviceV2, OcrQueueModel.ProcessOcrResultFuncRole, ) self.ocrQueueModel.startQueue()