feat: TabTools_StepCalculator

This commit is contained in:
283375 2023-09-21 00:57:44 +08:00
parent 3d9faac571
commit fba2a5fd3e
Signed by: 283375
SSH Key Fingerprint: SHA256:UcX0qg6ZOSDOeieKPGokA5h7soykG61nz2uxuQgVLSk
5 changed files with 106 additions and 6 deletions

View File

@ -14,6 +14,13 @@
<string notr="true">TabTools_StepCalculator</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QCheckBox" name="detailedLogOutputCheckBox">
<property name="text">
<string>detailedLogOutput</string>
</property>
</widget>
</item>
<item>
<widget class="QWidget" name="mapTypeWidget" native="true">
<layout class="QHBoxLayout" name="horizontalLayout">

View File

@ -28,6 +28,11 @@ class Ui_TabTools_StepCalculator(object):
TabTools_StepCalculator.setWindowTitle(u"TabTools_StepCalculator")
self.verticalLayout_3 = QVBoxLayout(TabTools_StepCalculator)
self.verticalLayout_3.setObjectName(u"verticalLayout_3")
self.detailedLogOutputCheckBox = QCheckBox(TabTools_StepCalculator)
self.detailedLogOutputCheckBox.setObjectName(u"detailedLogOutputCheckBox")
self.verticalLayout_3.addWidget(self.detailedLogOutputCheckBox)
self.mapTypeWidget = QWidget(TabTools_StepCalculator)
self.mapTypeWidget.setObjectName(u"mapTypeWidget")
self.horizontalLayout = QHBoxLayout(self.mapTypeWidget)
@ -369,6 +374,7 @@ class Ui_TabTools_StepCalculator(object):
# setupUi
def retranslateUi(self, TabTools_StepCalculator):
self.detailedLogOutputCheckBox.setText(QCoreApplication.translate("TabTools_StepCalculator", u"detailedLogOutput", None))
self.mapTypeLegacyPlayRadioButton.setText("")
self.mapTypePlayRadioButton.setText("")
self.mapTypeLegacyPlayPlusRadioButton.setText("")

View File

