Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cbdf3211d6 |
108
.appveyor.yml
108
.appveyor.yml
@@ -10,52 +10,19 @@ environment:
|
||||
# Appveyor doesn't have Qt 12 yet
|
||||
LatestQtVersion: 5.13
|
||||
matrix:
|
||||
|
||||
# 32 bit builds
|
||||
# MSVC 2015 builds
|
||||
# Dynamic Library builds
|
||||
# LTS version of Qt, dll, 32bit, MSVC 2015, qmake
|
||||
- QT5: C:\Qt\%LatestQtVersion%\msvc2017
|
||||
COMPILER: C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build
|
||||
targetPlatform: x86
|
||||
use_mingw: "false"
|
||||
use_static: "false"
|
||||
use_cmake: "false"
|
||||
# LTS version of Qt, dll, 32bit, MSVC 2015, cmake
|
||||
- QT5: C:\Qt\%LatestQtVersion%\msvc2017
|
||||
COMPILER: C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build
|
||||
targetPlatform: x86
|
||||
use_mingw: "false"
|
||||
use_static: "false"
|
||||
use_cmake: "true"
|
||||
# end Dynamic Library builds
|
||||
# Static Library builds
|
||||
# LTS version of Qt, static, 32bit, MSVC 2015, qmake
|
||||
- QT5: C:\Qt\%LatestQtVersion%\msvc2017
|
||||
COMPILER: C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build
|
||||
targetPlatform: x86
|
||||
use_mingw: "false"
|
||||
use_static: "true"
|
||||
use_cmake: "false"
|
||||
# LTS version of Qt, static, 32bit, MSVC 2015, cmake
|
||||
- QT5: C:\Qt\%LatestQtVersion%\msvc2017
|
||||
COMPILER: C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build
|
||||
targetPlatform: x86
|
||||
use_mingw: "false"
|
||||
use_static: "true"
|
||||
use_cmake: "true"
|
||||
# end Static Library builds
|
||||
# end MSVC 2015 builds
|
||||
# MinGW builds
|
||||
# Dynamic Library builds
|
||||
# LTS version of Qt, dll, 32bit, MinGW, qmake
|
||||
- QT5: C:\Qt\%LatestQtVersion%\mingw73_32
|
||||
- QT: C:\Qt\%LatestQtVersion%\mingw73_32
|
||||
COMPILER: C:\Qt\Tools\mingw730_32
|
||||
targetPlatform: x86
|
||||
use_mingw: "true"
|
||||
use_static: "false"
|
||||
use_cmake: "false"
|
||||
# LTS version of Qt, dll, 32bit, MinGW, cmake
|
||||
- QT5: C:\Qt\%LatestQtVersion%\mingw73_32
|
||||
- QT: C:\Qt\%LatestQtVersion%\mingw73_32
|
||||
COMPILER: C:\Qt\Tools\mingw730_32
|
||||
targetPlatform: x86
|
||||
use_mingw: "true"
|
||||
@@ -64,14 +31,14 @@ environment:
|
||||
# end Dynamic Library builds
|
||||
# Static Library builds
|
||||
# LTS version of Qt, static, 32bit, MinGW, qmake
|
||||
- QT5: C:\Qt\%LatestQtVersion%\mingw73_32
|
||||
- QT: C:\Qt\%LatestQtVersion%\mingw73_32
|
||||
COMPILER: C:\Qt\Tools\mingw730_32
|
||||
targetPlatform: x86
|
||||
use_mingw: "true"
|
||||
use_static: "true"
|
||||
use_cmake: "false"
|
||||
# LTS version of Qt, static, 32bit, MinGW, cmake
|
||||
- QT5: C:\Qt\%LatestQtVersion%\mingw73_32
|
||||
- QT: C:\Qt\%LatestQtVersion%\mingw73_32
|
||||
COMPILER: C:\Qt\Tools\mingw730_32
|
||||
targetPlatform: x86
|
||||
use_mingw: "true"
|
||||
@@ -79,19 +46,54 @@ environment:
|
||||
use_cmake: "true"
|
||||
# end Static Library builds
|
||||
# end MinGW builds
|
||||
# end 32 bit builds
|
||||
# 64 bit builds
|
||||
# MSVC 2015 builds
|
||||
# MSVC 2017 builds
|
||||
# Dynamic Library builds
|
||||
# LTS version of Qt, dll, 64bit, MSVC 2015, qmake
|
||||
- QT5: C:\Qt\%LatestQtVersion%\msvc2017_64
|
||||
# LTS version of Qt, dll, 32bit, MSVC 2017, qmake
|
||||
- QT: C:\Qt\%LatestQtVersion%\msvc2017
|
||||
COMPILER: C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build
|
||||
targetPlatform: x86
|
||||
use_mingw: "false"
|
||||
use_static: "false"
|
||||
use_cmake: "false"
|
||||
# LTS version of Qt, dll, 32bit, MSVC 2017, cmake
|
||||
- QT: C:\Qt\%LatestQtVersion%\msvc2017
|
||||
COMPILER: C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build
|
||||
targetPlatform: x86
|
||||
use_mingw: "false"
|
||||
use_static: "false"
|
||||
use_cmake: "true"
|
||||
# end Dynamic Library builds
|
||||
# Static Library builds
|
||||
# LTS version of Qt, static, 32bit, MSVC 2017, qmake
|
||||
- QT: C:\Qt\%LatestQtVersion%\msvc2017
|
||||
COMPILER: C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build
|
||||
targetPlatform: x86
|
||||
use_mingw: "false"
|
||||
use_static: "true"
|
||||
use_cmake: "false"
|
||||
# LTS version of Qt, static, 32bit, MSVC 2017, cmake
|
||||
- QT: C:\Qt\%LatestQtVersion%\msvc2017
|
||||
COMPILER: C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build
|
||||
targetPlatform: x86
|
||||
use_mingw: "false"
|
||||
use_static: "true"
|
||||
use_cmake: "true"
|
||||
# end Static Library builds
|
||||
# end MSVC 2017 builds
|
||||
# end 32 bit builds
|
||||
|
||||
# 64 bit builds
|
||||
# MSVC 2017 builds
|
||||
# Dynamic Library builds
|
||||
# LTS version of Qt, dll, 64bit, MSVC 2017, qmake
|
||||
- QT: C:\Qt\%LatestQtVersion%\msvc2017_64
|
||||
COMPILER: C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build
|
||||
targetPlatform: amd64
|
||||
use_mingw: "false"
|
||||
use_static: "false"
|
||||
use_cmake: "false"
|
||||
# LTS version of Qt, dll, 64bit, MSVC 2015, cmake
|
||||
- QT5: C:\Qt\%LatestQtVersion%\msvc2017_64
|
||||
# LTS version of Qt, dll, 64bit, MSVC 2017, cmake
|
||||
- QT: C:\Qt\%LatestQtVersion%\msvc2017_64
|
||||
COMPILER: C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build
|
||||
targetPlatform: amd64
|
||||
use_mingw: "false"
|
||||
@@ -99,38 +101,40 @@ environment:
|
||||
use_cmake: "true"
|
||||
# end Dynamic Library builds
|
||||
# Static Library builds
|
||||
# LTS version of Qt, static, 64bit, MSVC 2015, qmake
|
||||
- QT5: C:\Qt\%LatestQtVersion%\msvc2017_64
|
||||
# LTS version of Qt, static, 64bit, MSVC 2017, qmake
|
||||
- QT: C:\Qt\%LatestQtVersion%\msvc2017_64
|
||||
COMPILER: C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build
|
||||
targetPlatform: amd64
|
||||
use_mingw: "false"
|
||||
use_static: "true"
|
||||
use_cmake: "false"
|
||||
# LTS version of Qt, static, 64bit, MSVC 2015, cmake
|
||||
- QT5: C:\Qt\%LatestQtVersion%\msvc2017_64
|
||||
# LTS version of Qt, static, 64bit, MSVC 2017, cmake
|
||||
- QT: C:\Qt\%LatestQtVersion%\msvc2017_64
|
||||
COMPILER: C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build
|
||||
targetPlatform: amd64
|
||||
use_mingw: "false"
|
||||
use_static: "true"
|
||||
use_cmake: "true"
|
||||
# end Static Library builds
|
||||
# end MSVC 2015 builds
|
||||
# end MSVC 2017 builds
|
||||
# end 64 bit builds
|
||||
|
||||
|
||||
matrix:
|
||||
fast_finish: true
|
||||
|
||||
before_build:
|
||||
- set originalWD=%CD%
|
||||
- call "%QT5%\bin\qtenv2.bat"
|
||||
- call "%QT%\bin\qtenv2.bat"
|
||||
- cd /D %originalWD%
|
||||
- if %use_mingw%==false call "%COMPILER%\vcvarsall.bat" %targetPlatform%
|
||||
- if %use_static%==true (set USESTATIC=ON) else (set USESTATIC=OFF)
|
||||
- if %use_mingw%==true (set CMAKEGENERATOR="MinGW Makefiles") else (set CMAKEGENERATOR="NMake Makefiles")
|
||||
- if %use_mingw%==true (set MAKEENGINE=mingw32-make) else (set MAKEENGINE=nmake)
|
||||
- if %use_mingw%==true set PATH=%PATH:C:\Program Files\Git\usr\bin;=%
|
||||
- if %use_mingw%==true set PATH=%PATH%:C:\Program Files\Git\usr\bin;=%
|
||||
|
||||
build_script:
|
||||
- echo %PATH%
|
||||
- if %use_cmake%==true mkdir build
|
||||
- if %use_cmake%==true cd build
|
||||
- if %use_cmake%==true cmake --version
|
||||
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -383,4 +383,3 @@ FodyWeavers.xsd
|
||||
/ build
|
||||
/Settings.ini
|
||||
.vscode/settings.json
|
||||
/.settings
|
||||
|
||||
15
.settings/language.settings.xml
Normal file
15
.settings/language.settings.xml
Normal file
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<project>
|
||||
<configuration id="cdt.managedbuild.toolchain.gnu.mingw.base.1119687795" name="Default">
|
||||
<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
|
||||
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
|
||||
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
|
||||
<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"/>
|
||||
<provider class="org.eclipse.cdt.managedbuilder.internal.language.settings.providers.GCCBuiltinSpecsDetectorMinGW" console="false" env-hash="-1242828358748104657" 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 "${INPUTS}"" prefer-non-shared="true">
|
||||
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
||||
<language-scope id="org.eclipse.cdt.core.g++"/>
|
||||
</provider>
|
||||
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
|
||||
</extension>
|
||||
</configuration>
|
||||
</project>
|
||||
13
README.md
13
README.md
@@ -15,13 +15,10 @@ integrated development environments (IDEs) such as Visual Studio.
|
||||
|
||||
## New and Noteworthy
|
||||
|
||||
The [release 3.7](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/releases/tag/3.7.0)
|
||||
adds the following features:
|
||||
The [release 3.7.0](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/releases/tag/3.7.0)
|
||||
adds support for Qt6.
|
||||
|
||||
- support for **Qt6.**
|
||||
- support for [empty dock area](doc/user-guide.md#empty-dock-area)
|
||||
|
||||
The [release 3.6](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/releases/tag/3.6.0)
|
||||
The [release 3.6.0](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/releases/tag/3.6.0)
|
||||
adds some nice new features:
|
||||
|
||||
- support for [central widget](doc/user-guide.md#central-widget) concept
|
||||
@@ -35,7 +32,7 @@ adds some nice new features:
|
||||
Both features are contributions from ADS users. Read the [documentation](doc/user-guide.md)
|
||||
to learn more about both new features.
|
||||
|
||||
The [release 3.5](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/releases/tag/3.5.0)
|
||||
The [release 3.5.0](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/releases/tag/3.5.0)
|
||||
adds the new [focus highlighting](doc/user-guide.md#focushighlighting) feature.
|
||||
This optional feature enables highlighting of the focused dock widget like you
|
||||
know it from Visual Studio.
|
||||
@@ -354,7 +351,7 @@ Taken from the [Qt Blog](https://www.qt.io/blog/qt-design-studio-1.5-beta-releas
|
||||
|
||||
> The most obvious change in [Qt Design Studio 1.5](https://www.qt.io/blog/qt-design-studio-1.5-beta-released) is the integration of dock widgets using the Qt Advanced Docking System. This allows the user to fully customize the workspace and also to undock any view into its own top level window. This especially improves the usability when using multiple screens.
|
||||
|
||||
[](https://youtu.be/za9KBWcFXEw?t=84)
|
||||

|
||||
|
||||
### [QmixElements](https://www.cetoni.com/products/qmixelements/)
|
||||
|
||||
|
||||
23
ads.pri
23
ads.pri
@@ -1,16 +1,23 @@
|
||||
|
||||
CONFIG(debug, debug|release){
|
||||
win32 {
|
||||
LIBS += -lqtadvanceddockingd
|
||||
lessThan(QT_MAJOR_VERSION, 6) {
|
||||
CONFIG(debug, debug|release){
|
||||
win32 {
|
||||
LIBS += -lqtadvanceddockingd
|
||||
}
|
||||
else:mac {
|
||||
LIBS += -lqtadvanceddocking_debug
|
||||
}
|
||||
else {
|
||||
LIBS += -lqtadvanceddocking
|
||||
}
|
||||
}
|
||||
else:mac {
|
||||
LIBS += -lqtadvanceddocking_debug
|
||||
}
|
||||
else {
|
||||
else{
|
||||
LIBS += -lqtadvanceddocking
|
||||
}
|
||||
}
|
||||
else{
|
||||
else {
|
||||
# qt$$qtLibraryTarget(qtadvanceddocking) does not produce an advanceddockingd.dll file on Windows
|
||||
# for Qt6 - I don't know if this is a bug and I have to investigate
|
||||
LIBS += -lqtadvanceddocking
|
||||
}
|
||||
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
project(ads_demo VERSION ${VERSION_SHORT})
|
||||
|
||||
find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED)
|
||||
find_package(Qt${QT_VERSION_MAJOR} 5.5 COMPONENTS Core Gui Widgets REQUIRED)
|
||||
if(WIN32 AND QT_VERSION_MAJOR LESS 6)
|
||||
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS AxContainer REQUIRED)
|
||||
find_package(Qt5 5.5 COMPONENTS Core Gui Widgets REQUIRED)
|
||||
if(WIN32)
|
||||
find_package(Qt5 5.5 COMPONENTS AxContainer REQUIRED)
|
||||
endif()
|
||||
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||
set(ads_demo_SRCS
|
||||
@@ -17,11 +16,9 @@ set(ads_demo_SRCS
|
||||
)
|
||||
add_executable(AdvancedDockingSystemDemo WIN32 ${ads_demo_SRCS})
|
||||
target_include_directories(AdvancedDockingSystemDemo PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../src")
|
||||
target_link_libraries(AdvancedDockingSystemDemo PUBLIC Qt${QT_VERSION_MAJOR}::Core
|
||||
Qt${QT_VERSION_MAJOR}::Gui
|
||||
Qt${QT_VERSION_MAJOR}::Widgets)
|
||||
if(WIN32 AND QT_VERSION_MAJOR LESS 6)
|
||||
target_link_libraries(AdvancedDockingSystemDemo PUBLIC Qt${QT_VERSION_MAJOR}::AxContainer)
|
||||
target_link_libraries(AdvancedDockingSystemDemo PUBLIC Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
if(WIN32)
|
||||
target_link_libraries(AdvancedDockingSystemDemo PUBLIC Qt5::AxContainer)
|
||||
endif()
|
||||
target_link_libraries(AdvancedDockingSystemDemo PRIVATE qtadvanceddocking)
|
||||
set_target_properties(AdvancedDockingSystemDemo PROPERTIES
|
||||
|
||||
@@ -359,7 +359,6 @@ class MainWindow(MainWindowUI, MainWindowBase):
|
||||
floating = sender.property("Floating")
|
||||
dock_widget = self.create_editor_widget()
|
||||
dock_widget.setFeature(QtAds.CDockWidget.DockWidgetDeleteOnClose, True)
|
||||
dock_widget.setFeature(QtAds.CDockWidget.DockWidgetForceCloseWithArea, True)
|
||||
dock_widget.closeRequested.connect(self.on_editor_close_requested)
|
||||
|
||||
if floating:
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 816 KiB |
@@ -28,7 +28,6 @@
|
||||
- [`FloatingContainerForceNativeTitleBar` (Linux only)](#floatingcontainerforcenativetitlebar-linux-only)
|
||||
- [`FloatingContainerForceQWidgetTitleBar` (Linux only)](#floatingcontainerforceqwidgettitlebar-linux-only)
|
||||
- [Central Widget](#central-widget)
|
||||
- [Empty Dock Area](#empty-dock-area)
|
||||
- [Custom Close Handling](#custom-close-handling)
|
||||
- [Styling](#styling)
|
||||
- [Disabling the Internal Style Sheet](#disabling-the-internal-style-sheet)
|
||||
@@ -501,33 +500,6 @@ See the `centralwidget` example to learn how it works.
|
||||
> are already other dock widgets registered. So `setCentralWidget` should be
|
||||
> the first function that you call when adding dock widgets.
|
||||
|
||||
## Empty Dock Area
|
||||
|
||||
Some applications require a fixed DockArea that is always visible, even if it
|
||||
does not contain any DockWidgets. I.e. the DockArea is in this case a kind
|
||||
of central widget that is always visible (see this
|
||||
[issue](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/issues/199)).
|
||||
|
||||
Since version 3.7.1 the advanced docking system supports this feature. The
|
||||
`emptydockarea` example shows how this can be implemented with the library. You
|
||||
just need to create a dock widget and set the feature flag `CDockWidget::NoTab`.
|
||||
This permanently hides the tab widget of this area and removes it from the tab
|
||||
menu. For this special dock widget you should also disable all other features
|
||||
(movable, closable and floatable) to prevent closing and moving of this widget.
|
||||
If you use the `CDockManager::setCentralWidget` function like in the example
|
||||
code below, then you don't need to disable these features because this is done
|
||||
in the `setCentralWidget` function.
|
||||
|
||||
```c++
|
||||
QLabel* label = new QLabel();
|
||||
label->setText("This is a DockArea which is always visible, even if it does not contain any DockWidgets.");
|
||||
label->setAlignment(Qt::AlignCenter);
|
||||
CDockWidget* CentralDockWidget = new CDockWidget("CentralWidget");
|
||||
CentralDockWidget->setWidget(label);
|
||||
CentralDockWidget->setFeature(ads::CDockWidget::NoTab, true);// set the flag before adding the widget to dock manager
|
||||
auto* CentralDockArea = DockManager->setCentralWidget(CentralDockWidget);
|
||||
```
|
||||
|
||||
## Custom Close Handling
|
||||
|
||||
Normally clicking the close button of a dock widget will just hide the widget and the user can show it again using the `toggleView()` action of the dock widget. This is meant for user interfaces with a static amount of widgets. But the advanced docking system also supports dynamic dock widgets that will get deleted on close. If you set the dock widget flag `DockWidgetDeleteOnClose` for a certain dock widget, then it will be deleted as soon as you close this dock widget. This enables the implementation of user interfaces with dynamically created editors, like in word processing applications or source code development tools.
|
||||
|
||||
@@ -3,6 +3,4 @@ project(QtADSExamples LANGUAGES CXX VERSION ${VERSION_SHORT})
|
||||
add_subdirectory(simple)
|
||||
add_subdirectory(sidebar)
|
||||
add_subdirectory(deleteonclose)
|
||||
add_subdirectory(centralwidget)
|
||||
add_subdirectory(emptydockarea)
|
||||
add_subdirectory(dockindock)
|
||||
add_subdirectory(centralwidget)
|
||||
@@ -1,7 +1,6 @@
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
project(ads_example_centralwidget VERSION ${VERSION_SHORT})
|
||||
find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED)
|
||||
find_package(Qt${QT_VERSION_MAJOR} 5.5 COMPONENTS Core Gui Widgets REQUIRED)
|
||||
find_package(Qt5 5.5 COMPONENTS Core Gui Widgets REQUIRED)
|
||||
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||
add_executable(CentralWidgetExample WIN32
|
||||
main.cpp
|
||||
@@ -10,9 +9,7 @@ add_executable(CentralWidgetExample WIN32
|
||||
)
|
||||
target_include_directories(CentralWidgetExample PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../src")
|
||||
target_link_libraries(CentralWidgetExample PRIVATE qtadvanceddocking)
|
||||
target_link_libraries(CentralWidgetExample PUBLIC Qt${QT_VERSION_MAJOR}::Core
|
||||
Qt${QT_VERSION_MAJOR}::Gui
|
||||
Qt${QT_VERSION_MAJOR}::Widgets)
|
||||
target_link_libraries(CentralWidgetExample PUBLIC Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
set_target_properties(CentralWidgetExample PROPERTIES
|
||||
AUTOMOC ON
|
||||
AUTORCC ON
|
||||
|
||||
@@ -106,11 +106,6 @@ class MainWindow(MainWindowUI, MainWindowBase):
|
||||
self.perspective_combobox.clear()
|
||||
self.perspective_combobox.addItems(self.dock_manager.perspectiveNames())
|
||||
self.perspective_combobox.setCurrentText(perspective_name)
|
||||
|
||||
def closeEvent(self, event: QCloseEvent):
|
||||
self.dock_manager.deleteLater()
|
||||
super().closeEvent(event)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
app = QApplication(sys.argv)
|
||||
|
||||
@@ -46,26 +46,27 @@ CMainWindow::CMainWindow(QWidget *parent)
|
||||
CentralDockArea->setAllowedAreas(DockWidgetArea::OuterDockAreas);
|
||||
|
||||
// create other dock widgets
|
||||
QTreeView* fileTree = new QTreeView();
|
||||
fileTree->setFrameShape(QFrame::NoFrame);
|
||||
QFileSystemModel* fileModel = new QFileSystemModel(fileTree);
|
||||
fileModel->setRootPath(QDir::currentPath());
|
||||
fileTree->setModel(fileModel);
|
||||
CDockWidget* DataDockWidget = new CDockWidget("File system");
|
||||
DataDockWidget->setWidget(fileTree);
|
||||
DataDockWidget->resize(150, 250);
|
||||
DataDockWidget->setMinimumSize(100, 250);
|
||||
auto* fileArea = DockManager->addDockWidget(DockWidgetArea::LeftDockWidgetArea, DataDockWidget, CentralDockArea);
|
||||
ui->menuView->addAction(DataDockWidget->toggleViewAction());
|
||||
|
||||
QTableWidget* table = new QTableWidget();
|
||||
table->setColumnCount(3);
|
||||
table->setRowCount(10);
|
||||
CDockWidget* TableDockWidget = new CDockWidget("Table 1");
|
||||
CDockWidget* TableDockWidget = new CDockWidget("Table");
|
||||
TableDockWidget->setWidget(table);
|
||||
TableDockWidget->setMinimumSizeHintMode(CDockWidget::MinimumSizeHintFromDockWidget);
|
||||
TableDockWidget->resize(250, 150);
|
||||
TableDockWidget->setMinimumSize(200,150);
|
||||
auto TableArea = DockManager->addDockWidget(DockWidgetArea::LeftDockWidgetArea, TableDockWidget);
|
||||
ui->menuView->addAction(TableDockWidget->toggleViewAction());
|
||||
|
||||
table = new QTableWidget();
|
||||
table->setColumnCount(5);
|
||||
table->setRowCount(1020);
|
||||
TableDockWidget = new CDockWidget("Table 2");
|
||||
TableDockWidget->setWidget(table);
|
||||
TableDockWidget->setMinimumSizeHintMode(CDockWidget::MinimumSizeHintFromDockWidget);
|
||||
TableDockWidget->resize(250, 150);
|
||||
TableDockWidget->setMinimumSize(200,150);
|
||||
DockManager->addDockWidget(DockWidgetArea::BottomDockWidgetArea, TableDockWidget, TableArea);
|
||||
DockManager->addDockWidget(DockWidgetArea::BottomDockWidgetArea, TableDockWidget, fileArea);
|
||||
ui->menuView->addAction(TableDockWidget->toggleViewAction());
|
||||
|
||||
QTableWidget* propertiesTable = new QTableWidget();
|
||||
|
||||
@@ -1,16 +1,13 @@
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
project(ads_example_deleteonclose VERSION ${VERSION_SHORT})
|
||||
find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED)
|
||||
find_package(Qt${QT_VERSION_MAJOR} 5.5 COMPONENTS Core Gui Widgets REQUIRED)
|
||||
find_package(Qt5 5.5 COMPONENTS Core Gui Widgets REQUIRED)
|
||||
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||
add_executable(DeleteOnCloseTest WIN32
|
||||
main.cpp
|
||||
)
|
||||
target_include_directories(DeleteOnCloseTest PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../src")
|
||||
target_link_libraries(DeleteOnCloseTest PRIVATE qtadvanceddocking)
|
||||
target_link_libraries(DeleteOnCloseTest PUBLIC Qt${QT_VERSION_MAJOR}::Core
|
||||
Qt${QT_VERSION_MAJOR}::Gui
|
||||
Qt${QT_VERSION_MAJOR}::Widgets)
|
||||
target_link_libraries(DeleteOnCloseTest PUBLIC Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
set_target_properties(DeleteOnCloseTest PROPERTIES
|
||||
AUTOMOC ON
|
||||
CXX_STANDARD 14
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
project(ads_example_dockindock VERSION ${VERSION_SHORT})
|
||||
find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED)
|
||||
find_package(Qt${QT_VERSION_MAJOR} 5.5 COMPONENTS Core Gui Widgets REQUIRED)
|
||||
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||
add_executable(DockInDockExample WIN32
|
||||
dockindock.cpp
|
||||
dockindockmanager.cpp
|
||||
perspectiveactions.cpp
|
||||
perspectives.cpp
|
||||
main.cpp
|
||||
mainframe.cpp
|
||||
)
|
||||
target_include_directories(DockInDockExample PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../src")
|
||||
target_link_libraries(DockInDockExample PRIVATE qtadvanceddocking)
|
||||
target_link_libraries(DockInDockExample PUBLIC Qt${QT_VERSION_MAJOR}::Core
|
||||
Qt${QT_VERSION_MAJOR}::Gui
|
||||
Qt${QT_VERSION_MAJOR}::Widgets)
|
||||
set_target_properties(DockInDockExample PROPERTIES
|
||||
AUTOMOC ON
|
||||
AUTORCC ON
|
||||
AUTOUIC ON
|
||||
CXX_STANDARD 14
|
||||
CXX_STANDARD_REQUIRED ON
|
||||
CXX_EXTENSIONS OFF
|
||||
VERSION ${VERSION_SHORT}
|
||||
EXPORT_NAME "Qt Advanced Docking System Simple Example"
|
||||
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${ads_PlatformDir}/lib"
|
||||
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${ads_PlatformDir}/lib"
|
||||
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${ads_PlatformDir}/bin"
|
||||
)
|
||||
@@ -1,296 +0,0 @@
|
||||
#include "dockindock.h"
|
||||
#include "perspectives.h"
|
||||
#include "dockindockmanager.h"
|
||||
#include "perspectiveactions.h"
|
||||
|
||||
#include <QMenu>
|
||||
#include <QDir>
|
||||
#include <QVBoxLayout>
|
||||
#include <QMainWindow>
|
||||
#include <QMessageBox>
|
||||
#include <QInputDialog>
|
||||
|
||||
#include <set>
|
||||
#include <assert.h>
|
||||
|
||||
using namespace QtAdsUtl;
|
||||
|
||||
DockInDockWidget::DockInDockWidget( QWidget* parent, bool canCreateNewGroups, PerspectivesManager* perspectivesManager ) :
|
||||
DockInDockWidget( parent, (DockInDockWidget*)NULL, perspectivesManager )
|
||||
{
|
||||
m_canCreateNewGroups = canCreateNewGroups;
|
||||
m_topLevelDockWidget = this;
|
||||
}
|
||||
|
||||
DockInDockWidget::DockInDockWidget( QWidget* parent, DockInDockWidget* topLevelDockWidget, PerspectivesManager* perspectivesManager ) :
|
||||
baseClass( parent ),
|
||||
m_topLevelDockWidget( topLevelDockWidget ),
|
||||
m_canCreateNewGroups( (topLevelDockWidget) ? topLevelDockWidget->m_canCreateNewGroups : false ),
|
||||
m_perspectivesManager( perspectivesManager )
|
||||
{
|
||||
QVBoxLayout* layout = new QVBoxLayout(this);
|
||||
layout->setContentsMargins( 0,0,0,0 );
|
||||
layout->addWidget( m_mgr = new DockInDockManager(*this) );
|
||||
}
|
||||
|
||||
DockInDockWidget::~DockInDockWidget()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
ads::CDockAreaWidget* DockInDockWidget::addTabWidget( QWidget* widget, const QString& name, ads::CDockAreaWidget* after )
|
||||
{
|
||||
return addTabWidget( widget, name, QIcon(), after );
|
||||
}
|
||||
|
||||
ads::CDockAreaWidget* DockInDockWidget::addTabWidget( QWidget* widget, const QString& name, QIcon icon, ads::CDockAreaWidget* after )
|
||||
{
|
||||
for ( auto existing : getTopLevelDockWidget()->getManager()->allDockWidgets(true,true) )
|
||||
{
|
||||
if ( existing.second->objectName() == name )
|
||||
{
|
||||
QMessageBox::critical( this, "Error", "Name '" + name + "' already in use" );
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
ads::CDockWidget* DockWidget = new ads::CDockWidget(name);
|
||||
DockWidget->setWidget(widget);
|
||||
DockWidget->setIcon( icon );
|
||||
|
||||
// Add the dock widget to the top dock widget area
|
||||
return m_mgr->addDockWidget(ads::CenterDockWidgetArea, DockWidget, after);
|
||||
}
|
||||
|
||||
bool DockInDockWidget::isTopLevel()
|
||||
{
|
||||
return objectName().isEmpty();
|
||||
}
|
||||
|
||||
QString DockInDockWidget::getGroupNameError( const QString& groupName )
|
||||
{
|
||||
if ( groupName.isEmpty() )
|
||||
{
|
||||
return "Group must have a non-empty name";
|
||||
}
|
||||
|
||||
std::vector<DockInDockManager*> dockManagers = m_mgr->allManagers( true, true );
|
||||
for ( auto mgr : dockManagers )
|
||||
{
|
||||
if ( mgr->getGroupName() == groupName )
|
||||
return "Group name '" + groupName + "' already used";
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
DockInDockWidget* DockInDockWidget::createGroup( const QString& groupName, ads::CDockAreaWidget*& insertPos )
|
||||
{
|
||||
return createGroup( groupName, QIcon(), insertPos );
|
||||
}
|
||||
|
||||
DockInDockWidget* DockInDockWidget::createGroup( const QString& groupName, QIcon icon, ads::CDockAreaWidget*& insertPos )
|
||||
{
|
||||
QString error = getGroupNameError( groupName );
|
||||
if ( !error.isEmpty() )
|
||||
{
|
||||
QMessageBox::critical( NULL, "Error", error );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
DockInDockWidget* child = new DockInDockWidget( this, m_topLevelDockWidget, m_perspectivesManager );
|
||||
child->setObjectName( groupName );
|
||||
|
||||
ads::CDockWidget* DockWidget = new ads::CDockWidget(groupName);
|
||||
DockWidget->setWidget(child);
|
||||
DockWidget->setIcon(icon);
|
||||
|
||||
insertPos = m_mgr->addDockWidget(ads::CenterDockWidgetArea, DockWidget, insertPos);
|
||||
|
||||
return child;
|
||||
}
|
||||
|
||||
void DockInDockWidget::destroyGroup( DockInDockWidget* widgetToRemove )
|
||||
{
|
||||
auto topLevelWidget = widgetToRemove->getTopLevelDockWidget();
|
||||
|
||||
if ( topLevelWidget && topLevelWidget != widgetToRemove )
|
||||
{
|
||||
// reaffect all child docks to top-level
|
||||
for ( auto dockwidget : widgetToRemove->getManager()->getWidgetsInGUIOrder() ) // don't use allDockWidgets to preserve sub-groups
|
||||
{
|
||||
MoveDockWidgetAction::move( dockwidget, topLevelWidget->getManager() );
|
||||
}
|
||||
assert( widgetToRemove->getManager()->allDockWidgets( true, true ).empty() );
|
||||
|
||||
// find widget's parent:
|
||||
for ( auto dockwidget : topLevelWidget->getManager()->allDockWidgets( true, true ) )
|
||||
{
|
||||
if ( dockwidget.second->widget() == widgetToRemove )
|
||||
{
|
||||
dockwidget.first->removeDockWidget( dockwidget.second );
|
||||
delete dockwidget.second;
|
||||
//delete widgetToRemove; automatically deleted when dockWidget is deleted
|
||||
widgetToRemove = NULL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
assert( widgetToRemove == NULL );
|
||||
}
|
||||
else
|
||||
{
|
||||
assert( false );
|
||||
}
|
||||
}
|
||||
|
||||
void DockInDockWidget::attachViewMenu( QMenu* menu )
|
||||
{
|
||||
connect( menu, SIGNAL(aboutToShow()), this, SLOT(autoFillAttachedViewMenu()) );
|
||||
}
|
||||
|
||||
void DockInDockWidget::autoFillAttachedViewMenu()
|
||||
{
|
||||
QMenu* menu = dynamic_cast<QMenu*>( QObject::sender() );
|
||||
|
||||
if ( menu )
|
||||
{
|
||||
menu->clear();
|
||||
setupViewMenu( menu );
|
||||
}
|
||||
else
|
||||
{
|
||||
assert( false );
|
||||
}
|
||||
}
|
||||
|
||||
void DockInDockWidget::setupViewMenu( QMenu* menu )
|
||||
{
|
||||
std::vector<DockInDockManager*> dockManagers = m_mgr->allManagers( true, true );
|
||||
|
||||
bool hasPerspectivesMenu = false;
|
||||
if ( getTopLevelDockWidget() == this )
|
||||
hasPerspectivesMenu = (m_perspectivesManager != NULL);
|
||||
else
|
||||
assert( false );
|
||||
|
||||
QMenu* organize = menu;
|
||||
if ( hasPerspectivesMenu )
|
||||
organize = menu->addMenu( "Organize" );
|
||||
|
||||
setupMenu( organize, dockManagers );
|
||||
|
||||
if ( hasPerspectivesMenu )
|
||||
{
|
||||
QMenu* perspectives = menu->addMenu( "Perspectives" );
|
||||
fillPerspectivesMenu( perspectives );
|
||||
}
|
||||
}
|
||||
|
||||
void DockInDockWidget::setupMenu( QMenu* menu, const std::vector<DockInDockManager*>& moveTo )
|
||||
{
|
||||
m_mgr->fillViewMenu( menu, moveTo );
|
||||
menu->addSeparator();
|
||||
auto moveMenu = menu->addMenu( "Move" );
|
||||
m_mgr->fillMoveMenu( moveMenu, moveTo );
|
||||
}
|
||||
|
||||
void DockInDockWidget::fillPerspectivesMenu( QMenu* menu )
|
||||
{
|
||||
menu->addAction( "Create perspective...", this, SLOT(createPerspective()) );
|
||||
|
||||
QStringList perspectiveNames;
|
||||
if ( m_perspectivesManager )
|
||||
perspectiveNames = m_perspectivesManager->perspectiveNames();
|
||||
|
||||
if ( !perspectiveNames.isEmpty() )
|
||||
{
|
||||
QMenu* load = menu->addMenu( "Load perspective" );
|
||||
for ( auto name : perspectiveNames )
|
||||
load->addAction( new LoadPerspectiveAction( load, name, *this ) );
|
||||
QMenu* remove = menu->addMenu( "Remove perspective" );
|
||||
for ( auto name : perspectiveNames )
|
||||
remove->addAction( new RemovePerspectiveAction( remove, name, *this ) );
|
||||
}
|
||||
}
|
||||
|
||||
void DockInDockWidget::setNewPerspectiveDefaultName( const QString& defaultName )
|
||||
{
|
||||
m_newPerspectiveDefaultName = defaultName;
|
||||
}
|
||||
|
||||
void DockInDockWidget::createPerspective()
|
||||
{
|
||||
if ( !m_perspectivesManager )
|
||||
return;
|
||||
|
||||
QString name = m_newPerspectiveDefaultName;
|
||||
if ( !m_newPerspectiveDefaultName.isEmpty() )
|
||||
{
|
||||
int index = 2;
|
||||
while ( m_perspectivesManager->perspectiveNames().contains( name ) )
|
||||
{
|
||||
name = m_newPerspectiveDefaultName + " (" + QString::number(index) + ")";
|
||||
++index;
|
||||
}
|
||||
}
|
||||
|
||||
while ( true )
|
||||
{
|
||||
bool ok = false;
|
||||
name = QInputDialog::getText( NULL, "Create perspective", "Enter perspective name", QLineEdit::Normal, name, &ok );
|
||||
if ( ok )
|
||||
{
|
||||
if ( name.isEmpty() )
|
||||
{
|
||||
QMessageBox::critical( NULL, "Error", "Perspective name cannot be empty" );
|
||||
continue;
|
||||
}
|
||||
else if ( m_perspectivesManager->perspectiveNames().contains( name ) )
|
||||
{
|
||||
if ( QMessageBox::critical( NULL, "Error", "Perspective '" + name + "' already exists, overwrite it?", QMessageBox::Yes | QMessageBox::No, QMessageBox::No ) == QMessageBox::No )
|
||||
continue;
|
||||
}
|
||||
|
||||
m_perspectivesManager->addPerspective( name, *this );
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void dumpStatus( std::ostream& str, ads::CDockWidget* widget, const std::string& tab, std::string suffix )
|
||||
{
|
||||
DockInDockManager* asMgr = DockInDockManager::dockInAManager( widget );
|
||||
if ( asMgr )
|
||||
{
|
||||
asMgr->parent().dumpStatus( str, tab );
|
||||
}
|
||||
else
|
||||
{
|
||||
str << tab << widget->objectName().toStdString() << suffix << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
void DockInDockWidget::dumpStatus( std::ostream& str, std::string tab )
|
||||
{
|
||||
str << tab << "Group: " << getManager()->getGroupName().toStdString() << std::endl;
|
||||
tab += " ";
|
||||
std::set<ads::CDockWidget*> visibleWidgets;
|
||||
for ( auto widget : getManager()->getWidgetsInGUIOrder() )
|
||||
{
|
||||
visibleWidgets.insert( widget );
|
||||
::dumpStatus( str, widget, tab, "" );
|
||||
}
|
||||
|
||||
for ( auto closed : getManager()->dockWidgetsMap() )
|
||||
{
|
||||
if ( visibleWidgets.find( closed ) == visibleWidgets.end() )
|
||||
{
|
||||
::dumpStatus( str, closed, tab, " (closed)" );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,80 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <QWidget>
|
||||
#include <QMap>
|
||||
|
||||
#include <memory>
|
||||
#include <ostream>
|
||||
|
||||
class QMenu;
|
||||
|
||||
namespace ads
|
||||
{
|
||||
class CDockAreaWidget;
|
||||
}
|
||||
|
||||
namespace QtAdsUtl
|
||||
{
|
||||
|
||||
class DockInDockManager;
|
||||
class PerspectivesManager;
|
||||
// tab of tab example for https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/issues/306
|
||||
class DockInDockWidget : public QWidget
|
||||
{
|
||||
typedef QWidget baseClass;
|
||||
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
DockInDockWidget( QWidget* parent, bool canCreateNewGroups, PerspectivesManager* perspectivesManager );
|
||||
~DockInDockWidget() override;
|
||||
|
||||
ads::CDockAreaWidget* addTabWidget( QWidget* widget, const QString& name, ads::CDockAreaWidget* after );
|
||||
DockInDockWidget* createGroup( const QString& groupName, ads::CDockAreaWidget*& insertPos );
|
||||
|
||||
ads::CDockAreaWidget* addTabWidget( QWidget* widget, const QString& name, QIcon icon, ads::CDockAreaWidget* after );
|
||||
DockInDockWidget* createGroup( const QString& groupName, QIcon icon, ads::CDockAreaWidget*& insertPos );
|
||||
|
||||
QString getGroupNameError( const QString& groupName );
|
||||
void destroyGroup( DockInDockWidget* widget );
|
||||
|
||||
/** Manually fill a given view menu */
|
||||
void setupViewMenu( QMenu* menu );
|
||||
|
||||
/** Attach a view menu that will be automatically fill */
|
||||
void attachViewMenu( QMenu* menu );
|
||||
|
||||
bool isTopLevel();
|
||||
void setupMenu( QMenu* menu, const std::vector<DockInDockManager*>& moveTo );
|
||||
|
||||
inline DockInDockManager* getManager() { return m_mgr; }
|
||||
inline DockInDockWidget* getTopLevelDockWidget() { return m_topLevelDockWidget; }
|
||||
|
||||
inline bool canCreateNewGroups() const { return m_canCreateNewGroups; }
|
||||
|
||||
void dumpStatus( std::ostream& str, std::string tab = "" );
|
||||
|
||||
inline PerspectivesManager* getPerspectivesManager() { return m_perspectivesManager; }
|
||||
|
||||
void setNewPerspectiveDefaultName( const QString& defaultName );
|
||||
|
||||
private slots:
|
||||
void autoFillAttachedViewMenu();
|
||||
void createPerspective();
|
||||
|
||||
private:
|
||||
DockInDockManager* m_mgr;
|
||||
DockInDockWidget* m_topLevelDockWidget;
|
||||
|
||||
bool m_canCreateNewGroups;
|
||||
|
||||
DockInDockWidget( QWidget* parent, DockInDockWidget* topLevelDockWidget, PerspectivesManager* perspectivesManager );
|
||||
|
||||
PerspectivesManager* m_perspectivesManager;
|
||||
QString m_newPerspectiveDefaultName;
|
||||
|
||||
void fillPerspectivesMenu( QMenu* menu );
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
ADS_OUT_ROOT = $${OUT_PWD}/../..
|
||||
|
||||
QT += core gui widgets
|
||||
|
||||
TARGET = DockInDock
|
||||
DESTDIR = $${ADS_OUT_ROOT}/lib
|
||||
TEMPLATE = app
|
||||
CONFIG += c++14
|
||||
CONFIG += debug_and_release
|
||||
adsBuildStatic {
|
||||
DEFINES += ADS_STATIC
|
||||
}
|
||||
|
||||
DEFINES += QT_DEPRECATED_WARNINGS
|
||||
|
||||
SOURCES += \
|
||||
dockindock.cpp \
|
||||
dockindockmanager.cpp \
|
||||
perspectiveactions.cpp \
|
||||
perspectives.cpp \
|
||||
main.cpp \
|
||||
mainframe.cpp
|
||||
|
||||
HEADERS += \
|
||||
dockindock.h \
|
||||
dockindockmanager.h \
|
||||
perspectiveactions.h \
|
||||
perspectives.h \
|
||||
mainframe.h
|
||||
|
||||
LIBS += -L$${ADS_OUT_ROOT}/lib
|
||||
include(../../ads.pri)
|
||||
INCLUDEPATH += ../../src
|
||||
DEPENDPATH += ../../src
|
||||
|
||||
@@ -1,334 +0,0 @@
|
||||
#include "dockindockmanager.h"
|
||||
#include "dockindock.h"
|
||||
|
||||
#include "DockAreaWidget.h"
|
||||
|
||||
#include <QMenu>
|
||||
#include <QInputDialog>
|
||||
#include <QSettings>
|
||||
#include <QMessageBox>
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
using namespace QtAdsUtl;
|
||||
|
||||
/////////////////////////////////////
|
||||
// DockInDockManager
|
||||
/////////////////////////////////////
|
||||
DockInDockManager::DockInDockManager( DockInDockWidget& parent ) :
|
||||
baseClass( &parent ),
|
||||
m_parent( parent )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
DockInDockManager::~DockInDockManager()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void DockInDockManager::fillViewMenu( QMenu* menu, const std::vector<DockInDockManager*>& moveTo )
|
||||
{
|
||||
auto widgetsMap = dockWidgetsMap();
|
||||
for ( auto iter = widgetsMap.begin(); iter != widgetsMap.end(); ++iter )
|
||||
{
|
||||
auto widget = iter.value()->widget();
|
||||
auto action = iter.value()->toggleViewAction();
|
||||
|
||||
DockInDockWidget* asMgr = dynamic_cast<DockInDockWidget*>( widget );
|
||||
if ( asMgr )
|
||||
{
|
||||
auto subMenu = menu->addMenu( iter.key() );
|
||||
|
||||
subMenu->addAction( action );
|
||||
subMenu->addSeparator();
|
||||
|
||||
asMgr->setupMenu( subMenu, moveTo );
|
||||
}
|
||||
else
|
||||
{
|
||||
menu->addAction(action);
|
||||
}
|
||||
}
|
||||
|
||||
if ( parent().canCreateNewGroups() )
|
||||
{
|
||||
// see how this works, to create it in the right place,
|
||||
// and also to have load perspective work when some groups are missing
|
||||
menu->addSeparator();
|
||||
menu->addAction( new QtAdsUtl::CreateChildDockAction( m_parent, menu ) );
|
||||
|
||||
if ( parent().getTopLevelDockWidget()->getManager() != this )
|
||||
menu->addAction( new QtAdsUtl::DestroyGroupAction( &m_parent, menu ) );
|
||||
}
|
||||
}
|
||||
|
||||
void DockInDockManager::fillMoveMenu( QMenu* menu, const std::vector<DockInDockManager*>& moveTo )
|
||||
{
|
||||
auto widgetsMap = dockWidgetsMap();
|
||||
for ( auto iter = widgetsMap.begin(); iter != widgetsMap.end(); ++iter )
|
||||
{
|
||||
auto subMenu = menu->addMenu( iter.key() );
|
||||
|
||||
for ( auto mgr : moveTo )
|
||||
{
|
||||
// iterate over all possible target managers
|
||||
if ( mgr == this )
|
||||
{
|
||||
// if dock is already in mgr, no reason to move it there
|
||||
}
|
||||
else if ( mgr == dockInAManager( iter.value() ) )
|
||||
{
|
||||
// if target is the group itself, can't move it there, would make no sense
|
||||
}
|
||||
else
|
||||
{
|
||||
subMenu->addAction( new MoveDockWidgetAction( iter.value(), mgr, subMenu ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DockInDockManager::addPerspectiveRec( const QString& name )
|
||||
{
|
||||
std::vector<DockInDockManager*> managers = allManagers( true, true );
|
||||
|
||||
for ( auto child : managers )
|
||||
child->addPerspective( name );
|
||||
}
|
||||
|
||||
void DockInDockManager::openPerspectiveRec( const QString& name )
|
||||
{
|
||||
std::vector<DockInDockManager*> managers = allManagers( true, true );
|
||||
|
||||
for ( auto child : managers )
|
||||
child->openPerspective( name );
|
||||
}
|
||||
|
||||
QString DockInDockManager::getGroupName()
|
||||
{
|
||||
return parent().objectName();
|
||||
}
|
||||
|
||||
#define CHILD_PREFIX QString("Child-")
|
||||
QString DockInDockManager::getPersistGroupName()
|
||||
{
|
||||
QString group = "Top";
|
||||
if ( !getGroupName().isEmpty() )
|
||||
group = CHILD_PREFIX + getGroupName();
|
||||
return group;
|
||||
}
|
||||
|
||||
QString DockInDockManager::getGroupNameFromPersistGroupName( QString persistGroupName )
|
||||
{
|
||||
if ( persistGroupName.startsWith( CHILD_PREFIX ) )
|
||||
{
|
||||
persistGroupName = persistGroupName.mid( CHILD_PREFIX.size() );
|
||||
}
|
||||
else
|
||||
{
|
||||
assert( false );
|
||||
}
|
||||
return persistGroupName;
|
||||
}
|
||||
|
||||
void DockInDockManager::loadPerspectivesRec(QSettings& Settings)
|
||||
{
|
||||
std::vector<DockInDockManager*> children = allManagers( true, true );
|
||||
|
||||
for ( auto mgr : children )
|
||||
{
|
||||
Settings.beginGroup(mgr->getPersistGroupName());
|
||||
mgr->loadPerspectives( Settings );
|
||||
Settings.endGroup();
|
||||
}
|
||||
}
|
||||
|
||||
void DockInDockManager::savePerspectivesRec(QSettings& Settings) const
|
||||
{
|
||||
std::vector<DockInDockManager*> children = allManagers( true, true );
|
||||
|
||||
for ( auto mgr : children )
|
||||
{
|
||||
Settings.beginGroup(mgr->getPersistGroupName());
|
||||
mgr->savePerspectives( Settings );
|
||||
Settings.endGroup();
|
||||
}
|
||||
}
|
||||
|
||||
void DockInDockManager::removePerspectivesRec()
|
||||
{
|
||||
std::vector<DockInDockManager*> managers = allManagers( true, true );
|
||||
|
||||
for ( auto child : managers )
|
||||
child->removePerspectives( child->perspectiveNames() );
|
||||
}
|
||||
|
||||
DockInDockManager* DockInDockManager::dockInAManager( ads::CDockWidget* widget )
|
||||
{
|
||||
DockInDockWidget* dockWidget = widget ? dynamic_cast<DockInDockWidget*>( widget->widget() ) : NULL;
|
||||
return ( dockWidget ) ? dockWidget->getManager() : NULL;
|
||||
}
|
||||
|
||||
void DockInDockManager::childManagers( std::vector<DockInDockManager*>& managers, bool rec ) const
|
||||
{
|
||||
auto widgets = getWidgetsInGUIOrder();
|
||||
for ( auto widget : widgets )
|
||||
{
|
||||
DockInDockManager* asMgr = dockInAManager( widget );
|
||||
if ( asMgr )
|
||||
{
|
||||
managers.push_back( asMgr );
|
||||
if ( rec )
|
||||
asMgr->childManagers( managers, rec );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<DockInDockManager*> DockInDockManager::allManagers( bool includeThis, bool rec ) const
|
||||
{
|
||||
std::vector<DockInDockManager*> managers;
|
||||
if ( includeThis )
|
||||
managers.push_back( const_cast<DockInDockManager*>(this) );
|
||||
childManagers( managers, rec );
|
||||
return managers;
|
||||
}
|
||||
|
||||
std::vector<std::pair<DockInDockManager*,ads::CDockWidget*>> DockInDockManager::allDockWidgets( bool includeThis, bool rec ) const
|
||||
{
|
||||
std::vector<std::pair<DockInDockManager*,ads::CDockWidget*>> widgets;
|
||||
for ( auto mgr : allManagers( includeThis, rec ) )
|
||||
{
|
||||
for ( auto widget : mgr->getWidgetsInGUIOrder() )
|
||||
widgets.push_back( std::make_pair(mgr, widget) );
|
||||
}
|
||||
return widgets;
|
||||
}
|
||||
|
||||
QMap<QString,QStringList> DockInDockManager::getGroupContents()
|
||||
{
|
||||
QMap<QString,QStringList> result;
|
||||
std::vector<DockInDockManager*> managers = allManagers( true, true );
|
||||
for ( auto mgr : managers )
|
||||
{
|
||||
result[mgr->getPersistGroupName()] = mgr->dockWidgetsMap().keys();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
ads::CDockAreaWidget* DockInDockManager::getInsertDefaultPos()
|
||||
{
|
||||
ads::CDockAreaWidget* defaultPos = NULL;
|
||||
if ( dockAreaCount() != 0 )
|
||||
defaultPos = dockArea(dockAreaCount()-1);
|
||||
return defaultPos;
|
||||
}
|
||||
|
||||
std::vector<ads::CDockWidget*> DockInDockManager::getWidgetsInGUIOrder() const
|
||||
{
|
||||
std::vector<ads::CDockWidget*> result;
|
||||
result.reserve( dockWidgetsMap().size() );
|
||||
for ( int i = 0; i != dockAreaCount(); ++i )
|
||||
{
|
||||
for ( auto widget : dockArea(i)->dockWidgets() )
|
||||
result.push_back( widget );
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/////////////////////////////////////
|
||||
// CreateChildDockAction
|
||||
/////////////////////////////////////
|
||||
CreateChildDockAction::CreateChildDockAction( DockInDockWidget& dockInDock, QMenu* menu ) :
|
||||
QAction("New group...", menu),
|
||||
m_dockInDock( dockInDock )
|
||||
{
|
||||
connect( this, SIGNAL(triggered()), this, SLOT(createGroup()) );
|
||||
}
|
||||
|
||||
void CreateChildDockAction::createGroup()
|
||||
{
|
||||
QString name = "";
|
||||
while ( true )
|
||||
{
|
||||
bool ok = false;
|
||||
name = QInputDialog::getText( NULL, this->text(), "Enter group name", QLineEdit::Normal, name, &ok );
|
||||
if ( ok )
|
||||
{
|
||||
QString error = "";
|
||||
if ( m_dockInDock.getTopLevelDockWidget() )
|
||||
error = m_dockInDock.getTopLevelDockWidget()->getGroupNameError( name );
|
||||
else
|
||||
assert( false );
|
||||
|
||||
if ( error.isEmpty() )
|
||||
{
|
||||
ads::CDockAreaWidget* insertPos = NULL;
|
||||
m_dockInDock.createGroup( name, insertPos );
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
QMessageBox::critical( NULL, "Error", error );
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/////////////////////////////////////
|
||||
// DestroyGroupAction
|
||||
/////////////////////////////////////
|
||||
DestroyGroupAction::DestroyGroupAction( DockInDockWidget* widget, QMenu* menu ) :
|
||||
QAction("Destroy " + widget->getManager()->getGroupName(), menu),
|
||||
m_widget( widget )
|
||||
{
|
||||
connect( this, SIGNAL(triggered()), this, SLOT(destroyGroup()) );
|
||||
}
|
||||
|
||||
void DestroyGroupAction::destroyGroup()
|
||||
{
|
||||
m_widget->getTopLevelDockWidget()->destroyGroup( m_widget );
|
||||
}
|
||||
|
||||
|
||||
/////////////////////////////////////
|
||||
// MoveDockWidgetAction
|
||||
/////////////////////////////////////
|
||||
MoveDockWidgetAction::MoveDockWidgetAction( ads::CDockWidget* widget, DockInDockManager* moveTo, QMenu* menu ) :
|
||||
QAction(menu),
|
||||
m_widget( widget ),
|
||||
m_moveTo( moveTo )
|
||||
{
|
||||
if ( moveTo->parent().isTopLevel() )
|
||||
{
|
||||
setText( "To top" );
|
||||
}
|
||||
else
|
||||
{
|
||||
setText( "To " + moveTo->parent().objectName() );
|
||||
}
|
||||
connect( this, SIGNAL(triggered()), this, SLOT(move()) );
|
||||
}
|
||||
|
||||
void MoveDockWidgetAction::move()
|
||||
{
|
||||
move( m_widget, m_moveTo );
|
||||
}
|
||||
|
||||
void MoveDockWidgetAction::move( ads::CDockWidget* widget, DockInDockManager* moveTo )
|
||||
{
|
||||
if ( widget && moveTo )
|
||||
{
|
||||
widget->dockManager()->removeDockWidget( widget );
|
||||
moveTo->addDockWidget(ads::CenterDockWidgetArea, widget, moveTo->getInsertDefaultPos());
|
||||
}
|
||||
else
|
||||
{
|
||||
assert( false );
|
||||
}
|
||||
}
|
||||
@@ -1,96 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include "DockManager.h"
|
||||
|
||||
#include <QAction>
|
||||
#include <QMap>
|
||||
|
||||
namespace QtAdsUtl
|
||||
{
|
||||
|
||||
class DockInDockWidget;
|
||||
class DockInDockManager : public ads::CDockManager
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
typedef ads::CDockManager baseClass;
|
||||
|
||||
public:
|
||||
DockInDockManager( DockInDockWidget& parent );
|
||||
~DockInDockManager() override;
|
||||
|
||||
void fillViewMenu( QMenu* menu, const std::vector<DockInDockManager*>& moveTo );
|
||||
void fillMoveMenu( QMenu* menu, const std::vector<DockInDockManager*>& moveTo );
|
||||
|
||||
void addPerspectiveRec( const QString& name );
|
||||
void openPerspectiveRec( const QString& name );
|
||||
void removePerspectivesRec();
|
||||
void loadPerspectivesRec(QSettings& Settings);
|
||||
void savePerspectivesRec(QSettings& Settings) const;
|
||||
|
||||
static DockInDockManager* dockInAManager( ads::CDockWidget* widget );
|
||||
|
||||
inline DockInDockWidget& parent() { return m_parent; }
|
||||
|
||||
void childManagers( std::vector<DockInDockManager*>& managers, bool rec ) const;
|
||||
std::vector<DockInDockManager*> allManagers( bool includeThis, bool rec ) const;
|
||||
std::vector<std::pair<DockInDockManager*,ads::CDockWidget*>> allDockWidgets( bool includeThis, bool rec ) const;
|
||||
|
||||
QString getGroupName();
|
||||
QString getPersistGroupName();
|
||||
static QString getGroupNameFromPersistGroupName( QString persistGroupName );
|
||||
|
||||
QMap<QString,QStringList> getGroupContents();
|
||||
|
||||
ads::CDockAreaWidget* getInsertDefaultPos();
|
||||
|
||||
std::vector<ads::CDockWidget*> getWidgetsInGUIOrder() const;
|
||||
|
||||
private:
|
||||
DockInDockWidget& m_parent;
|
||||
};
|
||||
|
||||
class CreateChildDockAction : public QAction
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
CreateChildDockAction( DockInDockWidget& dockInDock, QMenu* menu );
|
||||
|
||||
public slots:
|
||||
void createGroup();
|
||||
|
||||
private:
|
||||
DockInDockWidget& m_dockInDock;
|
||||
};
|
||||
|
||||
class DestroyGroupAction : public QAction
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
DestroyGroupAction( DockInDockWidget* widget, QMenu* menu );
|
||||
|
||||
public slots:
|
||||
void destroyGroup();
|
||||
|
||||
private:
|
||||
DockInDockWidget* m_widget;
|
||||
};
|
||||
|
||||
class MoveDockWidgetAction : public QAction
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
MoveDockWidgetAction( ads::CDockWidget* widget, DockInDockManager* moveTo, QMenu* menu );
|
||||
|
||||
static void move( ads::CDockWidget* widget, DockInDockManager* moveTo );
|
||||
|
||||
public slots:
|
||||
void move();
|
||||
|
||||
private:
|
||||
ads::CDockWidget* m_widget;
|
||||
DockInDockManager* m_moveTo;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
#include <QApplication>
|
||||
#include "../../examples/simple/MainWindow.h"
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QApplication a(argc, argv);
|
||||
MainWindow w;
|
||||
w.show();
|
||||
|
||||
return a.exec();
|
||||
}
|
||||
@@ -1,76 +0,0 @@
|
||||
#include "mainframe.h"
|
||||
|
||||
#include "dockindock.h"
|
||||
#include "perspectives.h"
|
||||
|
||||
#include <QLabel>
|
||||
#include <QMenuBar>
|
||||
#include <QMessageBox>
|
||||
#include <QSettings>
|
||||
|
||||
MainWindow::MainWindow(QWidget *parent) :
|
||||
QMainWindow(parent),
|
||||
m_perspectivesManager( new QtAdsUtl::PerspectivesManager( "persist" ) )
|
||||
{
|
||||
resize( 400, 400 );
|
||||
|
||||
setCentralWidget( m_dockManager = new QtAdsUtl::DockInDockWidget(this,true,m_perspectivesManager.get()) );
|
||||
|
||||
m_dockManager->attachViewMenu( menuBar()->addMenu( "View" ) );
|
||||
|
||||
ads::CDockAreaWidget* previousDockWidget = NULL;
|
||||
for ( int i = 0; i != 3; ++i )
|
||||
{
|
||||
// Create example content label - this can be any application specific
|
||||
// widget
|
||||
QLabel* l = new QLabel();
|
||||
l->setWordWrap(true);
|
||||
l->setAlignment(Qt::AlignTop | Qt::AlignLeft);
|
||||
l->setText("Lorem ipsum dolor sit amet, consectetuer adipiscing elit. ");
|
||||
|
||||
previousDockWidget = m_dockManager->addTabWidget( l, "Top label " + QString::number(i), previousDockWidget );
|
||||
}
|
||||
|
||||
auto lastTopLevelDock = previousDockWidget;
|
||||
|
||||
for ( int j = 0; j != 2; ++j )
|
||||
{
|
||||
QtAdsUtl::DockInDockWidget* groupManager = m_dockManager->createGroup( "Group " + QString::number(j), lastTopLevelDock );
|
||||
|
||||
previousDockWidget = NULL;
|
||||
for ( int i = 0; i != 3; ++i )
|
||||
{
|
||||
// Create example content label - this can be any application specific
|
||||
// widget
|
||||
QLabel* l = new QLabel();
|
||||
l->setWordWrap(true);
|
||||
l->setAlignment(Qt::AlignTop | Qt::AlignLeft);
|
||||
l->setText("Lorem ipsum dolor sit amet, consectetuer adipiscing elit. ");
|
||||
|
||||
previousDockWidget = groupManager->addTabWidget( l, "ZInner " + QString::number(j) + "/" + QString::number(i), previousDockWidget );
|
||||
}
|
||||
|
||||
// create sub-group
|
||||
auto subGroup = groupManager->createGroup( "SubGroup " + QString::number(j), previousDockWidget );
|
||||
previousDockWidget = NULL;
|
||||
for ( int i = 0; i != 3; ++i )
|
||||
{
|
||||
// Create example content label - this can be any application specific
|
||||
// widget
|
||||
QLabel* l = new QLabel();
|
||||
l->setWordWrap(true);
|
||||
l->setAlignment(Qt::AlignTop | Qt::AlignLeft);
|
||||
l->setText("Lorem ipsum dolor sit amet, consectetuer adipiscing elit. ");
|
||||
|
||||
previousDockWidget = subGroup->addTabWidget( l, "SubInner " + QString::number(j) + "/" + QString::number(i), previousDockWidget );
|
||||
}
|
||||
}
|
||||
|
||||
m_perspectivesManager->loadPerspectives();
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow()
|
||||
{
|
||||
m_perspectivesManager->savePerspectives();
|
||||
}
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <QMainWindow>
|
||||
#include <QAction>
|
||||
#include <QSettings>
|
||||
|
||||
#include <memory>
|
||||
namespace QtAdsUtl
|
||||
{
|
||||
class DockInDockWidget;
|
||||
class PerspectivesManager;
|
||||
}
|
||||
|
||||
class MainWindow : public QMainWindow
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit MainWindow(QWidget *parent = 0);
|
||||
~MainWindow();
|
||||
|
||||
QtAdsUtl::DockInDockWidget* m_dockManager;
|
||||
std::unique_ptr<QtAdsUtl::PerspectivesManager> m_perspectivesManager;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
#include "perspectiveactions.h"
|
||||
#include "dockindock.h"
|
||||
#include "perspectives.h"
|
||||
|
||||
#include <QMenu>
|
||||
|
||||
using namespace QtAdsUtl;
|
||||
|
||||
//////////////////////////////
|
||||
// LoadPerspectiveAction
|
||||
//////////////////////////////
|
||||
LoadPerspectiveAction::LoadPerspectiveAction( QMenu* parent, const QString& name, QtAdsUtl::DockInDockWidget& dockManager ) :
|
||||
QAction( name, parent ),
|
||||
name( name ),
|
||||
dockManager( dockManager )
|
||||
{
|
||||
connect( this, SIGNAL(triggered()), this, SLOT(load()) );
|
||||
}
|
||||
|
||||
void LoadPerspectiveAction::load()
|
||||
{
|
||||
dockManager.getPerspectivesManager()->openPerspective( name, dockManager );
|
||||
}
|
||||
|
||||
//////////////////////////////
|
||||
// RemovePerspectiveAction
|
||||
//////////////////////////////
|
||||
RemovePerspectiveAction::RemovePerspectiveAction( QMenu* parent, const QString& name, QtAdsUtl::DockInDockWidget& dockManager ) :
|
||||
QAction( name, parent ),
|
||||
name( name ),
|
||||
dockManager( dockManager )
|
||||
{
|
||||
connect( this, SIGNAL(triggered()), this, SLOT(remove()) );
|
||||
}
|
||||
|
||||
void RemovePerspectiveAction::remove()
|
||||
{
|
||||
dockManager.getPerspectivesManager()->removePerspective( name );
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <QAction>
|
||||
|
||||
namespace QtAdsUtl
|
||||
{
|
||||
|
||||
class DockInDockWidget;
|
||||
class LoadPerspectiveAction : public QAction
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
LoadPerspectiveAction( QMenu* parent, const QString& name, QtAdsUtl::DockInDockWidget& dockManager );
|
||||
|
||||
public slots:
|
||||
void load();
|
||||
|
||||
private:
|
||||
QString name;
|
||||
QtAdsUtl::DockInDockWidget& dockManager;
|
||||
};
|
||||
|
||||
class RemovePerspectiveAction : public QAction
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
RemovePerspectiveAction( QMenu* parent, const QString& name, QtAdsUtl::DockInDockWidget& dockManager );
|
||||
|
||||
public slots:
|
||||
void remove();
|
||||
|
||||
private:
|
||||
QString name;
|
||||
QtAdsUtl::DockInDockWidget& dockManager;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -1,278 +0,0 @@
|
||||
#include "perspectives.h"
|
||||
#include "dockindock.h"
|
||||
#include "dockindockmanager.h"
|
||||
|
||||
#include <QSettings>
|
||||
#include <QFile>
|
||||
#include <QDir>
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#define GROUP_PREFIX QString("Group")
|
||||
|
||||
using namespace QtAdsUtl;
|
||||
|
||||
PerspectivesManager::PerspectivesManager( const QString& perspectivesFolder ) :
|
||||
m_perspectivesFolder( perspectivesFolder )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
PerspectivesManager::~PerspectivesManager()
|
||||
{
|
||||
// remove temp files:
|
||||
for ( auto perspective : m_perspectives )
|
||||
{
|
||||
QString fileName = perspective.settings->fileName();
|
||||
perspective.settings.reset();
|
||||
QFile::remove(fileName);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
QStringList PerspectivesManager::perspectiveNames() const
|
||||
{
|
||||
return m_perspectives.keys();
|
||||
}
|
||||
|
||||
void PerspectivesManager::addPerspective( const QString& name, DockInDockWidget& widget )
|
||||
{
|
||||
if ( !m_perspectivesFolder.isEmpty() )
|
||||
{
|
||||
m_perspectives[name].settings = getSettingsObject( getSettingsFileName( name, true ) );
|
||||
m_perspectives[name].groups = widget.getManager()->getGroupContents();
|
||||
|
||||
// save perspective internally
|
||||
widget.getManager()->addPerspectiveRec( name );
|
||||
// store it in QSettings object
|
||||
widget.getManager()->savePerspectivesRec( *(m_perspectives[name].settings) );
|
||||
// remove internal perspectives
|
||||
widget.getManager()->removePerspectives( widget.getManager()->perspectiveNames() );
|
||||
}
|
||||
else
|
||||
{
|
||||
assert( false );
|
||||
}
|
||||
|
||||
emit perspectivesListChanged();
|
||||
}
|
||||
|
||||
|
||||
ads::CDockWidget* findWidget( QString name, const std::vector<DockInDockManager*>& managers )
|
||||
{
|
||||
for ( auto mgr : managers )
|
||||
{
|
||||
auto widget = mgr->findDockWidget(name);
|
||||
if ( widget )
|
||||
return widget;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void PerspectivesManager::openPerspective( const QString& name, DockInDockWidget& widget )
|
||||
{
|
||||
assert( widget.getTopLevelDockWidget() == &widget );
|
||||
|
||||
if ( !m_perspectivesFolder.isEmpty() )
|
||||
{
|
||||
if ( m_perspectives.contains( name ) )
|
||||
{
|
||||
emit openingPerspective();
|
||||
|
||||
if ( widget.canCreateNewGroups() )
|
||||
{
|
||||
auto curGroups = widget.getManager()->allManagers(true,true);
|
||||
for ( auto group : m_perspectives[name].groups.keys() )
|
||||
{
|
||||
bool found = false;
|
||||
for ( auto curgroup : curGroups )
|
||||
{
|
||||
if ( curgroup->getPersistGroupName() == group )
|
||||
{
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ( !found )
|
||||
{
|
||||
group = DockInDockManager::getGroupNameFromPersistGroupName( group );
|
||||
|
||||
// restore group in file but not in GUI yet
|
||||
ads::CDockAreaWidget* insertPos = NULL;
|
||||
widget.createGroup( group, insertPos );
|
||||
}
|
||||
}
|
||||
|
||||
curGroups = widget.getManager()->allManagers(false,true);
|
||||
for ( auto curgroup : curGroups )
|
||||
{
|
||||
if ( !m_perspectives[name].groups.keys().contains( curgroup->getPersistGroupName() ) )
|
||||
{
|
||||
widget.destroyGroup( &curgroup->parent() );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
auto managers = widget.getManager()->allManagers(true,true);
|
||||
for ( auto group : m_perspectives[name].groups.keys() )
|
||||
{
|
||||
for ( auto mgr : managers )
|
||||
{
|
||||
if ( mgr->getPersistGroupName() == group )
|
||||
{
|
||||
for ( QString widgetName : m_perspectives[name].groups[group] )
|
||||
{
|
||||
ads::CDockWidget* widget = findWidget( widgetName, { mgr } );
|
||||
if ( widget )
|
||||
{
|
||||
// OK, widget is already in the good manager!
|
||||
}
|
||||
else
|
||||
{
|
||||
widget = findWidget( widgetName, managers );
|
||||
if ( widget )
|
||||
{
|
||||
// move dock widget in the same group as it used to be when perspective was saved
|
||||
// this guarantee load/open perspectives will work smartly
|
||||
MoveDockWidgetAction::move( widget, mgr );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// internally load perspectives from QSettings
|
||||
widget.getManager()->loadPerspectivesRec( *(m_perspectives[name].settings) );
|
||||
// load perspective (update GUI)
|
||||
widget.getManager()->openPerspectiveRec( name );
|
||||
// remove internal perspectives
|
||||
widget.getManager()->removePerspectives( widget.getManager()->perspectiveNames() );
|
||||
|
||||
emit openedPerspective();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
assert( false );
|
||||
}
|
||||
}
|
||||
|
||||
void PerspectivesManager::removePerspectives()
|
||||
{
|
||||
m_perspectives.clear();
|
||||
emit perspectivesListChanged();
|
||||
}
|
||||
|
||||
void PerspectivesManager::removePerspective( const QString& name )
|
||||
{
|
||||
m_perspectives.remove( name );
|
||||
emit perspectivesListChanged();
|
||||
}
|
||||
|
||||
QString PerspectivesManager::getSettingsFileName( const QString& perspective, bool temp ) const
|
||||
{
|
||||
auto name = ( perspective.isEmpty() ) ? "perspectives.ini" : "perspective_" + perspective + (temp?".tmp":".ini");
|
||||
|
||||
return m_perspectivesFolder + "/" + name;
|
||||
}
|
||||
|
||||
std::shared_ptr<QSettings> PerspectivesManager::getSettingsObject( const QString& filePath ) const
|
||||
{
|
||||
return std::make_shared<QSettings>(filePath, QSettings::IniFormat);
|
||||
}
|
||||
|
||||
void PerspectivesManager::loadPerspectives()
|
||||
{
|
||||
if ( !m_perspectivesFolder.isEmpty() )
|
||||
{
|
||||
QDir().mkpath( m_perspectivesFolder );
|
||||
|
||||
m_perspectives.clear();
|
||||
|
||||
auto mainSettings = getSettingsObject( getSettingsFileName( "", false ) );
|
||||
std::string debug = mainSettings->fileName().toStdString();
|
||||
|
||||
int Size = mainSettings->beginReadArray("Perspectives");
|
||||
|
||||
for (int i = 0; i < Size; ++i)
|
||||
{
|
||||
mainSettings->setArrayIndex(i);
|
||||
QString perspective = mainSettings->value("Name").toString();
|
||||
|
||||
if ( !perspective.isEmpty() )
|
||||
{
|
||||
// load perspective file:
|
||||
auto toLoad = getSettingsFileName( perspective, false );
|
||||
auto loaded = getSettingsFileName( perspective, true );
|
||||
|
||||
#ifdef _DEBUG
|
||||
std::string debug1 = loaded.toStdString();
|
||||
std::string debug2 = toLoad.toStdString();
|
||||
#endif
|
||||
|
||||
QFile::remove( loaded );
|
||||
if ( !QFile::copy( toLoad, loaded ) )
|
||||
assert( false );
|
||||
|
||||
m_perspectives[perspective].settings = getSettingsObject( loaded );
|
||||
|
||||
// load group info:
|
||||
mainSettings->beginGroup(GROUP_PREFIX);
|
||||
for ( auto key : mainSettings->allKeys() )
|
||||
m_perspectives[perspective].groups[key] = mainSettings->value( key ).toStringList();
|
||||
mainSettings->endGroup();
|
||||
}
|
||||
else
|
||||
{
|
||||
assert( false );
|
||||
}
|
||||
}
|
||||
|
||||
mainSettings->endArray();
|
||||
}
|
||||
|
||||
emit perspectivesListChanged();
|
||||
}
|
||||
|
||||
void PerspectivesManager::savePerspectives() const
|
||||
{
|
||||
if ( !m_perspectivesFolder.isEmpty() )
|
||||
{
|
||||
auto mainSettings = getSettingsObject( getSettingsFileName( "", false ) );
|
||||
|
||||
// Save list of perspective and group organization
|
||||
mainSettings->beginWriteArray("Perspectives", m_perspectives.size());
|
||||
int i = 0;
|
||||
for ( auto perspective : m_perspectives.keys() )
|
||||
{
|
||||
mainSettings->setArrayIndex(i);
|
||||
mainSettings->setValue("Name", perspective);
|
||||
mainSettings->beginGroup(GROUP_PREFIX);
|
||||
for ( auto group : m_perspectives[perspective].groups.keys() )
|
||||
{
|
||||
mainSettings->setValue( group, m_perspectives[perspective].groups[group] );
|
||||
}
|
||||
mainSettings->endGroup();
|
||||
++i;
|
||||
}
|
||||
mainSettings->endArray();
|
||||
|
||||
// Save perspectives themselves
|
||||
for ( auto perspectiveName : m_perspectives.keys() )
|
||||
{
|
||||
auto toSave = getSettingsFileName( perspectiveName, false );
|
||||
QSettings& settings = *(m_perspectives[perspectiveName].settings);
|
||||
settings.sync();
|
||||
|
||||
#ifdef _DEBUG
|
||||
std::string debug1 = settings.fileName().toStdString();
|
||||
std::string debug2 = toSave.toStdString();
|
||||
#endif
|
||||
|
||||
QFile::remove( toSave );
|
||||
if ( !QFile::copy( settings.fileName(), toSave ) )
|
||||
assert( false );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,59 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <QObject>
|
||||
#include <QMap>
|
||||
#include <QString>
|
||||
|
||||
#include <memory>
|
||||
|
||||
class QMenu;
|
||||
class QSettings;
|
||||
|
||||
namespace QtAdsUtl
|
||||
{
|
||||
|
||||
class DockInDockWidget;
|
||||
class PerspectivesManager : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
PerspectivesManager( const QString& perspectivesFolder );
|
||||
virtual ~PerspectivesManager();
|
||||
|
||||
QStringList perspectiveNames() const;
|
||||
|
||||
void addPerspective( const QString& name, DockInDockWidget& widget );
|
||||
void openPerspective( const QString& name, DockInDockWidget& widget );
|
||||
void removePerspectives();
|
||||
void removePerspective( const QString& name );
|
||||
|
||||
void loadPerspectives();
|
||||
void savePerspectives() const;
|
||||
|
||||
signals:
|
||||
void perspectivesListChanged();
|
||||
void openingPerspective();
|
||||
void openedPerspective();
|
||||
|
||||
private:
|
||||
|
||||
// Partially bypass ADS perspective management, store list here
|
||||
// and then ADS will only have one perspective loaded
|
||||
// this is because all docking widgets must exist when a perspective is loaded
|
||||
// we will guarantee that!
|
||||
class PerspectiveInfo
|
||||
{
|
||||
public:
|
||||
std::shared_ptr<QSettings> settings;
|
||||
QMap<QString,QStringList> groups;
|
||||
};
|
||||
QMap<QString,PerspectiveInfo> m_perspectives;
|
||||
|
||||
QString m_perspectivesFolder;
|
||||
QString getSettingsFileName( const QString& perspective, bool temp ) const;
|
||||
std::shared_ptr<QSettings> getSettingsObject( const QString& filePath ) const;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
project(ads_example_centralwidget VERSION ${VERSION_SHORT})
|
||||
find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED)
|
||||
find_package(Qt${QT_VERSION_MAJOR} 5.5 COMPONENTS Core Gui Widgets REQUIRED)
|
||||
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||
add_executable(EmptyDockAreaExample WIN32
|
||||
main.cpp
|
||||
mainwindow.cpp
|
||||
mainwindow.ui
|
||||
)
|
||||
target_include_directories(EmptyDockAreaExample PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../src")
|
||||
target_link_libraries(EmptyDockAreaExample PRIVATE qtadvanceddocking)
|
||||
target_link_libraries(EmptyDockAreaExample PUBLIC Qt${QT_VERSION_MAJOR}::Core
|
||||
Qt${QT_VERSION_MAJOR}::Gui
|
||||
Qt${QT_VERSION_MAJOR}::Widgets)
|
||||
set_target_properties(EmptyDockAreaExample PROPERTIES
|
||||
AUTOMOC ON
|
||||
AUTORCC ON
|
||||
AUTOUIC ON
|
||||
CXX_STANDARD 14
|
||||
CXX_STANDARD_REQUIRED ON
|
||||
CXX_EXTENSIONS OFF
|
||||
VERSION ${VERSION_SHORT}
|
||||
EXPORT_NAME "Qt Advanced Docking System Empty Dock Area Example"
|
||||
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${ads_PlatformDir}/lib"
|
||||
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${ads_PlatformDir}/lib"
|
||||
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${ads_PlatformDir}/bin"
|
||||
)
|
||||
@@ -1,34 +0,0 @@
|
||||
ADS_OUT_ROOT = $${OUT_PWD}/../..
|
||||
|
||||
QT += core gui widgets
|
||||
|
||||
TARGET = EmptyDockareaExample
|
||||
DESTDIR = $${ADS_OUT_ROOT}/lib
|
||||
TEMPLATE = app
|
||||
CONFIG += c++14
|
||||
CONFIG += debug_and_release
|
||||
adsBuildStatic {
|
||||
DEFINES += ADS_STATIC
|
||||
}
|
||||
|
||||
# The following define makes your compiler emit warnings if you use
|
||||
# any Qt feature that has been marked deprecated (the exact warnings
|
||||
# depend on your compiler). Please consult the documentation of the
|
||||
# deprecated API in order to know how to port your code away from it.
|
||||
DEFINES += QT_DEPRECATED_WARNINGS
|
||||
|
||||
SOURCES += \
|
||||
main.cpp \
|
||||
mainwindow.cpp
|
||||
|
||||
HEADERS += \
|
||||
mainwindow.h
|
||||
|
||||
FORMS += \
|
||||
mainwindow.ui
|
||||
|
||||
LIBS += -L$${ADS_OUT_ROOT}/lib
|
||||
include(../../ads.pri)
|
||||
INCLUDEPATH += ../../src
|
||||
DEPENDPATH += ../../src
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
#include <mainwindow.h>
|
||||
#include <QApplication>
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QApplication a(argc, argv);
|
||||
CMainWindow w;
|
||||
w.show();
|
||||
return a.exec();
|
||||
}
|
||||
@@ -1,135 +0,0 @@
|
||||
#include "mainwindow.h"
|
||||
|
||||
#include "ui_mainwindow.h"
|
||||
|
||||
#include <QWidgetAction>
|
||||
#include <QLabel>
|
||||
#include <QCalendarWidget>
|
||||
#include <QTreeView>
|
||||
#include <QFileSystemModel>
|
||||
#include <QTableWidget>
|
||||
#include <QHBoxLayout>
|
||||
#include <QRadioButton>
|
||||
#include <QPushButton>
|
||||
#include <QInputDialog>
|
||||
#include <QFileDialog>
|
||||
#include <QSettings>
|
||||
#include <QMessageBox>
|
||||
#include <QPlainTextEdit>
|
||||
#include <QToolBar>
|
||||
|
||||
#include "DockAreaWidget.h"
|
||||
#include "DockAreaTitleBar.h"
|
||||
#include "DockAreaTabBar.h"
|
||||
#include "FloatingDockContainer.h"
|
||||
#include "DockComponentsFactory.h"
|
||||
|
||||
using namespace ads;
|
||||
|
||||
|
||||
CMainWindow::CMainWindow(QWidget *parent)
|
||||
: QMainWindow(parent)
|
||||
, ui(new Ui::CMainWindow)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
CDockManager::setConfigFlag(CDockManager::OpaqueSplitterResize, true);
|
||||
CDockManager::setConfigFlag(CDockManager::XmlCompressionEnabled, false);
|
||||
CDockManager::setConfigFlag(CDockManager::FocusHighlighting, true);
|
||||
DockManager = new CDockManager(this);
|
||||
|
||||
// Set central widget
|
||||
QLabel* label = new QLabel();
|
||||
label->setText("This is a DockArea which is always visible, even if it does not contain any DockWidgets.");
|
||||
label->setAlignment(Qt::AlignCenter);
|
||||
CDockWidget* CentralDockWidget = new CDockWidget("CentralWidget");
|
||||
CentralDockWidget->setWidget(label);
|
||||
CentralDockWidget->setFeature(ads::CDockWidget::NoTab, true);
|
||||
auto* CentralDockArea = DockManager->setCentralWidget(CentralDockWidget);
|
||||
|
||||
// create other dock widgets
|
||||
QTableWidget* table = new QTableWidget();
|
||||
table->setColumnCount(3);
|
||||
table->setRowCount(10);
|
||||
CDockWidget* TableDockWidget = new CDockWidget("Table 1");
|
||||
TableDockWidget->setWidget(table);
|
||||
TableDockWidget->setMinimumSizeHintMode(CDockWidget::MinimumSizeHintFromDockWidget);
|
||||
TableDockWidget->resize(250, 150);
|
||||
TableDockWidget->setMinimumSize(200,150);
|
||||
DockManager->addDockWidgetTabToArea(TableDockWidget, CentralDockArea);
|
||||
auto TableArea = DockManager->addDockWidget(DockWidgetArea::LeftDockWidgetArea, TableDockWidget);
|
||||
ui->menuView->addAction(TableDockWidget->toggleViewAction());
|
||||
|
||||
table = new QTableWidget();
|
||||
table->setColumnCount(5);
|
||||
table->setRowCount(1020);
|
||||
TableDockWidget = new CDockWidget("Table 2");
|
||||
TableDockWidget->setWidget(table);
|
||||
TableDockWidget->setMinimumSizeHintMode(CDockWidget::MinimumSizeHintFromDockWidget);
|
||||
TableDockWidget->resize(250, 150);
|
||||
TableDockWidget->setMinimumSize(200,150);
|
||||
DockManager->addDockWidget(DockWidgetArea::BottomDockWidgetArea, TableDockWidget, TableArea);
|
||||
ui->menuView->addAction(TableDockWidget->toggleViewAction());
|
||||
|
||||
QTableWidget* propertiesTable = new QTableWidget();
|
||||
propertiesTable->setColumnCount(3);
|
||||
propertiesTable->setRowCount(10);
|
||||
CDockWidget* PropertiesDockWidget = new CDockWidget("Properties");
|
||||
PropertiesDockWidget->setWidget(propertiesTable);
|
||||
PropertiesDockWidget->setMinimumSizeHintMode(CDockWidget::MinimumSizeHintFromDockWidget);
|
||||
PropertiesDockWidget->resize(250, 150);
|
||||
PropertiesDockWidget->setMinimumSize(200,150);
|
||||
DockManager->addDockWidget(DockWidgetArea::RightDockWidgetArea, PropertiesDockWidget, CentralDockArea);
|
||||
ui->menuView->addAction(PropertiesDockWidget->toggleViewAction());
|
||||
|
||||
createPerspectiveUi();
|
||||
}
|
||||
|
||||
CMainWindow::~CMainWindow()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
|
||||
void CMainWindow::createPerspectiveUi()
|
||||
{
|
||||
SavePerspectiveAction = new QAction("Create Perspective", this);
|
||||
connect(SavePerspectiveAction, SIGNAL(triggered()), SLOT(savePerspective()));
|
||||
PerspectiveListAction = new QWidgetAction(this);
|
||||
PerspectiveComboBox = new QComboBox(this);
|
||||
PerspectiveComboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents);
|
||||
PerspectiveComboBox->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
|
||||
connect(PerspectiveComboBox, SIGNAL(activated(const QString&)),
|
||||
DockManager, SLOT(openPerspective(const QString&)));
|
||||
PerspectiveListAction->setDefaultWidget(PerspectiveComboBox);
|
||||
ui->toolBar->addSeparator();
|
||||
ui->toolBar->addAction(PerspectiveListAction);
|
||||
ui->toolBar->addAction(SavePerspectiveAction);
|
||||
}
|
||||
|
||||
|
||||
void CMainWindow::savePerspective()
|
||||
{
|
||||
QString PerspectiveName = QInputDialog::getText(this, "Save Perspective", "Enter unique name:");
|
||||
if (PerspectiveName.isEmpty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
DockManager->addPerspective(PerspectiveName);
|
||||
QSignalBlocker Blocker(PerspectiveComboBox);
|
||||
PerspectiveComboBox->clear();
|
||||
PerspectiveComboBox->addItems(DockManager->perspectiveNames());
|
||||
PerspectiveComboBox->setCurrentText(PerspectiveName);
|
||||
}
|
||||
|
||||
|
||||
//============================================================================
|
||||
void CMainWindow::closeEvent(QCloseEvent* event)
|
||||
{
|
||||
// Delete dock manager here to delete all floating widgets. This ensures
|
||||
// that all top level windows of the dock manager are properly closed
|
||||
DockManager->deleteLater();
|
||||
QMainWindow::closeEvent(event);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,43 +0,0 @@
|
||||
#ifndef MAINWINDOW_H
|
||||
#define MAINWINDOW_H
|
||||
|
||||
#include <QMainWindow>
|
||||
#include <QComboBox>
|
||||
#include <QWidgetAction>
|
||||
|
||||
#include "DockManager.h"
|
||||
#include "DockAreaWidget.h"
|
||||
#include "DockWidget.h"
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
namespace Ui { class CMainWindow; }
|
||||
QT_END_NAMESPACE
|
||||
|
||||
class CMainWindow : public QMainWindow
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
CMainWindow(QWidget *parent = nullptr);
|
||||
~CMainWindow();
|
||||
|
||||
protected:
|
||||
virtual void closeEvent(QCloseEvent* event) override;
|
||||
|
||||
private:
|
||||
QAction* SavePerspectiveAction = nullptr;
|
||||
QWidgetAction* PerspectiveListAction = nullptr;
|
||||
QComboBox* PerspectiveComboBox = nullptr;
|
||||
|
||||
Ui::CMainWindow *ui;
|
||||
|
||||
ads::CDockManager* DockManager;
|
||||
ads::CDockAreaWidget* StatusDockArea;
|
||||
ads::CDockWidget* TimelineDockWidget;
|
||||
|
||||
void createPerspectiveUi();
|
||||
|
||||
private slots:
|
||||
void savePerspective();
|
||||
};
|
||||
#endif // MAINWINDOW_H
|
||||
@@ -1,47 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>CMainWindow</class>
|
||||
<widget class="QMainWindow" name="CMainWindow">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>1284</width>
|
||||
<height>757</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>MainWindow</string>
|
||||
</property>
|
||||
<widget class="QWidget" name="centralwidget"/>
|
||||
<widget class="QMenuBar" name="menubar">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>1284</width>
|
||||
<height>21</height>
|
||||
</rect>
|
||||
</property>
|
||||
<widget class="QMenu" name="menuView">
|
||||
<property name="title">
|
||||
<string>View</string>
|
||||
</property>
|
||||
</widget>
|
||||
<addaction name="menuView"/>
|
||||
</widget>
|
||||
<widget class="QToolBar" name="toolBar">
|
||||
<property name="windowTitle">
|
||||
<string>toolBar</string>
|
||||
</property>
|
||||
<attribute name="toolBarArea">
|
||||
<enum>TopToolBarArea</enum>
|
||||
</attribute>
|
||||
<attribute name="toolBarBreak">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
</widget>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
@@ -4,6 +4,4 @@ SUBDIRS = \
|
||||
centralwidget \
|
||||
simple \
|
||||
sidebar \
|
||||
deleteonclose \
|
||||
emptydockarea \
|
||||
dockindock
|
||||
deleteonclose
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
project(ads_example_sidebar VERSION ${VERSION_SHORT})
|
||||
find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED)
|
||||
find_package(Qt${QT_VERSION_MAJOR} 5.5 COMPONENTS Core Gui Widgets REQUIRED)
|
||||
find_package(Qt5 5.5 COMPONENTS Core Gui Widgets REQUIRED)
|
||||
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||
add_executable(SidebarExample WIN32
|
||||
main.cpp
|
||||
@@ -10,9 +9,7 @@ add_executable(SidebarExample WIN32
|
||||
)
|
||||
target_include_directories(SidebarExample PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../src")
|
||||
target_link_libraries(SidebarExample PRIVATE qtadvanceddocking)
|
||||
target_link_libraries(SidebarExample PUBLIC Qt${QT_VERSION_MAJOR}::Core
|
||||
Qt${QT_VERSION_MAJOR}::Gui
|
||||
Qt${QT_VERSION_MAJOR}::Widgets)
|
||||
target_link_libraries(SidebarExample PUBLIC Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
set_target_properties(SidebarExample PROPERTIES
|
||||
AUTOMOC ON
|
||||
AUTORCC ON
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
project(ads_example_simple VERSION ${VERSION_SHORT})
|
||||
find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED)
|
||||
find_package(Qt${QT_VERSION_MAJOR} 5.5 COMPONENTS Core Gui Widgets REQUIRED)
|
||||
find_package(Qt5 5.5 COMPONENTS Core Gui Widgets REQUIRED)
|
||||
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||
add_executable(SimpleExample WIN32
|
||||
main.cpp
|
||||
@@ -10,9 +9,7 @@ add_executable(SimpleExample WIN32
|
||||
)
|
||||
target_include_directories(SimpleExample PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../src")
|
||||
target_link_libraries(SimpleExample PRIVATE qtadvanceddocking)
|
||||
target_link_libraries(SimpleExample PUBLIC Qt${QT_VERSION_MAJOR}::Core
|
||||
Qt${QT_VERSION_MAJOR}::Gui
|
||||
Qt${QT_VERSION_MAJOR}::Widgets)
|
||||
target_link_libraries(SimpleExample PUBLIC Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
set_target_properties(SimpleExample PROPERTIES
|
||||
AUTOMOC ON
|
||||
AUTORCC ON
|
||||
|
||||
@@ -135,6 +135,7 @@ protected:
|
||||
ads::CDockOverlay* dockAreaOverlay() const;
|
||||
void notifyWidgetOrAreaRelocation(QWidget* RelocatedWidget);
|
||||
void notifyFloatingWidgetDrop(ads::CFloatingDockContainer* FloatingWidget);
|
||||
ads::CDockWidget* focusedDockWidget() const;
|
||||
|
||||
virtual void showEvent(QShowEvent *event);
|
||||
|
||||
@@ -216,9 +217,6 @@ public:
|
||||
void setViewMenuInsertionOrder(ads::CDockManager::eViewMenuInsertionOrder Order);
|
||||
bool isRestoringState() const;
|
||||
static int startDragDistance();
|
||||
ads::CDockWidget* focusedDockWidget() const;
|
||||
QList<int> splitterSizes(ads::CDockAreaWidget *ContainedArea) const;
|
||||
void setSplitterSizes(ads::CDockAreaWidget *ContainedArea, const QList<int>& sizes);
|
||||
|
||||
public slots:
|
||||
void openPerspective(const QString& PerspectiveName);
|
||||
|
||||
@@ -35,8 +35,6 @@ public:
|
||||
virtual bool event(QEvent *e);
|
||||
void setElideMode(Qt::TextElideMode mode);
|
||||
void updateStyle();
|
||||
QSize iconSize() const;
|
||||
void setIconSize(const QSize& Size);
|
||||
|
||||
public slots:
|
||||
virtual void setVisible(bool visible);
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
project(QtAdvancedDockingSystem LANGUAGES CXX VERSION ${VERSION_SHORT})
|
||||
find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED)
|
||||
find_package(Qt${QT_VERSION_MAJOR} 5.5 COMPONENTS Core Gui Widgets REQUIRED)
|
||||
find_package(Qt5 5.5 COMPONENTS Core Gui Widgets REQUIRED)
|
||||
if (UNIX AND NOT APPLE)
|
||||
find_package(Qt${QT_VERSION_MAJOR} 5.5 COMPONENTS X11Extras REQUIRED)
|
||||
find_package(Qt5 5.5 COMPONENTS X11Extras REQUIRED)
|
||||
endif()
|
||||
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||
if(BUILD_STATIC)
|
||||
@@ -61,14 +60,12 @@ else()
|
||||
add_library(qtadvanceddocking SHARED ${ads_SRCS} ${ads_HEADERS})
|
||||
target_compile_definitions(qtadvanceddocking PRIVATE ADS_SHARED_EXPORT)
|
||||
endif()
|
||||
target_link_libraries(qtadvanceddocking PUBLIC Qt${QT_VERSION_MAJOR}::Core
|
||||
Qt${QT_VERSION_MAJOR}::Gui
|
||||
Qt${QT_VERSION_MAJOR}::Widgets)
|
||||
target_link_libraries(qtadvanceddocking PUBLIC Qt5::Core Qt5::Gui Qt5::Widgets)
|
||||
if(UNIX AND NOT APPLE)
|
||||
target_link_libraries(qtadvanceddocking PUBLIC Qt${QT_VERSION_MAJOR}::X11Extras)
|
||||
target_link_libraries(qtadvanceddocking PUBLIC Qt5::X11Extras)
|
||||
target_link_libraries(qtadvanceddocking PRIVATE xcb)
|
||||
endif()
|
||||
set_target_properties(qtadvanceddocking PROPERTIES
|
||||
set_target_properties(qtadvanceddocking PROPERTIES
|
||||
AUTOMOC ON
|
||||
AUTORCC ON
|
||||
CXX_STANDARD 14
|
||||
@@ -87,13 +84,13 @@ write_basic_package_version_file(
|
||||
COMPATIBILITY SameMajorVersion
|
||||
)
|
||||
install(FILES ${ads_HEADERS}
|
||||
DESTINATION include
|
||||
DESTINATION include
|
||||
COMPONENT headers
|
||||
)
|
||||
install(FILES
|
||||
install(FILES
|
||||
"${CMAKE_SOURCE_DIR}/LICENSE"
|
||||
"${CMAKE_SOURCE_DIR}/gnu-lgpl-v2.1.md"
|
||||
DESTINATION license
|
||||
DESTINATION license
|
||||
COMPONENT license
|
||||
)
|
||||
install(TARGETS qtadvanceddocking
|
||||
|
||||
@@ -180,11 +180,11 @@ void CDockAreaTabBar::setCurrentIndex(int index)
|
||||
return;
|
||||
}
|
||||
|
||||
Q_EMIT currentChanging(index);
|
||||
emit currentChanging(index);
|
||||
d->CurrentIndex = index;
|
||||
d->updateTabs();
|
||||
updateGeometry();
|
||||
Q_EMIT currentChanged(index);
|
||||
emit currentChanged(index);
|
||||
}
|
||||
|
||||
|
||||
@@ -206,7 +206,7 @@ void CDockAreaTabBar::insertTab(int Index, CDockWidgetTab* Tab)
|
||||
connect(Tab, SIGNAL(moved(const QPoint&)), this, SLOT(onTabWidgetMoved(const QPoint&)));
|
||||
connect(Tab, SIGNAL(elidedChanged(bool)), this, SIGNAL(elidedChanged(bool)));
|
||||
Tab->installEventFilter(this);
|
||||
Q_EMIT tabInserted(Index);
|
||||
emit tabInserted(Index);
|
||||
if (Index <= d->CurrentIndex)
|
||||
{
|
||||
setCurrentIndex(d->CurrentIndex + 1);
|
||||
@@ -266,7 +266,7 @@ void CDockAreaTabBar::removeTab(CDockWidgetTab* Tab)
|
||||
}
|
||||
}
|
||||
|
||||
Q_EMIT removingTab(RemoveIndex);
|
||||
emit removingTab(RemoveIndex);
|
||||
d->TabsLayout->removeWidget(Tab);
|
||||
Tab->disconnect(this);
|
||||
Tab->removeEventFilter(this);
|
||||
@@ -320,7 +320,7 @@ void CDockAreaTabBar::onTabClicked()
|
||||
return;
|
||||
}
|
||||
setCurrentIndex(index);
|
||||
Q_EMIT tabBarClicked(index);
|
||||
emit tabBarClicked(index);
|
||||
}
|
||||
|
||||
|
||||
@@ -409,7 +409,7 @@ void CDockAreaTabBar::onTabWidgetMoved(const QPoint& GlobalPos)
|
||||
d->TabsLayout->removeWidget(MovingTab);
|
||||
d->TabsLayout->insertWidget(toIndex, MovingTab);
|
||||
ADS_PRINT("tabMoved from " << fromIndex << " to " << toIndex);
|
||||
Q_EMIT tabMoved(fromIndex, toIndex);
|
||||
emit tabMoved(fromIndex, toIndex);
|
||||
setCurrentIndex(toIndex);
|
||||
}
|
||||
else
|
||||
@@ -432,7 +432,7 @@ void CDockAreaTabBar::closeTab(int Index)
|
||||
{
|
||||
return;
|
||||
}
|
||||
Q_EMIT tabCloseRequested(Index);
|
||||
emit tabCloseRequested(Index);
|
||||
}
|
||||
|
||||
|
||||
@@ -449,12 +449,12 @@ bool CDockAreaTabBar::eventFilter(QObject *watched, QEvent *event)
|
||||
switch (event->type())
|
||||
{
|
||||
case QEvent::Hide:
|
||||
Q_EMIT tabClosed(d->TabsLayout->indexOf(Tab));
|
||||
emit tabClosed(d->TabsLayout->indexOf(Tab));
|
||||
updateGeometry();
|
||||
break;
|
||||
|
||||
case QEvent::Show:
|
||||
Q_EMIT tabOpened(d->TabsLayout->indexOf(Tab));
|
||||
emit tabOpened(d->TabsLayout->indexOf(Tab));
|
||||
updateGeometry();
|
||||
break;
|
||||
|
||||
|
||||
@@ -58,7 +58,7 @@ private:
|
||||
friend struct DockAreaTabBarPrivate;
|
||||
friend class CDockAreaTitleBar;
|
||||
|
||||
private Q_SLOTS:
|
||||
private slots:
|
||||
void onTabClicked();
|
||||
void onTabCloseRequested();
|
||||
void onCloseOtherTabsRequested();
|
||||
@@ -140,7 +140,7 @@ public:
|
||||
*/
|
||||
virtual QSize sizeHint() const override;
|
||||
|
||||
public Q_SLOTS:
|
||||
public slots:
|
||||
/**
|
||||
* This property sets the index of the tab bar's visible tab
|
||||
*/
|
||||
@@ -152,7 +152,7 @@ public Q_SLOTS:
|
||||
*/
|
||||
void closeTab(int Index);
|
||||
|
||||
Q_SIGNALS:
|
||||
signals:
|
||||
/**
|
||||
* This signal is emitted when the tab bar's current tab is about to be changed. The new
|
||||
* current has the given index, or -1 if there isn't a new one.
|
||||
|
||||
@@ -382,7 +382,7 @@ void CDockAreaTitleBar::onTabsMenuActionTriggered(QAction* Action)
|
||||
{
|
||||
int Index = Action->data().toInt();
|
||||
d->TabBar->setCurrentIndex(Index);
|
||||
Q_EMIT tabBarClicked(Index);
|
||||
emit tabBarClicked(Index);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@ private:
|
||||
DockAreaTitleBarPrivate* d; ///< private data (pimpl)
|
||||
friend struct DockAreaTitleBarPrivate;
|
||||
|
||||
private Q_SLOTS:
|
||||
private slots:
|
||||
void onTabsMenuAboutToShow();
|
||||
void onCloseButtonClicked();
|
||||
void onUndockButtonClicked();
|
||||
@@ -88,7 +88,7 @@ protected:
|
||||
*/
|
||||
virtual void contextMenuEvent(QContextMenuEvent *event) override;
|
||||
|
||||
public Q_SLOTS:
|
||||
public slots:
|
||||
/**
|
||||
* Call this slot to tell the title bar that it should update the tabs menu
|
||||
* the next time it is shown.
|
||||
@@ -148,7 +148,7 @@ public:
|
||||
*/
|
||||
int indexOf(QWidget *widget) const;
|
||||
|
||||
Q_SIGNALS:
|
||||
signals:
|
||||
/**
|
||||
* This signal is emitted if a tab in the tab bar is clicked by the user
|
||||
* or if the user clicks on a tab item in the title bar tab menu.
|
||||
|
||||
@@ -378,7 +378,7 @@ CDockAreaWidget::CDockAreaWidget(CDockManager* DockManager, CDockContainerWidget
|
||||
d->ContentsLayout = new DockAreaLayout(d->Layout);
|
||||
if (d->DockManager)
|
||||
{
|
||||
Q_EMIT d->DockManager->dockAreaCreated(this);
|
||||
emit d->DockManager->dockAreaCreated(this);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -604,11 +604,11 @@ void CDockAreaWidget::setCurrentIndex(int index)
|
||||
return;
|
||||
}
|
||||
|
||||
Q_EMIT currentChanging(index);
|
||||
emit currentChanging(index);
|
||||
TabBar->setCurrentIndex(index);
|
||||
d->ContentsLayout->setCurrentIndex(index);
|
||||
d->ContentsLayout->currentWidget()->show();
|
||||
Q_EMIT currentChanged(index);
|
||||
emit currentChanged(index);
|
||||
}
|
||||
|
||||
|
||||
@@ -808,49 +808,18 @@ CDockWidget* CDockAreaWidget::nextOpenDockWidget(CDockWidget* DockWidget) const
|
||||
auto OpenDockWidgets = openedDockWidgets();
|
||||
if (OpenDockWidgets.count() > 1 || (OpenDockWidgets.count() == 1 && OpenDockWidgets[0] != DockWidget))
|
||||
{
|
||||
CDockWidget* NextDockWidget;
|
||||
if (OpenDockWidgets.last() == DockWidget)
|
||||
{
|
||||
CDockWidget* NextDockWidget = OpenDockWidgets[OpenDockWidgets.count() - 2];
|
||||
// search backwards for widget with tab
|
||||
for (int i = OpenDockWidgets.count() - 2; i >= 0; --i)
|
||||
{
|
||||
auto dw = OpenDockWidgets[i];
|
||||
if (!dw->features().testFlag(CDockWidget::NoTab))
|
||||
{
|
||||
return dw;
|
||||
}
|
||||
}
|
||||
|
||||
// return widget without tab
|
||||
return NextDockWidget;
|
||||
NextDockWidget = OpenDockWidgets[OpenDockWidgets.count() - 2];
|
||||
}
|
||||
else
|
||||
{
|
||||
int IndexOfDockWidget = OpenDockWidgets.indexOf(DockWidget);
|
||||
CDockWidget* NextDockWidget = OpenDockWidgets[IndexOfDockWidget + 1];
|
||||
// search forwards for widget with tab
|
||||
for (int i = IndexOfDockWidget + 1; i < OpenDockWidgets.count(); ++i)
|
||||
{
|
||||
auto dw = OpenDockWidgets[i];
|
||||
if (!dw->features().testFlag(CDockWidget::NoTab))
|
||||
{
|
||||
return dw;
|
||||
}
|
||||
}
|
||||
|
||||
// search backwards for widget with tab
|
||||
for (int i = IndexOfDockWidget - 1; i >= 0; --i)
|
||||
{
|
||||
auto dw = OpenDockWidgets[i];
|
||||
if (!dw->features().testFlag(CDockWidget::NoTab))
|
||||
{
|
||||
return dw;
|
||||
}
|
||||
}
|
||||
|
||||
// return widget without tab
|
||||
return NextDockWidget;
|
||||
int NextIndex = OpenDockWidgets.indexOf(DockWidget) + 1;
|
||||
NextDockWidget = OpenDockWidgets[NextIndex];
|
||||
}
|
||||
|
||||
return NextDockWidget;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -888,7 +857,7 @@ void CDockAreaWidget::toggleView(bool Open)
|
||||
{
|
||||
setVisible(Open);
|
||||
|
||||
Q_EMIT viewToggled(Open);
|
||||
emit viewToggled(Open);
|
||||
}
|
||||
|
||||
|
||||
@@ -1030,21 +999,6 @@ void CDockAreaWidget::onDockWidgetFeaturesChanged()
|
||||
}
|
||||
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
//============================================================================
|
||||
bool CDockAreaWidget::event(QEvent *e)
|
||||
{
|
||||
switch (e->type())
|
||||
{
|
||||
case QEvent::PlatformSurface: return true;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return Super::event(e);
|
||||
}
|
||||
#endif
|
||||
|
||||
} // namespace ads
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
@@ -67,7 +67,7 @@ private:
|
||||
friend class CDockManager;
|
||||
void onDockWidgetFeaturesChanged();
|
||||
|
||||
private Q_SLOTS:
|
||||
private slots:
|
||||
void onTabCloseRequested(int Index);
|
||||
|
||||
/**
|
||||
@@ -77,17 +77,6 @@ private Q_SLOTS:
|
||||
void reorderDockWidget(int fromIndex, int toIndex);
|
||||
|
||||
protected:
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
/**
|
||||
* Reimplements QWidget::event to handle QEvent::PlatformSurface
|
||||
* This is here to fix issue #294 Tab refresh problem with a QGLWidget
|
||||
* that exists since Qt version 5.12.7. So this function is here to
|
||||
* work around a Qt issue.
|
||||
*/
|
||||
virtual bool event(QEvent *event) override;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Inserts a dock widget into dock area.
|
||||
* All dockwidgets in the dock area tabified in a stacked layout with tabs.
|
||||
@@ -149,7 +138,7 @@ protected:
|
||||
*/
|
||||
void markTitleBarMenuOutdated();
|
||||
|
||||
protected Q_SLOTS:
|
||||
protected slots:
|
||||
void toggleView(bool Open);
|
||||
|
||||
public:
|
||||
@@ -323,7 +312,7 @@ public:
|
||||
*/
|
||||
bool isCentralWidgetArea() const;
|
||||
|
||||
public Q_SLOTS:
|
||||
public slots:
|
||||
/**
|
||||
* This activates the tab for the given tab index.
|
||||
* If the dock widget for the given tab is not visible, the this function
|
||||
@@ -341,7 +330,7 @@ public Q_SLOTS:
|
||||
*/
|
||||
void closeOtherAreas();
|
||||
|
||||
Q_SIGNALS:
|
||||
signals:
|
||||
/**
|
||||
* This signal is emitted when user clicks on a tab at an index.
|
||||
*/
|
||||
|
||||
@@ -284,13 +284,13 @@ public:
|
||||
void emitDockAreasRemoved()
|
||||
{
|
||||
onVisibleDockAreaCountChanged();
|
||||
Q_EMIT _this->dockAreasRemoved();
|
||||
emit _this->dockAreasRemoved();
|
||||
}
|
||||
|
||||
void emitDockAreasAdded()
|
||||
{
|
||||
onVisibleDockAreaCountChanged();
|
||||
Q_EMIT _this->dockAreasAdded();
|
||||
emit _this->dockAreasAdded();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -341,7 +341,7 @@ public:
|
||||
CDockAreaWidget* DockArea = qobject_cast<CDockAreaWidget*>(_this->sender());
|
||||
VisibleDockAreaCount += Visible ? 1 : -1;
|
||||
onVisibleDockAreaCountChanged();
|
||||
Q_EMIT _this->dockAreaViewToggled(DockArea, Visible);
|
||||
emit _this->dockAreaViewToggled(DockArea, Visible);
|
||||
}
|
||||
}; // struct DockContainerWidgetPrivate
|
||||
|
||||
|
||||
@@ -265,7 +265,7 @@ public:
|
||||
*/
|
||||
void closeOtherAreas(CDockAreaWidget* KeepOpenArea);
|
||||
|
||||
Q_SIGNALS:
|
||||
signals:
|
||||
/**
|
||||
* This signal is emitted if one or multiple dock areas has been added to
|
||||
* the internal list of dock areas.
|
||||
|
||||
@@ -174,7 +174,7 @@ void DockFocusControllerPrivate::updateDockWidgetFocus(CDockWidget* DockWidget)
|
||||
ForceFocusChangedSignal = false;
|
||||
if (DockWidget->isVisible())
|
||||
{
|
||||
Q_EMIT DockManager->focusedDockWidgetChanged(old, DockWidget);
|
||||
emit DockManager->focusedDockWidgetChanged(old, DockWidget);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -193,7 +193,7 @@ void CDockFocusController::onDockWidgetVisibilityChanged(bool Visible)
|
||||
disconnect(Sender, SIGNAL(visibilityChanged(bool)), this, SLOT(onDockWidgetVisibilityChanged(bool)));
|
||||
if (DockWidget && Visible)
|
||||
{
|
||||
Q_EMIT d->DockManager->focusedDockWidgetChanged(d->OldFocusedDockWidget, DockWidget);
|
||||
emit d->DockManager->focusedDockWidgetChanged(d->OldFocusedDockWidget, DockWidget);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ private:
|
||||
DockFocusControllerPrivate* d; ///< private data (pimpl)
|
||||
friend struct DockFocusControllerPrivate;
|
||||
|
||||
private Q_SLOTS:
|
||||
private slots:
|
||||
void onApplicationFocusChanged(QWidget *old, QWidget *now);
|
||||
void onFocusedDockAreaViewToggled(bool Open);
|
||||
void onStateRestored();
|
||||
@@ -83,7 +83,7 @@ public:
|
||||
*/
|
||||
CDockWidget* focusedDockWidget() const;
|
||||
|
||||
public Q_SLOTS:
|
||||
public slots:
|
||||
/**
|
||||
* Request a focus change to the given dock widget
|
||||
*/
|
||||
|
||||
@@ -343,7 +343,7 @@ void DockManagerPrivate::restoreDockWidgetsOpenState()
|
||||
if (DockWidget->property(internal::DirtyProperty).toBool())
|
||||
{
|
||||
DockWidget->flagAsUnassigned();
|
||||
Q_EMIT DockWidget->viewToggled(false);
|
||||
emit DockWidget->viewToggled(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -505,20 +505,6 @@ CDockManager::CDockManager(QWidget *parent) :
|
||||
//============================================================================
|
||||
CDockManager::~CDockManager()
|
||||
{
|
||||
// fix memory leaks, see https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/issues/307
|
||||
std::vector<ads::CDockAreaWidget*> areas;
|
||||
for ( int i = 0; i != dockAreaCount(); ++i )
|
||||
{
|
||||
areas.push_back( dockArea(i) );
|
||||
}
|
||||
for ( auto area : areas )
|
||||
{
|
||||
for ( auto widget : area->dockWidgets() )
|
||||
delete widget;
|
||||
|
||||
delete area;
|
||||
}
|
||||
|
||||
auto FloatingWidgets = d->FloatingWidgets;
|
||||
for (auto FloatingWidget : FloatingWidgets)
|
||||
{
|
||||
@@ -596,7 +582,7 @@ bool CDockManager::eventFilter(QObject *obj, QEvent *e)
|
||||
void CDockManager::registerFloatingWidget(CFloatingDockContainer* FloatingWidget)
|
||||
{
|
||||
d->FloatingWidgets.append(FloatingWidget);
|
||||
Q_EMIT floatingWidgetCreated(FloatingWidget);
|
||||
emit floatingWidgetCreated(FloatingWidget);
|
||||
ADS_PRINT("d->FloatingWidgets.count() " << d->FloatingWidgets.count());
|
||||
}
|
||||
|
||||
@@ -713,14 +699,14 @@ bool CDockManager::restoreState(const QByteArray &state, int version)
|
||||
hide();
|
||||
}
|
||||
d->RestoringState = true;
|
||||
Q_EMIT restoringState();
|
||||
emit restoringState();
|
||||
bool Result = d->restoreState(state, version);
|
||||
d->RestoringState = false;
|
||||
if (!IsHidden)
|
||||
{
|
||||
show();
|
||||
}
|
||||
Q_EMIT stateRestored();
|
||||
emit stateRestored();
|
||||
return Result;
|
||||
}
|
||||
|
||||
@@ -746,7 +732,7 @@ CFloatingDockContainer* CDockManager::addDockWidgetFloating(CDockWidget* Dockwid
|
||||
{
|
||||
d->UninitializedFloatingWidgets.append(FloatingWidget);
|
||||
}
|
||||
Q_EMIT dockWidgetAdded(Dockwidget);
|
||||
emit dockWidgetAdded(Dockwidget);
|
||||
return FloatingWidget;
|
||||
}
|
||||
|
||||
@@ -775,7 +761,7 @@ CDockAreaWidget* CDockManager::addDockWidget(DockWidgetArea area,
|
||||
d->DockWidgetsMap.insert(Dockwidget->objectName(), Dockwidget);
|
||||
auto Container = DockAreaWidget ? DockAreaWidget->dockContainer(): this;
|
||||
auto AreaOfAddedDockWidget = Container->addDockWidget(area, Dockwidget, DockAreaWidget);
|
||||
Q_EMIT dockWidgetAdded(Dockwidget);
|
||||
emit dockWidgetAdded(Dockwidget);
|
||||
return AreaOfAddedDockWidget;
|
||||
}
|
||||
|
||||
@@ -817,11 +803,11 @@ CDockWidget* CDockManager::findDockWidget(const QString& ObjectName) const
|
||||
//============================================================================
|
||||
void CDockManager::removeDockWidget(CDockWidget* Dockwidget)
|
||||
{
|
||||
Q_EMIT dockWidgetAboutToBeRemoved(Dockwidget);
|
||||
emit dockWidgetAboutToBeRemoved(Dockwidget);
|
||||
d->DockWidgetsMap.remove(Dockwidget->objectName());
|
||||
CDockContainerWidget::removeDockWidget(Dockwidget);
|
||||
Dockwidget->setDockManager(nullptr);
|
||||
Q_EMIT dockWidgetRemoved(Dockwidget);
|
||||
emit dockWidgetRemoved(Dockwidget);
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
@@ -835,7 +821,7 @@ QMap<QString, CDockWidget*> CDockManager::dockWidgetsMap() const
|
||||
void CDockManager::addPerspective(const QString& UniquePrespectiveName)
|
||||
{
|
||||
d->Perspectives.insert(UniquePrespectiveName, saveState());
|
||||
Q_EMIT perspectiveListChanged();
|
||||
emit perspectiveListChanged();
|
||||
}
|
||||
|
||||
|
||||
@@ -857,8 +843,8 @@ void CDockManager::removePerspectives(const QStringList& Names)
|
||||
|
||||
if (Count)
|
||||
{
|
||||
Q_EMIT perspectivesRemoved();
|
||||
Q_EMIT perspectiveListChanged();
|
||||
emit perspectivesRemoved();
|
||||
emit perspectiveListChanged();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -879,9 +865,9 @@ void CDockManager::openPerspective(const QString& PerspectiveName)
|
||||
return;
|
||||
}
|
||||
|
||||
Q_EMIT openingPerspective(PerspectiveName);
|
||||
emit openingPerspective(PerspectiveName);
|
||||
restoreState(Iterator.value());
|
||||
Q_EMIT perspectiveOpened(PerspectiveName);
|
||||
emit perspectiveOpened(PerspectiveName);
|
||||
}
|
||||
|
||||
|
||||
@@ -926,8 +912,6 @@ void CDockManager::loadPerspectives(QSettings& Settings)
|
||||
}
|
||||
|
||||
Settings.endArray();
|
||||
Q_EMIT perspectiveListChanged();
|
||||
Q_EMIT perspectiveListLoaded();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -506,7 +506,7 @@ public:
|
||||
*/
|
||||
void setSplitterSizes(CDockAreaWidget *ContainedArea, const QList<int>& sizes);
|
||||
|
||||
public Q_SLOTS:
|
||||
public slots:
|
||||
/**
|
||||
* Opens the perspective with the given name.
|
||||
*/
|
||||
@@ -519,19 +519,12 @@ public Q_SLOTS:
|
||||
*/
|
||||
void setDockWidgetFocused(CDockWidget* DockWidget);
|
||||
|
||||
Q_SIGNALS:
|
||||
signals:
|
||||
/**
|
||||
* This signal is emitted if the list of perspectives changed.
|
||||
* The list of perspectives changes if perspectives are added, removed
|
||||
* or if the perspective list has been loaded
|
||||
* This signal is emitted if the list of perspectives changed
|
||||
*/
|
||||
void perspectiveListChanged();
|
||||
|
||||
/**
|
||||
* This signal is emitted if the perspective list has been loaded
|
||||
*/
|
||||
void perspectiveListLoaded();
|
||||
|
||||
/**
|
||||
* This signal is emitted if perspectives have been removed
|
||||
*/
|
||||
|
||||
@@ -338,7 +338,7 @@ void CDockWidget::setFeatures(DockWidgetFeatures features)
|
||||
return;
|
||||
}
|
||||
d->Features = features;
|
||||
Q_EMIT featuresChanged(d->Features);
|
||||
emit featuresChanged(d->Features);
|
||||
d->TabWidget->onDockWidgetFeaturesChanged();
|
||||
if(CDockAreaWidget* DockArea = dockAreaWidget())
|
||||
DockArea->onDockWidgetFeaturesChanged();
|
||||
@@ -538,9 +538,9 @@ void CDockWidget::toggleViewInternal(bool Open)
|
||||
|
||||
if (!Open)
|
||||
{
|
||||
Q_EMIT closed();
|
||||
emit closed();
|
||||
}
|
||||
Q_EMIT viewToggled(Open);
|
||||
emit viewToggled(Open);
|
||||
}
|
||||
|
||||
|
||||
@@ -580,11 +580,11 @@ bool CDockWidget::event(QEvent *e)
|
||||
switch (e->type())
|
||||
{
|
||||
case QEvent::Hide:
|
||||
Q_EMIT visibilityChanged(false);
|
||||
emit visibilityChanged(false);
|
||||
break;
|
||||
|
||||
case QEvent::Show:
|
||||
Q_EMIT visibilityChanged(geometry().right() >= 0 && geometry().bottom() >= 0);
|
||||
emit visibilityChanged(geometry().right() >= 0 && geometry().bottom() >= 0);
|
||||
break;
|
||||
|
||||
case QEvent::WindowTitleChange :
|
||||
@@ -602,7 +602,7 @@ bool CDockWidget::event(QEvent *e)
|
||||
{
|
||||
d->DockArea->markTitleBarMenuOutdated();//update tabs menu
|
||||
}
|
||||
Q_EMIT titleChanged(title);
|
||||
emit titleChanged(title);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -785,7 +785,7 @@ void CDockWidget::emitTopLevelChanged(bool Floating)
|
||||
if (Floating != d->IsFloatingTopLevel)
|
||||
{
|
||||
d->IsFloatingTopLevel = Floating;
|
||||
Q_EMIT topLevelChanged(d->IsFloatingTopLevel);
|
||||
emit topLevelChanged(d->IsFloatingTopLevel);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -843,7 +843,7 @@ bool CDockWidget::closeDockWidgetInternal(bool ForceClose)
|
||||
{
|
||||
if (!ForceClose)
|
||||
{
|
||||
Q_EMIT closeRequested();
|
||||
emit closeRequested();
|
||||
}
|
||||
|
||||
if (!ForceClose && features().testFlag(CDockWidget::CustomCloseHandling))
|
||||
@@ -869,7 +869,7 @@ bool CDockWidget::closeDockWidgetInternal(bool ForceClose)
|
||||
}
|
||||
}
|
||||
deleteDockWidget();
|
||||
Q_EMIT closed();
|
||||
emit closed();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -58,7 +58,7 @@ private:
|
||||
DockWidgetPrivate* d; ///< private data (pimpl)
|
||||
friend struct DockWidgetPrivate;
|
||||
|
||||
private Q_SLOTS:
|
||||
private slots:
|
||||
/**
|
||||
* Adjusts the toolbar icon sizes according to the floating state
|
||||
*/
|
||||
@@ -154,7 +154,6 @@ public:
|
||||
CustomCloseHandling = 0x10, ///< clicking the close button will not close the dock widget but emits the closeRequested() signal instead
|
||||
DockWidgetFocusable = 0x20, ///< if this is enabled, a dock widget can get focus highlighting
|
||||
DockWidgetForceCloseWithArea = 0x40, ///< dock widget will be closed when the dock area hosting it is closed
|
||||
NoTab = 0x80, ///< dock widget tab will never be shown if this flag is set
|
||||
DefaultDockWidgetFeatures = DockWidgetClosable | DockWidgetMovable | DockWidgetFloatable | DockWidgetFocusable,
|
||||
AllDockWidgetFeatures = DefaultDockWidgetFeatures | DockWidgetDeleteOnClose | CustomCloseHandling,
|
||||
DockWidgetAlwaysCloseAndDelete = DockWidgetForceCloseWithArea | DockWidgetDeleteOnClose,
|
||||
@@ -484,7 +483,7 @@ public: // reimplements QFrame -----------------------------------------------
|
||||
*/
|
||||
virtual bool event(QEvent *e) override;
|
||||
|
||||
public Q_SLOTS:
|
||||
public slots:
|
||||
/**
|
||||
* This property controls whether the dock widget is open or closed.
|
||||
* The toogleViewAction triggers this slot
|
||||
@@ -545,7 +544,7 @@ public Q_SLOTS:
|
||||
void showNormal();
|
||||
|
||||
|
||||
Q_SIGNALS:
|
||||
signals:
|
||||
/**
|
||||
* This signal is emitted if the dock widget is opened or closed
|
||||
*/
|
||||
|
||||
@@ -353,7 +353,7 @@ void CDockWidgetTab::mousePressEvent(QMouseEvent* ev)
|
||||
ev->accept();
|
||||
d->saveDragStartMousePosition(internal::globalPositionOf(ev));
|
||||
d->DragState = DraggingMousePressed;
|
||||
Q_EMIT clicked();
|
||||
emit clicked();
|
||||
return;
|
||||
}
|
||||
Super::mousePressEvent(ev);
|
||||
@@ -377,7 +377,7 @@ void CDockWidgetTab::mouseReleaseEvent(QMouseEvent* ev)
|
||||
// End of tab moving, emit signal
|
||||
if (d->DockArea)
|
||||
{
|
||||
Q_EMIT moved(internal::globalPositionOf(ev));
|
||||
emit moved(internal::globalPositionOf(ev));
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -538,7 +538,7 @@ void CDockWidgetTab::setActiveTab(bool active)
|
||||
update();
|
||||
updateGeometry();
|
||||
|
||||
Q_EMIT activeTabChanged();
|
||||
emit activeTabChanged();
|
||||
}
|
||||
|
||||
|
||||
@@ -629,7 +629,7 @@ void CDockWidgetTab::mouseDoubleClickEvent(QMouseEvent *event)
|
||||
//============================================================================
|
||||
void CDockWidgetTab::setVisible(bool visible)
|
||||
{
|
||||
visible &= !d->DockWidget->features().testFlag(CDockWidget::NoTab);
|
||||
// Just here for debugging to insert debug output
|
||||
Super::setVisible(visible);
|
||||
}
|
||||
|
||||
@@ -677,9 +677,6 @@ bool CDockWidgetTab::event(QEvent *e)
|
||||
{
|
||||
const auto text = toolTip();
|
||||
d->TitleLabel->setToolTip(text);
|
||||
if (d->IconLabel) {
|
||||
d->IconLabel->setToolTip(text);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return Super::event(e);
|
||||
|
||||
@@ -60,7 +60,7 @@ private:
|
||||
friend class CDockManager;
|
||||
void onDockWidgetFeaturesChanged();
|
||||
|
||||
private Q_SLOTS:
|
||||
private slots:
|
||||
void detachDockWidget();
|
||||
|
||||
protected:
|
||||
@@ -175,10 +175,10 @@ public:
|
||||
*/
|
||||
void setIconSize(const QSize& Size);
|
||||
|
||||
public Q_SLOTS:
|
||||
public slots:
|
||||
virtual void setVisible(bool visible) override;
|
||||
|
||||
Q_SIGNALS:
|
||||
signals:
|
||||
void activeTabChanged();
|
||||
void clicked();
|
||||
void closeRequested();
|
||||
|
||||
@@ -74,7 +74,7 @@ void ElidingLabelPrivate::elideText(int Width)
|
||||
IsElided = str != Text;
|
||||
if(IsElided != WasElided)
|
||||
{
|
||||
Q_EMIT _this->elidedChanged(IsElided);
|
||||
emit _this->elidedChanged(IsElided);
|
||||
}
|
||||
_this->QLabel::setText(str);
|
||||
}
|
||||
@@ -136,7 +136,7 @@ void CElidingLabel::mouseReleaseEvent(QMouseEvent* event)
|
||||
return;
|
||||
}
|
||||
|
||||
Q_EMIT clicked();
|
||||
emit clicked();
|
||||
}
|
||||
|
||||
|
||||
@@ -144,7 +144,7 @@ void CElidingLabel::mouseReleaseEvent(QMouseEvent* event)
|
||||
void CElidingLabel::mouseDoubleClickEvent( QMouseEvent *ev )
|
||||
{
|
||||
Q_UNUSED(ev)
|
||||
Q_EMIT doubleClicked();
|
||||
emit doubleClicked();
|
||||
Super::mouseDoubleClickEvent(ev);
|
||||
}
|
||||
|
||||
|
||||
@@ -84,7 +84,7 @@ public: // reimplements QLabel ----------------------------------------------
|
||||
void setText(const QString &text);
|
||||
QString text() const;
|
||||
|
||||
Q_SIGNALS:
|
||||
signals:
|
||||
/**
|
||||
* This signal is emitted if the user clicks on the label (i.e. pressed
|
||||
* down then released while the mouse cursor is inside the label)
|
||||
|
||||
@@ -609,8 +609,7 @@ CFloatingDockContainer::CFloatingDockContainer(CDockManager *DockManager) :
|
||||
#ifdef Q_OS_LINUX
|
||||
QDockWidget::setWidget(d->DockContainer);
|
||||
QDockWidget::setFloating(true);
|
||||
QDockWidget::setFeatures(QDockWidget::DockWidgetClosable
|
||||
| QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetFloatable);
|
||||
QDockWidget::setFeatures(QDockWidget::AllDockWidgetFeatures);
|
||||
|
||||
bool native_window = true;
|
||||
|
||||
|
||||
@@ -118,7 +118,7 @@ private:
|
||||
friend class CDockAreaWidget;
|
||||
friend class CFloatingWidgetTitleBar;
|
||||
|
||||
private Q_SLOTS:
|
||||
private slots:
|
||||
void onDockAreasAddedOrRemoved();
|
||||
void onDockAreaCurrentChanged(int Index);
|
||||
|
||||
|
||||
@@ -60,7 +60,7 @@ struct FloatingDragPreviewPrivate
|
||||
void cancelDragging()
|
||||
{
|
||||
Canceled = true;
|
||||
Q_EMIT _this->draggingCanceled();
|
||||
emit _this->draggingCanceled();
|
||||
DockManager->containerOverlay()->hideOverlay();
|
||||
DockManager->dockAreaOverlay()->hideOverlay();
|
||||
_this->close();
|
||||
|
||||
@@ -32,7 +32,7 @@ private:
|
||||
FloatingDragPreviewPrivate* d;
|
||||
friend struct FloatingDragPreviewPrivate;
|
||||
|
||||
private Q_SLOTS:
|
||||
private slots:
|
||||
/**
|
||||
* Cancel non opaque undocking if application becomes inactive
|
||||
*/
|
||||
@@ -92,7 +92,7 @@ public: // implements IFloatingWidget -----------------------------------------
|
||||
*/
|
||||
virtual void finishDragging() override;
|
||||
|
||||
Q_SIGNALS:
|
||||
signals:
|
||||
/**
|
||||
* This signal is emitted, if dragging has been canceled by escape key
|
||||
* or by active application switching via task manager
|
||||
|
||||
Reference in New Issue
Block a user