From cfbccb85cf365dd855fa912186dd9d64e5871009 Mon Sep 17 00:00:00 2001 From: Leo Franchi Date: Sun, 29 Jul 2012 15:08:43 -0400 Subject: [PATCH] TWK-1017: Show now-playing icon next to playlist in flat view mode --- src/libtomahawk/ViewManager.cpp | 1 + src/libtomahawk/playlist/FlexibleView.cpp | 37 ++++++++++++++++++++++- src/libtomahawk/playlist/FlexibleView.h | 5 +++ src/sourcetree/items/PlaylistItems.cpp | 9 ++++-- 4 files changed, 49 insertions(+), 3 deletions(-) diff --git a/src/libtomahawk/ViewManager.cpp b/src/libtomahawk/ViewManager.cpp index 7ec8e0f5d..bae8e9b5e 100644 --- a/src/libtomahawk/ViewManager.cpp +++ b/src/libtomahawk/ViewManager.cpp @@ -2,6 +2,7 @@ * * Copyright 2010-2011, Christian Muehlhaeuser * Copyright 2010-2011, Jeff Mitchell + * Copyright 2010-2012, Leo Franchi * * Tomahawk is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/libtomahawk/playlist/FlexibleView.cpp b/src/libtomahawk/playlist/FlexibleView.cpp index 3a6d7534d..187b3e34c 100644 --- a/src/libtomahawk/playlist/FlexibleView.cpp +++ b/src/libtomahawk/playlist/FlexibleView.cpp @@ -27,12 +27,39 @@ #include "playlist/TrackView.h" #include "playlist/GridView.h" #include "playlist/PlaylistLargeItemDelegate.h" +#include "PlayableProxyModelPlaylistInterface.h" #include "utils/TomahawkUtilsGui.h" #include "utils/Logger.h" using namespace Tomahawk; +class FlexibleViewInterface : public PlayableProxyModelPlaylistInterface { + Q_OBJECT +public: + explicit FlexibleViewInterface( PlayableProxyModel* proxy, FlexibleView* view ) : PlayableProxyModelPlaylistInterface( proxy ), m_view( view ) {} + + virtual bool hasChildInterface( playlistinterface_ptr playlistInterface ) + { + if ( m_view.isNull() ) + return false; + + if ( m_view.data()->detailedView() && m_view.data()->detailedView()->proxyModel()->playlistInterface() == playlistInterface ) + return true; + + if ( m_view.data()->gridView() && m_view.data()->gridView()->playlistInterface()->hasChildInterface( playlistInterface ) ) + return true; + + if ( m_view.data()->trackView() && m_view.data()->trackView()->proxyModel()->playlistInterface() == playlistInterface ) + return true; + + return false; + } + +private: + QWeakPointer m_view; +}; + FlexibleView::FlexibleView( QWidget* parent ) : QWidget( parent ) , m_header( new FlexibleHeader( this ) ) @@ -43,6 +70,8 @@ FlexibleView::FlexibleView( QWidget* parent ) { qRegisterMetaType< FlexibleViewMode >( "FlexibleViewMode" ); + m_playlistInterface = playlistinterface_ptr( new FlexibleViewInterface( m_trackView->proxyModel(), this ) ); + PlaylistLargeItemDelegate* del = new PlaylistLargeItemDelegate( PlaylistLargeItemDelegate::LovedTracks, m_trackView, m_trackView->proxyModel() ); connect( del, SIGNAL( updateIndex( QModelIndex ) ), m_trackView, SLOT( update( QModelIndex ) ) ); m_trackView->setItemDelegate( del ); @@ -79,8 +108,12 @@ FlexibleView::setTrackView( TrackView* view ) delete m_trackView; } + if ( view && m_trackView != view ) + m_playlistInterface = playlistinterface_ptr( new FlexibleViewInterface( view->proxyModel(), this ) ); + m_trackView = view; m_stack->addWidget( view ); + } @@ -169,7 +202,7 @@ FlexibleView::setCurrentMode( FlexibleViewMode mode ) Tomahawk::playlistinterface_ptr FlexibleView::playlistInterface() const { - return m_trackView->playlistInterface(); + return m_playlistInterface; } @@ -232,3 +265,5 @@ FlexibleView::setPixmap( const QPixmap& pixmap ) m_pixmap = pixmap; m_header->setPixmap( pixmap ); } + +#include "FlexibleView.moc" diff --git a/src/libtomahawk/playlist/FlexibleView.h b/src/libtomahawk/playlist/FlexibleView.h index 3b502643a..a78104116 100644 --- a/src/libtomahawk/playlist/FlexibleView.h +++ b/src/libtomahawk/playlist/FlexibleView.h @@ -29,6 +29,7 @@ class GridView; class TrackView; class PlayableModel; class FlexibleHeader; +class FlexibleViewInterface; class DLLEXPORT FlexibleView : public QWidget, public Tomahawk::ViewPage { @@ -80,10 +81,14 @@ private: TrackView* m_detailedView; GridView* m_gridView; + Tomahawk::playlistinterface_ptr m_playlistInterface; + PlayableModel* m_model; QStackedWidget* m_stack; FlexibleViewMode m_mode; + + friend class ::FlexibleViewInterface; }; Q_DECLARE_METATYPE( FlexibleView::FlexibleViewMode ); diff --git a/src/sourcetree/items/PlaylistItems.cpp b/src/sourcetree/items/PlaylistItems.cpp index c36313796..3630b1f0d 100644 --- a/src/sourcetree/items/PlaylistItems.cpp +++ b/src/sourcetree/items/PlaylistItems.cpp @@ -108,8 +108,13 @@ PlaylistItem::IDValue() const bool PlaylistItem::isBeingPlayed() const { - if ( ViewManager::instance()->pageForPlaylist( m_playlist ) ) - return AudioEngine::instance()->currentTrackPlaylist() == ViewManager::instance()->pageForPlaylist( m_playlist )->playlistInterface(); + if ( ViewPage* page = ViewManager::instance()->pageForPlaylist( m_playlist ) ) + { + if ( AudioEngine::instance()->currentTrackPlaylist() == page->playlistInterface() ) + return true; + if ( page->playlistInterface()->hasChildInterface( AudioEngine::instance()->currentTrackPlaylist() ) ) + return true; + } return false; }