@ -1,7 +1,13 @@
import logging
from arcaea_offline.calculate import calculate_play_rating
from arcaea_offline.calculate.world_step import (
AmaneBelowExPartnerBonus,
AwakenedEtoPartnerBonus,
AwakenedIlithPartnerBonus,
AwakenedLunaPartnerBonus,
LegacyMapStepBooster,
MayaPartnerBonus,
MemoriesStepBooster,
PartnerBonus,
PlayResult,
@ -9,6 +15,7 @@ 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.QtWidgets import (
@ -22,6 +29,8 @@ from PySide6.QtWidgets import (
from ui.designer.tabs.tabTools.tabTools_StepCalculator_ui import (
Ui_TabTools_StepCalculator,
)
from ui.implements.components.chartAndScoreInput import ChartAndScoreInput
from ui.implements.components.songIdSelector import SongIdSelectorMode
logger = logging.getLogger(__name__)
@ -69,11 +78,23 @@ class ButtonGrayscaleEffectApplier(QObject):
target.setGraphicsEffect(effect)
class ChartAndScoreInputDialog(ChartAndScoreInput):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowFlag(Qt.WindowType.Dialog, True)
self.setSongIdSelectorMode(SongIdSelectorMode.Chart)
class TabTools_StepCalculator(Ui_TabTools_StepCalculator, QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
self.calculate_toStep_calculatePlayResultFromScoreButton.clicked.connect(
self.openChartAndScoreInputDialog
)
# set icons
staminaIcon = QIcon(":/images/stepCalculator/stamina.png")
for radioButton in [
self.legacyPlayPlus_x2StaminaRadioButton,
@ -104,6 +125,7 @@ class TabTools_StepCalculator(Ui_TabTools_StepCalculator, QWidget):
button.setIconSize(mapTypeIconSize)
button.setIcon(pixmap)
# apply grayscale effects
self.buttonGrayscaleEffectAppliers = []
for button in [
self.mapTypeLegacyPlayRadioButton,
@ -117,6 +139,7 @@ class TabTools_StepCalculator(Ui_TabTools_StepCalculator, QWidget):
applier = ButtonGrayscaleEffectApplier(button)
self.buttonGrayscaleEffectAppliers.append(applier)
# create button groups
self.mapTypeButtonGroup = QButtonGroup(self)
self.mapTypeButtonGroup.addButton(self.mapTypeLegacyPlayRadioButton, 0)
self.mapTypeButtonGroup.addButton(self.mapTypeLegacyPlayPlusRadioButton, 1)
@ -147,6 +170,7 @@ class TabTools_StepCalculator(Ui_TabTools_StepCalculator, QWidget):
self.legacyPlayPlus_x15fragRadioButton, 500
)
# bind calculate functions
self.mapTypeButtonGroup.buttonToggled.connect(self.tryCalculate)
self.legacyPlayPlusStaminaButtonGroup.buttonToggled.connect(self.tryCalculate)
self.legacyPlayPlusFragmentsButtonGroup.buttonToggled.connect(self.tryCalculate)
@ -160,6 +184,65 @@ class TabTools_StepCalculator(Ui_TabTools_StepCalculator, QWidget):
self.tryCalculate
)
# connect partner skill preset buttons
self.partnerSkillPresetButton_awakenedIlith.clicked.connect(
self.applyPartnerPreset
)
self.partnerSkillPresetButton_awakenedEto.clicked.connect(
self.applyPartnerPreset
)
self.partnerSkillPresetButton_awakenedLuna.clicked.connect(
self.applyPartnerPreset
)
self.partnerSkillPresetButton_amaneBelowEx.clicked.connect(
self.applyPartnerPreset
)
self.partnerSkillPresetButton_maya.clicked.connect(self.applyPartnerPreset)
def openChartAndScoreInputDialog(self):
dialog = ChartAndScoreInputDialog(self)
dialog.scoreCommited.connect(
lambda: self.setPlayResultFromChartAndScoreInput(dialog)
)
dialog.show()
def setPlayResultFromChartAndScoreInput(self, dialog: ChartAndScoreInputDialog):
if score := dialog.score():
chart = dialog.chart()
self.calculate_toStep_playResultSpinBox.setValue(
float(calculate_play_rating(chart.constant / 10, score.score))
)
dialog.close()
dialog.deleteLater()
else:
return
def applyPartnerPreset(self):
if not self.sender():
return
objectName = self.sender().objectName()
if not objectName:
return
formatString = "partnerSkillPresetButton_{}"
if objectName == formatString.format("awakenedIlith"):
pb = AwakenedIlithPartnerBonus
elif objectName == formatString.format("awakenedEto"):
pb = AwakenedEtoPartnerBonus
elif objectName == formatString.format("awakenedLuna"):
pb = AwakenedLunaPartnerBonus
elif objectName == formatString.format("amaneBelowEx"):
pb = AmaneBelowExPartnerBonus
elif objectName == formatString.format("maya"):
pb = MayaPartnerBonus
else:
return
self.partnerSkillStepBonusLineEdit.setText(str(pb.step_bonus))
self.partnerSkillFinalMultiplierLineEdit.setText(str(pb.final_multiplier))
def toStepPlayResult(self):
return PlayResult(
play_rating=self.calculate_toStep_playResultSpinBox.value(),
@ -177,6 +260,8 @@ class TabTools_StepCalculator(Ui_TabTools_StepCalculator, QWidget):
partnerBonus.final_multiplier
return partnerBonus
except Exception:
if self.detailedLogOutputCheckBox.isChecked():
logger.exception("Cannot parse PartnerBonus input")
return PartnerBonus()
return PartnerBonus()
@ -220,6 +305,7 @@ class TabTools_StepCalculator(Ui_TabTools_StepCalculator, QWidget):
)
self.calculate_toStep_resultLabel.setText(f"{step}<br>({stepOriginal})")
except Exception:
if self.detailedLogOutputCheckBox.isChecked():
logger.exception("Cannot calculate toStep")
self.calculate_toStep_resultLabel.setText("...")
@ -236,5 +322,6 @@ class TabTools_StepCalculator(Ui_TabTools_StepCalculator, QWidget):
)
)
except Exception:
if self.detailedLogOutputCheckBox.isChecked():
logger.exception("Cannot calculate fromStep")
self.calculate_fromStep_resultLabel.setText("...")

View File

@ -755,7 +755,7 @@ validation</translation>
<message>
<location filename="../../designer/tabs/tabToolsEntry.ui" line="29"/>
<source>tab.stepCalculator</source>
<translation type="unfinished"></translation>
<translation>Step Calculator</translation>
</message>
</context>
<context>
@ -1021,7 +1021,7 @@ validation</translation>
<message>
<location filename="../../designer/tabs/tabTools/tabTools_StepCalculator.ui" line="20"/>
<source>detailedLogOutput</source>
<translation type="unfinished"></translation>
<translation>Detailed log output</translation>
</message>
<message>
<location filename="../../designer/tabs/tabTools/tabTools_StepCalculator.ui" line="429"/>

View File

@ -754,7 +754,7 @@
<message>
<location filename="../../designer/tabs/tabToolsEntry.ui" line="29"/>
<source>tab.stepCalculator</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
</context>
<context>
@ -1020,7 +1020,7 @@
<message>
<location filename="../../designer/tabs/tabTools/tabTools_StepCalculator.ui" line="20"/>
<source>detailedLogOutput</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location filename="../../designer/tabs/tabTools/tabTools_StepCalculator.ui" line="429"/>