diff --git a/src/libtomahawk/ContextMenu.cpp b/src/libtomahawk/ContextMenu.cpp index 277723b8c..6945b878e 100644 --- a/src/libtomahawk/ContextMenu.cpp +++ b/src/libtomahawk/ContextMenu.cpp @@ -214,6 +214,9 @@ ContextMenu::setQueries( const QList& queries ) addSeparator(); + if ( m_supportedActions & ActionMarkListened ) + m_sigmap->setMapping( addAction( tr( "Mark as &Listened" ) ), ActionMarkListened ); + if ( m_supportedActions & ActionDelete ) m_sigmap->setMapping( addAction( queries.count() > 1 ? tr( "&Remove Items" ) : tr( "&Remove Item" ) ), ActionDelete ); diff --git a/src/libtomahawk/ContextMenu.h b/src/libtomahawk/ContextMenu.h index 5b60324d6..2e523eafe 100644 --- a/src/libtomahawk/ContextMenu.h +++ b/src/libtomahawk/ContextMenu.h @@ -49,7 +49,8 @@ public: ActionAlbumPage = 67, ActionEditMetadata = 128, ActionPlaylist = 256, - ActionSend = 512 + ActionSend = 512, + ActionMarkListened = 1024 }; explicit ContextMenu( QWidget* parent = 0 ); diff --git a/src/libtomahawk/Track.cpp b/src/libtomahawk/Track.cpp index b4068afdd..eefceef74 100644 --- a/src/libtomahawk/Track.cpp +++ b/src/libtomahawk/Track.cpp @@ -172,7 +172,7 @@ Track::startPlaying() DatabaseCommand_LogPlayback::Started ); Database::instance()->enqueue( QSharedPointer< DatabaseCommand >( cmd ) ); - + markAsListened(); } @@ -183,7 +183,12 @@ Track::finishPlaying( int timeElapsed ) DatabaseCommand_LogPlayback::Finished, timeElapsed ); Database::instance()->enqueue( QSharedPointer< DatabaseCommand >( cmd ) ); +} + +void +Track::markAsListened() +{ bool isUnlistened = false; foreach ( Tomahawk::SocialAction action, allSocialActions() ) { diff --git a/src/libtomahawk/Track.h b/src/libtomahawk/Track.h index 8d94f011c..5e9d59e97 100644 --- a/src/libtomahawk/Track.h +++ b/src/libtomahawk/Track.h @@ -111,6 +111,7 @@ public: void startPlaying(); void finishPlaying( int timeElapsed ); + void markAsListened(); signals: void coverChanged(); diff --git a/src/libtomahawk/playlist/InboxModel.cpp b/src/libtomahawk/playlist/InboxModel.cpp index 79aa0ed5b..4deec1030 100644 --- a/src/libtomahawk/playlist/InboxModel.cpp +++ b/src/libtomahawk/playlist/InboxModel.cpp @@ -171,6 +171,20 @@ InboxModel::showNotification( InboxJobItem::Side side, } +void +InboxModel::markAsListened( const QModelIndexList& indexes ) +{ + foreach ( QModelIndex index, indexes ) + { + PlayableItem* item = itemFromIndex( index ); + if ( item && !item->query().isNull() ) + { + item->query()->queryTrack()->markAsListened(); + } + } +} + + void InboxModel::loadTracks() { diff --git a/src/libtomahawk/playlist/InboxModel.h b/src/libtomahawk/playlist/InboxModel.h index f593cd810..7e3decd82 100644 --- a/src/libtomahawk/playlist/InboxModel.h +++ b/src/libtomahawk/playlist/InboxModel.h @@ -53,6 +53,8 @@ public slots: const QString& dbid, const Tomahawk::trackdata_ptr& track ); + virtual void markAsListened( const QModelIndexList& indexes ); + private slots: void loadTracks(); diff --git a/src/libtomahawk/playlist/InboxView.cpp b/src/libtomahawk/playlist/InboxView.cpp index 83ea65a70..090c65df5 100644 --- a/src/libtomahawk/playlist/InboxView.cpp +++ b/src/libtomahawk/playlist/InboxView.cpp @@ -20,6 +20,8 @@ #include "InboxView.h" #include "InboxModel.h" #include "PlayableProxyModel.h" +#include "ContextMenu.h" +#include "utils/Logger.h" InboxView::InboxView(QWidget *parent) : TrackView(parent) @@ -36,3 +38,28 @@ InboxView::deleteSelectedItems() proxyModel()->removeIndexes( selectedIndexes() ); } } + + +void +InboxView::onMenuTriggered( int action ) +{ + if ( action == Tomahawk::ContextMenu::ActionMarkListened ) + { + tDebug() << Q_FUNC_INFO << "Mark as Listened"; + InboxModel* inboxModel = qobject_cast< InboxModel* >( model() ); + if ( inboxModel != 0 ) + { + QModelIndexList sourceIndexes; + foreach ( const QModelIndex& index, selectedIndexes() ) + { + if ( index.column() ) + continue; + + sourceIndexes << proxyModel()->mapToSource( index ); + } + inboxModel->markAsListened( sourceIndexes ); + } + } + else + TrackView::onMenuTriggered( action ); +} diff --git a/src/libtomahawk/playlist/InboxView.h b/src/libtomahawk/playlist/InboxView.h index 298422b69..88052b816 100644 --- a/src/libtomahawk/playlist/InboxView.h +++ b/src/libtomahawk/playlist/InboxView.h @@ -33,6 +33,8 @@ public slots: * Reimplemented in order to ignore PlayableModel::isReadOnly() */ virtual void deleteSelectedItems(); + + virtual void onMenuTriggered( int action ); }; #endif // INBOXVIEW_H diff --git a/src/libtomahawk/playlist/TrackView.cpp b/src/libtomahawk/playlist/TrackView.cpp index 9dd24300c..aedae4d89 100644 --- a/src/libtomahawk/playlist/TrackView.cpp +++ b/src/libtomahawk/playlist/TrackView.cpp @@ -34,6 +34,7 @@ #include "utils/Closure.h" #include "utils/AnimatedSpinner.h" #include "utils/Logger.h" +#include "InboxModel.h" #include @@ -45,7 +46,6 @@ using namespace Tomahawk; - TrackView::TrackView( QWidget* parent ) : QTreeView( parent ) , m_model( 0 ) @@ -651,6 +651,9 @@ TrackView::onCustomContextMenu( const QPoint& pos ) if ( model() && !model()->isReadOnly() ) m_contextMenu->setSupportedActions( m_contextMenu->supportedActions() | ContextMenu::ActionDelete ); + if ( model() && qobject_cast< InboxModel* >( model() ) ) + m_contextMenu->setSupportedActions( m_contextMenu->supportedActions() | ContextMenu::ActionMarkListened + | ContextMenu::ActionDelete ); QList queries; foreach ( const QModelIndex& index, selectedIndexes() ) diff --git a/src/libtomahawk/playlist/TrackView.h b/src/libtomahawk/playlist/TrackView.h index a793f6d16..947da07fb 100644 --- a/src/libtomahawk/playlist/TrackView.h +++ b/src/libtomahawk/playlist/TrackView.h @@ -93,7 +93,7 @@ public slots: virtual void deleteSelectedItems(); void playItem(); - void onMenuTriggered( int action ); + virtual void onMenuTriggered( int action ); void onViewChanged(); void onScrollTimeout();