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