Skip to content

Commit 8a401eb

Browse files
author
Uwe Kindler
committed
Fixed a bug in restore functionality that caused application crash, added initial support for perspectives
1 parent 805e979 commit 8a401eb

File tree

11 files changed

+517
-226
lines changed

11 files changed

+517
-226
lines changed

.cproject

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/QtAdvancedDockingSystem/src}&quot;"/>
2626
<listOptionValue builtIn="false" value="&quot;${QTDIR}/include&quot;"/>
2727
<listOptionValue builtIn="false" value="&quot;${QTDIR}/include/QtCore&quot;"/>
28+
<listOptionValue builtIn="false" value="&quot;${QTDIR}/include/QtWidgets&quot;"/>
2829
</option>
2930
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1249325593" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
3031
</tool>
@@ -35,6 +36,7 @@
3536
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/QtAdvancedDockingSystem/demo}&quot;"/>
3637
<listOptionValue builtIn="false" value="&quot;${QTDIR}/include&quot;"/>
3738
<listOptionValue builtIn="false" value="&quot;${QTDIR}/include/QtCore&quot;"/>
39+
<listOptionValue builtIn="false" value="&quot;${QTDIR}/include/QtWidgets&quot;"/>
3840
</option>
3941
<option id="gnu.cpp.compiler.option.preprocessor.def.56223209" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false"/>
4042
<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.1318830536" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
@@ -45,6 +47,7 @@
4547
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/QtAdvancedDockingSystem/src}&quot;"/>
4648
<listOptionValue builtIn="false" value="&quot;${QTDIR}/include&quot;"/>
4749
<listOptionValue builtIn="false" value="&quot;${QTDIR}/include/QtCore&quot;"/>
50+
<listOptionValue builtIn="false" value="&quot;${QTDIR}/include/QtWidgets&quot;"/>
4851
</option>
4952
<option id="gnu.c.compiler.option.preprocessor.def.symbols.806805509" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false"/>
5053
<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1568363924" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>

.settings/language.settings.xml

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@
22
<project>
33
<configuration id="cdt.managedbuild.toolchain.gnu.mingw.base.1119687795" name="Default">
44
<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
5-
<provider class="org.eclipse.cdt.managedbuilder.internal.language.settings.providers.GCCBuiltinSpecsDetectorMinGW" console="false" env-hash="-1519829723851667984" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetectorMinGW" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings MinGW" parameter="${COMMAND} ${FLAGS} -E -P -v -dD -std=c++14 &quot;${INPUTS}&quot;" prefer-non-shared="true">
6-
<language-scope id="org.eclipse.cdt.core.gcc"/>
7-
<language-scope id="org.eclipse.cdt.core.g++"/>
8-
</provider>
5+
<provider-reference id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetectorMinGW" ref="shared-provider"/>
96
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
107
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
118
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuildCommandParser" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser" keep-relative-paths="false" name="CDT GCC Build Output Parser" parameter="(g?cc)|([gc]\+\+)|(clang)" prefer-non-shared="true"/>

demo/MainWindow.cpp

