[kde-doc-english] [amarok] /: Add rootnode action to create empty playlist.
Bart Cerneels
bart.cerneels at kde.org
Mon Oct 31 17:12:18 UTC 2011
Git commit 0638d9dfce905ef66cc28074810e3ed5c37479f0 by Bart Cerneels.
Committed on 27/09/2010 at 11:26.
Pushed by shanachie into branch 'master'.
Add rootnode action to create empty playlist.
Required change to QtGroupingProxy to enable actions for
the rootnode (empty area in the views).
BUG:202725
GUI:Context menu action the empty saved playlist area to create new empty playlist.
M +2 -0 ChangeLog
M +9 -0 src/browsers/playlistbrowser/PlaylistBrowserFilterProxy.cpp
M +1 -0 src/browsers/playlistbrowser/PlaylistBrowserFilterProxy.h
M +20 -4 src/browsers/playlistbrowser/PlaylistBrowserModel.cpp
M +2 -0 src/browsers/playlistbrowser/PlaylistBrowserModel.h
M +9 -3 src/browsers/playlistbrowser/PlaylistBrowserView.cpp
M +2 -0 src/browsers/playlistbrowser/PlaylistsByProviderProxy.cpp
M +6 -0 src/browsers/playlistbrowser/PodcastModel.cpp
M +2 -1 src/browsers/playlistbrowser/QtGroupingProxy.cpp
http://commits.kde.org/amarok/0638d9dfce905ef66cc28074810e3ed5c37479f0
diff --git a/ChangeLog b/ChangeLog
index c16a3b5..50c375b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -4,6 +4,8 @@ Amarok ChangeLog
Version 2.5.0-Beta 1
FEATURES:
+ * Addded a "create new playlist" action in the empty space of the Saved
+ Playlists. (BR202725)
* Add new type of optional tokens in format string (Collection Organizer)
(BR 264874)
* Compilations are properly marked as such when transferring music
diff --git a/src/browsers/playlistbrowser/PlaylistBrowserFilterProxy.cpp b/src/browsers/playlistbrowser/PlaylistBrowserFilterProxy.cpp
index 84439fa..36a05c8 100644
--- a/src/browsers/playlistbrowser/PlaylistBrowserFilterProxy.cpp
+++ b/src/browsers/playlistbrowser/PlaylistBrowserFilterProxy.cpp
@@ -34,6 +34,15 @@ PlaylistBrowserFilterProxy::setSourceModel( QAbstractItemModel *model )
SLOT(slotRenameIndex( const QModelIndex & )) );
}
+QVariant
+PlaylistBrowserFilterProxy::data(const QModelIndex &index, int role) const
+{
+ debug() << index << " role: " << role;
+ QVariant result = QSortFilterProxyModel::data( index, role );
+ debug() << result;
+ return result;
+}
+
void
PlaylistBrowserFilterProxy::slotRenameIndex( const QModelIndex &sourceIdx )
{
diff --git a/src/browsers/playlistbrowser/PlaylistBrowserFilterProxy.h b/src/browsers/playlistbrowser/PlaylistBrowserFilterProxy.h
index f0e1a72..a6b80f2 100644
--- a/src/browsers/playlistbrowser/PlaylistBrowserFilterProxy.h
+++ b/src/browsers/playlistbrowser/PlaylistBrowserFilterProxy.h
@@ -32,6 +32,7 @@ class PlaylistBrowserFilterProxy : public QSortFilterProxyModel
// QSortFilterProxyModel methods
virtual void setSourceModel( QAbstractItemModel *sourceModel );
+ virtual QVariant data(const QModelIndex &index, int role) const;
signals:
void renameIndex( const QModelIndex &index );
diff --git a/src/browsers/playlistbrowser/PlaylistBrowserModel.cpp b/src/browsers/playlistbrowser/PlaylistBrowserModel.cpp
index a914b0b..ce87656 100644
--- a/src/browsers/playlistbrowser/PlaylistBrowserModel.cpp
+++ b/src/browsers/playlistbrowser/PlaylistBrowserModel.cpp
@@ -39,6 +39,11 @@ lessThanPlaylistTitles( const Playlists::PlaylistPtr &lhs, const Playlists::Play
PlaylistBrowserModel::PlaylistBrowserModel( int playlistCategory )
: m_playlistCategory( playlistCategory )
{
+ m_createEmptyPlaylistAction = new QAction( KIcon( "media-track-add-amarok" ),
+ i18n( "Create empty playlist" ),
+ this );
+ connect( m_createEmptyPlaylistAction, SIGNAL(triggered()), SLOT(slotCreateEmptyPlaylist()) );
+
//common, unconditional actions
m_appendAction = new QAction( KIcon( "media-track-add-amarok" ), i18n( "&Add to Playlist" ),
this );
@@ -70,9 +75,6 @@ PlaylistBrowserModel::PlaylistBrowserModel( int playlistCategory )
QVariant
PlaylistBrowserModel::data( const QModelIndex &index, int role ) const
{
- if( !index.isValid() )
- return QVariant();
-
int row = REMOVE_TRACK_MASK(index.internalId());
Playlists::PlaylistPtr playlist = m_playlists.value( row );
@@ -168,7 +170,7 @@ PlaylistBrowserModel::data( const QModelIndex &index, int role ) const
break;
}
- default: return QVariant();
+ default: break;
}
@@ -400,6 +402,7 @@ PlaylistBrowserModel::flags( const QModelIndex &idx ) const
return Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled |
Qt::ItemIsDropEnabled;
}
+
QVariant
PlaylistBrowserModel::headerData( int section, Qt::Orientation orientation, int role ) const
{
@@ -677,6 +680,13 @@ PlaylistBrowserModel::slotPlaylistUpdated( Playlists::PlaylistPtr playlist, int
endInsertRows();
}
+void
+PlaylistBrowserModel::slotCreateEmptyPlaylist()
+{
+ The::playlistManager()->save( Meta::TrackList(),
+ Amarok::generatePlaylistName( Meta::TrackList() ) );
+}
+
Meta::TrackList
PlaylistBrowserModel::tracksFromIndexes( const QModelIndexList &list ) const
{
@@ -742,6 +752,12 @@ PlaylistBrowserModel::providerForIndex( const QModelIndex &idx ) const
QActionList
PlaylistBrowserModel::actionsFor( const QModelIndex &idx ) const
{
+ if( !idx.isValid() )
+ {
+ QActionList emptyActions;
+ emptyActions << m_createEmptyPlaylistAction;
+ return emptyActions;
+ }
//wheter we use the list from m_appendAction of m_loadAction does not matter they are the same
QModelIndexList actionList = m_appendAction->data().value<QModelIndexList>();
diff --git a/src/browsers/playlistbrowser/PlaylistBrowserModel.h b/src/browsers/playlistbrowser/PlaylistBrowserModel.h
index ae495ec..432c1b1 100644
--- a/src/browsers/playlistbrowser/PlaylistBrowserModel.h
+++ b/src/browsers/playlistbrowser/PlaylistBrowserModel.h
@@ -116,11 +116,13 @@ class PlaylistBrowserModel : public QAbstractItemModel,
void slotPlaylistAdded( Playlists::PlaylistPtr playlist, int category );
void slotPlaylistRemoved( Playlists::PlaylistPtr playlist, int category );
void slotPlaylistUpdated( Playlists::PlaylistPtr playlist, int category );
+ void slotCreateEmptyPlaylist();
private:
int m_playlistCategory;
QAction *m_appendAction;
QAction *m_loadAction;
+ QAction *m_createEmptyPlaylistAction;
};
}
diff --git a/src/browsers/playlistbrowser/PlaylistBrowserView.cpp b/src/browsers/playlistbrowser/PlaylistBrowserView.cpp
index 48465b2..9c4236d 100644
--- a/src/browsers/playlistbrowser/PlaylistBrowserView.cpp
+++ b/src/browsers/playlistbrowser/PlaylistBrowserView.cpp
@@ -286,7 +286,13 @@ PlaylistBrowserNS::PlaylistBrowserView::keyPressEvent( QKeyEvent *event )
void PlaylistBrowserNS::PlaylistBrowserView::contextMenuEvent( QContextMenuEvent *event )
{
- QModelIndexList indices = selectedIndexes();
+ QModelIndex clickedIdx = indexAt( event->pos() );
+
+ QModelIndexList indices;
+ if( selectedIndexes().contains( clickedIdx ) )
+ indices << selectedIndexes();
+ else
+ indices << clickedIdx;
QActionList actions = actionsFor( indices );
@@ -338,8 +344,8 @@ PlaylistBrowserNS::PlaylistBrowserView::actionsFor( QModelIndexList indexes )
QActionList actions;
foreach( QModelIndex idx, indexes )
{
- QActionList idxActions =
- idx.data( PlaylistBrowserNS::PlaylistBrowserModel::ActionRole ).value<QActionList>();
+ QActionList idxActions = model()->data( idx,
+ PlaylistBrowserNS::PlaylistBrowserModel::ActionRole ).value<QActionList>();
//only add unique actions model is responsible for making them unique
foreach( QAction *action, idxActions )
{
diff --git a/src/browsers/playlistbrowser/PlaylistsByProviderProxy.cpp b/src/browsers/playlistbrowser/PlaylistsByProviderProxy.cpp
index 8469639..1ce0c14 100644
--- a/src/browsers/playlistbrowser/PlaylistsByProviderProxy.cpp
+++ b/src/browsers/playlistbrowser/PlaylistsByProviderProxy.cpp
@@ -41,6 +41,8 @@ PlaylistsByProviderProxy::PlaylistsByProviderProxy( QAbstractItemModel *model, i
QVariant
PlaylistsByProviderProxy::data( const QModelIndex &idx, int role ) const
{
+ //TODO: actions for empty providers
+
//TODO: filter out actions not from the provider, possibly using QAction separators marking
// the source of the actions (makes sense in the UI as well.
diff --git a/src/browsers/playlistbrowser/PodcastModel.cpp b/src/browsers/playlistbrowser/PodcastModel.cpp
index 5923f2c..1cad82e 100644
--- a/src/browsers/playlistbrowser/PodcastModel.cpp
+++ b/src/browsers/playlistbrowser/PodcastModel.cpp
@@ -390,6 +390,12 @@ PlaylistBrowserNS::PodcastModel::refreshPodcasts()
QActionList
PlaylistBrowserNS::PodcastModel::actionsFor( const QModelIndex &idx ) const
{
+ if( !idx.isValid() )
+ {
+ //TODO: add podcast action
+ return QActionList();
+ }
+
QActionList actions = PlaylistBrowserModel::actionsFor( idx );
/* by default a list of podcast episodes can only be changed to isNew = false, except
diff --git a/src/browsers/playlistbrowser/QtGroupingProxy.cpp b/src/browsers/playlistbrowser/QtGroupingProxy.cpp
index 635f740..c6bbf8f 100644
--- a/src/browsers/playlistbrowser/QtGroupingProxy.cpp
+++ b/src/browsers/playlistbrowser/QtGroupingProxy.cpp
@@ -358,7 +358,8 @@ QVariant
QtGroupingProxy::data( const QModelIndex &index, int role ) const
{
if( !index.isValid() )
- return QVariant();
+ return sourceModel()->data( m_rootNode, role ); //rootNode could have useful data
+
//qDebug() << __FUNCTION__ << index << " role: " << role;
int row = index.row();
int column = index.column();
More information about the kde-doc-english
mailing list