mirror of
https://github.com/283375/arcaea-offline-pyside-ui.git
synced 2025-04-18 08:40:18 +00:00
feat: TabTools_StepCalculator
This commit is contained in:
parent
3d9faac571
commit
fba2a5fd3e
@ -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">
|
||||
|
@ -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("")
|
||||
|
@ -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,7 +305,8 @@ class TabTools_StepCalculator(Ui_TabTools_StepCalculator, QWidget):
|
||||
)
|
||||
self.calculate_toStep_resultLabel.setText(f"{step}<br>({stepOriginal})")
|
||||
except Exception:
|
||||
logger.exception("Cannot calculate toStep")
|
||||
if self.detailedLogOutputCheckBox.isChecked():
|
||||
logger.exception("Cannot calculate toStep")
|
||||
self.calculate_toStep_resultLabel.setText("...")
|
||||
|
||||
# fromStep
|
||||
@ -236,5 +322,6 @@ class TabTools_StepCalculator(Ui_TabTools_StepCalculator, QWidget):
|
||||
)
|
||||
)
|
||||
except Exception:
|
||||
logger.exception("Cannot calculate fromStep")
|
||||
if self.detailedLogOutputCheckBox.isChecked():
|
||||
logger.exception("Cannot calculate fromStep")
|
||||
self.calculate_fromStep_resultLabel.setText("...")
|
||||
|
@ -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"/>
|
||||
|
@ -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"/>
|
||||
|
Loading…
x
Reference in New Issue
Block a user