wip: TabTools_Andreal

This commit is contained in:
283375 2023-09-21 18:05:00 +08:00
parent 567a959c8f
commit 44915f6d19
Signed by: 283375
SSH Key Fingerprint: SHA256:UcX0qg6ZOSDOeieKPGokA5h7soykG61nz2uxuQgVLSk
7 changed files with 1003 additions and 0 deletions

View File

@ -0,0 +1,400 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>TabTools_Andreal</class>
<widget class="QWidget" name="TabTools_Andreal">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>551</width>
<height>500</height>
</rect>
</property>
<property name="windowTitle">
<string notr="true">TabTools_Andreal</string>
</property>
<layout class="QFormLayout" name="formLayout">
<property name="labelAlignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>andrealFolder</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="FileSelector" name="andrealFolderSelector" native="true"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>andrealExecutable</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="FileSelector" name="andrealExecutableSelector" native="true"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>imageType</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QWidget" name="horizontalWidget" native="true">
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QRadioButton" name="imageType_infoRadioButton">
<property name="text">
<string>/a</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="imageType_best30RadioButton">
<property name="text">
<string>/a b30</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="imageType_bestRadioButton">
<property name="text">
<string>/a info</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="imageTypeWhatIsThisButton">
<property name="text">
<string>imageTypeWhatIsThisButton</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="chartFormLabel">
<property name="text">
<string>chart</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>imageVersion</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QComboBox" name="imageVersionComboBox">
<property name="maximumSize">
<size>
<width>100</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>imageFormat</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="jpgQualityFormLabel">
<property name="text">
<string>jpgQuality</string>
</property>
</widget>
</item>
<item row="7" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="exportJsonButton">
<property name="text">
<string>exportJsonButton</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="generatePreviewButton">
<property name="text">
<string>generatePreviewButton</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="generateImageButton">
<property name="font">
<font>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>generateImageButton</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="5" column="1">
<widget class="QWidget" name="horizontalWidget_2" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QRadioButton" name="imageFormat_jpgRadioButton">
<property name="text">
<string notr="true">JPG</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="imageFormat_pngRadioButton">
<property name="text">
<string notr="true">PNG</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="8" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>preview</string>
</property>
</widget>
</item>
<item row="8" column="1">
<widget class="QLabel" name="previewLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="styleSheet">
<string notr="true">QLabel { color: red }</string>
</property>
<property name="text">
<string notr="true"/>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QWidget" name="jpgQualityHolderWidget" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QSlider" name="jpgQualitySlider">
<property name="minimum">
<number>10</number>
</property>
<property name="maximum">
<number>100</number>
</property>
<property name="value">
<number>90</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="jpgQualitySpinBox">
<property name="minimum">
<number>10</number>
</property>
<property name="maximum">
<number>100</number>
</property>
<property name="value">
<number>90</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="3" column="1">
<widget class="QWidget" name="chartHolderWidget" native="true">
<property name="enabled">
<bool>false</bool>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_8">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QPushButton" name="chartSelectButton">
<property name="maximumSize">
<size>
<width>100</width>
<height>100</height>
</size>
</property>
<property name="text">
<string>chart.selectButton</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="chartSelectLabel">
<property name="text">
<string notr="true">...</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>FileSelector</class>
<extends>QWidget</extends>
<header>ui.implements.components.fileSelector</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<connections>
<connection>
<sender>imageFormat_jpgRadioButton</sender>
<signal>toggled(bool)</signal>
<receiver>jpgQualityHolderWidget</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>141</x>
<y>149</y>
</hint>
<hint type="destinationlabel">
<x>330</x>
<y>175</y>
</hint>
</hints>
</connection>
<connection>
<sender>imageType_bestRadioButton</sender>
<signal>toggled(bool)</signal>
<receiver>chartHolderWidget</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>258</x>
<y>64</y>
</hint>
<hint type="destinationlabel">
<x>330</x>
<y>94</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -0,0 +1,264 @@
# -*- coding: utf-8 -*-
################################################################################
## Form generated from reading UI file 'tabTools_Andreal.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, QComboBox, QFormLayout, QHBoxLayout,
QLabel, QPushButton, QRadioButton, QSizePolicy,
QSlider, QSpacerItem, QSpinBox, QWidget)
from ui.implements.components.fileSelector import FileSelector
class Ui_TabTools_Andreal(object):
def setupUi(self, TabTools_Andreal):
if not TabTools_Andreal.objectName():
TabTools_Andreal.setObjectName(u"TabTools_Andreal")
TabTools_Andreal.resize(551, 500)
TabTools_Andreal.setWindowTitle(u"TabTools_Andreal")
self.formLayout = QFormLayout(TabTools_Andreal)
self.formLayout.setObjectName(u"formLayout")
self.formLayout.setLabelAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter)
self.label = QLabel(TabTools_Andreal)
self.label.setObjectName(u"label")
self.formLayout.setWidget(0, QFormLayout.LabelRole, self.label)
self.andrealFolderSelector = FileSelector(TabTools_Andreal)
self.andrealFolderSelector.setObjectName(u"andrealFolderSelector")
self.formLayout.setWidget(0, QFormLayout.FieldRole, self.andrealFolderSelector)
self.label_2 = QLabel(TabTools_Andreal)
self.label_2.setObjectName(u"label_2")
self.formLayout.setWidget(1, QFormLayout.LabelRole, self.label_2)
self.andrealExecutableSelector = FileSelector(TabTools_Andreal)
self.andrealExecutableSelector.setObjectName(u"andrealExecutableSelector")
self.formLayout.setWidget(1, QFormLayout.FieldRole, self.andrealExecutableSelector)
self.label_3 = QLabel(TabTools_Andreal)
self.label_3.setObjectName(u"label_3")
self.formLayout.setWidget(2, QFormLayout.LabelRole, self.label_3)
self.horizontalWidget = QWidget(TabTools_Andreal)
self.horizontalWidget.setObjectName(u"horizontalWidget")
self.horizontalLayout = QHBoxLayout(self.horizontalWidget)
self.horizontalLayout.setObjectName(u"horizontalLayout")
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.imageType_infoRadioButton = QRadioButton(self.horizontalWidget)
self.imageType_infoRadioButton.setObjectName(u"imageType_infoRadioButton")
self.imageType_infoRadioButton.setChecked(True)
self.horizontalLayout.addWidget(self.imageType_infoRadioButton)
self.imageType_best30RadioButton = QRadioButton(self.horizontalWidget)
self.imageType_best30RadioButton.setObjectName(u"imageType_best30RadioButton")
self.horizontalLayout.addWidget(self.imageType_best30RadioButton)
self.imageType_bestRadioButton = QRadioButton(self.horizontalWidget)
self.imageType_bestRadioButton.setObjectName(u"imageType_bestRadioButton")
self.horizontalLayout.addWidget(self.imageType_bestRadioButton)
self.horizontalSpacer_3 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
self.horizontalLayout.addItem(self.horizontalSpacer_3)
self.imageTypeWhatIsThisButton = QPushButton(self.horizontalWidget)
self.imageTypeWhatIsThisButton.setObjectName(u"imageTypeWhatIsThisButton")
self.horizontalLayout.addWidget(self.imageTypeWhatIsThisButton)
self.formLayout.setWidget(2, QFormLayout.FieldRole, self.horizontalWidget)
self.chartFormLabel = QLabel(TabTools_Andreal)
self.chartFormLabel.setObjectName(u"chartFormLabel")
self.formLayout.setWidget(3, QFormLayout.LabelRole, self.chartFormLabel)
self.label_5 = QLabel(TabTools_Andreal)
self.label_5.setObjectName(u"label_5")
self.formLayout.setWidget(4, QFormLayout.LabelRole, self.label_5)
self.imageVersionComboBox = QComboBox(TabTools_Andreal)
self.imageVersionComboBox.setObjectName(u"imageVersionComboBox")
self.imageVersionComboBox.setMaximumSize(QSize(100, 16777215))
self.formLayout.setWidget(4, QFormLayout.FieldRole, self.imageVersionComboBox)
self.label_6 = QLabel(TabTools_Andreal)
self.label_6.setObjectName(u"label_6")
self.formLayout.setWidget(5, QFormLayout.LabelRole, self.label_6)
self.jpgQualityFormLabel = QLabel(TabTools_Andreal)
self.jpgQualityFormLabel.setObjectName(u"jpgQualityFormLabel")
self.formLayout.setWidget(6, QFormLayout.LabelRole, self.jpgQualityFormLabel)
self.horizontalLayout_5 = QHBoxLayout()
self.horizontalLayout_5.setObjectName(u"horizontalLayout_5")
self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
self.horizontalLayout_5.addItem(self.horizontalSpacer)
self.exportJsonButton = QPushButton(TabTools_Andreal)
self.exportJsonButton.setObjectName(u"exportJsonButton")
self.horizontalLayout_5.addWidget(self.exportJsonButton)
self.generatePreviewButton = QPushButton(TabTools_Andreal)
self.generatePreviewButton.setObjectName(u"generatePreviewButton")
self.horizontalLayout_5.addWidget(self.generatePreviewButton)
self.generateImageButton = QPushButton(TabTools_Andreal)
self.generateImageButton.setObjectName(u"generateImageButton")
font = QFont()
font.setBold(True)
self.generateImageButton.setFont(font)
self.horizontalLayout_5.addWidget(self.generateImageButton)
self.horizontalSpacer_2 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
self.horizontalLayout_5.addItem(self.horizontalSpacer_2)
self.formLayout.setLayout(7, QFormLayout.SpanningRole, self.horizontalLayout_5)
self.horizontalWidget_2 = QWidget(TabTools_Andreal)
self.horizontalWidget_2.setObjectName(u"horizontalWidget_2")
sizePolicy = QSizePolicy(QSizePolicy.Maximum, QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.horizontalWidget_2.sizePolicy().hasHeightForWidth())
self.horizontalWidget_2.setSizePolicy(sizePolicy)
self.horizontalLayout_2 = QHBoxLayout(self.horizontalWidget_2)
self.horizontalLayout_2.setObjectName(u"horizontalLayout_2")
self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
self.imageFormat_jpgRadioButton = QRadioButton(self.horizontalWidget_2)
self.imageFormat_jpgRadioButton.setObjectName(u"imageFormat_jpgRadioButton")
self.imageFormat_jpgRadioButton.setText(u"JPG")
self.imageFormat_jpgRadioButton.setChecked(True)
self.horizontalLayout_2.addWidget(self.imageFormat_jpgRadioButton)
self.imageFormat_pngRadioButton = QRadioButton(self.horizontalWidget_2)
self.imageFormat_pngRadioButton.setObjectName(u"imageFormat_pngRadioButton")
self.imageFormat_pngRadioButton.setText(u"PNG")
self.horizontalLayout_2.addWidget(self.imageFormat_pngRadioButton)
self.formLayout.setWidget(5, QFormLayout.FieldRole, self.horizontalWidget_2)
self.label_8 = QLabel(TabTools_Andreal)
self.label_8.setObjectName(u"label_8")
self.formLayout.setWidget(8, QFormLayout.LabelRole, self.label_8)
self.previewLabel = QLabel(TabTools_Andreal)
self.previewLabel.setObjectName(u"previewLabel")
sizePolicy1 = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding)
sizePolicy1.setHorizontalStretch(0)
sizePolicy1.setVerticalStretch(0)
sizePolicy1.setHeightForWidth(self.previewLabel.sizePolicy().hasHeightForWidth())
self.previewLabel.setSizePolicy(sizePolicy1)
self.previewLabel.setStyleSheet(u"QLabel { color: red }")
self.previewLabel.setText(u"")
self.formLayout.setWidget(8, QFormLayout.FieldRole, self.previewLabel)
self.jpgQualityHolderWidget = QWidget(TabTools_Andreal)
self.jpgQualityHolderWidget.setObjectName(u"jpgQualityHolderWidget")
self.horizontalLayout_3 = QHBoxLayout(self.jpgQualityHolderWidget)
self.horizontalLayout_3.setObjectName(u"horizontalLayout_3")
self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0)
self.jpgQualitySlider = QSlider(self.jpgQualityHolderWidget)
self.jpgQualitySlider.setObjectName(u"jpgQualitySlider")
self.jpgQualitySlider.setMinimum(10)
self.jpgQualitySlider.setMaximum(100)
self.jpgQualitySlider.setValue(90)
self.jpgQualitySlider.setOrientation(Qt.Horizontal)
self.horizontalLayout_3.addWidget(self.jpgQualitySlider)
self.jpgQualitySpinBox = QSpinBox(self.jpgQualityHolderWidget)
self.jpgQualitySpinBox.setObjectName(u"jpgQualitySpinBox")
self.jpgQualitySpinBox.setMinimum(10)
self.jpgQualitySpinBox.setMaximum(100)
self.jpgQualitySpinBox.setValue(90)
self.horizontalLayout_3.addWidget(self.jpgQualitySpinBox)
self.formLayout.setWidget(6, QFormLayout.FieldRole, self.jpgQualityHolderWidget)
self.chartHolderWidget = QWidget(TabTools_Andreal)
self.chartHolderWidget.setObjectName(u"chartHolderWidget")
self.chartHolderWidget.setEnabled(False)
self.horizontalLayout_8 = QHBoxLayout(self.chartHolderWidget)
self.horizontalLayout_8.setObjectName(u"horizontalLayout_8")
self.horizontalLayout_8.setContentsMargins(0, 0, 0, 0)
self.chartSelectButton = QPushButton(self.chartHolderWidget)
self.chartSelectButton.setObjectName(u"chartSelectButton")
self.chartSelectButton.setMaximumSize(QSize(100, 100))
self.horizontalLayout_8.addWidget(self.chartSelectButton)
self.chartSelectLabel = QLabel(self.chartHolderWidget)
self.chartSelectLabel.setObjectName(u"chartSelectLabel")
self.chartSelectLabel.setText(u"...")
self.horizontalLayout_8.addWidget(self.chartSelectLabel)
self.formLayout.setWidget(3, QFormLayout.FieldRole, self.chartHolderWidget)
self.retranslateUi(TabTools_Andreal)
self.imageFormat_jpgRadioButton.toggled.connect(self.jpgQualityHolderWidget.setEnabled)
self.imageType_bestRadioButton.toggled.connect(self.chartHolderWidget.setEnabled)
QMetaObject.connectSlotsByName(TabTools_Andreal)
# setupUi
def retranslateUi(self, TabTools_Andreal):
self.label.setText(QCoreApplication.translate("TabTools_Andreal", u"andrealFolder", None))
self.label_2.setText(QCoreApplication.translate("TabTools_Andreal", u"andrealExecutable", None))
self.label_3.setText(QCoreApplication.translate("TabTools_Andreal", u"imageType", None))
self.imageType_infoRadioButton.setText(QCoreApplication.translate("TabTools_Andreal", u"/a", None))
self.imageType_best30RadioButton.setText(QCoreApplication.translate("TabTools_Andreal", u"/a b30", None))
self.imageType_bestRadioButton.setText(QCoreApplication.translate("TabTools_Andreal", u"/a info", None))
self.imageTypeWhatIsThisButton.setText(QCoreApplication.translate("TabTools_Andreal", u"imageTypeWhatIsThisButton", None))
self.chartFormLabel.setText(QCoreApplication.translate("TabTools_Andreal", u"chart", None))
self.label_5.setText(QCoreApplication.translate("TabTools_Andreal", u"imageVersion", None))
self.label_6.setText(QCoreApplication.translate("TabTools_Andreal", u"imageFormat", None))
self.jpgQualityFormLabel.setText(QCoreApplication.translate("TabTools_Andreal", u"jpgQuality", None))
self.exportJsonButton.setText(QCoreApplication.translate("TabTools_Andreal", u"exportJsonButton", None))
self.generatePreviewButton.setText(QCoreApplication.translate("TabTools_Andreal", u"generatePreviewButton", None))
self.generateImageButton.setText(QCoreApplication.translate("TabTools_Andreal", u"generateImageButton", None))
self.label_8.setText(QCoreApplication.translate("TabTools_Andreal", u"preview", None))
self.chartSelectButton.setText(QCoreApplication.translate("TabTools_Andreal", u"chart.selectButton", None))
pass
# retranslateUi

