From b193b82d95da3d7665c3973f624c09019b342ee9 Mon Sep 17 00:00:00 2001 From: 283375 Date: Sun, 22 Oct 2023 00:51:07 +0800 Subject: [PATCH] feat: `PlayRatingCalculator` component --- .../tabs/tabTools/tabTools_InfoLookup.ui | 58 ++----------- .../tabs/tabTools/tabTools_InfoLookup_ui.py | 37 ++------ .../components/arcaeaScoreLineEdit.py | 23 +++++ .../components/playRatingCalculator.py | 86 +++++++++++++++++++ .../tabs/tabTools/tabTools_InfoLookup.py | 37 ++------ 5 files changed, 131 insertions(+), 110 deletions(-) create mode 100644 ui/implements/components/arcaeaScoreLineEdit.py create mode 100644 ui/implements/components/playRatingCalculator.py diff --git a/ui/designer/tabs/tabTools/tabTools_InfoLookup.ui b/ui/designer/tabs/tabTools/tabTools_InfoLookup.ui index 198fc84..70cb6a4 100644 --- a/ui/designer/tabs/tabTools/tabTools_InfoLookup.ui +++ b/ui/designer/tabs/tabTools/tabTools_InfoLookup.ui @@ -694,57 +694,9 @@ playRatingCalculate - + - - - - 100 - 0 - - - - - 150 - 16777215 - - - - B9'999'999;_ - - - - - - - > - - - - - - - - true - - - - ... - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - + @@ -764,6 +716,12 @@
ui.implements.components.ratingClassSelector
1 + + PlayRatingCalculator + QWidget +
ui.implements.components.playRatingCalculator
+ 1 +
diff --git a/ui/designer/tabs/tabTools/tabTools_InfoLookup_ui.py b/ui/designer/tabs/tabTools/tabTools_InfoLookup_ui.py index 080c12d..faddb76 100644 --- a/ui/designer/tabs/tabTools/tabTools_InfoLookup_ui.py +++ b/ui/designer/tabs/tabTools/tabTools_InfoLookup_ui.py @@ -16,9 +16,10 @@ from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, QImage, QKeySequence, QLinearGradient, QPainter, QPalette, QPixmap, QRadialGradient, QTransform) from PySide6.QtWidgets import (QApplication, QComboBox, QFrame, QGridLayout, - QGroupBox, QHBoxLayout, QLabel, QLineEdit, - QSizePolicy, QSpacerItem, QVBoxLayout, QWidget) + QGroupBox, QHBoxLayout, QLabel, QSizePolicy, + QVBoxLayout, QWidget) +from ui.implements.components.playRatingCalculator import PlayRatingCalculator from ui.implements.components.ratingClassSelector import RatingClassSelector from ui.implements.components.songIdSelector import SongIdSelector @@ -502,34 +503,12 @@ class Ui_TabTools_InfoLookup(object): self.groupBox_6 = QGroupBox(TabTools_InfoLookup) self.groupBox_6.setObjectName(u"groupBox_6") - self.horizontalLayout_5 = QHBoxLayout(self.groupBox_6) - self.horizontalLayout_5.setObjectName(u"horizontalLayout_5") - self.playRatingCalculateScoreLineEdit = QLineEdit(self.groupBox_6) - self.playRatingCalculateScoreLineEdit.setObjectName(u"playRatingCalculateScoreLineEdit") - self.playRatingCalculateScoreLineEdit.setMinimumSize(QSize(100, 0)) - self.playRatingCalculateScoreLineEdit.setMaximumSize(QSize(150, 16777215)) - self.playRatingCalculateScoreLineEdit.setInputMask(u"B9'999'999;_") + self.verticalLayout_2 = QVBoxLayout(self.groupBox_6) + self.verticalLayout_2.setObjectName(u"verticalLayout_2") + self.playRatingCalculator = PlayRatingCalculator(self.groupBox_6) + self.playRatingCalculator.setObjectName(u"playRatingCalculator") - self.horizontalLayout_5.addWidget(self.playRatingCalculateScoreLineEdit) - - self.label = QLabel(self.groupBox_6) - self.label.setObjectName(u"label") - self.label.setText(u">") - - self.horizontalLayout_5.addWidget(self.label) - - self.playRatingCalculateResultLabel = QLabel(self.groupBox_6) - self.playRatingCalculateResultLabel.setObjectName(u"playRatingCalculateResultLabel") - font = QFont() - font.setBold(True) - self.playRatingCalculateResultLabel.setFont(font) - self.playRatingCalculateResultLabel.setText(u"...") - - self.horizontalLayout_5.addWidget(self.playRatingCalculateResultLabel) - - self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) - - self.horizontalLayout_5.addItem(self.horizontalSpacer) + self.verticalLayout_2.addWidget(self.playRatingCalculator) self.verticalLayout.addWidget(self.groupBox_6) diff --git a/ui/implements/components/arcaeaScoreLineEdit.py b/ui/implements/components/arcaeaScoreLineEdit.py new file mode 100644 index 0000000..cefdc80 --- /dev/null +++ b/ui/implements/components/arcaeaScoreLineEdit.py @@ -0,0 +1,23 @@ +from PySide6.QtGui import QFont + +from .focusSelectAllLineEdit import FocusSelectAllLineEdit + + +class ArcaeaScoreLineEdit(FocusSelectAllLineEdit): + def __init__(self, parent=None): + super().__init__(parent) + + font = QFont("GeosansLight") + font.setPointSize(14) + font.setBold(True) + font.setStyleStrategy( + QFont.StyleStrategy.NoSubpixelAntialias + | QFont.StyleStrategy.PreferAntialias + ) + self.setFont(font) + + self.setInputMask("B9'999'999;_") + + def score(self) -> int | None: + textWithoutMask = self.text().replace("'", "") + return int(textWithoutMask) if textWithoutMask else None diff --git a/ui/implements/components/playRatingCalculator.py b/ui/implements/components/playRatingCalculator.py new file mode 100644 index 0000000..fbb222e --- /dev/null +++ b/ui/implements/components/playRatingCalculator.py @@ -0,0 +1,86 @@ +from arcaea_offline.calculate import calculate_play_rating +from PySide6.QtCore import QCoreApplication +from PySide6.QtGui import QGuiApplication +from PySide6.QtWidgets import ( + QHBoxLayout, + QLabel, + QPushButton, + QSizePolicy, + QSpacerItem, + QWidget, +) + +from ui.extends.shared.language import LanguageChangeEventFilter + +from .arcaeaScoreLineEdit import ArcaeaScoreLineEdit + + +class PlayRatingCalculator(QWidget): + def __init__(self, parent=None): + super().__init__(parent) + + self.languageChangeEventFilter = LanguageChangeEventFilter(self) + self.installEventFilter(self.languageChangeEventFilter) + + self.setupUi() + + self.arcaeaScoreLineEdit.textChanged.connect(self.updateResultLabel) + self.copyButton.clicked.connect(self.on_copyButton_clicked) + + self.constant: int | None = None + + def setConstant(self, constant: int | None): + self.constant = constant + self.updateResultLabel() + + @property + def result(self): + if self.constant is None: + return None + + score = self.arcaeaScoreLineEdit.score() + if score is None: + return None + + return calculate_play_rating(self.constant, score) + + def updateResultLabel(self): + result = self.result + self.resultLabel.setText(str(result) if result is not None else "...") + + def on_copyButton_clicked(self): + result = self.result + if result is not None: + QGuiApplication.clipboard().setText(str(result)) + + def setupUi(self, *args): + self.horizontalLayout = QHBoxLayout(self) + + self.arcaeaScoreLineEdit = ArcaeaScoreLineEdit(self) + self.horizontalLayout.addWidget(self.arcaeaScoreLineEdit) + + self.label = QLabel(self) + self.label.setText(" > ") + self.horizontalLayout.addWidget(self.label) + + self.resultLabel = QLabel(self) + self.resultLabel.setText("...") + self.resultLabel.setSizePolicy( + QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred + ) + self.horizontalLayout.addWidget(self.resultLabel) + + self.horizontalSpacer = QSpacerItem( + 20, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred + ) + self.horizontalLayout.addSpacerItem(self.horizontalSpacer) + + self.copyButton = QPushButton(self) + self.horizontalLayout.addWidget(self.copyButton) + + self.retranslateUi() + + def retranslateUi(self, *args): + self.copyButton.setText( + QCoreApplication.translate("PotentialCalculator", "copyButton") + ) diff --git a/ui/implements/tabs/tabTools/tabTools_InfoLookup.py b/ui/implements/tabs/tabTools/tabTools_InfoLookup.py index 0b47219..4bf6935 100644 --- a/ui/implements/tabs/tabTools/tabTools_InfoLookup.py +++ b/ui/implements/tabs/tabTools/tabTools_InfoLookup.py @@ -1,6 +1,5 @@ import re -from arcaea_offline.calculate import calculate_play_rating from arcaea_offline.database import Database from PySide6.QtCore import QDateTime from PySide6.QtWidgets import QVBoxLayout, QWidget @@ -27,15 +26,8 @@ class TabTools_InfoLookup(Ui_TabTools_InfoLookup, QWidget): self.ratingClassSelector.valueChanged.connect(self.updateDifficultyLabels) self.ratingClassSelector.valueChanged.connect(self.updateChartInfoLabels) - self.songIdSelector.valueChanged.connect( - self.updatePlayRatingCalculateResultLabel - ) - self.ratingClassSelector.valueChanged.connect( - self.updatePlayRatingCalculateResultLabel - ) - self.playRatingCalculateScoreLineEdit.textChanged.connect( - self.updatePlayRatingCalculateResultLabel - ) + self.songIdSelector.valueChanged.connect(self.updatePlayRatingCalculator) + self.ratingClassSelector.valueChanged.connect(self.updatePlayRatingCalculator) self.langSelectComboBox.addItem("En - English [en]", "en") self.langSelectComboBox.addItem("あ - Japanese [ja]", "ja") @@ -213,29 +205,12 @@ class TabTools_InfoLookup(Ui_TabTools_InfoLookup, QWidget): str(chartInfo.notes) if chartInfo.notes is not None else "-" ) - def resetPlayRatingCalculateResultLabel(self): - self.playRatingCalculateResultLabel.setText("...") - - def updatePlayRatingCalculateResultLabel(self): + def updatePlayRatingCalculator(self): songId = self.songIdSelector.songId() ratingClass = self.ratingClassSelector.value() - - if not songId or ratingClass is None: - self.resetPlayRatingCalculateResultLabel() - return - chartInfo = self.db.get_chart_info(songId, ratingClass) - if not chartInfo or not chartInfo.constant: - self.resetPlayRatingCalculateResultLabel() - return - - if scoreText := self.playRatingCalculateScoreLineEdit.text().replace("'", ""): - score = int(scoreText) - - self.playRatingCalculateResultLabel.setText( - f"{calculate_play_rating(chartInfo.constant, score):.3f}" - ) + if not chartInfo: + self.playRatingCalculator.setConstant(None) else: - self.resetPlayRatingCalculateResultLabel() - return + self.playRatingCalculator.setConstant(chartInfo.constant)