diff --git a/src/libtomahawk/playlist/AlbumView.cpp b/src/libtomahawk/playlist/AlbumView.cpp index e279c4bc2..602e52edc 100644 --- a/src/libtomahawk/playlist/AlbumView.cpp +++ b/src/libtomahawk/playlist/AlbumView.cpp @@ -32,6 +32,7 @@ #include "AlbumItem.h" #include "AlbumItemDelegate.h" #include "AlbumModel.h" +#include "ContextMenu.h" #include "ViewManager.h" #include "utils/Logger.h" #include "utils/AnimatedSpinner.h" @@ -48,6 +49,7 @@ AlbumView::AlbumView( QWidget* parent ) , m_delegate( 0 ) , m_loadingSpinner( new AnimatedSpinner( this ) ) , m_overlay( new OverlayWidget( this ) ) + , m_contextMenu( new ContextMenu( this ) ) , m_inited( false ) { setDragEnabled( true ); @@ -57,18 +59,20 @@ AlbumView::AlbumView( QWidget* parent ) setSpacing( 0 ); setContentsMargins( 0, 0, 0, 0 ); setMouseTracking( true ); - - setStyleSheet( "QListView { background-color: #323435; }" ); - + setContextMenuPolicy( Qt::CustomContextMenu ); setResizeMode( Adjust ); setViewMode( IconMode ); setVerticalScrollMode( QAbstractItemView::ScrollPerPixel ); setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOn ); + setStyleSheet( "QListView { background-color: #323435; }" ); + setAutoFitItems( true ); setProxyModel( new AlbumProxyModel( this ) ); connect( this, SIGNAL( doubleClicked( QModelIndex ) ), SLOT( onItemActivated( QModelIndex ) ) ); + connect( this, SIGNAL( customContextMenuRequested( QPoint ) ), SLOT( onCustomContextMenu( QPoint ) ) ); +// connect( m_contextMenu, SIGNAL( triggered( int ) ), SLOT( onMenuTriggered( int ) ) ); } @@ -259,3 +263,42 @@ AlbumView::startDrag( Qt::DropActions supportedActions ) /* Qt::DropAction action = */ drag->exec( supportedActions, Qt::CopyAction ); } + + +void +AlbumView::onCustomContextMenu( const QPoint& pos ) +{ + m_contextMenu->clear(); + + QModelIndex idx = indexAt( pos ); + idx = idx.sibling( idx.row(), 0 ); + m_contextMenuIndex = idx; + + if ( !idx.isValid() ) + return; + + QList queries; + QList artists; + QList albums; + + foreach ( const QModelIndex& index, selectedIndexes() ) + { + if ( index.column() || selectedIndexes().contains( index.parent() ) ) + continue; + + AlbumItem* item = m_model->itemFromIndex( m_proxyModel->mapToSource( index ) ); + + if ( item && !item->query().isNull() ) + queries << item->query(); + else if ( item && !item->artist().isNull() ) + artists << item->artist(); + else if ( item && !item->album().isNull() ) + albums << item->album(); + } + + m_contextMenu->setQueries( queries ); + m_contextMenu->setArtists( artists ); + m_contextMenu->setAlbums( albums ); + + m_contextMenu->exec( viewport()->mapToGlobal( pos ) ); +} diff --git a/src/libtomahawk/playlist/AlbumView.h b/src/libtomahawk/playlist/AlbumView.h index d9b35213a..e72b2fa2a 100644 --- a/src/libtomahawk/playlist/AlbumView.h +++ b/src/libtomahawk/playlist/AlbumView.h @@ -29,6 +29,11 @@ #include "widgets/OverlayWidget.h" #include "DllMacro.h" +namespace Tomahawk +{ + class ContextMenu; +}; + class AlbumModel; class AnimatedSpinner; class AlbumItemDelegate; @@ -82,8 +87,8 @@ protected slots: private slots: void onItemCountChanged( unsigned int items ); - void onFilterChanged( const QString& filter ); + void onCustomContextMenu( const QPoint& pos ); private: void adjustItemSize( const QRect& rect ); @@ -94,6 +99,9 @@ private: AnimatedSpinner* m_loadingSpinner; OverlayWidget* m_overlay; + QModelIndex m_contextMenuIndex; + Tomahawk::ContextMenu* m_contextMenu; + bool m_inited; bool m_autoFitItems;