feat: TabTools_Andreal

This commit is contained in:
283375 2023-09-21 23:02:02 +08:00
parent 44915f6d19
commit d29104744d
Signed by: 283375
SSH Key Fingerprint: SHA256:UcX0qg6ZOSDOeieKPGokA5h7soykG61nz2uxuQgVLSk
6 changed files with 514 additions and 283 deletions

View File

@ -62,7 +62,7 @@
<item>
<widget class="QRadioButton" name="imageType_infoRadioButton">
<property name="text">
<string>/a</string>
<string notr="true">/a</string>
</property>
<property name="checked">
<bool>true</bool>
@ -72,14 +72,14 @@
<item>
<widget class="QRadioButton" name="imageType_best30RadioButton">
<property name="text">
<string>/a b30</string>
<string notr="true">/a b30</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="imageType_bestRadioButton">
<property name="text">
<string>/a info</string>
<string notr="true">/a info</string>
</property>
</widget>
</item>
@ -113,6 +113,47 @@
</property>
</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>
<item row="4" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
@ -137,6 +178,47 @@
</property>
</widget>
</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="6" column="0">
<widget class="QLabel" name="jpgQualityFormLabel">
<property name="text">
@ -144,6 +226,53 @@
</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="7" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
@ -200,158 +329,6 @@
</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>

View File

