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> <string notr="true">TabTools_StepCalculator</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_3"> <layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QCheckBox" name="detailedLogOutputCheckBox">
<property name="text">
<string>detailedLogOutput</string>
</property>
</widget>
</item>
<item> <item>
<widget class="QWidget" name="mapTypeWidget" native="true"> <widget class="QWidget" name="mapTypeWidget" native="true">
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">

View File

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

View File

@ -1,7 +1,13 @@
import logging import logging
from arcaea_offline.calculate import calculate_play_rating
from arcaea_offline.calculate.world_step import ( from arcaea_offline.calculate.world_step import (
AmaneBelowExPartnerBonus,
AwakenedEtoPartnerBonus,
AwakenedIlithPartnerBonus,
AwakenedLunaPartnerBonus,
LegacyMapStepBooster, LegacyMapStepBooster,
MayaPartnerBonus,
MemoriesStepBooster, MemoriesStepBooster,
PartnerBonus, PartnerBonus,
PlayResult, PlayResult,
@ -9,6 +15,7 @@ from arcaea_offline.calculate.world_step import (
calculate_step, calculate_step,
calculate_step_original, calculate_step_original,
) )
from arcaea_offline.models import Chart, Score
from PySide6.QtCore import QEasingCurve, QObject, QSize, Qt, QTimeLine from PySide6.QtCore import QEasingCurve, QObject, QSize, Qt, QTimeLine
from PySide6.QtGui import QIcon, QPainter, QPaintEvent, QPixmap from PySide6.QtGui import QIcon, QPainter, QPaintEvent, QPixmap
from PySide6.QtWidgets import ( from PySide6.QtWidgets import (
@ -22,6 +29,8 @@ from PySide6.QtWidgets import (
from ui.designer.tabs.tabTools.tabTools_StepCalculator_ui import ( from ui.designer.tabs.tabTools.tabTools_StepCalculator_ui import (
Ui_TabTools_StepCalculator, Ui_TabTools_StepCalculator,
) )
from ui.implements.components.chartAndScoreInput import ChartAndScoreInput
from ui.implements.components.songIdSelector import SongIdSelectorMode
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -69,11 +78,23 @@ class ButtonGrayscaleEffectApplier(QObject):
target.setGraphicsEffect(effect) 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): class TabTools_StepCalculator(Ui_TabTools_StepCalculator, QWidget):
def __init__(self, parent=None): def __init__(self, parent=None):
super().__init__(parent) super().__init__(parent)
self.setupUi(self) self.setupUi(self)
self.calculate_toStep_calculatePlayResultFromScoreButton.clicked.connect(
self.openChartAndScoreInputDialog
)
# set icons
staminaIcon = QIcon(":/images/stepCalculator/stamina.png") staminaIcon = QIcon(":/images/stepCalculator/stamina.png")
for radioButton in [ for radioButton in [
self.legacyPlayPlus_x2StaminaRadioButton, self.legacyPlayPlus_x2StaminaRadioButton,
@ -104,6 +125,7 @@ class TabTools_StepCalculator(Ui_TabTools_StepCalculator, QWidget):
button.setIconSize(mapTypeIconSize) button.setIconSize(mapTypeIconSize)
button.setIcon(pixmap) button.setIcon(pixmap)
# apply grayscale effects
self.buttonGrayscaleEffectAppliers = [] self.buttonGrayscaleEffectAppliers = []
for button in [ for button in [
self.mapTypeLegacyPlayRadioButton, self.mapTypeLegacyPlayRadioButton,
@ -117,6 +139,7 @@ class TabTools_StepCalculator(Ui_TabTools_StepCalculator, QWidget):
applier = ButtonGrayscaleEffectApplier(button) applier = ButtonGrayscaleEffectApplier(button)
self.buttonGrayscaleEffectAppliers.append(applier) self.buttonGrayscaleEffectAppliers.append(applier)
# create button groups
self.mapTypeButtonGroup = QButtonGroup(self) self.mapTypeButtonGroup = QButtonGroup(self)
self.mapTypeButtonGroup.addButton(self.mapTypeLegacyPlayRadioButton, 0) self.mapTypeButtonGroup.addButton(self.mapTypeLegacyPlayRadioButton, 0)
self.mapTypeButtonGroup.addButton(self.mapTypeLegacyPlayPlusRadioButton, 1) self.mapTypeButtonGroup.addButton(self.mapTypeLegacyPlayPlusRadioButton, 1)
@ -147,6 +170,7 @@ class TabTools_StepCalculator(Ui_TabTools_StepCalculator, QWidget):
self.legacyPlayPlus_x15fragRadioButton, 500 self.legacyPlayPlus_x15fragRadioButton, 500
) )
# bind calculate functions
self.mapTypeButtonGroup.buttonToggled.connect(self.tryCalculate) self.mapTypeButtonGroup.buttonToggled.connect(self.tryCalculate)
self.legacyPlayPlusStaminaButtonGroup.buttonToggled.connect(self.tryCalculate) self.legacyPlayPlusStaminaButtonGroup.buttonToggled.connect(self.tryCalculate)
self.legacyPlayPlusFragmentsButtonGroup.buttonToggled.connect(self.tryCalculate) self.legacyPlayPlusFragmentsButtonGroup.buttonToggled.connect(self.tryCalculate)
@ -160,6 +184,65 @@ class TabTools_StepCalculator(Ui_TabTools_StepCalculator, QWidget):
self.tryCalculate 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): def toStepPlayResult(self):
return PlayResult( return PlayResult(
play_rating=self.calculate_toStep_playResultSpinBox.value(), play_rating=self.calculate_toStep_playResultSpinBox.value(),
@ -177,6 +260,8 @@ class TabTools_StepCalculator(Ui_TabTools_StepCalculator, QWidget):
partnerBonus.final_multiplier partnerBonus.final_multiplier
return partnerBonus return partnerBonus
except Exception: except Exception:
if self.detailedLogOutputCheckBox.isChecked():
logger.exception("Cannot parse PartnerBonus input")
return PartnerBonus() return PartnerBonus()
return PartnerBonus() return PartnerBonus()
@ -220,6 +305,7 @@ class TabTools_StepCalculator(Ui_TabTools_StepCalculator, QWidget):
) )
self.calculate_toStep_resultLabel.setText(f"{step}<br>({stepOriginal})") self.calculate_toStep_resultLabel.setText(f"{step}<br>({stepOriginal})")
except Exception: except Exception:
if self.detailedLogOutputCheckBox.isChecked():
logger.exception("Cannot calculate toStep") logger.exception("Cannot calculate toStep")
self.calculate_toStep_resultLabel.setText("...") self.calculate_toStep_resultLabel.setText("...")
@ -236,5 +322,6 @@ class TabTools_StepCalculator(Ui_TabTools_StepCalculator, QWidget):
) )
) )
except Exception: except Exception:
if self.detailedLogOutputCheckBox.isChecked():
logger.exception("Cannot calculate fromStep") logger.exception("Cannot calculate fromStep")
self.calculate_fromStep_resultLabel.setText("...") self.calculate_fromStep_resultLabel.setText("...")

View File

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

View File

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