1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-03-26 02:32:35 +01:00

* Added stop-after-track context menu entry.

This commit is contained in:
Christian Muehlhaeuser 2012-03-31 05:17:07 +02:00
parent eddaec701b
commit c3e3944421
9 changed files with 59 additions and 18 deletions

@ -516,6 +516,16 @@ AudioEngine::loadNextTrack()
Tomahawk::result_ptr result;
if ( !m_stopAfterTrack.isNull() && !m_currentTrack.isNull() )
{
if ( m_stopAfterTrack.data() == m_currentTrack->toQuery().data() )
{
m_stopAfterTrack.clear();
stop();
return;
}
}
if ( m_queue && m_queue->trackCount() )
{
result = m_queue->nextItem();
@ -555,7 +565,9 @@ AudioEngine::playItem( Tomahawk::playlistinterface_ptr playlist, const Tomahawk:
m_currentTrackPlaylist = playlist;
if ( !result.isNull() )
{
loadTrack( result );
}
else if ( !m_playlist.isNull() && m_playlist.data()->retryMode() == PlaylistInterface::Retry )
{
m_waitingOnNewTrack = true;
@ -678,6 +690,9 @@ AudioEngine::timerTriggered( qint64 time )
void
AudioEngine::setPlaylist( Tomahawk::playlistinterface_ptr playlist )
{
if ( m_playlist == playlist )
return;
if ( !m_playlist.isNull() )
{
if ( m_playlist.data() && m_playlist.data()->retryMode() == PlaylistInterface::Retry )
@ -691,8 +706,9 @@ AudioEngine::setPlaylist( Tomahawk::playlistinterface_ptr playlist )
emit playlistChanged( playlist );
return;
}
m_playlist = playlist;
m_stopAfterTrack.clear();
if ( !m_playlist.isNull() && m_playlist.data() && m_playlist.data()->retryMode() == PlaylistInterface::Retry )
connect( m_playlist.data(), SIGNAL( nextTrackReady() ), SLOT( onPlaylistNextTrackReady() ) );
@ -704,16 +720,16 @@ AudioEngine::setPlaylist( Tomahawk::playlistinterface_ptr playlist )
void
AudioEngine::setCurrentTrack( const Tomahawk::result_ptr& result )
{
m_lastTrack = m_currentTrack;
if ( !m_lastTrack.isNull() )
Tomahawk::result_ptr lastTrack = m_currentTrack;
if ( !lastTrack.isNull() )
{
if ( TomahawkSettings::instance()->privateListeningMode() == TomahawkSettings::PublicListening )
{
DatabaseCommand_LogPlayback* cmd = new DatabaseCommand_LogPlayback( m_lastTrack, DatabaseCommand_LogPlayback::Finished, m_timeElapsed );
DatabaseCommand_LogPlayback* cmd = new DatabaseCommand_LogPlayback( lastTrack, DatabaseCommand_LogPlayback::Finished, m_timeElapsed );
Database::instance()->enqueue( QSharedPointer<DatabaseCommand>(cmd) );
}
emit finished( m_lastTrack );
emit finished( lastTrack );
}
m_currentTrack = result;

@ -64,6 +64,8 @@ public:
Tomahawk::playlistinterface_ptr playlist() const { return m_playlist; }
Tomahawk::result_ptr currentTrack() const { return m_currentTrack; }
Tomahawk::query_ptr stopAfterTrack() const { return m_stopAfterTrack; }
qint64 currentTime() const { return m_mediaObject->currentTime(); }
qint64 currentTrackTotalTime() const { return m_mediaObject->totalTime(); }
@ -91,6 +93,8 @@ public slots:
void playItem( Tomahawk::playlistinterface_ptr playlist, const Tomahawk::result_ptr& result );
void setPlaylist( Tomahawk::playlistinterface_ptr playlist );
void setQueue( Tomahawk::playlistinterface_ptr queue ) { m_queue = queue; }
void setStopAfterTrack( const Tomahawk::query_ptr& query ) { m_stopAfterTrack = query; }
signals:
void loading( const Tomahawk::result_ptr& track );
@ -141,8 +145,8 @@ private:
QSharedPointer<QIODevice> m_input;
Tomahawk::query_ptr m_stopAfterTrack;
Tomahawk::result_ptr m_currentTrack;
Tomahawk::result_ptr m_lastTrack;
Tomahawk::playlistinterface_ptr m_playlist;
Tomahawk::playlistinterface_ptr m_currentTrackPlaylist;
Tomahawk::playlistinterface_ptr m_queue;

@ -37,7 +37,7 @@ ContextMenu::ContextMenu( QWidget* parent )
m_sigmap = new QSignalMapper( this );
connect( m_sigmap, SIGNAL( mapped( int ) ), SLOT( onTriggered( int ) ) );
m_supportedActions = ActionPlay | ActionQueue | ActionCopyLink | ActionLove;
m_supportedActions = ActionPlay | ActionQueue | ActionCopyLink | ActionLove | ActionStopAfter;
}
@ -80,6 +80,14 @@ ContextMenu::setQueries( const QList<Tomahawk::query_ptr>& queries )
if ( m_supportedActions & ActionQueue )
m_sigmap->setMapping( addAction( tr( "Add to &Queue" ) ), ActionQueue );
if ( m_supportedActions & ActionStopAfter && itemCount() == 1 )
{
if ( AudioEngine::instance()->stopAfterTrack() == queries.first() )
m_sigmap->setMapping( addAction( tr( "&Continue playback after this track" ) ), ActionStopAfter );
else
m_sigmap->setMapping( addAction( tr( "&Stop playback after this track" ) ), ActionStopAfter );
}
addSeparator();
if ( m_supportedActions & ActionLove && itemCount() == 1 )
@ -110,7 +118,6 @@ ContextMenu::setQueries( const QList<Tomahawk::query_ptr>& queries )
void
ContextMenu::setQuery( const Tomahawk::query_ptr& query )
{
QList<query_ptr> queries;
queries << query;
setQueries( queries );
@ -212,6 +219,13 @@ ContextMenu::onTriggered( int action )
m_queries.first()->setLoved( !m_queries.first()->loved() );
break;
case ActionStopAfter:
if ( AudioEngine::instance()->stopAfterTrack() == m_queries.first() )
AudioEngine::instance()->setStopAfterTrack( query_ptr() );
else
AudioEngine::instance()->setStopAfterTrack( m_queries.first() );
break;
default:
emit triggered( action );
}

@ -40,7 +40,8 @@ public:
ActionQueue = 2,
ActionDelete = 4,
ActionCopyLink = 8,
ActionLove = 16
ActionLove = 16,
ActionStopAfter = 32
};
explicit ContextMenu( QWidget* parent = 0 );

@ -82,10 +82,7 @@ TrackModelItem::entry() const
const Tomahawk::query_ptr&
TrackModelItem::query() const
{
if ( !m_entry.isNull() )
return m_entry->query();
else
return m_query;
return m_query;
}

@ -558,7 +558,12 @@ TrackView::onCustomContextMenu( const QPoint& pos )
TrackModelItem* item = proxyModel()->itemFromIndex( proxyModel()->mapToSource( index ) );
if ( item && !item->query().isNull() )
queries << item->query();
{
if ( item->query()->numResults() > 0 )
queries << item->query()->results().first()->toQuery();
else
queries << item->query();
}
}
m_contextMenu->setQueries( queries );

@ -58,7 +58,6 @@ Query::get( const QString& artist, const QString& track, const QString& album, c
query_ptr
Query::get( const QString& query, const QID& qid )
{
query_ptr q = query_ptr( new Query( query, qid ), &QObject::deleteLater );
q->setWeakRef( q.toWeakRef() );
@ -164,10 +163,12 @@ Query::addResults( const QList< Tomahawk::result_ptr >& newresults )
m_results << newresults;
qStableSort( m_results.begin(), m_results.end(), Query::resultSorter );
query_ptr q = m_ownRef.toStrongRef();
// hook up signals, and check solved status
foreach( const result_ptr& rp, newresults )
{
rp->setQuery( q );
connect( rp.data(), SIGNAL( statusChanged() ), SLOT( onResultStatusChanged() ) );
}
}
@ -538,7 +539,7 @@ Query::parseSocialActions()
{
Tomahawk::SocialAction socialAction;
socialAction = it.next();
if ( socialAction.timestamp.toUInt() > highestTimestamp && socialAction.source->id() == SourceList::instance()->getLocal()->id() )
if ( socialAction.timestamp.toUInt() > highestTimestamp && socialAction.source->isLocal() )
{
m_currentSocialActions[ socialAction.action.toString() ] = socialAction.value.toBool();
}
@ -568,7 +569,7 @@ Query::setLoved( bool loved )
query_ptr q = m_ownRef.toStrongRef();
if ( q )
{
m_currentSocialActions[ "Loved" ] = loved;
m_currentSocialActions[ "Love" ] = loved;
Tomahawk::InfoSystem::InfoStringHash trackInfo;
trackInfo["title"] = track();
@ -581,6 +582,8 @@ Query::setLoved( bool loved )
DatabaseCommand_SocialAction* cmd = new DatabaseCommand_SocialAction( q, QString( "Love" ), loved ? QString( "true" ) : QString( "false" ) );
Database::instance()->enqueue( QSharedPointer<DatabaseCommand>(cmd) );
emit socialActionsLoaded();
}
}

@ -85,6 +85,7 @@ public:
int year() const { return m_year; }
unsigned int discnumber() const { return m_discnumber; }
void setQuery( const Tomahawk::query_ptr& query ) { m_query = query; }
void setScore( float score ) { m_score = score; }
void setTrackId( unsigned int id ) { m_trackId = id; }
void setFileId( unsigned int id ) { m_fileId = id; }

@ -80,7 +80,7 @@ void
QueryLabel::init()
{
m_contextMenu = new ContextMenu( this );
m_contextMenu->setSupportedActions( ContextMenu::ActionQueue | ContextMenu::ActionCopyLink );
m_contextMenu->setSupportedActions( ContextMenu::ActionQueue | ContextMenu::ActionCopyLink | ContextMenu::ActionStopAfter | ContextMenu::ActionLove );
m_hoverType = None;
setContentsMargins( 0, 0, 0, 0 );