From c376bf95033166c04224390f002630b051e133fe Mon Sep 17 00:00:00 2001 From: James Hogan Date: Sun, 6 Sep 2009 18:55:28 +0100 Subject: [PATCH] Added playlist actions (insert, delete, move up, move down), with only insert working at the moment. also enabled some playlist drag n drop of playlist items, which copy rather than move --- kworship/archive/KwDataFile.cpp | 63 +++++++++++++++ kworship/archive/KwDataFile.h | 31 +++++++- kworship/bible/KwBiblePlaylistItemNode.cpp | 4 + kworship/bible/KwBiblePlaylistItemNode.h | 3 + kworship/kworship.cpp | 60 +++++++++++++++ kworship/kworship.h | 9 +++ kworship/kworshipui.rc | 9 ++- kworship/playlist/KwPlaylistFileNode.cpp | 5 ++ kworship/playlist/KwPlaylistFileNode.h | 3 + kworship/playlist/KwPlaylistListNode.cpp | 7 +- kworship/playlist/KwPlaylistListNode.h | 3 + kworship/playlist/KwPlaylistModel.cpp | 115 +++++++++++++++++++++------- kworship/playlist/KwPlaylistModel.h | 4 + kworship/playlist/KwPlaylistNode.cpp | 6 +- kworship/playlist/KwPlaylistNode.h | 3 + kworship/playlist/KwPlaylistNoteNode.cpp | 4 + kworship/playlist/KwPlaylistNoteNode.h | 3 + kworship/playlist/KwPlaylistUnknownNode.cpp | 4 + kworship/playlist/KwPlaylistUnknownNode.h | 3 + kworship/songdb/KwPlaylistSongNode.cpp | 4 + kworship/songdb/KwPlaylistSongNode.h | 3 + 21 files changed, 315 insertions(+), 31 deletions(-) diff --git a/kworship/archive/KwDataFile.cpp b/kworship/archive/KwDataFile.cpp index 24befed..cda1c77 100644 --- a/kworship/archive/KwDataFile.cpp +++ b/kworship/archive/KwDataFile.cpp @@ -48,6 +48,58 @@ KwDataFile::~KwDataFile() } /* + * Individual playlist items + */ + +/** Insert a set of playlist items. + * @param items List of playlist items to insert. + * @param resources Resource manager. + */ +void KwDataFile::insertPlaylistItems(const QList& items, KwResourceManager* resourceManager) +{ + QDomElement root = m_domDocument->documentElement(); + + QDomElement children = m_domDocument->createElement("playlist_items"); + root.appendChild(children); + + foreach (const KwPlaylistItem* item, items) + { + item->exportToDom(*m_domDocument, children, resourceManager); + } +} + +/** Create a set of playlist items from the data. + * @param resources Resource manager. + * @returns Newly created playlist items which the user must delete. + */ +QList KwDataFile::extractPlaylistItems(KwResourceManager* resourceManager) const +{ + QDomElement root = m_domDocument->documentElement(); + QList items; + + QDomElement list = root.firstChildElement("playlist_items"); + while (!list.isNull()) + { + QDomNodeList children = list.childNodes(); + for (int i = 0; i < children.count(); ++i) + { + QDomElement child = children.item(i).toElement(); + if (!child.isNull()) + { + KwPlaylistItem* item = KwPlaylistItem::createFromDom(child, resourceManager); + if (0 != item) + { + items << item; + } + } + } + list = list.nextSiblingElement("playlist_items"); + } + + return items; +} + +/* * Playlists */ @@ -81,6 +133,17 @@ KwPlaylistList* KwDataFile::extractPlaylist(KwResourceManager* resourceManager) } /* + * Main resource interface + */ + +#include +void KwDataFile::addResource(const KwResourceLink* link) +{ + // Basically don't do anything, but perhaps report it + qDebug() << __PRETTY_FUNCTION__ << "(" << link << ") - Ignoring"; +} + +/* * Reading and writing */ diff --git a/kworship/archive/KwDataFile.h b/kworship/archive/KwDataFile.h index ebff5d1..aaa8bdf 100644 --- a/kworship/archive/KwDataFile.h +++ b/kworship/archive/KwDataFile.h @@ -26,7 +26,10 @@ * @author James Hogan */ -class KwResourceManager; +#include "KwResourceManager.h" + +#include + class KwPlaylistItem; class KwPlaylistList; @@ -36,7 +39,7 @@ class QDomDocument; class QDomElement; /// A KWorship XML data file. -class KwDataFile +class KwDataFile : public KwResourceManager { public: @@ -51,6 +54,22 @@ class KwDataFile virtual ~KwDataFile(); /* + * Individual playlist items + */ + + /** Insert a set of playlist items. + * @param items List of playlist items to insert. + * @param resources Resource manager. + */ + void insertPlaylistItems(const QList& items, KwResourceManager* resourceManager); + + /** Create a set of playlist items from the data. + * @param resources Resource manager. + * @returns Newly created playlist items which the user must delete. + */ + QList extractPlaylistItems(KwResourceManager* resourceManager) const; + + /* * Playlists */ @@ -61,11 +80,19 @@ class KwDataFile void insertPlaylist(const KwPlaylistList* playlist, KwResourceManager* resourceManager); /** Create a playlist object from the data. + * @param resources Resource manager. * @returns Newly created playlist which the user must delete. */ KwPlaylistList* extractPlaylist(KwResourceManager* resourceManager) const; /* + * Main resource interface + */ + + // Reimplemented + virtual void addResource(const KwResourceLink* link); + + /* * Reading and writing */ diff --git a/kworship/bible/KwBiblePlaylistItemNode.cpp b/kworship/bible/KwBiblePlaylistItemNode.cpp index 65b16bb..a80a3ec 100644 --- a/kworship/bible/KwBiblePlaylistItemNode.cpp +++ b/kworship/bible/KwBiblePlaylistItemNode.cpp @@ -76,3 +76,7 @@ void KwBiblePlaylistItemNode::activate(KwDisplayManager* manager) manager->text.setHtml(m_item->passage().renderedText()); } +KwPlaylistItem *KwBiblePlaylistItemNode::playlistItem() const +{ + return m_item; +} diff --git a/kworship/bible/KwBiblePlaylistItemNode.h b/kworship/bible/KwBiblePlaylistItemNode.h index ab2c1a1..ba64324 100644 --- a/kworship/bible/KwBiblePlaylistItemNode.h +++ b/kworship/bible/KwBiblePlaylistItemNode.h @@ -55,6 +55,9 @@ class KwBiblePlaylistItemNode : public KwPlaylistNode // Reimplemented virtual void activate(KwDisplayManager* manager); + // Reimplemented + virtual KwPlaylistItem *playlistItem() const; + private: /* diff --git a/kworship/kworship.cpp b/kworship/kworship.cpp index 2f06932..34bd1ea 100644 --- a/kworship/kworship.cpp +++ b/kworship/kworship.cpp @@ -156,9 +156,12 @@ kworship::kworship() m_document->playlist()->addStyleSheet(styleRules); m_view->treePlaylist->setModel(m_playlistModel); + m_view->treePlaylist->setSelectionMode(QAbstractItemView::ExtendedSelection); m_view->treePlaylist->setExpandsOnDoubleClick(false); + m_view->treePlaylist->setDragEnabled(true); m_view->treePlaylist->setAcceptDrops(true); + connect(m_view->treePlaylist, SIGNAL(clicked(QModelIndex)), this, SLOT(playlist_clicked(QModelIndex))); connect(m_view->treePlaylist, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(playlist_doubleClicked(QModelIndex))); m_mediaManager = new KwMediaManager(); @@ -373,6 +376,26 @@ void kworship::setupActions() KAction* clearDisplayAction = new KAction(KIcon("clear"), i18n("Clear display"), this); actionCollection()->addAction( QLatin1String("display_clear"), clearDisplayAction); connect(clearDisplayAction, SIGNAL(triggered()), this, SLOT(displayClear())); + + // Playlist actions + m_playlistInsertAction = new KAction(KIcon("insert"), i18n("Insert into playlist"), this); + actionCollection()->addAction( QLatin1String("playlist_insert"), m_playlistInsertAction); + connect(m_playlistInsertAction, SIGNAL(triggered()), this, SLOT(playlistInsert())); + + m_playlistDeleteAction = new KAction(KIcon("delete"), i18n("Delete from playlist"), this); + m_playlistDeleteAction->setEnabled(false); + actionCollection()->addAction( QLatin1String("playlist_delete"), m_playlistDeleteAction); + connect(m_playlistDeleteAction, SIGNAL(triggered()), this, SLOT(playlistDelete())); + + m_playlistMoveUpAction = new KAction(KIcon("up"), i18n("Move playlist item up"), this); + m_playlistMoveUpAction->setEnabled(false); + actionCollection()->addAction( QLatin1String("playlist_move_up"), m_playlistMoveUpAction); + connect(m_playlistMoveUpAction, SIGNAL(triggered()), this, SLOT(playlistMoveUp())); + + m_playlistMoveDownAction = new KAction(KIcon("down"), i18n("Move playlist item down"), this); + m_playlistMoveDownAction->setEnabled(false); + actionCollection()->addAction( QLatin1String("playlist_move_down"), m_playlistMoveDownAction); + connect(m_playlistMoveDownAction, SIGNAL(triggered()), this, SLOT(playlistMoveDown())); } void kworship::settingsChanged() @@ -655,6 +678,17 @@ void kworship::optionsPreferences() dialog->show(); } +void kworship::playlist_clicked(QModelIndex index) +{ + KwPlaylistNode* node = m_playlistModel->itemFromIndex(index); + /// @todo Move this code to selection changed vfunc/slot of view so it can handle deselection + // A node must be selected and correspond to a playlist item + bool selected = (0 != node && 0 != node->playlistItem()); + m_playlistDeleteAction->setEnabled(selected); + m_playlistMoveUpAction->setEnabled(selected); + m_playlistMoveDownAction->setEnabled(selected); +} + void kworship::playlist_doubleClicked(QModelIndex index) { KwPlaylistNode* node = m_playlistModel->itemFromIndex(index); @@ -667,6 +701,32 @@ void kworship::playlistReset() m_playlistModel->setRootNode(m_document->playlist()->getNode(0)); } +void kworship::playlistInsert() +{ + KUrl defaultUrl("kfiledialog:///playlist_insert"); + + KUrl::List urls = KFileDialog::getOpenUrls(defaultUrl, QString(), this, i18n("Insert Files into Playlist")); + foreach (KUrl url, urls) + { + m_playlistModel->addFile(QModelIndex(), url); + } +} + +void kworship::playlistDelete() +{ + /// @todo Implement +} + +void kworship::playlistMoveUp() +{ + /// @todo Implement +} + +void kworship::playlistMoveDown() +{ + /// @todo Implement +} + #include /// Add the new docker to the interface. void kworship::newDocker(QDockWidget* docker) diff --git a/kworship/kworship.h b/kworship/kworship.h index a660145..238fe69 100644 --- a/kworship/kworship.h +++ b/kworship/kworship.h @@ -109,8 +109,13 @@ private slots: void fileSaveAs(); void toggleFullscreen(bool checked); void optionsPreferences(); + void playlist_clicked(QModelIndex); void playlist_doubleClicked(QModelIndex); void playlistReset(); + void playlistInsert(); + void playlistDelete(); + void playlistMoveUp(); + void playlistMoveDown(); /// Add the new docker to the interface. void newDocker(QDockWidget* docker); @@ -162,6 +167,10 @@ private: KwDocument* m_document; KwPlaylistModel* m_playlistModel; + KAction* m_playlistInsertAction; + KAction* m_playlistDeleteAction; + KAction* m_playlistMoveUpAction; + KAction* m_playlistMoveDownAction; UpManager* m_presentationManager; QTreeView* m_selectPresTree; diff --git a/kworship/kworshipui.rc b/kworship/kworshipui.rc index 2f6bce1..4b3e11a 100644 --- a/kworship/kworshipui.rc +++ b/kworship/kworshipui.rc @@ -8,12 +8,19 @@ &Presentation &Playlist + + - Display Toolbar + Playlist Toolbar + + + + + diff --git a/kworship/playlist/KwPlaylistFileNode.cpp b/kworship/playlist/KwPlaylistFileNode.cpp index 7562077..e108824 100644 --- a/kworship/playlist/KwPlaylistFileNode.cpp +++ b/kworship/playlist/KwPlaylistFileNode.cpp @@ -69,6 +69,11 @@ QVariant KwPlaylistFileNode::getData(int role, int column) return QVariant(); } +KwPlaylistItem *KwPlaylistFileNode::playlistItem() const +{ + return m_item; +} + void KwPlaylistFileNode::activate(KwDisplayManager* manager) { m_item->activate(manager); diff --git a/kworship/playlist/KwPlaylistFileNode.h b/kworship/playlist/KwPlaylistFileNode.h index 6bc26fb..c60bda1 100644 --- a/kworship/playlist/KwPlaylistFileNode.h +++ b/kworship/playlist/KwPlaylistFileNode.h @@ -53,6 +53,9 @@ class KwPlaylistFileNode : public KwPlaylistNode virtual void activate(KwDisplayManager* manager); + // Reimplemented + virtual KwPlaylistItem *playlistItem() const; + private: /* diff --git a/kworship/playlist/KwPlaylistListNode.cpp b/kworship/playlist/KwPlaylistListNode.cpp index df7aeff..602704e 100644 --- a/kworship/playlist/KwPlaylistListNode.cpp +++ b/kworship/playlist/KwPlaylistListNode.cpp @@ -85,7 +85,12 @@ int KwPlaylistListNode::getChildCount() const Qt::ItemFlags KwPlaylistListNode::getFlags(Qt::ItemFlags& defaultFlags) const { - return Qt::ItemIsDropEnabled | defaultFlags; + return Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | defaultFlags; +} + +KwPlaylistItem *KwPlaylistListNode::playlistItem() const +{ + return m_item; } KwPlaylistNode* KwPlaylistListNode::_getChild(int index) diff --git a/kworship/playlist/KwPlaylistListNode.h b/kworship/playlist/KwPlaylistListNode.h index 166bb09..8784c7f 100644 --- a/kworship/playlist/KwPlaylistListNode.h +++ b/kworship/playlist/KwPlaylistListNode.h @@ -61,6 +61,9 @@ class KwPlaylistListNode : public KwPlaylistNode virtual Qt::ItemFlags getFlags(Qt::ItemFlags& defaultFlags) const; + // Reimplemented + virtual KwPlaylistItem *playlistItem() const; + protected: virtual KwPlaylistNode* _getChild(int index); diff --git a/kworship/playlist/KwPlaylistModel.cpp b/kworship/playlist/KwPlaylistModel.cpp index c81fa18..c1a629c 100644 --- a/kworship/playlist/KwPlaylistModel.cpp +++ b/kworship/playlist/KwPlaylistModel.cpp @@ -23,6 +23,7 @@ * @author James Hogan */ +#include "KwDataFile.h" #include "KwPlaylistModel.h" #include "KwPlaylistNode.h" #include "KwPlaylistList.h" @@ -38,6 +39,7 @@ #include #include #include +#include /* * Constructors + destructor. @@ -58,6 +60,36 @@ KwPlaylistModel::~KwPlaylistModel() * Modification interface */ +/// Add a file to the list. +void KwPlaylistModel::addFile(const QModelIndex& parent, const QUrl& file, int position) +{ + // Get the file's mime type + KMimeType::Ptr result = KMimeType::findByUrl(KUrl(file)); + KwPlaylistItem* newItem = 0; + if (!result->isDefault()) + { + if (result->name().startsWith("image/")) + { + newItem = new KwPlaylistImage(file); + } + else if (result->name().startsWith("video/")) + { + newItem = new KwPlaylistVideo(file); + } + // perhaps its a presentation + /// @todo match against all known presentation mime types + else if (result->name() == "application/vnd.oasis.opendocument.presentation") + { + newItem = new KwPlaylistPresentation(file); + } + } + if (0 == newItem) + { + newItem = new KwPlaylistFile(file); + } + addItem(parent, newItem, position); +} + /// Add an item to the list. void KwPlaylistModel::addItem(const QModelIndex& parent, KwPlaylistItem* item, int position) { @@ -80,6 +112,7 @@ void KwPlaylistModel::addItem(const QModelIndex& parent, KwPlaylistItem* item, i QStringList KwPlaylistModel::mimeTypes() const { QStringList mimes; + mimes << "application/x-kworship+xml"; //mimes << "application/x.kworship.song.list"; mimes << "text/uri-list"; return mimes; @@ -103,6 +136,41 @@ Qt::ItemFlags KwPlaylistModel::flags(const QModelIndex& index) const return defaultFlags; } +QMimeData *KwPlaylistModel::mimeData(const QModelIndexList &indexes) const +{ + QMimeData *mimeData = new QMimeData(); + QByteArray encodedData; + + QTextStream stream(&encodedData, QIODevice::WriteOnly); + KwDataFile data; + + QList items; + foreach(QModelIndex index, indexes) + { + if (index.isValid()) + { + KwPlaylistNode *node = itemFromIndex(index); + KwPlaylistItem *item = node->playlistItem(); + if (0 != item) + { + items << item; + } + else + { + Q_ASSERT(false); + delete mimeData; + return 0; + } + } + } + // Use data file as resource manager for now + data.insertPlaylistItems(items, &data); + data.writeTo(stream); + + mimeData->setData("application/x-kworship+xml", encodedData); + return mimeData; +} + bool KwPlaylistModel::dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent) { Q_UNUSED(column) @@ -123,7 +191,26 @@ bool KwPlaylistModel::dropMimeData(const QMimeData* data, Qt::DropAction action, row = list->getChildCount(); } - if (0 && data->hasFormat("application/x.kworship.song.list")) + if (data->hasFormat("application/x-kworship+xml")) + { + QByteArray encodedData = data->data("application/x-kworship+xml"); + QTextStream stream(&encodedData, QIODevice::ReadOnly); + + KwDataFile data; + data.readFrom(stream.device()); + + // Use data file as resource manager for now + QList items = data.extractPlaylistItems(&data); + + foreach (KwPlaylistItem* item, items) + { + addItem(parent, item, row); + ++row; + } + + return true; + } + else if (0 && data->hasFormat("application/x.kworship.song.list")) { QByteArray encodedData = data->data("application/x.kworship.song.list"); QDataStream stream(&encodedData, QIODevice::ReadOnly); @@ -158,31 +245,7 @@ bool KwPlaylistModel::dropMimeData(const QMimeData* data, Qt::DropAction action, QList files = data->urls(); foreach (QUrl file, files) { - // Get the file's mime type - KMimeType::Ptr result = KMimeType::findByUrl(KUrl(file)); - KwPlaylistItem* newItem = 0; - if (!result->isDefault()) - { - if (result->name().startsWith("image/")) - { - newItem = new KwPlaylistImage(file); - } - else if (result->name().startsWith("video/")) - { - newItem = new KwPlaylistVideo(file); - } - // perhaps its a presentation - /// @todo match against all known presentation mime types - else if (result->name() == "application/vnd.oasis.opendocument.presentation") - { - newItem = new KwPlaylistPresentation(file); - } - } - if (0 == newItem) - { - newItem = new KwPlaylistFile(file); - } - addItem(parent, newItem, row); + addFile(parent, file, row); ++row; } diff --git a/kworship/playlist/KwPlaylistModel.h b/kworship/playlist/KwPlaylistModel.h index 31e97a9..d708114 100644 --- a/kworship/playlist/KwPlaylistModel.h +++ b/kworship/playlist/KwPlaylistModel.h @@ -53,6 +53,9 @@ class KWMAIN_EXPORT KwPlaylistModel : public NodeBasedModel * Modification interface */ + /// Add a file to the list. + void addFile(const QModelIndex& parent, const QUrl& file, int position = -1); + /// Add an item to the list. void addItem(const QModelIndex& parent, KwPlaylistItem* item, int position = -1); @@ -63,6 +66,7 @@ class KWMAIN_EXPORT KwPlaylistModel : public NodeBasedModel QStringList mimeTypes() const; Qt::DropActions supportedDropActions() const; Qt::ItemFlags flags(const QModelIndex& index) const; + QMimeData *mimeData(const QModelIndexList &indexes) const; bool dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent); }; diff --git a/kworship/playlist/KwPlaylistNode.cpp b/kworship/playlist/KwPlaylistNode.cpp index 3a77bf7..94eb4f2 100644 --- a/kworship/playlist/KwPlaylistNode.cpp +++ b/kworship/playlist/KwPlaylistNode.cpp @@ -49,7 +49,7 @@ KwPlaylistNode::~KwPlaylistNode() /// Get the flags for this node. Qt::ItemFlags KwPlaylistNode::getFlags(Qt::ItemFlags& defaultFlags) const { - return defaultFlags; + return Qt::ItemIsDragEnabled | defaultFlags; } /// Activate the node using a display manager. @@ -57,3 +57,7 @@ void KwPlaylistNode::activate(KwDisplayManager*) { } +KwPlaylistItem *KwPlaylistNode::playlistItem() const +{ + return 0; +} diff --git a/kworship/playlist/KwPlaylistNode.h b/kworship/playlist/KwPlaylistNode.h index ed37f55..a13c5f8 100644 --- a/kworship/playlist/KwPlaylistNode.h +++ b/kworship/playlist/KwPlaylistNode.h @@ -31,6 +31,7 @@ #include class KwDisplayManager; +class KwPlaylistItem; /// A node on a playlist tree. /** @@ -60,6 +61,8 @@ class KWMAIN_EXPORT KwPlaylistNode : public DefaultModelNode /// Activate the node using a display manager. virtual void activate(KwDisplayManager* manager); + /// Get the corresponding playlist item if one exists. + virtual KwPlaylistItem *playlistItem() const; }; #endif // _KwPlaylistNode_h_ diff --git a/kworship/playlist/KwPlaylistNoteNode.cpp b/kworship/playlist/KwPlaylistNoteNode.cpp index e2a2c4a..093ec46 100644 --- a/kworship/playlist/KwPlaylistNoteNode.cpp +++ b/kworship/playlist/KwPlaylistNoteNode.cpp @@ -67,3 +67,7 @@ QVariant KwPlaylistNoteNode::getData(int role, int column) return QVariant(); } +KwPlaylistItem *KwPlaylistNoteNode::playlistItem() const +{ + return m_item; +} diff --git a/kworship/playlist/KwPlaylistNoteNode.h b/kworship/playlist/KwPlaylistNoteNode.h index f95c476..5e7892c 100644 --- a/kworship/playlist/KwPlaylistNoteNode.h +++ b/kworship/playlist/KwPlaylistNoteNode.h @@ -51,6 +51,9 @@ class KwPlaylistNoteNode : public KwPlaylistNode virtual QVariant getData(int role, int column); + // Reimplemented + virtual KwPlaylistItem *playlistItem() const; + private: /* diff --git a/kworship/playlist/KwPlaylistUnknownNode.cpp b/kworship/playlist/KwPlaylistUnknownNode.cpp index 0a7c8c4..8736bc3 100644 --- a/kworship/playlist/KwPlaylistUnknownNode.cpp +++ b/kworship/playlist/KwPlaylistUnknownNode.cpp @@ -68,3 +68,7 @@ QVariant KwPlaylistUnknownNode::getData(int role, int column) return QVariant(); } +KwPlaylistItem *KwPlaylistUnknownNode::playlistItem() const +{ + return m_item; +} diff --git a/kworship/playlist/KwPlaylistUnknownNode.h b/kworship/playlist/KwPlaylistUnknownNode.h index aaff5e3..c1f56ee 100644 --- a/kworship/playlist/KwPlaylistUnknownNode.h +++ b/kworship/playlist/KwPlaylistUnknownNode.h @@ -51,6 +51,9 @@ class KwPlaylistUnknownNode : public KwPlaylistNode virtual QVariant getData(int role, int column); + // Reimplemented + virtual KwPlaylistItem *playlistItem() const; + private: /* diff --git a/kworship/songdb/KwPlaylistSongNode.cpp b/kworship/songdb/KwPlaylistSongNode.cpp index b9a081c..e99ce14 100644 --- a/kworship/songdb/KwPlaylistSongNode.cpp +++ b/kworship/songdb/KwPlaylistSongNode.cpp @@ -80,3 +80,7 @@ KwPlaylistNode* KwPlaylistSongNode::_getChild(int index) return new KwPlaylistSongNodeVerse(this, m_item, index); } +KwPlaylistItem *KwPlaylistSongNode::playlistItem() const +{ + return m_item; +} diff --git a/kworship/songdb/KwPlaylistSongNode.h b/kworship/songdb/KwPlaylistSongNode.h index a86bad1..7de87e7 100644 --- a/kworship/songdb/KwPlaylistSongNode.h +++ b/kworship/songdb/KwPlaylistSongNode.h @@ -53,6 +53,9 @@ class KwPlaylistSongNode : public KwPlaylistNode virtual int getChildCount() const; + // Reimplemented + virtual KwPlaylistItem *playlistItem() const; + protected: virtual KwPlaylistNode* _getChild(int index); -- 2.11.4.GIT