From 87304b02f7915409ab8677e118e17326b955292c Mon Sep 17 00:00:00 2001 From: 283375 Date: Sat, 13 Sep 2025 14:47:24 +0800 Subject: [PATCH] wip: qml overview tab --- ui/designer/tabs/tabOverview.ui | 124 ----------------------------- ui/designer/tabs/tabOverview_ui.py | 114 -------------------------- ui/implements/tabs/tabOverview.py | 53 ------------ ui/qmls/Overview.qml | 65 +++++++++++++++ ui/viewmodels/overview.py | 21 ++++- 5 files changed, 82 insertions(+), 295 deletions(-) delete mode 100644 ui/designer/tabs/tabOverview.ui delete mode 100644 ui/designer/tabs/tabOverview_ui.py delete mode 100644 ui/implements/tabs/tabOverview.py create mode 100644 ui/qmls/Overview.qml diff --git a/ui/designer/tabs/tabOverview.ui b/ui/designer/tabs/tabOverview.ui deleted file mode 100644 index 60bdf1f..0000000 --- a/ui/designer/tabs/tabOverview.ui +++ /dev/null @@ -1,124 +0,0 @@ - - - TabOverview - - - - 0 - 0 - 696 - 509 - - - - TabOverview - - - - - - - - - ... - - - - - - - - 0 - 0 - - - - - - - - - - - 30 - - - - 0.00 - - - Qt::AlignBottom|Qt::AlignHCenter - - - - - - - - 20 - - - - B30 - - - Qt::AlignHCenter|Qt::AlignTop - - - - - - - - - - false - - - - - - false - - - - 30 - - - - -- - - - Qt::AlignBottom|Qt::AlignHCenter - - - - - - - false - - - - 20 - - - - R10 - - - Qt::AlignHCenter|Qt::AlignTop - - - - - - - - - - - - - - diff --git a/ui/designer/tabs/tabOverview_ui.py b/ui/designer/tabs/tabOverview_ui.py deleted file mode 100644 index a2b026f..0000000 --- a/ui/designer/tabs/tabOverview_ui.py +++ /dev/null @@ -1,114 +0,0 @@ -# -*- coding: utf-8 -*- - -################################################################################ -## Form generated from reading UI file 'tabOverview.ui' -## -## Created by: Qt User Interface Compiler version 6.5.2 -## -## WARNING! All changes made in this file will be lost when recompiling UI file! -################################################################################ - -from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, - QMetaObject, QObject, QPoint, QRect, - QSize, QTime, QUrl, Qt) -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, QHBoxLayout, QLabel, QSizePolicy, - QVBoxLayout, QWidget) - -class Ui_TabOverview(object): - def setupUi(self, TabOverview): - if not TabOverview.objectName(): - TabOverview.setObjectName(u"TabOverview") - TabOverview.resize(696, 509) - TabOverview.setWindowTitle(u"TabOverview") - self.verticalLayout = QVBoxLayout(TabOverview) - self.verticalLayout.setObjectName(u"verticalLayout") - self.widget = QWidget(TabOverview) - self.widget.setObjectName(u"widget") - - self.verticalLayout.addWidget(self.widget) - - self.databaseDescribeLabel = QLabel(TabOverview) - self.databaseDescribeLabel.setObjectName(u"databaseDescribeLabel") - self.databaseDescribeLabel.setText(u"...") - - self.verticalLayout.addWidget(self.databaseDescribeLabel) - - self.widget_2 = QWidget(TabOverview) - self.widget_2.setObjectName(u"widget_2") - sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.widget_2.sizePolicy().hasHeightForWidth()) - self.widget_2.setSizePolicy(sizePolicy) - self.horizontalLayout = QHBoxLayout(self.widget_2) - self.horizontalLayout.setObjectName(u"horizontalLayout") - self.widget_3 = QWidget(self.widget_2) - self.widget_3.setObjectName(u"widget_3") - self.verticalLayout_2 = QVBoxLayout(self.widget_3) - self.verticalLayout_2.setObjectName(u"verticalLayout_2") - self.b30Label = QLabel(self.widget_3) - self.b30Label.setObjectName(u"b30Label") - font = QFont() - font.setPointSize(30) - self.b30Label.setFont(font) - self.b30Label.setText(u"0.00") - self.b30Label.setAlignment(Qt.AlignBottom|Qt.AlignHCenter) - - self.verticalLayout_2.addWidget(self.b30Label) - - self.label_2 = QLabel(self.widget_3) - self.label_2.setObjectName(u"label_2") - font1 = QFont() - font1.setPointSize(20) - self.label_2.setFont(font1) - self.label_2.setText(u"B30") - self.label_2.setAlignment(Qt.AlignHCenter|Qt.AlignTop) - - self.verticalLayout_2.addWidget(self.label_2) - - - self.horizontalLayout.addWidget(self.widget_3) - - self.widget_4 = QWidget(self.widget_2) - self.widget_4.setObjectName(u"widget_4") - self.widget_4.setEnabled(False) - self.verticalLayout_3 = QVBoxLayout(self.widget_4) - self.verticalLayout_3.setObjectName(u"verticalLayout_3") - self.r10Label = QLabel(self.widget_4) - self.r10Label.setObjectName(u"r10Label") - self.r10Label.setEnabled(False) - self.r10Label.setFont(font) - self.r10Label.setText(u"--") - self.r10Label.setAlignment(Qt.AlignBottom|Qt.AlignHCenter) - - self.verticalLayout_3.addWidget(self.r10Label) - - self.label_4 = QLabel(self.widget_4) - self.label_4.setObjectName(u"label_4") - self.label_4.setEnabled(False) - self.label_4.setFont(font1) - self.label_4.setText(u"R10") - self.label_4.setAlignment(Qt.AlignHCenter|Qt.AlignTop) - - self.verticalLayout_3.addWidget(self.label_4) - - - self.horizontalLayout.addWidget(self.widget_4) - - - self.verticalLayout.addWidget(self.widget_2) - - - self.retranslateUi(TabOverview) - - QMetaObject.connectSlotsByName(TabOverview) - # setupUi - - def retranslateUi(self, TabOverview): - pass - # retranslateUi - diff --git a/ui/implements/tabs/tabOverview.py b/ui/implements/tabs/tabOverview.py deleted file mode 100644 index 67448b9..0000000 --- a/ui/implements/tabs/tabOverview.py +++ /dev/null @@ -1,53 +0,0 @@ -import logging - -from arcaea_offline.database import Database -from PySide6.QtCore import QCoreApplication -from PySide6.QtGui import QShowEvent -from PySide6.QtWidgets import QWidget - -from ui.designer.tabs.tabOverview_ui import Ui_TabOverview -from ui.extends.shared.language import LanguageChangeEventFilter - -logger = logging.getLogger(__name__) - - -class TabOverview(Ui_TabOverview, QWidget): - def __init__(self, parent=None): - super().__init__(parent) - self.setupUi(self) - - self.languageChangeEventFilter = LanguageChangeEventFilter(self) - self.installEventFilter(self.languageChangeEventFilter) - - self.db = Database() - - def showEvent(self, event: QShowEvent) -> None: - self.updateOverview() - return super().showEvent(event) - - def updateOverview(self): - try: - b30 = self.db.get_b30() or 0.00 - self.b30Label.setText(str(f"{b30:.3f}")) - except Exception: - logger.exception("Cannot get b30:") - self.b30Label.setText("ERR") - - try: - self.databaseDescribeLabel.setText( - self.describeFormatString.format( - self.db.count_packs(), - self.db.count_songs(), - self.db.count_difficulties(), - self.db.count_chart_infos(), - self.db.count_complete_chart_infos(), - self.db.count_scores(), - ) - ) - except Exception: - logger.exception("Cannot update overview:") - self.databaseDescribeLabel.setText("ERR") - - def retranslateUi(self, *args): - super().retranslateUi(self) - self.describeFormatString = QCoreApplication.translate("TabOverview", "databaseDescribeLabel {} {} {} {} {} {}") # fmt: skip diff --git a/ui/qmls/Overview.qml b/ui/qmls/Overview.qml new file mode 100644 index 0000000..b136cb1 --- /dev/null +++ b/ui/qmls/Overview.qml @@ -0,0 +1,65 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts + +import internal.ui.vm 1.0 + +Page { + id: root + property var b30: vm.b30 + + OverviewViewModel { + id: vm + + onB30Changed: { + root.b30 = vm.b30; + } + } + + component Display: RowLayout { + required property string label + required property string value + + spacing: 5 + + // implicitHeight: valueText.implicitHeight + + Text { + text: parent.label + Layout.alignment: Qt.AlignBaseline + } + + Text { + id: valueText + + text: parent.value + font.pointSize: 18 + Layout.alignment: Qt.AlignBaseline + } + } + + RowLayout { + ColumnLayout { + Layout.fillWidth: true + Layout.alignment: Qt.AlignBottom + + Display { + label: 'B30' + value: root.b30 >= 0 ? root.b30.toFixed(3) : 'N/A' + } + + Display { + label: 'R10' + value: 'Not supported' + } + } + + Button { + Layout.alignment: Qt.AlignBottom + + // TODO: icon + text: 'Reload' + onClicked: vm.reload() + } + } +} diff --git a/ui/viewmodels/overview.py b/ui/viewmodels/overview.py index 72ffb83..23a8e28 100644 --- a/ui/viewmodels/overview.py +++ b/ui/viewmodels/overview.py @@ -1,6 +1,8 @@ -from PySide6.QtCore import Property, QObject, Signal +from PySide6.QtCore import Property, QObject, Signal, Slot from PySide6.QtQml import QmlElement +from core.database import Database + from .common import VM_QML_IMPORT_NAME QML_IMPORT_NAME = VM_QML_IMPORT_NAME @@ -11,11 +13,22 @@ QML_IMPORT_MINOR_VERSION = 0 @QmlElement class OverviewViewModel(QObject): _void = Signal() + b30Changed = Signal() def __init__(self): super().__init__() - def get_b30(self): - return 0 + self._b30 = -1.0 + self.reload() - b30 = Property(float, get_b30, None, notify=_void) + @Slot() + def reload(self): + conn = Database() + b30 = conn.b30 + self._b30 = b30 if b30 is not None else -1.0 + self.b30Changed.emit() + + def getB30(self): + return self._b30 + + b30 = Property(float, getB30, None, notify=b30Changed)