Skip to content

Column visibility #395

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions .idea/encodings.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

63 changes: 63 additions & 0 deletions .idea/inspectionProfiles/Project_Default.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/inspectionProfiles/profiles_settings.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 15 additions & 0 deletions .idea/tidal-dl-ng.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions tidal_dl_ng/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,14 @@ class QueueDownloadStatus(StrEnum):
Skipped: str = "↪️"


class SearchTypes(StrEnum):
Track: str = "Track"
Video: str = "Video"
Playlist: str = "Playlist"
Album: str = "Album"
Artist: str = "Artist"


FAVORITES: {} = {
"fav_videos": {"name": "Videos", "function_name": "videos"},
"fav_tracks": {"name": "Tracks", "function_name": "tracks"},
Expand Down
79 changes: 78 additions & 1 deletion tidal_dl_ng/gui.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,10 @@
import sys
import time
from collections.abc import Callable, Sequence
from copy import deepcopy
from functools import partial

from PySide6.QtGui import QAction
from requests.exceptions import HTTPError
from tidalapi.session import LinkLogin

Expand Down Expand Up @@ -148,6 +151,10 @@ def __init__(self, tidal: Tidal | None = None):
# XStream.stderr().messageWritten.connect(self._log_output)

self.settings = Settings()
# Default result tree list context menu items
self.tr_results_headers_ctx_items: list[str] = []
# Loads previously saved Result Tree Header from settings
self._load_rt_from_settings()

self._init_threads()
self._init_tree_results_model(self.model_tr_results)
Expand Down Expand Up @@ -272,7 +279,18 @@ def _populate_search_types(self, ui_target: QtWidgets.QComboBox, options: Search
if item:
ui_target.addItem(item.__name__, item)

self.cb_search_type.setCurrentIndex(2)
search_type = self.settings.data.search_type.capitalize()
# sets the last used Search type
self.cb_search_type.setCurrentIndex(self.cb_search_type.findText(search_type))
# self.cb_search_type.setCurrentIndex(2)

def _save_cb_search_type(self):
"""
Save the last used search type when changing it
"""
search_type = self.cb_search_type.currentText()
self.settings.data.search_type = search_type
self.settings.save()

def handle_filter_activated(self):
header: FilterHeader = self.tr_results.header()
Expand Down Expand Up @@ -307,6 +325,26 @@ def _init_tree_results(self, tree: QtWidgets.QTreeView, model: QtGui.QStandardIt
# Connect the contextmenu
tree.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
tree.customContextMenuRequested.connect(self.menu_context_tree_results)
# Connect Header visibility context menu
tree.header().setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
tree.header().customContextMenuRequested.connect(self.menu_context_tree_headers)

hidden = []
labels_column: [str] = deepcopy(self.tr_results_headers_ctx_items)
for index, item in enumerate(labels_column):
if "obj" in item:
continue
if "❌" in item:
if "#" not in item:
index += 1
hidden.append(index)
labels_column[index] = item.replace("❌", "")
elif "✅" in item:
if "#" not in item:
index += 1
labels_column[index] = item.replace("✅", "")
for i in hidden:
tree.setColumnHidden(i, True)

def _init_tree_results_model(self, model: QtGui.QStandardItemModel) -> None:
labels_column: [str] = ["#", "obj", "Artist", "Title", "Album", "Duration", "Quality", "Date Added"]
Expand All @@ -315,6 +353,44 @@ def _init_tree_results_model(self, model: QtGui.QStandardItemModel) -> None:
model.setRowCount(0)
model.setHorizontalHeaderLabels(labels_column)

def _load_rt_from_settings(self):
settings = self.settings.data
for i in settings.rt_header_ctx.split(","):
if "obj" in i:
continue
self.tr_results_headers_ctx_items.append(i)

def menu_context_tree_headers(self):
"""
Adds context menu to the header of the result tree list
"""
menu = QtWidgets.QMenu()
for m in self.tr_results_headers_ctx_items:
action = QAction(m, self)
action.triggered.connect(partial(self._toggle_header_section_hidden, m))
menu.addAction(action)

menu.exec(QtGui.QCursor.pos())

def _toggle_header_section_hidden(self, item: str):
"""
Toggles result tree list columns visibility
Then save the changes to settings
"""
index = self.tr_results_headers_ctx_items.index(item)
is_visible = "✅" in item
new_label = item.replace("✅" if is_visible else "❌", "❌" if is_visible else "✅")
self.tr_results_headers_ctx_items[index] = new_label
if "#" not in item:
index += 1

self.tr_results.header().setSectionHidden(index, is_visible)
updated_tr_results_headers_ctx_items = deepcopy(self.tr_results_headers_ctx_items)
updated_tr_results_headers_ctx_items.insert(1, "✅obj")
self.settings.data.rt_header_ctx = ""
self.settings.data.rt_header_ctx = ",".join(updated_tr_results_headers_ctx_items)
self.settings.save()

def _init_tree_queue(self, tree: QtWidgets.QTableWidget):
tree.setColumnHidden(1, True)
tree.setColumnWidth(2, 200)
Expand Down Expand Up @@ -759,6 +835,7 @@ def _init_signals(self):
self.pb_search.clicked.connect(
lambda: self.search_populate_results(self.l_search.text(), self.cb_search_type.currentData())
)
self.cb_search_type.currentIndexChanged.connect(lambda: self._save_cb_search_type())
self.cb_quality_audio.currentIndexChanged.connect(self.on_quality_set_audio)
self.cb_quality_video.currentIndexChanged.connect(self.on_quality_set_video)
self.tr_lists_user.itemClicked.connect(self.on_list_items_show)
Expand Down
6 changes: 5 additions & 1 deletion tidal_dl_ng/model/cfg.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from dataclasses_json import dataclass_json
from tidalapi import Quality

from tidal_dl_ng.constants import CoverDimensions, QualityVideo
from tidal_dl_ng.constants import CoverDimensions, QualityVideo, SearchTypes


@dataclass_json
Expand Down Expand Up @@ -45,6 +45,8 @@ class Settings:
symlink_to_track: bool = False
playlist_create: bool = False
metadata_replay_gain: bool = True
search_type: SearchTypes = SearchTypes.Track
rt_header_ctx: str = "✅#,✅obj,✅Artist,✅Title,✅Album,✅Duration,✅Quality,✅Date Added"


@dataclass_json
Expand Down Expand Up @@ -99,6 +101,8 @@ class HelpSettings:
)
playlist_create: str = "Creates a '_playlist.m3u8' file for downloaded albums, playlists and mixes."
metadata_replay_gain: str = "Replay gain information will be written to metadata."
search_type: str = "Search for tracks by artist, album or track name."
rt_header_ctx: str = "Result Tree List columns visibility."


@dataclass_json
Expand Down