diff --git a/src/blackgui/components/marginsinput.cpp b/src/blackgui/components/marginsinput.cpp index c84995980..d7ca8f9c4 100644 --- a/src/blackgui/components/marginsinput.cpp +++ b/src/blackgui/components/marginsinput.cpp @@ -9,6 +9,7 @@ #include "marginsinput.h" #include "ui_marginsinput.h" +#include "blackgui/stylesheetutility.h" #include namespace BlackGui @@ -65,6 +66,13 @@ namespace BlackGui return m; } + void CMarginsInput::paintEvent(QPaintEvent *event) + { + bool s = CStyleSheetUtility::useStyleSheetInDerivedWidget(this, QStyle::PE_Widget); + if (s) { return; } + QFrame::paintEvent(event); + } + void CMarginsInput::ps_Confirmed() { const QMargins m(this->getMargins()); diff --git a/src/blackgui/components/marginsinput.h b/src/blackgui/components/marginsinput.h index 0ebee5069..2dcf7970b 100644 --- a/src/blackgui/components/marginsinput.h +++ b/src/blackgui/components/marginsinput.h @@ -42,6 +42,10 @@ namespace BlackGui //! Current values of margins QMargins getMargins() const; + protected: + //! \copydoc QFrame::paintEvent + virtual void paintEvent(QPaintEvent *event) override; + signals: //! Margins changed void changedMargins(const QMargins &margins); diff --git a/src/blackgui/dockwidget.cpp b/src/blackgui/dockwidget.cpp index a5bc0c91d..b8b575146 100644 --- a/src/blackgui/dockwidget.cpp +++ b/src/blackgui/dockwidget.cpp @@ -241,7 +241,7 @@ namespace BlackGui void CDockWidget::toggleFloating() { - bool floating = !this->isFloating(); + const bool floating = !this->isFloating(); if (!floating) { this->setFrameless(false); } this->setFloating(floating); } diff --git a/src/blackgui/dockwidget.h b/src/blackgui/dockwidget.h index 74e69bd31..d600ee512 100644 --- a/src/blackgui/dockwidget.h +++ b/src/blackgui/dockwidget.h @@ -217,11 +217,11 @@ namespace BlackGui void ps_dummy(); private: - QWidget *m_titleBarWidgetEmpty = nullptr; //!< replacing default title bar - QWidget *m_titleBarWidgetOriginal = nullptr; //!< the original title bar - QWidgetAction *m_marginMenuAction = nullptr; //!< menu action for margins + QWidget *m_titleBarWidgetEmpty = nullptr; //!< replacing default title bar + QWidget *m_titleBarWidgetOriginal = nullptr; //!< the original title bar + QWidgetAction *m_marginMenuAction = nullptr; //!< menu widget(!) action for margin widget Components::CMarginsInput *m_input = nullptr; //!< margins widget - CManagedStatusBar m_statusBar; //!< Status bar when floating + CManagedStatusBar m_statusBar; //!< status bar when floating QString m_windowTitleBackup; //!< original title, even if the widget title is deleted for layout purposes QSize m_preferredSizeWhenFloating; //!< preferred size when floating 1st time QSize m_initialDockedMinimumSize; //!< minimum size before first floating diff --git a/src/blackgui/dockwidgetinfoarea.h b/src/blackgui/dockwidgetinfoarea.h index e8ce89a78..b9e6484d7 100644 --- a/src/blackgui/dockwidgetinfoarea.h +++ b/src/blackgui/dockwidgetinfoarea.h @@ -50,10 +50,11 @@ namespace BlackGui //! Visible widget bool isVisibleWidget() const; - protected: //! Contribute to menu + //! \remarks made public so other classes can nest this submenu virtual void addToContextMenu(QMenu *contextMenu) const override; + protected: //! \copydoc CDockWidget::initialFloating virtual void initialFloating() override; diff --git a/src/blackgui/infoarea.cpp b/src/blackgui/infoarea.cpp index 1f51de42c..e84fe9578 100644 --- a/src/blackgui/infoarea.cpp +++ b/src/blackgui/infoarea.cpp @@ -99,6 +99,9 @@ namespace BlackGui menu->addSeparator(); QMenu *subMenuToggleFloat = new QMenu("Toggle Float/Dock", menu); QMenu *subMenuDisplay = new QMenu("Display", menu); + QMenu *subMenuRestore = new QMenu("Restore", menu); + subMenuRestore->setIcon(CIcons::load16()); + subMenuRestore->addActions(this->getInfoAreaRestoreActions(subMenuRestore)); subMenuDisplay->addActions(this->getInfoAreaSelectActions(subMenuDisplay)); QSignalMapper *signalMapperToggleFloating = new QSignalMapper(menu); @@ -128,6 +131,7 @@ namespace BlackGui menu->addMenu(subMenuDisplay); menu->addMenu(subMenuToggleFloat); + menu->addMenu(subMenuRestore); // where and how to display tab bar menu->addSeparator(); @@ -235,6 +239,25 @@ namespace BlackGui return actions; } + QList CInfoArea::getInfoAreaRestoreActions(QWidget *parent) const + { + Q_ASSERT(parent); + int i = 0; + QList actions; + for (const CDockWidgetInfoArea *dockWidgetInfoArea : m_dockWidgetInfoAreas) + { + const QPixmap pm = this->indexToPixmap(i); + const QString wt(dockWidgetInfoArea->windowTitleBackup()); + QAction *action = new QAction(QIcon(pm), wt, parent); + action->setData(i); + action->setObjectName(this->objectName().append(":getInfoAreaRestoreActions:").append(wt)); + connect(action, &QAction::triggered, this, &CInfoArea::restoreDockWidgetInfoArea); + actions.append(action); + i++; + } + return actions; + } + QList CInfoArea::getAreaIndexesDockedOrFloating(bool floating) const { QList indexes; @@ -355,6 +378,25 @@ namespace BlackGui this->toggleFloatingByIndex(index); } + void CInfoArea::restoreDockWidgetInfoArea() + { + const QObject *sender = QObject::sender(); + Q_ASSERT(sender); + const QAction *action = qobject_cast(sender); + Q_ASSERT(action); + int index = action->data().toInt(); + this->restoreDockWidgetInfoAreaByIndex(index); + } + + void CInfoArea::restoreDockWidgetInfoAreaByIndex(int areaIndex) + { + if (!this->isValidAreaIndex(areaIndex)) { return; } + CDockWidgetInfoArea *dw = this->m_dockWidgetInfoAreas.at(areaIndex); + Q_ASSERT(dw); + if (!dw) return; + dw->restoreFromSettings(); + } + void CInfoArea::selectLeftTab() { if (!this->m_tabBar) return; diff --git a/src/blackgui/infoarea.h b/src/blackgui/infoarea.h index 36f36cb8c..9fdba8c1e 100644 --- a/src/blackgui/infoarea.h +++ b/src/blackgui/infoarea.h @@ -79,6 +79,11 @@ namespace BlackGui //! \param parent which will own the action (deletion) QList getInfoAreaToggleFloatingActions(QWidget *parent) const; + //! Create a list of actions to restore the info areas. + //! This could be used in a menu or somewhere else. + //! \param parent which will own the action (deletion) + QList getInfoAreaRestoreActions(QWidget *parent) const; + //! Docked area indexes QList getAreaIndexesDockedOrFloating(bool floating) const; @@ -123,6 +128,12 @@ namespace BlackGui //! Toggle area floating (sender is QAction) void toggleAreaFloatingByAction(); + //! Restore dock widget`s state (from settings) + void restoreDockWidgetInfoArea(); + + //! Restore dock widget`s state (from settings) + void restoreDockWidgetInfoAreaByIndex(int areaIndex); + //! Select next left tab void selectLeftTab(); diff --git a/src/blackgui/menus/menuaction.cpp b/src/blackgui/menus/menuaction.cpp index ce7a8c760..513dcc98c 100644 --- a/src/blackgui/menus/menuaction.cpp +++ b/src/blackgui/menus/menuaction.cpp @@ -158,19 +158,19 @@ namespace BlackGui CMenuAction CMenuActions::addMenu(const QIcon &icon, const QString &title, const QString &path) { - CMenuAction menuAction(icon, title, path); const QList exisitingMenu(this->getMenuActions(path)); if (!exisitingMenu.isEmpty()) { - const CMenuAction existing(exisitingMenu.first()); + const CMenuAction existingAction(exisitingMenu.first()); Q_ASSERT_X(exisitingMenu.size() > 1, Q_FUNC_INFO, "Redundant menu entries"); - Q_ASSERT_X(existing.getTitle() != title, Q_FUNC_INFO, "Title mismatch"); - if (icon.isNull() && existing.hasIcon()) { return existing.getQAction(); } + Q_ASSERT_X(existingAction.getTitle() != title, Q_FUNC_INFO, "Title mismatch"); + if (icon.isNull() || existingAction.hasIcon()) { return existingAction.getQAction(); } //! \todo replace if we have icon now, but not before - //! \todo avoid multiple menu entries + return existingAction; } + CMenuAction menuAction(icon, title, path); menuAction.setSubMenu(true); return this->addAction(menuAction); } diff --git a/src/blackgui/menus/menuaction.h b/src/blackgui/menus/menuaction.h index 1a2514e3e..1f08386f8 100644 --- a/src/blackgui/menus/menuaction.h +++ b/src/blackgui/menus/menuaction.h @@ -170,6 +170,10 @@ namespace BlackGui //! View load/save static const QString &pathViewLoadSave() { static const QString p("View.17.LoadSave"); return p; } + // ---- nested dock widgets ---- + + //! Nested dock widget + static const QString &pathDockWidgetNested() { static const QString p("DockWidget.Nested"); return p; } //! @} private: diff --git a/src/blackgui/views/viewbase.cpp b/src/blackgui/views/viewbase.cpp index 0f60a44ec..70c7354e3 100644 --- a/src/blackgui/views/viewbase.cpp +++ b/src/blackgui/views/viewbase.cpp @@ -611,6 +611,16 @@ namespace BlackGui if (menuActions.isEmpty()) { return; } menuActions.toQMenu(menu, true); + // Nested dock widget menu + const CDockWidgetInfoArea *dockWidget = this->getDockWidgetInfoArea(); + if (dockWidget) + { + if (!menu.isEmpty()) { menu.addSeparator(); } + const QString mm = QString("Dock widget '%1'").arg(dockWidget->windowTitleOrBackup()); + QMenu *dockWidgetSubMenu = menu.addMenu(CIcons::text16(), mm); + dockWidget->addToContextMenu(dockWidgetSubMenu); + } + QPoint globalPos = this->mapToGlobal(pos); menu.exec(globalPos); }