From aec8c97eac7eb5ce34f4c4dc21d7e7e33cd15941 Mon Sep 17 00:00:00 2001 From: Leo Franchi Date: Mon, 2 May 2011 22:05:29 -0400 Subject: [PATCH] Add context menu item to create track links --- src/CMakeLists.txt | 2 -- src/libtomahawk/CMakeLists.txt | 2 ++ src/{ => libtomahawk}/globalactionmanager.cpp | 24 +++++++++++++++++++ src/{ => libtomahawk}/globalactionmanager.h | 6 ++++- src/libtomahawk/playlist/collectionview.cpp | 7 ++++-- src/libtomahawk/playlist/playlistview.cpp | 10 +++++++- src/libtomahawk/playlist/playlistview.h | 1 - src/libtomahawk/playlist/trackview.cpp | 18 ++++++++++++-- src/libtomahawk/playlist/trackview.h | 4 +++- 9 files changed, 64 insertions(+), 10 deletions(-) rename src/{ => libtomahawk}/globalactionmanager.cpp (95%) rename src/{ => libtomahawk}/globalactionmanager.h (90%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6d12bff02..5186ddd2b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -39,7 +39,6 @@ SET( tomahawkSources ${tomahawkSources} musicscanner.cpp shortcuthandler.cpp - globalactionmanager.cpp scanmanager.cpp tomahawkapp.cpp main.cpp @@ -82,7 +81,6 @@ SET( tomahawkHeaders ${tomahawkHeaders} musicscanner.h scanmanager.h shortcuthandler.h - globalactionmanager.h ) IF(LIBLASTFM_FOUND) diff --git a/src/libtomahawk/CMakeLists.txt b/src/libtomahawk/CMakeLists.txt index 54b726ee7..3e1d9e258 100644 --- a/src/libtomahawk/CMakeLists.txt +++ b/src/libtomahawk/CMakeLists.txt @@ -29,6 +29,7 @@ set( libSources source.cpp viewpage.cpp viewmanager.cpp + globalactionmanager.cpp sip/SipPlugin.cpp sip/SipHandler.cpp @@ -183,6 +184,7 @@ set( libHeaders source.h viewpage.h viewmanager.h + globalactionmanager.h artist.h album.h diff --git a/src/globalactionmanager.cpp b/src/libtomahawk/globalactionmanager.cpp similarity index 95% rename from src/globalactionmanager.cpp rename to src/libtomahawk/globalactionmanager.cpp index 8667d5ed2..1526b96b3 100644 --- a/src/globalactionmanager.cpp +++ b/src/libtomahawk/globalactionmanager.cpp @@ -31,6 +31,8 @@ #include #include +#include +#include GlobalActionManager* GlobalActionManager::s_instance = 0; @@ -53,6 +55,28 @@ GlobalActionManager::GlobalActionManager( QObject* parent ) GlobalActionManager::~GlobalActionManager() {} +QUrl +GlobalActionManager::openLinkFromQuery( const Tomahawk::query_ptr& query ) const +{ + QUrl link( "tomahawk://open/track/" ); + if( !query->track().isEmpty() ) + link.addQueryItem( "title", query->track() ); + if( !query->artist().isEmpty() ) + link.addQueryItem( "artist", query->artist() ); + if( !query->album().isEmpty() ) + link.addQueryItem( "album", query->album() ); + + return link; +} + +void +GlobalActionManager::copyToClipboard( const Tomahawk::query_ptr& query ) const +{ + QClipboard* cb = QApplication::clipboard(); + cb->setText( openLinkFromQuery( query ).toEncoded() ); +} + + bool GlobalActionManager::parseTomahawkLink( const QString& url ) { diff --git a/src/globalactionmanager.h b/src/libtomahawk/globalactionmanager.h similarity index 90% rename from src/globalactionmanager.h rename to src/libtomahawk/globalactionmanager.h index 3f6265cf5..55c645d3d 100644 --- a/src/globalactionmanager.h +++ b/src/libtomahawk/globalactionmanager.h @@ -21,17 +21,21 @@ #define GLOBALACTIONMANAGER_H #include "playlist.h" +#include "dllmacro.h" #include #include -class GlobalActionManager : public QObject +class DLLEXPORT GlobalActionManager : public QObject { Q_OBJECT public: static GlobalActionManager* instance(); virtual ~GlobalActionManager(); + QUrl openLinkFromQuery( const Tomahawk::query_ptr& query ) const; + void copyToClipboard( const Tomahawk::query_ptr& query ) const; + public slots: bool parseTomahawkLink( const QString& link ); void waitingForResolved( bool ); diff --git a/src/libtomahawk/playlist/collectionview.cpp b/src/libtomahawk/playlist/collectionview.cpp index 6d93742f6..1b4d02c0f 100644 --- a/src/libtomahawk/playlist/collectionview.cpp +++ b/src/libtomahawk/playlist/collectionview.cpp @@ -1,5 +1,5 @@ /* === This file is part of Tomahawk Player - === - * + * * Copyright 2010-2011, Christian Muehlhaeuser * * Tomahawk is free software: you can redistribute it and/or modify @@ -83,7 +83,10 @@ CollectionView::setupMenus() m_playItemAction = m_itemMenu.addAction( tr( "&Play" ) ); m_addItemsToQueueAction = m_itemMenu.addAction( tr( "Add to &Queue" ) ); -// m_itemMenu.addSeparator(); + m_itemMenu.addSeparator(); + + foreach( QAction* a, actions() ) + m_itemMenu.addAction( a ); // m_addItemsToPlaylistAction = m_itemMenu.addAction( tr( "&Add to Playlist" ) ); connect( m_playItemAction, SIGNAL( triggered() ), SLOT( playItem() ) ); diff --git a/src/libtomahawk/playlist/playlistview.cpp b/src/libtomahawk/playlist/playlistview.cpp index 175d0705a..ddd19ecc0 100644 --- a/src/libtomahawk/playlist/playlistview.cpp +++ b/src/libtomahawk/playlist/playlistview.cpp @@ -30,6 +30,12 @@ using namespace Tomahawk; PlaylistView::PlaylistView( QWidget* parent ) : TrackView( parent ) + , m_model( 0 ) + , m_itemMenu( 0 ) + , m_playItemAction( 0 ) + , m_addItemsToQueueAction( 0 ) + , m_addItemsToPlaylistAction( 0 ) + , m_deleteItemsAction( 0 ) { setProxyModel( new PlaylistProxyModel( this ) ); @@ -84,6 +90,9 @@ PlaylistView::setupMenus() m_playItemAction = m_itemMenu.addAction( tr( "&Play" ) ); m_addItemsToQueueAction = m_itemMenu.addAction( tr( "Add to &Queue" ) ); m_itemMenu.addSeparator(); + + foreach( QAction* a, actions() ) + m_itemMenu.addAction( a ); // m_addItemsToPlaylistAction = m_itemMenu.addAction( tr( "&Add to Playlist" ) ); // m_itemMenu.addSeparator(); m_deleteItemsAction = m_itemMenu.addAction( i > 1 ? tr( "&Delete Items" ) : tr( "&Delete Item" ) ); @@ -144,7 +153,6 @@ PlaylistView::deleteItems() proxyModel()->removeIndexes( selectedIndexes() ); } - void PlaylistView::onTrackCountChanged( unsigned int tracks ) { diff --git a/src/libtomahawk/playlist/playlistview.h b/src/libtomahawk/playlist/playlistview.h index 84df64805..589c5f815 100644 --- a/src/libtomahawk/playlist/playlistview.h +++ b/src/libtomahawk/playlist/playlistview.h @@ -65,7 +65,6 @@ private slots: void deleteItems(); void onDeleted(); - private: void setupMenus(); diff --git a/src/libtomahawk/playlist/trackview.cpp b/src/libtomahawk/playlist/trackview.cpp index c7ab24d61..db7a619f4 100644 --- a/src/libtomahawk/playlist/trackview.cpp +++ b/src/libtomahawk/playlist/trackview.cpp @@ -33,7 +33,8 @@ #include "queueview.h" #include "trackmodel.h" #include "trackproxymodel.h" -#include +#include "track.h" +#include "globalactionmanager.h" using namespace Tomahawk; @@ -77,6 +78,10 @@ TrackView::TrackView( QWidget* parent ) setFont( f ); #endif + QAction* createLinkAction = new QAction( tr( "Copy track link" ), this ); + connect( createLinkAction, SIGNAL( triggered( bool ) ), this, SLOT( copyLink() ) ); + addAction( createLinkAction ); + connect( this, SIGNAL( doubleClicked( QModelIndex ) ), SLOT( onItemActivated( QModelIndex ) ) ); } @@ -173,7 +178,6 @@ TrackView::onItemResized( const QModelIndex& index ) m_delegate->updateRowSize( index ); } - void TrackView::playItem() { @@ -341,6 +345,16 @@ TrackView::onFilterChanged( const QString& ) m_overlay->hide(); } +void +TrackView::copyLink() +{ + TrackModelItem* item = model()->itemFromIndex( proxyModel()->mapToSource( contextMenuIndex() ) ); + if ( item && !item->query().isNull() ) + { + GlobalActionManager::instance()->copyToClipboard( item->query() ); + } +} + void TrackView::startDrag( Qt::DropActions supportedActions ) diff --git a/src/libtomahawk/playlist/trackview.h b/src/libtomahawk/playlist/trackview.h index aac8b2a11..c14b42692 100644 --- a/src/libtomahawk/playlist/trackview.h +++ b/src/libtomahawk/playlist/trackview.h @@ -1,5 +1,5 @@ /* === This file is part of Tomahawk Player - === - * + * * Copyright 2010-2011, Christian Muehlhaeuser * * Tomahawk is free software: you can redistribute it and/or modify @@ -26,6 +26,7 @@ #include "dllmacro.h" +class QAction; class LoadingSpinner; class PlaylistInterface; class TrackHeader; @@ -80,6 +81,7 @@ private slots: void onFilterChanged( const QString& filter ); + void copyLink(); private: QString m_guid; TrackModel* m_model;