refactor: settings & language

This commit is contained in:
2023-09-08 01:01:21 +08:00
parent 7bc8780cb0
commit 06ac59091f
23 changed files with 990 additions and 533 deletions

View File

@ -8,6 +8,7 @@ from PySide6.QtGui import QShowEvent
from PySide6.QtWidgets import QWidget
from ui.designer.components.chartSelector_ui import Ui_ChartSelector
from ui.extends.shared.language import LanguageChangeEventFilter
logger = logging.getLogger(__name__)
@ -20,6 +21,9 @@ class ChartSelector(Ui_ChartSelector, QWidget):
self.db = Database()
self.setupUi(self)
self.languageChangeEventFilter = LanguageChangeEventFilter(self)
self.installEventFilter(self.languageChangeEventFilter)
self.valueChanged.connect(self.updateResultLabel)
self.songIdSelector.valueChanged.connect(self.updateRatingClassEnabled)

View File

@ -2,6 +2,7 @@ from PySide6.QtCore import QDir, QFileInfo, QMetaObject, Qt, Signal, Slot
from PySide6.QtWidgets import QFileDialog, QWidget
from ui.designer.components.fileSelector_ui import Ui_FileSelector
from ui.extends.shared.language import LanguageChangeEventFilter
class FileSelector(Ui_FileSelector, QWidget):
@ -13,6 +14,9 @@ class FileSelector(Ui_FileSelector, QWidget):
self.setupUi(self)
self.reset()
self.languageChangeEventFilter = LanguageChangeEventFilter(self)
self.installEventFilter(self.languageChangeEventFilter)
self.elidedLabel.setElideMode(Qt.TextElideMode.ElideMiddle)
self.accepted.connect(self.filesSelected)

View File

