feat: FileSelector.connectSettings

This commit is contained in:
283375 2023-09-21 15:18:23 +08:00
parent 5abf56ff83
commit fe18d0dd94
Signed by: 283375
SSH Key Fingerprint: SHA256:UcX0qg6ZOSDOeieKPGokA5h7soykG61nz2uxuQgVLSk
3 changed files with 48 additions and 65 deletions

View File

@ -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 PySide6.QtWidgets import QFileDialog, QWidget
from ui.designer.components.fileSelector_ui import Ui_FileSelector from ui.designer.components.fileSelector_ui import Ui_FileSelector
from ui.extends.shared.language import LanguageChangeEventFilter from ui.extends.shared.language import LanguageChangeEventFilter
from ui.extends.shared.settings import Settings
class FileSelector(Ui_FileSelector, QWidget): class FileSelector(Ui_FileSelector, QWidget):
@ -25,6 +26,8 @@ class FileSelector(Ui_FileSelector, QWidget):
self.__mode = self.getOpenFileNames self.__mode = self.getOpenFileNames
self.settingsKey = None
def getOpenFileNames(self): def getOpenFileNames(self):
selectedFiles, filter = QFileDialog.getOpenFileNames( selectedFiles, filter = QFileDialog.getOpenFileNames(
self, self,
@ -39,13 +42,12 @@ class FileSelector(Ui_FileSelector, QWidget):
self.accepted.emit() self.accepted.emit()
def getExistingDirectory(self): def getExistingDirectory(self):
selectedDir = QFileDialog.getExistingDirectory( if selectedDir := QFileDialog.getExistingDirectory(
self, self,
self.__caption, self.__caption,
self.__startDirectory, self.__startDirectory,
QFileDialog.Option.ShowDirsOnly | self.__options, QFileDialog.Option.ShowDirsOnly | self.__options,
) ):
if selectedDir:
self.__selectedFiles = [selectedDir] self.__selectedFiles = [selectedDir]
self.accepted.emit() self.accepted.emit()
@ -83,13 +85,29 @@ class FileSelector(Ui_FileSelector, QWidget):
self.updateLabel() self.updateLabel()
def updateLabel(self): def updateLabel(self):
selectedFiles = self.selectedFiles() if selectedFiles := self.selectedFiles():
if not selectedFiles:
self.elidedLabel.setText("...")
else:
self.elidedLabel.setText("<br>".join(selectedFiles)) self.elidedLabel.setText("<br>".join(selectedFiles))
else:
self.elidedLabel.setText("...")
@Slot() @Slot()
def on_selectButton_clicked(self): def on_selectButton_clicked(self):
self.__mode() 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))

View File