@ -62,17 +62,20 @@ class Ui_TabTools_Andreal(object):
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.imageType_infoRadioButton = QRadioButton(self.horizontalWidget)
self.imageType_infoRadioButton.setObjectName(u"imageType_infoRadioButton")
self.imageType_infoRadioButton.setText(u"/a")
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.imageType_best30RadioButton.setText(u"/a b30")
self.horizontalLayout.addWidget(self.imageType_best30RadioButton)
self.imageType_bestRadioButton = QRadioButton(self.horizontalWidget)
self.imageType_bestRadioButton.setObjectName(u"imageType_bestRadioButton")
self.imageType_bestRadioButton.setText(u"/a info")
self.horizontalLayout.addWidget(self.imageType_bestRadioButton)
@ -93,6 +96,27 @@ class Ui_TabTools_Andreal(object):
self.formLayout.setWidget(3, QFormLayout.LabelRole, self.chartFormLabel)
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.label_5 = QLabel(TabTools_Andreal)
self.label_5.setObjectName(u"label_5")
@ -109,11 +133,62 @@ class Ui_TabTools_Andreal(object):
self.formLayout.setWidget(5, QFormLayout.LabelRole, self.label_6)
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.jpgQualityFormLabel = QLabel(TabTools_Andreal)
self.jpgQualityFormLabel.setObjectName(u"jpgQualityFormLabel")
self.formLayout.setWidget(6, QFormLayout.LabelRole, self.jpgQualityFormLabel)
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.horizontalLayout_5 = QHBoxLayout()
self.horizontalLayout_5.setObjectName(u"horizontalLayout_5")
self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
@ -145,95 +220,6 @@ class Ui_TabTools_Andreal(object):
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)
@ -246,19 +232,15 @@ class Ui_TabTools_Andreal(object):
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.chartSelectButton.setText(QCoreApplication.translate("TabTools_Andreal", u"chart.selectButton", 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

@ -74,6 +74,9 @@ class AndrealHelper(QObject):
return base64.b64decode(b64result)
def request(self, jsonPath: str, arguments: list[str]):
logger.debug(
f"{self.__class__.__name__} received request {jsonPath=} {arguments=}"
)
runnable = AndrealExecuteRunnable(self.andrealExecutable, jsonPath, arguments)
runnable.signals.error.connect(self.error)
runnable.signals.completed.connect(self.ready)

View File

@ -7,10 +7,18 @@ 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 PySide6.QtCore import QCoreApplication, QDir, QFileInfo, Qt, Slot
from PySide6.QtGui import QGuiApplication, QImage, QPainter, QPaintEvent, QPixmap
from PySide6.QtWidgets import (
QButtonGroup,
QDialog,
QDialogButtonBox,
QFileDialog,
QLabel,
QMessageBox,
QVBoxLayout,
QWidget,
)
from ui.designer.tabs.tabTools.tabTools_Andreal_ui import Ui_TabTools_Andreal
from ui.extends.shared.settings import ANDREAL_EXECUTABLE, ANDREAL_FOLDER
@ -22,7 +30,36 @@ logger = logging.getLogger(__name__)
class PreviewLabel(QLabel):
...
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowFlag(Qt.WindowType.Window, True)
def show(self):
super().show()
# center the window
width = self.width()
height = self.height()
screen = QGuiApplication.primaryScreen()
screenWidth = screen.size().width()
screenHeight = screen.size().height()
self.setGeometry(
max(0, screenWidth / 2 - width / 2),
max(0, screenHeight / 2 - height / 2),
min(width, screenWidth),
min(height, screenHeight),
)
def paintEvent(self, e: QPaintEvent) -> None:
size = self.size()
painter = QPainter(self)
scaledPixmap = self.pixmap().scaled(
size,
Qt.AspectRatioMode.KeepAspectRatio,
Qt.TransformationMode.SmoothTransformation,
)
x = (size.width() - scaledPixmap.width()) / 2
y = (size.height() - scaledPixmap.height()) / 2
painter.drawPixmap(x, y, scaledPixmap)
class ChartSelectorDialog(ChartSelector):
@ -32,6 +69,27 @@ class ChartSelectorDialog(ChartSelector):
self.setSongIdSelectorMode(SongIdSelectorMode.Chart)
class ImageTypeWhatIsThisDialog(QDialog):
def __init__(self, parent=None):
super().__init__(parent)
self.verticalLayout = QVBoxLayout(self)
self.label = QLabel(
# fmt: off
QCoreApplication.translate('TabTools_Andreal', 'imageWhatIsThisDialog.description')
# fmt: on
)
self.verticalLayout.addWidget(self.label)
self.buttonBox = QDialogButtonBox(Qt.Orientation.Horizontal)
self.buttonBox.addButton(QDialogButtonBox.StandardButton.Ok)
self.buttonBox.accepted.connect(self.close)
self.buttonBox.rejected.connect(self.close)
self.verticalLayout.addWidget(self.buttonBox)
class TabTools_Andreal(Ui_TabTools_Andreal, QWidget):
def __init__(self, parent=None):
super().__init__(parent)
@ -51,6 +109,7 @@ class TabTools_Andreal(Ui_TabTools_Andreal, QWidget):
self.andrealFolderSelector.connectSettings(ANDREAL_FOLDER)
self.andrealExecutableSelector.connectSettings(ANDREAL_EXECUTABLE)
self.generatePreviewButton.clicked.connect(self.requestPreview)
self.generateImageButton.clicked.connect(self.requestGenerate)
self.infoChart: Chart | None = None
@ -59,10 +118,17 @@ class TabTools_Andreal(Ui_TabTools_Andreal, QWidget):
self.generateJsonPath = None
self.generateImageFormat = None
self.andrealHelper.error.connect(self.previewError)
self.andrealHelper.ready.connect(self.previewReady)
self.andrealHelper.finished.connect(self.previewFinished)
self.andrealHelper.error.connect(self.generateError)
self.andrealHelper.ready.connect(self.generateReady)
self.andrealHelper.finished.connect(self.generateFinished)
self.imageTypeWhatIsThisButton.clicked.connect(
lambda: ImageTypeWhatIsThisDialog(self).show()
)
self.imageTypeButtonGroup = QButtonGroup(self)
self.imageTypeButtonGroup.addButton(self.imageType_infoRadioButton, 0)
self.imageTypeButtonGroup.addButton(self.imageType_bestRadioButton, 1)
@ -75,12 +141,24 @@ class TabTools_Andreal(Ui_TabTools_Andreal, QWidget):
self.imageTypeButtonGroup.idToggled.connect(self.fillImageVersionComboBox)
self.fillImageVersionComboBox()
self.chartSelectorDialog = ChartSelectorDialog(self)
self.chartSelectorDialog.valueChanged.connect(self.chartValueUpdated)
self.chartSelectButton.clicked.connect(self.chartSelectorDialog.show)
def setHelperPaths(self):
if selectedFiles := self.andrealFolderSelector.selectedFiles():
self.andrealHelper.andrealFolder = selectedFiles[0]
if selectedFiles := self.andrealExecutableSelector.selectedFiles():
self.andrealHelper.andrealExecutable = selectedFiles[0]
def chartValueUpdated(self):
chart = self.chartSelectorDialog.value()
self.infoChart = chart
if chart:
self.chartSelectLabel.setText(
f"{chart.title}({chart.song_id}), {chart.rating_class}"
)
def imageFormat(self):
buttonId = self.imageFormatButtonGroup.checkedId()
return ["jpg", "png"][buttonId] if buttonId > -1 else None
@ -146,6 +224,7 @@ class TabTools_Andreal(Ui_TabTools_Andreal, QWidget):
return
jsonContentDict = {}
try:
with self.db.sessionmaker() as session:
converter = AndrealImageGeneratorApiDataConverter(session)
if imageType == "info":
@ -156,7 +235,12 @@ class TabTools_Andreal(Ui_TabTools_Andreal, QWidget):
)
elif imageType == "best30":
jsonContentDict = converter.user_best30()
return json.dumps(jsonContentDict, ensure_ascii=False)
except Exception as e:
logger.exception("getAndrealJsonContent error")
QMessageBox.critical(self, None, str(e))
return (
json.dumps(jsonContentDict, ensure_ascii=False) if jsonContentDict else None
)
def getAndrealJsonFileName(self):
if not self.requestComplete():
@ -167,12 +251,7 @@ class TabTools_Andreal(Ui_TabTools_Andreal, QWidget):
fileNameParts = ["andreal", imageType]
if imageType == "best":
fileNameParts.extend(
[
self.infoChart.song_id,
rating_class_to_short_text(self.infoChart.rating_class).lower(),
]
)
fileNameParts.extend([self.infoChart.song_id, self.infoChart.rating_class])
fileNameParts.append(timestamp)
fileNameParts = [str(i) for i in fileNameParts]
fileName = "-".join(fileNameParts)
@ -199,14 +278,15 @@ class TabTools_Andreal(Ui_TabTools_Andreal, QWidget):
def requestGenerate(self):
jsonPath = self.getTempAndrealJsonPath()
if not jsonPath:
jsonContent = self.getAndrealJsonContent()
if not jsonPath or not jsonContent:
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())
jf.write(jsonContent)
self.andrealHelper.request(jsonPath, self.getAndrealArguments(jsonPath))
@ -237,3 +317,46 @@ class TabTools_Andreal(Ui_TabTools_Andreal, QWidget):
if not saveFileName:
return
qImage.save(saveFileName, self.generateImageFormat)
def requestPreview(self):
jsonPath = self.getTempAndrealJsonPath()
jsonContent = self.getAndrealJsonContent()
if not jsonPath or not jsonContent:
return
self.generatePreviewButton.setEnabled(False)
self.previewJsonPath = jsonPath
with open(jsonPath, "w", encoding="utf-8") as jf:
jf.write(jsonContent)
self.andrealHelper.request(
jsonPath, self.getAndrealArguments(jsonPath, preview=True)
)
def previewFinished(self):
self.generatePreviewButton.setEnabled(True)
def previewError(self, jsonPath: str, errorMsg: str):
if jsonPath != self.previewJsonPath:
return
QMessageBox.critical(self, "Preview Error", errorMsg)
def previewReady(self, jsonPath: str, imageBytes: bytes):
if jsonPath != self.previewJsonPath:
return
if not imageBytes:
QMessageBox.critical(self, "Preview Error", "Empty bytes received.")
return
qImage = QImage.fromData(imageBytes)
filePathParts = jsonPath.split(".")
filePathParts.pop()
filePath = ".".join(filePathParts)
fileName = QFileInfo(filePath).fileName()
previewLabel = PreviewLabel(self)
previewLabel.setPixmap(QPixmap.fromImage(qImage))
previewLabel.setWindowTitle(f"preview {fileName}")
previewLabel.show()

