diff --git a/src/plugins/coreplugin/mainwindow.cpp b/src/plugins/coreplugin/mainwindow.cpp index 52366e00f14..7b06e450bb7 100644 --- a/src/plugins/coreplugin/mainwindow.cpp +++ b/src/plugins/coreplugin/mainwindow.cpp @@ -327,6 +327,8 @@ void MainWindow::extensionsInitialized() m_leftNavigationWidget->setFactories(INavigationWidgetFactory::allNavigationFactories()); m_rightNavigationWidget->setFactories(INavigationWidgetFactory::allNavigationFactories()); + ModeManager::extensionsInitialized(); + readSettings(); updateContext(); diff --git a/src/plugins/coreplugin/modemanager.cpp b/src/plugins/coreplugin/modemanager.cpp index 74dd7321cd7..68831ddee3d 100644 --- a/src/plugins/coreplugin/modemanager.cpp +++ b/src/plugins/coreplugin/modemanager.cpp @@ -37,6 +37,7 @@ #include +#include #include #include @@ -59,8 +60,10 @@ namespace Core { struct ModeManagerPrivate { void showMenu(int index, QMouseEvent *event); - void addModeHelper(IMode *mode); + void addModeHelper(int index); void enabledStateChanged(IMode *mode); + void activateModeHelper(Id id); + void extensionsInitializedHelper(); Internal::MainWindow *m_mainWindow; Internal::FancyTabWidget *m_modeStack; @@ -71,6 +74,9 @@ struct ModeManagerPrivate Context m_addedContexts; int m_oldCurrent; bool m_modeSelectorVisible; + + bool m_startingUp = true; + Id m_pendingFirstActiveMode; // Valid before extentionsInitialized. }; static ModeManagerPrivate *d; @@ -138,29 +144,51 @@ static IMode *findMode(Id id) void ModeManager::activateMode(Id id) { - const int currentIndex = d->m_modeStack->currentIndex(); - const int newIndex = indexOf(id); - if (newIndex != currentIndex && newIndex >= 0) - d->m_modeStack->setCurrentIndex(newIndex); + d->activateModeHelper(id); +} + +void ModeManagerPrivate::activateModeHelper(Id id) +{ + if (m_startingUp) { + m_pendingFirstActiveMode = id; + } else { + const int currentIndex = m_modeStack->currentIndex(); + const int newIndex = indexOf(id); + if (newIndex != currentIndex && newIndex >= 0) + m_modeStack->setCurrentIndex(newIndex); + } +} + +void ModeManager::extensionsInitialized() +{ + d->extensionsInitializedHelper(); +} + +void ModeManagerPrivate::extensionsInitializedHelper() +{ + m_startingUp = false; + + Utils::sort(m_modes, &IMode::priority); + std::reverse(m_modes.begin(), m_modes.end()); + + for (int index = 0; index < m_modes.size(); ++index) + addModeHelper(index); + + if (m_pendingFirstActiveMode.isValid()) + activateModeHelper(m_pendingFirstActiveMode); } void ModeManager::addMode(IMode *mode) { - // Delay needed to get access to subclass's IMode::widget(). - QTimer::singleShot(0, [mode] { d->addModeHelper(mode); }); + QTC_ASSERT(d->m_startingUp, return); + d->m_modes.append(mode); } -void ModeManagerPrivate::addModeHelper(IMode *mode) +void ModeManagerPrivate::addModeHelper(int index) { + IMode *mode = m_modes.at(index); m_mainWindow->addContextObject(mode); - // Count the number of modes with a higher priority - int index = 0; - foreach (const IMode *m, m_modes) - if (m->priority() > mode->priority()) - ++index; - - m_modes.insert(index, mode); m_modeStack->insertTab(index, mode->widget(), mode->icon(), mode->displayName(), mode->menu() != nullptr); m_modeStack->setTabEnabled(index, mode->isEnabled()); diff --git a/src/plugins/coreplugin/modemanager.h b/src/plugins/coreplugin/modemanager.h index 1927f6f375c..1aaf723f00d 100644 --- a/src/plugins/coreplugin/modemanager.h +++ b/src/plugins/coreplugin/modemanager.h @@ -70,6 +70,8 @@ private: explicit ModeManager(Internal::MainWindow *mainWindow, Internal::FancyTabWidget *modeStack); ~ModeManager(); + static void extensionsInitialized(); + static void addMode(IMode *mode); static void removeMode(IMode *mode); void currentTabAboutToChange(int index);