@ -5,15 +5,13 @@ import cv2
from arcaea_offline_ocr.b30.chieri.v4.ocr import ChieriBotV4Ocr from arcaea_offline_ocr.b30.chieri.v4.ocr import ChieriBotV4Ocr
from arcaea_offline_ocr.sift_db import SIFTDatabase from arcaea_offline_ocr.sift_db import SIFTDatabase
from arcaea_offline_ocr.utils import imread_unicode from arcaea_offline_ocr.utils import imread_unicode
# from paddleocr import PaddleOCR
from PySide6.QtCore import Signal, Slot from PySide6.QtCore import Signal, Slot
from PySide6.QtWidgets import QWidget from PySide6.QtWidgets import QWidget
from ui.designer.tabs.tabOcr.tabOcr_B30_ui import Ui_TabOcr_B30 from ui.designer.tabs.tabOcr.tabOcr_B30_ui import Ui_TabOcr_B30
from ui.extends.components.ocrQueue import OcrQueueModel from ui.extends.components.ocrQueue import OcrQueueModel
from ui.extends.shared.cv2_utils import cv2BgrMatToQImage, qImageToCvMatBgr 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 from ui.extends.tabs.tabOcr.tabOcr_B30 import ChieriV4OcrRunnable, b30ResultToScore
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -30,16 +28,14 @@ class TabOcr_B30(Ui_TabOcr_B30, QWidget):
self.b30TypeComboBox.setCurrentIndex(0) self.b30TypeComboBox.setCurrentIndex(0)
self.b30TypeComboBox.setEnabled(False) self.b30TypeComboBox.setEnabled(False)
# self.paddleFolderSelector.setMode(
# self.paddleFolderSelector.getExistingDirectory
# )
self.imageSelector.filesSelected.connect(self.imageSelected) self.imageSelector.filesSelected.connect(self.imageSelected)
self.knnModelSelector.filesSelected.connect(self.knnModelSelected) self.knnModelSelector.filesSelected.connect(self.knnModelSelected)
self.b30KnnModelSelector.filesSelected.connect(self.b30KnnModelSelected) self.b30KnnModelSelector.filesSelected.connect(self.b30KnnModelSelected)
# self.paddleFolderSelector.filesSelected.connect(self.paddleFolderSelected)
self.siftDatabaseSelector.filesSelected.connect(self.siftDatabaseSelected) 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.imagePath = None # for checking only
self.img = None self.img = None
self.paddleFolder = None self.paddleFolder = None
@ -61,59 +57,30 @@ class TabOcr_B30(Ui_TabOcr_B30, QWidget):
self.ocrQueue.setModel(self.ocrQueueModel) self.ocrQueue.setModel(self.ocrQueueModel)
def imageSelected(self): def imageSelected(self):
selectedFiles = self.imageSelector.selectedFiles() if selectedFiles := self.imageSelector.selectedFiles():
if selectedFiles:
imagePath = selectedFiles[0] imagePath = selectedFiles[0]
self.imagePath = imagePath self.imagePath = imagePath
self.img = imread_unicode(imagePath) self.img = imread_unicode(imagePath)
self.tryPrepareOcr.emit() self.tryPrepareOcr.emit()
def knnModelSelected(self): def knnModelSelected(self):
selectedFiles = self.knnModelSelector.selectedFiles() if selectedFiles := self.knnModelSelector.selectedFiles():
if selectedFiles:
knnModelPath = selectedFiles[0] knnModelPath = selectedFiles[0]
self.knnModel = cv2.ml.KNearest.load(knnModelPath) self.knnModel = cv2.ml.KNearest.load(knnModelPath)
self.tryPrepareOcr.emit() self.tryPrepareOcr.emit()
def b30KnnModelSelected(self): def b30KnnModelSelected(self):
selectedFiles = self.b30KnnModelSelector.selectedFiles() if selectedFiles := self.b30KnnModelSelector.selectedFiles():
if selectedFiles:
b30KnnModelPath = selectedFiles[0] b30KnnModelPath = selectedFiles[0]
self.b30KnnModel = cv2.ml.KNearest.load(b30KnnModelPath) self.b30KnnModel = cv2.ml.KNearest.load(b30KnnModelPath)
self.tryPrepareOcr.emit() self.tryPrepareOcr.emit()
def siftDatabaseSelected(self): def siftDatabaseSelected(self):
selectedFiles = self.siftDatabaseSelector.selectedFiles() if selectedFiles := self.siftDatabaseSelector.selectedFiles():
if selectedFiles:
siftDatabasePath = selectedFiles[0] siftDatabasePath = selectedFiles[0]
self.siftDatabase = SIFTDatabase(siftDatabasePath) self.siftDatabase = SIFTDatabase(siftDatabasePath)
self.tryPrepareOcr.emit() 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): def prepareOcr(self):
b30Type = self.b30TypeComboBox.currentData() b30Type = self.b30TypeComboBox.currentData()
if not b30Type: if not b30Type:

View File

@ -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.designer.tabs.tabOcr.tabOcr_Device_ui import Ui_TabOcr_Device
from ui.extends.components.ocrQueue import OcrQueueModel 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 ( from ui.extends.tabs.tabOcr.tabOcr_Device import (
ScoreConverter, ScoreConverter,
TabDeviceV2AutoRoisOcrRunnable, TabDeviceV2AutoRoisOcrRunnable,
@ -29,11 +34,12 @@ class TabOcr_Device(Ui_TabOcr_Device, QWidget):
self.deviceFileSelector.filesSelected.connect(self.deviceFileSelected) self.deviceFileSelector.filesSelected.connect(self.deviceFileSelected)
self.knnModelSelector.filesSelected.connect(self.knnModelFileSelected) self.knnModelSelector.filesSelected.connect(self.knnModelFileSelected)
self.tesseractFileSelector.filesSelected.connect(
self.tesseractFileSelectorFilesSelected
)
self.siftDatabaseSelector.filesSelected.connect(self.siftDatabaseFileSelected) 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() settings = Settings()
logger.info("Applying default settings...") logger.info("Applying default settings...")
self.deviceFileSelector.selectFile(settings.devicesJsonFile()) self.deviceFileSelector.selectFile(settings.devicesJsonFile())
@ -74,24 +80,16 @@ class TabOcr_Device(Ui_TabOcr_Device, QWidget):
self.deviceDependenciesStackedWidget.setCurrentIndex(device.version - 1) self.deviceDependenciesStackedWidget.setCurrentIndex(device.version - 1)
def deviceFileSelected(self): def deviceFileSelected(self):
selectedFiles = self.deviceFileSelector.selectedFiles() if selectedFiles := self.deviceFileSelector.selectedFiles():
if selectedFiles:
file = selectedFiles[0] file = selectedFiles[0]
self.deviceComboBox.loadDevicesJson(file) self.deviceComboBox.loadDevicesJson(file)
def knnModelFileSelected(self): def knnModelFileSelected(self):
selectedFiles = self.knnModelSelector.selectedFiles() if selectedFiles := self.knnModelSelector.selectedFiles():
if selectedFiles:
self.knnModel = cv2.ml.KNearest.load(selectedFiles[0]) 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): def siftDatabaseFileSelected(self):
selectedFiles = self.siftDatabaseSelector.selectedFiles() if selectedFiles := self.siftDatabaseSelector.selectedFiles():
if selectedFiles:
self.siftDatabase = SIFTDatabase(selectedFiles[0]) self.siftDatabase = SIFTDatabase(selectedFiles[0])
@Slot() @Slot()