diff --git a/ui/designer/components/scoreEditor.ui b/ui/designer/components/scoreEditor.ui
index 369696a..15f40cb 100644
--- a/ui/designer/components/scoreEditor.ui
+++ b/ui/designer/components/scoreEditor.ui
@@ -6,42 +6,32 @@
0
0
- 365
- 253
+ 450
+ 350
ScoreEditor
-
-
- QFormLayout::ExpandingFieldsGrow
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
- -
-
+
+
-
+
- formLabel.score
+ setNone
- -
-
-
- B9'999'999;_
-
-
-
- -
-
+
-
+
- PURE
+ Modifier
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
- -
+
-
@@ -54,81 +44,44 @@
+ -
+
+
+ setNone
+
+
+ true
+
+
+
-
-
+
- FAR
+ PURE
-
-
- -
-
-
-
- 100
- 0
-
-
-
- 0
-
-
-
- -
-
-
- LOST
-
-
-
- -
-
-
-
- 100
- 0
-
-
-
- 0
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
-
+
- formLabel.time
+ LOST
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
- -
-
-
-
- 0
- 0
-
-
-
-
- 0
- 0
- 0
- 2017
- 1
- 22
-
-
-
-
- 2017
- 1
- 22
-
+
-
+
+
+ setNone
- -
+
-
Qt::Vertical
@@ -141,67 +94,23 @@
- -
-
+
-
+
+
+
+ 0
+ 0
+
+
- MAX RECALL
+ ...
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
- -
-
-
-
- 100
- 0
-
-
-
- -1
-
-
- 0
-
-
- -1
-
-
-
- -
-
-
-
-
-
-
- 0
- 0
-
-
-
- ...
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
-
-
- -
-
-
- commitButton
-
-
-
-
-
- -
-
-
- formLabel.clearType
-
-
-
- -
+
-
false
@@ -214,6 +123,219 @@
+ -
+
+
+ Clear Type
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+ FAR
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+ MAX RECALL
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+ false
+
+
+
+ 100
+ 0
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+
+ -
+
+
+ false
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ yyyy/M/d HH:mm:ss
+
+
+ false
+
+
+
+ -
+
+
+
+ 100
+ 0
+
+
+
+ 0
+
+
+
+ -
+
+
+ setNone
+
+
+
+ -
+
+
+ false
+
+
+
+ -
+
+
+ setNone
+
+
+ true
+
+
+
+ -
+
+
+ setNone
+
+
+ true
+
+
+
+ -
+
+
+ formLabel.date
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+ commitButton
+
+
+
+ -
+
+
+ B9'999'999;_
+
+
+
+ -
+
+
+ setNone
+
+
+ true
+
+
+
+ -
+
+
+
+ 100
+ 0
+
+
+
+ 0
+
+
+
+ -
+
+
+ formLabel.comment
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+ formLabel.score
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+ setNone
+
+
+
+ -
+
+
+ ID
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+ idAutoInsert
+
+
+
@@ -224,5 +346,134 @@
-
+
+
+ pureNoneCheckBox
+ toggled(bool)
+ pureSpinBox
+ setDisabled(bool)
+
+
+ 521
+ 44
+
+
+ 288
+ 44
+
+
+
+
+ clearTypeNoneCheckBox
+ toggled(bool)
+ clearTypeComboBox
+ setDisabled(bool)
+
+
+ 521
+ 263
+
+
+ 288
+ 264
+
+
+
+
+ modifierNoneCheckBox
+ toggled(bool)
+ modifierComboBox
+ setDisabled(bool)
+
+
+ 521
+ 236
+
+
+ 288
+ 237
+
+
+
+
+ maxRecallNoneCheckBox
+ toggled(bool)
+ maxRecallSpinBox
+ setDisabled(bool)
+
+
+ 521
+ 210
+
+
+ 288
+ 210
+
+
+
+
+ dateNoneCheckBox
+ toggled(bool)
+ dateTimeEdit
+ setDisabled(bool)
+
+
+ 521
+ 122
+
+
+ 288
+ 122
+
+
+
+
+ lostNoneCheckBox
+ toggled(bool)
+ lostSpinBox
+ setDisabled(bool)
+
+
+ 521
+ 96
+
+
+ 288
+ 96
+
+
+
+
+ farNoneCheckBox
+ toggled(bool)
+ farSpinBox
+ setDisabled(bool)
+
+
+ 521
+ 70
+
+
+ 288
+ 70
+
+
+
+
+ commentNoneCheckBox
+ toggled(bool)
+ commentLineEdit
+ setDisabled(bool)
+
+
+ 395
+ 270
+
+
+ 237
+ 270
+
+
+
+
diff --git a/ui/designer/components/scoreEditor_ui.py b/ui/designer/components/scoreEditor_ui.py
index df2ebe5..c3a174c 100644
--- a/ui/designer/components/scoreEditor_ui.py
+++ b/ui/designer/components/scoreEditor_ui.py
@@ -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
diff --git a/ui/extends/shared/delegates/chartDelegate.py b/ui/extends/shared/delegates/chartDelegate.py
index 8d68ccb..c4184a9 100644
--- a/ui/extends/shared/delegates/chartDelegate.py
+++ b/ui/extends/shared/delegates/chartDelegate.py
@@ -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):
diff --git a/ui/extends/shared/delegates/scoreDelegate.py b/ui/extends/shared/delegates/scoreDelegate.py
index a56fa19..57cca8f 100644
--- a/ui/extends/shared/delegates/scoreDelegate.py
+++ b/ui/extends/shared/delegates/scoreDelegate.py
@@ -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 "
diff --git a/ui/implements/components/scoreEditor.py b/ui/implements/components/scoreEditor.py
index 111d187..b307553 100644
--- a/ui/implements/components/scoreEditor.py
+++ b/ui/implements/components/scoreEditor.py
@@ -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("")