Lines changed: 327 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,327 @@
1+
2+
/*******************************************************************************
3+
** Qt Advanced Docking System
4+
** Copyright (C) 2017 Uwe Kindler
5+
**
6+
** This library is free software; you can redistribute it and/or
7+
** modify it under the terms of the GNU Lesser General Public
8+
** License as published by the Free Software Foundation; either
9+
** version 2.1 of the License, or (at your option) any later version.
10+
**
11+
** This library is distributed in the hope that it will be useful,
12+
** but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14+
** Lesser General Public License for more details.
15+
**
16+
** You should have received a copy of the GNU Lesser General Public
17+
** License along with this library; If not, see <http://www.gnu.org/licenses/>.
18+
******************************************************************************/
19+
20+
21+
//============================================================================
22+
/// \file MainWindow.cpp
23+
/// \author Uwe Kindler
24+
/// \date 13.02.2018
25+
/// \brief Implementation of CMainWindow demo class
26+
//============================================================================
27+
28+
29+
//============================================================================
30+
// INCLUDES
31+
//============================================================================
32+
#include <MainWindow.h>
33+
#include "ui_mainwindow.h"
34+
35+
#include <iostream>
36+
37+
#include <QTime>
38+
#include <QLabel>
39+
#include <QTextEdit>
40+
#include <QCalendarWidget>
41+
#include <QFrame>
42+
#include <QTreeView>
43+
#include <QFileSystemModel>
44+
#include <QBoxLayout>
45+
#include <QSettings>
46+
#include <QDockWidget>
47+
#include <QDebug>
48+
#include <QResizeEvent>
49+
#include <QAction>
50+
#include <QWidgetAction>
51+
#include <QComboBox>
52+
#include <QInputDialog>
53+
54+
#include <QMap>
55+
#include <QElapsedTimer>
56+
57+
#include "DockManager.h"
58+
#include "DockWidget.h"
59+
#include "DockAreaWidget.h"
60+
61+
62+
//============================================================================
63+
static ads::CDockWidget* createLongTextLabelDockWidget(QMenu* ViewMenu)
64+
{
65+
static int LabelCount = 0;
66+
QLabel* l = new QLabel();
67+
l->setWordWrap(true);
68+
l->setAlignment(Qt::AlignTop | Qt::AlignLeft);
69+
l->setText(QString("Label %1 %2 - Lorem ipsum dolor sit amet, consectetuer adipiscing elit. "
70+
"Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque "
71+
"penatibus et magnis dis parturient montes, nascetur ridiculus mus. "
72+
"Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. "
73+
"Nulla consequat massa quis enim. Donec pede justo, fringilla vel, "
74+
"aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, "
75+
"imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede "
76+
"mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum "
77+
"semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, "
78+
"porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, "
79+
"dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla "
80+
"ut metus varius laoreet.")
81+
.arg(LabelCount)
82+
.arg(QTime::currentTime().toString("hh:mm:ss:zzz")));
83+
84+
ads::CDockWidget* DockWidget = new ads::CDockWidget(QString("Label %1").arg(LabelCount++));
85+
DockWidget->setWidget(l);
86+
DockWidget->setObjectName(DockWidget->windowTitle());
87+
ViewMenu->addAction(DockWidget->toggleViewAction());
88+
return DockWidget;
89+
}
90+
91+
92+
//============================================================================
93+
static ads::CDockWidget* createCalendarDockWidget(QMenu* ViewMenu)
94+
{
95+
static int CalendarCount = 0;
96+
QCalendarWidget* w = new QCalendarWidget();
97+
ads::CDockWidget* DockWidget = new ads::CDockWidget(QString("Calendar %1").arg(CalendarCount++));
98+
DockWidget->setWidget(w);
99+
DockWidget->setObjectName(DockWidget->windowTitle());
100+
DockWidget->setToggleViewActionMode(ads::CDockWidget::ActionModeShow);
101+
ViewMenu->addAction(DockWidget->toggleViewAction());
102+
return DockWidget;
103+
}
104+
105+
106+
//============================================================================
107+
static ads::CDockWidget* createFileSystemTreeDockWidget(QMenu* ViewMenu)
108+
{
109+
static int FileSystemCount = 0;
110+
QTreeView* w = new QTreeView();
111+
w->setFrameShape(QFrame::NoFrame);
112+
QFileSystemModel* m = new QFileSystemModel(w);
113+
m->setRootPath(QDir::currentPath());
114+
w->setModel(m);
115+
ads::CDockWidget* DockWidget = new ads::CDockWidget(QString("Filesystem %1").arg(FileSystemCount++));
116+
DockWidget->setWidget(w);
117+
DockWidget->setObjectName(DockWidget->windowTitle());
118+
ViewMenu->addAction(DockWidget->toggleViewAction());
119+
return DockWidget;
120+
}
121+
122+
123+
//============================================================================
124+
/**
125+
* Private data class pimpl
126+
*/
127+
struct MainWindowPrivate
128+
{
129+
CMainWindow* _this;
130+
Ui::MainWindow ui;
131+
QAction* SavePerspectiveAction = nullptr;
132+
QWidgetAction* PerspectiveListAction = nullptr;
133+
QComboBox* PerspectiveComboBox = nullptr;;
134+
ads::CDockManager* DockManager = nullptr;
135+
136+
MainWindowPrivate(CMainWindow* _public) : _this(_public) {}
137+
138+
/**
139+
* Creates the toolbar actions
140+
*/
141+
void createActions();
142+
143+
/**
144+
* Fill the dock manager with dock widgets
145+
*/
146+
void createContent();
147+
148+
/**
149+
* Saves the dock manager state and the main window geometry
150+
*/
151+
void saveState();
152+
153+
/**
154+
* Save the list of perspectives
155+
*/
156+
void savePerspectives();
157+
158+
/**
159+
* Restores the dock manager state
160+
*/
161+
void restoreState();
162+
163+
/**
164+
* Restore the perspective listo of the dock manager
165+
*/
166+
void restorePerspectives();
167+
};
168+
169+
170+
//============================================================================
171+
void MainWindowPrivate::createContent()
172+
{
173+
// Test container docking
174+
QMenu* ViewMenu = ui.menuView;
175+
auto DockWidget = createCalendarDockWidget(ViewMenu);
176+
DockWidget->setIcon(_this->style()->standardIcon(QStyle::SP_DialogOpenButton));
177+
DockWidget->setFeatures(DockWidget->features().setFlag(ads::CDockWidget::DockWidgetClosable, false));
178+
DockManager->addDockWidget(ads::LeftDockWidgetArea, DockWidget);
179+
DockManager->addDockWidget(ads::LeftDockWidgetArea, createLongTextLabelDockWidget(ViewMenu));
180+
DockManager->addDockWidget(ads::BottomDockWidgetArea, createFileSystemTreeDockWidget(ViewMenu));
181+
auto TopDockArea = DockManager->addDockWidget(ads::TopDockWidgetArea, createFileSystemTreeDockWidget(ViewMenu));
182+
DockWidget = createCalendarDockWidget(ViewMenu);
183+
DockWidget->setFeatures(DockWidget->features().setFlag(ads::CDockWidget::DockWidgetClosable, false));
184+
DockManager->addDockWidget(ads::CenterDockWidgetArea, DockWidget, TopDockArea);
185+
186+
// Test dock area docking
187+
auto RighDockArea = DockManager->addDockWidget(ads::RightDockWidgetArea, createLongTextLabelDockWidget(ViewMenu), TopDockArea);
188+
DockManager->addDockWidget(ads::TopDockWidgetArea, createLongTextLabelDockWidget(ViewMenu), RighDockArea);
189+
auto BottomDockArea = DockManager->addDockWidget(ads::BottomDockWidgetArea, createLongTextLabelDockWidget(ViewMenu), RighDockArea);
190+
DockManager->addDockWidget(ads::RightDockWidgetArea, createLongTextLabelDockWidget(ViewMenu), RighDockArea);
191+
DockManager->addDockWidget(ads::CenterDockWidgetArea, createLongTextLabelDockWidget(ViewMenu), BottomDockArea);
192+
}
193+
194+
195+
//============================================================================
196+
void MainWindowPrivate::createActions()
197+
{
198+
ui.toolBar->addAction(ui.actionSaveState);
199+
ui.actionSaveState->setIcon(_this->style()->standardIcon(QStyle::SP_DialogSaveButton));
200+
ui.toolBar->addAction(ui.actionRestoreState);
201+
ui.actionRestoreState->setIcon(_this->style()->standardIcon(QStyle::SP_DialogOpenButton));
202+
203+
SavePerspectiveAction = new QAction("Save Perspective", _this);
204+
_this->connect(SavePerspectiveAction, SIGNAL(triggered()), SLOT(savePerspective()));
205+
PerspectiveListAction = new QWidgetAction(_this);
206+
PerspectiveComboBox = new QComboBox(_this);
207+
PerspectiveComboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents);
208+
PerspectiveComboBox->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
209+
PerspectiveListAction->setDefaultWidget(PerspectiveComboBox);
210+
ui.toolBar->addSeparator();
211+
ui.toolBar->addAction(PerspectiveListAction);
212+
ui.toolBar->addAction(SavePerspectiveAction);
213+
}
214+
215+
216+
//============================================================================
217+
void MainWindowPrivate::saveState()
218+
{
219+
QSettings Settings("Settings.ini", QSettings::IniFormat);
220+
Settings.setValue("mainWindow/Geometry", _this->saveGeometry());
221+
Settings.setValue("mainWindow/State", _this->saveState());
222+
Settings.setValue("mainWindow/DockingState", DockManager->saveState());
223+
}
224+
225+
226+
//============================================================================
227+
void MainWindowPrivate::restoreState()
228+
{
229+
QSettings Settings("Settings.ini", QSettings::IniFormat);
230+
_this->restoreGeometry(Settings.value("mainWindow/Geometry").toByteArray());
231+
_this->restoreState(Settings.value("mainWindow/State").toByteArray());
232+
DockManager->restoreState(Settings.value("mainWindow/DockingState").toByteArray());
233+
}
234+
235+
236+
237+
//============================================================================
238+
void MainWindowPrivate::savePerspectives()
239+
{
240+
QSettings Settings("Settings.ini", QSettings::IniFormat);
241+
DockManager->savePerspectives(Settings);
242+
}
243+
244+
245+
246+
//============================================================================
247+
void MainWindowPrivate::restorePerspectives()
248+
{
249+
QSettings Settings("Settings.ini", QSettings::IniFormat);
250+
DockManager->loadPerspectives(Settings);
251+
PerspectiveComboBox->clear();
252+
PerspectiveComboBox->addItems(DockManager->perspectiveNames());
253+
}
254+
255+
256+
//============================================================================
257+
CMainWindow::CMainWindow(QWidget *parent) :
258+
QMainWindow(parent),
259+
d(new MainWindowPrivate(this))
260+
{
261+
d->ui.setupUi(this);
262+
d->createActions();
263+
264+
// Now create the dock manager and its content
265+
d->DockManager = new ads::CDockManager(this);
266+
connect(d->PerspectiveComboBox, SIGNAL(activated(const QString&)),
267+
d->DockManager, SLOT(openPerspective(const QString&)));
268+
269+
d->createContent();
270+
// Default window geometry
271+
resize(800, 600);
272+
273+
d->restoreState();
274+
d->restorePerspectives();
275+
}
276+
277+
278+
//============================================================================
279+
CMainWindow::~CMainWindow()
280+
{
281+
delete d;
282+
}
283+
284+
285+
//============================================================================
286+
void CMainWindow::closeEvent(QCloseEvent* event)
287+
{
288+
d->saveState();
289+
QMainWindow::closeEvent(event);
290+
}
291+
292+
293+
//============================================================================
294+
void CMainWindow::on_actionSaveState_triggered(bool)
295+
{
296+
qDebug() << "MainWindow::on_actionSaveState_triggered";
297+
d->saveState();
298+
}
299+
300+
301+
//============================================================================
302+
void CMainWindow::on_actionRestoreState_triggered(bool)
303+
{
304+
qDebug() << "MainWindow::on_actionRestoreState_triggered";
305+
d->restoreState();
306+
}
307+
308+
309+
//============================================================================
310+
void CMainWindow::savePerspective()
311+
{
312+
std::cout << "savePerspective" << std::endl;
313+
QString PerspectiveName = QInputDialog::getText(this, "Save Perspective", "Enter unique name:");
314+
if (PerspectiveName.isEmpty())
315+
{
316+
return;
317+
}
318+
319+
d->DockManager->addPerspective(PerspectiveName);
320+
QSignalBlocker Blocker(d->PerspectiveComboBox);
321+
d->PerspectiveComboBox->clear();
322+
d->PerspectiveComboBox->addItems(d->DockManager->perspectiveNames());
323+
d->PerspectiveComboBox->setCurrentText(PerspectiveName);
324+
325+
d->savePerspectives();
326+
}
327+

0 commit comments

Comments
 (0)