diff --git a/ui/implements/components/fileSelector.py b/ui/implements/components/fileSelector.py index 8dd1f6f..69cd5da 100644 --- a/ui/implements/components/fileSelector.py +++ b/ui/implements/components/fileSelector.py @@ -1,8 +1,9 @@ -from PySide6.QtCore import QDir, QFileInfo, QMetaObject, Qt, Signal, Slot +from PySide6.QtCore import QDir, QFileInfo, 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 +from ui.extends.shared.settings import Settings class FileSelector(Ui_FileSelector, QWidget): @@ -25,6 +26,8 @@ class FileSelector(Ui_FileSelector, QWidget): self.__mode = self.getOpenFileNames + self.settingsKey = None + def getOpenFileNames(self): selectedFiles, filter = QFileDialog.getOpenFileNames( self, @@ -39,13 +42,12 @@ class FileSelector(Ui_FileSelector, QWidget): self.accepted.emit() def getExistingDirectory(self): - selectedDir = QFileDialog.getExistingDirectory( + if selectedDir := QFileDialog.getExistingDirectory( self, self.__caption, self.__startDirectory, QFileDialog.Option.ShowDirsOnly | self.__options, - ) - if selectedDir: + ): self.__selectedFiles = [selectedDir] self.accepted.emit() @@ -83,13 +85,29 @@ class FileSelector(Ui_FileSelector, QWidget): self.updateLabel() def updateLabel(self): - selectedFiles = self.selectedFiles() - - if not selectedFiles: - self.elidedLabel.setText("...") - else: + if selectedFiles := self.selectedFiles(): self.elidedLabel.setText("
".join(selectedFiles)) + else: + self.elidedLabel.setText("...") @Slot() def on_selectButton_clicked(self): self.__mode() + + def connectSettings(self, settingsKey: str): + self.settingsKey = settingsKey + Settings().updated.connect(self.settingsUpdated) + + def disconnectSettings(self): + Settings().updated.disconnect(self.settingsUpdated) + self.settingsKey = None + + def settingsUpdated(self, key: str): + if key != self.settingsKey: + return + + # keep user selection + if self.__selectedFiles: + return + + self.selectFile(Settings().value(key)) diff --git a/ui/implements/tabs/tabOcr/tabOcr_B30.py b/ui/implements/tabs/tabOcr/tabOcr_B30.py index 5ea9ebe..61191d3 100644 --- a/ui/implements/tabs/tabOcr/tabOcr_B30.py +++ b/ui/implements/tabs/tabOcr/tabOcr_B30.py @@ -5,15 +5,13 @@ import cv2 from arcaea_offline_ocr.b30.chieri.v4.ocr import ChieriBotV4Ocr from arcaea_offline_ocr.sift_db import SIFTDatabase from arcaea_offline_ocr.utils import imread_unicode - -# from paddleocr import PaddleOCR from PySide6.QtCore import Signal, Slot from PySide6.QtWidgets import QWidget from ui.designer.tabs.tabOcr.tabOcr_B30_ui import Ui_TabOcr_B30 from ui.extends.components.ocrQueue import OcrQueueModel from ui.extends.shared.cv2_utils import cv2BgrMatToQImage, qImageToCvMatBgr -from ui.extends.shared.settings import Settings +from ui.extends.shared.settings import KNN_MODEL_FILE, SIFT_DATABASE_FILE, Settings from ui.extends.tabs.tabOcr.tabOcr_B30 import ChieriV4OcrRunnable, b30ResultToScore logger = logging.getLogger(__name__) @@ -30,16 +28,14 @@ class TabOcr_B30(Ui_TabOcr_B30, QWidget): self.b30TypeComboBox.setCurrentIndex(0) self.b30TypeComboBox.setEnabled(False) - # self.paddleFolderSelector.setMode( - # self.paddleFolderSelector.getExistingDirectory - # ) - self.imageSelector.filesSelected.connect(self.imageSelected) self.knnModelSelector.filesSelected.connect(self.knnModelSelected) self.b30KnnModelSelector.filesSelected.connect(self.b30KnnModelSelected) - # self.paddleFolderSelector.filesSelected.connect(self.paddleFolderSelected) self.siftDatabaseSelector.filesSelected.connect(self.siftDatabaseSelected) + self.knnModelSelector.connectSettings(KNN_MODEL_FILE) + self.siftDatabaseSelector.connectSettings(SIFT_DATABASE_FILE) + self.imagePath = None # for checking only self.img = None self.paddleFolder = None @@ -61,59 +57,30 @@ class TabOcr_B30(Ui_TabOcr_B30, QWidget): self.ocrQueue.setModel(self.ocrQueueModel) def imageSelected(self): - selectedFiles = self.imageSelector.selectedFiles() - if selectedFiles: + if selectedFiles := self.imageSelector.selectedFiles(): imagePath = selectedFiles[0] self.imagePath = imagePath self.img = imread_unicode(imagePath) self.tryPrepareOcr.emit() def knnModelSelected(self): - selectedFiles = self.knnModelSelector.selectedFiles() - if selectedFiles: + if selectedFiles := self.knnModelSelector.selectedFiles(): knnModelPath = selectedFiles[0] self.knnModel = cv2.ml.KNearest.load(knnModelPath) self.tryPrepareOcr.emit() def b30KnnModelSelected(self): - selectedFiles = self.b30KnnModelSelector.selectedFiles() - if selectedFiles: + if selectedFiles := self.b30KnnModelSelector.selectedFiles(): b30KnnModelPath = selectedFiles[0] self.b30KnnModel = cv2.ml.KNearest.load(b30KnnModelPath) self.tryPrepareOcr.emit() def siftDatabaseSelected(self): - selectedFiles = self.siftDatabaseSelector.selectedFiles() - if selectedFiles: + if selectedFiles := self.siftDatabaseSelector.selectedFiles(): siftDatabasePath = selectedFiles[0] self.siftDatabase = SIFTDatabase(siftDatabasePath) self.tryPrepareOcr.emit() - def paddleFolderSelected(self): - selectedFiles = self.paddleFolderSelector.selectedFiles() - if selectedFiles: - self.paddleFolder = selectedFiles[0] - self.initPaddle() - self.tryPrepareOcr.emit() - - def initPaddle(self): - paddleFolder = Path(self.paddleFolder) - paddleDetFolder = paddleFolder / "det" - paddleClsFolder = paddleFolder / "cls" - paddleRecFolder = paddleFolder / "rec" - - if not (paddleDetFolder.exists() and paddleRecFolder.exists()): - logger.warning("paddleocr folder incomplete, aborting.") - return - - self.paddle = PaddleOCR( - show_log=False, - use_angle_cls=False, - det_model_dir=str(paddleDetFolder), - cls_model_dir=str(paddleClsFolder), - rec_model_dir=str(paddleRecFolder), - ) - def prepareOcr(self): b30Type = self.b30TypeComboBox.currentData() if not b30Type: diff --git a/ui/implements/tabs/tabOcr/tabOcr_Device.py b/ui/implements/tabs/tabOcr/tabOcr_Device.py index dc40980..5f05856 100644 --- a/ui/implements/tabs/tabOcr/tabOcr_Device.py +++ b/ui/implements/tabs/tabOcr/tabOcr_Device.py @@ -11,7 +11,12 @@ from PySide6.QtWidgets import QApplication, QFileDialog, QWidget from ui.designer.tabs.tabOcr.tabOcr_Device_ui import Ui_TabOcr_Device from ui.extends.components.ocrQueue import OcrQueueModel -from ui.extends.shared.settings import Settings +from ui.extends.shared.settings import ( + DEVICES_JSON_FILE, + KNN_MODEL_FILE, + SIFT_DATABASE_FILE, + Settings, +) from ui.extends.tabs.tabOcr.tabOcr_Device import ( ScoreConverter, TabDeviceV2AutoRoisOcrRunnable, @@ -29,11 +34,12 @@ class TabOcr_Device(Ui_TabOcr_Device, QWidget): self.deviceFileSelector.filesSelected.connect(self.deviceFileSelected) self.knnModelSelector.filesSelected.connect(self.knnModelFileSelected) - self.tesseractFileSelector.filesSelected.connect( - self.tesseractFileSelectorFilesSelected - ) self.siftDatabaseSelector.filesSelected.connect(self.siftDatabaseFileSelected) + self.deviceFileSelector.connectSettings(DEVICES_JSON_FILE) + self.knnModelSelector.connectSettings(KNN_MODEL_FILE) + self.siftDatabaseSelector.connectSettings(SIFT_DATABASE_FILE) + settings = Settings() logger.info("Applying default settings...") self.deviceFileSelector.selectFile(settings.devicesJsonFile()) @@ -74,24 +80,16 @@ class TabOcr_Device(Ui_TabOcr_Device, QWidget): self.deviceDependenciesStackedWidget.setCurrentIndex(device.version - 1) def deviceFileSelected(self): - selectedFiles = self.deviceFileSelector.selectedFiles() - if selectedFiles: + if selectedFiles := self.deviceFileSelector.selectedFiles(): file = selectedFiles[0] self.deviceComboBox.loadDevicesJson(file) def knnModelFileSelected(self): - selectedFiles = self.knnModelSelector.selectedFiles() - if selectedFiles: + if selectedFiles := self.knnModelSelector.selectedFiles(): self.knnModel = cv2.ml.KNearest.load(selectedFiles[0]) - def tesseractFileSelectorFilesSelected(self): - selectedFiles = self.tesseractFileSelector.selectedFiles() - if selectedFiles: - pytesseract.pytesseract.tesseract_cmd = selectedFiles[0] - def siftDatabaseFileSelected(self): - selectedFiles = self.siftDatabaseSelector.selectedFiles() - if selectedFiles: + if selectedFiles := self.siftDatabaseSelector.selectedFiles(): self.siftDatabase = SIFTDatabase(selectedFiles[0]) @Slot()