diff --git a/ui/designer/tabs/tabTools/tabTools_StepCalculator.ui b/ui/designer/tabs/tabTools/tabTools_StepCalculator.ui
index 10e8f70..8d9d875 100644
--- a/ui/designer/tabs/tabTools/tabTools_StepCalculator.ui
+++ b/ui/designer/tabs/tabTools/tabTools_StepCalculator.ui
@@ -165,7 +165,7 @@
x1.25
-125
+250
@@ -361,6 +361,13 @@
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+ -
+
+
+ calculate.toStep.playResultLabel
+
+
+
-
@@ -380,10 +387,10 @@
- -
-
+
-
+
- calculate.toStep.playResultLabel
+ calculate.toStep.calculatePlayResultFromScoreButton
@@ -401,24 +408,36 @@
-
-
-
-
- 0
- 0
-
-
-
- ...
-
-
-
- -
-
-
- calculate.toStep.calculatePlayResultFromScoreButton
-
-
+
+
-
+
+
+ ...
+
+
+ Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft
+
+
+
+ -
+
+
+
+ 8
+
+
+
+ QLabel { color: gray; }
+
+
+ ...
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop
+
+
+
+
@@ -463,17 +482,36 @@
-
-
-
-
- 0
- 0
-
-
-
- ...
-
-
+
+
-
+
+
+ ...
+
+
+ Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft
+
+
+
+ -
+
+
+
+ 8
+
+
+
+ QLabel { color: gray; }
+
+
+ ...
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop
+
+
+
+
diff --git a/ui/designer/tabs/tabTools/tabTools_StepCalculator_ui.py b/ui/designer/tabs/tabTools/tabTools_StepCalculator_ui.py
index 26ea820..1858e1b 100644
--- a/ui/designer/tabs/tabTools/tabTools_StepCalculator_ui.py
+++ b/ui/designer/tabs/tabTools/tabTools_StepCalculator_ui.py
@@ -137,7 +137,7 @@ class Ui_TabTools_StepCalculator(object):
self.legacyPlayPlus_x125fragRadioButton = QRadioButton(self.legacyPlayPlus_useFragmentsGroupBox)
self.legacyPlayPlus_x125fragRadioButton.setObjectName(u"legacyPlayPlus_x125fragRadioButton")
self.legacyPlayPlus_x125fragRadioButton.setText(u"x1.25\n"
-"125")
+"250")
self.horizontalLayout_3.addWidget(self.legacyPlayPlus_x125fragRadioButton)
@@ -288,6 +288,11 @@ class Ui_TabTools_StepCalculator(object):
self.formLayout_2 = QFormLayout(self.groupBox)
self.formLayout_2.setObjectName(u"formLayout_2")
self.formLayout_2.setLabelAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter)
+ self.label_2 = QLabel(self.groupBox)
+ self.label_2.setObjectName(u"label_2")
+
+ self.formLayout_2.setWidget(0, QFormLayout.LabelRole, self.label_2)
+
self.calculate_toStep_playResultSpinBox = QDoubleSpinBox(self.groupBox)
self.calculate_toStep_playResultSpinBox.setObjectName(u"calculate_toStep_playResultSpinBox")
sizePolicy2.setHeightForWidth(self.calculate_toStep_playResultSpinBox.sizePolicy().hasHeightForWidth())
@@ -298,10 +303,10 @@ class Ui_TabTools_StepCalculator(object):
self.formLayout_2.setWidget(0, QFormLayout.FieldRole, self.calculate_toStep_playResultSpinBox)
- self.label_2 = QLabel(self.groupBox)
- self.label_2.setObjectName(u"label_2")
+ self.calculate_toStep_calculatePlayResultFromScoreButton = QPushButton(self.groupBox)
+ self.calculate_toStep_calculatePlayResultFromScoreButton.setObjectName(u"calculate_toStep_calculatePlayResultFromScoreButton")
- self.formLayout_2.setWidget(0, QFormLayout.LabelRole, self.label_2)
+ self.formLayout_2.setWidget(1, QFormLayout.FieldRole, self.calculate_toStep_calculatePlayResultFromScoreButton)
self.label_7 = QLabel(self.groupBox)
self.label_7.setObjectName(u"label_7")
@@ -310,18 +315,28 @@ class Ui_TabTools_StepCalculator(object):
self.formLayout_2.setWidget(2, QFormLayout.LabelRole, self.label_7)
+ self.verticalLayout_9 = QVBoxLayout()
+ self.verticalLayout_9.setObjectName(u"verticalLayout_9")
self.calculate_toStep_resultLabel = QLabel(self.groupBox)
self.calculate_toStep_resultLabel.setObjectName(u"calculate_toStep_resultLabel")
- sizePolicy4.setHeightForWidth(self.calculate_toStep_resultLabel.sizePolicy().hasHeightForWidth())
- self.calculate_toStep_resultLabel.setSizePolicy(sizePolicy4)
self.calculate_toStep_resultLabel.setText(u"...")
+ self.calculate_toStep_resultLabel.setAlignment(Qt.AlignBottom|Qt.AlignLeading|Qt.AlignLeft)
- self.formLayout_2.setWidget(2, QFormLayout.FieldRole, self.calculate_toStep_resultLabel)
+ self.verticalLayout_9.addWidget(self.calculate_toStep_resultLabel)
- self.calculate_toStep_calculatePlayResultFromScoreButton = QPushButton(self.groupBox)
- self.calculate_toStep_calculatePlayResultFromScoreButton.setObjectName(u"calculate_toStep_calculatePlayResultFromScoreButton")
+ self.calculate_toStep_detailedResultLabel = QLabel(self.groupBox)
+ self.calculate_toStep_detailedResultLabel.setObjectName(u"calculate_toStep_detailedResultLabel")
+ font = QFont()
+ font.setPointSize(8)
+ self.calculate_toStep_detailedResultLabel.setFont(font)
+ self.calculate_toStep_detailedResultLabel.setStyleSheet(u"QLabel { color: gray; }")
+ self.calculate_toStep_detailedResultLabel.setText(u"...")
+ self.calculate_toStep_detailedResultLabel.setAlignment(Qt.AlignLeading|Qt.AlignLeft|Qt.AlignTop)
- self.formLayout_2.setWidget(1, QFormLayout.FieldRole, self.calculate_toStep_calculatePlayResultFromScoreButton)
+ self.verticalLayout_9.addWidget(self.calculate_toStep_detailedResultLabel)
+
+
+ self.formLayout_2.setLayout(2, QFormLayout.FieldRole, self.verticalLayout_9)
self.horizontalLayout_4.addWidget(self.groupBox)
@@ -350,13 +365,26 @@ class Ui_TabTools_StepCalculator(object):
self.formLayout_3.setWidget(1, QFormLayout.LabelRole, self.label_9)
+ self.verticalLayout_10 = QVBoxLayout()
+ self.verticalLayout_10.setObjectName(u"verticalLayout_10")
self.calculate_fromStep_resultLabel = QLabel(self.groupBox_2)
self.calculate_fromStep_resultLabel.setObjectName(u"calculate_fromStep_resultLabel")
- sizePolicy4.setHeightForWidth(self.calculate_fromStep_resultLabel.sizePolicy().hasHeightForWidth())
- self.calculate_fromStep_resultLabel.setSizePolicy(sizePolicy4)
self.calculate_fromStep_resultLabel.setText(u"...")
+ self.calculate_fromStep_resultLabel.setAlignment(Qt.AlignBottom|Qt.AlignLeading|Qt.AlignLeft)
- self.formLayout_3.setWidget(1, QFormLayout.FieldRole, self.calculate_fromStep_resultLabel)
+ self.verticalLayout_10.addWidget(self.calculate_fromStep_resultLabel)
+
+ self.calculate_fromStep_detailedResultLabel = QLabel(self.groupBox_2)
+ self.calculate_fromStep_detailedResultLabel.setObjectName(u"calculate_fromStep_detailedResultLabel")
+ self.calculate_fromStep_detailedResultLabel.setFont(font)
+ self.calculate_fromStep_detailedResultLabel.setStyleSheet(u"QLabel { color: gray; }")
+ self.calculate_fromStep_detailedResultLabel.setText(u"...")
+ self.calculate_fromStep_detailedResultLabel.setAlignment(Qt.AlignLeading|Qt.AlignLeft|Qt.AlignTop)
+
+ self.verticalLayout_10.addWidget(self.calculate_fromStep_detailedResultLabel)
+
+
+ self.formLayout_3.setLayout(1, QFormLayout.FieldRole, self.verticalLayout_10)
self.horizontalLayout_4.addWidget(self.groupBox_2)
@@ -394,8 +422,8 @@ class Ui_TabTools_StepCalculator(object):
self.partnerSkillPresetButton_maya.setText(QCoreApplication.translate("TabTools_StepCalculator", u"partner.skill.presets.maya", None))
self.groupBox.setTitle(QCoreApplication.translate("TabTools_StepCalculator", u"calculate.toStep", None))
self.label_2.setText(QCoreApplication.translate("TabTools_StepCalculator", u"calculate.toStep.playResultLabel", None))
- self.label_7.setText(QCoreApplication.translate("TabTools_StepCalculator", u"calculate.toStep.resultLabel", None))
self.calculate_toStep_calculatePlayResultFromScoreButton.setText(QCoreApplication.translate("TabTools_StepCalculator", u"calculate.toStep.calculatePlayResultFromScoreButton", None))
+ self.label_7.setText(QCoreApplication.translate("TabTools_StepCalculator", u"calculate.toStep.resultLabel", None))
self.groupBox_2.setTitle(QCoreApplication.translate("TabTools_StepCalculator", u"calculate.fromStep", None))
self.label_4.setText(QCoreApplication.translate("TabTools_StepCalculator", u"calculate.fromStep.targetStepLabel", None))
self.label_9.setText(QCoreApplication.translate("TabTools_StepCalculator", u"calculate.fromStep.resultLabel", None))
diff --git a/ui/implements/tabs/tabTools/tabTools_StepCalculator.py b/ui/implements/tabs/tabTools/tabTools_StepCalculator.py
index 702323a..14cd30b 100644
--- a/ui/implements/tabs/tabTools/tabTools_StepCalculator.py
+++ b/ui/implements/tabs/tabTools/tabTools_StepCalculator.py
@@ -1,6 +1,5 @@
import logging
-from arcaea_offline.calculate import calculate_play_rating
from arcaea_offline.calculate.world_step import (
AmaneBelowExPartnerBonus,
AwakenedEtoPartnerBonus,
@@ -15,14 +14,22 @@ from arcaea_offline.calculate.world_step import (
calculate_step,
calculate_step_original,
)
-from arcaea_offline.models import Chart, Score
-from PySide6.QtCore import QEasingCurve, QObject, QSize, Qt, QTimeLine
-from PySide6.QtGui import QIcon, QPainter, QPaintEvent, QPixmap
+from PySide6.QtCore import (
+ QCoreApplication,
+ QEasingCurve,
+ QObject,
+ QSize,
+ QTimeLine,
+ Signal,
+)
+from PySide6.QtGui import QIcon, QPixmap
from PySide6.QtWidgets import (
QAbstractButton,
QButtonGroup,
+ QDialog,
QGraphicsColorizeEffect,
- QLabel,
+ QPushButton,
+ QVBoxLayout,
QWidget,
)
@@ -30,26 +37,13 @@ from ui.designer.tabs.tabTools.tabTools_StepCalculator_ui import (
Ui_TabTools_StepCalculator,
)
from ui.extends.shared.language import LanguageChangeEventFilter
-from ui.implements.components.chartAndScoreInput import ChartAndScoreInput
+from ui.implements.components.chartSelector import ChartSelector
+from ui.implements.components.playRatingCalculator import PlayRatingCalculator
from ui.implements.components.songIdSelector import SongIdSelectorMode
logger = logging.getLogger(__name__)
-class MapTypeListWidgetWidget(QLabel):
- def paintEvent(self, e: QPaintEvent) -> None:
- size = self.size()
- painter = QPainter(self)
- scaledPixmap = self.pixmap().scaled(
- size,
- Qt.AspectRatioMode.KeepAspectRatio,
- Qt.TransformationMode.SmoothTransformation,
- )
- x = (size.width() - scaledPixmap.width()) / 2
- y = (size.height() - scaledPixmap.height()) / 2
- painter.drawPixmap(x, y, scaledPixmap)
-
-
class ButtonGrayscaleEffectApplier(QObject):
def __init__(self, parent: QAbstractButton):
super().__init__(parent)
@@ -79,11 +73,56 @@ class ButtonGrayscaleEffectApplier(QObject):
target.setGraphicsEffect(effect)
-class ChartAndScoreInputDialog(ChartAndScoreInput):
+class PlayRatingCalculatorDialog(QDialog):
+ accepted = Signal()
+
def __init__(self, parent=None):
super().__init__(parent)
- self.setWindowFlag(Qt.WindowType.Dialog, True)
- self.setSongIdSelectorMode(SongIdSelectorMode.Chart)
+
+ self.verticalLayout = QVBoxLayout(self)
+
+ self.chartSelector = ChartSelector(self)
+ self.chartSelector.setSongIdSelectorMode(SongIdSelectorMode.Chart)
+ self.verticalLayout.addWidget(self.chartSelector)
+
+ self.playRatingCalculator = PlayRatingCalculator(self)
+ self.verticalLayout.addWidget(self.playRatingCalculator)
+
+ self.acceptButton = QPushButton(self)
+ self.acceptButton.setText(
+ # fmt: off
+ QCoreApplication.translate("StepCalculator", "playRatingCalculatorDialog.acceptButton")
+ # fmt: on
+ )
+ self.acceptButton.setEnabled(False)
+ self.verticalLayout.addWidget(self.acceptButton)
+
+ self.chartSelector.valueChanged.connect(self.updatePlayRatingCalculator)
+ self.playRatingCalculator.arcaeaScoreLineEdit.textChanged.connect(
+ self.updateAcceptButton
+ )
+ self.acceptButton.clicked.connect(self.accepted)
+
+ def updatePlayRatingCalculator(self):
+ chart = self.chartSelector.value()
+ if chart is None:
+ self.playRatingCalculator.setConstant(None)
+ else:
+ self.playRatingCalculator.setConstant(chart.constant)
+ self.updateAcceptButton()
+
+ def updateAcceptButton(self):
+ if self.playRatingCalculator.result is None:
+ self.acceptButton.setEnabled(False)
+ else:
+ self.acceptButton.setEnabled(True)
+
+ def reset(self):
+ self.chartSelector.resetButton.click()
+ self.playRatingCalculator.arcaeaScoreLineEdit.clear()
+
+ def value(self):
+ return self.playRatingCalculator.result
class TabTools_StepCalculator(Ui_TabTools_StepCalculator, QWidget):
@@ -203,23 +242,18 @@ class TabTools_StepCalculator(Ui_TabTools_StepCalculator, QWidget):
)
self.partnerSkillPresetButton_maya.clicked.connect(self.applyPartnerPreset)
- def openChartAndScoreInputDialog(self):
- dialog = ChartAndScoreInputDialog(self)
- dialog.scoreCommited.connect(
- lambda: self.setPlayResultFromChartAndScoreInput(dialog)
- )
- dialog.show()
+ self.playRatingCalculatorDialog = PlayRatingCalculatorDialog(self)
+ self.playRatingCalculatorDialog.accepted.connect(self.set_toStep_PlayRating)
- def setPlayResultFromChartAndScoreInput(self, dialog: ChartAndScoreInputDialog):
- if score := dialog.score():
- chart = dialog.chart()
- self.calculate_toStep_playResultSpinBox.setValue(
- float(calculate_play_rating(chart.constant, score.score))
- )
- dialog.close()
- dialog.deleteLater()
- else:
- return
+ def openChartAndScoreInputDialog(self):
+ self.playRatingCalculatorDialog.reset()
+ self.playRatingCalculatorDialog.show()
+
+ def set_toStep_PlayRating(self):
+ result = self.playRatingCalculatorDialog.value()
+ if result is not None:
+ self.calculate_toStep_playResultSpinBox.setValue(result)
+ self.playRatingCalculatorDialog.close()
def applyPartnerPreset(self):
if not self.sender():
@@ -307,7 +341,8 @@ class TabTools_StepCalculator(Ui_TabTools_StepCalculator, QWidget):
step = calculate_step(
playResult, partner_bonus=partnerBonus, step_booster=stepBooster
)
- self.calculate_toStep_resultLabel.setText(f"{step}
({stepOriginal})")
+ self.calculate_toStep_resultLabel.setText(str(step))
+ self.calculate_toStep_detailedResultLabel.setText(str(stepOriginal))
except Exception:
if self.detailedLogOutputCheckBox.isChecked():
logger.exception("Cannot calculate toStep")
@@ -315,16 +350,14 @@ class TabTools_StepCalculator(Ui_TabTools_StepCalculator, QWidget):
# fromStep
try:
- self.calculate_fromStep_resultLabel.setText(
- str(
- calculate_play_rating_from_step(
- self.calculate_fromStep_targetStepSpinBox.value(),
- self.partnerStepValueSpinBox.value(),
- partner_bonus=partnerBonus,
- step_booster=stepBooster,
- )
- )
+ fromStepResult = calculate_play_rating_from_step(
+ self.calculate_fromStep_targetStepSpinBox.value(),
+ self.partnerStepValueSpinBox.value(),
+ partner_bonus=partnerBonus,
+ step_booster=stepBooster,
)
+ self.calculate_fromStep_resultLabel.setText(str(round(fromStepResult, 2)))
+ self.calculate_fromStep_detailedResultLabel.setText(str(fromStepResult))
except Exception:
if self.detailedLogOutputCheckBox.isChecked():
logger.exception("Cannot calculate fromStep")