View File

@ -464,18 +464,18 @@ validation</translation>
<context>
<name>Settings</name>
<message>
<location filename="../../implements/settings/settingsAndreal.py" line="76"/>
<location filename="../../implements/settings/settingsAndreal.py" line="79"/>
<source>andreal.title</source>
<translation>Andreal</translation>
</message>
<message>
<location filename="../../implements/settings/settingsAndreal.py" line="78"/>
<location filename="../../implements/settings/settingsAndreal.py" line="81"/>
<source>andreal.andrealFolder.label</source>
<translation>Andreal folder</translation>
<translation>Andreal data folder</translation>
</message>
<message>
<location filename="../../implements/settings/settingsAndreal.py" line="79"/>
<location filename="../../implements/settings/settingsAndreal.py" line="82"/>
<location filename="../../implements/settings/settingsAndreal.py" line="85"/>
<location filename="../../implements/settings/settingsGeneral.py" line="107"/>
<location filename="../../implements/settings/settingsOcr.py" line="137"/>
<location filename="../../implements/settings/settingsOcr.py" line="140"/>
@ -485,7 +485,7 @@ validation</translation>
<translation>Reset</translation>
</message>
<message>
<location filename="../../implements/settings/settingsAndreal.py" line="81"/>
<location filename="../../implements/settings/settingsAndreal.py" line="84"/>
<source>andreal.andrealExecutable.label</source>
<translation>Andreal executable</translation>
</message>
@ -762,6 +762,79 @@ validation</translation>
<source>tab.stepCalculator</source>
<translation>Step Calculator</translation>
</message>
<message>
<location filename="../../designer/tabs/tabToolsEntry.ui" line="34"/>
<source>tab.andreal</source>
<translation>Andreal Image Generator</translation>
</message>
</context>
<context>
<name>TabTools_Andreal</name>
<message>
<location filename="../../designer/tabs/tabTools/tabTools_Andreal.ui" line="23"/>
<source>andrealFolder</source>
<translation>Andreal data folder</translation>
</message>
<message>
<location filename="../../designer/tabs/tabTools/tabTools_Andreal.ui" line="33"/>
<source>andrealExecutable</source>
<translation>Andreal executable</translation>
</message>
<message>
<location filename="../../designer/tabs/tabTools/tabTools_Andreal.ui" line="43"/>
<source>imageType</source>
<translation>Image type</translation>
</message>
<message>
<location filename="../../designer/tabs/tabTools/tabTools_Andreal.ui" line="102"/>
<source>imageTypeWhatIsThisButton</source>
<translation>What is /a?</translation>
</message>
<message>
<location filename="../../designer/tabs/tabTools/tabTools_Andreal.ui" line="112"/>
<source>chart</source>
<translation>Select a Chart</translation>
</message>
<message>
<location filename="../../designer/tabs/tabTools/tabTools_Andreal.ui" line="143"/>
<source>chart.selectButton</source>
<translation>Select...</translation>
</message>
<message>
<location filename="../../designer/tabs/tabTools/tabTools_Andreal.ui" line="160"/>
<source>imageVersion</source>
<translation>Image version</translation>
</message>
<message>
<location filename="../../designer/tabs/tabTools/tabTools_Andreal.ui" line="177"/>
<source>imageFormat</source>
<translation>Image format</translation>
</message>
<message>
<location filename="../../designer/tabs/tabTools/tabTools_Andreal.ui" line="225"/>
<source>jpgQuality</source>
<translation>JPG quality</translation>
</message>
<message>
<location filename="../../designer/tabs/tabTools/tabTools_Andreal.ui" line="294"/>
<source>exportJsonButton</source>
<translation>Export Request Data to JSON</translation>
</message>
<message>
<location filename="../../designer/tabs/tabTools/tabTools_Andreal.ui" line="301"/>
<source>generatePreviewButton</source>
<translation>Generate Preview</translation>
</message>
<message>
<location filename="../../designer/tabs/tabTools/tabTools_Andreal.ui" line="313"/>
<source>generateImageButton</source>
<translation>Generate</translation>
</message>
<message>
<location filename="../../implements/tabs/tabTools/tabTools_Andreal.py" line="81"/>
<source>imageWhatIsThisDialog.description</source>
<translation>Generate image of...&lt;ul&gt;&lt;li&gt;/a - the most recent score&lt;/li&gt;&lt;li&gt;/a b30 - best30 image&lt;/li&gt;&lt;li&gt;/a info - best score of the selected chart&lt;/li&gt;&lt;/ul&gt;</translation>
</message>
</context>
<context>
<name>TabTools_InfoLookup</name>

