From e6f4c217bb9ebee9eb4353a0437bdc326c38c307 Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Sun, 16 Jun 2013 16:50:11 +0200 Subject: [PATCH 01/12] Add stub page to pull out again --- src/libtomahawk/ViewManager.cpp | 38 ++++++++++++++++++++++++ src/libtomahawk/ViewManager.h | 7 +++++ src/tomahawk/sourcetree/SourcesModel.cpp | 8 +++++ 3 files changed, 53 insertions(+) diff --git a/src/libtomahawk/ViewManager.cpp b/src/libtomahawk/ViewManager.cpp index 869adc27f..aa747ad54 100644 --- a/src/libtomahawk/ViewManager.cpp +++ b/src/libtomahawk/ViewManager.cpp @@ -60,6 +60,7 @@ #include "utils/Logger.h" #include +#include #include @@ -87,6 +88,7 @@ ViewManager::ViewManager( QObject* parent ) , m_inboxWidget( 0 ) , m_networkActivityWidget( 0 ) , m_currentPage( 0 ) + , m_stubWidget( 0 ) , m_loaded( false ) { s_instance = this; @@ -907,6 +909,42 @@ ViewPage *ViewManager::networkActivityWidget() const } +class StubWidget : public ViewPage +{ +public: + StubWidget(QObject* parent) +// : ViewPage(parent) + { + m_widget = (QWidget*) (new QLabel("Foobar")); + } + + virtual QWidget* widget() { return m_widget; } + virtual Tomahawk::playlistinterface_ptr playlistInterface() const { return Tomahawk::playlistinterface_ptr(); } + virtual QString title() const { return QString("Great title"); } + virtual QString description() const { return QString("Great description"); } + virtual bool jumpToCurrentTrack() { return false; } + +private: + QWidget* m_widget; +}; + +ViewPage* ViewManager::stubWidget() const +{ + return m_stubWidget; +} + + +ViewPage* ViewManager::showStub() +{ + if ( !m_stubWidget ) + { + m_stubWidget = new StubWidget( m_widget ); + } + + return show( m_stubWidget ); +} + + Tomahawk::ViewPage* ViewManager::superCollectionView() const { diff --git a/src/libtomahawk/ViewManager.h b/src/libtomahawk/ViewManager.h index cc89d3e5b..2b5f1ee78 100644 --- a/src/libtomahawk/ViewManager.h +++ b/src/libtomahawk/ViewManager.h @@ -58,6 +58,7 @@ class WhatsHotWidget; class QPushButton; class InboxModel; class NetworkActivityWidget; +class StubWidget; namespace Tomahawk { @@ -97,6 +98,7 @@ public: Tomahawk::ViewPage* superCollectionView() const; Tomahawk::ViewPage* inboxWidget() const; Tomahawk::ViewPage* networkActivityWidget() const; + Tomahawk::ViewPage* stubWidget() const; InboxModel* inboxModel(); @@ -143,6 +145,9 @@ public slots: Tomahawk::ViewPage* showRecentPlaysPage(); Tomahawk::ViewPage* showInboxPage(); Tomahawk::ViewPage* showNetworkActivityPage(); + + Tomahawk::ViewPage* showStub(); + void showCurrentTrack(); // Returns the shown viewpage @@ -198,6 +203,8 @@ private: InboxModel* m_inboxModel; NetworkActivityWidget* m_networkActivityWidget; + StubWidget* m_stubWidget; + QList< Tomahawk::collection_ptr > m_superCollections; QHash< Tomahawk::dynplaylist_ptr, QPointer > m_dynamicWidgets; diff --git a/src/tomahawk/sourcetree/SourcesModel.cpp b/src/tomahawk/sourcetree/SourcesModel.cpp index 91dbe9d29..f940c4ca3 100644 --- a/src/tomahawk/sourcetree/SourcesModel.cpp +++ b/src/tomahawk/sourcetree/SourcesModel.cpp @@ -332,6 +332,14 @@ SourcesModel::appendGroups() boost::bind( &ViewManager::newReleasesWidget, ViewManager::instance() ) ); newReleases->setSortValue( 6 ); + + GenericPageItem* stub = new GenericPageItem( this, browse, tr( "Stub page" ), ImageRegistry::instance()->icon( RESPATH "images/new-releases.svg" ), + boost::bind( &ViewManager::showStub, ViewManager::instance() ), + boost::bind( &ViewManager::stubWidget, ViewManager::instance() ) ); + stub->setSortValue( 7 ); + + + InboxItem* inbox = new InboxItem( this, browse ); inbox->setSortValue( 7 ); From d940d8436ec930c5360e55d065722ac57690a631 Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Sun, 16 Jun 2013 17:22:30 +0200 Subject: [PATCH 02/12] Use QList < ViewPage* > in ViewManager to store simple view pages --- src/libtomahawk/ViewManager.cpp | 19 ++++++++++++------- src/libtomahawk/ViewManager.h | 7 ++++--- src/tomahawk/sourcetree/SourcesModel.cpp | 5 +++-- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/libtomahawk/ViewManager.cpp b/src/libtomahawk/ViewManager.cpp index aa747ad54..40b29bc5f 100644 --- a/src/libtomahawk/ViewManager.cpp +++ b/src/libtomahawk/ViewManager.cpp @@ -88,7 +88,6 @@ ViewManager::ViewManager( QObject* parent ) , m_inboxWidget( 0 ) , m_networkActivityWidget( 0 ) , m_currentPage( 0 ) - , m_stubWidget( 0 ) , m_loaded( false ) { s_instance = this; @@ -928,20 +927,26 @@ private: QWidget* m_widget; }; -ViewPage* ViewManager::stubWidget() const + +ViewPage* +ViewManager::dynamicPageWidget( const QString& pageName ) const { - return m_stubWidget; + return m_dynamicPages.value( pageName ); } -ViewPage* ViewManager::showStub() +ViewPage* +ViewManager::showDynamicPage( const QString& pageName ) { - if ( !m_stubWidget ) + tLog() << Q_FUNC_INFO << "pageName: " << pageName; + + //HACK: this should be initialized somewhere else + if ( !dynamicPageWidget( pageName ) ) { - m_stubWidget = new StubWidget( m_widget ); + m_dynamicPages.insert( pageName, new StubWidget( m_widget ) ); } - return show( m_stubWidget ); + return show( dynamicPageWidget( pageName ) ); } diff --git a/src/libtomahawk/ViewManager.h b/src/libtomahawk/ViewManager.h index 2b5f1ee78..2a9b2e1e4 100644 --- a/src/libtomahawk/ViewManager.h +++ b/src/libtomahawk/ViewManager.h @@ -98,7 +98,8 @@ public: Tomahawk::ViewPage* superCollectionView() const; Tomahawk::ViewPage* inboxWidget() const; Tomahawk::ViewPage* networkActivityWidget() const; - Tomahawk::ViewPage* stubWidget() const; + + Tomahawk::ViewPage* dynamicPageWidget( const QString& pageName ) const; InboxModel* inboxModel(); @@ -146,7 +147,7 @@ public slots: Tomahawk::ViewPage* showInboxPage(); Tomahawk::ViewPage* showNetworkActivityPage(); - Tomahawk::ViewPage* showStub(); + Tomahawk::ViewPage* showDynamicPage( const QString& pageName ); void showCurrentTrack(); @@ -203,7 +204,7 @@ private: InboxModel* m_inboxModel; NetworkActivityWidget* m_networkActivityWidget; - StubWidget* m_stubWidget; + QHash< QString, Tomahawk::ViewPage* > m_dynamicPages; QList< Tomahawk::collection_ptr > m_superCollections; diff --git a/src/tomahawk/sourcetree/SourcesModel.cpp b/src/tomahawk/sourcetree/SourcesModel.cpp index f940c4ca3..7b779d1c7 100644 --- a/src/tomahawk/sourcetree/SourcesModel.cpp +++ b/src/tomahawk/sourcetree/SourcesModel.cpp @@ -334,8 +334,9 @@ SourcesModel::appendGroups() GenericPageItem* stub = new GenericPageItem( this, browse, tr( "Stub page" ), ImageRegistry::instance()->icon( RESPATH "images/new-releases.svg" ), - boost::bind( &ViewManager::showStub, ViewManager::instance() ), - boost::bind( &ViewManager::stubWidget, ViewManager::instance() ) ); + boost::bind( &ViewManager::showDynamicPage, ViewManager::instance(), QString( "stub" )), + boost::bind( &ViewManager::dynamicPageWidget, ViewManager::instance(), QString( "stub" ) ) ); + stub->setSortValue( 7 ); From 5e40988547a1edcea5c4ebcf816c3ae1890ef5ce Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Sun, 16 Jun 2013 17:44:56 +0200 Subject: [PATCH 03/12] Move stub page adding from appendGroups to SourcesModel ctor --- src/tomahawk/sourcetree/SourcesModel.cpp | 42 ++++++++++++++---------- src/tomahawk/sourcetree/SourcesModel.h | 6 ++++ 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/src/tomahawk/sourcetree/SourcesModel.cpp b/src/tomahawk/sourcetree/SourcesModel.cpp index 7b779d1c7..4e1037387 100644 --- a/src/tomahawk/sourcetree/SourcesModel.cpp +++ b/src/tomahawk/sourcetree/SourcesModel.cpp @@ -58,6 +58,10 @@ SourcesModel::SourcesModel( QObject* parent ) m_rootItem = new SourceTreeItem( this, 0, Invalid ); appendGroups(); + + // Add stub page + appendPageItem( ImageRegistry::instance()->icon( RESPATH "images/new-releases.svg" ), "Stub Page", "stub"); + onSourcesAdded( SourceList::instance()->sources() ); connect( SourceList::instance(), SIGNAL( sourceAdded( Tomahawk::source_ptr ) ), @@ -292,56 +296,48 @@ SourcesModel::appendGroups() { beginInsertRows( QModelIndex(), rowCount(), rowCount() + 4 ); - GroupItem* browse = new GroupItem( this, m_rootItem, tr( "Browse" ), 0 ); + m_browse = new GroupItem( this, m_rootItem, tr( "Browse" ), 0 ); new HistoryItem( this, m_rootItem, tr( "Search History" ), 1 ); // new SourceTreeItem( this, m_rootItem, SourcesModel::Divider, 2 ); m_myMusicGroup = new GroupItem( this, m_rootItem, tr( "My Music" ), 3 ); - GenericPageItem* dashboard = new GenericPageItem( this, browse, tr( "Dashboard" ), ImageRegistry::instance()->icon( RESPATH "images/dashboard.svg" ), + GenericPageItem* dashboard = new GenericPageItem( this, m_browse, tr( "Dashboard" ), ImageRegistry::instance()->icon( RESPATH "images/dashboard.svg" ), boost::bind( &ViewManager::showDashboard, ViewManager::instance() ), boost::bind( &ViewManager::dashboard, ViewManager::instance() ) ); dashboard->setSortValue( 0 ); // super collection - GenericPageItem* sc = new GenericPageItem( this, browse, tr( "SuperCollection" ), ImageRegistry::instance()->icon( RESPATH "images/supercollection.svg" ), + GenericPageItem* sc = new GenericPageItem( this, m_browse, tr( "SuperCollection" ), ImageRegistry::instance()->icon( RESPATH "images/supercollection.svg" ), boost::bind( &ViewManager::showSuperCollection, ViewManager::instance() ), boost::bind( &ViewManager::superCollectionView, ViewManager::instance() ) ); sc->setSortValue( 1 ); // browse section - LovedTracksItem* loved = new LovedTracksItem( this, browse ); + LovedTracksItem* loved = new LovedTracksItem( this, m_browse ); loved->setSortValue( 2 ); - GenericPageItem* networkActivity = new GenericPageItem( this, browse, tr( "Network Activity" ), TomahawkUtils::defaultPixmap( TomahawkUtils::NetworkActivity, TomahawkUtils::Original ), + GenericPageItem* networkActivity = new GenericPageItem( this, m_browse, tr( "Network Activity" ), TomahawkUtils::defaultPixmap( TomahawkUtils::NetworkActivity, TomahawkUtils::Original ), boost::bind( &ViewManager::showNetworkActivityPage, ViewManager::instance() ), boost::bind( &ViewManager::networkActivityWidget, ViewManager::instance() ) ); networkActivity->setSortValue( 3 ); - GenericPageItem* recent = new GenericPageItem( this, browse, tr( "Recently Played" ), ImageRegistry::instance()->icon( RESPATH "images/recently-played.svg" ), + GenericPageItem* recent = new GenericPageItem( this, m_browse, tr( "Recently Played" ), ImageRegistry::instance()->icon( RESPATH "images/recently-played.svg" ), boost::bind( &ViewManager::showRecentPlaysPage, ViewManager::instance() ), boost::bind( &ViewManager::recentPlaysWidget, ViewManager::instance() ) ); recent->setSortValue( 4 ); - GenericPageItem* hot = new GenericPageItem( this, browse, tr( "Charts" ), ImageRegistry::instance()->icon( RESPATH "images/charts.svg" ), + GenericPageItem* hot = new GenericPageItem( this, m_browse, tr( "Charts" ), ImageRegistry::instance()->icon( RESPATH "images/charts.svg" ), boost::bind( &ViewManager::showWhatsHotPage, ViewManager::instance() ), boost::bind( &ViewManager::whatsHotWidget, ViewManager::instance() ) ); hot->setSortValue( 5 ); - GenericPageItem* newReleases = new GenericPageItem( this, browse, tr( "New Releases" ), ImageRegistry::instance()->icon( RESPATH "images/new-releases.svg" ), + GenericPageItem* newReleases = new GenericPageItem( this, m_browse, tr( "New Releases" ), ImageRegistry::instance()->icon( RESPATH "images/new-releases.svg" ), boost::bind( &ViewManager::showNewReleasesPage, ViewManager::instance() ), boost::bind( &ViewManager::newReleasesWidget, ViewManager::instance() ) ); newReleases->setSortValue( 6 ); - GenericPageItem* stub = new GenericPageItem( this, browse, tr( "Stub page" ), ImageRegistry::instance()->icon( RESPATH "images/new-releases.svg" ), - boost::bind( &ViewManager::showDynamicPage, ViewManager::instance(), QString( "stub" )), - boost::bind( &ViewManager::dynamicPageWidget, ViewManager::instance(), QString( "stub" ) ) ); - - stub->setSortValue( 7 ); - - - - InboxItem* inbox = new InboxItem( this, browse ); + InboxItem* inbox = new InboxItem( this, m_browse ); inbox->setSortValue( 7 ); m_collectionsGroup = new GroupItem( this, m_rootItem, tr( "Friends" ), 4 ); @@ -351,6 +347,18 @@ SourcesModel::appendGroups() endInsertRows(); } +void +SourcesModel::appendPageItem( const QIcon& pageIcon, const QString& pageTitle, const QString& pageName ) +{ + +// beginInsertRows(); + GenericPageItem* pageItem = new GenericPageItem( this, m_browse, pageTitle, pageIcon, + boost::bind( &ViewManager::showDynamicPage, ViewManager::instance(), pageName ), + boost::bind( &ViewManager::dynamicPageWidget, ViewManager::instance(), pageName ) ); + m_browse; +// endInsertRows(); +} + void SourcesModel::appendItem( const Tomahawk::source_ptr& source ) diff --git a/src/tomahawk/sourcetree/SourcesModel.h b/src/tomahawk/sourcetree/SourcesModel.h index deff172b3..637642003 100644 --- a/src/tomahawk/sourcetree/SourcesModel.h +++ b/src/tomahawk/sourcetree/SourcesModel.h @@ -103,6 +103,11 @@ public: void appendGroups(); + /* + * pageIcon and pageTitle are visible in the source tree, pageName is the internal name in the ViewManager + */ + void appendPageItem( const QIcon& pageIcon, const QString& pageTitle, const QString& pageName ); + void appendItem( const Tomahawk::source_ptr& source ); bool removeItem( const Tomahawk::source_ptr& source ); @@ -152,6 +157,7 @@ private: SourceTreeItem* activatePlaylistPage( Tomahawk::ViewPage* p, SourceTreeItem* i ); SourceTreeItem* m_rootItem; + GroupItem* m_browse; GroupItem* m_collectionsGroup; GroupItem* m_myMusicGroup; GroupItem* m_cloudGroup; From afface1311e481de01a2b30911acb88870789fd0 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Sun, 16 Jun 2013 18:06:29 +0200 Subject: [PATCH 04/12] GenericPageItem insertion fixage. --- src/tomahawk/sourcetree/SourcesModel.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/tomahawk/sourcetree/SourcesModel.cpp b/src/tomahawk/sourcetree/SourcesModel.cpp index 4e1037387..2767ab196 100644 --- a/src/tomahawk/sourcetree/SourcesModel.cpp +++ b/src/tomahawk/sourcetree/SourcesModel.cpp @@ -350,13 +350,14 @@ SourcesModel::appendGroups() void SourcesModel::appendPageItem( const QIcon& pageIcon, const QString& pageTitle, const QString& pageName ) { - -// beginInsertRows(); + QModelIndex parentIndex = indexFromItem( m_browse ); + beginInsertRows( parentIndex, rowCount( parentIndex ), rowCount( parentIndex ) ); GenericPageItem* pageItem = new GenericPageItem( this, m_browse, pageTitle, pageIcon, boost::bind( &ViewManager::showDynamicPage, ViewManager::instance(), pageName ), boost::bind( &ViewManager::dynamicPageWidget, ViewManager::instance(), pageName ) ); - m_browse; -// endInsertRows(); + pageItem->setSortValue( rowCount( parentIndex ) ); + + endInsertRows(); } From 9d532d628569ce4ce598dc37dbc4099adf8ca548 Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Sun, 16 Jun 2013 18:29:49 +0200 Subject: [PATCH 05/12] Remove stub page from ViewManager implementation --- src/libtomahawk/ViewManager.cpp | 47 ++++++++++++++------------------- src/libtomahawk/ViewManager.h | 3 +++ 2 files changed, 23 insertions(+), 27 deletions(-) diff --git a/src/libtomahawk/ViewManager.cpp b/src/libtomahawk/ViewManager.cpp index 40b29bc5f..0d05d9f9a 100644 --- a/src/libtomahawk/ViewManager.cpp +++ b/src/libtomahawk/ViewManager.cpp @@ -908,30 +908,29 @@ ViewPage *ViewManager::networkActivityWidget() const } -class StubWidget : public ViewPage -{ -public: - StubWidget(QObject* parent) -// : ViewPage(parent) - { - m_widget = (QWidget*) (new QLabel("Foobar")); - } - - virtual QWidget* widget() { return m_widget; } - virtual Tomahawk::playlistinterface_ptr playlistInterface() const { return Tomahawk::playlistinterface_ptr(); } - virtual QString title() const { return QString("Great title"); } - virtual QString description() const { return QString("Great description"); } - virtual bool jumpToCurrentTrack() { return false; } - -private: - QWidget* m_widget; -}; - - ViewPage* ViewManager::dynamicPageWidget( const QString& pageName ) const { - return m_dynamicPages.value( pageName ); + if( m_dynamicPages.contains( pageName ) ) + return m_dynamicPages.value( pageName ); + + return 0; +} + + +void +ViewManager::addDynamicPage(const QString& pageName, ViewPage* page ) +{ + tLog() << Q_FUNC_INFO << "Trying to add " << pageName; + + if( dynamicPageWidget( pageName ) ) + { + tLog() << "Not adding a second ViewPage with name " << pageName; + Q_ASSERT( false ); + } + + m_dynamicPages.insert( pageName, page ); + emit viewPageAdded( pageName ); } @@ -940,12 +939,6 @@ ViewManager::showDynamicPage( const QString& pageName ) { tLog() << Q_FUNC_INFO << "pageName: " << pageName; - //HACK: this should be initialized somewhere else - if ( !dynamicPageWidget( pageName ) ) - { - m_dynamicPages.insert( pageName, new StubWidget( m_widget ) ); - } - return show( dynamicPageWidget( pageName ) ); } diff --git a/src/libtomahawk/ViewManager.h b/src/libtomahawk/ViewManager.h index 2a9b2e1e4..c8f1ef9d7 100644 --- a/src/libtomahawk/ViewManager.h +++ b/src/libtomahawk/ViewManager.h @@ -138,6 +138,8 @@ signals: void historyBackAvailable( bool avail ); void historyForwardAvailable( bool avail ); + void viewPageAdded( const QString& pageName ); + public slots: Tomahawk::ViewPage* showSuperCollection(); Tomahawk::ViewPage* showDashboard(); @@ -147,6 +149,7 @@ public slots: Tomahawk::ViewPage* showInboxPage(); Tomahawk::ViewPage* showNetworkActivityPage(); + void addDynamicPage( const QString& pageName, Tomahawk::ViewPage* page ); Tomahawk::ViewPage* showDynamicPage( const QString& pageName ); void showCurrentTrack(); From 4bd3ff8c1864ff8890ac3c1822835c8fa317318c Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Sun, 16 Jun 2013 19:35:58 +0200 Subject: [PATCH 06/12] Add generic page item for new view pages --- src/tomahawk/sourcetree/SourcesModel.cpp | 13 ++++++++++--- src/tomahawk/sourcetree/SourcesModel.h | 2 ++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/tomahawk/sourcetree/SourcesModel.cpp b/src/tomahawk/sourcetree/SourcesModel.cpp index 2767ab196..56b61b0ab 100644 --- a/src/tomahawk/sourcetree/SourcesModel.cpp +++ b/src/tomahawk/sourcetree/SourcesModel.cpp @@ -59,9 +59,6 @@ SourcesModel::SourcesModel( QObject* parent ) appendGroups(); - // Add stub page - appendPageItem( ImageRegistry::instance()->icon( RESPATH "images/new-releases.svg" ), "Stub Page", "stub"); - onSourcesAdded( SourceList::instance()->sources() ); connect( SourceList::instance(), SIGNAL( sourceAdded( Tomahawk::source_ptr ) ), @@ -80,6 +77,9 @@ SourcesModel::SourcesModel( QObject* parent ) this, SLOT( onScriptCollectionAdded( Tomahawk::collection_ptr ) ) ); connect( SourceList::instance(), SIGNAL( scriptCollectionRemoved( Tomahawk::collection_ptr ) ), this, SLOT( onScriptCollectionRemoved( Tomahawk::collection_ptr ) ) ); + + + connect( ViewManager::instance(), SIGNAL( viewPageAdded( QString ) ), SLOT( onViewPageAdded( QString ) ) ); } @@ -672,6 +672,13 @@ SourcesModel::onWidgetDestroyed( QWidget* w ) } +void +SourcesModel::onViewPageAdded( const QString& name ) +{ + appendPageItem( ImageRegistry::instance()->icon( RESPATH "images/new-releases.svg" ), name, name); +} + + void SourcesModel::removeSourceItemLink( SourceTreeItem* item ) { diff --git a/src/tomahawk/sourcetree/SourcesModel.h b/src/tomahawk/sourcetree/SourcesModel.h index 637642003..48172e57d 100644 --- a/src/tomahawk/sourcetree/SourcesModel.h +++ b/src/tomahawk/sourcetree/SourcesModel.h @@ -151,6 +151,8 @@ private slots: void onWidgetDestroyed( QWidget* w ); + void onViewPageAdded( const QString& name ); + private: SourceTreeItem* itemFromIndex( const QModelIndex& idx ) const; int rowForItem( SourceTreeItem* item ) const; From ebf774c3ac315c9025e2415e40070f7bc2b8c2cc Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Sun, 16 Jun 2013 21:33:52 +0200 Subject: [PATCH 07/12] Explicitly hide inactive view pages --- src/libtomahawk/ViewManager.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/libtomahawk/ViewManager.cpp b/src/libtomahawk/ViewManager.cpp index 0d05d9f9a..7a22c5061 100644 --- a/src/libtomahawk/ViewManager.cpp +++ b/src/libtomahawk/ViewManager.cpp @@ -673,8 +673,14 @@ ViewManager::setPage( ViewPage* page, bool trackHistory ) connect( obj, SIGNAL( destroyed( QWidget* ) ), SLOT( onWidgetDestroyed( QWidget* ) ), Qt::UniqueConnection ); } + QWidget *previousPage = m_stack->currentWidget(); + m_stack->setCurrentWidget( page->widget() ); + //This should save the CPU cycles, especially with pages like the visualizer + if(previousPage && previousPage != page->widget()) + previousPage->hide(); + updateView(); } From d83c2c3c06db219fe88fc6a08329c3d0621fbd16 Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Sun, 16 Jun 2013 21:34:31 +0200 Subject: [PATCH 08/12] Use XInitThreads() on X11 to enable loading the visualizer module --- src/tomahawk/main.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/tomahawk/main.cpp b/src/tomahawk/main.cpp index bde66a121..67a37b987 100644 --- a/src/tomahawk/main.cpp +++ b/src/tomahawk/main.cpp @@ -37,6 +37,10 @@ #ifdef WITH_BREAKPAD #include "breakpad/BreakPad.h" #endif + + #ifdef Q_WS_X11 // This is probably a very bad idea with Qt5 anyway... because (if at all) X lives in a QPA plugin + #include + #endif #endif @@ -138,6 +142,10 @@ main( int argc, char *argv[] ) #endif // Q_WS_MAC #endif //Q_OS_WIN + #ifdef Q_WS_X11 + XInitThreads(); + #endif + TomahawkApp a( argc, argv ); // MUST register StateHash ****before*** initing TomahawkSettingsGui as constructor of settings does upgrade before Gui subclass registers type From 7dbe504a0f50eeed826715ec467ef52a1725237d Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Sun, 16 Jun 2013 22:05:23 +0200 Subject: [PATCH 09/12] Add icon() method to ViewPage api and use that and title() for sidebar items --- src/libtomahawk/ViewPage.cpp | 5 +++++ src/libtomahawk/ViewPage.h | 1 + src/tomahawk/sourcetree/SourcesModel.cpp | 16 ++++++++++------ src/tomahawk/sourcetree/SourcesModel.h | 7 ++----- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/libtomahawk/ViewPage.cpp b/src/libtomahawk/ViewPage.cpp index 9b1704471..5e989745e 100644 --- a/src/libtomahawk/ViewPage.cpp +++ b/src/libtomahawk/ViewPage.cpp @@ -28,6 +28,11 @@ ViewPage::~ViewPage() tDebug( LOGVERBOSE ) << Q_FUNC_INFO; } +QIcon ViewPage::icon() const +{ + return QIcon(); +} + bool ViewPage::setFilter( const QString& filter ) diff --git a/src/libtomahawk/ViewPage.h b/src/libtomahawk/ViewPage.h index 9608770ba..5d9530aaf 100644 --- a/src/libtomahawk/ViewPage.h +++ b/src/libtomahawk/ViewPage.h @@ -49,6 +49,7 @@ public: virtual QWidget* widget() = 0; virtual Tomahawk::playlistinterface_ptr playlistInterface() const = 0; + virtual QIcon icon() const; virtual QString title() const = 0; virtual DescriptionType descriptionType() { return TextType; } diff --git a/src/tomahawk/sourcetree/SourcesModel.cpp b/src/tomahawk/sourcetree/SourcesModel.cpp index 56b61b0ab..a00d2e594 100644 --- a/src/tomahawk/sourcetree/SourcesModel.cpp +++ b/src/tomahawk/sourcetree/SourcesModel.cpp @@ -348,13 +348,17 @@ SourcesModel::appendGroups() } void -SourcesModel::appendPageItem( const QIcon& pageIcon, const QString& pageTitle, const QString& pageName ) +SourcesModel::appendPageItem( const QString& pageName ) { QModelIndex parentIndex = indexFromItem( m_browse ); beginInsertRows( parentIndex, rowCount( parentIndex ), rowCount( parentIndex ) ); - GenericPageItem* pageItem = new GenericPageItem( this, m_browse, pageTitle, pageIcon, - boost::bind( &ViewManager::showDynamicPage, ViewManager::instance(), pageName ), - boost::bind( &ViewManager::dynamicPageWidget, ViewManager::instance(), pageName ) ); + GenericPageItem* pageItem = new GenericPageItem( this, + m_browse, + ViewManager::instance()->dynamicPageWidget( pageName )->title(), + ViewManager::instance()->dynamicPageWidget( pageName )->icon(), + boost::bind( &ViewManager::showDynamicPage, ViewManager::instance(), pageName ), + boost::bind( &ViewManager::dynamicPageWidget, ViewManager::instance(), pageName ) ); + pageItem->setSortValue( rowCount( parentIndex ) ); endInsertRows(); @@ -673,9 +677,9 @@ SourcesModel::onWidgetDestroyed( QWidget* w ) void -SourcesModel::onViewPageAdded( const QString& name ) +SourcesModel::onViewPageAdded( const QString& pageName ) { - appendPageItem( ImageRegistry::instance()->icon( RESPATH "images/new-releases.svg" ), name, name); + appendPageItem( pageName ); } diff --git a/src/tomahawk/sourcetree/SourcesModel.h b/src/tomahawk/sourcetree/SourcesModel.h index 48172e57d..4ba534f28 100644 --- a/src/tomahawk/sourcetree/SourcesModel.h +++ b/src/tomahawk/sourcetree/SourcesModel.h @@ -103,10 +103,7 @@ public: void appendGroups(); - /* - * pageIcon and pageTitle are visible in the source tree, pageName is the internal name in the ViewManager - */ - void appendPageItem( const QIcon& pageIcon, const QString& pageTitle, const QString& pageName ); + void appendPageItem( const QString& pageName ); void appendItem( const Tomahawk::source_ptr& source ); bool removeItem( const Tomahawk::source_ptr& source ); @@ -151,7 +148,7 @@ private slots: void onWidgetDestroyed( QWidget* w ); - void onViewPageAdded( const QString& name ); + void onViewPageAdded( const QString& pageName ); private: SourceTreeItem* itemFromIndex( const QModelIndex& idx ) const; From 6c7bd96f303b6f26d4fd81f2beea565c963d50fe Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Sun, 16 Jun 2013 22:27:55 +0200 Subject: [PATCH 10/12] Clean up --- src/libtomahawk/ViewManager.cpp | 1 - src/libtomahawk/ViewManager.h | 1 - 2 files changed, 2 deletions(-) diff --git a/src/libtomahawk/ViewManager.cpp b/src/libtomahawk/ViewManager.cpp index 7a22c5061..0ea1069bd 100644 --- a/src/libtomahawk/ViewManager.cpp +++ b/src/libtomahawk/ViewManager.cpp @@ -60,7 +60,6 @@ #include "utils/Logger.h" #include -#include #include diff --git a/src/libtomahawk/ViewManager.h b/src/libtomahawk/ViewManager.h index c8f1ef9d7..66812fa57 100644 --- a/src/libtomahawk/ViewManager.h +++ b/src/libtomahawk/ViewManager.h @@ -58,7 +58,6 @@ class WhatsHotWidget; class QPushButton; class InboxModel; class NetworkActivityWidget; -class StubWidget; namespace Tomahawk { From 91a57c53054523ad5f7bd36588adcce319d3ff77 Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Sun, 16 Jun 2013 23:22:33 +0200 Subject: [PATCH 11/12] Revert "Add icon() method to ViewPage api and use that and title() for sidebar items" We can't lazy load the page when we need its members to show the sidebar entry... This reverts commit 1821b24391c33b2ea14fc0d094142395588075d9. --- src/libtomahawk/ViewPage.cpp | 5 ----- src/libtomahawk/ViewPage.h | 1 - src/tomahawk/sourcetree/SourcesModel.cpp | 16 ++++++---------- src/tomahawk/sourcetree/SourcesModel.h | 7 +++++-- 4 files changed, 11 insertions(+), 18 deletions(-) diff --git a/src/libtomahawk/ViewPage.cpp b/src/libtomahawk/ViewPage.cpp index 5e989745e..9b1704471 100644 --- a/src/libtomahawk/ViewPage.cpp +++ b/src/libtomahawk/ViewPage.cpp @@ -28,11 +28,6 @@ ViewPage::~ViewPage() tDebug( LOGVERBOSE ) << Q_FUNC_INFO; } -QIcon ViewPage::icon() const -{ - return QIcon(); -} - bool ViewPage::setFilter( const QString& filter ) diff --git a/src/libtomahawk/ViewPage.h b/src/libtomahawk/ViewPage.h index 5d9530aaf..9608770ba 100644 --- a/src/libtomahawk/ViewPage.h +++ b/src/libtomahawk/ViewPage.h @@ -49,7 +49,6 @@ public: virtual QWidget* widget() = 0; virtual Tomahawk::playlistinterface_ptr playlistInterface() const = 0; - virtual QIcon icon() const; virtual QString title() const = 0; virtual DescriptionType descriptionType() { return TextType; } diff --git a/src/tomahawk/sourcetree/SourcesModel.cpp b/src/tomahawk/sourcetree/SourcesModel.cpp index a00d2e594..56b61b0ab 100644 --- a/src/tomahawk/sourcetree/SourcesModel.cpp +++ b/src/tomahawk/sourcetree/SourcesModel.cpp @@ -348,17 +348,13 @@ SourcesModel::appendGroups() } void -SourcesModel::appendPageItem( const QString& pageName ) +SourcesModel::appendPageItem( const QIcon& pageIcon, const QString& pageTitle, const QString& pageName ) { QModelIndex parentIndex = indexFromItem( m_browse ); beginInsertRows( parentIndex, rowCount( parentIndex ), rowCount( parentIndex ) ); - GenericPageItem* pageItem = new GenericPageItem( this, - m_browse, - ViewManager::instance()->dynamicPageWidget( pageName )->title(), - ViewManager::instance()->dynamicPageWidget( pageName )->icon(), - boost::bind( &ViewManager::showDynamicPage, ViewManager::instance(), pageName ), - boost::bind( &ViewManager::dynamicPageWidget, ViewManager::instance(), pageName ) ); - + GenericPageItem* pageItem = new GenericPageItem( this, m_browse, pageTitle, pageIcon, + boost::bind( &ViewManager::showDynamicPage, ViewManager::instance(), pageName ), + boost::bind( &ViewManager::dynamicPageWidget, ViewManager::instance(), pageName ) ); pageItem->setSortValue( rowCount( parentIndex ) ); endInsertRows(); @@ -677,9 +673,9 @@ SourcesModel::onWidgetDestroyed( QWidget* w ) void -SourcesModel::onViewPageAdded( const QString& pageName ) +SourcesModel::onViewPageAdded( const QString& name ) { - appendPageItem( pageName ); + appendPageItem( ImageRegistry::instance()->icon( RESPATH "images/new-releases.svg" ), name, name); } diff --git a/src/tomahawk/sourcetree/SourcesModel.h b/src/tomahawk/sourcetree/SourcesModel.h index 4ba534f28..48172e57d 100644 --- a/src/tomahawk/sourcetree/SourcesModel.h +++ b/src/tomahawk/sourcetree/SourcesModel.h @@ -103,7 +103,10 @@ public: void appendGroups(); - void appendPageItem( const QString& pageName ); + /* + * pageIcon and pageTitle are visible in the source tree, pageName is the internal name in the ViewManager + */ + void appendPageItem( const QIcon& pageIcon, const QString& pageTitle, const QString& pageName ); void appendItem( const Tomahawk::source_ptr& source ); bool removeItem( const Tomahawk::source_ptr& source ); @@ -148,7 +151,7 @@ private slots: void onWidgetDestroyed( QWidget* w ); - void onViewPageAdded( const QString& pageName ); + void onViewPageAdded( const QString& name ); private: SourceTreeItem* itemFromIndex( const QModelIndex& idx ) const; From 7130504777326aa35895f9c07e887f1dcf29bba3 Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Sun, 16 Jun 2013 23:59:17 +0200 Subject: [PATCH 12/12] Allow to set icon and text for externally added generic page items without instantiating them (aka fix lazy loading for vsxu widget) --- src/libtomahawk/ViewManager.cpp | 20 ++++++++++++++++---- src/libtomahawk/ViewManager.h | 16 ++++++++++------ src/tomahawk/sourcetree/SourcesModel.cpp | 17 +++++------------ src/tomahawk/sourcetree/SourcesModel.h | 10 ++++------ 4 files changed, 35 insertions(+), 28 deletions(-) diff --git a/src/libtomahawk/ViewManager.cpp b/src/libtomahawk/ViewManager.cpp index 0ea1069bd..c3e38a1ab 100644 --- a/src/libtomahawk/ViewManager.cpp +++ b/src/libtomahawk/ViewManager.cpp @@ -924,18 +924,18 @@ ViewManager::dynamicPageWidget( const QString& pageName ) const void -ViewManager::addDynamicPage(const QString& pageName, ViewPage* page ) +ViewManager::addDynamicPage( const QString& pageName, const QString& text, const QIcon& icon, boost::function instanceLoader ) { tLog() << Q_FUNC_INFO << "Trying to add " << pageName; - if( dynamicPageWidget( pageName ) ) + if( m_dynamicPages.contains( pageName ) ) { tLog() << "Not adding a second ViewPage with name " << pageName; Q_ASSERT( false ); } - m_dynamicPages.insert( pageName, page ); - emit viewPageAdded( pageName ); + m_dynamicPagesInstanceLoaders.insert( pageName, instanceLoader ); + emit viewPageAdded( pageName, text, icon ); } @@ -944,6 +944,18 @@ ViewManager::showDynamicPage( const QString& pageName ) { tLog() << Q_FUNC_INFO << "pageName: " << pageName; + if( !m_dynamicPages.contains( pageName ) ) + { + if( !m_dynamicPagesInstanceLoaders.contains( pageName ) ) + { + tLog() << "Trying to show a page that does not exist and does not have a registered loader"; + Q_ASSERT(false); + return 0; + } + m_dynamicPages.insert( pageName, m_dynamicPagesInstanceLoaders.value( pageName )() ); + m_dynamicPagesInstanceLoaders.remove( pageName ); + } + return show( dynamicPageWidget( pageName ) ); } diff --git a/src/libtomahawk/ViewManager.h b/src/libtomahawk/ViewManager.h index 66812fa57..d41c2f122 100644 --- a/src/libtomahawk/ViewManager.h +++ b/src/libtomahawk/ViewManager.h @@ -20,16 +20,19 @@ #ifndef VIEWMANAGER_H #define VIEWMANAGER_H -#include -#include -#include - #include "Artist.h" #include "collection/Collection.h" #include "PlaylistInterface.h" #include "playlist/QueueView.h" #include "ViewPage.h" +#include +#include +#include + +// best regards to you, mr. pimple aka xhochy :) +#include + #include "DllMacro.h" class AnimatedSplitter; @@ -137,7 +140,7 @@ signals: void historyBackAvailable( bool avail ); void historyForwardAvailable( bool avail ); - void viewPageAdded( const QString& pageName ); + void viewPageAdded( const QString& pageName, const QString& text, const QIcon& icon ); public slots: Tomahawk::ViewPage* showSuperCollection(); @@ -148,7 +151,7 @@ public slots: Tomahawk::ViewPage* showInboxPage(); Tomahawk::ViewPage* showNetworkActivityPage(); - void addDynamicPage( const QString& pageName, Tomahawk::ViewPage* page ); + void addDynamicPage( const QString& pageName, const QString& text, const QIcon& icon, boost::function< Tomahawk::ViewPage*() > instanceLoader ); Tomahawk::ViewPage* showDynamicPage( const QString& pageName ); void showCurrentTrack(); @@ -207,6 +210,7 @@ private: NetworkActivityWidget* m_networkActivityWidget; QHash< QString, Tomahawk::ViewPage* > m_dynamicPages; + QHash< QString, boost::function< Tomahawk::ViewPage*() > > m_dynamicPagesInstanceLoaders; QList< Tomahawk::collection_ptr > m_superCollections; diff --git a/src/tomahawk/sourcetree/SourcesModel.cpp b/src/tomahawk/sourcetree/SourcesModel.cpp index 56b61b0ab..8a9b6fdf5 100644 --- a/src/tomahawk/sourcetree/SourcesModel.cpp +++ b/src/tomahawk/sourcetree/SourcesModel.cpp @@ -79,7 +79,7 @@ SourcesModel::SourcesModel( QObject* parent ) this, SLOT( onScriptCollectionRemoved( Tomahawk::collection_ptr ) ) ); - connect( ViewManager::instance(), SIGNAL( viewPageAdded( QString ) ), SLOT( onViewPageAdded( QString ) ) ); + connect( ViewManager::instance(), SIGNAL( viewPageAdded( QString, QString, QIcon ) ), SLOT( appendPageItem( QString, QString, QIcon ) ) ); } @@ -348,13 +348,13 @@ SourcesModel::appendGroups() } void -SourcesModel::appendPageItem( const QIcon& pageIcon, const QString& pageTitle, const QString& pageName ) +SourcesModel::appendPageItem( const QString& name, const QString& text, const QIcon& icon ) { QModelIndex parentIndex = indexFromItem( m_browse ); beginInsertRows( parentIndex, rowCount( parentIndex ), rowCount( parentIndex ) ); - GenericPageItem* pageItem = new GenericPageItem( this, m_browse, pageTitle, pageIcon, - boost::bind( &ViewManager::showDynamicPage, ViewManager::instance(), pageName ), - boost::bind( &ViewManager::dynamicPageWidget, ViewManager::instance(), pageName ) ); + GenericPageItem* pageItem = new GenericPageItem( this, m_browse, text, icon, + boost::bind( &ViewManager::showDynamicPage, ViewManager::instance(), name ), + boost::bind( &ViewManager::dynamicPageWidget, ViewManager::instance(), name ) ); pageItem->setSortValue( rowCount( parentIndex ) ); endInsertRows(); @@ -672,13 +672,6 @@ SourcesModel::onWidgetDestroyed( QWidget* w ) } -void -SourcesModel::onViewPageAdded( const QString& name ) -{ - appendPageItem( ImageRegistry::instance()->icon( RESPATH "images/new-releases.svg" ), name, name); -} - - void SourcesModel::removeSourceItemLink( SourceTreeItem* item ) { diff --git a/src/tomahawk/sourcetree/SourcesModel.h b/src/tomahawk/sourcetree/SourcesModel.h index 48172e57d..ab0150289 100644 --- a/src/tomahawk/sourcetree/SourcesModel.h +++ b/src/tomahawk/sourcetree/SourcesModel.h @@ -103,11 +103,6 @@ public: void appendGroups(); - /* - * pageIcon and pageTitle are visible in the source tree, pageName is the internal name in the ViewManager - */ - void appendPageItem( const QIcon& pageIcon, const QString& pageTitle, const QString& pageName ); - void appendItem( const Tomahawk::source_ptr& source ); bool removeItem( const Tomahawk::source_ptr& source ); @@ -151,7 +146,10 @@ private slots: void onWidgetDestroyed( QWidget* w ); - void onViewPageAdded( const QString& name ); + /* + * pageIcon and pageTitle are visible in the source tree, pageName is the internal name in the ViewManager + */ + void appendPageItem( const QString& name, const QString& text, const QIcon& icon ); private: SourceTreeItem* itemFromIndex( const QModelIndex& idx ) const;