mirror of
https://github.com/283375/arcaea-offline-pyside-ui.git
synced 2025-07-05 06:06:27 +00:00
Compare commits
10 Commits
c888b312b3
...
v0.3.8
Author | SHA1 | Date | |
---|---|---|---|
d5895fe230
|
|||
cd2e3f51ca
|
|||
4a09dc210a | |||
cc8ab11b78
|
|||
48c5682e55 | |||
ee03770764
|
|||
b45c7f7de5
|
|||
15bc56e6f9
|
|||
39ee379010
|
|||
5a71a5822b
|
@ -1,6 +1,9 @@
|
|||||||
name: Build UI from latest `arcaea-offline-*` dependencies
|
name: Build UI from latest `arcaea-offline-*` dependencies
|
||||||
run-name: ${{ github.actor }} started a build request.
|
run-name: ${{ github.actor }} started a build request.
|
||||||
on: [workflow_dispatch]
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-windows:
|
build-windows:
|
||||||
runs-on: windows-2022
|
runs-on: windows-2022
|
||||||
@ -8,16 +11,16 @@ jobs:
|
|||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- uses: actions/setup-python@v4
|
- uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: '3.11'
|
python-version: "3.11"
|
||||||
|
|
||||||
# install dependencies
|
# install dependencies
|
||||||
- run: 'pip install -r requirements.txt'
|
- run: "pip install -r requirements.txt"
|
||||||
- run: 'pip uninstall arcaea-offline arcaea-offline-ocr -y'
|
- run: "pip uninstall arcaea-offline arcaea-offline-ocr -y"
|
||||||
- run: 'pip install git+https://github.com/283375/arcaea-offline'
|
- run: "pip install git+https://github.com/283375/arcaea-offline"
|
||||||
- run: 'pip install git+https://github.com/283375/arcaea-offline-ocr'
|
- run: "pip install git+https://github.com/283375/arcaea-offline-ocr"
|
||||||
- run: 'pip install nuitka imageio'
|
- run: "pip install nuitka imageio"
|
||||||
- name: Install UPX
|
- name: Install UPX
|
||||||
uses: crazy-max/ghaction-upx@v3
|
uses: crazy-max/ghaction-upx@v3
|
||||||
with:
|
with:
|
||||||
@ -25,11 +28,11 @@ jobs:
|
|||||||
|
|
||||||
# release builtin files
|
# release builtin files
|
||||||
- run: 'pyside6-lrelease.exe .\ui\resources\lang\en_US.ts .\ui\resources\lang\zh_CN.ts'
|
- run: 'pyside6-lrelease.exe .\ui\resources\lang\en_US.ts .\ui\resources\lang\zh_CN.ts'
|
||||||
- run: 'python prebuild.py'
|
- run: "python prebuild.py"
|
||||||
- run: 'pyside6-rcc.exe .\ui\resources\resources.qrc -o .\ui\resources\resources_rc.py'
|
- run: 'pyside6-rcc.exe .\ui\resources\resources.qrc -o .\ui\resources\resources_rc.py'
|
||||||
|
|
||||||
# build
|
# build
|
||||||
- run: 'python -m nuitka --plugin-enable=upx --enable-plugin=pyside6 --assume-yes-for-downloads --windows-icon-from-ico=./ui/resources/images/icon.png --standalone --onefile index.py'
|
- run: "python -m nuitka --plugin-enable=upx --enable-plugin=pyside6 --assume-yes-for-downloads --windows-icon-from-ico=./ui/resources/images/icon.png --standalone --onefile index.py"
|
||||||
|
|
||||||
- uses: actions/upload-artifact@v3
|
- uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
|
36
.github/workflows/build.yml
vendored
36
.github/workflows/build.yml
vendored
@ -1,6 +1,16 @@
|
|||||||
name: Build UI
|
name: Build UI
|
||||||
run-name: ${{ github.actor }} started a build request.
|
run-name: ${{ github.actor }} started a build request.
|
||||||
on: [workflow_dispatch]
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- "v[0-9]+.[0-9]+.[0-9]+"
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
discussions: write
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-windows:
|
build-windows:
|
||||||
runs-on: windows-2022
|
runs-on: windows-2022
|
||||||
@ -8,14 +18,14 @@ jobs:
|
|||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- uses: actions/setup-python@v4
|
- uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: '3.11'
|
python-version: "3.11"
|
||||||
cache: 'pip'
|
cache: "pip"
|
||||||
|
|
||||||
# install dependencies
|
# install dependencies
|
||||||
- run: 'pip install -r requirements.txt'
|
- run: "pip install -r requirements.txt"
|
||||||
- run: 'pip install nuitka imageio'
|
- run: "pip install nuitka imageio"
|
||||||
- name: Install UPX
|
- name: Install UPX
|
||||||
uses: crazy-max/ghaction-upx@v3
|
uses: crazy-max/ghaction-upx@v3
|
||||||
with:
|
with:
|
||||||
@ -23,13 +33,17 @@ jobs:
|
|||||||
|
|
||||||
# release builtin files
|
# release builtin files
|
||||||
- run: 'pyside6-lrelease.exe .\ui\resources\lang\en_US.ts .\ui\resources\lang\zh_CN.ts'
|
- run: 'pyside6-lrelease.exe .\ui\resources\lang\en_US.ts .\ui\resources\lang\zh_CN.ts'
|
||||||
- run: 'python prebuild.py'
|
- run: "python prebuild.py"
|
||||||
- run: 'pyside6-rcc.exe .\ui\resources\resources.qrc -o .\ui\resources\resources_rc.py'
|
- run: 'pyside6-rcc.exe .\ui\resources\resources.qrc -o .\ui\resources\resources_rc.py'
|
||||||
|
|
||||||
# build
|
# build
|
||||||
- run: 'python -m nuitka --plugin-enable=upx --enable-plugin=pyside6 --assume-yes-for-downloads --windows-icon-from-ico=./ui/resources/images/icon.png --standalone --onefile index.py'
|
- run: "python -m nuitka --plugin-enable=upx --enable-plugin=pyside6 --assume-yes-for-downloads --windows-icon-from-ico=./ui/resources/images/icon.png --standalone --onefile index.py"
|
||||||
|
|
||||||
- uses: actions/upload-artifact@v3
|
- name: Draft a release
|
||||||
|
uses: softprops/action-gh-release@v2
|
||||||
with:
|
with:
|
||||||
name: build-windows
|
discussion_category_name: New releases
|
||||||
path: index.exe
|
draft: true
|
||||||
|
generate_release_notes: true
|
||||||
|
files: |
|
||||||
|
index.exe
|
||||||
|
22
README.md
22
README.md
@ -1,9 +1,27 @@
|
|||||||
# Arcaea Offline PySide UI
|
# Arcaea Offline PySide UI
|
||||||
|
|
||||||
GUI for both [283375/arcaea-offline](https://github.com/283375/arcaea-offline) and [283375/arcaea-offline-ocr](https://github.com/283375/arcaea-offline-ocr)
|
GUI for both [283375/arcaea-offline](https://github.com/283375/arcaea-offline) and [ArcaeaOffline/core-ocr](https://github.com/ArcaeaOffline/core-ocr).
|
||||||
|
|
||||||
## Before you run `python index.py`...
|
## Prerequisites
|
||||||
|
|
||||||
* Install requirements
|
* Install requirements
|
||||||
* Release translation files from `ui/resources/lang/*.ts`
|
* Release translation files from `ui/resources/lang/*.ts`
|
||||||
|
* Run `prebuild.py`
|
||||||
* Compile `ui/resources/resources.qrc` to `ui/resources/resources_rc.py`
|
* Compile `ui/resources/resources.qrc` to `ui/resources/resources_rc.py`
|
||||||
|
|
||||||
|
You can refer to the [GitHub Actions file](./.github/workflows/build.yml) for a rough reference.
|
||||||
|
|
||||||
|
```
|
||||||
|
pip install -r ./requirements.txt
|
||||||
|
pyside6-lrelease ./ui/resources/lang/en_US.ts ./ui/resources/lang/zh_CN.ts
|
||||||
|
python prebuild.py
|
||||||
|
pyside6-rcc ./ui/resources/resources.qrc -o ./ui/resources/resources_rc.py
|
||||||
|
```
|
||||||
|
|
||||||
|
Sometimes you have to install the latest, unpublished version of `arcaea-offline` and `arcaea-offline-ocr`.
|
||||||
|
|
||||||
|
```
|
||||||
|
pip uninstall -y arcaea-offline arcaea-offline-ocr
|
||||||
|
pip install git+https://github.com/283375/arcaea-offline
|
||||||
|
pip install git+https://github.com/ArcaeaOffline/core-ocr
|
||||||
|
```
|
||||||
|
@ -4,14 +4,14 @@ build-backend = "setuptools.build_meta"
|
|||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "arcaea-offline-pyside-ui"
|
name = "arcaea-offline-pyside-ui"
|
||||||
version = "0.1.0"
|
version = "0.3.8"
|
||||||
authors = [{ name = "283375", email = "log_283375@163.com" }]
|
authors = [{ name = "283375", email = "log_283375@163.com" }]
|
||||||
description = "No description."
|
description = "No description."
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
requires-python = ">=3.9"
|
requires-python = ">=3.9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"arcaea-offline==0.2.1",
|
"arcaea-offline==0.2.2",
|
||||||
"arcaea-offline-ocr==0.0.97",
|
"arcaea-offline-ocr==0.0.98",
|
||||||
"exif==1.6.0",
|
"exif==1.6.0",
|
||||||
"PySide6==6.5.2",
|
"PySide6==6.5.2",
|
||||||
]
|
]
|
||||||
@ -21,8 +21,8 @@ classifiers = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
[project.urls]
|
[project.urls]
|
||||||
"Homepage" = "https://github.com/283375/arcaea-offline-pyside-ui"
|
"Homepage" = "https://github.com/ArcaeaOffline/client-pyside6"
|
||||||
"Bug Tracker" = "https://github.com/283375/arcaea-offline-pyside-ui/issues"
|
"Bug Tracker" = "https://github.com/ArcaeaOffline/client-pyside6/issues"
|
||||||
|
|
||||||
[tool.black]
|
[tool.black]
|
||||||
force-exclude = '''
|
force-exclude = '''
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
arcaea-offline==0.2.1
|
arcaea-offline==0.2.2
|
||||||
arcaea-offline-ocr==0.0.97
|
arcaea-offline-ocr==0.0.98
|
||||||
exif==1.6.0
|
exif==1.6.0
|
||||||
|
Pillow==10.1.0
|
||||||
PySide6==6.5.2
|
PySide6==6.5.2
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>580</width>
|
<width>580</width>
|
||||||
<height>521</height>
|
<height>551</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
@ -86,7 +86,7 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="8" column="0" colspan="2">
|
<item row="9" column="0" colspan="2">
|
||||||
<widget class="QLabel" name="label_12">
|
<widget class="QLabel" name="label_12">
|
||||||
<property name="font">
|
<property name="font">
|
||||||
<font>
|
<font>
|
||||||
@ -99,35 +99,35 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="9" column="0">
|
<item row="10" column="0">
|
||||||
<widget class="QPushButton" name="importSt3Button">
|
<widget class="QPushButton" name="importSt3Button">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>importSt3Button</string>
|
<string>importSt3Button</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="9" column="1">
|
<item row="10" column="1">
|
||||||
<widget class="QLabel" name="label_2">
|
<widget class="QLabel" name="label_2">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>importSt3.description</string>
|
<string>importSt3.description</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="10" column="0">
|
<item row="11" column="0">
|
||||||
<widget class="QPushButton" name="importOnlineButton">
|
<widget class="QPushButton" name="importOnlineButton">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>importOnlineButton</string>
|
<string>importOnlineButton</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="10" column="1">
|
<item row="11" column="1">
|
||||||
<widget class="QLabel" name="label_8">
|
<widget class="QLabel" name="label_8">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>importOnline.description</string>
|
<string>importOnline.description</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="12" column="0" colspan="2">
|
<item row="13" column="0" colspan="2">
|
||||||
<widget class="QLabel" name="label_13">
|
<widget class="QLabel" name="label_13">
|
||||||
<property name="font">
|
<property name="font">
|
||||||
<font>
|
<font>
|
||||||
@ -140,28 +140,28 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="13" column="0">
|
<item row="14" column="0">
|
||||||
<widget class="QPushButton" name="exportScoresButton">
|
<widget class="QPushButton" name="exportScoresButton">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>exportScoresButton</string>
|
<string>exportScoresButton</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="13" column="1">
|
<item row="14" column="1">
|
||||||
<widget class="QLabel" name="label_3">
|
<widget class="QLabel" name="label_3">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>exportScores.description</string>
|
<string>exportScores.description</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="14" column="0">
|
<item row="15" column="0">
|
||||||
<widget class="QPushButton" name="exportSmartRteB30Button">
|
<widget class="QPushButton" name="exportSmartRteB30Button">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>exportSmartRteB30Button</string>
|
<string>exportSmartRteB30Button</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="14" column="1">
|
<item row="15" column="1">
|
||||||
<widget class="QLabel" name="label_9">
|
<widget class="QLabel" name="label_9">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>exportSmartRteB30.description</string>
|
<string>exportSmartRteB30.description</string>
|
||||||
@ -174,7 +174,7 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="16" column="0" colspan="2">
|
<item row="17" column="0" colspan="2">
|
||||||
<widget class="QLabel" name="label_14">
|
<widget class="QLabel" name="label_14">
|
||||||
<property name="font">
|
<property name="font">
|
||||||
<font>
|
<font>
|
||||||
@ -187,14 +187,14 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="17" column="0">
|
<item row="18" column="0">
|
||||||
<widget class="QPushButton" name="exportArcsongJsonButton">
|
<widget class="QPushButton" name="exportArcsongJsonButton">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>exportArcsongJsonButton</string>
|
<string>exportArcsongJsonButton</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="17" column="1">
|
<item row="18" column="1">
|
||||||
<widget class="QLabel" name="label_6">
|
<widget class="QLabel" name="label_6">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>exportArcsongJson.description</string>
|
<string>exportArcsongJson.description</string>
|
||||||
@ -230,7 +230,7 @@
|
|||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
<item row="7" column="0">
|
<item row="8" column="0">
|
||||||
<spacer name="verticalSpacer_2">
|
<spacer name="verticalSpacer_2">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Vertical</enum>
|
<enum>Qt::Vertical</enum>
|
||||||
@ -246,7 +246,7 @@
|
|||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
<item row="11" column="0">
|
<item row="12" column="0">
|
||||||
<spacer name="verticalSpacer_3">
|
<spacer name="verticalSpacer_3">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Vertical</enum>
|
<enum>Qt::Vertical</enum>
|
||||||
@ -262,7 +262,7 @@
|
|||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
<item row="15" column="0">
|
<item row="16" column="0">
|
||||||
<spacer name="verticalSpacer_4">
|
<spacer name="verticalSpacer_4">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Vertical</enum>
|
<enum>Qt::Vertical</enum>
|
||||||
@ -278,6 +278,20 @@
|
|||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="7" column="0">
|
||||||
|
<widget class="QPushButton" name="syncChartInfoDbButton">
|
||||||
|
<property name="text">
|
||||||
|
<string>syncChartInfoDbButton</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="7" column="1">
|
||||||
|
<widget class="QLabel" name="label_15">
|
||||||
|
<property name="text">
|
||||||
|
<string>syncChartInfoDb.description</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<resources/>
|
<resources/>
|
||||||
|
@ -22,7 +22,7 @@ class Ui_TabDb_Manage(object):
|
|||||||
def setupUi(self, TabDb_Manage):
|
def setupUi(self, TabDb_Manage):
|
||||||
if not TabDb_Manage.objectName():
|
if not TabDb_Manage.objectName():
|
||||||
TabDb_Manage.setObjectName(u"TabDb_Manage")
|
TabDb_Manage.setObjectName(u"TabDb_Manage")
|
||||||
TabDb_Manage.resize(580, 521)
|
TabDb_Manage.resize(580, 551)
|
||||||
TabDb_Manage.setWindowTitle(u"TabDb_Manage")
|
TabDb_Manage.setWindowTitle(u"TabDb_Manage")
|
||||||
self.formLayout = QFormLayout(TabDb_Manage)
|
self.formLayout = QFormLayout(TabDb_Manage)
|
||||||
self.formLayout.setObjectName(u"formLayout")
|
self.formLayout.setObjectName(u"formLayout")
|
||||||
@ -80,71 +80,71 @@ class Ui_TabDb_Manage(object):
|
|||||||
self.label_12.setObjectName(u"label_12")
|
self.label_12.setObjectName(u"label_12")
|
||||||
self.label_12.setFont(font)
|
self.label_12.setFont(font)
|
||||||
|
|
||||||
self.formLayout.setWidget(8, QFormLayout.SpanningRole, self.label_12)
|
self.formLayout.setWidget(9, QFormLayout.SpanningRole, self.label_12)
|
||||||
|
|
||||||
self.importSt3Button = QPushButton(TabDb_Manage)
|
self.importSt3Button = QPushButton(TabDb_Manage)
|
||||||
self.importSt3Button.setObjectName(u"importSt3Button")
|
self.importSt3Button.setObjectName(u"importSt3Button")
|
||||||
|
|
||||||
self.formLayout.setWidget(9, QFormLayout.LabelRole, self.importSt3Button)
|
self.formLayout.setWidget(10, QFormLayout.LabelRole, self.importSt3Button)
|
||||||
|
|
||||||
self.label_2 = QLabel(TabDb_Manage)
|
self.label_2 = QLabel(TabDb_Manage)
|
||||||
self.label_2.setObjectName(u"label_2")
|
self.label_2.setObjectName(u"label_2")
|
||||||
|
|
||||||
self.formLayout.setWidget(9, QFormLayout.FieldRole, self.label_2)
|
self.formLayout.setWidget(10, QFormLayout.FieldRole, self.label_2)
|
||||||
|
|
||||||
self.importOnlineButton = QPushButton(TabDb_Manage)
|
self.importOnlineButton = QPushButton(TabDb_Manage)
|
||||||
self.importOnlineButton.setObjectName(u"importOnlineButton")
|
self.importOnlineButton.setObjectName(u"importOnlineButton")
|
||||||
|
|
||||||
self.formLayout.setWidget(10, QFormLayout.LabelRole, self.importOnlineButton)
|
self.formLayout.setWidget(11, QFormLayout.LabelRole, self.importOnlineButton)
|
||||||
|
|
||||||
self.label_8 = QLabel(TabDb_Manage)
|
self.label_8 = QLabel(TabDb_Manage)
|
||||||
self.label_8.setObjectName(u"label_8")
|
self.label_8.setObjectName(u"label_8")
|
||||||
|
|
||||||
self.formLayout.setWidget(10, QFormLayout.FieldRole, self.label_8)
|
self.formLayout.setWidget(11, QFormLayout.FieldRole, self.label_8)
|
||||||
|
|
||||||
self.label_13 = QLabel(TabDb_Manage)
|
self.label_13 = QLabel(TabDb_Manage)
|
||||||
self.label_13.setObjectName(u"label_13")
|
self.label_13.setObjectName(u"label_13")
|
||||||
self.label_13.setFont(font)
|
self.label_13.setFont(font)
|
||||||
|
|
||||||
self.formLayout.setWidget(12, QFormLayout.SpanningRole, self.label_13)
|
self.formLayout.setWidget(13, QFormLayout.SpanningRole, self.label_13)
|
||||||
|
|
||||||
self.exportScoresButton = QPushButton(TabDb_Manage)
|
self.exportScoresButton = QPushButton(TabDb_Manage)
|
||||||
self.exportScoresButton.setObjectName(u"exportScoresButton")
|
self.exportScoresButton.setObjectName(u"exportScoresButton")
|
||||||
|
|
||||||
self.formLayout.setWidget(13, QFormLayout.LabelRole, self.exportScoresButton)
|
self.formLayout.setWidget(14, QFormLayout.LabelRole, self.exportScoresButton)
|
||||||
|
|
||||||
self.label_3 = QLabel(TabDb_Manage)
|
self.label_3 = QLabel(TabDb_Manage)
|
||||||
self.label_3.setObjectName(u"label_3")
|
self.label_3.setObjectName(u"label_3")
|
||||||
|
|
||||||
self.formLayout.setWidget(13, QFormLayout.FieldRole, self.label_3)
|
self.formLayout.setWidget(14, QFormLayout.FieldRole, self.label_3)
|
||||||
|
|
||||||
self.exportSmartRteB30Button = QPushButton(TabDb_Manage)
|
self.exportSmartRteB30Button = QPushButton(TabDb_Manage)
|
||||||
self.exportSmartRteB30Button.setObjectName(u"exportSmartRteB30Button")
|
self.exportSmartRteB30Button.setObjectName(u"exportSmartRteB30Button")
|
||||||
|
|
||||||
self.formLayout.setWidget(14, QFormLayout.LabelRole, self.exportSmartRteB30Button)
|
self.formLayout.setWidget(15, QFormLayout.LabelRole, self.exportSmartRteB30Button)
|
||||||
|
|
||||||
self.label_9 = QLabel(TabDb_Manage)
|
self.label_9 = QLabel(TabDb_Manage)
|
||||||
self.label_9.setObjectName(u"label_9")
|
self.label_9.setObjectName(u"label_9")
|
||||||
self.label_9.setOpenExternalLinks(True)
|
self.label_9.setOpenExternalLinks(True)
|
||||||
self.label_9.setTextInteractionFlags(Qt.LinksAccessibleByKeyboard|Qt.LinksAccessibleByMouse)
|
self.label_9.setTextInteractionFlags(Qt.LinksAccessibleByKeyboard|Qt.LinksAccessibleByMouse)
|
||||||
|
|
||||||
self.formLayout.setWidget(14, QFormLayout.FieldRole, self.label_9)
|
self.formLayout.setWidget(15, QFormLayout.FieldRole, self.label_9)
|
||||||
|
|
||||||
self.label_14 = QLabel(TabDb_Manage)
|
self.label_14 = QLabel(TabDb_Manage)
|
||||||
self.label_14.setObjectName(u"label_14")
|
self.label_14.setObjectName(u"label_14")
|
||||||
self.label_14.setFont(font)
|
self.label_14.setFont(font)
|
||||||
|
|
||||||
self.formLayout.setWidget(16, QFormLayout.SpanningRole, self.label_14)
|
self.formLayout.setWidget(17, QFormLayout.SpanningRole, self.label_14)
|
||||||
|
|
||||||
self.exportArcsongJsonButton = QPushButton(TabDb_Manage)
|
self.exportArcsongJsonButton = QPushButton(TabDb_Manage)
|
||||||
self.exportArcsongJsonButton.setObjectName(u"exportArcsongJsonButton")
|
self.exportArcsongJsonButton.setObjectName(u"exportArcsongJsonButton")
|
||||||
|
|
||||||
self.formLayout.setWidget(17, QFormLayout.LabelRole, self.exportArcsongJsonButton)
|
self.formLayout.setWidget(18, QFormLayout.LabelRole, self.exportArcsongJsonButton)
|
||||||
|
|
||||||
self.label_6 = QLabel(TabDb_Manage)
|
self.label_6 = QLabel(TabDb_Manage)
|
||||||
self.label_6.setObjectName(u"label_6")
|
self.label_6.setObjectName(u"label_6")
|
||||||
|
|
||||||
self.formLayout.setWidget(17, QFormLayout.FieldRole, self.label_6)
|
self.formLayout.setWidget(18, QFormLayout.FieldRole, self.label_6)
|
||||||
|
|
||||||
self.label_10 = QLabel(TabDb_Manage)
|
self.label_10 = QLabel(TabDb_Manage)
|
||||||
self.label_10.setObjectName(u"label_10")
|
self.label_10.setObjectName(u"label_10")
|
||||||
@ -158,15 +158,25 @@ class Ui_TabDb_Manage(object):
|
|||||||
|
|
||||||
self.verticalSpacer_2 = QSpacerItem(20, 20, QSizePolicy.Minimum, QSizePolicy.Minimum)
|
self.verticalSpacer_2 = QSpacerItem(20, 20, QSizePolicy.Minimum, QSizePolicy.Minimum)
|
||||||
|
|
||||||
self.formLayout.setItem(7, QFormLayout.LabelRole, self.verticalSpacer_2)
|
self.formLayout.setItem(8, QFormLayout.LabelRole, self.verticalSpacer_2)
|
||||||
|
|
||||||
self.verticalSpacer_3 = QSpacerItem(20, 20, QSizePolicy.Minimum, QSizePolicy.Minimum)
|
self.verticalSpacer_3 = QSpacerItem(20, 20, QSizePolicy.Minimum, QSizePolicy.Minimum)
|
||||||
|
|
||||||
self.formLayout.setItem(11, QFormLayout.LabelRole, self.verticalSpacer_3)
|
self.formLayout.setItem(12, QFormLayout.LabelRole, self.verticalSpacer_3)
|
||||||
|
|
||||||
self.verticalSpacer_4 = QSpacerItem(20, 20, QSizePolicy.Minimum, QSizePolicy.Minimum)
|
self.verticalSpacer_4 = QSpacerItem(20, 20, QSizePolicy.Minimum, QSizePolicy.Minimum)
|
||||||
|
|
||||||
self.formLayout.setItem(15, QFormLayout.LabelRole, self.verticalSpacer_4)
|
self.formLayout.setItem(16, QFormLayout.LabelRole, self.verticalSpacer_4)
|
||||||
|
|
||||||
|
self.syncChartInfoDbButton = QPushButton(TabDb_Manage)
|
||||||
|
self.syncChartInfoDbButton.setObjectName(u"syncChartInfoDbButton")
|
||||||
|
|
||||||
|
self.formLayout.setWidget(7, QFormLayout.LabelRole, self.syncChartInfoDbButton)
|
||||||
|
|
||||||
|
self.label_15 = QLabel(TabDb_Manage)
|
||||||
|
self.label_15.setObjectName(u"label_15")
|
||||||
|
|
||||||
|
self.formLayout.setWidget(7, QFormLayout.FieldRole, self.label_15)
|
||||||
|
|
||||||
|
|
||||||
self.retranslateUi(TabDb_Manage)
|
self.retranslateUi(TabDb_Manage)
|
||||||
@ -198,5 +208,7 @@ class Ui_TabDb_Manage(object):
|
|||||||
self.exportArcsongJsonButton.setText(QCoreApplication.translate("TabDb_Manage", u"exportArcsongJsonButton", None))
|
self.exportArcsongJsonButton.setText(QCoreApplication.translate("TabDb_Manage", u"exportArcsongJsonButton", None))
|
||||||
self.label_6.setText(QCoreApplication.translate("TabDb_Manage", u"exportArcsongJson.description", None))
|
self.label_6.setText(QCoreApplication.translate("TabDb_Manage", u"exportArcsongJson.description", None))
|
||||||
self.label_10.setText(QCoreApplication.translate("TabDb_Manage", u"packSongInfoGroup", None))
|
self.label_10.setText(QCoreApplication.translate("TabDb_Manage", u"packSongInfoGroup", None))
|
||||||
|
self.syncChartInfoDbButton.setText(QCoreApplication.translate("TabDb_Manage", u"syncChartInfoDbButton", None))
|
||||||
|
self.label_15.setText(QCoreApplication.translate("TabDb_Manage", u"syncChartInfoDb.description", None))
|
||||||
pass
|
pass
|
||||||
# retranslateUi
|
# retranslateUi
|
||||||
|
@ -82,6 +82,7 @@ class ChartDelegate(TextSegmentDelegate):
|
|||||||
QColor("#809955"),
|
QColor("#809955"),
|
||||||
QColor("#702d60"),
|
QColor("#702d60"),
|
||||||
QColor("#710f25"),
|
QColor("#710f25"),
|
||||||
|
QColor("#8b77a4"),
|
||||||
]
|
]
|
||||||
ChartInvalidBackgroundColor = QColor("#e6a23c")
|
ChartInvalidBackgroundColor = QColor("#e6a23c")
|
||||||
|
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
import logging
|
||||||
from typing import Type
|
from typing import Type
|
||||||
|
|
||||||
from PySide6.QtCore import Signal
|
from PySide6.QtCore import Signal
|
||||||
@ -6,6 +7,8 @@ from PySide6.QtWidgets import QHBoxLayout, QSizePolicy, QVBoxLayout, QWidget
|
|||||||
|
|
||||||
from ui.implements.components.ratingClassRadioButton import RatingClassRadioButton
|
from ui.implements.components.ratingClassRadioButton import RatingClassRadioButton
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class RatingClassSelector(QWidget):
|
class RatingClassSelector(QWidget):
|
||||||
valueChanged = Signal()
|
valueChanged = Signal()
|
||||||
@ -41,16 +44,30 @@ class RatingClassSelector(QWidget):
|
|||||||
self.bydButton.setAutoExclusive(False)
|
self.bydButton.setAutoExclusive(False)
|
||||||
self.preferredLayout.addWidget(self.bydButton)
|
self.preferredLayout.addWidget(self.bydButton)
|
||||||
|
|
||||||
self.buttons = [self.pstButton, self.prsButton, self.ftrButton, self.bydButton]
|
self.etrButton = RatingClassRadioButton(self)
|
||||||
|
self.etrButton.setObjectName("etrButton")
|
||||||
|
self.etrButton.setText("ETERNAL")
|
||||||
|
self.etrButton.setAutoExclusive(False)
|
||||||
|
self.preferredLayout.addWidget(self.etrButton)
|
||||||
|
|
||||||
|
self.buttons = [
|
||||||
|
self.pstButton,
|
||||||
|
self.prsButton,
|
||||||
|
self.ftrButton,
|
||||||
|
self.bydButton,
|
||||||
|
self.etrButton,
|
||||||
|
]
|
||||||
self.pstButton.setColors(QColor("#399bb2"), QColor("#f0f8fa"))
|
self.pstButton.setColors(QColor("#399bb2"), QColor("#f0f8fa"))
|
||||||
self.prsButton.setColors(QColor("#809955"), QColor("#f7f9f4"))
|
self.prsButton.setColors(QColor("#809955"), QColor("#f7f9f4"))
|
||||||
self.ftrButton.setColors(QColor("#702d60"), QColor("#f7ebf4"))
|
self.ftrButton.setColors(QColor("#702d60"), QColor("#f7ebf4"))
|
||||||
self.bydButton.setColors(QColor("#710f25"), QColor("#f9ced8"))
|
self.bydButton.setColors(QColor("#710f25"), QColor("#f9ced8"))
|
||||||
|
self.etrButton.setColors(QColor("#4f2c7a"), QColor("#e4daf1"))
|
||||||
|
|
||||||
self.pstButton.clicked.connect(self.select)
|
self.pstButton.clicked.connect(self.select)
|
||||||
self.prsButton.clicked.connect(self.select)
|
self.prsButton.clicked.connect(self.select)
|
||||||
self.ftrButton.clicked.connect(self.select)
|
self.ftrButton.clicked.connect(self.select)
|
||||||
self.bydButton.clicked.connect(self.select)
|
self.bydButton.clicked.connect(self.select)
|
||||||
|
self.etrButton.clicked.connect(self.select)
|
||||||
self.reset()
|
self.reset()
|
||||||
self.setButtonsEnabled([])
|
self.setButtonsEnabled([])
|
||||||
|
|
||||||
@ -106,9 +123,10 @@ class RatingClassSelector(QWidget):
|
|||||||
|
|
||||||
if ratingClass is None or isinstance(ratingClass, bool):
|
if ratingClass is None or isinstance(ratingClass, bool):
|
||||||
button = self.sender()
|
button = self.sender()
|
||||||
elif ratingClass in range(4):
|
elif ratingClass in range(len(self.buttons)):
|
||||||
button = self.buttons[ratingClass]
|
button = self.buttons[ratingClass]
|
||||||
else:
|
else:
|
||||||
|
logger.debug(f"Cannot select {ratingClass=}, condition check failed")
|
||||||
return
|
return
|
||||||
|
|
||||||
if not button.isEnabled():
|
if not button.isEnabled():
|
||||||
|
@ -14,6 +14,7 @@ from arcaea_offline.external.arcaea import (
|
|||||||
)
|
)
|
||||||
from arcaea_offline.external.arcaea.common import ArcaeaParser
|
from arcaea_offline.external.arcaea.common import ArcaeaParser
|
||||||
from arcaea_offline.external.arcsong import ArcsongDbParser
|
from arcaea_offline.external.arcsong import ArcsongDbParser
|
||||||
|
from arcaea_offline.external.chart_info_db import ChartInfoDbParser
|
||||||
from arcaea_offline.external.smartrte import SmartRteB30CsvConverter
|
from arcaea_offline.external.smartrte import SmartRteB30CsvConverter
|
||||||
from arcaea_offline.models import Difficulty, Pack, Song
|
from arcaea_offline.models import Difficulty, Pack, Song
|
||||||
from PySide6.QtCore import QDateTime, QDir, Slot
|
from PySide6.QtCore import QDateTime, QDir, Slot
|
||||||
@ -57,6 +58,29 @@ class TabDb_Manage(Ui_TabDb_Manage, QWidget):
|
|||||||
self, "Sync Error", "\n".join(traceback.format_exception(e))
|
self, "Sync Error", "\n".join(traceback.format_exception(e))
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@Slot()
|
||||||
|
def on_syncChartInfoDbButton_clicked(self):
|
||||||
|
dbFile, filter = QFileDialog.getOpenFileName(
|
||||||
|
self, None, "", "DB File (*.db);;*"
|
||||||
|
)
|
||||||
|
|
||||||
|
if not dbFile:
|
||||||
|
return
|
||||||
|
|
||||||
|
try:
|
||||||
|
db = Database()
|
||||||
|
parser = ChartInfoDbParser(dbFile)
|
||||||
|
with db.sessionmaker() as session:
|
||||||
|
parser.write_database(session)
|
||||||
|
session.commit()
|
||||||
|
databaseUpdateSignals.chartInfoUpdated.emit()
|
||||||
|
QMessageBox.information(self, None, "OK")
|
||||||
|
except Exception as e:
|
||||||
|
logging.exception("Sync chart info database error")
|
||||||
|
QMessageBox.critical(
|
||||||
|
self, "Sync Error", "\n".join(traceback.format_exception(e))
|
||||||
|
)
|
||||||
|
|
||||||
def importFromArcaeaParser(
|
def importFromArcaeaParser(
|
||||||
self, parser: ArcaeaParser, instance, logName, path
|
self, parser: ArcaeaParser, instance, logName, path
|
||||||
) -> int:
|
) -> int:
|
||||||
|
@ -716,6 +716,16 @@ validation</translation>
|
|||||||
<source>miscGroup</source>
|
<source>miscGroup</source>
|
||||||
<translation>Miscellaneous</translation>
|
<translation>Miscellaneous</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../../designer/tabs/tabDb/tabDb_Manage.ui" line="284"/>
|
||||||
|
<source>syncChartInfoDbButton</source>
|
||||||
|
<translation>Sync Chart Info Database</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../../designer/tabs/tabDb/tabDb_Manage.ui" line="291"/>
|
||||||
|
<source>syncChartInfoDb.description</source>
|
||||||
|
<translation>Update chart info</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../designer/tabs/tabDb/tabDb_Manage.ui" line="23"/>
|
<location filename="../../designer/tabs/tabDb/tabDb_Manage.ui" line="23"/>
|
||||||
<source>importPacklistButton</source>
|
<source>importPacklistButton</source>
|
||||||
|
@ -715,6 +715,16 @@
|
|||||||
<source>miscGroup</source>
|
<source>miscGroup</source>
|
||||||
<translation>杂项</translation>
|
<translation>杂项</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../../designer/tabs/tabDb/tabDb_Manage.ui" line="284"/>
|
||||||
|
<source>syncChartInfoDbButton</source>
|
||||||
|
<translation>同步谱面信息数据库</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../../designer/tabs/tabDb/tabDb_Manage.ui" line="291"/>
|
||||||
|
<source>syncChartInfoDb.description</source>
|
||||||
|
<translation>更新谱面信息</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../designer/tabs/tabDb/tabDb_Manage.ui" line="23"/>
|
<location filename="../../designer/tabs/tabDb/tabDb_Manage.ui" line="23"/>
|
||||||
<source>importPacklistButton</source>
|
<source>importPacklistButton</source>
|
||||||
|
@ -3,7 +3,7 @@ import traceback
|
|||||||
from enum import IntEnum
|
from enum import IntEnum
|
||||||
|
|
||||||
from arcaea_offline.database import Database
|
from arcaea_offline.database import Database
|
||||||
from PySide6.QtCore import QCoreApplication, QDir, QFileInfo, Qt, QUrl, Slot
|
from PySide6.QtCore import QCoreApplication, QDir, QFileInfo, QSysInfo, Qt, QUrl, Slot
|
||||||
from PySide6.QtWidgets import QDialog, QMessageBox
|
from PySide6.QtWidgets import QDialog, QMessageBox
|
||||||
|
|
||||||
from ui.extends.shared.database import create_engine
|
from ui.extends.shared.database import create_engine
|
||||||
@ -59,8 +59,13 @@ class DatabaseChecker(Ui_DatabaseChecker, QDialog):
|
|||||||
return QUrl.fromLocalFile(self.dbFileInfo().filePath())
|
return QUrl.fromLocalFile(self.dbFileInfo().filePath())
|
||||||
|
|
||||||
def dbSqliteUrl(self):
|
def dbSqliteUrl(self):
|
||||||
# dbSqliteUrl.setScheme("sqlite")
|
kernelType = QSysInfo.kernelType()
|
||||||
|
# the slash count varies depending on the kernel
|
||||||
|
# https://docs.sqlalchemy.org/en/20/core/engines.html#sqlite
|
||||||
|
if kernelType == "winnt":
|
||||||
return QUrl(self.dbFileUrl().toString().replace("file://", "sqlite://"))
|
return QUrl(self.dbFileUrl().toString().replace("file://", "sqlite://"))
|
||||||
|
else:
|
||||||
|
return QUrl(self.dbFileUrl().toString().replace("file://", "sqlite:///"))
|
||||||
|
|
||||||
def confirmDb(self) -> DatabaseCheckerResult:
|
def confirmDb(self) -> DatabaseCheckerResult:
|
||||||
flags = 0x000
|
flags = 0x000
|
||||||
|
Reference in New Issue
Block a user