From 7130504777326aa35895f9c07e887f1dcf29bba3 Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Sun, 16 Jun 2013 23:59:17 +0200 Subject: [PATCH] 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;