Skip to content

Commit d383ade

Browse files
Merge branch 'Central-Widget' of https://github.com/hulswit/Qt-Advanced-Docking-System into hulswit-Central-Widget
2 parents 6d9c4ce + ba69f3e commit d383ade

19 files changed

+587
-29
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,3 +382,4 @@ MigrationBackup/
382382
FodyWeavers.xsd
383383
/ build
384384
/Settings.ini
385+
.vscode/settings.json

examples/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ cmake_minimum_required(VERSION 3.5)
22
project(QtADSExamples LANGUAGES CXX VERSION ${VERSION_SHORT})
33
add_subdirectory(simple)
44
add_subdirectory(sidebar)
5-
add_subdirectory(deleteonclose)
5+
add_subdirectory(deleteonclose)
6+
add_subdirectory(centralWidget)

examples/centralWidget/CMakeLists.txt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
cmake_minimum_required(VERSION 3.5)
2+
project(ads_example_centralwidget VERSION ${VERSION_SHORT})
3+
find_package(Qt5 5.5 COMPONENTS Core Gui Widgets REQUIRED)
4+
set(CMAKE_INCLUDE_CURRENT_DIR ON)
5+
add_executable(CentralWidgetExample WIN32
6+
main.cpp
7+
mainwindow.cpp
8+
mainwindow.ui
9+
)
10+
target_include_directories(CentralWidgetExample PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../src")
11+
target_link_libraries(CentralWidgetExample PRIVATE qtadvanceddocking)
12+
target_link_libraries(CentralWidgetExample PUBLIC Qt5::Core Qt5::Gui Qt5::Widgets)
13+
set_target_properties(CentralWidgetExample PROPERTIES
14+
AUTOMOC ON
15+
AUTORCC ON
16+
AUTOUIC ON
17+
CXX_STANDARD 14
18+
CXX_STANDARD_REQUIRED ON
19+
CXX_EXTENSIONS OFF
20+
VERSION ${VERSION_SHORT}
21+
EXPORT_NAME "Qt Advanced Docking System Central Widget Example"
22+
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${ads_PlatformDir}/lib"
23+
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${ads_PlatformDir}/lib"
24+
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${ads_PlatformDir}/bin"
25+
)
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
ADS_OUT_ROOT = $${OUT_PWD}/../..
2+
3+
QT += core gui
4+
5+
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
6+
7+
TARGET = CentralWidgetExample
8+
DESTDIR = $${ADS_OUT_ROOT}/lib
9+
TEMPLATE = app
10+
CONFIG += c++14
11+
CONFIG += debug_and_release
12+
13+
# The following define makes your compiler emit warnings if you use
14+
# any Qt feature that has been marked deprecated (the exact warnings
15+
# depend on your compiler). Please consult the documentation of the
16+
# deprecated API in order to know how to port your code away from it.
17+
DEFINES += QT_DEPRECATED_WARNINGS
18+
19+
# You can also make your code fail to compile if it uses deprecated APIs.
20+
# In order to do so, uncomment the following line.
21+
# You can also select to disable deprecated APIs only up to a certain version of Qt.
22+
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
23+
24+
SOURCES += \
25+
main.cpp \
26+
mainwindow.cpp
27+
28+
HEADERS += \
29+
mainwindow.h
30+
31+
FORMS += \
32+
mainwindow.ui
33+
34+
LIBS += -L$${ADS_OUT_ROOT}/lib
35+
36+
# Dependency: AdvancedDockingSystem (shared)
37+
CONFIG(debug, debug|release){
38+
win32 {
39+
LIBS += -lqtadvanceddockingd
40+
}
41+
else:mac {
42+
LIBS += -lqtadvanceddocking_debug
43+
}
44+
else {
45+
LIBS += -lqtadvanceddocking
46+
}
47+
}
48+
else{
49+
LIBS += -lqtadvanceddocking
50+
}
51+
52+
INCLUDEPATH += ../../src
53+
DEPENDPATH += ../../src
54+

examples/centralWidget/main.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#include "mainwindow.h"
2+
3+
#include <QApplication>
4+
5+
int main(int argc, char *argv[])
6+
{
7+
QApplication a(argc, argv);
8+
CMainWindow w;
9+
w.show();
10+
return a.exec();
11+
}

examples/centralWidget/mainwindow.cpp

Lines changed: 226 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,226 @@
1+
#include "mainwindow.h"
2+
#include "ui_mainwindow.h"
3+
4+
#include <QWidgetAction>
5+
#include <QLabel>
6+
#include <QCalendarWidget>
7+
#include <QTreeView>
8+
#include <QFileSystemModel>
9+
#include <QTableWidget>
10+
#include <QHBoxLayout>
11+
#include <QRadioButton>
12+
#include <QPushButton>
13+
#include <QInputDialog>
14+
#include <QFileDialog>
15+
#include <QSettings>
16+
#include <QMessageBox>
17+
18+
#include "DockAreaWidget.h"
19+
#include "DockAreaTitleBar.h"
20+
#include "DockAreaTabBar.h"
21+
#include "FloatingDockContainer.h"
22+
#include "DockComponentsFactory.h"
23+
24+
using namespace ads;
25+
26+
const QString CMainWindow::kTableTopLayout = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
27+
"<QtAdvancedDockingSystem Version=\"1\" UserVersion=\"0\" Containers=\"1\">"
28+
"<Container Floating=\"0\">"
29+
"<Splitter Orientation=\"-\" Count=\"3\">"
30+
"<Area Tabs=\"1\" Current=\"Timeline\" AllowedAreas=\"f\" Flags=\"1\">"
31+
"<Widget Name=\"Timeline\" Closed=\"0\" />"
32+
"</Area>"
33+
"<Splitter Orientation=\"|\" Count=\"3\">"
34+
"<Splitter Orientation=\"-\" Count=\"2\">"
35+
"<Area Tabs=\"1\" Current=\"File system\">"
36+
"<Widget Name=\"File system\" Closed=\"0\"/>"
37+
"</Area>"
38+
"<Area Tabs=\"1\" Current=\"Table\">"
39+
"<Widget Name=\"Table\" Closed=\"0\"/>"
40+
"</Area>"
41+
"<Sizes>344 272 </Sizes>"
42+
"</Splitter>"
43+
"<Area Tabs=\"1\" Current=\"\" AllowedAreas=\"f\" Flags=\"1\">"
44+
"<Widget Name=\"CentralWidget\" Closed=\"0\"/>"
45+
"</Area>"
46+
"<Area Tabs=\"1\" Current=\"Properties\">"
47+
"<Widget Name=\"Properties\" Closed=\"0\"/>"
48+
"</Area>"
49+
"<Sizes>258 758 258 </Sizes>"
50+
"</Splitter>"
51+
"<Area Tabs=\"1\" Current=\"Status\" AllowedAreas=\"f\" Flags=\"1\">"
52+
"<Widget Name=\"Status\" Closed=\"0\"/>"
53+
"</Area>"
54+
"<Sizes>52 621 52 </Sizes>"
55+
"</Splitter>"
56+
"</Container>"
57+
"</QtAdvancedDockingSystem>";
58+
59+
const QString CMainWindow::kTableBottomLayout = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
60+
"<QtAdvancedDockingSystem Version=\"1\" UserVersion=\"0\" Containers=\"1\">"
61+
"<Container Floating=\"0\">"
62+
"<Splitter Orientation=\"-\" Count=\"3\">"
63+
"<Splitter Orientation=\"|\" Count=\"3\">"
64+
"<Area Tabs=\"2\" Current=\"Table\">"
65+
"<Widget Name=\"Table\" Closed=\"0\"/>"
66+
"<Widget Name=\"File system\" Closed=\"0\"/>"
67+
"</Area>"
68+
"<Area Tabs=\"1\" Current=\"\" AllowedAreas=\"f\" Flags=\"1\">"
69+
"<Widget Name=\"CentralWidget\" Closed=\"0\"/>"
70+
"</Area>"
71+
"<Area Tabs=\"1\" Current=\"Properties\">"
72+
"<Widget Name=\"Properties\" Closed=\"0\"/>"
73+
"</Area>"
74+
"<Sizes>258 758 258 </Sizes>"
75+
"</Splitter>"
76+
"<Area Tabs=\"1\" Current=\"Timeline\" AllowedAreas=\"f\" Flags=\"1\">"
77+
"<Widget Name=\"Timeline\" Closed=\"0\"/>"
78+
"</Area>"
79+
"<Area Tabs=\"1\" Current=\"Status\" AllowedAreas=\"f\" Flags=\"1\">"
80+
"<Widget Name=\"Status\" Closed=\"0\"/>"
81+
"</Area>"
82+
"<Sizes>621 52 52 </Sizes>"
83+
"</Splitter>"
84+
"</Container>"
85+
"</QtAdvancedDockingSystem>";
86+
87+
CMainWindow::CMainWindow(QWidget *parent)
88+
: QMainWindow(parent)
89+
, ui(new Ui::CMainWindow)
90+
{
91+
ui->setupUi(this);
92+
CDockManager::setConfigFlag(CDockManager::OpaqueSplitterResize, true);
93+
CDockManager::setConfigFlag(CDockManager::XmlCompressionEnabled, false);
94+
DockManager = new CDockManager(this);
95+
QCalendarWidget* calendar = new QCalendarWidget();
96+
CDockWidget* CentralDockWidget = new CDockWidget("CentralWidget");
97+
CentralDockWidget->setWidget(calendar);
98+
auto* CentralDockArea = DockManager->setCentralWidget(CentralDockWidget);
99+
CentralDockArea->setAllowedAreas(DockWidgetArea::OuterDockAreas);
100+
101+
QTreeView* fileTree = new QTreeView();
102+
fileTree->setFrameShape(QFrame::NoFrame);
103+
QFileSystemModel* fileModel = new QFileSystemModel(fileTree);
104+
fileModel->setRootPath(QDir::currentPath());
105+
fileTree->setModel(fileModel);
106+
CDockWidget* DataDockWidget = new CDockWidget("File system");
107+
DataDockWidget->setWidget(fileTree);
108+
DataDockWidget->resize(150, 250);
109+
DataDockWidget->setMinimumSize(100, 250);
110+
auto* fileArea = DockManager->addDockWidget(DockWidgetArea::LeftDockWidgetArea, DataDockWidget, CentralDockArea);
111+
112+
QTableWidget* table = new QTableWidget();
113+
table->setColumnCount(3);
114+
table->setRowCount(10);
115+
CDockWidget* TableDockWidget = new CDockWidget("Table");
116+
TableDockWidget->setWidget(table);
117+
TableDockWidget->setMinimumSizeHintMode(CDockWidget::MinimumSizeHintFromDockWidget);
118+
TableDockWidget->resize(250, 150);
119+
TableDockWidget->setMinimumSize(200,150);
120+
DockManager->addDockWidget(DockWidgetArea::BottomDockWidgetArea, TableDockWidget, fileArea);
121+
122+
QTableWidget* propertiesTable = new QTableWidget();
123+
table->setColumnCount(3);
124+
table->setRowCount(10);
125+
CDockWidget* PropertiesDockWidget = new CDockWidget("Properties");
126+
PropertiesDockWidget->setWidget(propertiesTable);
127+
PropertiesDockWidget->setMinimumSizeHintMode(CDockWidget::MinimumSizeHintFromDockWidget);
128+
PropertiesDockWidget->resize(250, 150);
129+
PropertiesDockWidget->setMinimumSize(200,150);
130+
DockManager->addDockWidget(DockWidgetArea::RightDockWidgetArea, PropertiesDockWidget, CentralDockArea);
131+
132+
QWidget* timeLineWidget = new QWidget();
133+
QHBoxLayout* timelineLayout = new QHBoxLayout(timeLineWidget);
134+
QRadioButton* radioDockTop = new QRadioButton("Top", timeLineWidget);
135+
QRadioButton* radioDockBottom = new QRadioButton("Bottom", timeLineWidget);
136+
radioDockTop->setChecked(true);
137+
timelineLayout->addWidget(new QLabel("Test Widget."));
138+
timelineLayout->addStretch(1);
139+
timelineLayout->addWidget(new QLabel("Apply predefined perspective: ", this));
140+
timelineLayout->addWidget(radioDockTop);
141+
timelineLayout->addWidget(radioDockBottom);
142+
TimelineDockWidget = new CDockWidget("Timeline");
143+
TimelineDockWidget->setWidget(timeLineWidget);
144+
TimelineDockWidget->setFeature(CDockWidget::DockWidgetClosable, false);
145+
TimelineDockWidget->setFeature(CDockWidget::DockWidgetMovable, false);
146+
TimelineDockWidget->setFeature(CDockWidget::DockWidgetFloatable, false);
147+
TimelineDockWidget->setMinimumSizeHintMode(CDockWidget::MinimumSizeHintFromDockWidget);
148+
TimelineDockWidget->setMinimumSize(QSize(50, 50));
149+
auto *TimelineDockArea = DockManager->addDockWidget(DockWidgetArea::TopDockWidgetArea, TimelineDockWidget);
150+
TimelineDockArea->setDockAreaFlag(CDockAreaWidget::eDockAreaFlag::HideSingleWidgetTitleBar, true);
151+
TimelineDockArea->setAllowedAreas(DockWidgetArea::OuterDockAreas);
152+
connect(radioDockTop, &QRadioButton::toggled, [this](bool checked){
153+
bool ok = true;
154+
if(!checked)
155+
{
156+
ok = DockManager->restoreState(kTableBottomLayout.toUtf8());
157+
}
158+
else
159+
{
160+
ok = DockManager->restoreState(kTableTopLayout.toUtf8());
161+
}
162+
if(!ok)
163+
{
164+
QMessageBox msgBox;
165+
msgBox.setText("Failed to apply perspective!");
166+
msgBox.exec();
167+
}
168+
});
169+
170+
QWidget* statusWidget = new QWidget();
171+
QHBoxLayout* statusLayout = new QHBoxLayout(statusWidget);
172+
statusLayout->setSpacing(10);
173+
statusLayout->addWidget(new QLabel("Status Bar"));
174+
QPushButton* OpenPerspectiveButton = new QPushButton("Open Perspective", statusWidget);
175+
connect(OpenPerspectiveButton, &QPushButton::clicked, [this](){
176+
QString PerspectiveName = QFileDialog::getOpenFileName(this, "Open Perspective", "", "Perspective files (*.xml)");
177+
if (PerspectiveName.isEmpty())
178+
{
179+
return;
180+
}
181+
182+
QFile stateFile(PerspectiveName);
183+
stateFile.open(QIODevice::ReadOnly);
184+
QByteArray state = stateFile.readAll();
185+
stateFile.close();
186+
if(!DockManager->restoreState(state))
187+
{
188+
QMessageBox msgBox;
189+
msgBox.setText("Failed to apply perspective " + stateFile.fileName());
190+
msgBox.exec();
191+
}
192+
});
193+
QPushButton* SavePerspectiveButton = new QPushButton("Create Perspective", statusWidget);
194+
connect(SavePerspectiveButton, &QPushButton::clicked, [this](){
195+
QString PerspectiveName = QInputDialog::getText(this, "Save Perspective", "Enter unique name:");
196+
if (PerspectiveName.isEmpty())
197+
{
198+
return;
199+
}
200+
201+
QByteArray state = DockManager->saveState();
202+
QFile stateFile(PerspectiveName + ".xml");
203+
stateFile.open(QIODevice::WriteOnly);
204+
stateFile.write(state);
205+
stateFile.close();
206+
});
207+
statusLayout->addWidget(OpenPerspectiveButton);
208+
statusLayout->addWidget(SavePerspectiveButton);
209+
statusLayout->addStretch(1);
210+
CDockWidget* StatusDockWidget = new CDockWidget("Status");
211+
StatusDockWidget->setWidget(statusWidget);
212+
StatusDockWidget->setFeature(CDockWidget::DockWidgetClosable, false);
213+
StatusDockWidget->setFeature(CDockWidget::DockWidgetMovable, false);
214+
StatusDockWidget->setFeature(CDockWidget::DockWidgetFloatable, false);
215+
StatusDockWidget->setMinimumSizeHintMode(CDockWidget::MinimumSizeHintFromDockWidget);
216+
StatusDockWidget->setMinimumSize(QSize(50, 50));
217+
StatusDockArea = DockManager->addDockWidget(DockWidgetArea::BottomDockWidgetArea, StatusDockWidget);
218+
StatusDockArea->setAllowedAreas(DockWidgetArea::OuterDockAreas);
219+
StatusDockArea->setDockAreaFlag(ads::CDockAreaWidget::eDockAreaFlag::HideSingleWidgetTitleBar, true);
220+
}
221+
222+
CMainWindow::~CMainWindow()
223+
{
224+
delete ui;
225+
}
226+

examples/centralWidget/mainwindow.h

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#ifndef MAINWINDOW_H
2+
#define MAINWINDOW_H
3+
4+
#include <QMainWindow>
5+
6+
#include "DockManager.h"
7+
#include "DockAreaWidget.h"
8+
#include "DockWidget.h"
9+
10+
QT_BEGIN_NAMESPACE
11+
namespace Ui { class CMainWindow; }
12+
QT_END_NAMESPACE
13+
14+
class CMainWindow : public QMainWindow
15+
{
16+
Q_OBJECT
17+
18+
public:
19+
CMainWindow(QWidget *parent = nullptr);
20+
~CMainWindow();
21+
22+
private:
23+
static const QString kTableTopLayout;
24+
static const QString kTableBottomLayout;
25+
26+
Ui::CMainWindow *ui;
27+
28+
ads::CDockManager* DockManager;
29+
ads::CDockAreaWidget* StatusDockArea;
30+
ads::CDockWidget* TimelineDockWidget;
31+
};
32+
#endif // MAINWINDOW_H

examples/centralWidget/mainwindow.ui

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<ui version="4.0">
3+
<class>CMainWindow</class>
4+
<widget class="QMainWindow" name="CMainWindow">
5+
<property name="geometry">
6+
<rect>
7+
<x>0</x>
8+
<y>0</y>
9+
<width>1284</width>
10+
<height>757</height>
11+
</rect>
12+
</property>
13+
<property name="windowTitle">
14+
<string>MainWindow</string>
15+
</property>
16+
<widget class="QWidget" name="centralwidget"/>
17+
<widget class="QMenuBar" name="menubar">
18+
<property name="geometry">
19+
<rect>
20+
<x>0</x>
21+
<y>0</y>
22+
<width>1284</width>
23+
<height>21</height>
24+
</rect>
25+
</property>
26+
</widget>
27+
</widget>
28+
<resources/>
29+
<connections/>
30+
</ui>

0 commit comments

Comments
 (0)