From c8e4cc6fd70b4059d180976e4a078c44babcbd3e Mon Sep 17 00:00:00 2001 From: Robert Honz Date: Sun, 4 Feb 2024 12:17:57 +0100 Subject: [PATCH 1/3] =?UTF-8?q?=E2=9C=A8=20Path=20base=20changed=20to=20ho?= =?UTF-8?q?me=20directory.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tidal_dl_ng/model/cfg.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tidal_dl_ng/model/cfg.py b/tidal_dl_ng/model/cfg.py index 0af7f84..9997101 100644 --- a/tidal_dl_ng/model/cfg.py +++ b/tidal_dl_ng/model/cfg.py @@ -22,7 +22,7 @@ class Settings: # TODO: Implement multi threading for downloads. # multi_thread: bool = False download_delay: bool = True - download_base_path: str = "./download" + download_base_path: str = "~/download" quality_audio: Quality = Quality.low_320k quality_video: QualityVideo = QualityVideo.P480 format_album: str = "Albums/{artist_name} - {album_title}/{track_num}. {artist_name} - {track_title}" From c71a2bdb0b0bd007a629d2f0692bfb4b1e753a1f Mon Sep 17 00:00:00 2001 From: Robert Honz Date: Sun, 4 Feb 2024 12:19:40 +0100 Subject: [PATCH 2/3] =?UTF-8?q?=E2=9C=A8=20Preferences=20dialog=20added.?= =?UTF-8?q?=20Show=20settings.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tidal_dl_ng/dialog.py | 153 ++++++- tidal_dl_ng/gui.py | 12 +- tidal_dl_ng/ui/dialog_settings.py | 493 +++++++++++++++++++++++ tidal_dl_ng/ui/dialog_settings.ui | 645 ++++++++++++++++++++++++++++++ tidal_dl_ng/ui/main.py | 2 +- tidal_dl_ng/ui/main.ui | 2 +- 6 files changed, 1299 insertions(+), 8 deletions(-) create mode 100644 tidal_dl_ng/ui/dialog_settings.py create mode 100644 tidal_dl_ng/ui/dialog_settings.ui diff --git a/tidal_dl_ng/dialog.py b/tidal_dl_ng/dialog.py index 43d14b1..c43d5f4 100644 --- a/tidal_dl_ng/dialog.py +++ b/tidal_dl_ng/dialog.py @@ -1,13 +1,24 @@ -from PySide6.QtWidgets import QDialog +import os.path +from enum import Enum +from pathlib import Path + +from PySide6 import QtCore, QtGui, QtWidgets +from tidalapi import Quality as QualityAudio from tidal_dl_ng import __version__ +from tidal_dl_ng.constants import CoverDimensions, QualityVideo, SkipExisting +from tidal_dl_ng.model.cfg import HelpSettings +from tidal_dl_ng.model.cfg import Settings as ModelSettings from tidal_dl_ng.ui.dialog_login import Ui_DialogLogin +from tidal_dl_ng.ui.dialog_settings import Ui_DialogSettings from tidal_dl_ng.ui.dialog_version import Ui_DialogVersion -class DialogVersion(QDialog): +class DialogVersion(QtWidgets.QDialog): """Version dialog.""" + ui: Ui_DialogVersion + def __init__(self, parent=None): super().__init__(parent) @@ -22,9 +33,10 @@ class DialogVersion(QDialog): self.exec() -class DialogLogin(QDialog): +class DialogLogin(QtWidgets.QDialog): """Version dialog.""" + ui: Ui_DialogLogin url_redirect: str return_code: int @@ -44,5 +56,136 @@ class DialogLogin(QDialog): self.url_redirect = self.ui.te_url_redirect.toPlainText() - def accept1(self): - pass + +class DialogPreferences(QtWidgets.QDialog): + """Preferences dialog.""" + + ui: Ui_DialogSettings + settings: ModelSettings + settings_save: QtCore.Signal + icon: QtGui.QIcon + help_settings: HelpSettings + + def __init__(self, settings: ModelSettings, settings_save: QtCore.Signal, parent=None): + super().__init__(parent) + + self.settings = settings + self.settings_save = settings_save + self.help_settings = HelpSettings() + pixmapi: QtWidgets.QStyle.StandardPixmap = QtWidgets.QStyle.SP_MessageBoxQuestion + self.icon = self.style().standardIcon(pixmapi) + + # Create an instance of the GUI + self.ui = Ui_DialogSettings() + + # Run the .setupUi() method to show the GUI + self.ui.setupUi(self) + # Set data. + self.gui_populate() + + self.exec() + + def gui_populate(self): + self.populate_checkboxes() + self.populate_combo() + self.populate_line_edit() + + def dialog_dir_open(self, obj_line_edit): + # If a path is set, use it otherwise the users home directory. + settings_path: str = os.path.expanduser(obj_line_edit.text()) if obj_line_edit.text() else "" + dir_current = settings_path if settings_path and os.path.exists(settings_path) else str(Path.home()) + dialog = QtWidgets.QFileDialog() + + # Set to directory mode only but show files. + dialog.setFileMode(QtWidgets.QFileDialog.Directory) + dialog.setViewMode(QtWidgets.QFileDialog.Detail) + dialog.setOption(QtWidgets.QFileDialog.ShowDirsOnly, False) + # There is a bug in the PyQt implementation, which hides files in Directory mode. + # Thus, we need to use the PyQt dialog instead of the native dialog. + if os.name == "nt": + dialog.setOption(QtWidgets.QFileDialog.DontUseNativeDialog, True) + dialog.setDirectory(dir_current) + + # Execute dialog and set path is something is choosen. + if dialog.exec(): + dir_name = dialog.selectedFiles()[0] + path = Path(dir_name) + obj_line_edit.setText(str(path)) + + def populate_line_edit(self): + prefix_label: str = "l_" + prefix_icon: str = "icon_" + prefix_line_edit: str = "le_" + parameter_names: [str] = [ + "download_base_path", + "format_album", + "format_playlist", + "format_mix", + "format_track", + "format_video", + ] + + for pn in parameter_names: + label_icon: QtWidgets.QLabel = getattr(self.ui, prefix_label + prefix_icon + pn) + label: QtWidgets.QLabel = getattr(self.ui, prefix_label + pn) + line_edit: QtWidgets.QLineEdit = getattr(self.ui, prefix_line_edit + pn) + + label_icon.setPixmap(QtGui.QPixmap(self.icon.pixmap(QtCore.QSize(16, 16)))) + label_icon.setToolTip(getattr(self.help_settings, pn)) + label.setText(pn) + line_edit.setText(getattr(self.settings, pn)) + + # Base Path File Dialog + self.ui.b_download_base_path.clicked.connect(lambda x: self.dialog_dir_open(self.ui.le_download_base_path)) + + def populate_combo(self): + prefix_label: str = "l_" + prefix_icon: str = "icon_" + prefix_combo: str = "c_" + parameters: [(str, Enum)] = [ + ("skip_existing", SkipExisting), + ("quality_audio", QualityAudio), + ("quality_video", QualityVideo), + ("metadata_cover_dimension", CoverDimensions), + ] + + for p in parameters: + pn: str = p[0] + values: Enum = p[1] + label_icon: QtWidgets.QLabel = getattr(self.ui, prefix_label + prefix_icon + pn) + label: QtWidgets.QLabel = getattr(self.ui, prefix_label + pn) + combo: QtWidgets.QComboBox = getattr(self.ui, prefix_combo + pn) + setting_current = getattr(self.settings, pn) + + label_icon.setPixmap(QtGui.QPixmap(self.icon.pixmap(QtCore.QSize(16, 16)))) + label_icon.setToolTip(getattr(self.help_settings, pn)) + label.setText(pn) + + for index, v in enumerate(values): + combo.addItem(v.name, v) + + if v == setting_current: + combo.setCurrentIndex(index) + + def populate_checkboxes(self): + prefix_checkbox: str = "cb_" + parameter_names: [str] = [ + "lyrics_embed", + "lyrics_file", + "video_download", + "download_delay", + "video_convert_mp4", + ] + + for pn in parameter_names: + checkbox: QtWidgets.QCheckBox = getattr(self.ui, prefix_checkbox + pn) + + checkbox.setText(pn) + checkbox.setToolTip(getattr(self.help_settings, pn)) + checkbox.setIcon(self.icon) + checkbox.setChecked(getattr(self.settings, pn)) + + def accept(self): + # Get settings. TODO + # self.settings_save() + self.accept() diff --git a/tidal_dl_ng/gui.py b/tidal_dl_ng/gui.py index 267ff3b..af751ee 100644 --- a/tidal_dl_ng/gui.py +++ b/tidal_dl_ng/gui.py @@ -5,9 +5,10 @@ from collections.abc import Callable from requests.exceptions import HTTPError from tidal_dl_ng import __version__ -from tidal_dl_ng.dialog import DialogLogin, DialogVersion +from tidal_dl_ng.dialog import DialogLogin, DialogPreferences, DialogVersion from tidal_dl_ng.helper.path import get_format_template from tidal_dl_ng.helper.tidal import items_results_all, search_results_all, user_media_lists +from tidal_dl_ng.model.cfg import Settings as ModelSettings try: import qdarktheme @@ -52,6 +53,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): s_populate_tree_lists: QtCore.Signal = QtCore.Signal(list) s_statusbar_message: QtCore.Signal = QtCore.Signal(object) s_tr_results_add_top_level_item: QtCore.Signal = QtCore.Signal(object) + s_settings_save: QtCore.Signal = QtCore.Signal(object) def __init__(self, tidal: Tidal | None = None): super().__init__() @@ -326,6 +328,9 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): def on_tr_results_add_top_level_item(self, widget_item: QtWidgets.QTreeWidgetItem): self.tr_results.addTopLevelItem(widget_item) + def on_settings_save(self, settings: ModelSettings): + pass + def search(self, query: str, types_media: SearchTypes) -> [ResultItem]: result_search: dict[str, [SearchTypes]] = search_results_all( session=self.tidal.session, needle=query, types_media=types_media @@ -410,10 +415,12 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): self.s_populate_tree_lists.connect(self.on_populate_tree_lists) self.s_statusbar_message.connect(self.on_statusbar_message) self.s_tr_results_add_top_level_item.connect(self.on_tr_results_add_top_level_item) + self.s_settings_save.connect(self.on_settings_save) # Menubar self.a_exit.triggered.connect(sys.exit) self.a_version.triggered.connect(self.on_version) + self.a_preferences.triggered.connect(self.on_preferences) # Results self.tr_results.itemExpanded.connect(self.on_tr_results_expanded) @@ -520,6 +527,9 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): def on_version(self) -> None: DialogVersion(self) + def on_preferences(self) -> None: + DialogPreferences(settings=self.settings.data, settings_save=self.s_settings_save, parent=self) + def on_tr_results_expanded(self, child: QtWidgets.QTreeWidgetItem) -> None: child.removeChild(child.child(0)) media_list: [Mix | Album | Playlist] = child.data(5, QtCore.Qt.ItemDataRole.UserRole) diff --git a/tidal_dl_ng/ui/dialog_settings.py b/tidal_dl_ng/ui/dialog_settings.py new file mode 100644 index 0000000..019fdc6 --- /dev/null +++ b/tidal_dl_ng/ui/dialog_settings.py @@ -0,0 +1,493 @@ +################################################################################ +## Form generated from reading UI file 'dialog_settings.ui' +## +## Created by: Qt User Interface Compiler version 6.6.1 +## +## WARNING! All changes made in this file will be lost when recompiling UI file! +################################################################################ + +from PySide6.QtCore import QCoreApplication, QMetaObject, Qt +from PySide6.QtWidgets import ( + QCheckBox, + QComboBox, + QDialogButtonBox, + QGroupBox, + QHBoxLayout, + QLabel, + QLayout, + QLineEdit, + QPushButton, + QSizePolicy, + QVBoxLayout, +) + + +class Ui_DialogSettings: + def setupUi(self, DialogSettings): + if not DialogSettings.objectName(): + DialogSettings.setObjectName("DialogSettings") + DialogSettings.resize(640, 682) + sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) + sizePolicy.setHorizontalStretch(100) + sizePolicy.setVerticalStretch(100) + sizePolicy.setHeightForWidth(DialogSettings.sizePolicy().hasHeightForWidth()) + DialogSettings.setSizePolicy(sizePolicy) + DialogSettings.setSizeGripEnabled(True) + self.lv_dialog_settings = QVBoxLayout(DialogSettings) + self.lv_dialog_settings.setObjectName("lv_dialog_settings") + self.lv_dialog_settings.setContentsMargins(0, 0, 0, 0) + self.lv_main = QVBoxLayout() + self.lv_main.setObjectName("lv_main") + self.lv_main.setContentsMargins(12, 12, 12, 12) + self.gb_flags = QGroupBox(DialogSettings) + self.gb_flags.setObjectName("gb_flags") + sizePolicy1 = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) + sizePolicy1.setHorizontalStretch(100) + sizePolicy1.setVerticalStretch(100) + sizePolicy1.setHeightForWidth(self.gb_flags.sizePolicy().hasHeightForWidth()) + self.gb_flags.setSizePolicy(sizePolicy1) + self.gb_flags.setFlat(False) + self.gb_flags.setCheckable(False) + self.lv_flags = QVBoxLayout(self.gb_flags) + self.lv_flags.setObjectName("lv_flags") + self.lh_flags_1 = QHBoxLayout() + self.lh_flags_1.setObjectName("lh_flags_1") + self.lv_flags_video_download = QVBoxLayout() + self.lv_flags_video_download.setObjectName("lv_flags_video_download") + self.cb_video_download = QCheckBox(self.gb_flags) + self.cb_video_download.setObjectName("cb_video_download") + sizePolicy1.setHeightForWidth(self.cb_video_download.sizePolicy().hasHeightForWidth()) + self.cb_video_download.setSizePolicy(sizePolicy1) + + self.lv_flags_video_download.addWidget(self.cb_video_download) + + self.lh_flags_1.addLayout(self.lv_flags_video_download) + + self.lv_flags_video_convert = QVBoxLayout() + self.lv_flags_video_convert.setObjectName("lv_flags_video_convert") + self.cb_video_convert_mp4 = QCheckBox(self.gb_flags) + self.cb_video_convert_mp4.setObjectName("cb_video_convert_mp4") + sizePolicy1.setHeightForWidth(self.cb_video_convert_mp4.sizePolicy().hasHeightForWidth()) + self.cb_video_convert_mp4.setSizePolicy(sizePolicy1) + + self.lv_flags_video_convert.addWidget(self.cb_video_convert_mp4) + + self.lh_flags_1.addLayout(self.lv_flags_video_convert) + + self.lv_flags.addLayout(self.lh_flags_1) + + self.lh_flags_2 = QHBoxLayout() + self.lh_flags_2.setObjectName("lh_flags_2") + self.lh_flags_lyrics_embed = QHBoxLayout() + self.lh_flags_lyrics_embed.setObjectName("lh_flags_lyrics_embed") + self.cb_lyrics_embed = QCheckBox(self.gb_flags) + self.cb_lyrics_embed.setObjectName("cb_lyrics_embed") + sizePolicy2 = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) + sizePolicy2.setHorizontalStretch(0) + sizePolicy2.setVerticalStretch(0) + sizePolicy2.setHeightForWidth(self.cb_lyrics_embed.sizePolicy().hasHeightForWidth()) + self.cb_lyrics_embed.setSizePolicy(sizePolicy2) + + self.lh_flags_lyrics_embed.addWidget(self.cb_lyrics_embed) + + self.lh_flags_2.addLayout(self.lh_flags_lyrics_embed) + + self.lh_flags_lyrics_file = QHBoxLayout() + self.lh_flags_lyrics_file.setObjectName("lh_flags_lyrics_file") + self.cb_lyrics_file = QCheckBox(self.gb_flags) + self.cb_lyrics_file.setObjectName("cb_lyrics_file") + sizePolicy1.setHeightForWidth(self.cb_lyrics_file.sizePolicy().hasHeightForWidth()) + self.cb_lyrics_file.setSizePolicy(sizePolicy1) + + self.lh_flags_lyrics_file.addWidget(self.cb_lyrics_file) + + self.lh_flags_2.addLayout(self.lh_flags_lyrics_file) + + self.lv_flags.addLayout(self.lh_flags_2) + + self.lh_flag_3 = QHBoxLayout() + self.lh_flag_3.setObjectName("lh_flag_3") + self.lv_flag_download_delay = QVBoxLayout() + self.lv_flag_download_delay.setObjectName("lv_flag_download_delay") + self.cb_download_delay = QCheckBox(self.gb_flags) + self.cb_download_delay.setObjectName("cb_download_delay") + sizePolicy1.setHeightForWidth(self.cb_download_delay.sizePolicy().hasHeightForWidth()) + self.cb_download_delay.setSizePolicy(sizePolicy1) + + self.lv_flag_download_delay.addWidget(self.cb_download_delay) + + self.lh_flag_3.addLayout(self.lv_flag_download_delay) + + self.verticalLayout_4 = QVBoxLayout() + self.verticalLayout_4.setObjectName("verticalLayout_4") + + self.lh_flag_3.addLayout(self.verticalLayout_4) + + self.lv_flags.addLayout(self.lh_flag_3) + + self.lv_main.addWidget(self.gb_flags) + + self.gb_choices = QGroupBox(DialogSettings) + self.gb_choices.setObjectName("gb_choices") + sizePolicy3 = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed) + sizePolicy3.setHorizontalStretch(0) + sizePolicy3.setVerticalStretch(0) + sizePolicy3.setHeightForWidth(self.gb_choices.sizePolicy().hasHeightForWidth()) + self.gb_choices.setSizePolicy(sizePolicy3) + self.lv_choices = QVBoxLayout(self.gb_choices) + self.lv_choices.setObjectName("lv_choices") + self.lh_choices_skip_existing = QHBoxLayout() + self.lh_choices_skip_existing.setObjectName("lh_choices_skip_existing") + self.l_icon_skip_existing = QLabel(self.gb_choices) + self.l_icon_skip_existing.setObjectName("l_icon_skip_existing") + sizePolicy4 = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) + sizePolicy4.setHorizontalStretch(0) + sizePolicy4.setVerticalStretch(0) + sizePolicy4.setHeightForWidth(self.l_icon_skip_existing.sizePolicy().hasHeightForWidth()) + self.l_icon_skip_existing.setSizePolicy(sizePolicy4) + + self.lh_choices_skip_existing.addWidget(self.l_icon_skip_existing) + + self.l_skip_existing = QLabel(self.gb_choices) + self.l_skip_existing.setObjectName("l_skip_existing") + sizePolicy4.setHeightForWidth(self.l_skip_existing.sizePolicy().hasHeightForWidth()) + self.l_skip_existing.setSizePolicy(sizePolicy4) + + self.lh_choices_skip_existing.addWidget(self.l_skip_existing) + + self.c_skip_existing = QComboBox(self.gb_choices) + self.c_skip_existing.setObjectName("c_skip_existing") + + self.lh_choices_skip_existing.addWidget(self.c_skip_existing) + + self.lh_choices_skip_existing.setStretch(2, 50) + + self.lv_choices.addLayout(self.lh_choices_skip_existing) + + self.lh_choices_quality_audio = QHBoxLayout() + self.lh_choices_quality_audio.setObjectName("lh_choices_quality_audio") + self.l_icon_quality_audio = QLabel(self.gb_choices) + self.l_icon_quality_audio.setObjectName("l_icon_quality_audio") + sizePolicy4.setHeightForWidth(self.l_icon_quality_audio.sizePolicy().hasHeightForWidth()) + self.l_icon_quality_audio.setSizePolicy(sizePolicy4) + + self.lh_choices_quality_audio.addWidget(self.l_icon_quality_audio) + + self.l_quality_audio = QLabel(self.gb_choices) + self.l_quality_audio.setObjectName("l_quality_audio") + sizePolicy4.setHeightForWidth(self.l_quality_audio.sizePolicy().hasHeightForWidth()) + self.l_quality_audio.setSizePolicy(sizePolicy4) + + self.lh_choices_quality_audio.addWidget(self.l_quality_audio) + + self.c_quality_audio = QComboBox(self.gb_choices) + self.c_quality_audio.setObjectName("c_quality_audio") + + self.lh_choices_quality_audio.addWidget(self.c_quality_audio) + + self.lh_choices_quality_audio.setStretch(2, 50) + + self.lv_choices.addLayout(self.lh_choices_quality_audio) + + self.lh_choices_quality_video = QHBoxLayout() + self.lh_choices_quality_video.setObjectName("lh_choices_quality_video") + self.l_icon_quality_video = QLabel(self.gb_choices) + self.l_icon_quality_video.setObjectName("l_icon_quality_video") + sizePolicy4.setHeightForWidth(self.l_icon_quality_video.sizePolicy().hasHeightForWidth()) + self.l_icon_quality_video.setSizePolicy(sizePolicy4) + + self.lh_choices_quality_video.addWidget(self.l_icon_quality_video) + + self.l_quality_video = QLabel(self.gb_choices) + self.l_quality_video.setObjectName("l_quality_video") + sizePolicy4.setHeightForWidth(self.l_quality_video.sizePolicy().hasHeightForWidth()) + self.l_quality_video.setSizePolicy(sizePolicy4) + + self.lh_choices_quality_video.addWidget(self.l_quality_video) + + self.c_quality_video = QComboBox(self.gb_choices) + self.c_quality_video.setObjectName("c_quality_video") + + self.lh_choices_quality_video.addWidget(self.c_quality_video) + + self.lh_choices_quality_video.setStretch(2, 50) + + self.lv_choices.addLayout(self.lh_choices_quality_video) + + self.lh_choices_cover_dimension = QHBoxLayout() + self.lh_choices_cover_dimension.setObjectName("lh_choices_cover_dimension") + self.lh_choices_cover_dimension.setSizeConstraint(QLayout.SetDefaultConstraint) + self.l_icon_metadata_cover_dimension = QLabel(self.gb_choices) + self.l_icon_metadata_cover_dimension.setObjectName("l_icon_metadata_cover_dimension") + sizePolicy4.setHeightForWidth(self.l_icon_metadata_cover_dimension.sizePolicy().hasHeightForWidth()) + self.l_icon_metadata_cover_dimension.setSizePolicy(sizePolicy4) + + self.lh_choices_cover_dimension.addWidget(self.l_icon_metadata_cover_dimension) + + self.l_metadata_cover_dimension = QLabel(self.gb_choices) + self.l_metadata_cover_dimension.setObjectName("l_metadata_cover_dimension") + sizePolicy4.setHeightForWidth(self.l_metadata_cover_dimension.sizePolicy().hasHeightForWidth()) + self.l_metadata_cover_dimension.setSizePolicy(sizePolicy4) + + self.lh_choices_cover_dimension.addWidget(self.l_metadata_cover_dimension) + + self.c_metadata_cover_dimension = QComboBox(self.gb_choices) + self.c_metadata_cover_dimension.setObjectName("c_metadata_cover_dimension") + sizePolicy5 = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed) + sizePolicy5.setHorizontalStretch(10) + sizePolicy5.setVerticalStretch(0) + sizePolicy5.setHeightForWidth(self.c_metadata_cover_dimension.sizePolicy().hasHeightForWidth()) + self.c_metadata_cover_dimension.setSizePolicy(sizePolicy5) + + self.lh_choices_cover_dimension.addWidget(self.c_metadata_cover_dimension) + + self.lh_choices_cover_dimension.setStretch(2, 50) + + self.lv_choices.addLayout(self.lh_choices_cover_dimension) + + self.lv_main.addWidget(self.gb_choices) + + self.gb_path = QGroupBox(DialogSettings) + self.gb_path.setObjectName("gb_path") + self.horizontalLayout_2 = QHBoxLayout(self.gb_path) + self.horizontalLayout_2.setObjectName("horizontalLayout_2") + self.verticalLayout_2 = QVBoxLayout() + self.verticalLayout_2.setObjectName("verticalLayout_2") + self.lh_path_base = QHBoxLayout() + self.lh_path_base.setObjectName("lh_path_base") + self.l_icon_download_base_path = QLabel(self.gb_path) + self.l_icon_download_base_path.setObjectName("l_icon_download_base_path") + sizePolicy4.setHeightForWidth(self.l_icon_download_base_path.sizePolicy().hasHeightForWidth()) + self.l_icon_download_base_path.setSizePolicy(sizePolicy4) + + self.lh_path_base.addWidget(self.l_icon_download_base_path) + + self.l_download_base_path = QLabel(self.gb_path) + self.l_download_base_path.setObjectName("l_download_base_path") + sizePolicy3.setHeightForWidth(self.l_download_base_path.sizePolicy().hasHeightForWidth()) + self.l_download_base_path.setSizePolicy(sizePolicy3) + + self.lh_path_base.addWidget(self.l_download_base_path) + + self.verticalLayout_2.addLayout(self.lh_path_base) + + self.lh_path_fmt_track = QHBoxLayout() + self.lh_path_fmt_track.setObjectName("lh_path_fmt_track") + self.l_icon_format_track = QLabel(self.gb_path) + self.l_icon_format_track.setObjectName("l_icon_format_track") + sizePolicy4.setHeightForWidth(self.l_icon_format_track.sizePolicy().hasHeightForWidth()) + self.l_icon_format_track.setSizePolicy(sizePolicy4) + + self.lh_path_fmt_track.addWidget(self.l_icon_format_track) + + self.l_format_track = QLabel(self.gb_path) + self.l_format_track.setObjectName("l_format_track") + sizePolicy3.setHeightForWidth(self.l_format_track.sizePolicy().hasHeightForWidth()) + self.l_format_track.setSizePolicy(sizePolicy3) + + self.lh_path_fmt_track.addWidget(self.l_format_track) + + self.verticalLayout_2.addLayout(self.lh_path_fmt_track) + + self.lh_path_fmt_video = QHBoxLayout() + self.lh_path_fmt_video.setObjectName("lh_path_fmt_video") + self.l_icon_format_video = QLabel(self.gb_path) + self.l_icon_format_video.setObjectName("l_icon_format_video") + sizePolicy4.setHeightForWidth(self.l_icon_format_video.sizePolicy().hasHeightForWidth()) + self.l_icon_format_video.setSizePolicy(sizePolicy4) + + self.lh_path_fmt_video.addWidget(self.l_icon_format_video) + + self.l_format_video = QLabel(self.gb_path) + self.l_format_video.setObjectName("l_format_video") + sizePolicy3.setHeightForWidth(self.l_format_video.sizePolicy().hasHeightForWidth()) + self.l_format_video.setSizePolicy(sizePolicy3) + + self.lh_path_fmt_video.addWidget(self.l_format_video) + + self.verticalLayout_2.addLayout(self.lh_path_fmt_video) + + self.lh_path_fmt_album = QHBoxLayout() + self.lh_path_fmt_album.setObjectName("lh_path_fmt_album") + self.l_icon_format_album = QLabel(self.gb_path) + self.l_icon_format_album.setObjectName("l_icon_format_album") + sizePolicy6 = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Preferred) + sizePolicy6.setHorizontalStretch(0) + sizePolicy6.setVerticalStretch(0) + sizePolicy6.setHeightForWidth(self.l_icon_format_album.sizePolicy().hasHeightForWidth()) + self.l_icon_format_album.setSizePolicy(sizePolicy6) + + self.lh_path_fmt_album.addWidget(self.l_icon_format_album) + + self.l_format_album = QLabel(self.gb_path) + self.l_format_album.setObjectName("l_format_album") + sizePolicy3.setHeightForWidth(self.l_format_album.sizePolicy().hasHeightForWidth()) + self.l_format_album.setSizePolicy(sizePolicy3) + + self.lh_path_fmt_album.addWidget(self.l_format_album) + + self.verticalLayout_2.addLayout(self.lh_path_fmt_album) + + self.lh_fpath_mt_playlist = QHBoxLayout() + self.lh_fpath_mt_playlist.setObjectName("lh_fpath_mt_playlist") + self.l_icon_format_playlist = QLabel(self.gb_path) + self.l_icon_format_playlist.setObjectName("l_icon_format_playlist") + sizePolicy4.setHeightForWidth(self.l_icon_format_playlist.sizePolicy().hasHeightForWidth()) + self.l_icon_format_playlist.setSizePolicy(sizePolicy4) + + self.lh_fpath_mt_playlist.addWidget(self.l_icon_format_playlist) + + self.l_format_playlist = QLabel(self.gb_path) + self.l_format_playlist.setObjectName("l_format_playlist") + sizePolicy3.setHeightForWidth(self.l_format_playlist.sizePolicy().hasHeightForWidth()) + self.l_format_playlist.setSizePolicy(sizePolicy3) + + self.lh_fpath_mt_playlist.addWidget(self.l_format_playlist) + + self.verticalLayout_2.addLayout(self.lh_fpath_mt_playlist) + + self.lh_path_fmt_mix = QHBoxLayout() + self.lh_path_fmt_mix.setObjectName("lh_path_fmt_mix") + self.l_icon_format_mix = QLabel(self.gb_path) + self.l_icon_format_mix.setObjectName("l_icon_format_mix") + sizePolicy6.setHeightForWidth(self.l_icon_format_mix.sizePolicy().hasHeightForWidth()) + self.l_icon_format_mix.setSizePolicy(sizePolicy6) + + self.lh_path_fmt_mix.addWidget(self.l_icon_format_mix) + + self.l_format_mix = QLabel(self.gb_path) + self.l_format_mix.setObjectName("l_format_mix") + sizePolicy3.setHeightForWidth(self.l_format_mix.sizePolicy().hasHeightForWidth()) + self.l_format_mix.setSizePolicy(sizePolicy3) + + self.lh_path_fmt_mix.addWidget(self.l_format_mix) + + self.verticalLayout_2.addLayout(self.lh_path_fmt_mix) + + self.horizontalLayout_2.addLayout(self.verticalLayout_2) + + self.verticalLayout = QVBoxLayout() + self.verticalLayout.setObjectName("verticalLayout") + self.horizontalLayout_3 = QHBoxLayout() + self.horizontalLayout_3.setObjectName("horizontalLayout_3") + self.le_download_base_path = QLineEdit(self.gb_path) + self.le_download_base_path.setObjectName("le_download_base_path") + sizePolicy2.setHeightForWidth(self.le_download_base_path.sizePolicy().hasHeightForWidth()) + self.le_download_base_path.setSizePolicy(sizePolicy2) + self.le_download_base_path.setDragEnabled(True) + + self.horizontalLayout_3.addWidget(self.le_download_base_path) + + self.b_download_base_path = QPushButton(self.gb_path) + self.b_download_base_path.setObjectName("b_download_base_path") + + self.horizontalLayout_3.addWidget(self.b_download_base_path) + + self.verticalLayout.addLayout(self.horizontalLayout_3) + + self.horizontalLayout_7 = QHBoxLayout() + self.horizontalLayout_7.setObjectName("horizontalLayout_7") + self.le_format_track = QLineEdit(self.gb_path) + self.le_format_track.setObjectName("le_format_track") + + self.horizontalLayout_7.addWidget(self.le_format_track) + + self.verticalLayout.addLayout(self.horizontalLayout_7) + + self.horizontalLayout_5 = QHBoxLayout() + self.horizontalLayout_5.setObjectName("horizontalLayout_5") + self.le_format_video = QLineEdit(self.gb_path) + self.le_format_video.setObjectName("le_format_video") + + self.horizontalLayout_5.addWidget(self.le_format_video) + + self.verticalLayout.addLayout(self.horizontalLayout_5) + + self.horizontalLayout_6 = QHBoxLayout() + self.horizontalLayout_6.setObjectName("horizontalLayout_6") + self.le_format_album = QLineEdit(self.gb_path) + self.le_format_album.setObjectName("le_format_album") + + self.horizontalLayout_6.addWidget(self.le_format_album) + + self.verticalLayout.addLayout(self.horizontalLayout_6) + + self.horizontalLayout_4 = QHBoxLayout() + self.horizontalLayout_4.setObjectName("horizontalLayout_4") + self.le_format_playlist = QLineEdit(self.gb_path) + self.le_format_playlist.setObjectName("le_format_playlist") + sizePolicy2.setHeightForWidth(self.le_format_playlist.sizePolicy().hasHeightForWidth()) + self.le_format_playlist.setSizePolicy(sizePolicy2) + + self.horizontalLayout_4.addWidget(self.le_format_playlist) + + self.verticalLayout.addLayout(self.horizontalLayout_4) + + self.horizontalLayout_8 = QHBoxLayout() + self.horizontalLayout_8.setObjectName("horizontalLayout_8") + self.le_format_mix = QLineEdit(self.gb_path) + self.le_format_mix.setObjectName("le_format_mix") + + self.horizontalLayout_8.addWidget(self.le_format_mix) + + self.verticalLayout.addLayout(self.horizontalLayout_8) + + self.horizontalLayout_2.addLayout(self.verticalLayout) + + self.horizontalLayout_2.setStretch(1, 50) + + self.lv_main.addWidget(self.gb_path) + + self.bb_dialog = QDialogButtonBox(DialogSettings) + self.bb_dialog.setObjectName("bb_dialog") + self.bb_dialog.setOrientation(Qt.Horizontal) + self.bb_dialog.setStandardButtons(QDialogButtonBox.Cancel | QDialogButtonBox.Ok) + + self.lv_main.addWidget(self.bb_dialog) + + self.lv_dialog_settings.addLayout(self.lv_main) + + self.retranslateUi(DialogSettings) + self.bb_dialog.accepted.connect(DialogSettings.accept) + self.bb_dialog.rejected.connect(DialogSettings.reject) + + QMetaObject.connectSlotsByName(DialogSettings) + + # setupUi + + def retranslateUi(self, DialogSettings): + DialogSettings.setWindowTitle(QCoreApplication.translate("DialogSettings", "Preferences", None)) + self.gb_flags.setTitle(QCoreApplication.translate("DialogSettings", "Flags", None)) + self.cb_video_download.setText(QCoreApplication.translate("DialogSettings", "CheckBox", None)) + self.cb_video_convert_mp4.setText(QCoreApplication.translate("DialogSettings", "CheckBox", None)) + # if QT_CONFIG(whatsthis) + self.cb_lyrics_embed.setWhatsThis("") + # endif // QT_CONFIG(whatsthis) + self.cb_lyrics_embed.setText(QCoreApplication.translate("DialogSettings", "CheckBox", None)) + self.cb_lyrics_file.setText(QCoreApplication.translate("DialogSettings", "CheckBox", None)) + self.cb_download_delay.setText(QCoreApplication.translate("DialogSettings", "CheckBox", None)) + self.gb_choices.setTitle(QCoreApplication.translate("DialogSettings", "Choices", None)) + self.l_icon_skip_existing.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None)) + self.l_skip_existing.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None)) + self.l_icon_quality_audio.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None)) + self.l_quality_audio.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None)) + self.l_icon_quality_video.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None)) + self.l_quality_video.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None)) + self.l_icon_metadata_cover_dimension.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None)) + self.l_metadata_cover_dimension.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None)) + self.gb_path.setTitle(QCoreApplication.translate("DialogSettings", "Path", None)) + self.l_icon_download_base_path.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None)) + self.l_download_base_path.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None)) + self.l_icon_format_track.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None)) + self.l_format_track.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None)) + self.l_icon_format_video.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None)) + self.l_format_video.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None)) + self.l_icon_format_album.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None)) + self.l_format_album.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None)) + self.l_icon_format_playlist.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None)) + self.l_format_playlist.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None)) + self.l_icon_format_mix.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None)) + self.l_format_mix.setText(QCoreApplication.translate("DialogSettings", "TextLabel", None)) + self.b_download_base_path.setText(QCoreApplication.translate("DialogSettings", "...", None)) + + # retranslateUi diff --git a/tidal_dl_ng/ui/dialog_settings.ui b/tidal_dl_ng/ui/dialog_settings.ui new file mode 100644 index 0000000..7826271 --- /dev/null +++ b/tidal_dl_ng/ui/dialog_settings.ui @@ -0,0 +1,645 @@ + + + DialogSettings + + + + 0 + 0 + 640 + 682 + + + + + 100 + 100 + + + + Preferences + + + true + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 12 + + + 12 + + + 12 + + + 12 + + + + + + 100 + 100 + + + + Flags + + + false + + + false + + + + + + + + + + + 100 + 100 + + + + CheckBox + + + + + + + + + + + + 100 + 100 + + + + CheckBox + + + + + + + + + + + + + + + + 0 + 0 + + + + + + + CheckBox + + + + + + + + + + + + 100 + 100 + + + + CheckBox + + + + + + + + + + + + + + + + 100 + 100 + + + + CheckBox + + + + + + + + + + + + + + + + + + 0 + 0 + + + + Choices + + + + + + + + + 0 + 0 + + + + TextLabel + + + + + + + + 0 + 0 + + + + TextLabel + + + + + + + + + + + + + + + 0 + 0 + + + + TextLabel + + + + + + + + 0 + 0 + + + + TextLabel + + + + + + + + + + + + + + + 0 + 0 + + + + TextLabel + + + + + + + + 0 + 0 + + + + TextLabel + + + + + + + + + + + + QLayout::SetDefaultConstraint + + + + + + 0 + 0 + + + + TextLabel + + + + + + + + 0 + 0 + + + + TextLabel + + + + + + + + 10 + 0 + + + + + + + + + + + + + Path + + + + + + + + + + + 0 + 0 + + + + TextLabel + + + + + + + + 0 + 0 + + + + TextLabel + + + + + + + + + + + + 0 + 0 + + + + TextLabel + + + + + + + + 0 + 0 + + + + TextLabel + + + + + + + + + + + + 0 + 0 + + + + TextLabel + + + + + + + + 0 + 0 + + + + TextLabel + + + + + + + + + + + + 0 + 0 + + + + TextLabel + + + + + + + + 0 + 0 + + + + TextLabel + + + + + + + + + + + + 0 + 0 + + + + TextLabel + + + + + + + + 0 + 0 + + + + TextLabel + + + + + + + + + + + + 0 + 0 + + + + TextLabel + + + + + + + + 0 + 0 + + + + TextLabel + + + + + + + + + + + + + + + + 0 + 0 + + + + true + + + + + + + ... + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + + + bb_dialog + accepted() + DialogSettings + accept() + + + 319 + 661 + + + 319 + 340 + + + + + bb_dialog + rejected() + DialogSettings + reject() + + + 319 + 661 + + + 319 + 340 + + + + + diff --git a/tidal_dl_ng/ui/main.py b/tidal_dl_ng/ui/main.py index 50c1b2f..65735e6 100644 --- a/tidal_dl_ng/ui/main.py +++ b/tidal_dl_ng/ui/main.py @@ -35,7 +35,7 @@ class Ui_MainWindow: MainWindow.resize(900, 700) self.a_preferences = QAction(MainWindow) self.a_preferences.setObjectName("a_preferences") - self.a_preferences.setEnabled(False) + self.a_preferences.setEnabled(True) self.a_preferences.setText("Preferences...") self.a_preferences.setIconText("Preferences...") # if QT_CONFIG(tooltip) diff --git a/tidal_dl_ng/ui/main.ui b/tidal_dl_ng/ui/main.ui index 4152dd7..7a5f86f 100644 --- a/tidal_dl_ng/ui/main.ui +++ b/tidal_dl_ng/ui/main.ui @@ -568,7 +568,7 @@ - false + true Preferences... From 0f8670ebbaa52a90f6096bb3d560485d5910c60d Mon Sep 17 00:00:00 2001 From: Robert Honz Date: Sun, 4 Feb 2024 12:50:19 +0100 Subject: [PATCH 3/3] =?UTF-8?q?=E2=9C=A8=20Settings=20will=20be=20saved=20?= =?UTF-8?q?to=20file.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tidal_dl_ng/dialog.py | 112 ++++++++++++++++++++++++------------------ tidal_dl_ng/gui.py | 10 ++-- 2 files changed, 69 insertions(+), 53 deletions(-) diff --git a/tidal_dl_ng/dialog.py b/tidal_dl_ng/dialog.py index c43d5f4..8757675 100644 --- a/tidal_dl_ng/dialog.py +++ b/tidal_dl_ng/dialog.py @@ -6,6 +6,7 @@ from PySide6 import QtCore, QtGui, QtWidgets from tidalapi import Quality as QualityAudio from tidal_dl_ng import __version__ +from tidal_dl_ng.config import Settings from tidal_dl_ng.constants import CoverDimensions, QualityVideo, SkipExisting from tidal_dl_ng.model.cfg import HelpSettings from tidal_dl_ng.model.cfg import Settings as ModelSettings @@ -61,20 +62,52 @@ class DialogPreferences(QtWidgets.QDialog): """Preferences dialog.""" ui: Ui_DialogSettings - settings: ModelSettings - settings_save: QtCore.Signal + settings: Settings + data: ModelSettings + s_settings_save: QtCore.Signal icon: QtGui.QIcon help_settings: HelpSettings + parameters_checkboxes: [str] + parameters_combo: [(str, Enum)] + parameters_line_edit: [str] + prefix_checkbox: str = "cb_" + prefix_label: str = "l_" + prefix_icon: str = "icon_" + prefix_line_edit: str = "le_" + prefix_combo: str = "c_" - def __init__(self, settings: ModelSettings, settings_save: QtCore.Signal, parent=None): + def __init__(self, settings: Settings, settings_save: QtCore.Signal, parent=None): super().__init__(parent) self.settings = settings - self.settings_save = settings_save + self.data = settings.data + self.s_settings_save = settings_save self.help_settings = HelpSettings() pixmapi: QtWidgets.QStyle.StandardPixmap = QtWidgets.QStyle.SP_MessageBoxQuestion self.icon = self.style().standardIcon(pixmapi) + self.parameters_checkboxes = [ + "lyrics_embed", + "lyrics_file", + "video_download", + "download_delay", + "video_convert_mp4", + ] + self.parameters_combo = [ + ("skip_existing", SkipExisting), + ("quality_audio", QualityAudio), + ("quality_video", QualityVideo), + ("metadata_cover_dimension", CoverDimensions), + ] + self.parameters_line_edit = [ + "download_base_path", + "format_album", + "format_playlist", + "format_mix", + "format_track", + "format_video", + ] + # Create an instance of the GUI self.ui = Ui_DialogSettings() @@ -113,49 +146,29 @@ class DialogPreferences(QtWidgets.QDialog): obj_line_edit.setText(str(path)) def populate_line_edit(self): - prefix_label: str = "l_" - prefix_icon: str = "icon_" - prefix_line_edit: str = "le_" - parameter_names: [str] = [ - "download_base_path", - "format_album", - "format_playlist", - "format_mix", - "format_track", - "format_video", - ] - for pn in parameter_names: - label_icon: QtWidgets.QLabel = getattr(self.ui, prefix_label + prefix_icon + pn) - label: QtWidgets.QLabel = getattr(self.ui, prefix_label + pn) - line_edit: QtWidgets.QLineEdit = getattr(self.ui, prefix_line_edit + pn) + for pn in self.parameters_line_edit: + label_icon: QtWidgets.QLabel = getattr(self.ui, self.prefix_label + self.prefix_icon + pn) + label: QtWidgets.QLabel = getattr(self.ui, self.prefix_label + pn) + line_edit: QtWidgets.QLineEdit = getattr(self.ui, self.prefix_line_edit + pn) label_icon.setPixmap(QtGui.QPixmap(self.icon.pixmap(QtCore.QSize(16, 16)))) label_icon.setToolTip(getattr(self.help_settings, pn)) label.setText(pn) - line_edit.setText(getattr(self.settings, pn)) + line_edit.setText(getattr(self.data, pn)) # Base Path File Dialog self.ui.b_download_base_path.clicked.connect(lambda x: self.dialog_dir_open(self.ui.le_download_base_path)) def populate_combo(self): - prefix_label: str = "l_" - prefix_icon: str = "icon_" - prefix_combo: str = "c_" - parameters: [(str, Enum)] = [ - ("skip_existing", SkipExisting), - ("quality_audio", QualityAudio), - ("quality_video", QualityVideo), - ("metadata_cover_dimension", CoverDimensions), - ] - for p in parameters: + for p in self.parameters_combo: pn: str = p[0] values: Enum = p[1] - label_icon: QtWidgets.QLabel = getattr(self.ui, prefix_label + prefix_icon + pn) - label: QtWidgets.QLabel = getattr(self.ui, prefix_label + pn) - combo: QtWidgets.QComboBox = getattr(self.ui, prefix_combo + pn) - setting_current = getattr(self.settings, pn) + label_icon: QtWidgets.QLabel = getattr(self.ui, self.prefix_label + self.prefix_icon + pn) + label: QtWidgets.QLabel = getattr(self.ui, self.prefix_label + pn) + combo: QtWidgets.QComboBox = getattr(self.ui, self.prefix_combo + pn) + setting_current = getattr(self.data, pn) label_icon.setPixmap(QtGui.QPixmap(self.icon.pixmap(QtCore.QSize(16, 16)))) label_icon.setToolTip(getattr(self.help_settings, pn)) @@ -168,24 +181,27 @@ class DialogPreferences(QtWidgets.QDialog): combo.setCurrentIndex(index) def populate_checkboxes(self): - prefix_checkbox: str = "cb_" - parameter_names: [str] = [ - "lyrics_embed", - "lyrics_file", - "video_download", - "download_delay", - "video_convert_mp4", - ] - - for pn in parameter_names: - checkbox: QtWidgets.QCheckBox = getattr(self.ui, prefix_checkbox + pn) + for pn in self.parameters_checkboxes: + checkbox: QtWidgets.QCheckBox = getattr(self.ui, self.prefix_checkbox + pn) checkbox.setText(pn) checkbox.setToolTip(getattr(self.help_settings, pn)) checkbox.setIcon(self.icon) - checkbox.setChecked(getattr(self.settings, pn)) + checkbox.setChecked(getattr(self.data, pn)) def accept(self): # Get settings. TODO - # self.settings_save() - self.accept() + self.to_settings() + self.done(1) + + def to_settings(self): + for item in self.parameters_checkboxes: + setattr(self.settings.data, item, getattr(self.ui, self.prefix_checkbox + item).isChecked()) + + for item in self.parameters_line_edit: + setattr(self.settings.data, item, getattr(self.ui, self.prefix_line_edit + item).text()) + + for item in self.parameters_combo: + setattr(self.settings.data, item[0], getattr(self.ui, self.prefix_combo + item[0]).currentData()) + + self.s_settings_save.emit() diff --git a/tidal_dl_ng/gui.py b/tidal_dl_ng/gui.py index af751ee..81f70a4 100644 --- a/tidal_dl_ng/gui.py +++ b/tidal_dl_ng/gui.py @@ -8,7 +8,6 @@ from tidal_dl_ng import __version__ from tidal_dl_ng.dialog import DialogLogin, DialogPreferences, DialogVersion from tidal_dl_ng.helper.path import get_format_template from tidal_dl_ng.helper.tidal import items_results_all, search_results_all, user_media_lists -from tidal_dl_ng.model.cfg import Settings as ModelSettings try: import qdarktheme @@ -53,7 +52,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): s_populate_tree_lists: QtCore.Signal = QtCore.Signal(list) s_statusbar_message: QtCore.Signal = QtCore.Signal(object) s_tr_results_add_top_level_item: QtCore.Signal = QtCore.Signal(object) - s_settings_save: QtCore.Signal = QtCore.Signal(object) + s_settings_save: QtCore.Signal = QtCore.Signal() def __init__(self, tidal: Tidal | None = None): super().__init__() @@ -328,8 +327,9 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): def on_tr_results_add_top_level_item(self, widget_item: QtWidgets.QTreeWidgetItem): self.tr_results.addTopLevelItem(widget_item) - def on_settings_save(self, settings: ModelSettings): - pass + def on_settings_save(self): + self.settings.save() + self.apply_settings(self.settings) def search(self, query: str, types_media: SearchTypes) -> [ResultItem]: result_search: dict[str, [SearchTypes]] = search_results_all( @@ -528,7 +528,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): DialogVersion(self) def on_preferences(self) -> None: - DialogPreferences(settings=self.settings.data, settings_save=self.s_settings_save, parent=self) + DialogPreferences(settings=self.settings, settings_save=self.s_settings_save, parent=self) def on_tr_results_expanded(self, child: QtWidgets.QTreeWidgetItem) -> None: child.removeChild(child.child(0))