wip: ScoreEditor

This commit is contained in:
2023-09-01 06:45:12 +08:00
parent af178744b8
commit 565260d6ce
5 changed files with 741 additions and 274 deletions

View File

@ -6,42 +6,32 @@
<rect>
<x>0</x>
<y>0</y>
<width>365</width>
<height>253</height>
<width>450</width>
<height>350</height>
</rect>
</property>
<property name="windowTitle">
<string notr="true">ScoreEditor</string>
</property>
<layout class="QFormLayout" name="formLayout">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::ExpandingFieldsGrow</enum>
</property>
<property name="labelAlignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label">
<layout class="QGridLayout" name="gridLayout">
<item row="2" column="2">
<widget class="QCheckBox" name="pureNoneCheckBox">
<property name="text">
<string>formLabel.score</string>
<string>setNone</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="FocusSelectAllLineEdit" name="scoreLineEdit">
<property name="inputMask">
<string notr="true">B9'999'999;_</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<item row="9" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string notr="true">PURE</string>
<string notr="true">Modifier</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="1">
<item row="2" column="1">
<widget class="QSpinBox" name="pureSpinBox">
<property name="minimumSize">
<size>
@ -54,81 +44,44 @@
</property>
</widget>
</item>
<item row="10" column="2">
<widget class="QCheckBox" name="clearTypeNoneCheckBox">
<property name="text">
<string>setNone</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_3">
<widget class="QLabel" name="label_2">
<property name="text">
<string notr="true">FAR</string>
<string notr="true">PURE</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSpinBox" name="farSpinBox">
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="maximum">
<number>0</number>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string notr="true">LOST</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QSpinBox" name="lostSpinBox">
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="maximum">
<number>0</number>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_5">
<widget class="QLabel" name="label_4">
<property name="text">
<string>formLabel.time</string>
<string notr="true">LOST</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QDateTimeEdit" name="dateTimeEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="dateTime">
<datetime>
<hour>0</hour>
<minute>0</minute>
<second>0</second>
<year>2017</year>
<month>1</month>
<day>22</day>
</datetime>
</property>
<property name="minimumDate">
<date>
<year>2017</year>
<month>1</month>
<day>22</day>
</date>
<item row="5" column="2">
<widget class="QCheckBox" name="dateNoneCheckBox">
<property name="text">
<string>setNone</string>
</property>
</widget>
</item>
<item row="5" column="0">
<item row="6" column="1">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
@ -141,67 +94,23 @@
</property>
</spacer>
</item>
<item row="6" column="0">
<widget class="QLabel" name="label_6">
<item row="12" column="1">
<widget class="QLabel" name="validateLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string notr="true">MAX RECALL</string>
<string notr="true">...</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QSpinBox" name="maxRecallSpinBox">
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="minimum">
<number>-1</number>
</property>
<property name="maximum">
<number>0</number>
</property>
<property name="value">
<number>-1</number>
</property>
</widget>
</item>
<item row="8" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="validateLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string notr="true">...</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="commitButton">
<property name="text">
<string>commitButton</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="7" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>formLabel.clearType</string>
</property>
</widget>
</item>
<item row="7" column="1">
<item row="10" column="1">
<widget class="QComboBox" name="clearTypeComboBox">
<property name="enabled">
<bool>false</bool>
@ -214,6 +123,219 @@
</property>
</widget>
</item>
<item row="10" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string notr="true">Clear Type</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string notr="true">FAR</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="8" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string notr="true">MAX RECALL</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="8" column="1">
<widget class="QSpinBox" name="maxRecallSpinBox">
<property name="enabled">
<bool>false</bool>
</property>
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>0</number>
</property>
<property name="value">
<number>0</number>
</property>
</widget>
</item>
<item row="9" column="1">
<widget class="QComboBox" name="modifierComboBox">
<property name="enabled">
<bool>false</bool>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QDateTimeEdit" name="dateTimeEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="displayFormat">
<string>yyyy/M/d HH:mm:ss</string>
</property>
<property name="calendarPopup">
<bool>false</bool>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QSpinBox" name="lostSpinBox">
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="maximum">
<number>0</number>
</property>
</widget>
</item>
<item row="4" column="2">
<widget class="QCheckBox" name="lostNoneCheckBox">
<property name="text">
<string>setNone</string>
</property>
</widget>
</item>
<item row="11" column="1">
<widget class="QLineEdit" name="commentLineEdit">
<property name="enabled">
<bool>false</bool>
</property>
</widget>
</item>
<item row="9" column="2">
<widget class="QCheckBox" name="modifierNoneCheckBox">
<property name="text">
<string>setNone</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="11" column="2">
<widget class="QCheckBox" name="commentNoneCheckBox">
<property name="text">
<string>setNone</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>formLabel.date</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="12" column="2">
<widget class="QPushButton" name="commitButton">
<property name="text">
<string>commitButton</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="FocusSelectAllLineEdit" name="scoreLineEdit">
<property name="inputMask">
<string notr="true">B9'999'999;_</string>
</property>
</widget>
</item>
<item row="8" column="2">
<widget class="QCheckBox" name="maxRecallNoneCheckBox">
<property name="text">
<string>setNone</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QSpinBox" name="farSpinBox">
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="maximum">
<number>0</number>
</property>
</widget>
</item>
<item row="11" column="0">
<widget class="QLabel" name="label_9">
<property name="text">
<string>formLabel.comment</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>formLabel.score</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QCheckBox" name="farNoneCheckBox">
<property name="text">
<string>setNone</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_10">
<property name="text">
<string>ID</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="idLabel">
<property name="text">
<string>idAutoInsert</string>
</property>
</widget>
</item>
</layout>
</widget>
<customwidgets>
@ -224,5 +346,134 @@
</customwidget>
</customwidgets>
<resources/>
<connections/>
<connections>
<connection>
<sender>pureNoneCheckBox</sender>
<signal>toggled(bool)</signal>
<receiver>pureSpinBox</receiver>
<slot>setDisabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>521</x>
<y>44</y>
</hint>
<hint type="destinationlabel">
<x>288</x>
<y>44</y>
</hint>
</hints>
</connection>
<connection>
<sender>clearTypeNoneCheckBox</sender>
<signal>toggled(bool)</signal>
<receiver>clearTypeComboBox</receiver>
<slot>setDisabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>521</x>
<y>263</y>
</hint>
<hint type="destinationlabel">
<x>288</x>
<y>264</y>
</hint>
</hints>
</connection>
<connection>
<sender>modifierNoneCheckBox</sender>
<signal>toggled(bool)</signal>
<receiver>modifierComboBox</receiver>
<slot>setDisabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>521</x>
<y>236</y>
</hint>
<hint type="destinationlabel">
<x>288</x>
<y>237</y>
</hint>
</hints>
</connection>
<connection>
<sender>maxRecallNoneCheckBox</sender>
<signal>toggled(bool)</signal>
<receiver>maxRecallSpinBox</receiver>
<slot>setDisabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>521</x>
<y>210</y>
</hint>
<hint type="destinationlabel">
<x>288</x>
<y>210</y>
</hint>
</hints>
</connection>
<connection>
<sender>dateNoneCheckBox</sender>
<signal>toggled(bool)</signal>
<receiver>dateTimeEdit</receiver>
<slot>setDisabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>521</x>
<y>122</y>
</hint>
<hint type="destinationlabel">
<x>288</x>
<y>122</y>
</hint>
</hints>
</connection>
<connection>
<sender>lostNoneCheckBox</sender>
<signal>toggled(bool)</signal>
<receiver>lostSpinBox</receiver>
<slot>setDisabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>521</x>
<y>96</y>
</hint>
<hint type="destinationlabel">
<x>288</x>
<y>96</y>
</hint>
</hints>
</connection>
<connection>
<sender>farNoneCheckBox</sender>
<signal>toggled(bool)</signal>
<receiver>farSpinBox</receiver>
<slot>setDisabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>521</x>
<y>70</y>
</hint>
<hint type="destinationlabel">
<x>288</x>
<y>70</y>
</hint>
</hints>
</connection>
<connection>
<sender>commentNoneCheckBox</sender>
<signal>toggled(bool)</signal>
<receiver>commentLineEdit</receiver>
<slot>setDisabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>395</x>
<y>270</y>
</hint>
<hint type="destinationlabel">
<x>237</x>
<y>270</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -3,7 +3,7 @@
################################################################################
## Form generated from reading UI file 'scoreEditor.ui'
##
## Created by: Qt User Interface Compiler version 6.5.0
## Created by: Qt User Interface Compiler version 6.5.2
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################
@ -15,9 +15,9 @@ from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
QFont, QFontDatabase, QGradient, QIcon,
QImage, QKeySequence, QLinearGradient, QPainter,
QPalette, QPixmap, QRadialGradient, QTransform)
from PySide6.QtWidgets import (QApplication, QComboBox, QDateTimeEdit, QFormLayout,
QHBoxLayout, QLabel, QPushButton, QSizePolicy,
QSpacerItem, QSpinBox, QWidget)
from PySide6.QtWidgets import (QApplication, QCheckBox, QComboBox, QDateTimeEdit,
QGridLayout, QLabel, QLineEdit, QPushButton,
QSizePolicy, QSpacerItem, QSpinBox, QWidget)
from ui.implements.components.focusSelectAllLineEdit import FocusSelectAllLineEdit
@ -25,143 +25,243 @@ class Ui_ScoreEditor(object):
def setupUi(self, ScoreEditor):
if not ScoreEditor.objectName():
ScoreEditor.setObjectName(u"ScoreEditor")
ScoreEditor.resize(365, 253)
ScoreEditor.resize(450, 350)
ScoreEditor.setWindowTitle(u"ScoreEditor")
self.formLayout = QFormLayout(ScoreEditor)
self.formLayout.setObjectName(u"formLayout")
self.formLayout.setFieldGrowthPolicy(QFormLayout.ExpandingFieldsGrow)
self.formLayout.setLabelAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter)
self.label = QLabel(ScoreEditor)
self.label.setObjectName(u"label")
self.gridLayout = QGridLayout(ScoreEditor)
self.gridLayout.setObjectName(u"gridLayout")
self.pureNoneCheckBox = QCheckBox(ScoreEditor)
self.pureNoneCheckBox.setObjectName(u"pureNoneCheckBox")
self.formLayout.setWidget(0, QFormLayout.LabelRole, self.label)
self.gridLayout.addWidget(self.pureNoneCheckBox, 2, 2, 1, 1)
self.scoreLineEdit = FocusSelectAllLineEdit(ScoreEditor)
self.scoreLineEdit.setObjectName(u"scoreLineEdit")
self.scoreLineEdit.setInputMask(u"B9'999'999;_")
self.label_7 = QLabel(ScoreEditor)
self.label_7.setObjectName(u"label_7")
self.label_7.setText(u"Modifier")
self.label_7.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter)
self.formLayout.setWidget(0, QFormLayout.FieldRole, self.scoreLineEdit)
self.label_2 = QLabel(ScoreEditor)
self.label_2.setObjectName(u"label_2")
self.label_2.setText(u"PURE")
self.formLayout.setWidget(1, QFormLayout.LabelRole, self.label_2)
self.gridLayout.addWidget(self.label_7, 9, 0, 1, 1)
self.pureSpinBox = QSpinBox(ScoreEditor)
self.pureSpinBox.setObjectName(u"pureSpinBox")
self.pureSpinBox.setMinimumSize(QSize(100, 0))
self.pureSpinBox.setMaximum(0)
self.formLayout.setWidget(1, QFormLayout.FieldRole, self.pureSpinBox)
self.gridLayout.addWidget(self.pureSpinBox, 2, 1, 1, 1)
self.label_3 = QLabel(ScoreEditor)
self.label_3.setObjectName(u"label_3")
self.label_3.setText(u"FAR")
self.clearTypeNoneCheckBox = QCheckBox(ScoreEditor)
self.clearTypeNoneCheckBox.setObjectName(u"clearTypeNoneCheckBox")
self.clearTypeNoneCheckBox.setChecked(True)
self.formLayout.setWidget(2, QFormLayout.LabelRole, self.label_3)
self.gridLayout.addWidget(self.clearTypeNoneCheckBox, 10, 2, 1, 1)
self.farSpinBox = QSpinBox(ScoreEditor)
self.farSpinBox.setObjectName(u"farSpinBox")
self.farSpinBox.setMinimumSize(QSize(100, 0))
self.farSpinBox.setMaximum(0)
self.label_2 = QLabel(ScoreEditor)
self.label_2.setObjectName(u"label_2")
self.label_2.setText(u"PURE")
self.label_2.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter)
self.formLayout.setWidget(2, QFormLayout.FieldRole, self.farSpinBox)
self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1)
self.label_4 = QLabel(ScoreEditor)
self.label_4.setObjectName(u"label_4")
self.label_4.setText(u"LOST")
self.label_4.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter)
self.formLayout.setWidget(3, QFormLayout.LabelRole, self.label_4)
self.gridLayout.addWidget(self.label_4, 4, 0, 1, 1)
self.lostSpinBox = QSpinBox(ScoreEditor)
self.lostSpinBox.setObjectName(u"lostSpinBox")
self.lostSpinBox.setMinimumSize(QSize(100, 0))
self.lostSpinBox.setMaximum(0)
self.dateNoneCheckBox = QCheckBox(ScoreEditor)
self.dateNoneCheckBox.setObjectName(u"dateNoneCheckBox")
self.formLayout.setWidget(3, QFormLayout.FieldRole, self.lostSpinBox)
self.label_5 = QLabel(ScoreEditor)
self.label_5.setObjectName(u"label_5")
self.formLayout.setWidget(4, QFormLayout.LabelRole, self.label_5)
self.dateTimeEdit = QDateTimeEdit(ScoreEditor)
self.dateTimeEdit.setObjectName(u"dateTimeEdit")
sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.dateTimeEdit.sizePolicy().hasHeightForWidth())
self.dateTimeEdit.setSizePolicy(sizePolicy)
self.dateTimeEdit.setDateTime(QDateTime(QDate(2017, 1, 22), QTime(0, 0, 0)))
self.dateTimeEdit.setMinimumDate(QDate(2017, 1, 22))
self.formLayout.setWidget(4, QFormLayout.FieldRole, self.dateTimeEdit)
self.gridLayout.addWidget(self.dateNoneCheckBox, 5, 2, 1, 1)
self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)
self.formLayout.setItem(5, QFormLayout.LabelRole, self.verticalSpacer)
self.gridLayout.addItem(self.verticalSpacer, 6, 1, 1, 1)
self.label_6 = QLabel(ScoreEditor)
self.label_6.setObjectName(u"label_6")
self.label_6.setText(u"MAX RECALL")
self.formLayout.setWidget(6, QFormLayout.LabelRole, self.label_6)
self.maxRecallSpinBox = QSpinBox(ScoreEditor)
self.maxRecallSpinBox.setObjectName(u"maxRecallSpinBox")
self.maxRecallSpinBox.setMinimumSize(QSize(100, 0))
self.maxRecallSpinBox.setMinimum(-1)
self.maxRecallSpinBox.setMaximum(0)
self.maxRecallSpinBox.setValue(-1)
self.formLayout.setWidget(6, QFormLayout.FieldRole, self.maxRecallSpinBox)
self.horizontalLayout = QHBoxLayout()
self.horizontalLayout.setObjectName(u"horizontalLayout")
self.validateLabel = QLabel(ScoreEditor)
self.validateLabel.setObjectName(u"validateLabel")
sizePolicy1 = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)
sizePolicy1.setHorizontalStretch(0)
sizePolicy1.setVerticalStretch(0)
sizePolicy1.setHeightForWidth(self.validateLabel.sizePolicy().hasHeightForWidth())
self.validateLabel.setSizePolicy(sizePolicy1)
sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.validateLabel.sizePolicy().hasHeightForWidth())
self.validateLabel.setSizePolicy(sizePolicy)
self.validateLabel.setText(u"...")
self.validateLabel.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter)
self.horizontalLayout.addWidget(self.validateLabel)
self.commitButton = QPushButton(ScoreEditor)
self.commitButton.setObjectName(u"commitButton")
self.horizontalLayout.addWidget(self.commitButton)
self.formLayout.setLayout(8, QFormLayout.SpanningRole, self.horizontalLayout)
self.label_8 = QLabel(ScoreEditor)
self.label_8.setObjectName(u"label_8")
self.formLayout.setWidget(7, QFormLayout.LabelRole, self.label_8)
self.gridLayout.addWidget(self.validateLabel, 12, 1, 1, 1)
self.clearTypeComboBox = QComboBox(ScoreEditor)
self.clearTypeComboBox.setObjectName(u"clearTypeComboBox")
self.clearTypeComboBox.setEnabled(False)
self.clearTypeComboBox.setMinimumSize(QSize(100, 0))
self.formLayout.setWidget(7, QFormLayout.FieldRole, self.clearTypeComboBox)
self.gridLayout.addWidget(self.clearTypeComboBox, 10, 1, 1, 1)
self.label_8 = QLabel(ScoreEditor)
self.label_8.setObjectName(u"label_8")
self.label_8.setText(u"Clear Type")
self.label_8.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter)
self.gridLayout.addWidget(self.label_8, 10, 0, 1, 1)
self.label_3 = QLabel(ScoreEditor)
self.label_3.setObjectName(u"label_3")
self.label_3.setText(u"FAR")
self.label_3.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter)
self.gridLayout.addWidget(self.label_3, 3, 0, 1, 1)
self.label_6 = QLabel(ScoreEditor)
self.label_6.setObjectName(u"label_6")
self.label_6.setText(u"MAX RECALL")
self.label_6.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter)
self.gridLayout.addWidget(self.label_6, 8, 0, 1, 1)
self.maxRecallSpinBox = QSpinBox(ScoreEditor)
self.maxRecallSpinBox.setObjectName(u"maxRecallSpinBox")
self.maxRecallSpinBox.setEnabled(False)
self.maxRecallSpinBox.setMinimumSize(QSize(100, 0))
self.maxRecallSpinBox.setMinimum(0)
self.maxRecallSpinBox.setMaximum(0)
self.maxRecallSpinBox.setValue(0)
self.gridLayout.addWidget(self.maxRecallSpinBox, 8, 1, 1, 1)
self.modifierComboBox = QComboBox(ScoreEditor)
self.modifierComboBox.setObjectName(u"modifierComboBox")
self.modifierComboBox.setEnabled(False)
self.gridLayout.addWidget(self.modifierComboBox, 9, 1, 1, 1)
self.dateTimeEdit = QDateTimeEdit(ScoreEditor)
self.dateTimeEdit.setObjectName(u"dateTimeEdit")
sizePolicy1 = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
sizePolicy1.setHorizontalStretch(0)
sizePolicy1.setVerticalStretch(0)
sizePolicy1.setHeightForWidth(self.dateTimeEdit.sizePolicy().hasHeightForWidth())
self.dateTimeEdit.setSizePolicy(sizePolicy1)
self.dateTimeEdit.setCalendarPopup(False)
self.gridLayout.addWidget(self.dateTimeEdit, 5, 1, 1, 1)
self.lostSpinBox = QSpinBox(ScoreEditor)
self.lostSpinBox.setObjectName(u"lostSpinBox")
self.lostSpinBox.setMinimumSize(QSize(100, 0))
self.lostSpinBox.setMaximum(0)
self.gridLayout.addWidget(self.lostSpinBox, 4, 1, 1, 1)
self.lostNoneCheckBox = QCheckBox(ScoreEditor)
self.lostNoneCheckBox.setObjectName(u"lostNoneCheckBox")
self.gridLayout.addWidget(self.lostNoneCheckBox, 4, 2, 1, 1)
self.commentLineEdit = QLineEdit(ScoreEditor)
self.commentLineEdit.setObjectName(u"commentLineEdit")
self.commentLineEdit.setEnabled(False)
self.gridLayout.addWidget(self.commentLineEdit, 11, 1, 1, 1)
self.modifierNoneCheckBox = QCheckBox(ScoreEditor)
self.modifierNoneCheckBox.setObjectName(u"modifierNoneCheckBox")
self.modifierNoneCheckBox.setChecked(True)
self.gridLayout.addWidget(self.modifierNoneCheckBox, 9, 2, 1, 1)
self.commentNoneCheckBox = QCheckBox(ScoreEditor)
self.commentNoneCheckBox.setObjectName(u"commentNoneCheckBox")
self.commentNoneCheckBox.setChecked(True)
self.gridLayout.addWidget(self.commentNoneCheckBox, 11, 2, 1, 1)
self.label_5 = QLabel(ScoreEditor)
self.label_5.setObjectName(u"label_5")
self.label_5.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter)
self.gridLayout.addWidget(self.label_5, 5, 0, 1, 1)
self.commitButton = QPushButton(ScoreEditor)
self.commitButton.setObjectName(u"commitButton")
self.gridLayout.addWidget(self.commitButton, 12, 2, 1, 1)
self.scoreLineEdit = FocusSelectAllLineEdit(ScoreEditor)
self.scoreLineEdit.setObjectName(u"scoreLineEdit")
self.scoreLineEdit.setInputMask(u"B9'999'999;_")
self.gridLayout.addWidget(self.scoreLineEdit, 1, 1, 1, 1)
self.maxRecallNoneCheckBox = QCheckBox(ScoreEditor)
self.maxRecallNoneCheckBox.setObjectName(u"maxRecallNoneCheckBox")
self.maxRecallNoneCheckBox.setChecked(True)
self.gridLayout.addWidget(self.maxRecallNoneCheckBox, 8, 2, 1, 1)
self.farSpinBox = QSpinBox(ScoreEditor)
self.farSpinBox.setObjectName(u"farSpinBox")
self.farSpinBox.setMinimumSize(QSize(100, 0))
self.farSpinBox.setMaximum(0)
self.gridLayout.addWidget(self.farSpinBox, 3, 1, 1, 1)
self.label_9 = QLabel(ScoreEditor)
self.label_9.setObjectName(u"label_9")
self.label_9.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter)
self.gridLayout.addWidget(self.label_9, 11, 0, 1, 1)
self.label = QLabel(ScoreEditor)
self.label.setObjectName(u"label")
self.label.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter)
self.gridLayout.addWidget(self.label, 1, 0, 1, 1)
self.farNoneCheckBox = QCheckBox(ScoreEditor)
self.farNoneCheckBox.setObjectName(u"farNoneCheckBox")
self.gridLayout.addWidget(self.farNoneCheckBox, 3, 2, 1, 1)
self.label_10 = QLabel(ScoreEditor)
self.label_10.setObjectName(u"label_10")
self.label_10.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter)
self.gridLayout.addWidget(self.label_10, 0, 0, 1, 1)
self.idLabel = QLabel(ScoreEditor)
self.idLabel.setObjectName(u"idLabel")
self.gridLayout.addWidget(self.idLabel, 0, 1, 1, 1)
self.retranslateUi(ScoreEditor)
self.pureNoneCheckBox.toggled.connect(self.pureSpinBox.setDisabled)
self.clearTypeNoneCheckBox.toggled.connect(self.clearTypeComboBox.setDisabled)
self.modifierNoneCheckBox.toggled.connect(self.modifierComboBox.setDisabled)
self.maxRecallNoneCheckBox.toggled.connect(self.maxRecallSpinBox.setDisabled)
self.dateNoneCheckBox.toggled.connect(self.dateTimeEdit.setDisabled)
self.lostNoneCheckBox.toggled.connect(self.lostSpinBox.setDisabled)
self.farNoneCheckBox.toggled.connect(self.farSpinBox.setDisabled)
self.commentNoneCheckBox.toggled.connect(self.commentLineEdit.setDisabled)
QMetaObject.connectSlotsByName(ScoreEditor)
# setupUi
def retranslateUi(self, ScoreEditor):
self.label.setText(QCoreApplication.translate("ScoreEditor", u"formLabel.score", None))
self.label_5.setText(QCoreApplication.translate("ScoreEditor", u"formLabel.time", None))
self.pureNoneCheckBox.setText(QCoreApplication.translate("ScoreEditor", u"setNone", None))
self.clearTypeNoneCheckBox.setText(QCoreApplication.translate("ScoreEditor", u"setNone", None))
self.dateNoneCheckBox.setText(QCoreApplication.translate("ScoreEditor", u"setNone", None))
self.dateTimeEdit.setDisplayFormat(QCoreApplication.translate("ScoreEditor", u"yyyy/M/d HH:mm:ss", None))
self.lostNoneCheckBox.setText(QCoreApplication.translate("ScoreEditor", u"setNone", None))
self.modifierNoneCheckBox.setText(QCoreApplication.translate("ScoreEditor", u"setNone", None))
self.commentNoneCheckBox.setText(QCoreApplication.translate("ScoreEditor", u"setNone", None))
self.label_5.setText(QCoreApplication.translate("ScoreEditor", u"formLabel.date", None))
self.commitButton.setText(QCoreApplication.translate("ScoreEditor", u"commitButton", None))
self.label_8.setText(QCoreApplication.translate("ScoreEditor", u"formLabel.clearType", None))
self.maxRecallNoneCheckBox.setText(QCoreApplication.translate("ScoreEditor", u"setNone", None))
self.label_9.setText(QCoreApplication.translate("ScoreEditor", u"formLabel.comment", None))
self.label.setText(QCoreApplication.translate("ScoreEditor", u"formLabel.score", None))
self.farNoneCheckBox.setText(QCoreApplication.translate("ScoreEditor", u"setNone", None))
self.label_10.setText(QCoreApplication.translate("ScoreEditor", u"ID", None))
self.idLabel.setText(QCoreApplication.translate("ScoreEditor", u"idAutoInsert", None))
pass
# retranslateUi

