18 #include <QAbstractItemView>
20 #include <QDockWidget>
22 #include <QMainWindow>
28 const char dockWidgetActiveState[] =
"DockWidgetActiveState";
29 const char StateKey[] =
"State";
30 const int settingsVersion = 2;
32 QString stripAccelerator(
const QString& text)
35 for (
int index = res.indexOf(
'&'); index != -1; index = res.indexOf(
'&', index + 1))
43 : QObject(mainWindow), m_mainWindow(mainWindow)
46 m_mainWindow->setTabPosition(Qt::AllDockWidgetAreas, QTabWidget::South);
47 m_mainWindow->setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea);
48 m_mainWindow->setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea);
55 dockWidget->setWidget(widget);
56 dockWidget->setFeatures(QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetClosable
57 | QDockWidget::DockWidgetFloatable);
58 dockWidget->setObjectName(widget->objectName() + QLatin1String(
"DockWidget"));
60 QString title = widget->windowTitle();
61 dockWidget->toggleViewAction()->setProperty(
"original_title", title);
62 title = stripAccelerator(title);
63 dockWidget->setWindowTitle(title);
65 connect(dockWidget->toggleViewAction(), &QAction::triggered, [=]() {
66 if (dockWidget->isVisible())
70 connect(dockWidget, &QDockWidget::visibilityChanged, [
this, dockWidget](
bool visible) {
72 dockWidget->setProperty(dockWidgetActiveState, visible);
75 dockWidget->setProperty(dockWidgetActiveState,
true);
84 "Attempt to add widget id twice");
89 QList<QAbstractItemView*> frames = widget->findChildren<QAbstractItemView*>();
90 for (
int i = 0; i < frames.count(); ++i)
91 frames[i]->setFrameStyle(QFrame::NoFrame);
98 dockWidget->setFloating(
false);
103 m_mainWindow->addDockWidget(it.second.area(), it.second.dock());
106 #if QT_VERSION >= 0x050600
120 dock->setHidden(!dock->isHidden());
132 if (it.second.widget() == widget)
133 return it.second.dock();
135 throw GUIHelpers::Error(
"DocksController::findDock() -> Can't find dock for widget");
148 if (std::find(visibleDocks.begin(), visibleDocks.end(), it.first) != visibleDocks.end())
149 it.second.dock()->show();
151 it.second.dock()->hide();
165 QWidget* widget = qobject_cast<QWidget*>(sender());
167 QDockWidget* dock =
findDock(widget);
175 if (dock->height() < height)
176 dock->setMinimumHeight(height);
178 dock->setMaximumHeight(height);
197 dockWidget->setProperty(dockWidgetActiveState, dockWidget->isVisible());
207 if (dockWidget->isFloating()) {
208 dockWidget->setVisible(visible && dockWidget->property(dockWidgetActiveState).toBool());
217 if (event->type() == QEvent::Show)
219 else if (event->type() == QEvent::Hide)
222 return QObject::eventFilter(obj, event);
227 QList<QAction*> actions;
229 if (dockWidget->property(
"managed_dockwidget").isNull()
231 QAction* action = dockWidget->toggleViewAction();
232 action->setText(action->property(
"original_title").toString());
233 actions.append(action);
236 std::sort(actions.begin(), actions.end(), [](
const QAction* action1,
const QAction* action2) {
237 return stripAccelerator(action1->text()).toLower()
238 < stripAccelerator(action2->text()).toLower();
241 foreach (QAction* action, actions)
242 menu->addAction(action);
248 QHashIterator<QString, QVariant> it(hash);
249 while (it.hasNext()) {
251 settings->setValue(it.key(), it.value());
257 QHash<QString, QVariant> hash;
258 foreach (
const QString& key, settings->childKeys()) {
259 hash.insert(key, settings->value(key));
266 QHash<QString, QVariant> settings;
267 settings.insert(QLatin1String(StateKey),
m_mainWindow->saveState(settingsVersion));
269 settings.insert(dockWidget->objectName(), dockWidget->property(dockWidgetActiveState));
276 QByteArray ba = settings.value(QLatin1String(StateKey), QByteArray()).toByteArray();
280 widget->setProperty(dockWidgetActiveState, settings.value(widget->objectName(),
false));
Defines the macro ASSERT.
#define ASSERT(condition)
Defines class DocksController.
Defines class GUIHelpers functions.
bool m_handleDockVisibilityChanges
void restoreSettings(const QHash< QString, QVariant > &settings)
QDockWidget * addDockForWidget(QWidget *widget)
QHash< QString, QVariant > saveSettings() const
void setDockHeightForWidget(int height)
A hack to request update of QDockWidget size if its child (e.g.
void addDockActionsToMenu(QMenu *menu)
void addWidget(int id, QWidget *widget, Qt::DockWidgetArea area)
virtual bool eventFilter(QObject *, QEvent *event)
QDockWidget * findDock(int id)
void handleWindowVisibilityChanged(bool visible)
void setVisibleDocks(const std::vector< int > &visibleDocks)
Show docks with id's from the list. Other docks will be hidden.
DocksController(QMainWindow *mainWindow)
QMainWindow * m_mainWindow
void setTrackingEnabled(bool enabled)
const QList< QDockWidget * > dockWidgets() const
std::map< int, DockWidgetInfo > m_docks