From 2da79841f38a6b134db7c0232e7f23071db0314c Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Wed, 10 Feb 2010 20:37:47 +0100 Subject: Playlist: add a popup menu with 'add same' --- nephilim/plugins/Playlist.py | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/nephilim/plugins/Playlist.py b/nephilim/plugins/Playlist.py index a1b08a0..248f658 100644 --- a/nephilim/plugins/Playlist.py +++ b/nephilim/plugins/Playlist.py @@ -65,9 +65,14 @@ class PlaylistWidget(QtGui.QWidget): self.playlist.fill() class PlaylistTree(QtGui.QTreeWidget): - song = None plugin = None + ### PRIVATE ### + # popup menu + _menu = None + # add same... menu + _same_menu = None + def __init__(self, plugin): QtGui.QTreeWidget.__init__(self) self.plugin = plugin @@ -86,9 +91,16 @@ class PlaylistTree(QtGui.QTreeWidget): self.setHeaderLabels(columns) self.header().restoreState(self.plugin.settings.value(self.plugin.name + '/header_state').toByteArray()) + # menu + self._menu = QtGui.QMenu() + self._same_menu = self._menu.addMenu('Add same...') + self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) + self.customContextMenuRequested.connect(self._show_context_menu) + self.itemActivated.connect(self._song_activated) self.header().geometriesChanged.connect(self._save_state) self.plugin.mpclient.playlist_changed.connect(self.fill) + self.plugin.mpclient.connect_changed.connect(self._update_menu) def _save_state(self): self.plugin.settings.setValue(self.plugin.name + '/header_state', QVariant(self.header().saveState())) @@ -141,6 +153,22 @@ class PlaylistTree(QtGui.QTreeWidget): def mimeTypes(self): return [MIMETYPES['songs'], MIMETYPES['plistsongs']] + def _update_menu(self): + """Update popup menu. Invoked on (dis)connect.""" + self._same_menu.clear() + for tag in self.plugin.mpclient.tagtypes: + self._same_menu.addAction(tag, lambda tag = tag: self._add_selected_same(tag)) + + def _add_selected_same(self, tag): + """Adds all tracks in DB with tag 'tag' same as selected tracks.""" + for it in self.selectedItems(): + self.plugin.mpclient.findadd(tag, it.song[tag]) + + def _show_context_menu(self, pos): + if not self.indexAt(pos).isValid(): + return + self._menu.popup(self.mapToGlobal(pos)) + class PlaylistSongItem(QtGui.QTreeWidgetItem): ### PUBLIC ### song = None -- cgit v1.2.3