aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/welcome/welcomeplugin.cpp
diff options
context:
space:
mode:
authorEike Ziller <eike.ziller@theqtcompany.com>2014-12-18 17:52:49 +0100
committerEike Ziller <eike.ziller@theqtcompany.com>2015-01-06 10:18:26 +0100
commit6fd79de664e75aaac283855faf9149d05385f30e (patch)
treeaed0da9d6cde63f636a6b955b66c7a5716d1f715 /src/plugins/welcome/welcomeplugin.cpp
parent5c2229a73f7c9f72a4f8bd9d8cc7aad628f92f9a (diff)
Welcome: unify code paths for adding pages
Change-Id: I5c581cb00b186fe7d6075d5ebb398982adfb16b3 Reviewed-by: Thomas Hartmann <Thomas.Hartmann@digia.com>
Diffstat (limited to 'src/plugins/welcome/welcomeplugin.cpp')
-rw-r--r--src/plugins/welcome/welcomeplugin.cpp162
1 files changed, 71 insertions, 91 deletions
diff --git a/src/plugins/welcome/welcomeplugin.cpp b/src/plugins/welcome/welcomeplugin.cpp
index 8a768e7834..51625f6f49 100644
--- a/src/plugins/welcome/welcomeplugin.cpp
+++ b/src/plugins/welcome/welcomeplugin.cpp
@@ -36,12 +36,13 @@
#include <coreplugin/icore.h>
#include <coreplugin/imode.h>
#include <coreplugin/iwelcomepage.h>
-#include <coreplugin/modemanager.h>
#include <coreplugin/iwizardfactory.h>
+#include <coreplugin/modemanager.h>
#include <utils/algorithm.h>
#include <utils/fileutils.h>
#include <utils/hostosinfo.h>
+#include <utils/qtcassert.h>
#include <utils/styledbar.h>
#include <utils/theme/theme.h>
@@ -72,6 +73,18 @@ static const char currentPageSettingsKeyC[] = "WelcomeTab";
namespace Welcome {
namespace Internal {
+static QString applicationDirPath()
+{
+ // normalize paths so QML doesn't freak out if it's wrongly capitalized on Windows
+ return Utils::FileUtils::normalizePathName(QCoreApplication::applicationDirPath());
+}
+
+static QString resourcePath()
+{
+ // normalize paths so QML doesn't freak out if it's wrongly capitalized on Windows
+ return Utils::FileUtils::normalizePathName(Core::ICore::resourcePath());
+}
+
class WelcomeMode : public Core::IMode
{
Q_OBJECT
@@ -106,10 +119,12 @@ private slots:
private:
void facilitateQml(QQmlEngine *engine);
+ void addPages(const QList<Core::IWelcomePage *> &pages);
QWidget *m_modeWidget;
QuickContainer *m_welcomePage;
- QList<QObject*> m_pluginList;
+ QMap<Core::Id, Core::IWelcomePage *> m_idPageMap;
+ QList<Core::IWelcomePage *> m_pluginList;
int m_activePlugin;
QQmlPropertyMap m_themeProperties;
};
@@ -154,7 +169,8 @@ WelcomeMode::WelcomeMode()
layout->addWidget(container);
#endif // USE_QUICK_WIDGET
- connect(PluginManager::instance(), SIGNAL(objectAdded(QObject*)), SLOT(welcomePluginAdded(QObject*)));
+ connect(Core::ICore::instance(), &Core::ICore::themeChanged, this, &WelcomeMode::onThemeChanged);
+
setWidget(m_modeWidget);
}
@@ -184,79 +200,24 @@ void WelcomeMode::sceneGraphError(QQuickWindow::SceneGraphError, const QString &
messageBox->show();
}
-void WelcomeMode::facilitateQml(QQmlEngine * /*engine*/)
+void WelcomeMode::facilitateQml(QQmlEngine *engine)
{
-}
-
-static QString applicationDirPath()
-{
- // normalize paths so QML doesn't freak out if it's wrongly capitalized on Windows
- return Utils::FileUtils::normalizePathName(QCoreApplication::applicationDirPath());
-}
-
-static QString resourcePath()
-{
- // normalize paths so QML doesn't freak out if it's wrongly capitalized on Windows
- return Utils::FileUtils::normalizePathName(Core::ICore::resourcePath());
-}
-
-void WelcomeMode::initPlugins()
-{
- QSettings *settings = Core::ICore::settings();
- setActivePlugin(settings->value(QLatin1String(currentPageSettingsKeyC)).toInt());
-
- QQmlContext *ctx = m_welcomePage->rootContext();
- ctx->setContextProperty(QLatin1String("welcomeMode"), this);
-
- QList<Core::IWelcomePage*> duplicatePlugins = PluginManager::getObjects<Core::IWelcomePage>();
- Utils::sort(duplicatePlugins, [](const Core::IWelcomePage *l, const Core::IWelcomePage *r) {
- return l->priority() < r->priority();
- });
-
- QList<Core::IWelcomePage*> plugins;
- QHash<Core::Id, Core::IWelcomePage*> pluginHash;
-
- //avoid duplicate ids - choose by priority
- foreach (Core::IWelcomePage* plugin, duplicatePlugins) {
- if (pluginHash.contains(plugin->id())) {
- Core::IWelcomePage* pluginOther = pluginHash.value(plugin->id());
-
- if (pluginOther->priority() > plugin->priority()) {
- plugins.removeAll(pluginOther);
- pluginHash.remove(pluginOther->id());
- plugins << plugin;
- pluginHash.insert(plugin->id(), plugin);
- }
-
- } else {
- plugins << plugin;
- pluginHash.insert(plugin->id(), plugin);
- }
- }
-
-
- QQmlEngine *engine = m_welcomePage->engine();
QStringList importPathList = engine->importPathList();
importPathList << resourcePath() + QLatin1String("/welcomescreen");
engine->setImportPathList(importPathList);
if (!debug)
engine->setOutputWarningsToStandardError(false);
+
QString pluginPath = applicationDirPath();
if (HostOsInfo::isMacHost())
pluginPath += QLatin1String("/../PlugIns");
else
pluginPath += QLatin1String("/../" IDE_LIBRARY_BASENAME "/qtcreator");
engine->addImportPath(QDir::cleanPath(pluginPath));
- facilitateQml(engine);
- foreach (Core::IWelcomePage *plugin, plugins) {
- plugin->facilitateQml(engine);
- m_pluginList.append(plugin);
- }
- ctx->setContextProperty(QLatin1String("pagesModel"), QVariant::fromValue(m_pluginList));
+ QQmlContext *ctx = engine->rootContext();
+ ctx->setContextProperty(QLatin1String("welcomeMode"), this);
- onThemeChanged();
- connect(Core::ICore::instance(), &Core::ICore::themeChanged, this, &WelcomeMode::onThemeChanged);
ctx->setContextProperty(QLatin1String("creatorTheme"), &m_themeProperties);
#if defined(USE_QUICK_WIDGET)
@@ -265,45 +226,64 @@ void WelcomeMode::initPlugins()
bool useNativeText = true;
#endif
ctx->setContextProperty(QLatin1String("useNativeText"), useNativeText);
+}
+
+void WelcomeMode::initPlugins()
+{
+ QSettings *settings = Core::ICore::settings();
+ setActivePlugin(settings->value(QLatin1String(currentPageSettingsKeyC)).toInt());
+
+ facilitateQml(m_welcomePage->engine());
+
+ QList<Core::IWelcomePage*> availablePages = PluginManager::getObjects<Core::IWelcomePage>();
+ addPages(availablePages);
+ // make sure later added pages are made available too:
+ connect(PluginManager::instance(), &PluginManager::objectAdded,
+ this, &WelcomeMode::welcomePluginAdded);
QString path = resourcePath() + QLatin1String("/welcomescreen/welcomescreen.qml");
// finally, load the root page
- m_welcomePage->setSource(
- QUrl::fromLocalFile(path));
+ m_welcomePage->setSource(QUrl::fromLocalFile(path));
}
void WelcomeMode::welcomePluginAdded(QObject *obj)
{
- QHash<Core::Id, Core::IWelcomePage*> pluginHash;
-
- foreach (QObject *obj, m_pluginList) {
- Core::IWelcomePage *plugin = qobject_cast<Core::IWelcomePage*>(obj);
- pluginHash.insert(plugin->id(), plugin);
- }
- if (Core::IWelcomePage *plugin = qobject_cast<Core::IWelcomePage*>(obj)) {
- //check for duplicated id
- if (pluginHash.contains(plugin->id())) {
- Core::IWelcomePage* pluginOther = pluginHash.value(plugin->id());
-
- if (pluginOther->priority() > plugin->priority())
- m_pluginList.removeAll(pluginOther);
- else
- return;
- }
+ Core::IWelcomePage *page = qobject_cast<Core::IWelcomePage*>(obj);
+ if (!page)
+ return;
+ addPages(QList<Core::IWelcomePage *>() << page);
+}
- int insertPos = 0;
- foreach (Core::IWelcomePage* p, PluginManager::getObjects<Core::IWelcomePage>()) {
- if (plugin->priority() < p->priority())
- insertPos++;
- else
- break;
- }
- m_pluginList.insert(insertPos, plugin);
- // update model through reset
- QQmlContext *ctx = m_welcomePage->rootContext();
- ctx->setContextProperty(QLatin1String("pagesModel"), QVariant::fromValue(m_pluginList));
+void WelcomeMode::addPages(const QList<Core::IWelcomePage *> &pages)
+{
+ QList<Core::IWelcomePage *> addedPages = pages;
+ Utils::sort(addedPages, [](const Core::IWelcomePage *l, const Core::IWelcomePage *r) {
+ return l->priority() < r->priority();
+ });
+ // insert into m_pluginList, keeping m_pluginList sorted by priority
+ QQmlEngine *engine = m_welcomePage->engine();
+ auto addIt = addedPages.begin();
+ auto currentIt = m_pluginList.begin();
+ while (addIt != addedPages.end()) {
+ Core::IWelcomePage *page = *addIt;
+ QTC_ASSERT(!m_idPageMap.contains(page->id()), ++addIt; continue);
+ while (currentIt != m_pluginList.end() && (*currentIt)->priority() <= page->priority())
+ ++currentIt;
+ // currentIt is now either end() or a page with higher value
+ currentIt = m_pluginList.insert(currentIt, page);
+ m_idPageMap.insert(page->id(), page);
+ page->facilitateQml(engine);
+ ++currentIt;
+ ++addIt;
}
+ // update model through reset
+ QQmlContext *ctx = engine->rootContext();
+ ctx->setContextProperty(QLatin1String("pagesModel"), QVariant::fromValue(
+ Utils::transform(m_pluginList, // transform into QList<QObject *>
+ [](Core::IWelcomePage *page) -> QObject * {
+ return page;
+ })));
}
WelcomePlugin::WelcomePlugin()