From a5019465a52dbbe17c625c1c1045427c5059fe9e Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sat, 19 Sep 2009 10:49:10 +0200 Subject: Playlist: support for moving songs with drag&drop --- nephilim/common.py | 32 ++++++++++++++++++++++++++++++++ nephilim/mpclient.py | 11 +++-------- nephilim/plugins/Library.py | 20 +------------------- nephilim/plugins/Playlist.py | 18 +++++++++++++++--- 4 files changed, 51 insertions(+), 30 deletions(-) diff --git a/nephilim/common.py b/nephilim/common.py index 7d6ba06..e3af3ef 100644 --- a/nephilim/common.py +++ b/nephilim/common.py @@ -146,3 +146,35 @@ class MetadataFetcher(QtCore.QObject): pass self.rep.abort() self.rep = None + +class SongsMimeData(QtCore.QMimeData): + # private + __songs = None + __plistsongs = None + + def set_songs(self, songs): + self.__songs = songs + + def songs(self): + return self.__songs + + def set_plistsongs(self, songs): + self.__plistsongs = songs + + def plistsongs(self): + return self.__plistsongs + + def formats(self): + types = QtCore.QMimeData.formats(self) + if self.__songs: + types += MIMETYPES['songs'] + if self.__plistsongs: + types += MIMETYPES['plistsongs'] + return types + + def hasFormat(self, format): + if format == MIMETYPES['songs'] and self.__songs: + return True + elif format == MIMETYPES['plistsongs'] and self.__plistsongs: + return True + return QtCore.QMimeData.hasFormat(self, format) diff --git a/nephilim/mpclient.py b/nephilim/mpclient.py index 31b242f..9e287d7 100644 --- a/nephilim/mpclient.py +++ b/nephilim/mpclient.py @@ -295,16 +295,11 @@ class MPClient(QtCore.QObject): if self._status['state'] == 'stop' and ret: self.play(ret[0]) def move(self, source, target): - """Move the songs in playlist. Takes a list of source ids and one target position.""" - self.logger.info('Moving %d to %d.'%(source, target)) + """Move the songs in playlist. Takes one source id and one target position.""" + self.logger.info('Moving %s to %s.'%(source, target)) if not self.__check_command_ok('moveid'): return - self._client.command_list_ok_begin() - i = 0 - for id in source: - self._client.moveid(id, target + i) - i += 1 - list(self._client.command_list_end()) + self._client.moveid(source, target) #### private #### def __finish_connect(self): diff --git a/nephilim/plugins/Library.py b/nephilim/plugins/Library.py index 348069c..c746af6 100644 --- a/nephilim/plugins/Library.py +++ b/nephilim/plugins/Library.py @@ -19,7 +19,7 @@ from PyQt4 import QtGui, QtCore from PyQt4.QtCore import QVariant from ..plugin import Plugin -from ..common import MIMETYPES +from ..common import MIMETYPES, SongsMimeData class Library(Plugin): # public, const @@ -260,21 +260,3 @@ class LibraryWidget(QtGui.QWidget): paths.append(song) self.plugin.mpclient.add(paths) -class SongsMimeData(QtCore.QMimeData): - # private - __songs = None - - def set_songs(self, songs): - self.__songs = songs - - def songs(self): - return self.__songs - - def formats(self): - types = QtCore.QMimeData.formats(self) - return types if not self.__songs else types + [MIMETYPES['songs']] - - def hasFormat(self, format): - if format == MIMETYPES['songs'] and self.__songs: - return True - return QtCore.QMimeData.hasFormat(self, format) diff --git a/nephilim/plugins/Playlist.py b/nephilim/plugins/Playlist.py index b6266cc..72e1d8b 100644 --- a/nephilim/plugins/Playlist.py +++ b/nephilim/plugins/Playlist.py @@ -19,7 +19,7 @@ from PyQt4 import QtGui, QtCore from PyQt4.QtCore import QVariant from ..plugin import Plugin -from ..common import MIMETYPES +from ..common import MIMETYPES, SongsMimeData class Playlist(Plugin): # public, const @@ -82,7 +82,7 @@ class PlaylistWidget(QtGui.QWidget): # drag&drop self.viewport().setAcceptDrops(True) self.setDropIndicatorShown(True) - self.setDragDropMode(QtGui.QAbstractItemView.DropOnly) + self.setDragDropMode(QtGui.QAbstractItemView.DragDrop) columns = self.plugin.settings.value(self.plugin.name + '/columns').toStringList() self.setColumnCount(len(columns)) @@ -118,8 +118,20 @@ class PlaylistWidget(QtGui.QWidget): else: QtGui.QTreeWidget.keyPressEvent(self, event) + def mimeData(self, items): + data = SongsMimeData() + data.set_plistsongs([items[0].id]) + return data + def dropMimeData(self, parent, index, data, action): - if data.hasFormat(MIMETYPES['songs']): + if data.hasFormat(MIMETYPES['plistsongs']): + if parent: + index = self.indexOfTopLevelItem(parent) + elif index >= self.topLevelItemCount(): + index = self.topLevelItemCount() - 1 + self.plugin.mpclient.move(data.plistsongs()[0], index) + return True + elif data.hasFormat(MIMETYPES['songs']): if parent: index = self.indexOfTopLevelItem(parent) self.plugin.mpclient.add(data.songs(), index) -- cgit v1.2.3