View File

@ -15,6 +15,7 @@ from PySide6.QtWidgets import (
from ui.implements.components.chartSelector import ChartSelector
from ..utils import keepWidgetInScreen
from .base import TextSegmentDelegate
@ -164,6 +165,8 @@ class ChartDelegate(TextSegmentDelegate):
def updateEditorGeometry(self, editor: QWidget, option, index: QModelIndex) -> None:
editor.move(editor.pos() + option.rect.topLeft())
editor.setMaximumWidth(option.rect.width())
keepWidgetInScreen(editor)
def setEditorData(self, editor: ChartSelectorDelegateWrapper, index: QModelIndex):
if self.checkIsEditor(editor) and isinstance(self.getChart(index), Chart):

View File

@ -27,11 +27,11 @@ class ScoreEditorDelegateWrapper(ScoreEditor):
def __init__(self, parent=None):
super().__init__(parent)
self.hLine = QFrame(self)
self.hLine.setFrameShape(QFrame.Shape.HLine)
self.hLine.setFrameShadow(QFrame.Shadow.Plain)
self.hLine.setFixedHeight(5)
self.formLayout.insertRow(0, self.hLine)
# self.hLine = QFrame(self)
# self.hLine.setFrameShape(QFrame.Shape.HLine)
# self.hLine.setFrameShadow(QFrame.Shadow.Plain)
# self.hLine.setFixedHeight(5)
# self.gridLayout.addWidget(self.hLine, self.gridLayout.rowCount(), 0, -1, -1)
self.delegateHeader = QWidget(self)
self.delegateHeaderHBoxLayout = QHBoxLayout(self.delegateHeader)
@ -47,7 +47,9 @@ class ScoreEditorDelegateWrapper(ScoreEditor):
self.editorDiscardButton.clicked.connect(self.rejected)
self.delegateHeaderHBoxLayout.addWidget(self.editorDiscardButton)
self.formLayout.insertRow(0, self.delegateHeader)
self.gridLayout.addWidget(
self.delegateHeader, self.gridLayout.rowCount(), 0, -1, -1
)
def setText(self, score: Score, _extra: str = None):
text = "Editing "

View File

@ -1,10 +1,18 @@
from enum import IntEnum
from typing import Optional
from typing import Any, Optional
from arcaea_offline.calculate import calculate_score_range
from arcaea_offline.models import Chart, Score
from PySide6.QtCore import QCoreApplication, QDateTime, Signal, Slot
from PySide6.QtWidgets import QMessageBox, QWidget
from PySide6.QtWidgets import (
QCheckBox,
QComboBox,
QDateTimeEdit,
QLineEdit,
QMessageBox,
QSpinBox,
QWidget,
)
from ui.designer.components.scoreEditor_ui import Ui_ScoreEditor
@ -14,6 +22,7 @@ class ScoreValidateResult(IntEnum):
ScoreMismatch = 1
ScoreEmpty = 2
ChartInvalid = 50
ScoreIncomplete = 100
class ScoreEditor(Ui_ScoreEditor, QWidget):
@ -26,6 +35,7 @@ class ScoreEditor(Ui_ScoreEditor, QWidget):
self.__validateBeforeAccept = True
self.__chart = None
self.__score_id = None
self.scoreLineEdit.textChanged.connect(self.valueChanged)
self.pureSpinBox.valueChanged.connect(self.valueChanged)
@ -33,22 +43,41 @@ class ScoreEditor(Ui_ScoreEditor, QWidget):
self.lostSpinBox.valueChanged.connect(self.valueChanged)
self.dateTimeEdit.dateTimeChanged.connect(self.valueChanged)
self.maxRecallSpinBox.valueChanged.connect(self.valueChanged)
self.modifierComboBox.currentIndexChanged.connect(self.valueChanged)
self.clearTypeComboBox.currentIndexChanged.connect(self.valueChanged)
self.commentLineEdit.textChanged.connect(self.valueChanged)
self.pureNoneCheckBox.toggled.connect(self.valueChanged)
self.farNoneCheckBox.toggled.connect(self.valueChanged)
self.lostNoneCheckBox.toggled.connect(self.valueChanged)
self.dateNoneCheckBox.toggled.connect(self.valueChanged)
self.maxRecallNoneCheckBox.toggled.connect(self.valueChanged)
self.modifierNoneCheckBox.toggled.connect(self.valueChanged)
self.clearTypeNoneCheckBox.toggled.connect(self.valueChanged)
self.commentNoneCheckBox.toggled.connect(self.valueChanged)
self.valueChanged.connect(self.validateScore)
self.valueChanged.connect(self.updateValidateLabel)
self.modifierComboBox.addItem("NORMAL", 0)
self.modifierComboBox.addItem("EASY", 1)
self.modifierComboBox.addItem("HARD", 2)
self.modifierComboBox.setCurrentIndex(-1)
self.clearTypeComboBox.addItem("TRACK LOST", 0)
self.clearTypeComboBox.addItem("TRACK COMPLETE", 1)
self.clearTypeComboBox.addItem("HARD LOST", 2)
self.clearTypeComboBox.addItem("NORMAL CLEAR", 1)
self.clearTypeComboBox.addItem("FULL RECALL", 2)
self.clearTypeComboBox.addItem("PURE MEMORY", 3)
self.clearTypeComboBox.addItem("EASY CLEAR", 4)
self.clearTypeComboBox.addItem("HARD CLEAR", 5)
self.clearTypeComboBox.setCurrentIndex(-1)
self.dateTimeEdit.setDateTime(QDateTime.currentDateTime())
def setValidateBeforeAccept(self, __bool: bool):
self.__validateBeforeAccept = __bool
def triggerValidateMessageBox(self):
validate = self.validateScore()
if validate == ScoreValidateResult.Ok:
if validate in [ScoreValidateResult.Ok, ScoreValidateResult.ScoreIncomplete]:
return True
if validate == ScoreValidateResult.ChartInvalid:
QMessageBox.critical(
@ -132,9 +161,12 @@ class ScoreEditor(Ui_ScoreEditor, QWidget):
score = self.value()
if score.pure is None or score.far is None:
return ScoreValidateResult.ScoreIncomplete
score_range = calculate_score_range(self.__chart.notes, score.pure, score.far)
score_in_range = score_range[0] <= score.score <= score_range[1]
note_in_range = score.pure + score.far + score.lost <= self.__chart.notes
score_in_range = score_range[0] <= score.score <= score_range[1]
if not score_in_range or not note_in_range:
return ScoreValidateResult.ScoreMismatch
if score.score == 0:
@ -152,37 +184,114 @@ class ScoreEditor(Ui_ScoreEditor, QWidget):
text = QCoreApplication.translate("ScoreEditor", "validate.scoreMismatch")
elif validate == ScoreValidateResult.ScoreEmpty:
text = QCoreApplication.translate("ScoreEditor", "validate.scoreEmpty")
elif validate == ScoreValidateResult.ScoreIncomplete:
text = QCoreApplication.translate("ScoreEditor", "validate.scoreIncomplete")
else:
text = QCoreApplication.translate("ScoreEditor", "validate.unknownState")
self.validateLabel.setText(text)
def value(self):
if isinstance(self.__chart, Chart):
return Score(
song_id=self.__chart.song_id,
rating_class=self.__chart.rating_class,
score=self.score(),
pure=self.pureSpinBox.value(),
far=self.farSpinBox.value(),
lost=self.lostSpinBox.value(),
date=self.dateTimeEdit.dateTime().toSecsSinceEpoch(),
max_recall=self.maxRecallSpinBox.value()
if self.maxRecallSpinBox.value() > -1
else None,
def __getItemBaseName(self, item: QLineEdit | QSpinBox | QDateTimeEdit | QComboBox):
if isinstance(item, QSpinBox):
return item.objectName().replace("SpinBox", "")
elif isinstance(item, QLineEdit):
if item.objectName() == "scoreLineEdit":
return "score"
return item.objectName().replace("LineEdit", "")
elif isinstance(item, QComboBox):
return item.objectName().replace("ComboBox", "")
elif isinstance(item, QDateTimeEdit):
return "date"
def __getItemNoneCheckBox(self, itemBaseName: str) -> QCheckBox | None:
return self.findChild(QCheckBox, f"{itemBaseName}NoneCheckBox")
def __getItemEnabled(self, itemBaseName: str):
return not self.__getItemNoneCheckBox(itemBaseName).isChecked()
def getItemValue(self, item: QLineEdit | QSpinBox | QDateTimeEdit | QComboBox):
if isinstance(item, QDateTimeEdit) and item.objectName() == "dateTimeEdit":
return (
None
if self.dateNoneCheckBox.isChecked()
else self.dateTimeEdit.dateTime().toSecsSinceEpoch()
)
itemBaseName = self.__getItemBaseName(item)
itemEnabled = self.__getItemEnabled(itemBaseName)
if isinstance(item, QSpinBox):
return item.value() if itemEnabled else None
elif isinstance(item, QLineEdit):
return item.text() if itemEnabled else None
elif isinstance(item, QComboBox):
return item.currentData() if itemEnabled else None
def value(self):
if not isinstance(self.__chart, Chart):
return
score = Score(
song_id=self.__chart.song_id, rating_class=self.__chart.rating_class
)
if self.__score_id is not None:
score.id = self.__score_id
score.score = self.score()
score.pure = self.getItemValue(self.pureSpinBox)
score.far = self.getItemValue(self.farSpinBox)
score.lost = self.getItemValue(self.lostSpinBox)
score.date = self.getItemValue(self.dateTimeEdit)
score.max_recall = self.getItemValue(self.maxRecallSpinBox)
score.modifier = self.getItemValue(self.modifierComboBox)
score.clear_type = self.getItemValue(self.clearTypeComboBox)
score.comment = self.getItemValue(self.commentLineEdit)
return score
def setItemValue(
self, item: QLineEdit | QSpinBox | QDateTimeEdit | QComboBox, value: Any
):
if isinstance(item, QDateTimeEdit) and item.objectName() == "dateTimeEdit":
if value is None:
self.dateNoneCheckBox.setChecked(True)
else:
self.dateNoneCheckBox.setChecked(False)
self.dateTimeEdit.setDateTime(QDateTime.fromSecsSinceEpoch(value))
itemBaseName = self.__getItemBaseName(item)
itemNoneCheckBox = self.__getItemNoneCheckBox(itemBaseName)
if value is None:
itemNoneCheckBox.setChecked(True)
return
else:
itemNoneCheckBox.setChecked(False)
if isinstance(item, QSpinBox):
item.setValue(value)
elif isinstance(item, QLineEdit):
item.setText(value)
elif isinstance(item, QComboBox):
item.setCurrentIndex(value)
def setValue(self, score: Score):
if isinstance(score, Score):
scoreText = str(score.score)
scoreText = scoreText.rjust(8, "0")
self.scoreLineEdit.setText(scoreText)
self.pureSpinBox.setValue(score.pure)
self.farSpinBox.setValue(score.far)
self.lostSpinBox.setValue(score.lost)
self.dateTimeEdit.setDateTime(QDateTime.fromSecsSinceEpoch(score.date))
if score.max_recall is not None:
self.maxRecallSpinBox.setValue(score.max_recall)
if not isinstance(score, Score):
return
if score.id is not None:
self.__score_id = score.id
self.idLabel.setText(str(self.__score_id))
scoreText = str(score.score)
scoreText = scoreText.rjust(8, "0")
self.scoreLineEdit.setText(scoreText)
self.setItemValue(self.pureSpinBox, score.pure)
self.setItemValue(self.farSpinBox, score.far)
self.setItemValue(self.lostSpinBox, score.lost)
self.setItemValue(self.dateTimeEdit, score.date)
self.setItemValue(self.maxRecallSpinBox, score.max_recall)
self.setItemValue(self.modifierComboBox, score.modifier)
self.setItemValue(self.clearTypeComboBox, score.clear_type)
self.setItemValue(self.commentLineEdit, score.comment)
def reset(self):
self.setChart(None)
@ -190,5 +299,7 @@ class ScoreEditor(Ui_ScoreEditor, QWidget):
self.pureSpinBox.setValue(0)
self.farSpinBox.setValue(0)
self.lostSpinBox.setValue(0)
self.maxRecallSpinBox.setValue(-1)
self.maxRecallSpinBox.setValue(0)
self.modifierComboBox.setCurrentIndex(-1)
self.clearTypeComboBox.setCurrentIndex(-1)
self.commentLineEdit.setText("")