diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml index 4042edd..304d2fd 100644 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -20,7 +20,7 @@ body: - type: input id: version attributes: - label: Version + label: Version App description: What version of our software are you running? placeholder: vX.Y.Z validations: diff --git a/tidal_dl_ng/constants.py b/tidal_dl_ng/constants.py index 2e53eb7..e1780e3 100644 --- a/tidal_dl_ng/constants.py +++ b/tidal_dl_ng/constants.py @@ -36,9 +36,11 @@ class StreamManifestMimeType(Enum): class CoverDimensions(Enum): - Px320: str = "320x320" - Px640: str = "640x640" - Px1280: str = "1280x1280" + Px80: int = 80 + Px160: int = 160 + Px320: int = 320 + Px640: int = 640 + Px1280: int = 1280 class TidalLists(Enum): diff --git a/tidal_dl_ng/download.py b/tidal_dl_ng/download.py index 8b16cd4..f204d9b 100644 --- a/tidal_dl_ng/download.py +++ b/tidal_dl_ng/download.py @@ -21,7 +21,6 @@ from tidal_dl_ng.constants import ( EXTENSION_LYRICS, REQUESTS_TIMEOUT_SEC, AudioExtensions, - CoverDimensions, MediaType, SkipExisting, StreamManifestMimeType, @@ -272,12 +271,6 @@ class Download: # Move it. shutil.move(tmp_lyrics_file_path, os.path.splitext(file_media_dst)[0] + EXTENSION_LYRICS) - def cover_url(self, sid: str, dimension: CoverDimensions = CoverDimensions.Px320): - if sid is None: - return "" - - return f"https://resources.tidal.com/images/{sid.replace('-', '/')}/{dimension.value}.jpg" - def lyrics_write_file(self, file_path: str, lyrics: str) -> str: result: str = file_path @@ -332,9 +325,7 @@ class Download: totaltrack=track.album.num_tracks if track.album and track.album.num_tracks else 1, totaldisc=track.album.num_volumes if track.album and track.album.num_volumes else 1, discnumber=track.volume_num if track.volume_num else 1, - url_cover=( - self.cover_url(track.album.cover, self.settings.data.metadata_cover_dimension) if track.album else "" - ), + url_cover=track.album.image(self.settings.data.metadata_cover_dimension.value), ) m.save() diff --git a/tidal_dl_ng/gui.py b/tidal_dl_ng/gui.py index 51a50dc..9c13e3f 100644 --- a/tidal_dl_ng/gui.py +++ b/tidal_dl_ng/gui.py @@ -6,6 +6,7 @@ from requests.exceptions import HTTPError from tidal_dl_ng import __version__, update_available from tidal_dl_ng.dialog import DialogLogin, DialogPreferences, DialogVersion +from tidal_dl_ng.helper.gui import get_results_media_item, get_user_list_media_item from tidal_dl_ng.helper.path import get_format_template from tidal_dl_ng.helper.tidal import ( get_tidal_media_id, @@ -17,6 +18,7 @@ from tidal_dl_ng.helper.tidal import ( search_results_all, user_media_lists, ) +from tidal_dl_ng.metadata import Metadata try: import qdarktheme @@ -51,6 +53,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): threadpool: QtCore.QThreadPool tray: QtWidgets.QSystemTrayIcon spinner: QtWaitingSpinner + cover_url_current: str s_spinner_start: QtCore.Signal = QtCore.Signal(QtWidgets.QWidget) s_spinner_stop: QtCore.Signal = QtCore.Signal() pb_item: QtWidgets.QProgressBar @@ -83,6 +86,8 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): self._init_tree_results(self.tr_results) self._init_tree_lists(self.tr_lists_user) + self._init_table_queue(self.ta_queue_dl) + self._init_info() self._init_progressbar() self._populate_quality(self.cb_quality_audio, Quality) self._populate_quality(self.cb_quality_video, QualityVideo) @@ -158,6 +163,9 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): # self.pb_progress.setVisible() self.statusbar.addPermanentWidget(pb) + def _init_info(self): + self.l_pm_cover.setPixmap(QtGui.QPixmap("tidal_dl_ng/ui/default_album_image.png")) + def on_progress_reset(self): self.pb_list.setValue(0) self.pb_item.setValue(0) @@ -187,8 +195,12 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): self.cb_search_type.setCurrentIndex(2) def _init_tree_results(self, tree: QtWidgets.QTableWidget): - tree.setColumnHidden(5, True) tree.sortByColumn(0, QtCore.Qt.SortOrder.AscendingOrder) + tree.setColumnHidden(1, True) + + def _init_table_queue(self, tree: QtWidgets.QTableWidget): + tree.sortByColumn(0, QtCore.Qt.SortOrder.AscendingOrder) + tree.setColumnHidden(1, True) def tidal_user_lists(self): # Start loading spinner @@ -230,8 +242,8 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): info: str = item.sub_title twi_child.setText(0, name) - twi_child.setText(1, info) - twi_child.setData(3, QtCore.Qt.ItemDataRole.UserRole, item) + twi_child.setData(1, QtCore.Qt.ItemDataRole.UserRole, item) + twi_child.setText(2, info) # Stop load spinner self.s_spinner_stop.emit() @@ -240,8 +252,8 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): def _init_tree_lists(self, tree: QtWidgets.QTreeWidget): # Adjust Tree. tree.setColumnWidth(0, 200) - tree.setColumnWidth(1, 300) - tree.setColumnHidden(2, True) + tree.setColumnHidden(1, True) + tree.setColumnWidth(2, 300) tree.expandAll() # Connect the contextmenu @@ -295,14 +307,26 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): self.thread_it(self.on_download_list_media, point) self.thread_it(self.list_items_show_result, point=point) - def on_download_list_media(self, point: QtCore.QPoint): + def on_download_list_media(self, point: QtCore.QPoint = None): self.pb_download.setEnabled(False) self.pb_download.setText("Downloading...") - item = self.tr_lists_user.itemAt(point) - media = item.data(3, QtCore.Qt.ItemDataRole.UserRole) + item: QtWidgets.QTreeWidgetItem - self.download(media, self.dl) + if point: + item = self.tr_lists_user.itemAt(point) + else: + items: [QtWidgets.QTreeWidgetItem] = self.tr_lists_user.selectedItems() + + if len(items) == 0: + logger_gui.error("Please select a row first.") + else: + item = items[0] + + if item: + media = get_user_list_media_item(item) + + self.download(media, self.dl) self.pb_download.setText("Download") self.pb_download.setEnabled(True) @@ -344,11 +368,11 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): # Populate child child: QtWidgets.QTreeWidgetItem = QtWidgets.QTreeWidgetItem() child.setText(0, index) - child.setText(1, item.artist) - child.setText(2, item.title) - child.setText(3, item.album) - child.setText(4, duration) - child.setData(5, QtCore.Qt.ItemDataRole.UserRole, item.obj) + child.setData(1, QtCore.Qt.ItemDataRole.UserRole, item.obj) + child.setText(2, item.artist) + child.setText(3, item.title) + child.setText(4, item.album) + child.setText(5, duration) if isinstance(item.obj, Mix | Playlist | Album | Artist): # Add a disabled dummy child, so expansion arrow will appear. This Child will be replaced on expansion. @@ -474,6 +498,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): def _init_signals(self): self.pb_download.clicked.connect(lambda: self.thread_it(self.on_download_results)) + self.pb_download_list.clicked.connect(lambda: self.thread_it(self.on_download_list_media)) self.l_search.returnPressed.connect( lambda: self.search_populate_results(self.l_search.text(), self.cb_search_type.currentData()) ) @@ -508,6 +533,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): # Results self.tr_results.itemExpanded.connect(self.on_tr_results_expanded) + self.tr_results.itemClicked.connect(self.on_result_item_clicked) def on_logout(self): result: bool = self.tidal.logout() @@ -542,12 +568,23 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): self.tidal.settings_apply() def on_list_items_show(self, item: QtWidgets.QTreeWidgetItem): - media_list: Album | Playlist = item.data(3, QtCore.Qt.ItemDataRole.UserRole) + media_list: Album | Playlist = item.data(1, QtCore.Qt.ItemDataRole.UserRole) # Only if clicked item is not a top level item. if media_list: self.list_items_show_result(media_list) + def on_result_item_clicked(self, item: QtWidgets.QTreeWidgetItem, column: int) -> None: + media: Track | Video | Album | Artist = get_results_media_item(item) + cover_url: str = media.album.image() + + if self.cover_url_current != cover_url: + self.cover_url_current = cover_url + data_cover: bytes = Metadata.cover_data(cover_url) + pixmap: QtGui.QPixmap = QtGui.QPixmap() + pixmap.loadFromData(data_cover) + self.l_pm_cover.setPixmap(pixmap) + def list_items_show_result( self, media_list: Album | Playlist | Mix | Artist | None = None, @@ -556,7 +593,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): ) -> None: if point: item = self.tr_lists_user.itemAt(point) - media_list = item.data(3, QtCore.Qt.ItemDataRole.UserRole) + media_list = item.data(1, QtCore.Qt.ItemDataRole.UserRole) # Get all results media_items: [Track | Video | Album] = items_results_all(media_list) @@ -582,11 +619,11 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): else: # If it is an artist resolve it with all available albums of him if len(items) == 1: - tmp_media: QtWidgets.QTreeWidgetItem = items[0].data(5, QtCore.Qt.ItemDataRole.UserRole) + tmp_media: QtWidgets.QTreeWidgetItem = items[0].data(1, QtCore.Qt.ItemDataRole.UserRole) if isinstance(tmp_media, Artist): tmp_children: [QtWidgets.QTreeWidgetItem] = [] - is_dummy_child = not bool(items[0].child(0).data(5, QtCore.Qt.ItemDataRole.UserRole)) + is_dummy_child = not bool(items[0].child(0).data(1, QtCore.Qt.ItemDataRole.UserRole)) # Use the expand function to retrieve all albums. if is_dummy_child: @@ -603,7 +640,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): items_pos_last = len(items) - 1 for item in items: - media: Track | Album | Playlist | Video | Artist = item.data(5, QtCore.Qt.ItemDataRole.UserRole) + media: Track | Album | Playlist | Video | Artist = item.data(1, QtCore.Qt.ItemDataRole.UserRole) # Skip only if Track item, skip option set and the item is not the last in the list. download_delay: bool = bool( isinstance(media, Track | Video) @@ -650,7 +687,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): if load_children: list_item.removeChild(list_item.child(0)) - media_list: [Mix | Album | Playlist | Artist] = list_item.data(5, QtCore.Qt.ItemDataRole.UserRole) + media_list: [Mix | Album | Playlist | Artist] = list_item.data(1, QtCore.Qt.ItemDataRole.UserRole) self.list_items_show_result(media_list=media_list, parent=list_item) diff --git a/tidal_dl_ng/helper/gui.py b/tidal_dl_ng/helper/gui.py new file mode 100644 index 0000000..604772e --- /dev/null +++ b/tidal_dl_ng/helper/gui.py @@ -0,0 +1,37 @@ +from PySide6 import QtCore, QtWidgets +from tidalapi import Album, Mix, Playlist, Track, UserPlaylist, Video +from tidalapi.artist import Artist + + +def get_table_data( + item: QtWidgets.QTreeWidgetItem, column: int +) -> Track | Video | Album | Artist | Mix | Playlist | UserPlaylist: + result: Track | Video | Album | Artist = item.data(column, QtCore.Qt.ItemDataRole.UserRole) + + return result + + +def get_results_media_item(item: QtWidgets.QTreeWidgetItem) -> Track | Video | Album | Artist: + result: Track | Video | Album | Artist = get_table_data(item, 1) + + return result + + +def get_user_list_media_item(item: QtWidgets.QTreeWidgetItem) -> Mix | Playlist | UserPlaylist: + result: Mix | Playlist | UserPlaylist = get_table_data(item, 1) + + return result + + +def set_table_data( + item: QtWidgets.QTreeWidgetItem, data: Track | Video | Album | Artist | Mix | Playlist | UserPlaylist, column: int +): + item.setData(column, QtCore.Qt.ItemDataRole.UserRole, data) + + +def set_results_media(item: QtWidgets.QTreeWidgetItem, media: Track | Video | Album | Artist): + set_table_data(item, media, 1) + + +def set_user_list_media(item: QtWidgets.QTreeWidgetItem, media: Mix | Playlist | UserPlaylist): + set_table_data(item, media, 1) diff --git a/tidal_dl_ng/metadata.py b/tidal_dl_ng/metadata.py index 4506742..35029f8 100644 --- a/tidal_dl_ng/metadata.py +++ b/tidal_dl_ng/metadata.py @@ -142,7 +142,8 @@ class Metadata: self.m.tags["\xa9wrt"] = ", ".join(self.composer) if self.composer else "" self.m.tags["\xa9lyr"] = self.lyrics - def cover_data(self, url: str = None, path_file: str = None) -> str | bytes: + @staticmethod + def cover_data(url: str = None, path_file: str = None) -> str | bytes: result: str | bytes = "" if url: diff --git a/tidal_dl_ng/ui/default_album_image.png b/tidal_dl_ng/ui/default_album_image.png new file mode 100644 index 0000000..0ab51f1 Binary files /dev/null and b/tidal_dl_ng/ui/default_album_image.png differ diff --git a/tidal_dl_ng/ui/main.py b/tidal_dl_ng/ui/main.py index bd21113..f346b8d 100644 --- a/tidal_dl_ng/ui/main.py +++ b/tidal_dl_ng/ui/main.py @@ -7,13 +7,13 @@ ################################################################################ from PySide6.QtCore import QCoreApplication, QLocale, QMetaObject, QRect, QSize, Qt -from PySide6.QtGui import QAction +from PySide6.QtGui import QAction, QFont, QPixmap from PySide6.QtWidgets import ( QAbstractItemView, QComboBox, + QFrame, QHBoxLayout, QLabel, - QLayout, QLineEdit, QMenu, QMenuBar, @@ -21,6 +21,8 @@ from PySide6.QtWidgets import ( QPushButton, QSizePolicy, QStatusBar, + QTableWidget, + QTableWidgetItem, QTreeWidget, QTreeWidgetItem, QVBoxLayout, @@ -32,7 +34,7 @@ class Ui_MainWindow: def setupUi(self, MainWindow): if not MainWindow.objectName(): MainWindow.setObjectName("MainWindow") - MainWindow.resize(900, 700) + MainWindow.resize(1200, 800) self.a_preferences = QAction(MainWindow) self.a_preferences.setObjectName("a_preferences") self.a_preferences.setEnabled(True) @@ -80,14 +82,11 @@ class Ui_MainWindow: # endif // QT_CONFIG(accessibility) self.horizontalLayout = QHBoxLayout(self.w_central) self.horizontalLayout.setObjectName("horizontalLayout") - self.lh_main = QHBoxLayout() - self.lh_main.setObjectName("lh_main") - self.lh_main.setSizeConstraint(QLayout.SetNoConstraint) - self.verticalLayout = QVBoxLayout() - self.verticalLayout.setObjectName("verticalLayout") + self.lv_list_user = QVBoxLayout() + self.lv_list_user.setObjectName("lv_list_user") self.tr_lists_user = QTreeWidget(self.w_central) __qtreewidgetitem = QTreeWidgetItem() - __qtreewidgetitem.setText(1, "Info") + __qtreewidgetitem.setText(2, "Info") __qtreewidgetitem.setText(0, "Name") self.tr_lists_user.setHeaderItem(__qtreewidgetitem) __qtreewidgetitem1 = QTreeWidgetItem(self.tr_lists_user) @@ -121,8 +120,10 @@ class Ui_MainWindow: self.tr_lists_user.header().setHighlightSections(True) self.tr_lists_user.header().setProperty("showSortIndicator", True) - self.verticalLayout.addWidget(self.tr_lists_user) + self.lv_list_user.addWidget(self.tr_lists_user) + self.lv_list_control = QHBoxLayout() + self.lv_list_control.setObjectName("lv_list_control") self.pb_reload_user_lists = QPushButton(self.w_central) self.pb_reload_user_lists.setObjectName("pb_reload_user_lists") sizePolicy1 = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) @@ -131,9 +132,18 @@ class Ui_MainWindow: sizePolicy1.setHeightForWidth(self.pb_reload_user_lists.sizePolicy().hasHeightForWidth()) self.pb_reload_user_lists.setSizePolicy(sizePolicy1) - self.verticalLayout.addWidget(self.pb_reload_user_lists) + self.lv_list_control.addWidget(self.pb_reload_user_lists) - self.lh_main.addLayout(self.verticalLayout) + self.pb_download_list = QPushButton(self.w_central) + self.pb_download_list.setObjectName("pb_download_list") + sizePolicy1.setHeightForWidth(self.pb_download_list.sizePolicy().hasHeightForWidth()) + self.pb_download_list.setSizePolicy(sizePolicy1) + + self.lv_list_control.addWidget(self.pb_download_list) + + self.lv_list_user.addLayout(self.lv_list_control) + + self.horizontalLayout.addLayout(self.lv_list_user) self.lv_search_result = QVBoxLayout() # ifndef Q_OS_MAC @@ -377,17 +387,91 @@ class Ui_MainWindow: self.lv_search_result.addWidget(self.te_debug) - self.lh_main.addLayout(self.lv_search_result) + self.horizontalLayout.addLayout(self.lv_search_result) - self.lh_main.setStretch(0, 40) - self.lh_main.setStretch(1, 60) + self.lv_info = QVBoxLayout() + self.lv_info.setObjectName("lv_info") + self.lv_info_item = QVBoxLayout() + self.lv_info_item.setObjectName("lv_info_item") + self.horizontalLayout_2 = QHBoxLayout() + self.horizontalLayout_2.setObjectName("horizontalLayout_2") + self.l_pm_cover = QLabel(self.w_central) + self.l_pm_cover.setObjectName("l_pm_cover") + sizePolicy3 = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) + sizePolicy3.setHorizontalStretch(0) + sizePolicy3.setVerticalStretch(0) + sizePolicy3.setHeightForWidth(self.l_pm_cover.sizePolicy().hasHeightForWidth()) + self.l_pm_cover.setSizePolicy(sizePolicy3) + self.l_pm_cover.setMaximumSize(QSize(280, 280)) + self.l_pm_cover.setBaseSize(QSize(0, 0)) + self.l_pm_cover.setFrameShape(QFrame.NoFrame) + self.l_pm_cover.setPixmap(QPixmap("default_album_image.png")) + self.l_pm_cover.setScaledContents(True) + self.l_pm_cover.setAlignment(Qt.AlignHCenter | Qt.AlignTop) - self.horizontalLayout.addLayout(self.lh_main) + self.horizontalLayout_2.addWidget(self.l_pm_cover) + self.lv_info_item.addLayout(self.horizontalLayout_2) + + self.lv_info.addLayout(self.lv_info_item) + + self.lv_queue_dl = QVBoxLayout() + self.lv_queue_dl.setObjectName("lv_queue_dl") + self.l_h_queue_dl = QLabel(self.w_central) + self.l_h_queue_dl.setObjectName("l_h_queue_dl") + font = QFont() + font.setBold(True) + font.setItalic(False) + font.setKerning(True) + self.l_h_queue_dl.setFont(font) + + self.lv_queue_dl.addWidget(self.l_h_queue_dl) + + self.ta_queue_dl = QTableWidget(self.w_central) + if self.ta_queue_dl.columnCount() < 5: + self.ta_queue_dl.setColumnCount(5) + __qtablewidgetitem = QTableWidgetItem() + __qtablewidgetitem.setTextAlignment(Qt.AlignLeading | Qt.AlignVCenter) + self.ta_queue_dl.setHorizontalHeaderItem(0, __qtablewidgetitem) + __qtablewidgetitem1 = QTableWidgetItem() + self.ta_queue_dl.setHorizontalHeaderItem(1, __qtablewidgetitem1) + __qtablewidgetitem2 = QTableWidgetItem() + __qtablewidgetitem2.setTextAlignment(Qt.AlignLeading | Qt.AlignVCenter) + self.ta_queue_dl.setHorizontalHeaderItem(2, __qtablewidgetitem2) + __qtablewidgetitem3 = QTableWidgetItem() + __qtablewidgetitem3.setTextAlignment(Qt.AlignLeading | Qt.AlignVCenter) + self.ta_queue_dl.setHorizontalHeaderItem(3, __qtablewidgetitem3) + __qtablewidgetitem4 = QTableWidgetItem() + __qtablewidgetitem4.setTextAlignment(Qt.AlignLeading | Qt.AlignVCenter) + self.ta_queue_dl.setHorizontalHeaderItem(4, __qtablewidgetitem4) + self.ta_queue_dl.setObjectName("ta_queue_dl") + self.ta_queue_dl.setEditTriggers(QAbstractItemView.NoEditTriggers) + self.ta_queue_dl.setTabKeyNavigation(False) + self.ta_queue_dl.setProperty("showDropIndicator", False) + self.ta_queue_dl.setDragDropOverwriteMode(False) + self.ta_queue_dl.setSelectionMode(QAbstractItemView.ExtendedSelection) + self.ta_queue_dl.setSelectionBehavior(QAbstractItemView.SelectRows) + self.ta_queue_dl.setSortingEnabled(True) + self.ta_queue_dl.verticalHeader().setProperty("showSortIndicator", True) + + self.lv_queue_dl.addWidget(self.ta_queue_dl) + + self.pb_queue_item_remove = QPushButton(self.w_central) + self.pb_queue_item_remove.setObjectName("pb_queue_item_remove") + self.pb_queue_item_remove.setEnabled(False) + + self.lv_queue_dl.addWidget(self.pb_queue_item_remove) + + self.lv_info.addLayout(self.lv_queue_dl) + + self.horizontalLayout.addLayout(self.lv_info) + + self.horizontalLayout.setStretch(1, 50) + self.horizontalLayout.setStretch(2, 25) MainWindow.setCentralWidget(self.w_central) self.menubar = QMenuBar(MainWindow) self.menubar.setObjectName("menubar") - self.menubar.setGeometry(QRect(0, 0, 900, 24)) + self.menubar.setGeometry(QRect(0, 0, 1200, 24)) # if QT_CONFIG(tooltip) self.menubar.setToolTip("") # endif // QT_CONFIG(tooltip) @@ -464,7 +548,7 @@ class Ui_MainWindow: self.a_logout.setText(QCoreApplication.translate("MainWindow", "Logout", None)) self.a_updates_check.setText(QCoreApplication.translate("MainWindow", "Check for Updates", None)) ___qtreewidgetitem = self.tr_lists_user.headerItem() - ___qtreewidgetitem.setText(2, QCoreApplication.translate("MainWindow", "obj", None)) + ___qtreewidgetitem.setText(1, QCoreApplication.translate("MainWindow", "obj", None)) __sortingEnabled = self.tr_lists_user.isSortingEnabled() self.tr_lists_user.setSortingEnabled(False) @@ -477,14 +561,29 @@ class Ui_MainWindow: self.tr_lists_user.setSortingEnabled(__sortingEnabled) self.pb_reload_user_lists.setText(QCoreApplication.translate("MainWindow", "Reload", None)) + self.pb_download_list.setText(QCoreApplication.translate("MainWindow", "Download List", None)) ___qtreewidgetitem4 = self.tr_results.headerItem() - ___qtreewidgetitem4.setText(5, QCoreApplication.translate("MainWindow", "obj", None)) - ___qtreewidgetitem4.setText(4, QCoreApplication.translate("MainWindow", "Duration", None)) - ___qtreewidgetitem4.setText(3, QCoreApplication.translate("MainWindow", "Album", None)) - ___qtreewidgetitem4.setText(2, QCoreApplication.translate("MainWindow", "Title", None)) - ___qtreewidgetitem4.setText(1, QCoreApplication.translate("MainWindow", "Artist", None)) + ___qtreewidgetitem4.setText(6, QCoreApplication.translate("MainWindow", "Quality", None)) + ___qtreewidgetitem4.setText(5, QCoreApplication.translate("MainWindow", "Duration", None)) + ___qtreewidgetitem4.setText(4, QCoreApplication.translate("MainWindow", "Album", None)) + ___qtreewidgetitem4.setText(3, QCoreApplication.translate("MainWindow", "Title", None)) + ___qtreewidgetitem4.setText(2, QCoreApplication.translate("MainWindow", "Artist", None)) + ___qtreewidgetitem4.setText(1, QCoreApplication.translate("MainWindow", "obj", None)) ___qtreewidgetitem4.setText(0, QCoreApplication.translate("MainWindow", "#", None)) self.te_debug.setPlaceholderText(QCoreApplication.translate("MainWindow", "Logs...", None)) + self.l_pm_cover.setText("") + self.l_h_queue_dl.setText(QCoreApplication.translate("MainWindow", "Download Queue", None)) + ___qtablewidgetitem = self.ta_queue_dl.horizontalHeaderItem(0) + ___qtablewidgetitem.setText(QCoreApplication.translate("MainWindow", "#", None)) + ___qtablewidgetitem1 = self.ta_queue_dl.horizontalHeaderItem(1) + ___qtablewidgetitem1.setText(QCoreApplication.translate("MainWindow", "obj", None)) + ___qtablewidgetitem2 = self.ta_queue_dl.horizontalHeaderItem(2) + ___qtablewidgetitem2.setText(QCoreApplication.translate("MainWindow", "Name", None)) + ___qtablewidgetitem3 = self.ta_queue_dl.horizontalHeaderItem(3) + ___qtablewidgetitem3.setText(QCoreApplication.translate("MainWindow", "Type", None)) + ___qtablewidgetitem4 = self.ta_queue_dl.horizontalHeaderItem(4) + ___qtablewidgetitem4.setText(QCoreApplication.translate("MainWindow", "Quality", None)) + self.pb_queue_item_remove.setText(QCoreApplication.translate("MainWindow", "Remove", None)) self.m_file.setTitle(QCoreApplication.translate("MainWindow", "File", None)) self.m_help.setTitle(QCoreApplication.translate("MainWindow", "Help", None)) diff --git a/tidal_dl_ng/ui/main.ui b/tidal_dl_ng/ui/main.ui index 8bfe727..1e83207 100644 --- a/tidal_dl_ng/ui/main.ui +++ b/tidal_dl_ng/ui/main.ui @@ -6,8 +6,8 @@ 0 0 - 900 - 700 + 1200 + 800 @@ -38,132 +38,129 @@ - + - - - QLayout::SetNoConstraint - + - + + + + + + + + + + + + + + + + + + QAbstractItemView::NoEditTriggers + + + false + + + 10 + + + true + + + true + + + true + + + true + + + true + + + + Name + + + + + + + + + + + + + + obj + + + + + Info + + + + + + + + + + + - - - - - - - - - - - - - - - - - - QAbstractItemView::NoEditTriggers - - - false - - - 10 - - - true - - - true - - - true - - - true - - - true - - - - Name - - - - - - - - - - - - - - Info - - - - - - - - - - - - - - obj - - - - - Playlists - - - - - - - - - ItemIsEnabled - - - - - Mixes - - - - - - - - - ItemIsEnabled - - - - - Favorites - - - - - - - - - ItemIsEnabled - - - + + Playlists + + + + + + + + + ItemIsEnabled + + + + Mixes + + + + + + + + + ItemIsEnabled + + + + + Favorites + + + + + + + + + ItemIsEnabled + + + + + + @@ -177,308 +174,32 @@ - - - - - - -1 - - - - - - false - - - - - - - - - - - - - - - - - - - - - - - - Type and press ENTER to search... - - - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Search - - - - - - - - - - - - QAbstractItemView::NoEditTriggers - - - false - - - false - - - false - - - QAbstractItemView::ExtendedSelection - - - 10 - - - true - - - true - - - false - - - - # - - - - - Artist - - - - - Title - - - - - Album - - - - - Duration - - - - - obj - - - - - - - - - - - - - - - - - - - - - - - - - Audio - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - - - - - - - - - - - - - - - - - - Video - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Download - - - - - - - - - - - - true - + - + 0 0 - - - 16777215 - 16777215 - + + Download List + + + + + + + + + + -1 + + + + + false @@ -497,14 +218,450 @@ - - false + + - - true + + - Logs... + Type and press ENTER to search... + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Search + + + + + + + + + + + + QAbstractItemView::NoEditTriggers + + + false + + + false + + + false + + + QAbstractItemView::ExtendedSelection + + + 10 + + + true + + + true + + + false + + + + # + + + + + obj + + + + + Artist + + + + + Title + + + + + Album + + + + + Duration + + + + + Quality + + + + + + + + + + + + + + + + + + + + + + + + + Audio + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + + Video + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Download + + + + + + + + + + + + true + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + false + + + + + + + + + + + + + + + + + + false + + + true + + + Logs... + + + + + + + + + + + + + + + + 0 + 0 + + + + + 280 + 280 + + + + + 0 + 0 + + + + QFrame::NoFrame + + + + + + default_album_image.png + + + true + + + Qt::AlignHCenter|Qt::AlignTop + + + + + + + + + + + + + + false + true + true + + + + Download Queue + + + + + + + QAbstractItemView::NoEditTriggers + + + false + + + false + + + false + + + QAbstractItemView::ExtendedSelection + + + QAbstractItemView::SelectRows + + + true + + + true + + + + # + + + AlignLeading|AlignVCenter + + + + + obj + + + + + Name + + + AlignLeading|AlignVCenter + + + + + Type + + + AlignLeading|AlignVCenter + + + + + Quality + + + AlignLeading|AlignVCenter + + + + + + + + false + + + Remove @@ -519,7 +676,7 @@ 0 0 - 900 + 1200 24