refs #680, now display CDockWidget context menus in views/info area

This commit is contained in:
Klaus Basan
2016-06-21 00:29:15 +02:00
parent 44bfcc2d9c
commit c1179ed52b
10 changed files with 91 additions and 11 deletions

View File

@@ -9,6 +9,7 @@
#include "marginsinput.h"
#include "ui_marginsinput.h"
#include "blackgui/stylesheetutility.h"
#include <QIntValidator>
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());

View File

@@ -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);

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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;

View File

@@ -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<QAction *> CInfoArea::getInfoAreaRestoreActions(QWidget *parent) const
{
Q_ASSERT(parent);
int i = 0;
QList<QAction *> 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<int> CInfoArea::getAreaIndexesDockedOrFloating(bool floating) const
{
QList<int> 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<const QAction *>(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;

View File

@@ -79,6 +79,11 @@ namespace BlackGui
//! \param parent which will own the action (deletion)
QList<QAction *> 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<QAction *> getInfoAreaRestoreActions(QWidget *parent) const;
//! Docked area indexes
QList<int> 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();

View File

@@ -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<CMenuAction> 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);
}

View File

@@ -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:

View File

@@ -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);
}