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("")