View File

@ -463,18 +463,18 @@
<context>
<name>Settings</name>
<message>
<location filename="../../implements/settings/settingsAndreal.py" line="76"/>
<location filename="../../implements/settings/settingsAndreal.py" line="79"/>
<source>andreal.title</source>
<translation>Andreal</translation>
</message>
<message>
<location filename="../../implements/settings/settingsAndreal.py" line="78"/>
<location filename="../../implements/settings/settingsAndreal.py" line="81"/>
<source>andreal.andrealFolder.label</source>
<translation>Andreal </translation>
<translation>Andreal </translation>
</message>
<message>
<location filename="../../implements/settings/settingsAndreal.py" line="79"/>
<location filename="../../implements/settings/settingsAndreal.py" line="82"/>
<location filename="../../implements/settings/settingsAndreal.py" line="85"/>
<location filename="../../implements/settings/settingsGeneral.py" line="107"/>
<location filename="../../implements/settings/settingsOcr.py" line="137"/>
<location filename="../../implements/settings/settingsOcr.py" line="140"/>
@ -484,7 +484,7 @@
<translation></translation>
</message>
<message>
<location filename="../../implements/settings/settingsAndreal.py" line="81"/>
<location filename="../../implements/settings/settingsAndreal.py" line="84"/>
<source>andreal.andrealExecutable.label</source>
<translation>Andreal </translation>
</message>
@ -761,6 +761,79 @@
<source>tab.stepCalculator</source>
<translation></translation>
</message>
<message>
<location filename="../../designer/tabs/tabToolsEntry.ui" line="34"/>
<source>tab.andreal</source>
<translation>Andreal </translation>
</message>
</context>
<context>
<name>TabTools_Andreal</name>
<message>
<location filename="../../designer/tabs/tabTools/tabTools_Andreal.ui" line="23"/>
<source>andrealFolder</source>
<translation>Andreal </translation>
</message>
<message>
<location filename="../../designer/tabs/tabTools/tabTools_Andreal.ui" line="33"/>
<source>andrealExecutable</source>
<translation>Andreal </translation>
</message>
<message>
<location filename="../../designer/tabs/tabTools/tabTools_Andreal.ui" line="43"/>
<source>imageType</source>
<translation></translation>
</message>
<message>
<location filename="../../designer/tabs/tabTools/tabTools_Andreal.ui" line="102"/>
<source>imageTypeWhatIsThisButton</source>
<translation>/a </translation>
</message>
<message>
<location filename="../../designer/tabs/tabTools/tabTools_Andreal.ui" line="112"/>
<source>chart</source>
<translation></translation>
</message>
<message>
<location filename="../../designer/tabs/tabTools/tabTools_Andreal.ui" line="143"/>
<source>chart.selectButton</source>
<translation></translation>
</message>
<message>
<location filename="../../designer/tabs/tabTools/tabTools_Andreal.ui" line="160"/>
<source>imageVersion</source>
<translation></translation>
</message>
<message>
<location filename="../../designer/tabs/tabTools/tabTools_Andreal.ui" line="177"/>
<source>imageFormat</source>
<translation></translation>
</message>
<message>
<location filename="../../designer/tabs/tabTools/tabTools_Andreal.ui" line="225"/>
<source>jpgQuality</source>
<translation>JPG </translation>
</message>
<message>
<location filename="../../designer/tabs/tabTools/tabTools_Andreal.ui" line="294"/>
<source>exportJsonButton</source>
<translation> JSON</translation>
</message>
<message>
<location filename="../../designer/tabs/tabTools/tabTools_Andreal.ui" line="301"/>
<source>generatePreviewButton</source>
<translation></translation>
</message>
<message>
<location filename="../../designer/tabs/tabTools/tabTools_Andreal.ui" line="313"/>
<source>generateImageButton</source>
<translation></translation>
</message>
<message>
<location filename="../../implements/tabs/tabTools/tabTools_Andreal.py" line="81"/>
<source>imageWhatIsThisDialog.description</source>
<translation>&lt;ul&gt;&lt;li&gt;/a - &lt;/li&gt;&lt;li&gt;/a b30 - /a b30&lt;/li&gt;&lt;li&gt;/a info - &lt;/li&gt;&lt;/ul&gt;</translation>
</message>
</context>
<context>
<name>TabTools_InfoLookup</name>