summaryrefslogtreecommitdiff
path: root/tidal_dl_ng/gui/history.py
diff options
context:
space:
mode:
Diffstat (limited to 'tidal_dl_ng/gui/history.py')
-rw-r--r--tidal_dl_ng/gui/history.py85
1 files changed, 85 insertions, 0 deletions
diff --git a/tidal_dl_ng/gui/history.py b/tidal_dl_ng/gui/history.py
new file mode 100644
index 0000000..28b8f8d
--- /dev/null
+++ b/tidal_dl_ng/gui/history.py
@@ -0,0 +1,85 @@
+"""History management mixin for MainWindow.
+
+Handles download history and duplicate prevention.
+"""
+
+from PySide6 import QtCore
+from tidalapi import Track
+
+from tidal_dl_ng.dialog import DialogPreferences
+from tidal_dl_ng.dialog_history import DialogHistory
+from tidal_dl_ng.logger import logger_gui
+from tidal_dl_ng.model.gui_data import StatusbarMessage
+
+
+class HistoryMixin:
+ """Mixin containing download history management methods."""
+
+ def on_view_history(self) -> None:
+ """Open the download history dialog."""
+ DialogHistory(history_service=self.history_service, parent=self)
+
+ def on_toggle_duplicate_prevention(self, enabled: bool) -> None:
+ """Toggle duplicate download prevention on or off."""
+ self.history_service.update_settings(preventDuplicates=enabled)
+ status_msg = "enabled" if enabled else "disabled"
+ logger_gui.info(f"Duplicate download prevention {status_msg}")
+ self.s_statusbar_message.emit(StatusbarMessage(message=f"Duplicate prevention {status_msg}.", timeout=2500))
+
+ def on_mark_track_as_downloaded(self, track: Track, index: QtCore.QModelIndex) -> None:
+ """Mark a track as downloaded in history."""
+ track_id = str(track.id)
+
+ source_type = "manual"
+ source_id = None
+ source_name = None
+
+ if hasattr(track, "album") and track.album:
+ source_type = "album"
+ source_id = str(track.album.id)
+ source_name = track.album.name
+
+ self.history_service.add_track_to_history(
+ track_id=track_id, source_type=source_type, source_id=source_id, source_name=source_name
+ )
+
+ self._update_downloaded_column(index, True)
+ logger_gui.info(f"Marked track as downloaded: {track.name}")
+
+ def on_mark_track_as_not_downloaded(self, track_id: str, index: QtCore.QModelIndex) -> None:
+ """Remove a track from download history."""
+ success = self.history_service.remove_track_from_history(track_id)
+
+ if success:
+ self._update_downloaded_column(index, False)
+ logger_gui.info(f"Unmarked track (ID: {track_id})")
+
+ def _update_downloaded_column(self, index: QtCore.QModelIndex, is_downloaded: bool) -> None:
+ """Update the Downloaded? column for a specific index."""
+ source_index = self.proxy_tr_results.mapToSource(index)
+
+ item = self.model_tr_results.itemFromIndex(source_index)
+ if not item:
+ return
+
+ row = item.row()
+ parent = item.parent()
+
+ downloaded_item = self.model_tr_results.item(row, 8) if parent is None else parent.child(row, 8)
+
+ if downloaded_item:
+ if is_downloaded:
+ downloaded_item.setText("✅")
+ downloaded_item.setTextAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
+ else:
+ downloaded_item.setText("")
+
+ def on_preferences(self) -> None:
+ """Open the preferences dialog."""
+ DialogPreferences(settings=self.settings, settings_save=self.s_settings_save, parent=self)
+
+ def on_settings_save(self) -> None:
+ """Save settings and re-apply them to the GUI."""
+ self.settings.save()
+ self.apply_settings(self.settings)
+ self._init_dl()