From 01457f3559184197d9af126cc55dd4b69ff509a3 Mon Sep 17 00:00:00 2001 From: 283375 Date: Sat, 21 Oct 2023 23:03:59 +0800 Subject: [PATCH] feat: SmartRTE csv export --- ui/designer/tabs/tabDb/tabDb_Manage.ui | 20 +++++++++++++++++ ui/designer/tabs/tabDb/tabDb_Manage_ui.py | 14 ++++++++++++ ui/implements/tabs/tabDb/tabDb_Manage.py | 26 +++++++++++++++++++++++ ui/resources/lang/en_US.ts | 10 +++++++++ ui/resources/lang/zh_CN.ts | 10 +++++++++ 5 files changed, 80 insertions(+) diff --git a/ui/designer/tabs/tabDb/tabDb_Manage.ui b/ui/designer/tabs/tabDb/tabDb_Manage.ui index bb8f5da..f9f0ab2 100644 --- a/ui/designer/tabs/tabDb/tabDb_Manage.ui +++ b/ui/designer/tabs/tabDb/tabDb_Manage.ui @@ -143,6 +143,26 @@ + + + + exportSmartRteB30Button + + + + + + + exportSmartRteB30.description + + + true + + + Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse + + + diff --git a/ui/designer/tabs/tabDb/tabDb_Manage_ui.py b/ui/designer/tabs/tabDb/tabDb_Manage_ui.py index 5ecdb9c..3ad1dff 100644 --- a/ui/designer/tabs/tabDb/tabDb_Manage_ui.py +++ b/ui/designer/tabs/tabDb/tabDb_Manage_ui.py @@ -121,6 +121,18 @@ class Ui_TabDb_Manage(object): self.formLayout.setWidget(6, QFormLayout.FieldRole, self.label_8) + self.exportSmartRteB30Button = QPushButton(TabDb_Manage) + self.exportSmartRteB30Button.setObjectName(u"exportSmartRteB30Button") + + self.formLayout.setWidget(10, QFormLayout.LabelRole, self.exportSmartRteB30Button) + + self.label_9 = QLabel(TabDb_Manage) + self.label_9.setObjectName(u"label_9") + self.label_9.setOpenExternalLinks(True) + self.label_9.setTextInteractionFlags(Qt.LinksAccessibleByKeyboard|Qt.LinksAccessibleByMouse) + + self.formLayout.setWidget(10, QFormLayout.FieldRole, self.label_9) + self.retranslateUi(TabDb_Manage) @@ -144,6 +156,8 @@ class Ui_TabDb_Manage(object): self.label_7.setText(QCoreApplication.translate("TabDb_Manage", u"importApk.description", None)) self.importOnlineButton.setText(QCoreApplication.translate("TabDb_Manage", u"importOnlineButton", None)) self.label_8.setText(QCoreApplication.translate("TabDb_Manage", u"importOnline.description", None)) + self.exportSmartRteB30Button.setText(QCoreApplication.translate("TabDb_Manage", u"exportSmartRteB30Button", None)) + self.label_9.setText(QCoreApplication.translate("TabDb_Manage", u"exportSmartRteB30.description", None)) pass # retranslateUi diff --git a/ui/implements/tabs/tabDb/tabDb_Manage.py b/ui/implements/tabs/tabDb/tabDb_Manage.py index f82139a..73a8bcb 100644 --- a/ui/implements/tabs/tabDb/tabDb_Manage.py +++ b/ui/implements/tabs/tabDb/tabDb_Manage.py @@ -1,3 +1,4 @@ +import csv import json import logging import traceback @@ -13,6 +14,7 @@ from arcaea_offline.external.arcaea import ( ) from arcaea_offline.external.arcaea.common import ArcaeaParser from arcaea_offline.external.arcsong import ArcsongDbParser +from arcaea_offline.external.smartrte import SmartRteB30CsvConverter from arcaea_offline.models import Difficulty, Pack, Song from PySide6.QtCore import QDir, Slot from PySide6.QtWidgets import QFileDialog, QMessageBox, QWidget @@ -232,3 +234,27 @@ class TabDb_Manage(Ui_TabDb_Manage, QWidget): ) with open(exportLocation, "w", encoding="utf-8") as f: f.write(content) + + @Slot() + def on_exportSmartRteB30Button_clicked(self): + try: + with Database().sessionmaker() as session: + converter = SmartRteB30CsvConverter(session) + csvRows = converter.rows() + + exportLocation, _filter = QFileDialog.getSaveFileName( + self, + "Export CSV file", + QDir.current().filePath("smartrte_scores.csv"), + "CSV (*.csv);;*", + ) + with open(exportLocation, "w", encoding="utf-8", newline="") as f: + csvWriter = csv.writer(f) + csvWriter.writerows(csvRows) + + QMessageBox.information(self, None, "OK") + except Exception as e: + logging.exception("Export SmartRTE csv error:") + QMessageBox.critical( + self, "Export Error", "\n".join(traceback.format_exception(e)) + ) diff --git a/ui/resources/lang/en_US.ts b/ui/resources/lang/en_US.ts index d68802e..3d118d2 100644 --- a/ui/resources/lang/en_US.ts +++ b/ui/resources/lang/en_US.ts @@ -726,6 +726,16 @@ validation importOnline.description Import scores from the result of Arcaea Online API + + + exportSmartRteB30Button + Export Scores (CSV, SmartRTE B30) + + + + exportSmartRteB30.description + Export all your scores to <a href="https://smartrte.github.io/b30gen.html">smartrte.github.io</a> compatible CSV file + TabOcrDisabled diff --git a/ui/resources/lang/zh_CN.ts b/ui/resources/lang/zh_CN.ts index 4c89082..ec6d0b6 100644 --- a/ui/resources/lang/zh_CN.ts +++ b/ui/resources/lang/zh_CN.ts @@ -725,6 +725,16 @@ importOnline.description 从 Arcaea Online 的 API 结果导入分数 + + + exportSmartRteB30Button + 导出分数(CSV,SmartRTE B30) + + + + exportSmartRteB30.description + 将所有分数导出为兼容 <a href="https://smartrte.github.io/b30gen.html">smartrte.github.io</a> 的 CSV 文件 + TabOcrDisabled