@ -12,12 +12,17 @@ from ui.extends.components.ocrQueue import (
OcrQueueTableProxyModel,
OcrScoreDelegate,
)
from ui.extends.shared.language import LanguageChangeEventFilter
class OcrQueue(Ui_OcrQueue, QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
self.languageChangeEventFilter = LanguageChangeEventFilter(self)
self.installEventFilter(self.languageChangeEventFilter)
self.__model: Optional[OcrQueueModel] = None
self.__tableProxyModel: Optional[OcrQueueTableProxyModel] = None

View File

@ -15,6 +15,7 @@ from PySide6.QtWidgets import (
)
from ui.designer.components.scoreEditor_ui import Ui_ScoreEditor
from ui.extends.shared.language import LanguageChangeEventFilter
class ScoreValidateResult(IntEnum):
@ -33,6 +34,9 @@ class ScoreEditor(Ui_ScoreEditor, QWidget):
super().__init__(parent)
self.setupUi(self)
self.languageChangeEventFilter = LanguageChangeEventFilter(self)
self.installEventFilter(self.languageChangeEventFilter)
self.__validateBeforeAccept = True
self.__chart = None
self.__score_id = None

View File

@ -11,6 +11,7 @@ from PySide6.QtWidgets import QCompleter, QWidget
from ui.designer.components.songIdSelector_ui import Ui_SongIdSelector
from ui.extends.components.songIdSelector import SearchCompleterModel
from ui.extends.shared.delegates.descriptionDelegate import DescriptionDelegate
from ui.extends.shared.language import LanguageChangeEventFilter
logger = logging.getLogger(__name__)
@ -23,6 +24,9 @@ class SongIdSelector(Ui_SongIdSelector, QWidget):
self.db = Database()
self.setupUi(self)
self.languageChangeEventFilter = LanguageChangeEventFilter(self)
self.installEventFilter(self.languageChangeEventFilter)
self.previousPackageButton.clicked.connect(
lambda: self.quickSwitchSelection("previous", "package")
)

View File

@ -1,21 +1,7 @@
from traceback import format_exception
from PySide6.QtWidgets import QMainWindow
from ui.designer.mainwindow_ui import Ui_MainWindow
from ui.implements.tabs.tabOcrEntry import TabOcrEntry
# try:
# import arcaea_offline_ocr
# from ui.implements.tabs.tabOcr import TabOcr
# OCR_ENABLED_FLAG = True
# except Exception as e:
# from ui.implements.tabs.tabOcrDisabled import TabOcrDisabled
# OCR_ENABLED_FLAG = False
# OCR_ERROR_TEXT = "\n".join(format_exception(e))
from ui.extends.shared.language import LanguageChangeEventFilter
class MainWindow(Ui_MainWindow, QMainWindow):
@ -23,16 +9,5 @@ class MainWindow(Ui_MainWindow, QMainWindow):
super().__init__(parent)
self.setupUi(self)
# currentIndex = self.tabWidget.currentIndex()
# ocrTabIndex = self.tabWidget.indexOf(self.tab_ocr)
# self.tabWidget.removeTab(ocrTabIndex)
# self.tab_ocr.deleteLater()
# if OCR_ENABLED_FLAG:
# self.tab_ocr = TabOcr(self.tabWidget)
# else:
# self.tab_ocr = TabOcrDisabled(self.tabWidget)
# self.tab_ocr.contentLabel.setText(OCR_ERROR_TEXT)
# self.tab_ocr = TabOcrEntry(self.tabWidget)
# self.tabWidget.insertTab(ocrTabIndex, self.tab_ocr, "")
# self.tabWidget.setCurrentIndex(currentIndex)
# self.retranslateUi(self)
self.languageChangeEventFilter = LanguageChangeEventFilter(self)
self.installEventFilter(self.languageChangeEventFilter)

View File

@ -0,0 +1,83 @@
from PySide6.QtCore import QCoreApplication
from PySide6.QtWidgets import QLabel, QPushButton
from ui.implements.components.fileSelector import FileSelector
from ui.implements.settings.settingsBaseWidget import SettingsBaseWidget
class SettingsAndreal(SettingsBaseWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
if self.settings.andrealFolder():
self.andrealFolderValueWidget.selectFile(self.settings.andrealFolder())
self.andrealFolderValueWidget.filesSelected.connect(self.setAndrealFolder)
self.andrealFolderResetButton.clicked.connect(self.resetAndrealFolder)
self.insertItem(
"andrealFolder",
self.andrealFolderLabel,
self.andrealFolderValueWidget,
self.andrealFolderResetButton,
)
if self.settings.andrealExecutable():
self.andrealExecutableValueWidget.selectFile(
self.settings.andrealExecutable()
)
self.andrealExecutableValueWidget.filesSelected.connect(
self.setAndrealExecutable
)
self.andrealExecutableResetButton.clicked.connect(self.resetAndrealExecutable)
self.insertItem(
"andrealExecutable",
self.andrealExecutableLabel,
self.andrealExecutableValueWidget,
self.andrealExecutableResetButton,
)
def setAndrealFolder(self):
selectedFile = self.andrealFolderValueWidget.selectedFiles()
if selectedFile and selectedFile[0]:
file = selectedFile[0]
self.settings.setAndrealFolder(file)
def resetAndrealFolder(self):
self.andrealFolderValueWidget.reset()
self.settings.resetAndrealFolder()
def setAndrealExecutable(self):
selectedFile = self.andrealExecutableValueWidget.selectedFiles()
if selectedFile and selectedFile[0]:
file = selectedFile[0]
self.settings.setAndrealExecutable(file)
def resetAndrealExecutable(self):
self.andrealExecutableValueWidget.reset()
self.settings.resetAndrealExecutable()
def setupUi(self, *args):
self.andrealFolderLabel = QLabel(self)
self.andrealFolderValueWidget = FileSelector(self)
self.andrealFolderResetButton = QPushButton(self)
self.andrealExecutableLabel = QLabel(self)
self.andrealExecutableValueWidget = FileSelector(self)
self.andrealExecutableResetButton = QPushButton(self)
super().setupUi(self)
self.retranslateUi()
def retranslateUi(self, *args):
super().retranslateUi(self)
# fmt: off
self.setTitle(QCoreApplication.translate("Settings", "andreal.title"))
self.andrealFolderLabel.setText(QCoreApplication.translate("Settings", "andreal.andrealFolder.label"))
self.andrealFolderResetButton.setText(QCoreApplication.translate("Settings", "resetButton"))
self.andrealExecutableLabel.setText(QCoreApplication.translate("Settings", "andreal.andrealExecutable.label"))
self.andrealExecutableResetButton.setText(QCoreApplication.translate("Settings", "resetButton"))
# fmt: on

View File

@ -0,0 +1,41 @@
from PySide6.QtCore import QCoreApplication, Qt
from PySide6.QtWidgets import QLabel, QPushButton, QWidget
from ui.designer.settings.settingsBaseWidget_ui import Ui_SettingsBaseWidget
from ui.extends.shared.settings import Settings
class SettingsBaseWidget(Ui_SettingsBaseWidget, QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.settings = Settings()
def setTitle(self, title: str):
self.titleLabel.setText(title)
def insertItem(
self,
prefix: str,
label: QLabel,
valueWidget: QWidget,
resetButton: QPushButton | None = None,
):
row = self.gridLayout.rowCount()
label.setObjectName(f"{prefix}Label")
label.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignCenter)
self.gridLayout.addWidget(label, row, 0)
valueWidget.setObjectName(f"{prefix}ValueWidget")
self.gridLayout.addWidget(valueWidget, row, 1)
if resetButton:
resetButton.setObjectName(f"{prefix}ResetButton")
self.gridLayout.addWidget(resetButton, row, 2)
def setupUi(self, widget):
super().setupUi(widget)
self.gridLayout.setColumnStretch(1, 1)
def retranslateUi(self, widget):
super().retranslateUi(widget)

View File

@ -1,98 +0,0 @@
import logging
from PySide6.QtCore import Slot
from PySide6.QtWidgets import QWidget
from ui.designer.settings.settingsDefault_ui import Ui_SettingsDefault
from ui.extends.ocr import load_devices_json
from ui.extends.shared.settings import *
logger = logging.getLogger(__name__)
class SettingsDefault(Ui_SettingsDefault, QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
self.settings = Settings(self)
self.devicesJsonFileSelector.filesSelected.connect(self.fillDevicesComboBox)
self.devicesJsonFileResetButton.clicked.connect(self.resetDevicesJsonFile)
self.deviceUuidResetButton.clicked.connect(self.resetDeviceUuid)
devicesJsonPath = self.settings.devicesJsonFile()
self.devicesJsonFileSelector.selectFile(devicesJsonPath)
tesseractPath = self.settings.tesseractPath()
self.tesseractFileSelector.selectFile(tesseractPath)
self.knnModelFileSelector.selectFile(self.settings.knnModelFile())
self.siftDatabaseFileSelector.selectFile(self.settings.siftDatabaseFile())
self.devicesJsonFileSelector.accepted.connect(
self.on_devicesJsonFileSelector_accepted
)
self.tesseractFileSelector.accepted.connect(
self.on_tesseractFileSelector_accepted
)
self.knnModelFileSelector.accepted.connect(
self.on_knnModelFileSelector_accepted
)
self.siftDatabaseFileSelector.accepted.connect(
self.on_siftDatabaseFileSelector_accepted
)
def setDevicesJsonFile(self):
try:
filename = self.devicesJsonFileSelector.selectedFiles()[0]
devices = load_devices_json(filename)
assert isinstance(devices, list)
self.settings.setDevicesJsonFile(filename)
except Exception as e:
logger.exception("set deviceJsonFile error")
# QMessageBox
return
def resetDevicesJsonFile(self):
self.devicesJsonFileSelector.reset()
self.settings.resetDevicesJsonFile()
def on_devicesJsonFileSelector_accepted(self):
self.setDevicesJsonFile()
def fillDevicesComboBox(self):
devicesJsonPath = self.devicesJsonFileSelector.selectedFiles()[0]
self.devicesComboBox.loadDevicesJson(devicesJsonPath)
storedDeviceUuid = self.settings.deviceUuid()
self.devicesComboBox.selectDevice(storedDeviceUuid)
@Slot()
def on_devicesComboBox_activated(self):
device = self.devicesComboBox.currentData()
if device:
self.settings.setDeviceUuid(device.uuid)
def resetDeviceUuid(self):
self.devicesComboBox.setCurrentIndex(-1)
self.settings.resetDeviceUuid()
def setTesseractFile(self):
file = self.tesseractFileSelector.selectedFiles()[0]
self.settings.setTesseractPath(file)
def on_tesseractFileSelector_accepted(self):
self.setTesseractFile()
def setKnnModelFile(self):
file = self.knnModelFileSelector.selectedFiles()[0]
self.settings.setKnnModelFile(file)
def on_knnModelFileSelector_accepted(self):
self.setKnnModelFile()
def setSiftDatabaseFile(self):
file = self.siftDatabaseFileSelector.selectedFiles()[0]
self.settings.setSiftDatabaseFile(file)
def on_siftDatabaseFileSelector_accepted(self):
self.setSiftDatabaseFile()

View File

@ -0,0 +1,106 @@
import sys
from PySide6.QtCore import QCoreApplication, QDir, QLocale, QProcess
from PySide6.QtWidgets import (
QApplication,
QCheckBox,
QComboBox,
QLabel,
QMessageBox,
QPushButton,
)
from ui.extends.shared.language import changeAppLanguage, localeToCode, localeToFullName
from ui.extends.shared.settings import DATABASE_URL, LANGUAGE
from ui.implements.settings.settingsBaseWidget import SettingsBaseWidget
class SettingsGeneral(SettingsBaseWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
availableLanguageFiles = QDir(":/lang").entryInfoList(QDir.Filter.Files)
for fileInfo in availableLanguageFiles:
languageCode = fileInfo.baseName()
locale = QLocale(languageCode)
self.languageValueWidget.addItem(localeToFullName(locale), locale)
self.languageValueWidget.setCurrentIndex(-1)
self.languageValueWidget.currentIndexChanged.connect(self.changeLanguage)
self.languageFollowSystemCheckBox.toggled.connect(
self.changeLanguageFollowSystem
)
if self.settings.language():
locale = QLocale(self.settings.language())
index = self.languageValueWidget.findData(locale)
if index > -1:
self.languageValueWidget.setCurrentIndex(index)
else:
self.languageFollowSystemCheckBox.setChecked(True)
self.insertItem("language", self.languageLabel, self.languageValueWidget)
self.gridLayout.addWidget(
self.languageFollowSystemCheckBox,
self.gridLayout.rowCount() - 1,
self.gridLayout.columnCount(),
)
self.dbUrlResetButton.clicked.connect(self.resetDbUrl)
self.insertItem(
"dbUrl",
self.dbUrlLabel,
QLabel(self.settings.databaseUrl()),
self.dbUrlResetButton,
)
def changeLanguage(self):
locale = self.languageValueWidget.currentData()
if locale:
changeAppLanguage(locale)
self.settings.setLanguage(localeToCode(locale))
def changeLanguageFollowSystem(self):
followSystem = self.languageFollowSystemCheckBox.isChecked()
self.languageValueWidget.setCurrentIndex(-1)
if followSystem:
self.settings.remove(LANGUAGE)
changeAppLanguage(QLocale.system())
self.languageValueWidget.setEnabled(False)
else:
self.languageValueWidget.setEnabled(True)
def resetDbUrl(self):
userConfirm = QMessageBox.warning(
self,
None,
QCoreApplication.translate("Settings", "general.dbUrlResetWarning"),
QMessageBox.StandardButton.Yes,
QMessageBox.StandardButton.No,
)
if userConfirm == QMessageBox.StandardButton.Yes:
self.settings.remove(DATABASE_URL)
QApplication.instance().quit()
def setupUi(self, *args):
self.languageLabel = QLabel(self)
self.languageValueWidget = QComboBox(self)
self.languageFollowSystemCheckBox = QCheckBox(self)
self.dbUrlLabel = QLabel(self)
self.dbUrlResetButton = QPushButton(self)
super().setupUi(self)
self.retranslateUi()
def retranslateUi(self, *args):
super().retranslateUi(self)
# fmt: off
self.setTitle(QCoreApplication.translate("Settings", "general.title"))
self.languageLabel.setText(QCoreApplication.translate("Settings", "general.language.label"))
self.languageFollowSystemCheckBox.setText(QCoreApplication.translate("Settings", "general.language.followSystem"))
self.dbUrlLabel.setText(QCoreApplication.translate("Settings", "general.dbUrl.label"))
self.dbUrlResetButton.setText(QCoreApplication.translate("Settings", "resetButton"))
# fmt: on

View File

@ -0,0 +1,147 @@
from PySide6.QtCore import QCoreApplication
from PySide6.QtWidgets import QLabel, QPushButton
from ui.implements.components.devicesComboBox import DevicesComboBox
from ui.implements.components.fileSelector import FileSelector
from ui.implements.settings.settingsBaseWidget import SettingsBaseWidget
class SettingsOcr(SettingsBaseWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
if self.settings.devicesJsonFile():
self.devicesJsonValueWidget.selectFile(self.settings.devicesJsonFile())
self.devicesJsonValueWidget.filesSelected.connect(self.setDevicesJson)
self.devicesJsonResetButton.clicked.connect(self.resetDevicesJson)
self.insertItem(
"devicesJson",
self.devicesJsonLabel,
self.devicesJsonValueWidget,
self.devicesJsonResetButton,
)
if self.settings.deviceUuid():
self.deviceUuidValueWidget.selectDevice(self.settings.deviceUuid())
self.deviceUuidValueWidget.activated.connect(self.setDeviceUuid)
self.deviceUuidResetButton.clicked.connect(self.resetDeviceUuid)
self.insertItem(
"deviceUuid",
self.deviceUuidLabel,
self.deviceUuidValueWidget,
self.deviceUuidResetButton,
)
if self.settings.knnModelFile():
self.knnModelFileValueWidget.selectFile(self.settings.knnModelFile())
self.knnModelFileValueWidget.filesSelected.connect(self.setKnnModelFile)
self.knnModelFileResetButton.clicked.connect(self.resetKnnModelFile)
self.insertItem(
"knnModelFile",
self.knnModelFileLabel,
self.knnModelFileValueWidget,
self.knnModelFileResetButton,
)
if self.settings.siftDatabaseFile():
self.siftDatabaseFileValueWidget.selectFile(
self.settings.siftDatabaseFile()
)
self.siftDatabaseFileValueWidget.filesSelected.connect(self.setSiftDatabaseFile)
self.siftDatabaseFileResetButton.clicked.connect(self.resetSiftDatabaseFile)
self.insertItem(
"siftDatabaseFile",
self.siftDatabaseFileLabel,
self.siftDatabaseFileValueWidget,
self.siftDatabaseFileResetButton,
)
def setDevicesJson(self):
selectedFile = self.devicesJsonValueWidget.selectedFiles()
if selectedFile and selectedFile[0]:
file = selectedFile[0]
self.settings.setDevicesJsonFile(file)
self.fillDeviceUuidComboBox()
def fillDeviceUuidComboBox(self):
devicesJsonPath = self.devicesJsonValueWidget.selectedFiles()[0]
self.deviceUuidValueWidget.loadDevicesJson(devicesJsonPath)
storedDeviceUuid = self.settings.deviceUuid()
self.deviceUuidValueWidget.selectDevice(storedDeviceUuid)
def resetDevicesJson(self):
self.deviceUuidValueWidget.clear()
self.devicesJsonValueWidget.reset()
self.settings.resetDeviceUuid()
self.settings.resetDevicesJsonFile()
def setDeviceUuid(self):
device = self.deviceUuidValueWidget.currentData()
if device:
self.settings.setDeviceUuid(device.uuid)
def resetDeviceUuid(self):
self.deviceUuidValueWidget.setCurrentIndex(-1)
self.settings.resetDeviceUuid()
def setKnnModelFile(self):
selectedFile = self.knnModelFileValueWidget.selectedFiles()
if selectedFile and selectedFile[0]:
file = selectedFile[0]
self.settings.setKnnModelFile(file)
def resetKnnModelFile(self):
self.knnModelFileValueWidget.reset()
self.settings.resetKnnModelFile()
def setSiftDatabaseFile(self):
selectedFile = self.siftDatabaseFileValueWidget.selectedFiles()
if selectedFile and selectedFile[0]:
file = selectedFile[0]
self.settings.setSiftDatabaseFile(file)
def resetSiftDatabaseFile(self):
self.siftDatabaseFileValueWidget.reset()
self.settings.resetSiftDatabaseFile()
def setupUi(self, *args):
self.devicesJsonLabel = QLabel(self)
self.devicesJsonValueWidget = FileSelector(self)
self.devicesJsonResetButton = QPushButton(self)
self.deviceUuidLabel = QLabel(self)
self.deviceUuidValueWidget = DevicesComboBox(self)
self.deviceUuidResetButton = QPushButton(self)
self.knnModelFileLabel = QLabel(self)
self.knnModelFileValueWidget = FileSelector(self)
self.knnModelFileResetButton = QPushButton(self)
self.siftDatabaseFileLabel = QLabel(self)
self.siftDatabaseFileValueWidget = FileSelector(self)
self.siftDatabaseFileResetButton = QPushButton(self)
super().setupUi(self)
self.retranslateUi()
def retranslateUi(self, *args):
super().retranslateUi(self)
# fmt: off
self.setTitle(QCoreApplication.translate("Settings", "ocr.title"))
self.devicesJsonLabel.setText(QCoreApplication.translate("Settings", "ocr.devicesJson.label"))
self.devicesJsonResetButton.setText(QCoreApplication.translate("Settings", "resetButton"))
self.deviceUuidLabel.setText(QCoreApplication.translate("Settings", "ocr.deviceUuid.label"))
self.deviceUuidResetButton.setText(QCoreApplication.translate("Settings", "resetButton"))
self.knnModelFileLabel.setText(QCoreApplication.translate("Settings", "ocr.knnModelFile.label"))
self.knnModelFileResetButton.setText(QCoreApplication.translate("Settings", "resetButton"))
self.siftDatabaseFileLabel.setText(QCoreApplication.translate("Settings", "ocr.siftDatabaseFile.label"))
self.siftDatabaseFileResetButton.setText(QCoreApplication.translate("Settings", "resetButton"))
# fmt: on

View File

@ -1,11 +1,21 @@
from PySide6.QtCore import QModelIndex, Slot
from PySide6.QtCore import QCoreApplication, Slot
from PySide6.QtWidgets import QListWidgetItem, QWidget
from ui.designer.tabs.tabSettings_ui import Ui_TabSettings
from ui.extends.shared.language import LanguageChangeEventFilter
from ui.implements.settings.settingsAndreal import SettingsAndreal
from ui.implements.settings.settingsGeneral import SettingsGeneral
from ui.implements.settings.settingsOcr import SettingsOcr
class SettingsEntryItem(QListWidgetItem):
pass
class SettingsLabelItem(QListWidgetItem):
def __init__(self, translatorKey: str):
super().__init__()
self.translatorKey = translatorKey
self.retranslateUi()
def retranslateUi(self):
self.setText(QCoreApplication.translate("Settings", self.translatorKey))
class TabSettings(Ui_TabSettings, QWidget):
@ -13,11 +23,42 @@ class TabSettings(Ui_TabSettings, QWidget):
super().__init__(parent)
self.setupUi(self)
self.listWidget.addItem("Default")
self.listWidget.activated.connect(self.switchPage)
self.languageChangeEventFilter = LanguageChangeEventFilter(self)
self.installEventFilter(self.languageChangeEventFilter)
self.listWidget.itemClicked.connect(self.switchPage)
self.listWidget.addItem(self.settingsGeneralLabel)
self.stackedWidget.addWidget(self.settingsGeneral)
self.listWidget.addItem(self.settingsOcrLabel)
self.stackedWidget.addWidget(self.settingsOcr)
self.listWidget.addItem(self.settingsAndrealLabel)
self.stackedWidget.addWidget(self.settingsAndreal)
self.listWidget.setCurrentRow(self.stackedWidget.currentIndex())
@Slot(QModelIndex)
def switchPage(self, index: QModelIndex):
self.stackedWidget.setCurrentIndex(index.row())
@Slot(QListWidgetItem)
def switchPage(self, item: QListWidgetItem):
item.setSelected(True)
self.stackedWidget.setCurrentIndex(self.listWidget.indexFromItem(item).row())
def setupUi(self, *args):
self.settingsGeneralLabel = SettingsLabelItem("general.title")
self.settingsGeneral = SettingsGeneral(self)
self.settingsOcrLabel = SettingsLabelItem("ocr.title")
self.settingsOcr = SettingsOcr(self)
self.settingsAndrealLabel = SettingsLabelItem("andreal.title")
self.settingsAndreal = SettingsAndreal(self)
super().setupUi(self)
def retranslateUi(self, *args):
super().retranslateUi(self)
self.settingsGeneralLabel.retranslateUi()
self.settingsGeneral.retranslateUi()
self.settingsOcrLabel.retranslateUi()
self.settingsOcr.retranslateUi()
self.settingsAndrealLabel.retranslateUi()
self.settingsAndreal.retranslateUi()