View File

@ -29,6 +29,11 @@
<string>tab.stepCalculator</string>
</attribute>
</widget>
<widget class="TabTools_Andreal" name="tab_3">
<attribute name="title">
<string>tab.andreal</string>
</attribute>
</widget>
</widget>
</item>
</layout>
@ -46,6 +51,12 @@
<header>ui.implements.tabs.tabTools.tabTools_StepCalculator</header>
<container>1</container>
</customwidget>
<customwidget>
<class>TabTools_Andreal</class>
<extends>QWidget</extends>
<header>ui.implements.tabs.tabTools.tabTools_Andreal</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<connections/>

View File

@ -18,6 +18,7 @@ from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
from PySide6.QtWidgets import (QApplication, QSizePolicy, QTabWidget, QVBoxLayout,
QWidget)
from ui.implements.tabs.tabTools.tabTools_Andreal import TabTools_Andreal
from ui.implements.tabs.tabTools.tabTools_InfoLookup import TabTools_InfoLookup
from ui.implements.tabs.tabTools.tabTools_StepCalculator import TabTools_StepCalculator
@ -37,6 +38,9 @@ class Ui_TabToolsEntry(object):
self.tab_2 = TabTools_StepCalculator()
self.tab_2.setObjectName(u"tab_2")
self.tabWidget.addTab(self.tab_2, "")
self.tab_3 = TabTools_Andreal()
self.tab_3.setObjectName(u"tab_3")
self.tabWidget.addTab(self.tab_3, "")
self.verticalLayout.addWidget(self.tabWidget)
@ -52,6 +56,7 @@ class Ui_TabToolsEntry(object):
def retranslateUi(self, TabToolsEntry):
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), QCoreApplication.translate("TabToolsEntry", u"tab.infoLookup", None))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), QCoreApplication.translate("TabToolsEntry", u"tab.stepCalculator", None))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), QCoreApplication.translate("TabToolsEntry", u"tab.andreal", None))
pass
# retranslateUi

