diff --git a/src/plugins/coreplugin/navigationsubwidget.cpp b/src/plugins/coreplugin/navigationsubwidget.cpp index 354c7810e3f..0087980f040 100644 --- a/src/plugins/coreplugin/navigationsubwidget.cpp +++ b/src/plugins/coreplugin/navigationsubwidget.cpp @@ -41,6 +41,7 @@ #include #include +#include #include #include @@ -75,6 +76,12 @@ NavigationSubWidget::NavigationSubWidget(NavigationWidget *parentWidget, int pos QToolButton *splitAction = new QToolButton(); splitAction->setIcon(QIcon(QLatin1String(Constants::ICON_SPLIT_HORIZONTAL))); splitAction->setToolTip(tr("Split")); + splitAction->setPopupMode(QToolButton::InstantPopup); + splitAction->setProperty("noArrow", true); + m_splitMenu = new QMenu(splitAction); + splitAction->setMenu(m_splitMenu); + connect(m_splitMenu, &QMenu::aboutToShow, this, &NavigationSubWidget::populateSplitMenu); + QToolButton *close = new QToolButton(); close->setIcon(QIcon(QLatin1String(Constants::ICON_BUTTON_CLOSE))); close->setToolTip(tr("Close")); @@ -88,7 +95,6 @@ NavigationSubWidget::NavigationSubWidget(NavigationWidget *parentWidget, int pos setLayout(lay); lay->addWidget(m_toolBar); - connect(splitAction, SIGNAL(clicked()), this, SIGNAL(splitMe())); connect(close, SIGNAL(clicked()), this, SIGNAL(closeMe())); setFactoryIndex(factoryIndex); @@ -136,6 +142,18 @@ void NavigationSubWidget::comboBoxIndexChanged(int factoryIndex) restoreSettings(); } +void NavigationSubWidget::populateSplitMenu() +{ + m_splitMenu->clear(); + QAbstractItemModel *factoryModel = m_parentWidget->factoryModel(); + int count = factoryModel->rowCount(); + for (int i = 0; i < count; ++i) { + QModelIndex index = factoryModel->index(i, 0); + QAction *action = m_splitMenu->addAction(factoryModel->data(index).toString()); + connect(action, &QAction::triggered, this, [this, i]() { emit splitMe(i); }); + } +} + void NavigationSubWidget::setFocusWidget() { if (m_navigationWidget) diff --git a/src/plugins/coreplugin/navigationsubwidget.h b/src/plugins/coreplugin/navigationsubwidget.h index f711e2ecc3c..afb56bef8c3 100644 --- a/src/plugins/coreplugin/navigationsubwidget.h +++ b/src/plugins/coreplugin/navigationsubwidget.h @@ -36,6 +36,7 @@ #include QT_BEGIN_NAMESPACE +class QMenu; class QToolButton; QT_END_NAMESPACE @@ -71,15 +72,18 @@ public: Command *command(const QString &title) const; signals: - void splitMe(); + void splitMe(int factoryIndex); void closeMe(); private slots: void comboBoxIndexChanged(int); private: + void populateSplitMenu(); + NavigationWidget *m_parentWidget; QComboBox *m_navigationComboBox; + QMenu *m_splitMenu; QWidget *m_navigationWidget; INavigationWidgetFactory *m_navigationWidgetFactory; Utils::StyledBar *m_toolBar; diff --git a/src/plugins/coreplugin/navigationwidget.cpp b/src/plugins/coreplugin/navigationwidget.cpp index 5e54004a184..3e359341f33 100644 --- a/src/plugins/coreplugin/navigationwidget.cpp +++ b/src/plugins/coreplugin/navigationwidget.cpp @@ -247,7 +247,8 @@ Internal::NavigationSubWidget *NavigationWidget::insertSubItem(int position,int } Internal::NavigationSubWidget *nsw = new Internal::NavigationSubWidget(this, position, index); - connect(nsw, SIGNAL(splitMe()), this, SLOT(splitSubWidget())); + connect(nsw, &Internal::NavigationSubWidget::splitMe, + this, &NavigationWidget::splitSubWidget); connect(nsw, SIGNAL(closeMe()), this, SLOT(closeSubWidget())); insertWidget(position, nsw); d->m_subWidgets.insert(position, nsw); @@ -281,11 +282,11 @@ void NavigationWidget::activateSubWidget(Id factoryId) } } -void NavigationWidget::splitSubWidget() +void NavigationWidget::splitSubWidget(int factoryIndex) { Internal::NavigationSubWidget *original = qobject_cast(sender()); int pos = indexOf(original) + 1; - insertSubItem(pos, original->factoryIndex()); + insertSubItem(pos, factoryIndex); } void NavigationWidget::closeSubWidget() diff --git a/src/plugins/coreplugin/navigationwidget.h b/src/plugins/coreplugin/navigationwidget.h index 104d708d8da..145ef4913b0 100644 --- a/src/plugins/coreplugin/navigationwidget.h +++ b/src/plugins/coreplugin/navigationwidget.h @@ -111,7 +111,7 @@ protected: private slots: void activateSubWidget(); - void splitSubWidget(); + void splitSubWidget(int factoryIndex); void closeSubWidget(); private: