feat: PlayRatingCalculator component

This commit is contained in:
2023-10-22 00:51:07 +08:00
parent 01457f3559
commit b193b82d95
5 changed files with 131 additions and 110 deletions

View File

@ -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

View File

@ -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")
)

View File

@ -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)