View File

@ -0,0 +1,81 @@
import base64
import logging
import os
import re
from PySide6.QtCore import QObject, QProcess, QRunnable, QThreadPool, Signal
logger = logging.getLogger(__name__)
class AndrealExecuteRunnableSignals(QObject):
error = Signal(str, str)
completed = Signal(str, bytes)
finished = Signal()
class AndrealExecuteRunnable(QRunnable):
def __init__(self, executePath, jsonPath, arguments):
super().__init__()
self.signals = AndrealExecuteRunnableSignals()
self.executePath = executePath
self.jsonPath = jsonPath
self.arguments = arguments
def run(self):
try:
result = os.popen(f"{self.executePath} {' '.join(self.arguments)}").read()
b64Result = [s for s in result.split("\n") if s]
imageBytes = base64.b64decode(
re.sub(r"data:image/.*;base64,", "", b64Result[-1])
)
self.signals.completed.emit(self.jsonPath, imageBytes)
except Exception as e:
imageBytes = None
logger.exception(f"{self.__class__.__name__} error")
self.signals.error.emit(self.jsonPath, str(e))
finally:
os.unlink(self.jsonPath)
self.signals.finished.emit()
class AndrealHelper(QObject):
error = Signal(str, str)
ready = Signal(str, bytes)
finished = Signal()
def __init__(self, parent=None):
super().__init__(parent)
self.andrealFolder = None
self.__andrealExecutable = None
self.andrealTestProcess = QProcess(self)
self.__andrealTestResult: bool = False
@property
def andrealExecutable(self):
return self.__andrealExecutable
@andrealExecutable.setter
def andrealExecutable(self, value: str):
self.__andrealExecutable = value
self.andrealTestProcess.start(self.__andrealExecutable, ["--help"])
self.andrealTestProcess.waitForFinished()
result = bytes(self.andrealTestProcess.readAll()).decode("utf-8")
self.__andrealTestResult = "Andreal" in result and "--json-file" in result
@property
def andrealTestResult(self):
return self.__andrealTestResult
def andrealOutputToImage(self, output: str):
b64result = output.split("\n")[-1]
return base64.b64decode(b64result)
def request(self, jsonPath: str, arguments: list[str]):
runnable = AndrealExecuteRunnable(self.andrealExecutable, jsonPath, arguments)
runnable.signals.error.connect(self.error)
runnable.signals.completed.connect(self.ready)
runnable.signals.finished.connect(self.finished)
QThreadPool.globalInstance().start(runnable)

