From 1d01356327cdacaf7c47d4603e8d983dfe667c39 Mon Sep 17 00:00:00 2001 From: 283375 Date: Mon, 23 Oct 2023 15:19:56 +0800 Subject: [PATCH] impr: popup `PlayRatingCalculator` when double clicking an item in `TabTools_ChartRecommend` --- .../tabs/tabTools/tabTools_ChartRecommend.ui | 5 +- .../tabTools/tabTools_ChartRecommend_ui.py | 3 +- .../tabs/tabTools/tabTools_ChartRecommend.py | 67 ++++++++++++++++--- 3 files changed, 65 insertions(+), 10 deletions(-) diff --git a/ui/designer/tabs/tabTools/tabTools_ChartRecommend.ui b/ui/designer/tabs/tabTools/tabTools_ChartRecommend.ui index 7ea7eba..849c58d 100644 --- a/ui/designer/tabs/tabTools/tabTools_ChartRecommend.ui +++ b/ui/designer/tabs/tabTools/tabTools_ChartRecommend.ui @@ -82,6 +82,9 @@ QAbstractItemView::NoSelection + + QAbstractItemView::SelectRows + QAbstractItemView::ScrollPerPixel @@ -325,7 +328,7 @@ QAbstractItemView::NoEditTriggers - QAbstractItemView::SingleSelection + QAbstractItemView::NoSelection QAbstractItemView::SelectRows diff --git a/ui/designer/tabs/tabTools/tabTools_ChartRecommend_ui.py b/ui/designer/tabs/tabTools/tabTools_ChartRecommend_ui.py index 16a5684..635e248 100644 --- a/ui/designer/tabs/tabTools/tabTools_ChartRecommend_ui.py +++ b/ui/designer/tabs/tabTools/tabTools_ChartRecommend_ui.py @@ -68,6 +68,7 @@ class Ui_TabTools_ChartRecommend(object): self.chartsByConstant_modelView.setMinimumSize(QSize(150, 0)) self.chartsByConstant_modelView.setEditTriggers(QAbstractItemView.NoEditTriggers) self.chartsByConstant_modelView.setSelectionMode(QAbstractItemView.NoSelection) + self.chartsByConstant_modelView.setSelectionBehavior(QAbstractItemView.SelectRows) self.chartsByConstant_modelView.setVerticalScrollMode(QAbstractItemView.ScrollPerPixel) self.chartsByConstant_modelView.setHorizontalScrollMode(QAbstractItemView.ScrollPerPixel) @@ -228,7 +229,7 @@ class Ui_TabTools_ChartRecommend(object): self.chartsRecommendFromPlayRating_modelView.setSizePolicy(sizePolicy2) self.chartsRecommendFromPlayRating_modelView.setMinimumSize(QSize(200, 0)) self.chartsRecommendFromPlayRating_modelView.setEditTriggers(QAbstractItemView.NoEditTriggers) - self.chartsRecommendFromPlayRating_modelView.setSelectionMode(QAbstractItemView.SingleSelection) + self.chartsRecommendFromPlayRating_modelView.setSelectionMode(QAbstractItemView.NoSelection) self.chartsRecommendFromPlayRating_modelView.setSelectionBehavior(QAbstractItemView.SelectRows) self.chartsRecommendFromPlayRating_modelView.setVerticalScrollMode(QAbstractItemView.ScrollPerPixel) self.chartsRecommendFromPlayRating_modelView.setHorizontalScrollMode(QAbstractItemView.ScrollPerPixel) diff --git a/ui/implements/tabs/tabTools/tabTools_ChartRecommend.py b/ui/implements/tabs/tabTools/tabTools_ChartRecommend.py index 172cbfc..07c45ef 100644 --- a/ui/implements/tabs/tabTools/tabTools_ChartRecommend.py +++ b/ui/implements/tabs/tabTools/tabTools_ChartRecommend.py @@ -2,11 +2,11 @@ import logging from arcaea_offline.calculate import calculate_constants_from_play_rating from arcaea_offline.database import Database -from arcaea_offline.models import Chart, ScoreBest +from arcaea_offline.models import Chart, Score from arcaea_offline.utils.rating import rating_class_to_text -from arcaea_offline.utils.score import score_to_grade_text -from PySide6.QtCore import Slot -from PySide6.QtWidgets import QWidget +from PySide6.QtCore import QModelIndex, Qt, Slot +from PySide6.QtGui import QColor, QPalette +from PySide6.QtWidgets import QDialog, QLabel, QVBoxLayout, QWidget from ui.designer.tabs.tabTools.tabTools_ChartRecommend_ui import ( Ui_TabTools_ChartRecommend, @@ -17,16 +17,37 @@ from ui.extends.tabs.tabTools.tabTools_ChartRecommend import ( CustomChartDelegate, CustomScoreBestDelegate, ) +from ui.implements.components.playRatingCalculator import PlayRatingCalculator logger = logging.getLogger(__name__) -def chartToText(chart: Chart): - return f"{chart.artist} - {chart.title}
({chart.song_id}) {rating_class_to_text(chart.rating_class)}" +class QuickPlayRatingCalculatorDialog(QDialog): + def __init__(self, parent=None): + super().__init__(parent) + self.verticalLayout = QVBoxLayout(self) -def scoreBestToText(score: ScoreBest): - return f"{score_to_grade_text(score.score)} {score.score} > {score.potential:.4f}" + self.chartLabel = QLabel(self) + self.verticalLayout.addWidget(self.chartLabel) + + self.playRatingCalculator = PlayRatingCalculator(self) + self.verticalLayout.addWidget(self.playRatingCalculator) + + self.setMinimumWidth(400) + + self.playRatingCalculator.arcaeaScoreLineEdit.setFocus( + Qt.FocusReason.PopupFocusReason + ) + + def setChart(self, chart: Chart): + self.chartLabel.setText( + f"{chart.title} {rating_class_to_text(chart.rating_class)} {chart.constant / 10}" + ) + self.playRatingCalculator.setConstant(chart.constant) + + def setScore(self, score: Score): + self.playRatingCalculator.arcaeaScoreLineEdit.setText(str(score)) class TabTools_ChartRecommend(Ui_TabTools_ChartRecommend, QWidget): @@ -62,6 +83,13 @@ class TabTools_ChartRecommend(Ui_TabTools_ChartRecommend, QWidget): self.updateChartsRecommendFromPlayRating ) + self.chartsByConstant_modelView.doubleClicked.connect( + self.openQuickPlayRatingCalculator_chartsByConstant + ) + self.chartsRecommendFromPlayRating_modelView.doubleClicked.connect( + self.openQuickPlayRatingCalculator_chartsRecommendFromPlayRating + ) + @Slot(float) def on_rangeFromPlayRating_playRatingSpinBox_valueChanged(self, value: float): try: @@ -120,3 +148,26 @@ class TabTools_ChartRecommend(Ui_TabTools_ChartRecommend, QWidget): self.chartsRecommendFromPlayRatingModel.setChartAndScore(charts, scores) self.chartsRecommendFromPlayRating_modelView.resizeRowsToContents() self.chartsRecommendFromPlayRating_modelView.resizeColumnsToContents() + + @Slot(QModelIndex) + def openQuickPlayRatingCalculator_chartsByConstant(self, index: QModelIndex): + dialog = QuickPlayRatingCalculatorDialog(self) + chart = index.data(ChartsModel.ChartRole) + dialog.setChart(chart) + dialog.show() + + @Slot(QModelIndex) + def openQuickPlayRatingCalculator_chartsRecommendFromPlayRating( + self, index: QModelIndex + ): + dialog = QuickPlayRatingCalculatorDialog(self) + + row = index.row() + chartIndex = self.chartsRecommendFromPlayRatingModel.item(row, 0) + scoreIndex = self.chartsRecommendFromPlayRatingModel.item(row, 1) + + chart = chartIndex.data(ChartsWithScoreBestModel.ChartRole) + score: Score = scoreIndex.data(ChartsWithScoreBestModel.ScoreBestRole) + dialog.setChart(chart) + dialog.setScore(score.score) + dialog.show()