From 6ed512e6d04284ed9826ff53cee5859c8bde6b04 Mon Sep 17 00:00:00 2001 From: Dilan Boskan Date: Sat, 7 May 2022 10:58:24 +0200 Subject: [PATCH] Commit --- src/constants.py | 9 +- .../models/Vocal Models/Models Go Here.txt | 0 .../Models Go Here.txt => __init__.py} | 0 src/resources/models/modelmanager.py | 107 ++++++++++++ src/resources/user/settings.ini | 37 ++-- src/translator.py | 3 +- src/windows/design/settingswindow_ui.py | 138 +++++++++------ src/windows/settingswindow.py | 103 +++++------- ui_files/settingswindow.ui | 159 ++++++++++-------- 9 files changed, 342 insertions(+), 214 deletions(-) delete mode 100644 src/resources/models/Vocal Models/Models Go Here.txt rename src/resources/models/{Main Models/Models Go Here.txt => __init__.py} (100%) create mode 100644 src/resources/models/modelmanager.py diff --git a/src/constants.py b/src/constants.py index cc5289b..d0b0d60 100644 --- a/src/constants.py +++ b/src/constants.py @@ -30,10 +30,11 @@ JSON_TO_NAME = OrderedDict(**{ # Number 'aggressiveness': 'doubleSpinBox_aggressiveness', 'highEndProcess': 'comboBox_highEndProcess', + 'windowSize': 'comboBox_winSize', # -Models- + 'ensemble': 'checkBox_ensemble', 'instrumentalModelName': 'comboBox_instrumental', 'vocalModelName': 'comboBox_vocal', - 'windowSize': 'comboBox_winSize', }) DEFAULT_SETTINGS = { # --Independent Data (Data not directly connected with widgets)-- @@ -54,11 +55,12 @@ DEFAULT_SETTINGS = { 'outputImage': True, 'modelFolder': True, 'deepExtraction': True, + 'windowSize': 1024, # Number 'aggressiveness': 0.1, 'highEndProcess': 'Bypass', # -Models- - 'windowSize': 1024, + 'ensemble': True, }], ['NONE', { # -Conversion- @@ -68,11 +70,12 @@ DEFAULT_SETTINGS = { 'outputImage': False, 'modelFolder': False, 'deepExtraction': False, + 'windowSize': 352, # Number 'aggressiveness': -0.1, 'highEndProcess': 'Mirroring', # -Models- - 'windowSize': 352, + 'ensemble': False, }] ], # Presets save directory (Default: desktop) diff --git a/src/resources/models/Vocal Models/Models Go Here.txt b/src/resources/models/Vocal Models/Models Go Here.txt deleted file mode 100644 index e69de29..0000000 diff --git a/src/resources/models/Main Models/Models Go Here.txt b/src/resources/models/__init__.py similarity index 100% rename from src/resources/models/Main Models/Models Go Here.txt rename to src/resources/models/__init__.py diff --git a/src/resources/models/modelmanager.py b/src/resources/models/modelmanager.py new file mode 100644 index 0000000..f4b268f --- /dev/null +++ b/src/resources/models/modelmanager.py @@ -0,0 +1,107 @@ +""" +Class for managing models +""" +# pylint: disable=no-name-in-module, import-error +# -GUI- +from typing import Dict +from PySide2 import QtWidgets +from PySide2 import QtCore +from PySide2 import QtGui +from PySide2.QtGui import Qt +# -Root imports- +# None +# -Other- +import hashlib +# System +import os +import sys + +# Get the absolute path to this file +if getattr(sys, 'frozen', False): + # If the application is run as a bundle, the PyInstaller bootloader + # extends the sys module by a flag frozen=True and sets the app + # path into variable _MEIPASS'. + main_path = os.path.dirname(sys.executable) + abs_path = os.path.join(main_path, 'models') +else: + abs_path = os.path.dirname(os.path.abspath(__file__)) + + +MODEL_TYPES = [ + "Instrumental", + "Vocal", + "Karaoke", + "Custom" +] + + +class Model: + def __init__(self, model_type: str, path: str): + self.type = model_type + self.path = path + self.id = self.get_model_id(path) + + @staticmethod + def get_model_id(path: str) -> str: + buffer_size = 65536 + sha1 = hashlib.sha1() + + with open(path, 'rb') as f: + while True: + data = f.read(buffer_size) + if not data: + break + sha1.update(data) + + return sha1.hexdigest() + + def __repr__(self) -> str: + return f"Model(type:{self.type}," + + +class ModelManager: + + def __init__(self): + self.model_dirs = {} + self.available_models = {} + self._callback = None + self.create_model_folders() + + def search_for_models(self, force_callback: bool = False): + """Search for the models in each model type folder""" + new_available_models = {} + + for model_type, model_dir in self.model_dirs.items(): + for index, f in enumerate(os.listdir(model_dir)): + if not f.endswith('.pth'): + # File is not a model file, so skip + continue + # Get data + path = os.path.join(model_dir, f) + new_available_models[model_type] = Model(model_type, path) + + if (new_available_models != self.available_models or + force_callback): + self.available_models = new_available_models + if self._callback is not None: + self._callback() + else: + self.available_models = new_available_models + + def set_callback(self, callback): + """Set a callback function that will be called + when the avaiable models have changed + + Args: + callback (function): Callback funtion + """ + self._callback = callback + + def create_model_folders(self): + """Create the folders for each model type""" + self.model_dirs.clear() + for model in MODEL_TYPES: + model_dir = os.path.join(abs_path, model) + if not os.path.isdir(model_dir): + os.mkdir(model_dir) + self.model_dirs[model] = model_dir diff --git a/src/resources/user/settings.ini b/src/resources/user/settings.ini index c202094..4f9e643 100644 --- a/src/resources/user/settings.ini +++ b/src/resources/user/settings.ini @@ -1,24 +1,24 @@ [settingswindow] -size=@Size(1028 551) -pos=@Point(585 245) +size=@Size(941 550) +pos=@Point(274 296) checkBox_gpuConversion=false -checkBox_tta=false -checkBox_modelFolder=false -checkBox_outputImage=false -checkBox_postProcess=false -checkBox_deepExtraction=false -comboBox_winSize=352 -comboBox_highEndProcess=Mirroring -doubleSpinBox_aggressiveness=-0.1 +checkBox_tta=true +checkBox_modelFolder=true +checkBox_outputImage=true +checkBox_postProcess=true +checkBox_deepExtraction=true +comboBox_winSize=1024 +comboBox_highEndProcess=Bypass +doubleSpinBox_aggressiveness=0.1 checkBox_ensemble=false -comboBox_instrumental=MGM-v5-2Band-32000-BETA1 - Kopie +comboBox_instrumental= comboBox_vocal= -comboBox_presets=NONE +comboBox_presets=Custom checkBox_notifiyOnFinish=false checkBox_notifyUpdates=true -checkBox_settingsStartup=false +checkBox_settingsStartup=true checkBox_enableAnimations=true -checkBox_showInfoButtons=false +checkBox_showInfoButtons=true checkBox_multithreading=false comboBox_command=Off checkBox_autoSaveInstrumentals=true @@ -29,17 +29,12 @@ exportDirectory=C:/Users/boska/Desktop language=en inputPaths=@Invalid() inputsDirectory=C:/Users/boska/Desktop -presets=@Variant(\0\0\0\x7f\0\0\0\x18PySide::PyObjectWrapper\0\0\0\0\xc3\x80\x3X\x3\0\0\0\x41LLq\0}q\x1(X\xe\0\0\0\x61ggressivenessq\x2G?\xb9\x99\x99\x99\x99\x99\x9aX\xe\0\0\0\x64\x65\x65pExtractionq\x3\x88X\xe\0\0\0highEndProcessq\x4X\x6\0\0\0\x42ypassq\x5X\v\0\0\0modelFolderq\x6\x88X\v\0\0\0outputImageq\a\x88X\v\0\0\0postProcessq\b\x88X\x3\0\0\0ttaq\t\x88X\n\0\0\0windowSizeq\nM\0\x4u\x86q\v.), @Variant(\0\0\0\x7f\0\0\0\x18PySide::PyObjectWrapper\0\0\0\0\xc7\x80\x3X\x4\0\0\0NONEq\0}q\x1(X\xe\0\0\0\x61ggressivenessq\x2G\xbf\xb9\x99\x99\x99\x99\x99\x9aX\xe\0\0\0\x64\x65\x65pExtractionq\x3\x89X\xe\0\0\0highEndProcessq\x4X\t\0\0\0Mirroringq\x5X\v\0\0\0modelFolderq\x6\x89X\v\0\0\0outputImageq\a\x89X\v\0\0\0postProcessq\b\x89X\x3\0\0\0ttaq\t\x89X\n\0\0\0windowSizeq\nM`\x1u\x86q\v.) +presets=@Variant(\0\0\0\x7f\0\0\0\x18PySide::PyObjectWrapper\0\0\0\0\xd3\x80\x3X\x3\0\0\0\x41LLq\0}q\x1(X\xe\0\0\0\x61ggressivenessq\x2G?\xb9\x99\x99\x99\x99\x99\x9aX\xe\0\0\0\x64\x65\x65pExtractionq\x3\x88X\b\0\0\0\x65nsembleq\x4\x88X\xe\0\0\0highEndProcessq\x5X\x6\0\0\0\x42ypassq\x6X\v\0\0\0modelFolderq\a\x88X\v\0\0\0outputImageq\b\x88X\v\0\0\0postProcessq\t\x88X\x3\0\0\0ttaq\n\x88X\n\0\0\0windowSizeq\vM\0\x4u\x86q\f.), @Variant(\0\0\0\x7f\0\0\0\x18PySide::PyObjectWrapper\0\0\0\0\xd7\x80\x3X\x4\0\0\0NONEq\0}q\x1(X\xe\0\0\0\x61ggressivenessq\x2G\xbf\xb9\x99\x99\x99\x99\x99\x9aX\xe\0\0\0\x64\x65\x65pExtractionq\x3\x89X\b\0\0\0\x65nsembleq\x4\x89X\xe\0\0\0highEndProcessq\x5X\t\0\0\0Mirroringq\x6X\v\0\0\0modelFolderq\a\x89X\v\0\0\0outputImageq\b\x89X\v\0\0\0postProcessq\t\x89X\x3\0\0\0ttaq\n\x89X\n\0\0\0windowSizeq\vM`\x1u\x86q\f.) presets_loadDir=C:/Users/boska/Desktop presets_saveDir=C:/Users/boska/Desktop theme=dark [mainwindow] size=@Size(906 559) -pos=@Point(503 220) -isMaximized=false - -[infowindow] -size=@Size(596 440) -pos=@Point(662 204) +pos=@Point(507 260) isMaximized=false diff --git a/src/translator.py b/src/translator.py index ce90e7e..f191b9a 100644 --- a/src/translator.py +++ b/src/translator.py @@ -3,15 +3,14 @@ Translator Class File """ # pylint: disable=no-name-in-module, import-error # -GUI- -from typing import DefaultDict, Dict from PySide2 import QtWidgets from PySide2 import QtCore from PySide2 import QtGui -import PySide2 from PySide2.QtGui import Qt # -Root imports- # None # -Other- +from typing import DefaultDict, Dict # System import os import sys diff --git a/src/windows/design/settingswindow_ui.py b/src/windows/design/settingswindow_ui.py index 9678527..ffa22e5 100644 --- a/src/windows/design/settingswindow_ui.py +++ b/src/windows/design/settingswindow_ui.py @@ -18,7 +18,7 @@ class Ui_SettingsWindow(object): if not SettingsWindow.objectName(): SettingsWindow.setObjectName(u"SettingsWindow") SettingsWindow.setEnabled(True) - SettingsWindow.resize(941, 551) + SettingsWindow.resize(941, 550) SettingsWindow.setStyleSheet(u"") self.horizontalLayout = QHBoxLayout(SettingsWindow) self.horizontalLayout.setSpacing(0) @@ -134,7 +134,7 @@ class Ui_SettingsWindow(object): self.scrollAreaWidgetContents_2 = QWidget() self.scrollAreaWidgetContents_2.setObjectName( u"scrollAreaWidgetContents_2") - self.scrollAreaWidgetContents_2.setGeometry(QRect(0, 0, 741, 551)) + self.scrollAreaWidgetContents_2.setGeometry(QRect(0, 0, 741, 550)) sizePolicy2 = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred) sizePolicy2.setHorizontalStretch(0) sizePolicy2.setVerticalStretch(0) @@ -164,7 +164,7 @@ class Ui_SettingsWindow(object): self.horizontalFrame_1 = QFrame(self.frame_3) self.horizontalFrame_1.setObjectName(u"horizontalFrame_1") self.horizontalLayout_4 = QHBoxLayout(self.horizontalFrame_1) - self.horizontalLayout_4.setSpacing(45) + self.horizontalLayout_4.setSpacing(35) self.horizontalLayout_4.setObjectName(u"horizontalLayout_4") self.horizontalLayout_4.setContentsMargins(0, 0, 0, 0) self.frame_template_3 = QFrame(self.horizontalFrame_1) @@ -572,25 +572,46 @@ class Ui_SettingsWindow(object): self.frame_12.setObjectName(u"frame_12") self.frame_12.setFrameShape(QFrame.NoFrame) self.frame_12.setFrameShadow(QFrame.Raised) - self.label_9 = QLabel(self.frame_12) - self.label_9.setObjectName(u"label_9") - self.label_9.setGeometry(QRect(350, 30, 151, 31)) - self.treeWidget = QTreeWidget(self.frame_12) - __qtreewidgetitem = QTreeWidgetItem(self.treeWidget) - __qtreewidgetitem1 = QTreeWidgetItem(__qtreewidgetitem) - __qtreewidgetitem1.setCheckState(0, Qt.Checked) - __qtreewidgetitem2 = QTreeWidgetItem(__qtreewidgetitem) - __qtreewidgetitem2.setCheckState(0, Qt.Unchecked) - __qtreewidgetitem3 = QTreeWidgetItem(self.treeWidget) - __qtreewidgetitem4 = QTreeWidgetItem(__qtreewidgetitem3) - __qtreewidgetitem4.setCheckState(0, Qt.Unchecked) - __qtreewidgetitem5 = QTreeWidgetItem(__qtreewidgetitem3) - __qtreewidgetitem5.setCheckState(0, Qt.Unchecked) - QTreeWidgetItem(self.treeWidget) - self.treeWidget.setObjectName(u"treeWidget") - self.treeWidget.setGeometry(QRect(40, 0, 256, 192)) - self.treeWidget.setStyleSheet(u"") - self.treeWidget.header().setVisible(False) + self.tableWidget = QTableWidget(self.frame_12) + if (self.tableWidget.columnCount() < 3): + self.tableWidget.setColumnCount(3) + __qtablewidgetitem = QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(0, __qtablewidgetitem) + __qtablewidgetitem1 = QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(1, __qtablewidgetitem1) + __qtablewidgetitem2 = QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(2, __qtablewidgetitem2) + if (self.tableWidget.rowCount() < 2): + self.tableWidget.setRowCount(2) + __qtablewidgetitem3 = QTableWidgetItem() + self.tableWidget.setVerticalHeaderItem(0, __qtablewidgetitem3) + __qtablewidgetitem4 = QTableWidgetItem() + self.tableWidget.setVerticalHeaderItem(1, __qtablewidgetitem4) + __qtablewidgetitem5 = QTableWidgetItem() + self.tableWidget.setItem(0, 0, __qtablewidgetitem5) + __qtablewidgetitem6 = QTableWidgetItem() + self.tableWidget.setItem(0, 1, __qtablewidgetitem6) + __qtablewidgetitem7 = QTableWidgetItem() + self.tableWidget.setItem(0, 2, __qtablewidgetitem7) + __qtablewidgetitem8 = QTableWidgetItem() + self.tableWidget.setItem(1, 0, __qtablewidgetitem8) + __qtablewidgetitem9 = QTableWidgetItem() + self.tableWidget.setItem(1, 1, __qtablewidgetitem9) + __qtablewidgetitem10 = QTableWidgetItem() + self.tableWidget.setItem(1, 2, __qtablewidgetitem10) + self.tableWidget.setObjectName(u"tableWidget") + self.tableWidget.setGeometry(QRect(50, 20, 611, 91)) + self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers) + self.tableWidget.setTabKeyNavigation(True) + self.tableWidget.setAlternatingRowColors(True) + self.tableWidget.setSelectionMode(QAbstractItemView.SingleSelection) + self.tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows) + self.tableWidget.horizontalHeader().setCascadingSectionResizes(True) + self.tableWidget.horizontalHeader().setHighlightSections(False) + self.tableWidget.horizontalHeader().setProperty("showSortIndicator", True) + self.tableWidget.horizontalHeader().setStretchLastSection(True) + self.tableWidget.verticalHeader().setVisible(False) + self.tableWidget.verticalHeader().setHighlightSections(False) self.gridLayout.addWidget(self.frame_12, 0, 0, 1, 1) @@ -622,7 +643,7 @@ class Ui_SettingsWindow(object): self.scrollAreaWidgetContents = QWidget() self.scrollAreaWidgetContents.setObjectName( u"scrollAreaWidgetContents") - self.scrollAreaWidgetContents.setGeometry(QRect(0, 0, 656, 551)) + self.scrollAreaWidgetContents.setGeometry(QRect(0, 0, 741, 550)) self.scrollAreaWidgetContents.setStyleSheet(u"QFrame#frame_engine, QFrame#frame_modelOptions {\n" " background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0.221409, y2:0.587, stop:0.119318 rgba(85, 78, 163, 255), stop:0.683616 rgba(0, 0, 0, 0));\n" "}") @@ -657,7 +678,7 @@ class Ui_SettingsWindow(object): self.scrollAreaWidgetContents_4 = QWidget() self.scrollAreaWidgetContents_4.setObjectName( u"scrollAreaWidgetContents_4") - self.scrollAreaWidgetContents_4.setGeometry(QRect(0, 0, 656, 551)) + self.scrollAreaWidgetContents_4.setGeometry(QRect(0, 0, 741, 550)) self.scrollAreaWidgetContents_4.setStyleSheet(u"QFrame#frame_engine, QFrame#frame_modelOptions {\n" " background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0.221409, y2:0.587, stop:0.119318 rgba(85, 78, 163, 255), stop:0.683616 rgba(0, 0, 0, 0));\n" "}") @@ -713,7 +734,7 @@ class Ui_SettingsWindow(object): self.scrollAreaWidgetContents_5 = QWidget() self.scrollAreaWidgetContents_5.setObjectName( u"scrollAreaWidgetContents_5") - self.scrollAreaWidgetContents_5.setGeometry(QRect(0, 0, 656, 551)) + self.scrollAreaWidgetContents_5.setGeometry(QRect(0, 0, 741, 550)) self.scrollAreaWidgetContents_5.setMinimumSize(QSize(600, 0)) self.scrollAreaWidgetContents_5.setStyleSheet(u"QFrame#frame_engine, QFrame#frame_modelOptions {\n" " background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0.221409, y2:0.587, stop:0.119318 rgba(85, 78, 163, 255), stop:0.683616 rgba(0, 0, 0, 0));\n" @@ -741,7 +762,7 @@ class Ui_SettingsWindow(object): self.frame_5.setFrameShape(QFrame.NoFrame) self.frame_5.setFrameShadow(QFrame.Raised) self.horizontalLayout_6 = QHBoxLayout(self.frame_5) - self.horizontalLayout_6.setSpacing(45) + self.horizontalLayout_6.setSpacing(35) self.horizontalLayout_6.setObjectName(u"horizontalLayout_6") self.horizontalLayout_6.setContentsMargins(0, 0, 0, 0) self.frame_6 = QFrame(self.frame_5) @@ -1137,7 +1158,7 @@ class Ui_SettingsWindow(object): self.stackedWidget.setCurrentIndex(0) self.comboBox_highEndProcess.setCurrentIndex(4) self.comboBox_winSize.setCurrentIndex(0) - self.models_stackedWidget.setCurrentIndex(0) + self.models_stackedWidget.setCurrentIndex(1) self.pushButton_de.setDefault(False) self.pushButton_en.setDefault(False) @@ -1203,36 +1224,43 @@ class Ui_SettingsWindow(object): "SettingsWindow", u"Instrumental Model", None)) self.label_4.setText(QCoreApplication.translate( "SettingsWindow", u"Vocal Model", None)) - self.label_9.setText(QCoreApplication.translate( - "SettingsWindow", u"Ensemble Page", None)) - ___qtreewidgetitem = self.treeWidget.headerItem() - ___qtreewidgetitem.setText( - 0, QCoreApplication.translate("SettingsWindow", u"1", None)) + ___qtablewidgetitem = self.tableWidget.horizontalHeaderItem(0) + ___qtablewidgetitem.setText( + QCoreApplication.translate("SettingsWindow", u"Type", None)) + ___qtablewidgetitem1 = self.tableWidget.horizontalHeaderItem(1) + ___qtablewidgetitem1.setText( + QCoreApplication.translate("SettingsWindow", u"Name", None)) + ___qtablewidgetitem2 = self.tableWidget.horizontalHeaderItem(2) + ___qtablewidgetitem2.setText(QCoreApplication.translate( + "SettingsWindow", u"Description", None)) + ___qtablewidgetitem3 = self.tableWidget.verticalHeaderItem(0) + ___qtablewidgetitem3.setText(QCoreApplication.translate( + "SettingsWindow", u"1234567", None)) + ___qtablewidgetitem4 = self.tableWidget.verticalHeaderItem(1) + ___qtablewidgetitem4.setText(QCoreApplication.translate( + "SettingsWindow", u"2353426", None)) - __sortingEnabled = self.treeWidget.isSortingEnabled() - self.treeWidget.setSortingEnabled(False) - ___qtreewidgetitem1 = self.treeWidget.topLevelItem(0) - ___qtreewidgetitem1.setText(0, QCoreApplication.translate( + __sortingEnabled = self.tableWidget.isSortingEnabled() + self.tableWidget.setSortingEnabled(False) + ___qtablewidgetitem5 = self.tableWidget.item(0, 0) + ___qtablewidgetitem5.setText( + QCoreApplication.translate("SettingsWindow", u"Vocal", None)) + ___qtablewidgetitem6 = self.tableWidget.item(0, 1) + ___qtablewidgetitem6.setText(QCoreApplication.translate( + "SettingsWindow", u"VOCALMODELV5", None)) + ___qtablewidgetitem7 = self.tableWidget.item(0, 2) + ___qtablewidgetitem7.setText(QCoreApplication.translate( + "SettingsWindow", u"My Vocal Model", None)) + ___qtablewidgetitem8 = self.tableWidget.item(1, 0) + ___qtablewidgetitem8.setText(QCoreApplication.translate( "SettingsWindow", u"Instrumental", None)) - ___qtreewidgetitem2 = ___qtreewidgetitem1.child(0) - ___qtreewidgetitem2.setText(0, QCoreApplication.translate( - "SettingsWindow", u"Model 1", None)) - ___qtreewidgetitem3 = ___qtreewidgetitem1.child(1) - ___qtreewidgetitem3.setText(0, QCoreApplication.translate( - "SettingsWindow", u"Model 2", None)) - ___qtreewidgetitem4 = self.treeWidget.topLevelItem(1) - ___qtreewidgetitem4.setText( - 0, QCoreApplication.translate("SettingsWindow", u"Vocal", None)) - ___qtreewidgetitem5 = ___qtreewidgetitem4.child(0) - ___qtreewidgetitem5.setText(0, QCoreApplication.translate( - "SettingsWindow", u"Vocal Model 1", None)) - ___qtreewidgetitem6 = ___qtreewidgetitem4.child(1) - ___qtreewidgetitem6.setText(0, QCoreApplication.translate( - "SettingsWindow", u"Vocal Model 2", None)) - ___qtreewidgetitem7 = self.treeWidget.topLevelItem(2) - ___qtreewidgetitem7.setText(0, QCoreApplication.translate( - "SettingsWindow", u"Custom", None)) - self.treeWidget.setSortingEnabled(__sortingEnabled) + ___qtablewidgetitem9 = self.tableWidget.item(1, 1) + ___qtablewidgetitem9.setText(QCoreApplication.translate( + "SettingsWindow", u"INSTRUMENTALMODEL", None)) + ___qtablewidgetitem10 = self.tableWidget.item(1, 2) + ___qtablewidgetitem10.setText(QCoreApplication.translate( + "SettingsWindow", u"My Instrumental best model", None)) + self.tableWidget.setSortingEnabled(__sortingEnabled) self.label_6.setText(QCoreApplication.translate( "SettingsWindow", u"Themes", None)) diff --git a/src/windows/settingswindow.py b/src/windows/settingswindow.py index 741eae0..a2ca7ed 100644 --- a/src/windows/settingswindow.py +++ b/src/windows/settingswindow.py @@ -6,6 +6,7 @@ from PySide2 import QtCore from PySide2 import QtGui from PySide2.QtGui import Qt # -Root imports- +from ..resources.models.modelmanager import ModelManager from ..inference.lib.model_param_init import ModelParameters from ..resources.resources_manager import ResourcePaths from ..app import CustomApplication @@ -51,6 +52,7 @@ class SettingsWindow(QtWidgets.QWidget): 2: self.update_page_customization, 3: self.update_page_preferences, } + self.modelmanager = ModelManager() # Independent data self.exportDirectory = self.settings.value('user/exportDirectory', const.DEFAULT_SETTINGS['exportDirectory'], @@ -384,8 +386,6 @@ class SettingsWindow(QtWidgets.QWidget): # -Before setup- self.search_for_preset = False - # Update available model lists - self._update_selectable_models() # Open settings window on startup open_settings = self.settings.value('settingswindow/checkBox_settingsStartup', const.DEFAULT_SETTINGS['checkBox_settingsStartup'], @@ -410,11 +410,13 @@ class SettingsWindow(QtWidgets.QWidget): # Load menu (Preferences) self.update_window() self.menu_loadPage(0, True) - self.search_for_preset = True if not torch.cuda.is_available(): self.ui.checkBox_gpuConversion.setEnabled(False) self.ui.checkBox_gpuConversion.setChecked(False) self.ui.checkBox_gpuConversion.setToolTip("CUDA is not available on your system") + self.modelmanager.set_callback(self.changed_available_models) + self.modelmanager.search_for_models(force_callback=True) + self.search_for_preset = True self.logger.indent_backwards() def load_window(self): @@ -479,54 +481,42 @@ class SettingsWindow(QtWidgets.QWidget): self.logger.indent_backwards() - def _update_selectable_models(self): + def changed_available_models(self): """ Update the list of models to select from in the seperation settings page based on the selected AI Engine """ - def get_model_id(path: str) -> str: - buffer_size = 65536 - sha1 = hashlib.sha1() + print(self.modelmanager.available_models) + # def fill_model_comboBox(widget: QtWidgets.QComboBox, folder: str): + # """ + # Fill the combobox for the model + # """ + # currently_selected_model_name = widget.currentText() + # widget.clear() + # for index, f in enumerate(os.listdir(folder)): + # if not f.endswith('.pth'): + # # File is not a model file, so skip + # continue + # # Get data + # full_path = os.path.join(folder, f) + # model_id = get_model_id(full_path) + # model_name = os.path.splitext(os.path.basename(f))[0] + # # Add item to combobox + # widget.addItem(model_name, + # { + # 'path': full_path, + # 'id': model_id + # }) + # if model_name == currently_selected_model_name: + # # This model was selected before clearing the + # # QComboBox, so reselect + # widget.setCurrentIndex(index) - with open(path, 'rb') as f: - while True: - data = f.read(buffer_size) - if not data: - break - sha1.update(data) - - return sha1.hexdigest() - - def fill_model_comboBox(widget: QtWidgets.QComboBox, folder: str): - """ - Fill the combobox for the model - """ - currently_selected_model_name = widget.currentText() - widget.clear() - for index, f in enumerate(os.listdir(folder)): - if not f.endswith('.pth'): - # File is not a model file, so skip - continue - # Get data - full_path = os.path.join(folder, f) - model_id = get_model_id(full_path) - model_name = os.path.splitext(os.path.basename(f))[0] - # Add item to combobox - widget.addItem(model_name, - { - 'path': full_path, - 'id': model_id - }) - if model_name == currently_selected_model_name: - # This model was selected before clearing the - # QComboBox, so reselect - widget.setCurrentIndex(index) - - # Fill Comboboxes - fill_model_comboBox(widget=self.ui.comboBox_instrumental, - folder=ResourcePaths.instrumentalModelsDir) - fill_model_comboBox(widget=self.ui.comboBox_vocal, - folder=ResourcePaths.vocalModelsDir) + # # Fill Comboboxes + # fill_model_comboBox(widget=self.ui.comboBox_instrumental, + # folder=ResourcePaths.instrumentalModelsDir) + # fill_model_comboBox(widget=self.ui.comboBox_vocal, + # folder=ResourcePaths.vocalModelsDir) # Custom Models Page def update_page_customModels(self): @@ -767,7 +757,7 @@ class SettingsManager: value = widget.currentText() elif (isinstance(widget, QtWidgets.QDoubleSpinBox) or isinstance(widget, QtWidgets.QSpinBox)): - value = widget.value() + value = round(widget.value(), 2) else: raise TypeError('Invalid widget type that is not supported!\nWidget: ', widget) @@ -825,7 +815,7 @@ class SettingsManager: widget.setCurrentIndex(i) elif (isinstance(widget, QtWidgets.QDoubleSpinBox) or isinstance(widget, QtWidgets.QSpinBox)): - widget.setValue(value) + widget.setValue(round(value, 2)) else: raise TypeError('Invalid widget type that is not supported!\nWidget: ', widget) self.win.update_window() @@ -838,6 +828,7 @@ class SettingsManager: """ # Before self.win.logger.info('Settings: Loading window') + settings: Dict[str, Union[bool, str, float]] = {} # -Load states- self.win.settings.beginGroup('settingswindow') for widget in self.get_widgets(): @@ -855,35 +846,23 @@ class SettingsManager: value = self.win.settings.value(widget_objectName, defaultValue=const.DEFAULT_SETTINGS[widget_objectName], type=bool) - widget.setChecked(value) elif isinstance(widget, QtWidgets.QLineEdit): value = self.win.settings.value(widget_objectName, defaultValue=const.DEFAULT_SETTINGS[widget_objectName], type=str) - widget.setText(value) elif isinstance(widget, QtWidgets.QComboBox): value = self.win.settings.value(widget_objectName, defaultValue=const.DEFAULT_SETTINGS[widget_objectName], type=str) - if widget.isEditable(): - # Allows self-typing - widget.setCurrentText(value) - else: - # Only allows a list to choose from - all_items = [widget.itemText(i) for i in range(widget.count())] - for i, item in enumerate(all_items): - if item == value: - # Both have the same text - widget.setCurrentIndex(i) elif (isinstance(widget, QtWidgets.QDoubleSpinBox) or isinstance(widget, QtWidgets.QSpinBox)): value = self.win.settings.value(widget_objectName, defaultValue=const.DEFAULT_SETTINGS[widget_objectName], type=float) - widget.setValue(value) else: raise TypeError('Invalid widget type that is not supported!\nWidget: ', widget) - + settings[widget_objectName] = value + self.set_settings(settings) self.win.settings.endGroup() def save_window(self): diff --git a/ui_files/settingswindow.ui b/ui_files/settingswindow.ui index 8befc03..2ef5e48 100644 --- a/ui_files/settingswindow.ui +++ b/ui_files/settingswindow.ui @@ -10,7 +10,7 @@ 0 0 941 - 551 + 550 @@ -288,7 +288,7 @@ 0 0 741 - 551 + 550 @@ -356,7 +356,7 @@ - 45 + 35 0 @@ -471,7 +471,7 @@ true - + 20 @@ -1094,12 +1094,12 @@ - 0 + 1 true - + 20 @@ -1285,84 +1285,101 @@ QFrame::Raised - + - 350 - 30 - 151 - 31 + 50 + 20 + 611 + 91 - - Ensemble Page + + QAbstractItemView::NoEditTriggers - - - - - 40 - 0 - 256 - 192 - + + true - - + + true - + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectRows + + + true + + false + + true + + + true + + + false + + + false + + + + 1234567 + + + + + 2353426 + + - 1 + Type - + - Instrumental + Name - - - Model 1 - - - Checked - - - - - Model 2 - - - Unchecked - - - - + + + + Description + + + Vocal - - - Vocal Model 1 - - - Unchecked - - - - - Vocal Model 2 - - - Unchecked - - - + - Custom + VOCALMODELV5 + + + + + My Vocal Model + + + + + Instrumental + + + + + INSTRUMENTALMODEL + + + + + My Instrumental best model @@ -1420,8 +1437,8 @@ 0 0 - 656 - 551 + 741 + 550 @@ -1497,8 +1514,8 @@ 0 0 - 656 - 551 + 741 + 550 @@ -1622,8 +1639,8 @@ 0 0 - 656 - 551 + 741 + 550 @@ -1693,7 +1710,7 @@ - 45 + 35 0