View File

@ -11,6 +11,9 @@ class SettingsAndreal(SettingsBaseWidget):
self.setupUi(self)
self.andrealFolderValueWidget.setMode(
self.andrealFolderValueWidget.getExistingDirectory
)
if self.settings.andrealFolder():
self.andrealFolderValueWidget.selectFile(self.settings.andrealFolder())
self.andrealFolderValueWidget.filesSelected.connect(self.setAndrealFolder)

View File

@ -0,0 +1,239 @@
import json
import logging
import time
from arcaea_offline.database import Database
from arcaea_offline.external.andreal.api_data import (
AndrealImageGeneratorApiDataConverter,
)
from arcaea_offline.models import Chart
from arcaea_offline.utils.rating import rating_class_to_short_text
from PySide6.QtCore import QDir, QFileInfo, Qt, Slot
from PySide6.QtGui import QImage
from PySide6.QtWidgets import QButtonGroup, QFileDialog, QLabel, QMessageBox, QWidget
from ui.designer.tabs.tabTools.tabTools_Andreal_ui import Ui_TabTools_Andreal
from ui.extends.shared.settings import ANDREAL_EXECUTABLE, ANDREAL_FOLDER
from ui.extends.tabs.tabTools.tabTools_Andreal import AndrealHelper
from ui.implements.components.chartSelector import ChartSelector
from ui.implements.components.songIdSelector import SongIdSelectorMode
logger = logging.getLogger(__name__)
class PreviewLabel(QLabel):
...
class ChartSelectorDialog(ChartSelector):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowFlag(Qt.WindowType.Dialog, True)
self.setSongIdSelectorMode(SongIdSelectorMode.Chart)
class TabTools_Andreal(Ui_TabTools_Andreal, QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
self.db = Database()
self.andrealHelper = AndrealHelper(self)
self.andrealFolderSelector.setMode(
self.andrealFolderSelector.getExistingDirectory
)
self.andrealFolderSelector.filesSelected.connect(self.setHelperPaths)
self.andrealExecutableSelector.filesSelected.connect(self.setHelperPaths)
self.andrealFolderSelector.connectSettings(ANDREAL_FOLDER)
self.andrealExecutableSelector.connectSettings(ANDREAL_EXECUTABLE)
self.generateImageButton.clicked.connect(self.requestGenerate)
self.infoChart: Chart | None = None
self.previewJsonPath = None
self.generateJsonPath = None
self.generateImageFormat = None
self.andrealHelper.error.connect(self.generateError)
self.andrealHelper.ready.connect(self.generateReady)
self.andrealHelper.finished.connect(self.generateFinished)
self.imageTypeButtonGroup = QButtonGroup(self)
self.imageTypeButtonGroup.addButton(self.imageType_infoRadioButton, 0)
self.imageTypeButtonGroup.addButton(self.imageType_bestRadioButton, 1)
self.imageTypeButtonGroup.addButton(self.imageType_best30RadioButton, 2)
self.imageFormatButtonGroup = QButtonGroup(self)
self.imageFormatButtonGroup.addButton(self.imageFormat_jpgRadioButton, 0)
self.imageFormatButtonGroup.addButton(self.imageFormat_pngRadioButton, 1)
self.imageTypeButtonGroup.idToggled.connect(self.fillImageVersionComboBox)
self.fillImageVersionComboBox()
def setHelperPaths(self):
if selectedFiles := self.andrealFolderSelector.selectedFiles():
self.andrealHelper.andrealFolder = selectedFiles[0]
if selectedFiles := self.andrealExecutableSelector.selectedFiles():
self.andrealHelper.andrealExecutable = selectedFiles[0]
def imageFormat(self):
buttonId = self.imageFormatButtonGroup.checkedId()
return ["jpg", "png"][buttonId] if buttonId > -1 else None
def imageType(self):
buttonId = self.imageTypeButtonGroup.checkedId()
return ["info", "best", "best30"][buttonId] if buttonId > -1 else None
def fillImageVersionComboBox(self):
imageType = self.imageType()
if not imageType:
return
self.imageVersionComboBox.clear()
if imageType in ["info", "best"]:
self.imageVersionComboBox.addItem("3", 3)
self.imageVersionComboBox.addItem("2", 2)
self.imageVersionComboBox.addItem("1", 1)
elif imageType == "best30":
self.imageVersionComboBox.addItem("2", 2)
self.imageVersionComboBox.addItem("1", 1)
def imageVersion(self):
return self.imageVersionComboBox.currentData()
def requestComplete(self) -> bool:
if not self.imageType():
return False
imageType = self.imageType()
if imageType == "best" and not self.infoChart:
return False
return self.imageVersion() is not None
def getAndrealArguments(self, jsonFile: str, *, preview: bool = False):
if not self.requestComplete():
return
arguments = [
str(self.imageType()),
f'--json-file="{jsonFile}"',
f"--img-version={self.imageVersion()}",
]
if self.andrealFolderSelector.selectedFiles():
arguments.append(
f'--path="{self.andrealFolderSelector.selectedFiles()[0]}"'
)
if preview:
arguments.extend(["--img-format=jpg", "--img-quality=20"])
else:
arguments.append(f"--img-format={self.imageFormat()}")
if self.imageFormat() == "jpg":
arguments.append(f"--img-quality={self.jpgQualitySpinBox.value()}")
return arguments
def getAndrealJsonContent(self):
if not self.requestComplete():
return None
imageType = self.imageType()
if imageType == "best" and not self.infoChart:
return
jsonContentDict = {}
with self.db.sessionmaker() as session:
converter = AndrealImageGeneratorApiDataConverter(session)
if imageType == "info":
jsonContentDict = converter.user_info()
elif imageType == "best":
jsonContentDict = converter.user_best(
self.infoChart.song_id, self.infoChart.rating_class
)
elif imageType == "best30":
jsonContentDict = converter.user_best30()
return json.dumps(jsonContentDict, ensure_ascii=False)
def getAndrealJsonFileName(self):
if not self.requestComplete():
return None
imageType = self.imageType()
timestamp = int(time.time() * 1000)
fileNameParts = ["andreal", imageType]
if imageType == "best":
fileNameParts.extend(
[
self.infoChart.song_id,
rating_class_to_short_text(self.infoChart.rating_class).lower(),
]
)
fileNameParts.append(timestamp)
fileNameParts = [str(i) for i in fileNameParts]
fileName = "-".join(fileNameParts)
return f"{fileName}.json"
def getTempAndrealJsonPath(self):
if fileName := self.getAndrealJsonFileName():
return QDir.temp().filePath(fileName)
else:
return None
@Slot()
def on_exportJsonButton_clicked(self):
content = self.getAndrealJsonContent()
fileName = self.getAndrealJsonFileName()
if not content or not fileName:
return
saveFileName, _ = QFileDialog.getSaveFileName(self, None, fileName)
if not saveFileName:
return
with open(saveFileName, "w", encoding="utf-8") as jf:
jf.write(content)
def requestGenerate(self):
jsonPath = self.getTempAndrealJsonPath()
if not jsonPath:
return
self.generateImageButton.setEnabled(False)
self.generateJsonPath = jsonPath
self.generateImageFormat = self.imageFormat()
with open(jsonPath, "w", encoding="utf-8") as jf:
jf.write(self.getAndrealJsonContent())
self.andrealHelper.request(jsonPath, self.getAndrealArguments(jsonPath))
def generateFinished(self):
self.generateImageButton.setEnabled(True)
def generateError(self, jsonPath: str, errorMsg: str):
if jsonPath != self.generateJsonPath:
return
QMessageBox.critical(self, "Generate Error", errorMsg)
def generateReady(self, jsonPath: str, imageBytes: bytes):
if jsonPath != self.generateJsonPath:
return
if not imageBytes:
QMessageBox.critical(self, "Generate Error", "Empty bytes received.")
return
qImage = QImage.fromData(imageBytes)
filePathParts = jsonPath.split(".")
filePathParts[-1] = self.generateImageFormat
filePath = ".".join(filePathParts)
fileName = QFileInfo(filePath).fileName()
saveFileName, _ = QFileDialog.getSaveFileName(self, None, fileName)
if not saveFileName:
return
qImage.save(saveFileName, self.generateImageFormat)