Compare commits

...

41 Commits

Author SHA1 Message Date
ff4d97d5ac Make adaptions for LabMCT under v1.7 2023-06-19 13:10:51 +02:00
Sergio Martins
59a81fbe62 Fix another mistake checking for Config::Flag_AutoHideSupport 2023-05-16 10:01:41 +01:00
Sergio Martins
0fe194769d Update Changelog 2023-05-16 09:40:41 +01:00
Sergio Martins
5861607df1 Fix "pin" button appearing when using Flag_TitleBarNoFloatButton
Fixes issue #359
2023-05-16 09:37:46 +01:00
Allen Winter
e7c9a20752 python/CMakeLists.txt - improve PYTHON_BINDINGS_INSTALL_PREFIX
If `cmake --install. --prefix=/some/path` is specified that
install prefix is taken into account for the bindings too.

Also, on Windows, don't install under a 'pythonX.Y' hierarchy.

fixes: #361
2023-05-15 12:16:52 -04:00
Allen Winter
dba4d649ed README-bindings.md - talk about Python3_EXECUTABLE 2023-05-15 08:56:10 -04:00
Allen Winter
ede69197ed This is v1.7.1 now 2023-05-03 16:07:36 -04:00
Allen Winter
70fd6f0770 Prep for release 1.7.0 2023-05-03 15:38:49 -04:00
Sergio Martins
c91c28748e Fix a detachment found by clazy 2023-05-03 20:38:33 +01:00
Renato Araujo Oliveira Filho
1275327163 More fixes for MacOS build 2023-05-02 21:26:39 +01:00
Renato Araujo Oliveira Filho
c3751142c0 Fix MacOs build
Avoid use empty path for custom dir
2023-05-02 19:37:27 +01:00
Allen Winter
c603593552 cmake/KDAB - sync to upstream 2023-05-02 11:10:53 -04:00
Kevin Funk
ac6ed8e929 cmake: Minor: Use CONFIG mode where applicable 2023-04-06 12:12:29 +02:00
Allen Winter
4f7175c446 .reuse/dep5 - add vscode.code-workspace 2023-03-25 21:28:05 -04:00
Sergio Martins
832736c1e5 Rename code.dev-qtwidgets.code-workspace to vscode.code-workspace 2023-03-25 13:00:14 +00:00
Sergio Martins
c5cbe4064a tests: Remove tests_launcher
It was a way to speed up test execution, but at the expense of
being weird and non-standard. It would block tst_docks from appearing
as qttest with children, as tst_docks wasn't passed to add_test.

Solution will be to instead split tst_docks into smaller executables,
which was done in 2.0 branch already.
2023-03-25 12:54:15 +00:00
Sergio Martins
68b7c0b1a9 tests: Remove old fuzzer
Not worth maintaining, as the layouting code is mature now.
Was useful when we had flaky code for layouting, but that has since
been rewritten.

Reducing maintenance burden.
2023-03-25 12:48:52 +00:00
Sergio Martins
285574205c README-QtQuick: Redirect to 2.0 branch
QtQuick in 1.7 isn't receiving any new features or fixes
2023-03-25 12:34:17 +00:00
Allen Winter
dbf96091f8 .pre-commit-config.yaml - autoupdate 2023-03-25 08:11:25 -04:00
Allen Winter
9c03da23a6 python/examples - autopep8 2023-03-25 08:08:12 -04:00
Allen Winter
ea08429b23 src/DockWidgetBase.h - codespell 2023-03-25 08:05:38 -04:00
Allen Winter
ad1a2df8af README-QtQuick.md - markdownlint fix for long lines 2023-03-25 08:04:31 -04:00
Sergio Martins
af3fd6b296 vscode: Use "current" debug targets
(amends previous commit, forgot to save)
2023-03-25 11:21:42 +00:00
Sergio Martins
ae461f947f vscode: Use "current" debug targets
This allows to remove hardcoded build directories and remove the
Qt6 workspace file.
2023-03-24 20:25:37 +00:00
Sergio Martins
f24a04252b Add a prophylactic against a crash
Crash seen in the wild. Can't reproduce, but could happen if the deletion
was triggered by some external event during a drag.

We're using a QPointer already, so it even makes sense.
2023-03-17 10:58:22 +00:00
Sergio Martins
dd9837c3f1 Fix assert when saving mdi layout
Since the layout is nested, we need to look further for the main window.

I don't know however if restoring layouts even works with MDI.
Needs to be tested and implemented.
2023-03-14 23:10:14 +00:00
Sergio Martins
b6beb3d244 Add test for #352
Commented out, since we can't use an XFAIL, as it crashes
2023-03-14 23:00:54 +00:00
Sergio Martins
1a46823b03 Don't crash when using LayoutSaver with MDI
It's not supported but it shouldn't crash.
For #352, leaving it open still, as the reporter actually experiences
an assert, not a segfault. To be investigated further
2023-03-14 22:54:46 +00:00
Sergio Martins
4d50376ccf Fix reading floating window flags from >=1.6 layouts
1.7 introduced per-floating-window "flags" in the saved layouts. When
that value is not present in the saved layout, we need to fallback from
reading from Config global settings
2023-03-10 17:16:10 +00:00
Sergio Martins
59f7280d59 Add test for loading flags from layouts from 1.6
1.7 now has flags per floating window. When loading a layout from
1.6 we need however to fallback to the global Config::flags()
2023-03-10 17:10:37 +00:00
Sergio Martins
683dd68754 Update Changelog
Lot's of stuff was missing
2023-03-08 22:33:21 +00:00
Sergio Martins
1b33da8b44 Windows: Don't resize diagonally when at least 1 dimension is fixed
If width is fixed and height is not, then when using the corner resize
only width can be changed (and same for fixed height).

Fixes #345
2023-03-06 19:56:21 +00:00
Sergio Martins
f6d9ac5606 debug: Allow to print flags
For issue #345
2023-03-03 16:17:29 +00:00
Sergio Martins
f08d39ecc8 Fix clazy warning about returning false in event filter
Use the base class instead
2023-02-28 12:34:10 +00:00
Sergio Martins
ee5e004ed2 Fix some icons not appearing in title bar
Looks like QIcon was being added into the cache after it was already
moved from.
2023-02-27 22:50:25 +00:00
Sergio Martins
c744291d33 README: Explain that QtQuick does not work on EGLFS
For issue #342
2023-02-15 13:05:31 +00:00
Allen Winter
a6e0de9db9 .pre-commit-config.yaml - disable pylint on precommit.ci 2023-02-10 10:38:42 -05:00
Milian Wolff
0ad83ea1b4 Allow restoring layouts without touching floating dock widgets
The current behavior is great for when we want to apply an older
stored state to a different screen configuration. There,
scaling/shrinking the floating docks makes sense.

But we now also want to have more fine grained window
configurations and save/restore them more frequently. In those
situations, the screen config is the same, but the mainwindow may
or may not be full screen when the state was saved. In this case
we don't want to touch the size of the floating docks - most notably
we don't want to resize a "nearly fullscreen" floating window from
a state with a small main window when loading it into a state with
a fullscreen mainwindow - in such situations the floating window would
get resized beyond the available screen space!

Preventing the latter is probably required as a safety measure
independently of this patch, for situations where the relative
resizing is desired. This is outside the scope of this patch.
2023-02-10 15:13:09 +00:00
Sergio Martins
fdcdaae1f1 Fix build with C++11
initialized lambda captures is a C++14 extension
2023-02-10 14:53:42 +00:00
Sergio Martins
af455bb37e examples: Show how to hide dock indicators when ctrl is pressed
Fixes issue #334 and issue #337.
Won't add this directly into the library, as each project
has different requirements regarding this.

It's easy to do in application code though.
2023-02-07 23:51:20 +00:00
Sergio Martins
57aded2a67 Fix setDropIndicatorsInhibited(false) not showing drop indicators
It required the user to move the mouse, which was OK but we can do
better.

Now, KDDW will automaticallt re-show the drop indicators if we're in
the middle of a drag operation.

Required for issue #334 and issue #337
2023-02-07 21:58:37 +00:00
83 changed files with 662 additions and 12251 deletions

View File

@@ -1,9 +1,13 @@
# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
ci:
skip: [pylint]
autoupdate_schedule: monthly
exclude: ^(cmake/ECM|cmake/KDAB/)
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.3.0
rev: v4.4.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
@@ -18,17 +22,17 @@ repos:
- id: clang-format
exclude: (.json)
- repo: https://github.com/PyCQA/pylint
rev: v2.15.5
rev: v2.17.1
hooks:
- id: pylint
exclude: ^(.cmake-format.py|conan/conanfile.py)
additional_dependencies: ["PySide2", "PySide6"]
- repo: https://github.com/pre-commit/mirrors-autopep8
rev: v1.7.0
rev: v2.0.2
hooks:
- id: autopep8
- repo: https://github.com/codespell-project/codespell
rev: v2.2.2
rev: v2.2.4
hooks:
- id: codespell
- repo: https://github.com/cheshirekow/cmake-format-precommit
@@ -46,6 +50,6 @@ repos:
language: ruby
files: \.(md|mdown|markdown)$
- repo: https://github.com/fsfe/reuse-tool
rev: v1.0.0
rev: v1.1.2
hooks:
- id: reuse

View File

@@ -14,7 +14,7 @@ Copyright: 2019-2023 Klarälvdalens Datakonsult AB, a KDAB Group company <info@k
License: GPL-2.0-only OR GPL-3.0-only
#misc config files
Files: .pre-commit-config.yaml .codespellrc .krazy .cmake-format .clang-format .clazy .gitignore .mdlrc .mdlrc.rb .pep8 .pylintrc appveyor.yml code.dev-*.code-workspace docs/api/Doxyfile.cmake distro/*
Files: .pre-commit-config.yaml .codespellrc .krazy .cmake-format .clang-format .clazy .gitignore .mdlrc .mdlrc.rb .pep8 .pylintrc appveyor.yml code.dev-*.code-workspace vscode.code-workspace docs/api/Doxyfile.cmake distro/*
Copyright: 2019-2023 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
License: BSD-3-Clause

View File

@@ -63,11 +63,6 @@
# Build the layout linter.
# Ignored unless KDDockWidgets_DEVELOPER_MODE=True
# Default=true
#
# -DKDDockWidgets_FUZZER=[true|false]
# Build the fuzzer.
# Ignored unless KDDockWidgets_DEVELOPER_MODE=True
# Default=true
cmake_minimum_required(VERSION 3.12)
@@ -93,8 +88,8 @@ project(
)
set(${PROJECT_NAME}_VERSION_MAJOR 1)
set(${PROJECT_NAME}_VERSION_MINOR 6)
set(${PROJECT_NAME}_VERSION_PATCH 95)
set(${PROJECT_NAME}_VERSION_MINOR 7)
set(${PROJECT_NAME}_VERSION_PATCH 1)
set(${PROJECT_NAME}_VERSION
${${PROJECT_NAME}_VERSION_MAJOR}.${${PROJECT_NAME}_VERSION_MINOR}.${${PROJECT_NAME}_VERSION_PATCH}
)
@@ -103,18 +98,18 @@ set(${PROJECT_NAME}_SOVERSION "1.7")
include(FeatureSummary)
option(${PROJECT_NAME}_QT6 "Build against Qt 6" OFF)
option(${PROJECT_NAME}_QT6 "Build against Qt 6" ON)
option(${PROJECT_NAME}_DEVELOPER_MODE "Developer Mode" OFF)
option(${PROJECT_NAME}_PYTHON_BINDINGS "Build python bindings" OFF)
option(${PROJECT_NAME}_QTQUICK "Build for QtQuick instead of QtWidgets" OFF)
option(${PROJECT_NAME}_STATIC "Build statically" OFF)
option(${PROJECT_NAME}_TESTS "Build the tests" OFF)
option(${PROJECT_NAME}_EXAMPLES "Build the examples" ON)
option(${PROJECT_NAME}_EXAMPLES "Build the examples" OFF)
option(${PROJECT_NAME}_DOCS "Build the API documentation" OFF)
option(${PROJECT_NAME}_WERROR "Use -Werror (will be true for developer-mode unconditionally)" OFF)
option(${PROJECT_NAME}_X11EXTRAS
"Link with QtX11Extras to detect if the compositor supports transparency. Not applicable to non-Linux or Qt6."
ON
OFF
)
option(${PROJECT_NAME}_XLib "On Linux, link against XLib, for a more robust window z-order detection." OFF)
@@ -353,29 +348,7 @@ if(${PROJECT_NAME}_TESTS)
if(${PROJECT_NAME}_DEVELOPER_MODE)
add_subdirectory(tests)
# tst_docks.exe is pretty big (160 tests), so split it in more runs so we can use threads.
add_test(NAME tst_docks0 COMMAND tests_launcher 0 5)
add_test(NAME tst_docks1 COMMAND tests_launcher 1 5)
add_test(NAME tst_docks2 COMMAND tests_launcher 2 5)
add_test(NAME tst_docks3 COMMAND tests_launcher 3 5)
add_test(NAME tst_docks4 COMMAND tests_launcher 4 5)
add_test(NAME tst_docks5 COMMAND tests_launcher 5 5)
add_test(NAME tst_docks6 COMMAND tests_launcher 6 5)
add_test(NAME tst_docks7 COMMAND tests_launcher 7 5)
add_test(NAME tst_docks8 COMMAND tests_launcher 8 5)
add_test(NAME tst_docks9 COMMAND tests_launcher 9 5)
add_test(NAME tst_docks10 COMMAND tests_launcher 10 5)
add_test(NAME tst_docks11 COMMAND tests_launcher 10 5)
add_test(NAME tst_docks12 COMMAND tests_launcher 11 5)
add_test(NAME tst_docks13 COMMAND tests_launcher 12 5)
add_test(NAME tst_docks14 COMMAND tests_launcher 13 5)
add_test(NAME tst_docks15 COMMAND tests_launcher 14 5)
add_test(NAME tst_docks16 COMMAND tests_launcher 15 5)
add_test(NAME tst_docks17 COMMAND tests_launcher 16 5)
add_test(NAME tst_docks18 COMMAND tests_launcher 17 5)
add_test(NAME tst_docks19 COMMAND tests_launcher 18 5)
add_test(NAME tst_docks20 COMMAND tests_launcher 19 5)
add_test(NAME tst_docks21 COMMAND tests_launcher 20 5) # one more for rounding leftovers
add_test(NAME tst_docks COMMAND tst_docks)
if(NOT ${PROJECT_NAME}_QTQUICK)
# tst_multisplitter depends on QWidget

View File

@@ -9,11 +9,10 @@
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"KDDockWidgets_DEVELOPER_MODE": "ON",
"CMAKE_EXPORT_COMPILE_COMMANDS" : "ON",
"KDDockWidgets_FUZZER" : "OFF"
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON"
},
"warnings" : {
"uninitialized" : true
"warnings": {
"uninitialized": true
}
},
{
@@ -25,12 +24,11 @@
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"KDDockWidgets_DEVELOPER_MODE": "ON",
"CMAKE_EXPORT_COMPILE_COMMANDS" : "ON",
"KDDockWidgets_FUZZER" : "OFF",
"ECM_ENABLE_SANITIZERS" : "'address;undefined'"
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON",
"ECM_ENABLE_SANITIZERS": "'address;undefined'"
},
"warnings" : {
"uninitialized" : true
"warnings": {
"uninitialized": true
}
},
{
@@ -41,11 +39,11 @@
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"KDDockWidgets_WERROR": "ON",
"KDDockWidgets_EXAMPLES" : "OFF"
"KDDockWidgets_EXAMPLES": "OFF"
},
"environment": {
"CXX": "clazy",
"CCACHE_DISABLE" : "ON"
"CCACHE_DISABLE": "ON"
}
},
{
@@ -55,13 +53,13 @@
"binaryDir": "${sourceDir}/build-clazy-qtquick",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"KDDockWidgets_EXAMPLES" : "OFF",
"KDDockWidgets_EXAMPLES": "OFF",
"KDDockWidgets_WERROR": "ON",
"KDDockWidgets_QTQUICK": "ON"
},
"environment": {
"CXX": "clazy",
"CCACHE_DISABLE" : "ON"
"CCACHE_DISABLE": "ON"
}
},
{
@@ -80,7 +78,7 @@
"binaryDir": "${sourceDir}/build-release-no-x11extras",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release",
"KDDockWidgets_X11EXTRAS" : "OFF"
"KDDockWidgets_X11EXTRAS": "OFF"
}
},
{
@@ -102,9 +100,8 @@
"CMAKE_BUILD_TYPE": "Debug",
"KDDockWidgets_QTQUICK": "ON",
"KDDockWidgets_DEVELOPER_MODE": "ON",
"ECM_ENABLE_SANITIZERS" : "'address;undefined'",
"CMAKE_EXPORT_COMPILE_COMMANDS" : "ON",
"KDDockWidgets_FUZZER" : "OFF"
"ECM_ENABLE_SANITIZERS": "'address;undefined'",
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON"
}
},
{
@@ -157,7 +154,7 @@
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release",
"KDDockWidgets_QT6": "ON",
"CMAKE_PREFIX_PATH" : "$env{QT6_DIR}"
"CMAKE_PREFIX_PATH": "$env{QT6_DIR}"
},
"environment": {
"PATH": "$env{QT6_DIR}/bin:$penv{PATH}"
@@ -172,9 +169,8 @@
"CMAKE_BUILD_TYPE": "Debug",
"KDDockWidgets_QT6": "ON",
"KDDockWidgets_DEVELOPER_MODE": "ON",
"CMAKE_EXPORT_COMPILE_COMMANDS" : "ON",
"KDDockWidgets_FUZZER" : "OFF",
"CMAKE_PREFIX_PATH" : "$env{QT6_DIR}"
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON",
"CMAKE_PREFIX_PATH": "$env{QT6_DIR}"
},
"environment": {
"PATH": "$env{QT6_DIR}/bin:$penv{PATH}"
@@ -189,10 +185,9 @@
"CMAKE_BUILD_TYPE": "Debug",
"KDDockWidgets_QT6": "ON",
"KDDockWidgets_DEVELOPER_MODE": "ON",
"CMAKE_EXPORT_COMPILE_COMMANDS" : "ON",
"ECM_ENABLE_SANITIZERS" : "'address;undefined'",
"KDDockWidgets_FUZZER" : "OFF",
"CMAKE_PREFIX_PATH" : "$env{QT6_DIR}"
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON",
"ECM_ENABLE_SANITIZERS": "'address;undefined'",
"CMAKE_PREFIX_PATH": "$env{QT6_DIR}"
},
"environment": {
"PATH": "$env{QT6_DIR}/bin:$penv{PATH}"
@@ -206,8 +201,8 @@
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release",
"KDDockWidgets_QTQUICK": "ON",
"KDDockWidgets_QT6": "ON",
"CMAKE_PREFIX_PATH" : "$env{QT6_DIR}"
"KDDockWidgets_QT6": "ON",
"CMAKE_PREFIX_PATH": "$env{QT6_DIR}"
},
"environment": {
"PATH": "$env{QT6_DIR}/bin:$penv{PATH}"
@@ -221,16 +216,16 @@
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"KDDockWidgets_QTQUICK": "ON",
"CMAKE_EXPORT_COMPILE_COMMANDS" : "ON",
"KDDockWidgets_DEVELOPER_MODE": "ON",
"ECM_ENABLE_SANITIZERS" : "'address;undefined'",
"KDDockWidgets_QT6": "ON",
"CMAKE_PREFIX_PATH" : "$env{QT6_DIR}"
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON",
"KDDockWidgets_DEVELOPER_MODE": "ON",
"ECM_ENABLE_SANITIZERS": "'address;undefined'",
"KDDockWidgets_QT6": "ON",
"CMAKE_PREFIX_PATH": "$env{QT6_DIR}"
},
"environment": {
"PATH": "$env{QT6_DIR}/bin:$penv{PATH}",
"QML2_IMPORT_PATH" : "$env{QT6_DIR}/imports:$env{QT6_DIR}/qml",
"LD_LIBRARY_PATH" : "$env{QT6_DIR}/lib"
"QML2_IMPORT_PATH": "$env{QT6_DIR}/imports:$env{QT6_DIR}/qml",
"LD_LIBRARY_PATH": "$env{QT6_DIR}/lib"
}
},
{
@@ -241,11 +236,10 @@
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"KDDockWidgets_DEVELOPER_MODE": "ON",
"CMAKE_EXPORT_COMPILE_COMMANDS" : "ON",
"KDDockWidgets_FUZZER" : "ON"
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON"
},
"warnings" : {
"uninitialized" : true
"warnings": {
"uninitialized": true
},
"environment": {
"CC": "clang-cl",
@@ -260,11 +254,10 @@
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"KDDockWidgets_DEVELOPER_MODE": "ON",
"KDDockWidgets_FUZZER" : "OFF",
"KDDockWidgets_QTQUICK": "ON"
},
"warnings" : {
"uninitialized" : true
"warnings": {
"uninitialized": true
},
"environment": {
"CC": "clang-cl",
@@ -279,12 +272,11 @@
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"KDDockWidgets_DEVELOPER_MODE": "ON",
"KDDockWidgets_FUZZER" : "ON",
"KDDockWidgets_QT6": "ON",
"CMAKE_PREFIX_PATH" : "$env{QT6_DIR}"
"CMAKE_PREFIX_PATH": "$env{QT6_DIR}"
},
"warnings" : {
"uninitialized" : true
"warnings": {
"uninitialized": true
},
"environment": {
"CC": "clang-cl",
@@ -300,20 +292,19 @@
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"KDDockWidgets_DEVELOPER_MODE": "ON",
"KDDockWidgets_FUZZER" : "OFF",
"KDDockWidgets_QTQUICK": "ON",
"KDDockWidgets_QT6": "ON",
"CMAKE_PREFIX_PATH" : "$env{QT6_DIR}"
"CMAKE_PREFIX_PATH": "$env{QT6_DIR}"
},
"warnings" : {
"uninitialized" : true
"warnings": {
"uninitialized": true
},
"environment": {
"CC": "clang-cl",
"CXX": "clang-cl",
"PATH": "$env{QT6_DIR}/bin:$penv{PATH}",
"QML2_IMPORT_PATH" : "$env{QT6_DIR}/imports:$env{QT6_DIR}/qml",
"LD_LIBRARY_PATH" : "$env{QT6_DIR}/lib"
"QML2_IMPORT_PATH": "$env{QT6_DIR}/imports:$env{QT6_DIR}/qml",
"LD_LIBRARY_PATH": "$env{QT6_DIR}/lib"
}
},
{
@@ -324,18 +315,17 @@
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"KDDockWidgets_DEVELOPER_MODE": "ON",
"CMAKE_EXPORT_COMPILE_COMMANDS" : "ON",
"KDDockWidgets_FUZZER" : "OFF",
"CMAKE_C_FLAGS_INIT" : "-ftime-trace",
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON",
"CMAKE_C_FLAGS_INIT": "-ftime-trace",
"CMAKE_CXX_FLAGS_INIT": "-ftime-trace"
},
"warnings" : {
"uninitialized" : true
"warnings": {
"uninitialized": true
},
"environment": {
"CC": "clang",
"CXX": "clang++",
"CCACHE_DISABLE" : "ON"
"CCACHE_DISABLE": "ON"
}
},
{
@@ -346,19 +336,18 @@
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"KDDockWidgets_DEVELOPER_MODE": "ON",
"CMAKE_EXPORT_COMPILE_COMMANDS" : "ON",
"KDDockWidgets_FUZZER" : "OFF",
"KDDockWidgets_QT6" : "ON",
"CMAKE_C_FLAGS_INIT" : "-ftime-trace",
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON",
"KDDockWidgets_QT6": "ON",
"CMAKE_C_FLAGS_INIT": "-ftime-trace",
"CMAKE_CXX_FLAGS_INIT": "-ftime-trace"
},
"warnings" : {
"uninitialized" : true
"warnings": {
"uninitialized": true
},
"environment": {
"CC": "clang",
"CXX": "clang++",
"CCACHE_DISABLE" : "ON"
"CCACHE_DISABLE": "ON"
}
},
{
@@ -459,17 +448,23 @@
},
{
"name": "ci-static",
"inherits":["static"],
"inherits": [
"static"
],
"binaryDir": "${sourceDir}/build-ci-static"
},
{
"name": "ci-static-qtquick",
"inherits":["static-qtquick"],
"inherits": [
"static-qtquick"
],
"binaryDir": "${sourceDir}/build-ci-static-qtquick"
},
{
"name": "ci-python",
"inherits":["python"],
"inherits": [
"python"
],
"binaryDir": "${sourceDir}/build-python"
}
],
@@ -478,16 +473,16 @@
"name": "clazy",
"configurePreset": "clazy",
"environment": {
"CLAZY_CHECKS" : "level2,detaching-member,heap-allocated-small-trivial-type,isempty-vs-count,qstring-varargs,qvariant-template-instantiation,raw-environment-function,reserve-candidates,signal-with-return-value,thread-with-slots,no-ctor-missing-parent-argument,no-missing-typeinfo",
"CCACHE_DISABLE" : "ON"
"CLAZY_CHECKS": "level2,detaching-member,heap-allocated-small-trivial-type,isempty-vs-count,qstring-varargs,qvariant-template-instantiation,raw-environment-function,reserve-candidates,signal-with-return-value,thread-with-slots,no-ctor-missing-parent-argument,no-missing-typeinfo",
"CCACHE_DISABLE": "ON"
}
},
{
"name": "clazy-qtquick",
"configurePreset": "clazy-qtquick",
"environment": {
"CLAZY_CHECKS" : "level2,detaching-member,heap-allocated-small-trivial-type,isempty-vs-count,qstring-varargs,qvariant-template-instantiation,raw-environment-function,reserve-candidates,signal-with-return-value,thread-with-slots,no-ctor-missing-parent-argument,no-missing-typeinfo",
"CCACHE_DISABLE" : "ON"
"CLAZY_CHECKS": "level2,detaching-member,heap-allocated-small-trivial-type,isempty-vs-count,qstring-varargs,qvariant-template-instantiation,raw-environment-function,reserve-candidates,signal-with-return-value,thread-with-slots,no-ctor-missing-parent-argument,no-missing-typeinfo",
"CCACHE_DISABLE": "ON"
}
}
]

View File

@@ -1,7 +1,21 @@
* v1.7.0 (unreleased)
* v1.7.1 (unreleased)
- Fixed pin button appearing by mistake when using Flag_TitleBarNoFloatButton (#359)
* v1.7.0 (03 May 2023)
- Introduce DockWidget::setFloatingWindowFlags(flags). Allows for different
FloatingWindows to have different window flags. For example, some having
Qt::Tool while others having Qt::Window (#314).
- Fixed fixed-sized windows being able to be resized on Windows (#345)
- Allow restoring layouts without touching floating dock widgets
- Fix setDropIndicatorsInhibited(false) not showing drop indicators (#334, #337)
- Fix relayouting when dock widget is deleted directly (#336)
- Minor performance improvement: Cache TitleBar icons
- Save side bar overlay geometry when frame is resized
- Fixed case of corrupt layout when using setDockWidgetFactoryFunc()
- Fix layout scaling factor when main window is native
- Fix moving floating windows to negative positions (#321)
- Fixed using normal geometry of platform window if fractional scaling is enabled
- Allow to specify Qt::Tool or Qt::Window per floating window
* v1.6.0 (14 September 2022)
- Minimum Qt6 version is now 6.2.0

View File

@@ -1,19 +1,3 @@
# KDDockWidgets and QtQuick
## Supported Qt versions and toolchains
KDDockWidgets for QtQuick requires a C++17 capable compiler and Qt >= 6.2.1.
Qt 5.15.2 will probably also work, but it's not built and tested by KDAB CI, we
advise users to move to Qt6 as soon as possible.
## Troubleshooting
- QtGraphicalEffects is not supported, as it's buggy when moving between different QWindows.
See for example QTBUG-94943, KDDockWidgets issue #213. Also search the Qt bug tracker
for "QQuickItem: Cannot use same item on different windows at the same time"
- Very rarely, in some Nvidia/X11 setups, floating/docking has noticeable lag (like 1 second)
This could be solved by going to Nvidia's settings and making sure all monitors have
the same refresh rate and disabling "Allow Flipping". It's not known why this solves it. Might also
be a bug in Qt.
Please use branch 2.0 for QtQuick support.

View File

@@ -29,7 +29,7 @@ As this time, you cannot get shiboken2-generator because the wheels are not on P
To use the wheels do this:
```bash
% pip3 install \
% python3 -m pip install \
--index-url=http://download.qt.io/official_releases/QtForPython/ \
--trusted-host download.qt.io \
shiboken2 pyside2 shiboken2_generator
@@ -40,7 +40,7 @@ For more info visit <https://doc.qt.io/qtforpython/shiboken2/gettingstarted.html
afterwards run:
```bash
pip3 list | grep PySide
python3 -m pip list | grep PySide
```
Note the version *must* match the same Qt you intend to use when building KDDockWidgets.
@@ -48,7 +48,7 @@ Note the version *must* match the same Qt you intend to use when building KDDock
## Install PySide6 for Qt6
Follow the same instructions as [the previous section](#Install PySide2 for Qt5),
except installing `shiboken6 pyside6 shiboken6_generator` with pip3.
except installing `shiboken6 pyside6 shiboken6_generator` with pip.
## Building KDDockWidgets Python Bindings
@@ -79,6 +79,14 @@ To run the KDDW python example
### Build Issues
- You can override the default Python3 version found by CMake (usually the
newest version available) by passing the Python3_EXECUTABLE value to CMake,
i.e.
```bash
cmake -DPython3_EXECUTABLE=/usr/bin/python3.10 ....
```
- If you see errors like "Unable to locate Clang's built-in include directory"
then first mROUBLESHOOTINGake sure you have llvm installed. If you still have problems try
setting the environment variable `LLVM_INSTALL_DIR` to point to your llvm installation.

View File

@@ -62,7 +62,6 @@ creative with their requests, so it was clear we needed a better docking framewo
- Clean codebase
- Not mixing GUI with state with logic with animations
- Great test coverage, even the GUI and DnD operations are tested. 200 tests currently.
- Fuzzer for doing random testing and finding bugs
- Lazy separator resize
- Reordering tabs with mouse
- Partial layout save/restore, affecting only a chosen sub-set

View File

@@ -23,18 +23,9 @@ set(PYSIDE2_FOUND FALSE)
if(PYSIDE2_PRIV_FOUND)
set(PYSIDE2_FOUND TRUE)
message(STATUS "Using PySide2 found in the system!")
pkg_get_variable(SHIBOKEN_BINARY
pyside2
generator_location
)
pkg_get_variable(PYSIDE2_BASEDIR
pyside2
typesystemdir
)
pkg_get_variable(PYSIDE_INCLUDE_DIR
pyside2
includedir
)
pkg_get_variable(SHIBOKEN_BINARY pyside2 generator_location)
pkg_get_variable(PYSIDE2_BASEDIR pyside2 typesystemdir)
pkg_get_variable(PYSIDE_INCLUDE_DIR pyside2 includedir)
set(PYSIDE_TYPESYSTEMS ${PYSIDE2_BASEDIR})
set(PYSIDE2_SO_VERSION ${PYSIDE2_PRIV_VERSION})
set(PYSIDE_LIBRARY ${PYSIDE2_PRIV_LINK_LIBRARIES})
@@ -45,7 +36,8 @@ else()
get_filename_component(PYTHON_LIBRARY_FILENAME ${PYTHON_LIBRARY_FILENAME} NAME)
execute_process(
COMMAND ${Python3_EXECUTABLE} -c "if True:
COMMAND
${Python3_EXECUTABLE} -c "if True:
import os, sys
try:
import PySide2.QtCore as QtCore
@@ -58,16 +50,18 @@ else()
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(NOT PYSIDE2_BASEDIR)
message(
FATAL_ERROR
"The PySide2 module could not be imported. Make sure you have it installed "
"by checking the output of \"pip${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR} list\""
message(FATAL_ERROR "The PySide2 module could not be imported. Make sure you have it installed "
"by checking the output of \"pip${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR} list\""
)
endif()
set(PYSIDE_BASEDIR ${PYSIDE2_BASEDIR} CACHE PATH "Top level install of PySide2" FORCE)
set(PYSIDE_BASEDIR
${PYSIDE2_BASEDIR}
CACHE PATH "Top level install of PySide2" FORCE
)
execute_process(
COMMAND ${Python3_EXECUTABLE} -c "if True:
COMMAND
${Python3_EXECUTABLE} -c "if True:
import os
import PySide2.QtCore as QtCore
print(os.path.basename(QtCore.__file__).split('.', 1)[1])
@@ -77,7 +71,8 @@ else()
)
execute_process(
COMMAND ${Python3_EXECUTABLE} -c "if True:
COMMAND
${Python3_EXECUTABLE} -c "if True:
import os
import PySide2.QtCore as QtCore
print(';'.join(map(str, QtCore.__version_info__)))
@@ -103,10 +98,17 @@ else()
#PySide
#===============================================================================
find_path(PYSIDE_INCLUDE_DIR
pyside.h
if(PYSIDE_CUSTOM_PREFIX STREQUAL "")
set(PYSIDE_CUSTOM_PREFIX ${PYSIDE2_BASEDIR})
endif()
find_path(
PYSIDE_INCLUDE_DIR pyside.h
PATHS ${PYSIDE2_BASEDIR}/include ${PYSIDE_CUSTOM_PREFIX}/include/PySide2
NO_DEFAULT_PATH)
NO_DEFAULT_PATH
NO_CACHE
NO_SYSTEM_ENVIRONMENT_PATH
)
# Platform specific library names
if(MSVC)
@@ -119,15 +121,17 @@ else()
set(PYSIDE_LIBRARY_BASENAMES "libpyside2.${PYSIDE2_SUFFIX}")
endif()
find_file(PYSIDE_LIBRARY
${PYSIDE_LIBRARY_BASENAMES}
find_file(
PYSIDE_LIBRARY ${PYSIDE_LIBRARY_BASENAMES}
PATHS ${PYSIDE2_BASEDIR} ${PYSIDE_CUSTOM_PREFIX}/lib
NO_DEFAULT_PATH)
NO_DEFAULT_PATH
)
find_path(PYSIDE_TYPESYSTEMS
typesystem_core.xml
find_path(
PYSIDE_TYPESYSTEMS typesystem_core.xml
PATHS ${PYSIDE2_BASEDIR}/typesystems ${PYSIDE_CUSTOM_PREFIX}/share/PySide2/typesystems
NO_DEFAULT_PATH)
NO_DEFAULT_PATH
)
endif()
if(PYSIDE2_FOUND)
@@ -142,17 +146,20 @@ if(PYSIDE2_FOUND)
set_property(TARGET PySide2::pyside2 PROPERTY IMPORTED_IMPLIB ${PYSIDE_LIBRARY})
endif()
set_property(TARGET PySide2::pyside2 PROPERTY IMPORTED_LOCATION ${PYSIDE_LIBRARY})
set_property(TARGET PySide2::pyside2 APPEND PROPERTY
INTERFACE_INCLUDE_DIRECTORIES
${PYSIDE_INCLUDE_DIR}
${PYSIDE_INCLUDE_DIR}/QtCore/
${PYSIDE_INCLUDE_DIR}/QtGui/
${PYSIDE_INCLUDE_DIR}/QtWidgets/
${Python3_INCLUDE_DIRS}
set_property(
TARGET PySide2::pyside2
APPEND
PROPERTY INTERFACE_INCLUDE_DIRECTORIES
${PYSIDE_INCLUDE_DIR}
${PYSIDE_INCLUDE_DIR}/QtCore/
${PYSIDE_INCLUDE_DIR}/QtGui/
${PYSIDE_INCLUDE_DIR}/QtWidgets/
${Python3_INCLUDE_DIRS}
)
endif()
find_package_handle_standard_args(PySide2
find_package_handle_standard_args(
PySide2
REQUIRED_VARS PYSIDE2_BASEDIR PYSIDE_INCLUDE_DIR PYSIDE_LIBRARY PYSIDE_TYPESYSTEMS
VERSION_VAR PYSIDE2_SO_VERSION
)

View File

@@ -20,7 +20,8 @@ list(GET Python3_LIBRARIES 0 PYTHON_LIBRARY_FILENAME)
get_filename_component(PYTHON_LIBRARY_FILENAME ${PYTHON_LIBRARY_FILENAME} NAME)
execute_process(
COMMAND ${Python3_EXECUTABLE} -c "if True:
COMMAND
${Python3_EXECUTABLE} -c "if True:
import os, sys
try:
import PySide6.QtCore as QtCore
@@ -33,17 +34,19 @@ execute_process(
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(NOT PYSIDE6_BASEDIR)
message(
FATAL_ERROR
"The PySide6 module could not be imported. Make sure you have it installed "
"by checking the output of \"pip${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR} list\""
message(FATAL_ERROR "The PySide6 module could not be imported. Make sure you have it installed "
"by checking the output of \"pip${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR} list\""
)
endif()
if(PYSIDE6_BASEDIR)
set(PYSIDE_BASEDIR ${PYSIDE6_BASEDIR} CACHE PATH "Top level install of PySide6" FORCE)
set(PYSIDE_BASEDIR
${PYSIDE6_BASEDIR}
CACHE PATH "Top level install of PySide6" FORCE
)
execute_process(
COMMAND ${Python3_EXECUTABLE} -c "if True:
COMMAND
${Python3_EXECUTABLE} -c "if True:
import os
import PySide6.QtCore as QtCore
print(os.path.basename(QtCore.__file__).split('.', 1)[1])
@@ -53,7 +56,8 @@ if(PYSIDE6_BASEDIR)
)
execute_process(
COMMAND ${Python3_EXECUTABLE} -c "if True:
COMMAND
${Python3_EXECUTABLE} -c "if True:
import os
import PySide6.QtCore as QtCore
print(';'.join(map(str, QtCore.__version_info__)))
@@ -81,10 +85,11 @@ endif()
if(PYSIDE6_FOUND)
#PySide
#===============================================================================
find_path(PYSIDE_INCLUDE_DIR
pyside.h
find_path(
PYSIDE_INCLUDE_DIR pyside.h
PATHS ${PYSIDE6_BASEDIR}/include ${PYSIDE_CUSTOM_PREFIX}/include/PySide6
NO_DEFAULT_PATH)
NO_DEFAULT_PATH
)
# Platform specific library names
if(MSVC)
@@ -97,15 +102,17 @@ if(PYSIDE6_FOUND)
set(PYSIDE_LIBRARY_BASENAMES "libpyside6.${PYSIDE6_SUFFIX}")
endif()
find_file(PYSIDE_LIBRARY
${PYSIDE_LIBRARY_BASENAMES}
find_file(
PYSIDE_LIBRARY ${PYSIDE_LIBRARY_BASENAMES}
PATHS ${PYSIDE6_BASEDIR} ${PYSIDE_CUSTOM_PREFIX}/lib
NO_DEFAULT_PATH)
NO_DEFAULT_PATH
)
find_path(PYSIDE_TYPESYSTEMS
typesystem_core.xml
find_path(
PYSIDE_TYPESYSTEMS typesystem_core.xml
PATHS ${PYSIDE6_BASEDIR}/typesystems ${PYSIDE_CUSTOM_PREFIX}/share/PySide6/typesystems
NO_DEFAULT_PATH)
NO_DEFAULT_PATH
)
endif()
if(PYSIDE6_FOUND)
@@ -120,17 +127,20 @@ if(PYSIDE6_FOUND)
set_property(TARGET PySide6::pyside6 PROPERTY IMPORTED_IMPLIB ${PYSIDE_LIBRARY})
endif()
set_property(TARGET PySide6::pyside6 PROPERTY IMPORTED_LOCATION ${PYSIDE_LIBRARY})
set_property(TARGET PySide6::pyside6 APPEND PROPERTY
INTERFACE_INCLUDE_DIRECTORIES
${PYSIDE_INCLUDE_DIR}
${PYSIDE_INCLUDE_DIR}/QtCore/
${PYSIDE_INCLUDE_DIR}/QtGui/
${PYSIDE_INCLUDE_DIR}/QtWidgets/
${Python3_INCLUDE_DIRS}
set_property(
TARGET PySide6::pyside6
APPEND
PROPERTY INTERFACE_INCLUDE_DIRECTORIES
${PYSIDE_INCLUDE_DIR}
${PYSIDE_INCLUDE_DIR}/QtCore/
${PYSIDE_INCLUDE_DIR}/QtGui/
${PYSIDE_INCLUDE_DIR}/QtWidgets/
${Python3_INCLUDE_DIRS}
)
endif()
find_package_handle_standard_args(PySide6
find_package_handle_standard_args(
PySide6
REQUIRED_VARS PYSIDE6_BASEDIR PYSIDE_INCLUDE_DIR PYSIDE_LIBRARY PYSIDE_TYPESYSTEMS
VERSION_VAR PYSIDE6_SO_VERSION
)

View File

@@ -24,23 +24,15 @@ set(SHIBOKEN_FOUND FALSE)
if(SHIBOKEN2_PRIV_FOUND)
set(SHIBOKEN_FOUND TRUE)
message(STATUS "Using shiboken found in the system!")
pkg_get_variable(SHIBOKEN_BINARY
shiboken2
generator_location
)
pkg_get_variable(SHIBOKEN_BASEDIR
shiboken2
libdir
)
pkg_get_variable(SHIBOKEN_INCLUDE_DIR
shiboken2
includedir
)
pkg_get_variable(SHIBOKEN_BINARY shiboken2 generator_location)
pkg_get_variable(SHIBOKEN_BASEDIR shiboken2 libdir)
pkg_get_variable(SHIBOKEN_INCLUDE_DIR shiboken2 includedir)
set(SHIBOKEN_VERSION ${SHIBOKEN2_PRIV_VERSION})
set(SHIBOKEN_LIBRARY ${SHIBOKEN2_PRIV_LINK_LIBRARIES})
else()
execute_process(
COMMAND ${Python3_EXECUTABLE} -c "if True:
COMMAND
${Python3_EXECUTABLE} -c "if True:
import os
try:
import shiboken2_generator
@@ -52,14 +44,13 @@ else()
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(NOT SHIBOKEN_GENERATOR_BASEDIR)
message(
FATAL_ERROR
"The shiboken2_generator module could not be imported. Make sure you have it installed "
"by checking the output of \"pip${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR} list\""
message(FATAL_ERROR "The shiboken2_generator module could not be imported. Make sure you have it installed "
"by checking the output of \"pip${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR} list\""
)
endif()
execute_process(
COMMAND ${Python3_EXECUTABLE} -c "if True:
COMMAND
${Python3_EXECUTABLE} -c "if True:
import os
try:
import shiboken2
@@ -71,14 +62,13 @@ else()
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(NOT SHIBOKEN_BASEDIR)
message(
FATAL_ERROR
"The shiboken2 module could not be imported. Make sure you have it installed "
"by checking the output of \"pip${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR} list\""
message(FATAL_ERROR "The shiboken2 module could not be imported. Make sure you have it installed "
"by checking the output of \"pip${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR} list\""
)
endif()
execute_process(
COMMAND ${Python3_EXECUTABLE} -c "if True:
COMMAND
${Python3_EXECUTABLE} -c "if True:
import os
import shiboken2
print(';'.join(filter(None, map(str, shiboken2.__version_info__))))
@@ -91,15 +81,21 @@ else()
list(GET SHIBOKEN_VERSION 2 SHIBOKEN_MINOR_VERSION)
string(REPLACE ";" "." SHIBOKEN_VERSION "${SHIBOKEN_VERSION}")
if(SHIBOKEN_CUSTOM_PREFIX STREQUAL "")
set(SHIBOKEN_CUSTOM_PREFIX ${SHIBOKEN_GENERATOR_BASEDIR})
endif()
message(STATUS "ShibokenGenerator base dir: ${SHIBOKEN_GENERATOR_BASEDIR}")
message(STATUS "Shiboken base dir: ${SHIBOKEN_BASEDIR}")
message(STATUS "Shiboken custom path: ${SHIBOKEN_CUSTOM_PREFIX}")
message(STATUS "Shiboken custom path: [${SHIBOKEN_CUSTOM_PREFIX}]")
if(SHIBOKEN_BASEDIR)
find_path(SHIBOKEN_INCLUDE_DIR
shiboken.h
find_path(
SHIBOKEN_INCLUDE_DIR shiboken.h
PATHS ${SHIBOKEN_CUSTOM_PREFIX} ${SHIBOKEN_GENERATOR_BASEDIR}/include
NO_DEFAULT_PATH
NO_CACHE
NO_SYSTEM_ENVIRONMENT_PATH
)
if(MSVC)
set(SHIBOKEN_LIBRARY_BASENAMES "shiboken2.abi3.lib")
@@ -109,15 +105,13 @@ else()
set(SHIBOKEN_LIBRARY_BASENAMES "libshiboken2.${PYSIDE2_SUFFIX}")
elseif(APPLE)
set(SHIBOKEN_LIBRARY_BASENAMES
libshiboken2.abi3.dylib
libshiboken2.abi3.${SHIBOKEN_MACRO_VERSION}.dylib
libshiboken2.abi3.dylib libshiboken2.abi3.${SHIBOKEN_MACRO_VERSION}.dylib
libshiboken2.abi3.${SHIBOKEN_MACRO_VERSION}.${SHIBOKEN_MICRO_VERSION}.dylib
libshiboken2.abi3.${SHIBOKEN_VERSION}.dylib
)
else()
set(SHIBOKEN_LIBRARY_BASENAMES
libshiboken2.abi3.so
libshiboken2.abi3.so.${SHIBOKEN_MACRO_VERSION}
libshiboken2.abi3.so libshiboken2.abi3.so.${SHIBOKEN_MACRO_VERSION}
libshiboken2.abi3.so.${SHIBOKEN_MACRO_VERSION}.${SHIBOKEN_MICRO_VERSION}
libshiboken2.abi3.so.${SHIBOKEN_VERSION}
)
@@ -129,29 +123,35 @@ else()
set(SHIBOKEN_SEARCH_PATHS ${SHIBOKEN_CUSTOM_PREFIX})
list(APPEND SHIBOKEN_SEARCH_PATHS ${SHIBOKEN_BASEDIR})
list(APPEND SHIBOKEN_SEARCH_PATHS ${SHIBOKEN_GENERATOR_BASEDIR})
find_file(SHIBOKEN_LIBRARY
${SHIBOKEN_LIBRARY_BASENAMES}
find_file(
SHIBOKEN_LIBRARY ${SHIBOKEN_LIBRARY_BASENAMES}
PATHS ${SHIBOKEN_SEARCH_PATHS}
NO_DEFAULT_PATH)
NO_DEFAULT_PATH
)
find_program(SHIBOKEN_BINARY
shiboken2
find_program(
SHIBOKEN_BINARY shiboken2
PATHS ${SHIBOKEN_SEARCH_PATHS}
NO_DEFAULT_PATH
)
endif()
if(SHIBOKEN_INCLUDE_DIR AND SHIBOKEN_LIBRARY AND SHIBOKEN_BINARY)
if(SHIBOKEN_INCLUDE_DIR
AND SHIBOKEN_LIBRARY
AND SHIBOKEN_BINARY
)
set(SHIBOKEN_FOUND TRUE)
endif()
if(SHIBOKEN_FOUND)
endif()
if(MSVC)
# On Windows we must link to python3.dll that is a small library that links against python3x.dll
# that allow us to choose any python3x.dll at runtime
execute_process(
COMMAND ${Python3_EXECUTABLE} -c "if True:
COMMAND
${Python3_EXECUTABLE} -c "if True:
for lib in '${Python3_LIBRARIES}'.split(';'):
if '/' in lib:
prefix, py = lib.rsplit('/', 1)
@@ -177,15 +177,18 @@ if(SHIBOKEN_FOUND)
# Create shiboke2 target
add_library(Shiboken2::libshiboken SHARED IMPORTED GLOBAL)
if(MSVC)
set_property(TARGET Shiboken2::libshiboken PROPERTY
IMPORTED_IMPLIB ${SHIBOKEN_LIBRARY})
set_property(TARGET Shiboken2::libshiboken PROPERTY IMPORTED_IMPLIB ${SHIBOKEN_LIBRARY})
endif()
set_property(TARGET Shiboken2::libshiboken PROPERTY IMPORTED_LOCATION ${SHIBOKEN_LIBRARY})
set_property(TARGET Shiboken2::libshiboken APPEND PROPERTY
INTERFACE_INCLUDE_DIRECTORIES ${SHIBOKEN_INCLUDE_DIR} ${Python3_INCLUDE_DIRS}
set_property(
TARGET Shiboken2::libshiboken
APPEND
PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${SHIBOKEN_INCLUDE_DIR} ${Python3_INCLUDE_DIRS}
)
set_property(TARGET Shiboken2::libshiboken APPEND PROPERTY
INTERFACE_LINK_LIBRARIES ${PYTHON_LIMITED_LIBRARIES}
set_property(
TARGET Shiboken2::libshiboken
APPEND
PROPERTY INTERFACE_LINK_LIBRARIES ${PYTHON_LIMITED_LIBRARIES}
)
# Generator target
@@ -193,8 +196,8 @@ if(SHIBOKEN_FOUND)
set_property(TARGET Shiboken2::shiboken PROPERTY IMPORTED_LOCATION ${SHIBOKEN_BINARY})
endif()
find_package_handle_standard_args(Shiboken2
find_package_handle_standard_args(
Shiboken2
REQUIRED_VARS SHIBOKEN_BASEDIR SHIBOKEN_INCLUDE_DIR SHIBOKEN_LIBRARY SHIBOKEN_BINARY
VERSION_VAR SHIBOKEN_VERSION
)

View File

@@ -17,7 +17,8 @@
set(SHIBOKEN_FOUND FALSE)
execute_process(
COMMAND ${Python3_EXECUTABLE} -c "if True:
COMMAND
${Python3_EXECUTABLE} -c "if True:
import os
try:
import shiboken6_generator
@@ -29,14 +30,13 @@ execute_process(
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(NOT SHIBOKEN_GENERATOR_BASEDIR)
message(
FATAL_ERROR
"The shiboken6_generator module could not be imported. Make sure you have it installed "
"by checking the output of \"pip${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR} list\""
message(FATAL_ERROR "The shiboken6_generator module could not be imported. Make sure you have it installed "
"by checking the output of \"pip${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR} list\""
)
endif()
execute_process(
COMMAND ${Python3_EXECUTABLE} -c "if True:
COMMAND
${Python3_EXECUTABLE} -c "if True:
import os
try:
import shiboken6
@@ -48,14 +48,13 @@ execute_process(
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(NOT SHIBOKEN_BASEDIR)
message(
FATAL_ERROR
"The shiboken6 module could not be imported. Make sure you have it installed "
"by checking the output of \"pip${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR} list\""
message(FATAL_ERROR "The shiboken6 module could not be imported. Make sure you have it installed "
"by checking the output of \"pip${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR} list\""
)
endif()
execute_process(
COMMAND ${Python3_EXECUTABLE} -c "if True:
COMMAND
${Python3_EXECUTABLE} -c "if True:
import os
import shiboken6
print(';'.join(filter(None, map(str, shiboken6.__version_info__))))
@@ -73,8 +72,8 @@ message(STATUS "Shiboken base dir: ${SHIBOKEN_BASEDIR}")
message(STATUS "Shiboken custom path: ${SHIBOKEN_CUSTOM_PREFIX}")
if(SHIBOKEN_BASEDIR)
find_path(SHIBOKEN_INCLUDE_DIR
shiboken.h
find_path(
SHIBOKEN_INCLUDE_DIR shiboken.h
PATHS ${SHIBOKEN_CUSTOM_PREFIX} ${SHIBOKEN_GENERATOR_BASEDIR}/include
NO_DEFAULT_PATH
)
@@ -86,15 +85,13 @@ if(SHIBOKEN_BASEDIR)
set(SHIBOKEN_LIBRARY_BASENAMES "libshiboken6.${PYSIDE2_SUFFIX}")
elseif(APPLE)
set(SHIBOKEN_LIBRARY_BASENAMES
libshiboken6.abi3.dylib
libshiboken6.abi3.${SHIBOKEN_MACRO_VERSION}.dylib
libshiboken6.abi3.dylib libshiboken6.abi3.${SHIBOKEN_MACRO_VERSION}.dylib
libshiboken6.abi3.${SHIBOKEN_MACRO_VERSION}.${SHIBOKEN_MICRO_VERSION}.dylib
libshiboken6.abi3.${SHIBOKEN_VERSION}.dylib
)
else()
set(SHIBOKEN_LIBRARY_BASENAMES
libshiboken6.abi3.so
libshiboken6.abi3.so.${SHIBOKEN_MACRO_VERSION}
libshiboken6.abi3.so libshiboken6.abi3.so.${SHIBOKEN_MACRO_VERSION}
libshiboken6.abi3.so.${SHIBOKEN_MACRO_VERSION}.${SHIBOKEN_MICRO_VERSION}
libshiboken6.abi3.so.${SHIBOKEN_VERSION}
)
@@ -106,29 +103,35 @@ if(SHIBOKEN_BASEDIR)
set(SHIBOKEN_SEARCH_PATHS ${SHIBOKEN_CUSTOM_PREFIX})
list(APPEND SHIBOKEN_SEARCH_PATHS ${SHIBOKEN_BASEDIR})
list(APPEND SHIBOKEN_SEARCH_PATHS ${SHIBOKEN_GENERATOR_BASEDIR})
find_file(SHIBOKEN_LIBRARY
${SHIBOKEN_LIBRARY_BASENAMES}
find_file(
SHIBOKEN_LIBRARY ${SHIBOKEN_LIBRARY_BASENAMES}
PATHS ${SHIBOKEN_SEARCH_PATHS}
NO_DEFAULT_PATH)
NO_DEFAULT_PATH
)
find_program(SHIBOKEN_BINARY
shiboken6
find_program(
SHIBOKEN_BINARY shiboken6
PATHS ${SHIBOKEN_SEARCH_PATHS}
NO_DEFAULT_PATH
)
endif()
if(SHIBOKEN_INCLUDE_DIR AND SHIBOKEN_LIBRARY AND SHIBOKEN_BINARY)
if(SHIBOKEN_INCLUDE_DIR
AND SHIBOKEN_LIBRARY
AND SHIBOKEN_BINARY
)
set(SHIBOKEN_FOUND TRUE)
endif()
if(SHIBOKEN_FOUND)
endif()
if(MSVC)
# On Windows we must link to python3.dll that is a small library that links against python3x.dll
# that allow us to choose any python3x.dll at runtime
execute_process(
COMMAND ${Python3_EXECUTABLE} -c "if True:
COMMAND
${Python3_EXECUTABLE} -c "if True:
for lib in '${Python3_LIBRARIES}'.split(';'):
if '/' in lib:
prefix, py = lib.rsplit('/', 1)
@@ -154,15 +157,18 @@ if(SHIBOKEN_FOUND)
# Create shiboken2 target
add_library(Shiboken6::libshiboken SHARED IMPORTED GLOBAL)
if(MSVC)
set_property(TARGET Shiboken6::libshiboken PROPERTY
IMPORTED_IMPLIB ${SHIBOKEN_LIBRARY})
set_property(TARGET Shiboken6::libshiboken PROPERTY IMPORTED_IMPLIB ${SHIBOKEN_LIBRARY})
endif()
set_property(TARGET Shiboken6::libshiboken PROPERTY IMPORTED_LOCATION ${SHIBOKEN_LIBRARY})
set_property(TARGET Shiboken6::libshiboken APPEND PROPERTY
INTERFACE_INCLUDE_DIRECTORIES ${SHIBOKEN_INCLUDE_DIR} ${Python3_INCLUDE_DIRS}
set_property(
TARGET Shiboken6::libshiboken
APPEND
PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${SHIBOKEN_INCLUDE_DIR} ${Python3_INCLUDE_DIRS}
)
set_property(TARGET Shiboken6::libshiboken APPEND PROPERTY
INTERFACE_LINK_LIBRARIES ${PYTHON_LIMITED_LIBRARIES}
set_property(
TARGET Shiboken6::libshiboken
APPEND
PROPERTY INTERFACE_LINK_LIBRARIES ${PYTHON_LIMITED_LIBRARIES}
)
# Generator target
@@ -175,4 +181,3 @@ find_package_handle_standard_args(
REQUIRED_VARS SHIBOKEN_BASEDIR SHIBOKEN_INCLUDE_DIR SHIBOKEN_LIBRARY SHIBOKEN_BINARY
VERSION_VAR SHIBOKEN_VERSION
)

View File

@@ -7,7 +7,8 @@
if(NOT ${PROJECT_NAME}_PYTHON_BINDINGS_INSTALL_PREFIX)
# cmake-lint: disable=C0103
set(${PROJECT_NAME}_PYTHON_BINDINGS_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}
set(${PROJECT_NAME}_PYTHON_BINDINGS_INSTALL_PREFIX
${CMAKE_INSTALL_PREFIX}
CACHE FILEPATH "Custom path to install python bindings."
)
endif()
@@ -91,7 +92,8 @@ endmacro()
# dependsArg - This var will be passed to add_custom_command(DEPENDS) so a new generation will be
# trigger if one of these files changes
# moduleOutputDir - Where the library file should be stored
macro(create_python_bindings
macro(
create_python_bindings
libraryName
typesystemPaths
includePaths
@@ -101,12 +103,17 @@ macro(create_python_bindings
globalInclude
typesystemXML
dependsArg
moduleOutputDir)
moduleOutputDir
)
# Transform the path separators into something shiboken understands.
make_path(shiboken_include_dirs ${includePaths})
make_path(shiboken_typesystem_dirs ${typesystemPaths})
get_property(raw_python_dir_include_dirs DIRECTORY PROPERTY INCLUDE_DIRECTORIES)
get_property(
raw_python_dir_include_dirs
DIRECTORY
PROPERTY INCLUDE_DIRECTORIES
)
make_path(python_dir_include_dirs ${raw_python_dir_include_dirs})
set(shiboken_include_dirs "${shiboken_include_dirs}${PATH_SEP}${python_dir_include_dirs}")
@@ -119,13 +126,10 @@ macro(create_python_bindings
set_property(SOURCE ${outputSource} PROPERTY SKIP_AUTOGEN ON)
add_custom_command(
OUTPUT ${outputSource}
COMMAND $<TARGET_PROPERTY:Shiboken2::shiboken,LOCATION> ${GENERATOR_EXTRA_FLAGS}
${globalInclude}
--include-paths=${shiboken_include_dirs}
--typesystem-paths=${shiboken_typesystem_dirs}
${shiboken_framework_include_dirs_option}
--output-directory=${CMAKE_CURRENT_BINARY_DIR}
${typesystemXML}
COMMAND
$<TARGET_PROPERTY:Shiboken2::shiboken,LOCATION> ${GENERATOR_EXTRA_FLAGS} ${globalInclude}
--include-paths=${shiboken_include_dirs} --typesystem-paths=${shiboken_typesystem_dirs}
${shiboken_framework_include_dirs_option} --output-directory=${CMAKE_CURRENT_BINARY_DIR} ${typesystemXML}
DEPENDS ${typesystemXML} ${dependsArg}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMENT "Running generator for ${libraryName} binding..."
@@ -136,10 +140,10 @@ macro(create_python_bindings
add_library(${TARGET_NAME} MODULE ${outputSource})
set_target_properties(
${TARGET_NAME} PROPERTIES
PREFIX ""
OUTPUT_NAME ${MODULE_NAME}
LIBRARY_OUTPUT_DIRECTORY ${moduleOutputDir}
${TARGET_NAME}
PROPERTIES PREFIX ""
OUTPUT_NAME ${MODULE_NAME}
LIBRARY_OUTPUT_DIRECTORY ${moduleOutputDir}
)
if(APPLE)
set_target_properties(${TARGET_NAME} PROPERTIES INSTALL_RPATH "@loader_path")
@@ -153,18 +157,14 @@ macro(create_python_bindings
target_include_directories(${TARGET_NAME} PUBLIC ${targetIncludeDirs})
target_link_libraries(
${TARGET_NAME}
${targetLinkLibraries}
PySide2::pyside2
Shiboken2::libshiboken
)
target_link_libraries(${TARGET_NAME} ${targetLinkLibraries} PySide2::pyside2 Shiboken2::libshiboken)
target_compile_definitions(${TARGET_NAME} PRIVATE Py_LIMITED_API=0x03050000)
if(APPLE)
set_property(TARGET ${TARGET_NAME} APPEND PROPERTY LINK_FLAGS "-undefined dynamic_lookup")
set_property(
TARGET ${TARGET_NAME}
APPEND
PROPERTY LINK_FLAGS "-undefined dynamic_lookup"
)
endif()
install(
TARGETS ${TARGET_NAME}
LIBRARY DESTINATION ${${PROJECT_NAME}_PYTHON_BINDINGS_INSTALL_PREFIX}
)
install(TARGETS ${TARGET_NAME} LIBRARY DESTINATION ${${PROJECT_NAME}_PYTHON_BINDINGS_INSTALL_PREFIX})
endmacro()

View File

@@ -7,7 +7,8 @@
if(NOT ${PROJECT_NAME}_PYTHON_BINDINGS_INSTALL_PREFIX)
# cmake-lint: disable=C0103
set(${PROJECT_NAME}_PYTHON_BINDINGS_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}
set(${PROJECT_NAME}_PYTHON_BINDINGS_INSTALL_PREFIX
${CMAKE_INSTALL_PREFIX}
CACHE FILEPATH "Custom path to install python bindings."
)
endif()
@@ -91,7 +92,8 @@ endmacro()
# dependsArg - This var will be passed to add_custom_command(DEPENDS) so a new generation will be
# trigger if one of these files changes
# moduleOutputDir - Where the library file should be stored
macro(create_python_bindings
macro(
create_python_bindings
libraryName
typesystemPaths
includePaths
@@ -101,12 +103,17 @@ macro(create_python_bindings
globalInclude
typesystemXML
dependsArg
moduleOutputDir)
moduleOutputDir
)
# Transform the path separators into something shiboken understands.
make_path(shiboken_include_dirs ${includePaths})
make_path(shiboken_typesystem_dirs ${typesystemPaths})
get_property(raw_python_dir_include_dirs DIRECTORY PROPERTY INCLUDE_DIRECTORIES)
get_property(
raw_python_dir_include_dirs
DIRECTORY
PROPERTY INCLUDE_DIRECTORIES
)
make_path(python_dir_include_dirs ${raw_python_dir_include_dirs})
set(shiboken_include_dirs "${shiboken_include_dirs}${PATH_SEP}${python_dir_include_dirs}")
@@ -119,13 +126,10 @@ macro(create_python_bindings
set_property(SOURCE ${outputSource} PROPERTY SKIP_AUTOGEN ON)
add_custom_command(
OUTPUT ${outputSource}
COMMAND $<TARGET_PROPERTY:Shiboken6::shiboken,LOCATION> ${GENERATOR_EXTRA_FLAGS}
${globalInclude}
--include-paths=${shiboken_include_dirs}
--typesystem-paths=${shiboken_typesystem_dirs}
${shiboken_framework_include_dirs_option}
--output-directory=${CMAKE_CURRENT_BINARY_DIR}
${typesystemXML}
COMMAND
$<TARGET_PROPERTY:Shiboken6::shiboken,LOCATION> ${GENERATOR_EXTRA_FLAGS} ${globalInclude}
--include-paths=${shiboken_include_dirs} --typesystem-paths=${shiboken_typesystem_dirs}
${shiboken_framework_include_dirs_option} --output-directory=${CMAKE_CURRENT_BINARY_DIR} ${typesystemXML}
DEPENDS ${typesystemXML} ${dependsArg}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMENT "Running generator for ${libraryName} binding..."
@@ -136,10 +140,10 @@ macro(create_python_bindings
add_library(${TARGET_NAME} MODULE ${outputSource})
set_target_properties(
${TARGET_NAME} PROPERTIES
PREFIX ""
OUTPUT_NAME ${MODULE_NAME}
LIBRARY_OUTPUT_DIRECTORY ${moduleOutputDir}
${TARGET_NAME}
PROPERTIES PREFIX ""
OUTPUT_NAME ${MODULE_NAME}
LIBRARY_OUTPUT_DIRECTORY ${moduleOutputDir}
)
if(APPLE)
set_target_properties(${TARGET_NAME} PROPERTIES INSTALL_RPATH "@loader_path")
@@ -153,18 +157,14 @@ macro(create_python_bindings
target_include_directories(${TARGET_NAME} PUBLIC ${targetIncludeDirs})
target_link_libraries(
${TARGET_NAME}
${targetLinkLibraries}
PySide6::pyside6
Shiboken6::libshiboken
)
target_link_libraries(${TARGET_NAME} ${targetLinkLibraries} PySide6::pyside6 Shiboken6::libshiboken)
target_compile_definitions(${TARGET_NAME} PRIVATE Py_LIMITED_API=0x03050000)
if(APPLE)
set_property(TARGET ${TARGET_NAME} APPEND PROPERTY LINK_FLAGS "-undefined dynamic_lookup")
set_property(
TARGET ${TARGET_NAME}
APPEND
PROPERTY LINK_FLAGS "-undefined dynamic_lookup"
)
endif()
install(
TARGETS ${TARGET_NAME}
LIBRARY DESTINATION ${${PROJECT_NAME}_PYTHON_BINDINGS_INSTALL_PREFIX}
)
install(TARGETS ${TARGET_NAME} LIBRARY DESTINATION ${${PROJECT_NAME}_PYTHON_BINDINGS_INSTALL_PREFIX})
endmacro()

View File

@@ -46,7 +46,10 @@ foreach(qval ${VARS_LIST})
list(GET QVAL_LIST 1 path)
endif()
if(NOT ${var}) #if set already on the command line for example
set(${var} ${path} CACHE PATH "Qt install path for ${var}")
set(${var}
${path}
CACHE PATH "Qt install path for ${var}"
)
endif()
endif()
endforeach()

View File

@@ -1,145 +0,0 @@
{
"folders": [
{
"path": "."
}
],
"settings": {
"files.trimTrailingWhitespace": true,
"editor.formatOnType": true,
"cmake.copyCompileCommands": "${workspaceFolder}/compile_commands.json"
},
"launch": {
"version": "0.2.0",
"configurations": [
{
"name": "gdb-kddockwidgets_customtitlebar_quick",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build-dev-qtquick/bin/kddockwidgets_customtitlebar_quick",
"args": [],
"cwd": "${workspaceFolder}",
"MIMode": "gdb",
"stopAtEntry": false,
"externalConsole": false
},
{
"name": "gdb-kddockwidgets_example_mdi_quick",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build-dev-qtquick/bin/kddockwidgets_example_mdi_quick",
"args": [],
"cwd": "${workspaceFolder}",
"MIMode": "gdb",
"stopAtEntry": false,
"externalConsole": false
},
{
"name": "gdb-kddockwidgets_example_quick",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build-dev-qtquick/bin/kddockwidgets_example_quick",
"args": [],
"cwd": "${workspaceFolder}",
"MIMode": "gdb",
"stopAtEntry": false,
"externalConsole": false
},
{
"name": "gdb-tst_docks",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build-dev-qtquick/bin/tst_docks",
"args": [],
"cwd": "${workspaceFolder}",
"MIMode": "gdb",
"stopAtEntry": false,
"externalConsole": false
},
{
"name": "lldb-kddockwidgets_customtitlebar_quick",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build-dev-qtquick/bin/kddockwidgets_customtitlebar_quick",
"args": [],
"cwd": "${workspaceFolder}",
"MIMode": "lldb",
"stopAtEntry": false,
"externalConsole": false
},
{
"name": "lldb-kddockwidgets_example_mdi_quick",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build-dev-qtquick/bin/kddockwidgets_example_mdi_quick",
"args": [],
"cwd": "${workspaceFolder}",
"MIMode": "lldb",
"stopAtEntry": false,
"externalConsole": false
},
{
"name": "lldb-kddockwidgets_example_quick",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build-dev-qtquick/bin/kddockwidgets_example_quick",
"args": [],
"cwd": "${workspaceFolder}",
"MIMode": "lldb",
"stopAtEntry": false,
"externalConsole": false
},
{
"name": "lldb-tst_docks",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build-dev-qtquick/bin/tst_docks",
"args": [],
"cwd": "${workspaceFolder}",
"MIMode": "lldb",
"stopAtEntry": false,
"externalConsole": false
},
{
"name": "msvc-kddockwidgets_customtitlebar_quick",
"type": "cppvsdbg",
"request": "launch",
"program": "${workspaceFolder}/build-dev-qtquick/bin/kddockwidgets_customtitlebar_quick",
"args": [],
"cwd": "${workspaceFolder}",
"stopAtEntry": false,
"externalConsole": false
},
{
"name": "msvc-kddockwidgets_example_mdi_quick",
"type": "cppvsdbg",
"request": "launch",
"program": "${workspaceFolder}/build-dev-qtquick/bin/kddockwidgets_example_mdi_quick",
"args": [],
"cwd": "${workspaceFolder}",
"stopAtEntry": false,
"externalConsole": false
},
{
"name": "msvc-kddockwidgets_example_quick",
"type": "cppvsdbg",
"request": "launch",
"program": "${workspaceFolder}/build-dev-qtquick/bin/kddockwidgets_example_quick",
"args": [],
"cwd": "${workspaceFolder}",
"stopAtEntry": false,
"externalConsole": false
},
{
"name": "msvc-tst_docks",
"type": "cppvsdbg",
"request": "launch",
"program": "${workspaceFolder}/build-dev-qtquick/bin/tst_docks",
"args": [],
"cwd": "${workspaceFolder}",
"stopAtEntry": false,
"externalConsole": false
}
]
}
}

View File

@@ -1,97 +0,0 @@
{
"folders": [
{
"path": "."
}
],
"settings": {
"files.trimTrailingWhitespace": true,
"editor.formatOnType": true,
"cmake.copyCompileCommands": "${workspaceFolder}/compile_commands.json"
},
"launch": {
"version": "0.2.0",
"configurations": [
{
"name": "kddockwidgets_example",
"type": "lldb",
"request": "launch",
"program": "${workspaceFolder}/build-dev/bin/kddockwidgets_example",
"args": [],
"cwd": "${workspaceFolder}"
},
{
"name": "kddockwidgets_minimal_example",
"type": "lldb",
"request": "launch",
"program": "${workspaceFolder}/build-dev/bin/kddockwidgets_minimal_example",
"args": [],
"cwd": "${workspaceFolder}"
},
{
"name": "kddockwidgets_minimal_mdi_example",
"type": "lldb",
"request": "launch",
"program": "${workspaceFolder}/build-dev/bin/kddockwidgets_minimal_mdi_example",
"args": [],
"cwd": "${workspaceFolder}"
},
{
"name": "kddockwidgets_mdi_with_docking_example",
"type": "lldb",
"request": "launch",
"program": "${workspaceFolder}/build-dev/bin/kddockwidgets_mdi_with_docking_example",
"args": [],
"cwd": "${workspaceFolder}"
},
{
"name": "tst_docks",
"type": "lldb",
"request": "launch",
"program": "${workspaceFolder}/build-dev/bin/tst_docks",
"args": [],
"cwd": "${workspaceFolder}"
},
{
"name": "msvc-kddockwidgets_example",
"type": "cppvsdbg",
"request": "launch",
"program": "${workspaceFolder}/build-dev/bin/kddockwidgets_example",
"args": [],
"cwd": "${workspaceFolder}",
"stopAtEntry": false,
"externalConsole": false
},
{
"name": "msvc-kddockwidgets_minimal_example",
"type": "cppvsdbg",
"request": "launch",
"program": "${workspaceFolder}/build-dev/bin/kddockwidgets_minimal_example",
"args": [],
"cwd": "${workspaceFolder}",
"stopAtEntry": false,
"externalConsole": false
},
{
"name": "msvc-kddockwidgets_minimal_mdi_example",
"type": "cppvsdbg",
"request": "launch",
"program": "${workspaceFolder}/build-dev/bin/kddockwidgets_minimal_mdi_example",
"args": [],
"cwd": "${workspaceFolder}",
"stopAtEntry": false,
"externalConsole": false
},
{
"name": "msvc-tst_docks",
"type": "cppvsdbg",
"request": "launch",
"program": "${workspaceFolder}/build-dev/bin/tst_docks",
"args": [],
"cwd": "${workspaceFolder}",
"stopAtEntry": false,
"externalConsole": false
}
]
}
}

View File

@@ -1,145 +0,0 @@
{
"folders": [
{
"path": "."
}
],
"settings": {
"files.trimTrailingWhitespace": true,
"editor.formatOnType": true,
"cmake.copyCompileCommands": "${workspaceFolder}/compile_commands.json"
},
"launch": {
"version": "0.2.0",
"configurations": [
{
"name": "gdb-kddockwidgets_example",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build-dev6/bin/kddockwidgets_example",
"args": [],
"cwd": "${workspaceFolder}",
"MIMode": "gdb",
"stopAtEntry": false,
"externalConsole": false
},
{
"name": "gdb-kddockwidgets_minimal_example",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build-dev6/bin/kddockwidgets_minimal_example",
"args": [],
"cwd": "${workspaceFolder}",
"MIMode": "gdb",
"stopAtEntry": false,
"externalConsole": false
},
{
"name": "gdb-kddockwidgets_minimal_mdi_example",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build-dev6/bin/kddockwidgets_minimal_mdi_example",
"args": [],
"cwd": "${workspaceFolder}",
"MIMode": "gdb",
"stopAtEntry": false,
"externalConsole": false
},
{
"name": "gdb-tst_docks",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build-dev6/bin/tst_docks",
"args": [],
"cwd": "${workspaceFolder}",
"MIMode": "gdb",
"stopAtEntry": false,
"externalConsole": false
},
{
"name": "lldb-kddockwidgets_example",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build-dev6/bin/kddockwidgets_example",
"args": [],
"cwd": "${workspaceFolder}",
"MIMode": "lldb",
"stopAtEntry": false,
"externalConsole": false
},
{
"name": "lldb-kddockwidgets_minimal_example",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build-dev6/bin/kddockwidgets_minimal_example",
"args": [],
"cwd": "${workspaceFolder}",
"MIMode": "lldb",
"stopAtEntry": false,
"externalConsole": false
},
{
"name": "lldb-kddockwidgets_minimal_mdi_example",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build-dev6/bin/kddockwidgets_minimal_mdi_example",
"args": [],
"cwd": "${workspaceFolder}",
"MIMode": "lldb",
"stopAtEntry": false,
"externalConsole": false
},
{
"name": "lldb-tst_docks",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build-dev6/bin/tst_docks",
"args": [],
"cwd": "${workspaceFolder}",
"MIMode": "lldb",
"stopAtEntry": false,
"externalConsole": false
},
{
"name": "msvc-kddockwidgets_example",
"type": "cppvsdbg",
"request": "launch",
"program": "${workspaceFolder}/build-dev6/bin/kddockwidgets_example",
"args": [],
"cwd": "${workspaceFolder}",
"stopAtEntry": false,
"externalConsole": false
},
{
"name": "msvc-kddockwidgets_minimal_example",
"type": "cppvsdbg",
"request": "launch",
"program": "${workspaceFolder}/build-dev6/bin/kddockwidgets_minimal_example",
"args": [],
"cwd": "${workspaceFolder}",
"stopAtEntry": false,
"externalConsole": false
},
{
"name": "msvc-kddockwidgets_minimal_mdi_example",
"type": "cppvsdbg",
"request": "launch",
"program": "${workspaceFolder}/build-dev6/bin/kddockwidgets_minimal_mdi_example",
"args": [],
"cwd": "${workspaceFolder}",
"stopAtEntry": false,
"externalConsole": false
},
{
"name": "msvc-tst_docks",
"type": "cppvsdbg",
"request": "launch",
"program": "${workspaceFolder}/build-dev6/bin/tst_docks",
"args": [],
"cwd": "${workspaceFolder}",
"stopAtEntry": false,
"externalConsole": false
}
]
}
}

View File

@@ -12,7 +12,7 @@ from conans import ConanFile, CMake, tools
class KDDockWidgetsConan(ConanFile):
name = "kddockwidgets"
version = "1.6.95"
version = "1.7.0"
default_user = "kdab"
default_channel = "stable"
license = ("https://raw.githubusercontent.com/KDAB/KDDockWidgets/master/LICENSES/GPL-2.0-only.txt",

View File

@@ -1,3 +1,9 @@
kddockwidgets (1.7.0) release candidate; urgency=high
* 1.7.0 final
-- Allen Winter <allen.winter@kdab.com> Wed, 03 May 2023 15:00:00 -0500
kddockwidgets (1.6.0) release candidate; urgency=high
* 1.6.0 final

View File

@@ -1,10 +1,10 @@
Format: 1.0
Source: kddockwidgets
Version: 1.6.0-1
Version: 1.7.0-1
Binary: kddockwidgets
Maintainer: Allen Winter <allen.winter@kdab.com>
Architecture: any
Build-Depends: debhelper (>=9), cdbs, cmake, qtbase5-dev, qtbase5-private-dev, libqt5x11extras5-dev, libfontconfig-dev, libfreetype-dev
Files:
00000000000000000000000000000000 00000 qt5-kddockwidgets-1.6.0.tar.gz
00000000000000000000000000000000 00000 qt5-kddockwidgets-1.7.0.tar.gz

View File

@@ -1,5 +1,5 @@
Name: qt5-kddockwidgets
Version: 1.6.0
Version: 1.7.0
Release: 1
Summary: KDAB's Dock Widget Framework for Qt5
Source0: %{name}-%{version}.tar.gz
@@ -98,6 +98,8 @@ cmake . -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release
%{_libdir}/libkddockwidgets.so
%changelog
* Wed May 03 2023 Allen Winter <allen.winter@kdab.com> 1.7.0
1.7.0 final
* Wed Sep 14 2022 Allen Winter <allen.winter@kdab.com> 1.6.0
1.6.0 final
* Mon Nov 24 2021 Allen Winter <allen.winter@kdab.com> 1.5.0

View File

@@ -1,10 +1,10 @@
Format: 1.0
Source: kddockwidgets
Version: 1.6.0-1
Version: 1.7.0-1
Binary: kddockwidgets
Maintainer: Allen Winter <allen.winter@kdab.com>
Architecture: any
Build-Depends: debhelper (>=9), cdbs, cmake, qt6-base-dev, qt6-base-private-dev, libgl1-mesa-dev, libfontconfig-dev, libfreetype-dev
Files:
00000000000000000000000000000000 00000 qt6-kddockwidgets-1.6.0.tar.gz
00000000000000000000000000000000 00000 qt6-kddockwidgets-1.7.0.tar.gz

View File

@@ -1,5 +1,5 @@
Name: qt6-kddockwidgets
Version: 1.6.0
Version: 1.7.0
Release: 1
Summary: KDAB's Dock Widget Framework for Qt6
Source0: %{name}-%{version}.tar.gz
@@ -92,6 +92,8 @@ cmake . -DCMAKE_INSTALL_PREFIX=/usr -DKDDockWidgets_QT6=True -DCMAKE_BUILD_TYPE=
%{_libdir}/libkddockwidgets-qt6.so
%changelog
* Wed May 03 2023 Allen Winter <allen.winter@kdab.com> 1.7.0
1.7.0 final
* Wed Sep 14 2022 Allen Winter <allen.winter@kdab.com> 1.6.0
1.6.0 final
* Mon Nov 24 2021 Allen Winter <allen.winter@kdab.com> 1.5.0

View File

@@ -121,6 +121,9 @@ MyMainWindow::MyMainWindow(const QString &uniqueName, KDDockWidgets::MainWindowO
if (options & KDDockWidgets::MainWindowOption_HasCentralWidget) {
setPersistentCentralWidget(new MyWidget1());
}
// optional, just for demo purposes regarding pressing Ctrl key to hide drop indicators
qApp->installEventFilter(this);
}
MyMainWindow::~MyMainWindow()
@@ -210,3 +213,26 @@ KDDockWidgets::DockWidgetBase *MyMainWindow::newDockWidget()
count++;
return dock;
}
bool MyMainWindow::eventFilter(QObject *obj, QEvent *ev)
{
// This event filter is just for examplify how to use the KDDW API to hide
// the drag indicators when ctrl is pressed
switch (ev->type()) {
case QEvent::KeyPress:
case QEvent::KeyRelease: {
auto kev = static_cast<QKeyEvent *>(ev);
if (kev->key() == Qt::Key_Control && qobject_cast<QWindow *>(obj)) {
const bool hideIndicators = ev->type() == QEvent::KeyPress;
KDDockWidgets::Config::self().setDropIndicatorsInhibited(hideIndicators);
}
}
break;
default:
break;
}
return KDDockWidgets::MainWindow::eventFilter(obj, ev);
}

View File

@@ -27,6 +27,7 @@ public:
private:
void createDockWidgets();
bool eventFilter(QObject *obj, QEvent *ev) override;
KDDockWidgets::DockWidgetBase *newDockWidget();
QMenu *m_toggleMenu = nullptr;
const bool m_dockWidget0IsNonClosable;

View File

@@ -32,11 +32,21 @@ find_package(Shiboken${PYSIDE_MAJOR_VERSION} REQUIRED)
find_package(PySide${PYSIDE_MAJOR_VERSION} ${QtWidgets_VERSION} EXACT REQUIRED)
if(NOT ${PROJECT_NAME}_PYTHON_BINDINGS_INSTALL_PREFIX)
set(${PROJECT_NAME}_PYTHON_BINDINGS_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
# cmake-lint: disable=C0103
set(${PROJECT_NAME}_PYTHON_BINDINGS_INSTALL_PREFIX
${INSTALL_LIBRARY_DIR}
CACHE FILEPATH "Custom path to install python bindings."
)
if(NOT WIN32)
set(Python3_VERSION_MAJORMINOR "${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}")
set(BINDINGS_DIR "python${Python3_VERSION_MAJORMINOR}/site-packages/${PYTHON_BINDING_NAMESPACE}")
else()
set(BINDINGS_DIR "site-packages/${PYTHON_BINDING_NAMESPACE}")
endif()
set(${PROJECT_NAME}_PYTHON_BINDINGS_INSTALL_PREFIX
"${${PROJECT_NAME}_PYTHON_BINDINGS_INSTALL_PREFIX}/${BINDINGS_DIR}"
)
endif()
set(Python3_VERSION_MAJORMINOR "${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}")
set(BINDINGS_DIR "${INSTALL_LIBRARY_DIR}/python${Python3_VERSION_MAJORMINOR}/site-packages/${PYTHON_BINDING_NAMESPACE}")
set(${PROJECT_NAME}_PYTHON_BINDINGS_INSTALL_PREFIX "${${PROJECT_NAME}_PYTHON_BINDINGS_INSTALL_PREFIX}/${BINDINGS_DIR}")
include(KDPySide${PYSIDE_MAJOR_VERSION}ModuleBuild)
add_subdirectory(PyKDDockWidgets)

View File

@@ -88,17 +88,17 @@ class MyMainWindow(KDDockWidgets.MainWindow):
# pylint: disable=no-self-use
def _saveLayout(self):
#saver = KDDockWidgets.LayoutSaver()
#result = saver.saveToFile("mylayout.json")
#print("Saving layout to disk. Result=", result)
# saver = KDDockWidgets.LayoutSaver()
# result = saver.saveToFile("mylayout.json")
# print("Saving layout to disk. Result=", result)
print("Not available")
# pylint: disable=no-self-use
def _restoreLayout(self):
#options = KDDockWidgets.RestoreOption_None
# options = KDDockWidgets.RestoreOption_None
# if self.restoreIsRelative:
# options |= KDDockWidgets.RestoreOption_RelativeToMainWindow
#saver = KDDockWidgets.LayoutSaver(options)
# saver = KDDockWidgets.LayoutSaver(options)
# saver.restoreFromFile("mylayout.json")
print("Not available")

View File

@@ -88,17 +88,17 @@ class MyMainWindow(KDDockWidgets.MainWindow):
# pylint: disable=no-self-use
def _saveLayout(self):
#saver = KDDockWidgets.LayoutSaver()
#result = saver.saveToFile("mylayout.json")
#print("Saving layout to disk. Result=", result)
# saver = KDDockWidgets.LayoutSaver()
# result = saver.saveToFile("mylayout.json")
# print("Saving layout to disk. Result=", result)
print("Not available")
# pylint: disable=no-self-use
def _restoreLayout(self):
#options = KDDockWidgets.RestoreOption_None
# options = KDDockWidgets.RestoreOption_None
# if self.restoreIsRelative:
# options |= KDDockWidgets.RestoreOption_RelativeToMainWindow
#saver = KDDockWidgets.LayoutSaver(options)
# saver = KDDockWidgets.LayoutSaver(options)
# saver.restoreFromFile("mylayout.json")
print("Not available")

View File

@@ -318,7 +318,7 @@ elseif(
AND NOT ${PROJECT_NAME}_QT6
AND ${PROJECT_NAME}_X11EXTRAS
)
find_package(Qt${Qt_VERSION_MAJOR}X11Extras)
find_package(Qt${Qt_VERSION_MAJOR}X11Extras CONFIG)
target_link_libraries(kddockwidgets PUBLIC Qt${Qt_VERSION_MAJOR}::X11Extras)
endif()

View File

@@ -356,4 +356,9 @@ bool Config::dropIndicatorsInhibited() const
return d->m_dropIndicatorsInhibited;
}
void Config::printDebug()
{
qDebug() << "Flags: " << d->m_flags << d->m_internalFlags;
}
}

View File

@@ -317,6 +317,9 @@ public:
void setMDIPopupThreshold(int);
int mdiPopupThreshold() const;
/// Prints some debug information
void printDebug();
#ifdef KDDOCKWIDGETS_QTQUICK
///@brief Sets the QQmlEngine to use. Applicable only when using QtQuick.
void setQmlEngine(QQmlEngine *);

View File

@@ -370,7 +370,7 @@ public:
* @brief Returns whether this dock widget is docked into a main window (as opposed to floating)
*
* Note that isFloating() returning false might either mean the dock widget is docked into a
* main window or into a floating window (groupped/nested with other dock widgets. Use this function
* main window or into a floating window (grouped/nested with other dock widgets. Use this function
* then if you need to disambiguate
*/
bool isInMainWindow() const;

View File

@@ -21,8 +21,6 @@
#include "private/Utils_p.h"
#include "private/TabWidget_p.h"
#include <QScopeGuard>
#ifdef KDDOCKWIDGETS_QTWIDGETS
#include "private/widgets/FrameWidget_p.h"
#include "private/widgets/TitleBarWidget_p.h"
@@ -242,8 +240,8 @@ QUrl DefaultWidgetFactory::floatingWindowFilename() const
QIcon DefaultWidgetFactory::iconForButtonType(TitleBarButtonType type, qreal dpr) const
{
auto key = std::make_pair(type, dpr);
auto it = m_cachedIcons.find(key);
if (it != m_cachedIcons.end())
auto it = m_cachedIcons.constFind(key);
if (it != m_cachedIcons.cend())
return *it;
QString iconName;
@@ -277,12 +275,11 @@ QIcon DefaultWidgetFactory::iconForButtonType(TitleBarButtonType type, qreal dpr
QIcon icon(QStringLiteral(":/img/%1.png").arg(iconName));
auto atScopeEnd = qScopeGuard([&icon, this, key] {
m_cachedIcons.insert(key, icon);
});
if (!scalingFactorIsSupported(dpr))
if (!scalingFactorIsSupported(dpr)) {
m_cachedIcons.insert(key, icon);
return icon;
}
// Not using Qt's sugar syntax, which doesn't support 1.5x anyway when we need it.
// Simply add the high-res files and Qt will pick them when needed
@@ -291,6 +288,7 @@ QIcon DefaultWidgetFactory::iconForButtonType(TitleBarButtonType type, qreal dpr
icon.addFile(QStringLiteral(":/img/%1-1.5x.png").arg(iconName));
icon.addFile(QStringLiteral(":/img/%1-2x.png").arg(iconName));
m_cachedIcons.insert(key, icon);
return icon;
}

View File

@@ -182,8 +182,9 @@ private:
enum RestoreOption {
RestoreOption_None = 0,
RestoreOption_RelativeToMainWindow = 1, ///< Skips restoring the main window geometry and the restored dock widgets will use relative sizing.
///< Loading layouts won't change the main window geometry and just use whatever the user has at the moment.
RestoreOption_RelativeToMainWindow = 1 << 0, ///< Skips restoring the main window geometry and the restored dock widgets will use relative sizing.
///< Loading layouts won't change the main window geometry and just use whatever the user has at the moment.
RestoreOption_AbsoluteFloatingDockWindows = 1 << 1, ///< Skips scaling of floating dock windows relative to the main window.
};
Q_DECLARE_FLAGS(RestoreOptions, RestoreOption)
Q_ENUM_NS(RestoreOptions)

View File

@@ -66,15 +66,22 @@ LayoutSaver::Layout *LayoutSaver::Layout::s_currentLayoutBeingRestored = nullptr
inline InternalRestoreOptions internalRestoreOptions(RestoreOptions options)
{
if (options == RestoreOption_None) {
return InternalRestoreOption::None;
} else if (options == RestoreOption_RelativeToMainWindow) {
return InternalRestoreOptions(InternalRestoreOption::SkipMainWindowGeometry)
| InternalRestoreOption::RelativeFloatingWindowGeometry;
} else {
qWarning() << Q_FUNC_INFO << "Unknown options" << options;
return {};
InternalRestoreOptions ret = {};
if (options.testFlag(RestoreOption_RelativeToMainWindow)) {
ret.setFlag(InternalRestoreOption::SkipMainWindowGeometry);
ret.setFlag(InternalRestoreOption::RelativeFloatingWindowGeometry);
options.setFlag(RestoreOption_RelativeToMainWindow, false);
}
if (options.testFlag(RestoreOption_AbsoluteFloatingDockWindows)) {
ret.setFlag(InternalRestoreOption::RelativeFloatingWindowGeometry, false);
options.setFlag(RestoreOption_AbsoluteFloatingDockWindows, false);
}
if (options != RestoreOption_None) {
qWarning() << Q_FUNC_INFO << "Unknown options" << options;
}
return ret;
}
bool LayoutSaver::Private::s_restoreInProgress = false;
@@ -831,7 +838,7 @@ void LayoutSaver::FloatingWindow::fromVariantMap(const QVariantMap &map)
geometry = Layouting::mapToRect(map.value(QStringLiteral("geometry")).toMap());
normalGeometry = Layouting::mapToRect(map.value(QStringLiteral("normalGeometry")).toMap());
screenIndex = map.value(QStringLiteral("screenIndex")).toInt();
flags = map.value(QStringLiteral("flags")).toInt();
flags = map.value(QStringLiteral("flags"), int(FloatingWindowFlag::FromGlobalConfig)).toInt();
screenSize = Layouting::mapToSize(map.value(QStringLiteral("screenSize")).toMap());
isVisible = map.value(QStringLiteral("isVisible")).toBool();
affinities = variantToStringList(map.value(QStringLiteral("affinities")).toList());

View File

@@ -106,6 +106,11 @@ MainWindow::MainWindow(const QString &name, MainWindowOptions options,
d->m_layout->addWidget(layoutWidget());
}
}
void MainWindow::postInit(QWidget *parent, Qt::WindowFlags flags)
{
setCentralWidget(d->m_centralWidget);
const bool isWindow = !parent || (flags & Qt::Window);

View File

@@ -48,6 +48,9 @@ public:
explicit MainWindow(const QString &uniqueName, MainWindowOptions options = MainWindowOption_None,
QWidget *parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags());
void postInit(QWidget *parent, Qt::WindowFlags flags = Qt::WindowFlags());
///@brief Destructor
~MainWindow() override;

View File

@@ -553,8 +553,8 @@ void MainWindowBase::overlayOnSideBar(DockWidgetBase *dw)
d->m_overlayedDockWidget = dw;
frame->addWidget(dw);
d->updateOverlayGeometry(dw->d->lastPosition()->lastOverlayedGeometry(sb->location()).size());
connect(frame, &QWidgetAdapter::widgetGeometryChanged, this, [dw, loc = sb->location(), frame] {
dw->d->lastPosition()->setLastOverlayedGeometry(loc, frame->QWidgetAdapter::geometry());
connect(frame, &QWidgetAdapter::widgetGeometryChanged, this, [dw, sb, frame] {
dw->d->lastPosition()->setLastOverlayedGeometry(sb->location(), frame->QWidgetAdapter::geometry());
});
frame->setAllowedResizeSides(d->allowedResizeSides(sb->location()));

View File

@@ -476,7 +476,7 @@ bool DockRegistry::isSane() const
names.insert(name);
}
if (!mainwindow->multiSplitter()->checkSanity())
if (!mainwindow->layoutWidget()->checkSanity())
return false;
}
@@ -684,7 +684,7 @@ void DockRegistry::clear(const DockWidgetBase::List &dockWidgets,
for (auto mw : qAsConst(mainWindows)) {
if (affinities.isEmpty() || affinitiesMatch(affinities, mw->affinities())) {
mw->multiSplitter()->clearLayout();
mw->layoutWidget()->clearLayout();
}
}
}

View File

@@ -173,7 +173,7 @@ public:
*
* @param dumpDebug If true then each layout is dumped too
*
* This is called by the unit-tests or the fuzzer. If during this the framework spits a
* This is called by the unit-tests. If during this the framework spits a
* qWarning() then the app will qFatal()
*/
void checkSanityAll(bool dumpDebug = false);

View File

@@ -106,6 +106,9 @@ public:
/// Experimental, internal, not for general use.
void enableFallbackMouseGrabber();
// Returns the active state
StateBase *activeState() const;
Q_SIGNALS:
void mousePressed();
void manhattanLengthMove();
@@ -128,7 +131,6 @@ private:
friend class StateDraggingWayland;
DragController(QObject * = nullptr);
StateBase *activeState() const;
WidgetType *qtTopLevelUnderCursor() const;
Draggable *draggableForQObject(QObject *o) const;
QPoint m_pressPos;

View File

@@ -31,10 +31,14 @@ DropIndicatorOverlayInterface::DropIndicatorOverlayInterface(DropArea *dropArea)
connect(DockRegistry::self(), &DockRegistry::dropIndicatorsInhibitedChanged, this,
[this](bool inhibited) {
if (inhibited)
if (inhibited) {
removeHover();
// if false then simply moving the mouse will make the drop indicators appear again
} else {
// Re-add hover. Fastest way is simply faking a mouse move
if (auto state = qobject_cast<StateDragging *>(DragController::instance()->activeState())) {
state->handleMouseMove(QCursor::pos());
}
}
});
}

View File

@@ -807,3 +807,8 @@ bool FloatingWindow::isUtilityWindow() const
const bool dontUse = (m_flags & FloatingWindowFlag::DontUseParentForFloatingWindows) && (m_flags & FloatingWindowFlag::UseQtWindow);
return !dontUse;
}
FloatingWindowFlags FloatingWindow::floatingWindowFlags() const
{
return m_flags;
}

View File

@@ -233,6 +233,9 @@ public:
/// @brief Returns whether this floating window supports showing a maximize button
bool supportsMaximizeButton() const;
/// Returns the per-floating window flags
FloatingWindowFlags floatingWindowFlags() const;
Q_SIGNALS:
void activatedChanged();
void numFramesChanged();

View File

@@ -173,10 +173,11 @@ LayoutSaver::Position Position::serialize() const
Layouting::Item *item = itemRef->item;
LayoutWidget *layout = DockRegistry::self()->layoutForItem(item);
Q_ASSERT(layout);
const auto itemIndex = layout->items().indexOf(item);
auto fw = layout->floatingWindow();
auto mainWindow = layout->mainWindow();
auto mainWindow = layout->mainWindow(/*honourNesting=*/true);
Q_ASSERT(mainWindow || fw);
p.isFloatingWindow = fw;

View File

@@ -33,7 +33,7 @@ TitleBar::TitleBar(Frame *parent)
, m_frame(parent)
, m_floatingWindow(nullptr)
, m_genericWidget(nullptr)
, m_supportsAutoHide(Config::self().flags() & Config::Flag_AutoHideSupport)
, m_supportsAutoHide((Config::self().flags() & Config::Flag_AutoHideSupport) == Config::Flag_AutoHideSupport)
{
connect(m_frame, &Frame::numDockWidgetsChanged, this, &TitleBar::updateCloseButton);
connect(m_frame, &Frame::isFocusedChanged, this, &TitleBar::isFocusedChanged);
@@ -51,7 +51,7 @@ TitleBar::TitleBar(FloatingWindow *parent)
, m_frame(nullptr)
, m_floatingWindow(parent)
, m_genericWidget(nullptr)
, m_supportsAutoHide(Config::self().flags() & Config::Flag_AutoHideSupport)
, m_supportsAutoHide((Config::self().flags() & Config::Flag_AutoHideSupport) == Config::Flag_AutoHideSupport)
{
connect(m_floatingWindow, &FloatingWindow::numFramesChanged, this, &TitleBar::updateButtons);
connect(m_floatingWindow, &FloatingWindow::windowStateChanged, this, &TitleBar::updateMaximizeButton);

View File

@@ -369,6 +369,7 @@ bool WidgetResizeHandler::handleWindowsNativeEvent(QWindow *w, MSG *msg,
const int borderWidth = 8;
const bool hasFixedWidth = w->minimumWidth() == w->maximumWidth();
const bool hasFixedHeight = w->minimumHeight() == w->maximumHeight();
const bool hasFixedWidthOrHeight = hasFixedWidth || hasFixedHeight;
*result = 0;
const int xPos = GET_X_LPARAM(msg->lParam);
@@ -376,13 +377,13 @@ bool WidgetResizeHandler::handleWindowsNativeEvent(QWindow *w, MSG *msg,
RECT rect;
GetWindowRect(reinterpret_cast<HWND>(w->winId()), &rect);
if (xPos >= rect.left && xPos <= rect.left + borderWidth && yPos <= rect.bottom && yPos >= rect.bottom - borderWidth && features.hasResize()) {
if (!hasFixedWidthOrHeight && xPos >= rect.left && xPos <= rect.left + borderWidth && yPos <= rect.bottom && yPos >= rect.bottom - borderWidth && features.hasResize()) {
*result = HTBOTTOMLEFT;
} else if (xPos < rect.right && xPos >= rect.right - borderWidth && yPos <= rect.bottom && yPos >= rect.bottom - borderWidth && features.hasResize()) {
} else if (!hasFixedWidthOrHeight && xPos < rect.right && xPos >= rect.right - borderWidth && yPos <= rect.bottom && yPos >= rect.bottom - borderWidth && features.hasResize()) {
*result = HTBOTTOMRIGHT;
} else if (xPos >= rect.left && xPos <= rect.left + borderWidth && yPos >= rect.top && yPos <= rect.top + borderWidth && features.hasResize()) {
} else if (!hasFixedWidthOrHeight && xPos >= rect.left && xPos <= rect.left + borderWidth && yPos >= rect.top && yPos <= rect.top + borderWidth && features.hasResize()) {
*result = HTTOPLEFT;
} else if (xPos <= rect.right && xPos >= rect.right - borderWidth && yPos >= rect.top && yPos < rect.top + borderWidth && features.hasResize()) {
} else if (!hasFixedWidthOrHeight && xPos <= rect.right && xPos >= rect.right - borderWidth && yPos >= rect.top && yPos < rect.top + borderWidth && features.hasResize()) {
*result = HTTOPRIGHT;
} else if (!hasFixedWidth && xPos >= rect.left && xPos <= rect.left + borderWidth && features.hasResize()) {
*result = HTLEFT;

View File

@@ -96,7 +96,7 @@ WindowBeingDragged::~WindowBeingDragged()
{
grabMouse(false);
if (!isWayland()) { // Wayland doesn't support setting opacity
if (!isWayland() && m_floatingWindow) { // Wayland doesn't support setting opacity
// Restore opacity to fully opaque if needed
const qreal opacity = Config::self().draggedWindowOpacity();
if (!qIsNaN(opacity) && !qFuzzyCompare(1.0, opacity))

View File

@@ -9,10 +9,6 @@
# Contact KDAB at <info@kdab.com> for commercial licensing options.
#
# Tests:
# 1. tst_docks - The KDDockWidge tests. Compatible with QtWidgets and QtQuick.
# 2. tests_launcher - helper executable to paralelize the execution of tests
if(POLICY CMP0043)
cmake_policy(SET CMP0043 NEW)
endif()
@@ -29,8 +25,6 @@ add_definitions(-DQT_NO_KEYWORDS)
set(TESTING_SRCS utils.cpp Testing.cpp)
option(KDDockWidgets_FUZZER "Builds the fuzzer" ON)
# tst_docks
set(TESTING_RESOURCES ${CMAKE_CURRENT_SOURCE_DIR}/test_resources.qrc)
add_executable(
@@ -46,16 +40,4 @@ if(NOT ${PROJECT_NAME}_QTQUICK)
add_executable(tst_multisplitter tst_multisplitter.cpp)
target_link_libraries(tst_multisplitter kddockwidgets Qt${Qt_VERSION_MAJOR}::Test)
set_compiler_flags(tst_multisplitter)
if(KDDockWidgets_FUZZER)
add_subdirectory(fuzzer)
endif()
endif()
# tests_launcher
add_executable(
tests_launcher
tests_launcher.cpp
)
target_link_libraries(
tests_launcher Qt${Qt_VERSION_MAJOR}::Core
)

File diff suppressed because it is too large Load Diff

View File

@@ -1,21 +0,0 @@
#
# This file is part of KDDockWidgets.
#
# SPDX-FileCopyrightText: 2019-2023 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
# Author: Sergio Martins <sergio.martins@kdab.com>
#
# SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only
#
# Contact KDAB at <info@kdab.com> for commercial licensing options.
#
add_executable(
fuzzer
../Testing.cpp Fuzzer.cpp main.cpp Operations.cpp
)
set_property(TARGET fuzzer PROPERTY CXX_STANDARD 17)
target_link_libraries(
fuzzer kddockwidgets Qt${Qt_VERSION_MAJOR}::Widgets Qt${Qt_VERSION_MAJOR}::Test
)
set_compiler_flags(fuzzer)

View File

@@ -1,404 +0,0 @@
/*
This file is part of KDDockWidgets.
SPDX-FileCopyrightText: 2019-2023 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
Author: Sérgio Martins <sergio.martins@kdab.com>
SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only
Contact KDAB at <info@kdab.com> for commercial licensing options.
*/
// We don't care about performance related checks in the tests
// clazy:excludeall=ctor-missing-parent-argument,missing-qobject-macro,range-loop,missing-typeinfo,detaching-member,function-args-by-ref,non-pod-global-static,reserve-candidates,qstring-allocations
#include "Fuzzer.h"
#include "DockRegistry_p.h"
#include "DockWidget.h"
#include "MainWindow.h"
#include "FloatingWindow_p.h"
#include <QJsonDocument>
#include <QString>
#include <QTest>
using namespace KDDockWidgets;
using namespace KDDockWidgets::Testing;
using namespace KDDockWidgets::Testing::Operations;
#define OPERATIONS_PER_TEST 200
static MainWindow *createMainWindow(const Fuzzer::MainWindowDescriptor &mwd)
{
auto mainWindow = new MainWindow(mwd.name, mwd.mainWindowOption);
mainWindow->setGeometry(mwd.geometry);
mainWindow->show();
return mainWindow;
}
static DockWidget *createDockWidget(const Fuzzer::DockWidgetDescriptor &dwd)
{
auto dockWidget = new DockWidget(dwd.name);
dockWidget->setWidget(new Testing::HostedWidget(dwd.minSize));
if (dwd.isFloating)
dockWidget->setGeometry(dwd.geometry);
if (dwd.isVisible)
dockWidget->show();
return dockWidget;
}
static void createLayout(const Fuzzer::Layout &layout)
{
for (const Fuzzer::MainWindowDescriptor &mwd : layout.mainWindows) {
createMainWindow(mwd);
}
for (const Fuzzer::DockWidgetDescriptor &dwd : layout.dockWidgets) {
createDockWidget(dwd);
}
}
void Fuzzer::runTest(const Test &test)
{
m_lastSavedLayout.clear();
m_currentTest = test;
if (!DockRegistry::self()->isEmpty())
qFatal("There's dock widgets and the start runTest");
const bool skipsLast = m_options & Option_SkipLast;
createLayout(test.initialLayout);
int index = 0;
auto operations = test.operations;
auto last = operations.last();
if (skipsLast)
operations.removeLast();
for (const auto &op : operations) {
index++;
#if 0
// Uncomment to set a breakpoint! Check the last good index printed in the terminal
if (index == 82) {
qDebug() << "About to run the bad guy. Layout:";
DockRegistry::self()->checkSanityAll(/*dumpDebug=*/true);
qDebug() << "Running the bad guy:";
}
#endif
op->execute();
if (op->hasParams())
qDebug() << "Ran" << op->description() << index;
QTest::qWait(m_operationDelayMS);
DockRegistry::self()->checkSanityAll();
}
if (skipsLast)
qDebug() << "Skipped" << last->toString() << "\n";
const bool willQuit = !(m_options & Option_NoQuit);
if (willQuit) {
for (MainWindowBase *mw : DockRegistry::self()->mainwindows())
delete mw;
for (FloatingWindow *fw : DockRegistry::self()->floatingWindows())
delete fw;
for (DockWidgetBase *dw : DockRegistry::self()->dockwidgets())
delete dw;
if (!DockRegistry::self()->isEmpty())
qFatal("There's still dock widgets and the end of runTest");
}
}
Fuzzer::Fuzzer(bool dumpJsonOnFailure, Options options, QObject *parent)
: QObject(parent)
, m_randomEngine(m_randomDevice())
, m_dumpJsonOnFailure(dumpJsonOnFailure)
, m_options(options)
{
Testing::installFatalMessageHandler();
Testing::setWarningObserver(this);
}
Fuzzer::Layout Fuzzer::generateRandomLayout()
{
// for now we only support 1 main window
Fuzzer::Layout layout;
Fuzzer::MainWindowDescriptor mainWindow;
static int count = 0;
count++;
mainWindow.name = QStringLiteral("MainWindow-%1").arg(count);
mainWindow.geometry = randomGeometry();
mainWindow.mainWindowOption = MainWindowOption_None; // TODO: Maybe test other options
layout.mainWindows << mainWindow;
std::uniform_int_distribution<> numDocksDistrib(1, 10); // TODO: Increase
const int numDockWidgets = numDocksDistrib(m_randomEngine);
for (int i = 0; i < numDockWidgets; ++i) {
layout.dockWidgets << generateRandomDockWidget();
}
return layout;
}
Fuzzer::DockWidgetDescriptor Fuzzer::generateRandomDockWidget()
{
Fuzzer::DockWidgetDescriptor dwd;
static int count = 0;
count++;
dwd.name = QStringLiteral("DockWidget-%1").arg(count);
dwd.isFloating = getRandomBool(35);
dwd.isVisible = getRandomBool(70);
std::uniform_int_distribution<> minSizeDistriv(150, 600);
dwd.minSize.setWidth(minSizeDistriv(m_randomEngine));
dwd.minSize.setHeight(minSizeDistriv(m_randomEngine));
const bool hasMaxSize = getRandomBool(25); // 25% of all dock widgets have a max-size
if (hasMaxSize) {
std::uniform_int_distribution<> maxSizeDistriv(200, 600);
dwd.maxSize.setWidth(dwd.minSize.width() + minSizeDistriv(m_randomEngine));
dwd.maxSize.setHeight(dwd.minSize.height() + minSizeDistriv(m_randomEngine));
}
QPoint pos = getRandomPos();
std::uniform_int_distribution<> widthDistrib(dwd.minSize.width(), hasMaxSize ? dwd.maxSize.width() : dwd.minSize.width() + 600);
std::uniform_int_distribution<> heightDistrib(dwd.minSize.height(), hasMaxSize ? dwd.maxSize.height() : dwd.minSize.height() + 600);
dwd.geometry = QRect(pos, QSize(widthDistrib(m_randomEngine), heightDistrib(m_randomEngine)));
return dwd;
}
Fuzzer::DockWidgetDescriptor::List Fuzzer::generateRandomDockWidgets(int num)
{
Fuzzer::DockWidgetDescriptor::List dockWidgets;
for (int i = 0; i < num; ++i) {
dockWidgets << generateRandomDockWidget();
}
return dockWidgets;
}
bool Fuzzer::getRandomBool(int truePercentage)
{
std::uniform_int_distribution<> distrib(1, 100);
return distrib(m_randomEngine) < truePercentage;
}
Testing::AddDockWidgetParams Fuzzer::getRandomAddDockWidgetParams()
{
AddDockWidgetParams params;
if (auto dw = getRandomDockWidget()) {
params.dockWidgetName = dw->uniqueName();
} else {
qWarning() << Q_FUNC_INFO << "No dock widgets exist yet!";
return {};
}
if (auto mw = getRandomMainWindow()) {
params.mainWindowName = mw->uniqueName();
} else {
qWarning() << Q_FUNC_INFO << "No main widgets exist yet!";
return {};
}
if (getRandomBool()) {
if (auto rt = getRandomRelativeTo(params.mainWindow(), params.dockWidget())) {
params.relativeToName = rt->uniqueName();
}
}
params.location = getRandomLocation();
params.addingOption = InitialVisibilityOption::StartVisible; // TODO: Test the other ones
return params;
}
MainWindowBase *Fuzzer::getRandomMainWindow()
{
auto windows = DockRegistry::self()->mainwindows();
if (windows.isEmpty()) {
qWarning() << Q_FUNC_INFO << "No MainWindows exist yet!";
return nullptr;
}
return windows.first();
}
DockWidgetBase *Fuzzer::getRandomDockWidget(const DockWidgetBase::List &excluding)
{
auto docks = DockRegistry::self()->dockwidgets();
for (auto dw : excluding)
docks.removeOne(dw);
if (docks.isEmpty())
return nullptr;
std::uniform_int_distribution<> locationDistrib(0, docks.size() - 1);
return docks[locationDistrib(m_randomEngine)];
}
DockWidgetBase *Fuzzer::getRandomRelativeTo(MainWindowBase *mainWindow, DockWidgetBase *excluding)
{
auto docks = DockRegistry::self()->dockwidgets();
DockWidgetBase::List candidates;
for (DockWidgetBase *dw : docks) {
if (dw != excluding && dw->window() == mainWindow)
candidates << dw;
}
if (candidates.isEmpty())
return nullptr;
std::uniform_int_distribution<> locationDistrib(0, candidates.size() - 1);
return candidates[locationDistrib(m_randomEngine)];
}
Location Fuzzer::getRandomLocation()
{
std::uniform_int_distribution<> locationDistrib(1, 4);
return Location(locationDistrib(m_randomEngine));
}
QPoint Fuzzer::getRandomPos()
{
std::uniform_int_distribution<> posDistrib(0, 500);
const int x = posDistrib(m_randomEngine);
const int y = posDistrib(m_randomEngine);
return { x, y };
}
OperationBase::Ptr Fuzzer::getRandomOperation()
{
std::uniform_int_distribution<> operationDistrib(OperationType_None + 1, OperationType_Count - 1);
auto operationType = OperationType(operationDistrib(m_randomEngine));
return OperationBase::newOperation(this, operationType);
}
Fuzzer::Test Fuzzer::generateRandomTest()
{
Fuzzer::Test test;
test.initialLayout = generateRandomLayout();
const int numOperationsPerTest = OPERATIONS_PER_TEST;
test.operations.reserve(numOperationsPerTest);
for (int i = 0; i < numOperationsPerTest; ++i)
test.operations << getRandomOperation();
return test;
}
Fuzzer::Test::List Fuzzer::generateRandomTests(int num)
{
Fuzzer::Test::List tests;
for (int i = 0; i < num; ++i) {
tests << generateRandomTest();
}
return tests;
}
void Fuzzer::fuzz(FuzzerConfig config)
{
const Fuzzer::Test::List tests = generateRandomTests(config.numTests);
qDebug().noquote() << "Running" << QString("%1 tests...").arg(tests.size());
for (const auto &test : tests) {
runTest(test);
}
}
void Fuzzer::fuzz(const QStringList &jsonFiles)
{
if (jsonFiles.size() > 1 && (m_options & Option_SkipLast)) {
qFatal("Use -d only when passing a single json file");
}
for (const QString &jsonFile : jsonFiles)
fuzz(jsonFile);
}
void Fuzzer::fuzz(const QString &jsonFile)
{
m_currentJsonFile = jsonFile;
qDebug() << "\n"
<< Q_FUNC_INFO << jsonFile;
QFile file(jsonFile);
if (file.open(QIODevice::ReadOnly)) {
QJsonDocument doc = QJsonDocument::fromJson(file.readAll());
const QVariantMap map = doc.toVariant().toMap();
Test test = Test::fromVariantMap(this, map);
runTest(test);
} else {
qWarning() << Q_FUNC_INFO << "Failed to open file" << jsonFile;
}
}
QRect Fuzzer::randomGeometry()
{
std::uniform_int_distribution<> posDistrib(0, 500);
std::uniform_int_distribution<> sizeDistrib(700, 1500);
const int width = posDistrib(m_randomEngine);
const int height = sizeDistrib(m_randomEngine);
QPoint pos = getRandomPos();
return QRect(pos, QSize(width, height));
}
void Fuzzer::onFatal()
{
if (m_dumpJsonOnFailure) {
// Tests failed! Let's dump
m_currentTest.dumpToJsonFile("fuzzer_dump.json");
}
if (!m_currentJsonFile.isEmpty()) {
qDebug() << "failed json: " << m_currentJsonFile;
}
}
void Fuzzer::setDelayBetweenOperations(int delay)
{
m_operationDelayMS = delay;
}
QByteArray Fuzzer::lastSavedLayout() const
{
return m_lastSavedLayout;
}
void Fuzzer::setLastSavedLayout(const QByteArray &serialized)
{
m_lastSavedLayout = serialized;
}
void Fuzzer::Test::dumpToJsonFile(const QString &filename) const
{
const QVariantMap map = toVariantMap();
QJsonDocument jsonDoc = QJsonDocument::fromVariant(map);
QFile file(filename);
if (file.open(QIODevice::WriteOnly)) {
file.write(jsonDoc.toJson());
} else {
qDebug() << Q_FUNC_INFO << "Error opening file";
}
file.close();
}

View File

@@ -1,283 +0,0 @@
/*
This file is part of KDDockWidgets.
SPDX-FileCopyrightText: 2019-2023 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
Author: Sérgio Martins <sergio.martins@kdab.com>
SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only
Contact KDAB at <info@kdab.com> for commercial licensing options.
*/
// We don't care about performance related checks in the tests
// clazy:excludeall=ctor-missing-parent-argument,missing-qobject-macro,range-loop,missing-typeinfo,detaching-member,function-args-by-ref,non-pod-global-static,reserve-candidates,qstring-allocations
#ifndef KDDOCKWIDGETS_FUZZER_H
#define KDDOCKWIDGETS_FUZZER_H
#include "../Testing.h"
#include "MainWindowBase.h"
#include "Operations.h"
#include <QJsonDocument>
#include <QVector>
#include <random>
namespace KDDockWidgets {
namespace Testing {
static QVariantMap sizeToVariantMap(QSize sz)
{
QVariantMap map;
map["width"] = sz.width();
map["height"] = sz.height();
return map;
}
static QVariantMap rectToVariantMap(QRect r)
{
QVariantMap map;
map["size"] = sizeToVariantMap(r.size());
map["x"] = r.x();
map["y"] = r.y();
return map;
}
static QSize sizeFromVariantMap(const QVariantMap &map)
{
return { map["width"].toInt(), map["height"].toInt() };
}
static QRect rectFromVariantMap(const QVariantMap &map)
{
const QSize sz = sizeFromVariantMap(map["size"].toMap());
return { map["x"].toInt(), map["y"].toInt(), sz.width(), sz.height() };
}
class Fuzzer : public QObject, WarningObserver
{
Q_OBJECT
public:
enum Option {
Option_None = 0,
Option_NoQuit = 1, ///< Don't quit when the tests finish. So we can debug in gammaray
Option_SkipLast = 2 ///< Don't execute the last test. Useful when the last one is the failing one and we want to inspect the state prior to crash
};
Q_DECLARE_FLAGS(Options, Option)
struct FuzzerConfig
{
int numTests;
int numOperationsPerTest;
bool singleMainWindow;
};
struct DockWidgetDescriptor
{
typedef QVector<DockWidgetDescriptor> List;
QString name;
QSize minSize; // the minSize of the hosted widget
QSize maxSize;
QRect geometry;
bool isFloating;
bool isVisible;
QVariantMap toVariantMap() const
{
QVariantMap map;
map[QStringLiteral("name")] = name;
map[QStringLiteral("minSize")] = sizeToVariantMap(minSize);
map[QStringLiteral("maxSize")] = sizeToVariantMap(maxSize);
map[QStringLiteral("geometry")] = rectToVariantMap(geometry);
map[QStringLiteral("isFloating")] = isFloating;
map[QStringLiteral("isVisible")] = isVisible;
return map;
}
static DockWidgetDescriptor fromVariantMap(const QVariantMap &map)
{
DockWidgetDescriptor dock;
dock.name = map["name"].toString();
dock.minSize = sizeFromVariantMap(map["minSize"].toMap());
dock.maxSize = sizeFromVariantMap(map["maxSize"].toMap());
dock.geometry = rectFromVariantMap(map["geometry"].toMap());
dock.isFloating = map["isFloating"].toBool();
dock.isVisible = map["isVisible"].toBool();
return dock;
}
};
struct MainWindowDescriptor
{
typedef QVector<MainWindowDescriptor> List;
QString name;
QRect geometry;
MainWindowOption mainWindowOption;
QVariantMap toVariantMap() const
{
QVariantMap map;
map[QStringLiteral("name")] = name;
map[QStringLiteral("geometry")] = rectToVariantMap(geometry);
map[QStringLiteral("mainWindowOption")] = mainWindowOption;
return map;
}
static MainWindowDescriptor fromVariantMap(const QVariantMap &map)
{
MainWindowDescriptor mainWindow;
mainWindow.name = map["name"].toString();
mainWindow.mainWindowOption = MainWindowOption(map["mainWindowOption"].toInt());
mainWindow.geometry = rectFromVariantMap(map["geometry"].toMap());
return mainWindow;
}
};
struct Layout
{
typedef QVector<Layout> List;
MainWindowDescriptor::List mainWindows;
DockWidgetDescriptor::List dockWidgets;
QVariantMap toVariantMap() const
{
QVariantList mainWindowsVariant;
mainWindowsVariant.reserve(mainWindows.size());
for (const auto &mw : mainWindows) {
mainWindowsVariant << mw.toVariantMap();
}
QVariantList dockWidgetsVariant;
dockWidgetsVariant.reserve(dockWidgets.size());
for (const auto &dw : dockWidgets) {
dockWidgetsVariant << dw.toVariantMap();
}
QVariantMap map;
map[QStringLiteral("mainWindows")] = mainWindowsVariant;
map[QStringLiteral("dockWidgets")] = dockWidgetsVariant;
return map;
}
static Layout fromVariantMap(const QVariantMap &map)
{
Layout l;
const QVariantList mainWindows = map["mainWindows"].toList();
const QVariantList dockWidgets = map["dockWidgets"].toList();
l.mainWindows.reserve(mainWindows.size());
for (const QVariant &mainwindow : mainWindows)
l.mainWindows.push_back(MainWindowDescriptor::fromVariantMap(mainwindow.toMap()));
l.dockWidgets.reserve(dockWidgets.size());
for (const QVariant &dockWidget : dockWidgets)
l.dockWidgets.push_back(DockWidgetDescriptor::fromVariantMap(dockWidget.toMap()));
return l;
}
};
struct Test
{
typedef QVector<Test> List;
Layout initialLayout;
Operations::OperationBase::List operations;
void dumpToJsonFile(const QString &filename) const;
QVariantMap toVariantMap() const
{
QVariantMap map;
map[QStringLiteral("initialLayout")] = initialLayout.toVariantMap();
QVariantList operationsVariant;
operationsVariant.reserve(operations.size());
for (const auto &o : operations) {
QVariantMap operationVariant = o->toVariantMap();
if (operationVariant.isEmpty())
continue;
operationsVariant << operationVariant;
}
map[QStringLiteral("operations")] = operationsVariant;
return map;
}
static Test fromVariantMap(Fuzzer *fuzzer, const QVariantMap &map)
{
Test t;
t.initialLayout = Layout::fromVariantMap(map["initialLayout"].toMap());
const QVariantList operations = map["operations"].toList();
t.operations.reserve(operations.size());
for (const QVariant &operation : operations)
t.operations.push_back(Operations::OperationBase::fromVariantMap(fuzzer, operation.toMap()));
return t;
}
};
void runTest(const Test &);
explicit Fuzzer(bool dumpJsonOnFailure, Options, QObject *parent = nullptr);
Fuzzer::Layout generateRandomLayout();
Fuzzer::DockWidgetDescriptor generateRandomDockWidget();
Fuzzer::DockWidgetDescriptor::List generateRandomDockWidgets(int num);
bool getRandomBool(int truePercentage = 50);
Testing::AddDockWidgetParams getRandomAddDockWidgetParams();
KDDockWidgets::MainWindowBase *getRandomMainWindow();
KDDockWidgets::DockWidgetBase *getRandomDockWidget(const DockWidgetBase::List &excluding = {});
KDDockWidgets::DockWidgetBase *getRandomRelativeTo(MainWindowBase *mainWindow,
DockWidgetBase *excluding);
KDDockWidgets::Location getRandomLocation();
QPoint getRandomPos();
Operations::OperationBase::Ptr getRandomOperation();
Fuzzer::Test generateRandomTest();
Fuzzer::Test::List generateRandomTests(int num);
void fuzz(FuzzerConfig config);
void fuzz(const QStringList &jsonFiles);
void fuzz(const QString &json);
QRect randomGeometry();
void onFatal() override;
void setDelayBetweenOperations(int delay);
QByteArray lastSavedLayout() const;
void setLastSavedLayout(const QByteArray &serialized);
private:
std::random_device m_randomDevice;
std::mt19937 m_randomEngine;
Fuzzer::Test m_currentTest;
QString m_currentJsonFile;
const bool m_dumpJsonOnFailure;
int m_operationDelayMS = 50;
const Options m_options;
QByteArray m_lastSavedLayout;
};
}
}
#endif

View File

@@ -1,483 +0,0 @@
/*
This file is part of KDDockWidgets.
SPDX-FileCopyrightText: 2019-2023 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
Author: Sérgio Martins <sergio.martins@kdab.com>
SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only
Contact KDAB at <info@kdab.com> for commercial licensing options.
*/
// We don't care about performance related checks in the tests
// clazy:excludeall=ctor-missing-parent-argument,missing-qobject-macro,range-loop,missing-typeinfo,detaching-member,function-args-by-ref,non-pod-global-static,reserve-candidates,qstring-allocations
#include "Operations.h"
#include "../Testing.h"
#include "DockRegistry_p.h"
#include "DockWidgetBase.h"
#include "DockWidgetBase_p.h"
#include "FloatingWindow_p.h"
#include "Frame_p.h"
#include "Fuzzer.h"
#include <QTest>
using namespace KDDockWidgets;
using namespace KDDockWidgets::Testing;
using namespace KDDockWidgets::Testing::Operations;
static QString operationTypeStr(OperationType optype)
{
return QMetaEnum::fromType<OperationType>().valueToKey(optype);
}
OperationBase::OperationBase(KDDockWidgets::Testing::Operations::OperationType type, Fuzzer *fuzzer)
: m_operationType(type)
, m_fuzzer(fuzzer)
{
}
OperationBase::~OperationBase()
{
}
void OperationBase::execute()
{
if (!hasParams())
generateRandomParams();
if (hasParams()) { // Check again, as generateRandomParams() is not guaranteed
updateDescription();
execute_impl();
if (m_sleepMS > 0)
QTest::qWait(m_sleepMS);
}
}
QVariantMap OperationBase::toVariantMap() const
{
const QVariantMap params = paramsToVariantMap();
if (!hasParams())
return {};
QVariantMap map;
map["type"] = m_operationType;
map["params"] = params;
map["comment"] = description();
return map;
}
OperationBase::Ptr OperationBase::fromVariantMap(Fuzzer *fuzzer, const QVariantMap &map)
{
if (!map.contains("type") || !map.contains("params")) {
qDebug() << Q_FUNC_INFO << "Invalid map";
return {};
}
auto operationType = OperationType(map["type"].toInt());
OperationBase::Ptr ptr = OperationBase::newOperation(fuzzer, operationType);
if (ptr) {
const QVariantMap params = map["params"].toMap();
if (params.isEmpty()) {
qDebug() << Q_FUNC_INFO << "Invalid params";
} else {
ptr->fillParamsFromVariantMap(params);
}
if (map.contains("pause"))
ptr->m_sleepMS = map["pause"].toInt();
} else {
qDebug() << Q_FUNC_INFO << "Failed to fill params";
}
return ptr;
}
OperationBase::Ptr OperationBase::newOperation(Fuzzer *fuzzer, OperationType type)
{
OperationBase::Ptr ptr;
switch (type) {
case OperationType_Count:
case OperationType_None:
qDebug() << Q_FUNC_INFO << "Invalid type";
break;
case OperationType_CloseViaDockWidgetAPI:
ptr = OperationBase::Ptr(new CloseViaDockWidgetAPI(fuzzer));
break;
case OperationType_HideViaDockWidgetAPI:
ptr = OperationBase::Ptr(new HideViaDockWidgetAPI(fuzzer));
break;
case OperationType_ShowViaDockWidgetAPI:
ptr = OperationBase::Ptr(new ShowViaDockWidgetAPI(fuzzer));
break;
case OperationType_AddDockWidget:
ptr = OperationBase::Ptr(new AddDockWidget(fuzzer));
break;
case OperationType_AddDockWidgetAsTab:
ptr = OperationBase::Ptr(new AddDockWidgetAsTab(fuzzer));
break;
case OperationType_SaveLayout:
ptr = OperationBase::Ptr(new SaveLayout(fuzzer));
break;
case OperationType_RestoreLayout:
ptr = OperationBase::Ptr(new RestoreLayout(fuzzer));
break;
}
return ptr;
}
QString OperationBase::toString()
{
if (m_description.isEmpty())
updateDescription();
return QStringLiteral("type=%1;description=%2").arg(operationTypeStr(m_operationType), m_description);
}
DockWidgetBase *OperationBase::dockByName(const QString &name) const
{
return DockRegistry::self()->dockByName(name);
}
MainWindowBase *OperationBase::mainWindowByName(const QString &name) const
{
return DockRegistry::self()->mainWindowByName(name);
}
QString OperationBase::dockStr(const QString &name) const
{
if (auto dw = dockByName(name)) {
if (dw->isVisible())
return name;
return QStringLiteral("%1-[hidden]").arg(name);
} else {
return QStringLiteral("null");
}
}
CloseViaDockWidgetAPI::CloseViaDockWidgetAPI(Fuzzer *fuzzer)
: OperationBase(OperationType_CloseViaDockWidgetAPI, fuzzer)
{
}
void CloseViaDockWidgetAPI::generateRandomParams()
{
if (DockWidgetBase *dw = m_fuzzer->getRandomDockWidget())
if (dw->isVisible())
m_dockWidgetName = dw->uniqueName();
}
bool CloseViaDockWidgetAPI::hasParams() const
{
return !m_dockWidgetName.isEmpty();
}
void CloseViaDockWidgetAPI::updateDescription()
{
m_description = QStringLiteral("Closing %1").arg(dockStr(m_dockWidgetName));
}
void CloseViaDockWidgetAPI::execute_impl()
{
DockWidgetBase *dw = dockByName(m_dockWidgetName);
auto fw = dw->floatingWindow();
dw->close();
if (fw && fw->beingDeleted())
Testing::waitForDeleted(fw);
}
QVariantMap CloseViaDockWidgetAPI::paramsToVariantMap() const
{
QVariantMap map;
if (!m_dockWidgetName.isEmpty())
map["dockWidgetName"] = m_dockWidgetName;
return map;
}
void CloseViaDockWidgetAPI::fillParamsFromVariantMap(const QVariantMap &map)
{
m_dockWidgetName = map["dockWidgetName"].toString();
}
HideViaDockWidgetAPI::HideViaDockWidgetAPI(Fuzzer *fuzzer)
: OperationBase(OperationType_HideViaDockWidgetAPI, fuzzer)
{
}
void HideViaDockWidgetAPI::generateRandomParams()
{
if (DockWidgetBase *dw = m_fuzzer->getRandomDockWidget())
if (dw->isVisible())
m_dockWidgetName = dw->uniqueName();
}
bool HideViaDockWidgetAPI::hasParams() const
{
return !m_dockWidgetName.isEmpty();
}
void HideViaDockWidgetAPI::updateDescription()
{
m_description = QStringLiteral("Hiding %1").arg(dockStr(m_dockWidgetName));
}
void HideViaDockWidgetAPI::execute_impl()
{
DockWidgetBase *dw = dockByName(m_dockWidgetName);
if (!dw) {
qDebug() << Q_FUNC_INFO << "not found" << m_dockWidgetName;
Q_ASSERT(false);
}
auto fw = dw->floatingWindow();
dw->close();
if (fw && fw->beingDeleted())
Testing::waitForDeleted(fw);
}
QVariantMap HideViaDockWidgetAPI::paramsToVariantMap() const
{
QVariantMap map;
if (!m_dockWidgetName.isEmpty())
map["dockWidgetName"] = m_dockWidgetName;
return map;
}
void HideViaDockWidgetAPI::fillParamsFromVariantMap(const QVariantMap &map)
{
m_dockWidgetName = map["dockWidgetName"].toString();
}
ShowViaDockWidgetAPI::ShowViaDockWidgetAPI(Fuzzer *fuzzer)
: OperationBase(OperationType_ShowViaDockWidgetAPI, fuzzer)
{
}
void ShowViaDockWidgetAPI::generateRandomParams()
{
if (DockWidgetBase *dw = m_fuzzer->getRandomDockWidget())
if (!dw->isVisible())
m_dockWidgetName = dw->uniqueName();
}
bool ShowViaDockWidgetAPI::hasParams() const
{
return !m_dockWidgetName.isEmpty();
}
void ShowViaDockWidgetAPI::updateDescription()
{
m_description = QStringLiteral("Showing %1").arg(dockStr(m_dockWidgetName));
}
void ShowViaDockWidgetAPI::execute_impl()
{
DockWidgetBase *dw = dockByName(m_dockWidgetName);
dw->show();
}
QVariantMap ShowViaDockWidgetAPI::paramsToVariantMap() const
{
QVariantMap map;
if (!m_dockWidgetName.isEmpty())
map["dockWidgetName"] = m_dockWidgetName;
return map;
}
void ShowViaDockWidgetAPI::fillParamsFromVariantMap(const QVariantMap &map)
{
m_dockWidgetName = map["dockWidgetName"].toString();
}
AddDockWidget::AddDockWidget(Fuzzer *fuzzer)
: OperationBase(OperationType_AddDockWidget, fuzzer)
{
}
void AddDockWidget::generateRandomParams()
{
m_params = m_fuzzer->getRandomAddDockWidgetParams();
}
bool AddDockWidget::hasParams() const
{
return !m_params.isNull();
}
void AddDockWidget::updateDescription()
{
if (m_params.relativeToName.isEmpty())
m_description = QStringLiteral("AddDockWidget %1 to %2").arg(dockStr(m_params.dockWidgetName), KDDockWidgets::locationStr(m_params.location));
else
m_description = QStringLiteral("AddDockWidget %1 to %2, relative to %3").arg(dockStr(m_params.dockWidgetName), KDDockWidgets::locationStr(m_params.location), dockStr(m_params.relativeToName));
}
void AddDockWidget::execute_impl()
{
auto fw = m_params.dockWidget()->floatingWindow();
m_params.mainWindow()->addDockWidget(m_params.dockWidget(), m_params.location,
m_params.relativeTo(), m_params.addingOption);
if (fw && fw->beingDeleted())
Testing::waitForDeleted(fw);
}
QVariantMap AddDockWidget::paramsToVariantMap() const
{
return m_params.isNull() ? QVariantMap()
: m_params.toVariantMap();
}
void AddDockWidget::fillParamsFromVariantMap(const QVariantMap &map)
{
m_params = AddDockWidgetParams::fillFromVariantMap(map);
}
AddDockWidgetAsTab::AddDockWidgetAsTab(Fuzzer *fuzzer)
: OperationBase(OperationType_AddDockWidgetAsTab, fuzzer)
{
}
void AddDockWidgetAsTab::generateRandomParams()
{
DockWidgetBase *dw = m_fuzzer->getRandomDockWidget();
if (!dw)
return;
DockWidgetBase *dw2 = nullptr;
if (auto frame = dw->d->frame()) {
auto toExclude = frame->dockWidgets();
for (auto dockWidget : DockRegistry::self()->dockwidgets()) {
if (dockWidget->window() == dw->window())
toExclude.push_back(dockWidget);
}
dw2 = m_fuzzer->getRandomDockWidget(toExclude);
}
if (!dw2)
return;
m_dockWidgetName = dw->uniqueName();
m_dockWidgetToAddName = dw2->uniqueName();
}
bool AddDockWidgetAsTab::hasParams() const
{
return !m_dockWidgetName.isEmpty() && !m_dockWidgetToAddName.isEmpty();
}
void AddDockWidgetAsTab::updateDescription()
{
m_description = QStringLiteral("AddDockWidgetAsTab %1 onto %2").arg(dockStr(m_dockWidgetToAddName), dockStr(m_dockWidgetName));
}
void AddDockWidgetAsTab::execute_impl()
{
DockWidgetBase *dw = dockByName(m_dockWidgetName);
DockWidgetBase *dw2 = dockByName(m_dockWidgetToAddName);
auto fw = dw2->floatingWindow();
dw->addDockWidgetAsTab(dw2);
if (fw && fw->beingDeleted())
Testing::waitForDeleted(fw);
}
QVariantMap AddDockWidgetAsTab::paramsToVariantMap() const
{
QVariantMap map;
if (hasParams()) {
map["dockWidgetName"] = m_dockWidgetName;
map["dockWidgetToAddName"] = m_dockWidgetToAddName;
}
return map;
}
void AddDockWidgetAsTab::fillParamsFromVariantMap(const QVariantMap &map)
{
m_dockWidgetName = map["dockWidgetName"].toString();
m_dockWidgetToAddName = map["dockWidgetToAddName"].toString();
}
SaveLayout::SaveLayout(Fuzzer *fuzzer)
: OperationBase(OperationType_SaveLayout, fuzzer)
{
}
bool SaveLayout::hasParams() const
{
return true;
}
void SaveLayout::updateDescription()
{
m_description = QStringLiteral("SaveLayout");
}
void SaveLayout::execute_impl()
{
LayoutSaver saver;
m_fuzzer->setLastSavedLayout(saver.serializeLayout());
qDebug() << m_fuzzer << m_fuzzer->lastSavedLayout().isEmpty();
}
void SaveLayout::generateRandomParams()
{
}
QVariantMap SaveLayout::paramsToVariantMap() const
{
return {};
}
void SaveLayout::fillParamsFromVariantMap(const QVariantMap &)
{
}
RestoreLayout::RestoreLayout(Fuzzer *fuzzer)
: OperationBase(OperationType_RestoreLayout, fuzzer)
{
}
bool RestoreLayout::hasParams() const
{
return true;
}
void RestoreLayout::updateDescription()
{
m_description = QStringLiteral("RestoreLayout");
}
void RestoreLayout::execute_impl()
{
QByteArray serialized = m_fuzzer->lastSavedLayout();
if (serialized.isEmpty()) {
qDebug() << "Skipping, nothing to restore";
return;
}
LayoutSaver saver;
saver.restoreLayout(serialized);
}
void RestoreLayout::generateRandomParams()
{
}
QVariantMap RestoreLayout::paramsToVariantMap() const
{
return {};
}
void RestoreLayout::fillParamsFromVariantMap(const QVariantMap &)
{
}

View File

@@ -1,217 +0,0 @@
/*
This file is part of KDDockWidgets.
SPDX-FileCopyrightText: 2019-2023 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
Author: Sérgio Martins <sergio.martins@kdab.com>
SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only
Contact KDAB at <info@kdab.com> for commercial licensing options.
*/
// We don't care about performance related checks in the tests
// clazy:excludeall=ctor-missing-parent-argument,missing-qobject-macro,range-loop,missing-typeinfo,detaching-member,function-args-by-ref,non-pod-global-static,reserve-candidates,qstring-allocations
#ifndef KDDOCKWIDGETS_TESTING_OPERATIONS_H
#define KDDOCKWIDGETS_TESTING_OPERATIONS_H
#include "KDDockWidgets.h"
#include "../Testing.h"
#include <QObject>
#include <QVector>
#include <QMetaEnum>
#include <memory>
namespace KDDockWidgets {
class DockWidgetBase;
class MainWindowBase;
namespace Testing {
class Fuzzer;
namespace Operations {
Q_NAMESPACE
enum OperationType {
OperationType_None = 0,
OperationType_CloseViaDockWidgetAPI, ///< Closing programmatically via DockWidget::close()
OperationType_HideViaDockWidgetAPI, ///< Hiding programmatically via DockWidget::hide()
OperationType_ShowViaDockWidgetAPI, ///< Hiding programmatically via DockWidget::show()
OperationType_AddDockWidget, ///< MainWindow::addDockWidget()
OperationType_AddDockWidgetAsTab, ///< DockWidget::addDockWidgetAsTab()
OperationType_SaveLayout, ///< LayoutSaver::saveLayout()
OperationType_RestoreLayout, ///< LayoutSaver::restoreLayout()
OperationType_Count /// Keep at end
};
Q_ENUM_NS(OperationType)
///@brief Describes a testable action.
class OperationBase
{
Q_DISABLE_COPY(OperationBase)
public:
typedef std::shared_ptr<OperationBase> Ptr;
typedef QVector<OperationBase::Ptr> List;
explicit OperationBase(OperationType, Fuzzer *);
virtual ~OperationBase();
void execute();
QVariantMap toVariantMap() const;
static OperationBase::Ptr fromVariantMap(Fuzzer *fuzzer, const QVariantMap &);
static OperationBase::Ptr newOperation(Fuzzer *fuzzer, OperationType);
OperationType type() const
{
return m_operationType;
}
QString description() const
{
return m_description;
}
virtual void updateDescription() = 0;
virtual bool hasParams() const = 0;
QString toString();
protected:
virtual void execute_impl() = 0;
virtual void generateRandomParams() = 0;
virtual QVariantMap paramsToVariantMap() const = 0;
virtual void fillParamsFromVariantMap(const QVariantMap &) = 0;
DockWidgetBase *dockByName(const QString &) const;
MainWindowBase *mainWindowByName(const QString &) const;
QString dockStr(const QString &name) const;
const OperationType m_operationType;
Fuzzer *const m_fuzzer;
int m_sleepMS = 0;
QString m_description;
};
class CloseViaDockWidgetAPI : public OperationBase
{
Q_DISABLE_COPY(CloseViaDockWidgetAPI)
public:
explicit CloseViaDockWidgetAPI(Fuzzer *);
protected:
void updateDescription() override;
void generateRandomParams() override;
bool hasParams() const override;
void execute_impl() override;
QVariantMap paramsToVariantMap() const override;
void fillParamsFromVariantMap(const QVariantMap &) override;
QString m_dockWidgetName;
};
class HideViaDockWidgetAPI : public OperationBase
{
Q_DISABLE_COPY(HideViaDockWidgetAPI)
public:
explicit HideViaDockWidgetAPI(Fuzzer *);
protected:
void generateRandomParams() override;
bool hasParams() const override;
void updateDescription() override;
void execute_impl() override;
QVariantMap paramsToVariantMap() const override;
void fillParamsFromVariantMap(const QVariantMap &) override;
QString m_dockWidgetName;
};
class ShowViaDockWidgetAPI : public OperationBase
{
Q_DISABLE_COPY(ShowViaDockWidgetAPI)
public:
explicit ShowViaDockWidgetAPI(Fuzzer *);
protected:
void generateRandomParams() override;
bool hasParams() const override;
void updateDescription() override;
void execute_impl() override;
QVariantMap paramsToVariantMap() const override;
void fillParamsFromVariantMap(const QVariantMap &) override;
QString m_dockWidgetName;
};
class AddDockWidget : public OperationBase
{
Q_DISABLE_COPY(AddDockWidget)
public:
explicit AddDockWidget(Fuzzer *);
protected:
void generateRandomParams() override;
bool hasParams() const override;
void updateDescription() override;
void execute_impl() override;
QVariantMap paramsToVariantMap() const override;
void fillParamsFromVariantMap(const QVariantMap &) override;
private:
Testing::AddDockWidgetParams m_params;
};
class AddDockWidgetAsTab : public OperationBase
{
Q_DISABLE_COPY(AddDockWidgetAsTab)
public:
explicit AddDockWidgetAsTab(Fuzzer *);
protected:
void generateRandomParams() override;
bool hasParams() const override;
void updateDescription() override;
void execute_impl() override;
QVariantMap paramsToVariantMap() const override;
void fillParamsFromVariantMap(const QVariantMap &) override;
private:
QString m_dockWidgetName;
QString m_dockWidgetToAddName;
};
class SaveLayout : public OperationBase
{
Q_DISABLE_COPY(SaveLayout)
public:
explicit SaveLayout(Fuzzer *);
protected:
bool hasParams() const override;
void updateDescription() override;
void execute_impl() override;
void generateRandomParams() override;
QVariantMap paramsToVariantMap() const override;
void fillParamsFromVariantMap(const QVariantMap &) override;
};
class RestoreLayout : public OperationBase
{
Q_DISABLE_COPY(RestoreLayout)
public:
explicit RestoreLayout(Fuzzer *);
protected:
bool hasParams() const override;
void updateDescription() override;
void execute_impl() override;
void generateRandomParams() override;
QVariantMap paramsToVariantMap() const override;
void fillParamsFromVariantMap(const QVariantMap &) override;
};
}
}
}
#endif

View File

@@ -1,104 +0,0 @@
/*
This file is part of KDDockWidgets.
SPDX-FileCopyrightText: 2019-2023 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
Author: Sérgio Martins <sergio.martins@kdab.com>
SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only
Contact KDAB at <info@kdab.com> for commercial licensing options.
*/
// We don't care about performance related checks in the tests
// clazy:excludeall=ctor-missing-parent-argument,missing-qobject-macro,range-loop,missing-typeinfo,detaching-member,function-args-by-ref,non-pod-global-static,reserve-candidates,qstring-allocations
#include "Fuzzer.h"
#include "DockRegistry_p.h"
#include "../utils.h"
#include <QCommandLineParser>
#include <QApplication>
#include <QTimer>
#include <QDebug>
#include <QFile>
#include <iostream>
using namespace KDDockWidgets;
using namespace KDDockWidgets::Testing;
int main(int argc, char **argv)
{
if (!qpaPassedAsArgument(argc, argv)) {
// Use offscreen by default as it's less annoying, doesn't create visible windows
qputenv("QT_QPA_PLATFORM", "offscreen");
}
QApplication app(argc, argv);
QCommandLineParser parser;
parser.setApplicationDescription("Fuzzer Help");
parser.addPositionalArgument("json", QCoreApplication::translate("main", "json file to load"));
QCommandLineOption slowDownOption("s", QCoreApplication::translate("main", "Slowdown tests. Adds a 1 second delay between operations"));
parser.addOption(slowDownOption);
QCommandLineOption forceDumpJsonOption("f", QCoreApplication::translate("main", "Dump json of the test even if we're already loading a test."));
parser.addOption(forceDumpJsonOption);
QCommandLineOption loopOption("l", QCoreApplication::translate("main", "Loops until it crashes"));
parser.addOption(loopOption);
QCommandLineOption skipLastOption("a", QCoreApplication::translate("main", "Skips the last test (presumably failing)"));
parser.addOption(skipLastOption);
QCommandLineOption noQuitOption("n", QCoreApplication::translate("main", "Don't quit at the end, keep event loop running for debugging"));
parser.addOption(noQuitOption);
parser.addHelpOption();
parser.process(app);
const bool slowDown = parser.isSet(slowDownOption);
const bool forceDumpJson = parser.isSet(forceDumpJsonOption);
const QStringList filesToLoad = parser.positionalArguments();
const bool dumpToJsonOnFatal = forceDumpJson || filesToLoad.isEmpty();
Fuzzer::Options options = Fuzzer::Option_None;
if (parser.isSet(skipLastOption))
options |= Fuzzer::Option_SkipLast;
if (parser.isSet(noQuitOption))
options |= Fuzzer::Option_NoQuit;
const bool loops = parser.isSet(loopOption);
Fuzzer fuzzer(dumpToJsonOnFatal, options);
if (slowDown)
fuzzer.setDelayBetweenOperations(1000);
for (const QString &file : filesToLoad) {
if (!QFile::exists(file)) {
std::cerr << "\nFile doesn't exist: " << file.toStdString() << "\n";
return 0;
}
}
QTimer::singleShot(0, &fuzzer, [&app, &fuzzer, filesToLoad, loops, options] {
if (filesToLoad.isEmpty()) {
do {
fuzzer.fuzz({ 1, 10, true });
} while (loops);
} else {
fuzzer.fuzz(filesToLoad);
}
if (!(options & Fuzzer::Option_NoQuit)) {
// if noQuit is true we keep the app running so it can be debugged
app.quit();
}
});
app.setQuitOnLastWindowClosed(false);
return app.exec();
}

View File

@@ -1,138 +0,0 @@
{
"initialLayout": {
"dockWidgets": [
{
"geometry": {
"size": {
"height": 593,
"width": 861
},
"x": 55,
"y": 296
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 373,
"width": 344
},
"name": "DockWidget-1"
},
{
"geometry": {
"size": {
"height": 564,
"width": 1097
},
"x": 88,
"y": 430
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 170,
"width": 600
},
"name": "DockWidget-2"
},
{
"geometry": {
"size": {
"height": 350,
"width": 1108
},
"x": 384,
"y": 279
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 295,
"width": 554
},
"name": "DockWidget-3"
},
{
"geometry": {
"size": {
"height": 1040,
"width": 960
},
"x": 325,
"y": 313
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 480,
"width": 565
},
"name": "DockWidget-4"
}
],
"mainWindows": [
{
"geometry": {
"size": {
"height": 961,
"width": 472
},
"x": 232,
"y": 79
},
"mainWindowOption": 0,
"name": "MainWindow-1"
}
]
},
"operations": [
{
"comment": "AddDockWidget DockWidget-2 to right",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-2",
"location": 3,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-4-[hidden] to top",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-4",
"location": 2,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-3 to left, relative to DockWidget-2",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-3",
"location": 1,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-2"
},
"type": 4
},
{
"comment": "Hiding DockWidget-4-[hidden]",
"params": {
"dockWidgetName": "DockWidget-4"
},
"type": 2
},
{
"comment": "AddDockWidget DockWidget-1 to top",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-1",
"location": 2,
"mainWindowName": "MainWindow-1"
},
"type": 4
}
]
}

View File

@@ -1,761 +0,0 @@
{
"initialLayout": {
"dockWidgets": [
{
"geometry": {
"size": {
"height": 773,
"width": 974
},
"x": 199,
"y": 406
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 578,
"width": 440
},
"name": "DockWidget-1"
},
{
"geometry": {
"size": {
"height": 596,
"width": 981
},
"x": 37,
"y": 38
},
"isFloating": false,
"isVisible": false,
"minSize": {
"height": 359,
"width": 436
},
"name": "DockWidget-2"
},
{
"geometry": {
"size": {
"height": 414,
"width": 539
},
"x": 54,
"y": 343
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 216,
"width": 480
},
"name": "DockWidget-3"
},
{
"geometry": {
"size": {
"height": 693,
"width": 878
},
"x": 392,
"y": 369
},
"isFloating": false,
"isVisible": false,
"minSize": {
"height": 283,
"width": 367
},
"name": "DockWidget-4"
}
],
"mainWindows": [
{
"geometry": {
"size": {
"height": 1275,
"width": 119
},
"x": 323,
"y": 257
},
"mainWindowOption": 0,
"name": "MainWindow-1"
}
]
},
"operations": [
{
"comment": "Hiding DockWidget-1",
"params": {
"dockWidgetName": "DockWidget-1"
},
"type": 2
},
{
"comment": "AddDockWidget DockWidget-4-[hidden] to right",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-4",
"location": 3,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-1-[hidden] to top, relative to DockWidget-4",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-1",
"location": 2,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-4"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-2-[hidden] to bottom",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-2",
"location": 4,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidgetAsTab DockWidget-3 onto DockWidget-1",
"params": {
"dockWidgetName": "DockWidget-1",
"dockWidgetToAddName": "DockWidget-3"
},
"type": 5
},
{
"comment": "Closing DockWidget-2",
"params": {
"dockWidgetName": "DockWidget-2"
},
"type": 1
},
{
"comment": "AddDockWidget DockWidget-2-[hidden] to top, relative to DockWidget-1-[hidden]",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-2",
"location": 2,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-1"
},
"type": 4
},
{
"comment": "Hiding DockWidget-4",
"params": {
"dockWidgetName": "DockWidget-4"
},
"type": 2
},
{
"comment": "Showing DockWidget-4-[hidden]",
"params": {
"dockWidgetName": "DockWidget-4"
},
"type": 3
},
{
"comment": "AddDockWidget DockWidget-4 to right, relative to DockWidget-1-[hidden]",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-4",
"location": 3,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-1"
},
"type": 4
},
{
"comment": "Hiding DockWidget-3",
"params": {
"dockWidgetName": "DockWidget-3"
},
"type": 2
},
{
"comment": "Closing DockWidget-2",
"params": {
"dockWidgetName": "DockWidget-2"
},
"type": 1
},
{
"comment": "Hiding DockWidget-4",
"params": {
"dockWidgetName": "DockWidget-4"
},
"type": 2
},
{
"comment": "Showing DockWidget-3-[hidden]",
"params": {
"dockWidgetName": "DockWidget-3"
},
"type": 3
},
{
"comment": "AddDockWidget DockWidget-3 to left, relative to DockWidget-1-[hidden]",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-3",
"location": 1,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-4-[hidden] to top, relative to DockWidget-1",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-4",
"location": 2,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-1"
},
"type": 4
},
{
"comment": "Closing DockWidget-4",
"params": {
"dockWidgetName": "DockWidget-4"
},
"type": 1
},
{
"comment": "Hiding DockWidget-3",
"params": {
"dockWidgetName": "DockWidget-3"
},
"type": 2
},
{
"comment": "Closing DockWidget-1",
"params": {
"dockWidgetName": "DockWidget-1"
},
"type": 1
},
{
"comment": "AddDockWidget DockWidget-4-[hidden] to left",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-4",
"location": 1,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "Hiding DockWidget-4",
"params": {
"dockWidgetName": "DockWidget-4"
},
"type": 2
},
{
"comment": "Showing DockWidget-4-[hidden]",
"params": {
"dockWidgetName": "DockWidget-4"
},
"type": 3
},
{
"comment": "AddDockWidget DockWidget-1-[hidden] to left",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-1",
"location": 1,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "Showing DockWidget-3-[hidden]",
"params": {
"dockWidgetName": "DockWidget-3"
},
"type": 3
},
{
"comment": "Hiding DockWidget-3",
"params": {
"dockWidgetName": "DockWidget-3"
},
"type": 2
},
{
"comment": "Showing DockWidget-2-[hidden]",
"params": {
"dockWidgetName": "DockWidget-2"
},
"type": 3
},
{
"comment": "Closing DockWidget-2",
"params": {
"dockWidgetName": "DockWidget-2"
},
"type": 1
},
{
"comment": "Hiding DockWidget-1",
"params": {
"dockWidgetName": "DockWidget-1"
},
"type": 2
},
{
"comment": "AddDockWidget DockWidget-3-[hidden] to right, relative to DockWidget-4",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-3",
"location": 3,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-4"
},
"type": 4
},
{
"comment": "Showing DockWidget-1-[hidden]",
"params": {
"dockWidgetName": "DockWidget-1"
},
"type": 3
},
{
"comment": "AddDockWidget DockWidget-1 to bottom, relative to DockWidget-4",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-1",
"location": 4,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-4"
},
"type": 4
},
{
"comment": "AddDockWidgetAsTab DockWidget-2-[hidden] onto DockWidget-3",
"params": {
"dockWidgetName": "DockWidget-3",
"dockWidgetToAddName": "DockWidget-2"
},
"type": 5
},
{
"comment": "AddDockWidget DockWidget-3-[hidden] to right, relative to DockWidget-1",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-3",
"location": 3,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-2 to bottom",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-2",
"location": 4,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "Hiding DockWidget-4",
"params": {
"dockWidgetName": "DockWidget-4"
},
"type": 2
},
{
"comment": "Closing DockWidget-3",
"params": {
"dockWidgetName": "DockWidget-3"
},
"type": 1
},
{
"comment": "Closing DockWidget-1",
"params": {
"dockWidgetName": "DockWidget-1"
},
"type": 1
},
{
"comment": "Closing DockWidget-2",
"params": {
"dockWidgetName": "DockWidget-2"
},
"type": 1
},
{
"comment": "AddDockWidget DockWidget-2-[hidden] to right",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-2",
"location": 3,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-1-[hidden] to bottom",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-1",
"location": 4,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "Showing DockWidget-3-[hidden]",
"params": {
"dockWidgetName": "DockWidget-3"
},
"type": 3
},
{
"comment": "AddDockWidget DockWidget-1 to bottom, relative to DockWidget-2",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-1",
"location": 4,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-2"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-1 to bottom",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-1",
"location": 4,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidgetAsTab DockWidget-4-[hidden] onto DockWidget-3",
"params": {
"dockWidgetName": "DockWidget-3",
"dockWidgetToAddName": "DockWidget-4"
},
"type": 5
},
{
"comment": "AddDockWidget DockWidget-4 to top, relative to DockWidget-3-[hidden]",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-4",
"location": 2,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-3"
},
"type": 4
},
{
"comment": "Closing DockWidget-3",
"params": {
"dockWidgetName": "DockWidget-3"
},
"type": 1
},
{
"comment": "Closing DockWidget-2",
"params": {
"dockWidgetName": "DockWidget-2"
},
"type": 1
},
{
"comment": "Closing DockWidget-4",
"params": {
"dockWidgetName": "DockWidget-4"
},
"type": 1
},
{
"comment": "AddDockWidgetAsTab DockWidget-3-[hidden] onto DockWidget-1",
"params": {
"dockWidgetName": "DockWidget-1",
"dockWidgetToAddName": "DockWidget-3"
},
"type": 5
},
{
"comment": "Hiding DockWidget-3",
"params": {
"dockWidgetName": "DockWidget-3"
},
"type": 2
},
{
"comment": "AddDockWidgetAsTab DockWidget-4-[hidden] onto DockWidget-1",
"params": {
"dockWidgetName": "DockWidget-1",
"dockWidgetToAddName": "DockWidget-4"
},
"type": 5
},
{
"comment": "Showing DockWidget-2-[hidden]",
"params": {
"dockWidgetName": "DockWidget-2"
},
"type": 3
},
{
"comment": "Closing DockWidget-4",
"params": {
"dockWidgetName": "DockWidget-4"
},
"type": 1
},
{
"comment": "AddDockWidget DockWidget-3-[hidden] to top, relative to DockWidget-1",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-3",
"location": 2,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-1"
},
"type": 4
},
{
"comment": "Closing DockWidget-1",
"params": {
"dockWidgetName": "DockWidget-1"
},
"type": 1
},
{
"comment": "Closing DockWidget-3",
"params": {
"dockWidgetName": "DockWidget-3"
},
"type": 1
},
{
"comment": "Showing DockWidget-3-[hidden]",
"params": {
"dockWidgetName": "DockWidget-3"
},
"type": 3
},
{
"comment": "AddDockWidget DockWidget-3 to left, relative to DockWidget-2",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-3",
"location": 1,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-2"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-4-[hidden] to bottom",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-4",
"location": 4,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-1-[hidden] to bottom",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-1",
"location": 4,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "Hiding DockWidget-2",
"params": {
"dockWidgetName": "DockWidget-2"
},
"type": 2
},
{
"comment": "AddDockWidget DockWidget-2-[hidden] to bottom, relative to DockWidget-1",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-2",
"location": 4,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-1"
},
"type": 4
},
{
"comment": "Hiding DockWidget-2",
"params": {
"dockWidgetName": "DockWidget-2"
},
"type": 2
},
{
"comment": "Hiding DockWidget-3",
"params": {
"dockWidgetName": "DockWidget-3"
},
"type": 2
},
{
"comment": "Hiding DockWidget-1",
"params": {
"dockWidgetName": "DockWidget-1"
},
"type": 2
},
{
"comment": "AddDockWidget DockWidget-2-[hidden] to top",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-2",
"location": 2,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "Hiding DockWidget-4",
"params": {
"dockWidgetName": "DockWidget-4"
},
"type": 2
},
{
"comment": "AddDockWidget DockWidget-3-[hidden] to right, relative to DockWidget-2",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-3",
"location": 3,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-2"
},
"type": 4
},
{
"comment": "Closing DockWidget-2",
"params": {
"dockWidgetName": "DockWidget-2"
},
"type": 1
},
{
"comment": "Closing DockWidget-3",
"params": {
"dockWidgetName": "DockWidget-3"
},
"type": 1
},
{
"comment": "Showing DockWidget-1-[hidden]",
"params": {
"dockWidgetName": "DockWidget-1"
},
"type": 3
},
{
"comment": "AddDockWidgetAsTab DockWidget-4-[hidden] onto DockWidget-1",
"params": {
"dockWidgetName": "DockWidget-1",
"dockWidgetToAddName": "DockWidget-4"
},
"type": 5
},
{
"comment": "Showing DockWidget-2-[hidden]",
"params": {
"dockWidgetName": "DockWidget-2"
},
"type": 3
},
{
"comment": "AddDockWidgetAsTab DockWidget-3-[hidden] onto DockWidget-4",
"params": {
"dockWidgetName": "DockWidget-4",
"dockWidgetToAddName": "DockWidget-3"
},
"type": 5
},
{
"comment": "Closing DockWidget-2",
"params": {
"dockWidgetName": "DockWidget-2"
},
"type": 1
},
{
"comment": "Showing DockWidget-2-[hidden]",
"params": {
"dockWidgetName": "DockWidget-2"
},
"type": 3
},
{
"comment": "Closing DockWidget-2",
"params": {
"dockWidgetName": "DockWidget-2"
},
"type": 1
},
{
"comment": "Hiding DockWidget-3",
"params": {
"dockWidgetName": "DockWidget-3"
},
"type": 2
},
{
"comment": "AddDockWidget DockWidget-1-[hidden] to top, relative to DockWidget-4",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-1",
"location": 2,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-4"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-3-[hidden] to top",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-3",
"location": 2,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidgetAsTab DockWidget-2-[hidden] onto DockWidget-1",
"params": {
"dockWidgetName": "DockWidget-1",
"dockWidgetToAddName": "DockWidget-2"
},
"type": 5
}
]
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,312 +0,0 @@
{
"initialLayout": {
"dockWidgets": [
{
"geometry": {
"size": {
"height": 1070,
"width": 853
},
"x": 190,
"y": 86
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 490,
"width": 346
},
"name": "DockWidget-1"
},
{
"geometry": {
"size": {
"height": 642,
"width": 724
},
"x": 24,
"y": 397
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 371,
"width": 373
},
"name": "DockWidget-2"
},
{
"geometry": {
"size": {
"height": 615,
"width": 990
},
"x": 82,
"y": 295
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 436,
"width": 533
},
"name": "DockWidget-3"
},
{
"geometry": {
"size": {
"height": 302,
"width": 937
},
"x": 276,
"y": 437
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 211,
"width": 363
},
"name": "DockWidget-4"
},
{
"geometry": {
"size": {
"height": 867,
"width": 1159
},
"x": 66,
"y": 339
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 587,
"width": 570
},
"name": "DockWidget-5"
},
{
"geometry": {
"size": {
"height": 552,
"width": 604
},
"x": 9,
"y": 442
},
"isFloating": false,
"isVisible": false,
"minSize": {
"height": 427,
"width": 152
},
"name": "DockWidget-6"
},
{
"geometry": {
"size": {
"height": 706,
"width": 561
},
"x": 397,
"y": 194
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 486,
"width": 388
},
"name": "DockWidget-7"
},
{
"geometry": {
"size": {
"height": 612,
"width": 807
},
"x": 180,
"y": 243
},
"isFloating": false,
"isVisible": false,
"minSize": {
"height": 164,
"width": 502
},
"name": "DockWidget-8"
},
{
"geometry": {
"size": {
"height": 286,
"width": 549
},
"x": 448,
"y": 180
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 217,
"width": 408
},
"name": "DockWidget-9"
}
],
"mainWindows": [
{
"geometry": {
"size": {
"height": 1047,
"width": 315
},
"x": 372,
"y": 487
},
"mainWindowOption": 0,
"name": "MainWindow-1"
}
]
},
"operations": [
{
"comment": "AddDockWidget DockWidget-6 to left",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-6",
"location": 1,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-4-[hidden] to top",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-4",
"location": 2,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-3 to bottom, relative to DockWidget-4",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-3",
"location": 4,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-4"
},
"type": 4
},
{
"comment": "Showing DockWidget-8-[hidden]",
"params": {
"dockWidgetName": "DockWidget-8"
},
"type": 3
},
{
"comment": "AddDockWidget DockWidget-1 to right",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-1",
"location": 3,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidgetAsTab DockWidget-5 onto DockWidget-6",
"params": {
"dockWidgetName": "DockWidget-6",
"dockWidgetToAddName": "DockWidget-5"
},
"type": 5
},
{
"comment": "AddDockWidget DockWidget-8-[hidden] to bottom, relative to DockWidget-1",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-8",
"location": 4,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-2-[hidden] to top",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-2",
"location": 2,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "Closing DockWidget-3",
"params": {
"dockWidgetName": "DockWidget-3"
},
"type": 1
},
{
"comment": "AddDockWidget DockWidget-6-[hidden] to right",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-6",
"location": 3,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "Closing DockWidget-6",
"params": {
"dockWidgetName": "DockWidget-6"
},
"type": 1
},
{
"comment": "AddDockWidget DockWidget-1 to right",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-1",
"location": 3,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "Hiding DockWidget-5",
"params": {
"dockWidgetName": "DockWidget-5"
},
"type": 2
},
{
"comment": "AddDockWidget DockWidget-4-[hidden] to left, relative to DockWidget-1",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-4",
"location": 1,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-1"
},
"type": 4
},
{
"comment": "Closing DockWidget-8",
"params": {
"dockWidgetName": "DockWidget-8"
},
"type": 1
}
]
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,599 +0,0 @@
{
"initialLayout": {
"dockWidgets": [
{
"geometry": {
"size": {
"height": 732,
"width": 504
},
"x": 386,
"y": 208
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 539,
"width": 267
},
"name": "DockWidget-1"
},
{
"geometry": {
"size": {
"height": 986,
"width": 633
},
"x": 334,
"y": 215
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 414,
"width": 352
},
"name": "DockWidget-2"
},
{
"geometry": {
"size": {
"height": 447,
"width": 474
},
"x": 387,
"y": 414
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 182,
"width": 394
},
"name": "DockWidget-3"
},
{
"geometry": {
"size": {
"height": 403,
"width": 579
},
"x": 468,
"y": 374
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 165,
"width": 168
},
"name": "DockWidget-4"
},
{
"geometry": {
"size": {
"height": 689,
"width": 784
},
"x": 252,
"y": 482
},
"isFloating": true,
"isVisible": false,
"minSize": {
"height": 178,
"width": 500
},
"name": "DockWidget-5"
},
{
"geometry": {
"size": {
"height": 724,
"width": 701
},
"x": 368,
"y": 225
},
"isFloating": false,
"isVisible": false,
"minSize": {
"height": 155,
"width": 276
},
"name": "DockWidget-6"
},
{
"geometry": {
"size": {
"height": 410,
"width": 627
},
"x": 223,
"y": 121
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 335,
"width": 524
},
"name": "DockWidget-7"
},
{
"geometry": {
"size": {
"height": 734,
"width": 984
},
"x": 17,
"y": 390
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 196,
"width": 480
},
"name": "DockWidget-8"
},
{
"geometry": {
"size": {
"height": 455,
"width": 589
},
"x": 47,
"y": 134
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 225,
"width": 290
},
"name": "DockWidget-9"
},
{
"geometry": {
"size": {
"height": 847,
"width": 739
},
"x": 155,
"y": 331
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 504,
"width": 184
},
"name": "DockWidget-10"
}
],
"mainWindows": [
{
"geometry": {
"size": {
"height": 1350,
"width": 288
},
"x": 336,
"y": 411
},
"mainWindowOption": 0,
"name": "MainWindow-1"
}
]
},
"operations": [
{
"comment": "Closing DockWidget-3",
"params": {
"dockWidgetName": "DockWidget-3"
},
"type": 1
},
{
"comment": "AddDockWidget DockWidget-6-[hidden] to left",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-6",
"location": 1,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "Hiding DockWidget-4",
"params": {
"dockWidgetName": "DockWidget-4"
},
"type": 2
},
{
"comment": "AddDockWidgetAsTab DockWidget-3-[hidden] onto DockWidget-8",
"params": {
"dockWidgetName": "DockWidget-8",
"dockWidgetToAddName": "DockWidget-3"
},
"type": 5
},
{
"comment": "AddDockWidget DockWidget-8-[hidden] to right",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-8",
"location": 3,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-5-[hidden] to top, relative to DockWidget-6",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-5",
"location": 2,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-6"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-2 to top",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-2",
"location": 2,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "Hiding DockWidget-3",
"params": {
"dockWidgetName": "DockWidget-3"
},
"type": 2
},
{
"comment": "Closing DockWidget-7",
"params": {
"dockWidgetName": "DockWidget-7"
},
"type": 1
},
{
"comment": "AddDockWidgetAsTab DockWidget-1 onto DockWidget-10",
"params": {
"dockWidgetName": "DockWidget-10",
"dockWidgetToAddName": "DockWidget-1"
},
"type": 5
},
{
"comment": "Closing DockWidget-9",
"params": {
"dockWidgetName": "DockWidget-9"
},
"type": 1
},
{
"comment": "AddDockWidget DockWidget-9-[hidden] to left",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-9",
"location": 1,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-7-[hidden] to left, relative to DockWidget-8",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-7",
"location": 1,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-8"
},
"type": 4
},
{
"comment": "Closing DockWidget-9",
"params": {
"dockWidgetName": "DockWidget-9"
},
"type": 1
},
{
"comment": "Hiding DockWidget-1",
"params": {
"dockWidgetName": "DockWidget-1"
},
"type": 2
},
{
"comment": "Closing DockWidget-6",
"params": {
"dockWidgetName": "DockWidget-6"
},
"type": 1
},
{
"comment": "Hiding DockWidget-8",
"params": {
"dockWidgetName": "DockWidget-8"
},
"type": 2
},
{
"comment": "Showing DockWidget-1-[hidden]",
"params": {
"dockWidgetName": "DockWidget-1"
},
"type": 3
},
{
"comment": "Hiding DockWidget-2",
"params": {
"dockWidgetName": "DockWidget-2"
},
"type": 2
},
{
"comment": "AddDockWidget DockWidget-5 to right",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-5",
"location": 3,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidgetAsTab DockWidget-5 onto DockWidget-1",
"params": {
"dockWidgetName": "DockWidget-1",
"dockWidgetToAddName": "DockWidget-5"
},
"type": 5
},
{
"comment": "AddDockWidgetAsTab DockWidget-7 onto DockWidget-1-[hidden]",
"params": {
"dockWidgetName": "DockWidget-1",
"dockWidgetToAddName": "DockWidget-7"
},
"type": 5
},
{
"comment": "Showing DockWidget-3-[hidden]",
"params": {
"dockWidgetName": "DockWidget-3"
},
"type": 3
},
{
"comment": "AddDockWidget DockWidget-2-[hidden] to right",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-2",
"location": 3,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-4-[hidden] to right, relative to DockWidget-2",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-4",
"location": 3,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-2"
},
"type": 4
},
{
"comment": "Showing DockWidget-6-[hidden]",
"params": {
"dockWidgetName": "DockWidget-6"
},
"type": 3
},
{
"comment": "AddDockWidgetAsTab DockWidget-3 onto DockWidget-7",
"params": {
"dockWidgetName": "DockWidget-7",
"dockWidgetToAddName": "DockWidget-3"
},
"type": 5
},
{
"comment": "Closing DockWidget-10",
"params": {
"dockWidgetName": "DockWidget-10"
},
"type": 1
},
{
"comment": "AddDockWidget DockWidget-8-[hidden] to top, relative to DockWidget-2",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-8",
"location": 2,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-2"
},
"type": 4
},
{
"comment": "AddDockWidgetAsTab DockWidget-7-[hidden] onto DockWidget-8",
"params": {
"dockWidgetName": "DockWidget-8",
"dockWidgetToAddName": "DockWidget-7"
},
"type": 5
},
{
"comment": "AddDockWidget DockWidget-9-[hidden] to top",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-9",
"location": 2,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidgetAsTab DockWidget-3 onto DockWidget-2",
"params": {
"dockWidgetName": "DockWidget-2",
"dockWidgetToAddName": "DockWidget-3"
},
"type": 5
},
{
"comment": "AddDockWidget DockWidget-6 to left, relative to DockWidget-8-[hidden]",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-6",
"location": 1,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-8"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-8-[hidden] to top",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-8",
"location": 2,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidgetAsTab DockWidget-8 onto DockWidget-5",
"params": {
"dockWidgetName": "DockWidget-5",
"dockWidgetToAddName": "DockWidget-8"
},
"type": 5
},
{
"comment": "AddDockWidgetAsTab DockWidget-8 onto DockWidget-2-[hidden]",
"params": {
"dockWidgetName": "DockWidget-2",
"dockWidgetToAddName": "DockWidget-8"
},
"type": 5
},
{
"comment": "AddDockWidgetAsTab DockWidget-5 onto DockWidget-9",
"params": {
"dockWidgetName": "DockWidget-9",
"dockWidgetToAddName": "DockWidget-5"
},
"type": 5
},
{
"comment": "Closing DockWidget-1",
"params": {
"dockWidgetName": "DockWidget-1"
},
"type": 1
},
{
"comment": "Hiding DockWidget-7",
"params": {
"dockWidgetName": "DockWidget-7"
},
"type": 2
},
{
"comment": "AddDockWidgetAsTab DockWidget-1-[hidden] onto DockWidget-4",
"params": {
"dockWidgetName": "DockWidget-4",
"dockWidgetToAddName": "DockWidget-1"
},
"type": 5
},
{
"comment": "Showing DockWidget-3-[hidden]",
"params": {
"dockWidgetName": "DockWidget-3"
},
"type": 3
},
{
"comment": "Closing DockWidget-3",
"params": {
"dockWidgetName": "DockWidget-3"
},
"type": 1
},
{
"comment": "AddDockWidgetAsTab DockWidget-10-[hidden] onto DockWidget-5",
"params": {
"dockWidgetName": "DockWidget-5",
"dockWidgetToAddName": "DockWidget-10"
},
"type": 5
},
{
"comment": "AddDockWidget DockWidget-5-[hidden] to right, relative to DockWidget-9-[hidden]",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-5",
"location": 3,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-9"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-5 to right, relative to DockWidget-6",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-5",
"location": 3,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-6"
},
"type": 4
},
{
"comment": "Closing DockWidget-10",
"params": {
"dockWidgetName": "DockWidget-10"
},
"type": 1
},
{
"comment": "Showing DockWidget-2-[hidden]",
"params": {
"dockWidgetName": "DockWidget-2"
},
"type": 3
},
{
"comment": "Hiding DockWidget-2",
"params": {
"dockWidgetName": "DockWidget-2"
},
"type": 2
},
{
"comment": "Showing DockWidget-7-[hidden]",
"params": {
"dockWidgetName": "DockWidget-7"
},
"type": 3
}
]
}

View File

@@ -1,364 +0,0 @@
{
"initialLayout": {
"dockWidgets": [
{
"geometry": {
"size": {
"height": 1050,
"width": 873
},
"x": 389,
"y": 359
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 539,
"width": 599
},
"name": "DockWidget-47"
},
{
"geometry": {
"size": {
"height": 767,
"width": 1008
},
"x": 483,
"y": 478
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 415,
"width": 502
},
"name": "DockWidget-48"
},
{
"geometry": {
"size": {
"height": 347,
"width": 802
},
"x": 168,
"y": 291
},
"isFloating": true,
"isVisible": false,
"minSize": {
"height": 252,
"width": 248
},
"name": "DockWidget-49"
},
{
"geometry": {
"size": {
"height": 514,
"width": 750
},
"x": 77,
"y": 43
},
"isFloating": false,
"isVisible": false,
"minSize": {
"height": 165,
"width": 580
},
"name": "DockWidget-50"
},
{
"geometry": {
"size": {
"height": 777,
"width": 635
},
"x": 392,
"y": 37
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 548,
"width": 558
},
"name": "DockWidget-51"
},
{
"geometry": {
"size": {
"height": 803,
"width": 526
},
"x": 409,
"y": 109
},
"isFloating": true,
"isVisible": false,
"minSize": {
"height": 288,
"width": 205
},
"name": "DockWidget-52"
},
{
"geometry": {
"size": {
"height": 925,
"width": 1044
},
"x": 175,
"y": 159
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 531,
"width": 508
},
"name": "DockWidget-53"
},
{
"geometry": {
"size": {
"height": 1003,
"width": 688
},
"x": 384,
"y": 293
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 564,
"width": 170
},
"name": "DockWidget-54"
}
],
"mainWindows": [
{
"geometry": {
"size": {
"height": 965,
"width": 337
},
"x": 445,
"y": 485
},
"mainWindowOption": 0,
"name": "MainWindow-9"
}
]
},
"operations": [
{
"comment": "AddDockWidget DockWidget-49-[hidden] to top",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-49",
"location": 2,
"mainWindowName": "MainWindow-9"
},
"type": 4
},
{
"comment": "AddDockWidgetAsTab DockWidget-51-[hidden] onto DockWidget-53-[hidden]",
"params": {
"dockWidgetName": "DockWidget-53",
"dockWidgetToAddName": "DockWidget-51"
},
"type": 5
},
{
"comment": "Showing DockWidget-49-[hidden]",
"params": {
"dockWidgetName": "DockWidget-49"
},
"type": 3
},
{
"comment": "Closing DockWidget-49",
"params": {
"dockWidgetName": "DockWidget-49"
},
"type": 1
},
{
"comment": "AddDockWidget DockWidget-48-[hidden] to bottom",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-48",
"location": 4,
"mainWindowName": "MainWindow-9"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-53-[hidden] to bottom",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-53",
"location": 4,
"mainWindowName": "MainWindow-9"
},
"type": 4
},
{
"comment": "Closing DockWidget-51",
"params": {
"dockWidgetName": "DockWidget-51"
},
"type": 1
},
{
"comment": "Showing DockWidget-49-[hidden]",
"params": {
"dockWidgetName": "DockWidget-49"
},
"type": 3
},
{
"comment": "Closing DockWidget-49",
"params": {
"dockWidgetName": "DockWidget-49"
},
"type": 1
},
{
"comment": "Showing DockWidget-52-[hidden]",
"params": {
"dockWidgetName": "DockWidget-52"
},
"type": 3
},
{
"comment": "AddDockWidget DockWidget-54-[hidden] to bottom, relative to DockWidget-48",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-54",
"location": 4,
"mainWindowName": "MainWindow-9",
"relativeToName": "DockWidget-48"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-50-[hidden] to bottom",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-50",
"location": 4,
"mainWindowName": "MainWindow-9"
},
"type": 4
},
{
"comment": "Closing DockWidget-50",
"params": {
"dockWidgetName": "DockWidget-50"
},
"type": 1
},
{
"comment": "AddDockWidgetAsTab DockWidget-48 onto DockWidget-52",
"params": {
"dockWidgetName": "DockWidget-52",
"dockWidgetToAddName": "DockWidget-48"
},
"type": 5
},
{
"comment": "AddDockWidget DockWidget-52-[hidden] to left, relative to DockWidget-53",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-52",
"location": 1,
"mainWindowName": "MainWindow-9",
"relativeToName": "DockWidget-53"
},
"type": 4
},
{
"comment": "Showing DockWidget-50-[hidden]",
"params": {
"dockWidgetName": "DockWidget-50"
},
"type": 3
},
{
"comment": "AddDockWidget DockWidget-53-[hidden] to left, relative to DockWidget-52",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-53",
"location": 1,
"mainWindowName": "MainWindow-9",
"relativeToName": "DockWidget-52"
},
"type": 4
},
{
"comment": "Closing DockWidget-53",
"params": {
"dockWidgetName": "DockWidget-53"
},
"type": 1
},
{
"comment": "Closing DockWidget-52",
"params": {
"dockWidgetName": "DockWidget-52"
},
"type": 1
},
{
"comment": "AddDockWidget DockWidget-47-[hidden] to left, relative to DockWidget-50",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-47",
"location": 1,
"mainWindowName": "MainWindow-9",
"relativeToName": "DockWidget-50"
},
"type": 4
},
{
"comment": "Closing DockWidget-47",
"params": {
"dockWidgetName": "DockWidget-47"
},
"type": 1
},
{
"comment": "Showing DockWidget-48-[hidden]",
"params": {
"dockWidgetName": "DockWidget-48"
},
"type": 3
},
{
"comment": "Showing DockWidget-49-[hidden]",
"params": {
"dockWidgetName": "DockWidget-49"
},
"type": 3
},
{
"comment": "Showing DockWidget-52-[hidden]",
"params": {
"dockWidgetName": "DockWidget-52"
},
"type": 3
},
{
"comment": "AddDockWidgetAsTab DockWidget-47-[hidden] onto DockWidget-49",
"params": {
"dockWidgetName": "DockWidget-49",
"dockWidgetToAddName": "DockWidget-47"
},
"type": 5
}
]
}

View File

@@ -1,212 +0,0 @@
{
"initialLayout": {
"dockWidgets": [
{
"geometry": {
"size": {
"height": 757,
"width": 748
},
"x": 352,
"y": 17
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 302,
"width": 541
},
"name": "DockWidget-1"
},
{
"geometry": {
"size": {
"height": 930,
"width": 1083
},
"x": 64,
"y": 35
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 462,
"width": 553
},
"name": "DockWidget-2"
},
{
"geometry": {
"size": {
"height": 665,
"width": 1031
},
"x": 207,
"y": 178
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 402,
"width": 523
},
"name": "DockWidget-3"
},
{
"geometry": {
"size": {
"height": 525,
"width": 962
},
"x": 118,
"y": 157
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 322,
"width": 460
},
"name": "DockWidget-4"
},
{
"geometry": {
"size": {
"height": 920,
"width": 618
},
"x": 199,
"y": 154
},
"isFloating": true,
"isVisible": false,
"minSize": {
"height": 425,
"width": 249
},
"name": "DockWidget-5"
},
{
"geometry": {
"size": {
"height": 770,
"width": 538
},
"x": 323,
"y": 203
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 523,
"width": 451
},
"name": "DockWidget-6"
}
],
"mainWindows": [
{
"geometry": {
"size": {
"height": 1487,
"width": 307
},
"x": 42,
"y": 118
},
"mainWindowOption": 0,
"name": "MainWindow-17"
}
]
},
"operations": [
{
"comment": "AddDockWidget DockWidget-4-[hidden] to top",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-4",
"location": 2,
"mainWindowName": "MainWindow-17"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-1 to left",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-1",
"location": 1,
"mainWindowName": "MainWindow-17"
},
"type": 4
},
{
"comment": "AddDockWidgetAsTab DockWidget-6-[hidden] onto DockWidget-1",
"params": {
"dockWidgetName": "DockWidget-1",
"dockWidgetToAddName": "DockWidget-6"
},
"type": 5
},
{
"comment": "AddDockWidget DockWidget-1-[hidden] to right, relative to DockWidget-4",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-1",
"location": 3,
"mainWindowName": "MainWindow-17",
"relativeToName": "DockWidget-4"
},
"type": 4
},
{
"comment": "Closing DockWidget-6",
"params": {
"dockWidgetName": "DockWidget-6"
},
"type": 1
},
{
"comment": "AddDockWidget DockWidget-5 to left",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-5",
"location": 1,
"mainWindowName": "MainWindow-17"
},
"type": 4
},
{
"comment": "AddDockWidgetAsTab DockWidget-4-[hidden] onto DockWidget-3",
"params": {
"dockWidgetName": "DockWidget-3",
"dockWidgetToAddName": "DockWidget-4"
},
"type": 5
},
{
"comment": "AddDockWidget DockWidget-2 to left",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-2",
"location": 1,
"mainWindowName": "MainWindow-17"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-4 to right, relative to DockWidget-5",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-4",
"location": 3,
"mainWindowName": "MainWindow-17",
"relativeToName": "DockWidget-5"
},
"type": 4
}
]
}

View File

@@ -1,159 +0,0 @@
{
"initialLayout": {
"dockWidgets": [
{
"geometry": {
"size": {
"height": 976,
"width": 1087
},
"x": 298,
"y": 13
},
"isFloating": false,
"isVisible": false,
"minSize": {
"height": 447,
"width": 498
},
"name": "DockWidget-1"
},
{
"geometry": {
"size": {
"height": 793,
"width": 897
},
"x": 322,
"y": 491
},
"isFloating": false,
"isVisible": false,
"minSize": {
"height": 565,
"width": 544
},
"name": "DockWidget-2"
},
{
"geometry": {
"size": {
"height": 426,
"width": 972
},
"x": 54,
"y": 88
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 284,
"width": 596
},
"name": "DockWidget-3"
}
],
"mainWindows": [
{
"geometry": {
"size": {
"height": 1425,
"width": 145
},
"x": 20,
"y": 2
},
"mainWindowOption": 0,
"name": "MainWindow-1"
}
]
},
"operations": [
{
"comment": "AddDockWidget DockWidget-2-[hidden] to top",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-2",
"location": 2,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "Closing DockWidget-2",
"params": {
"dockWidgetName": "DockWidget-2"
},
"type": 1
},
{
"comment": "AddDockWidget DockWidget-3 to left",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-3",
"location": 1,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-3 to right",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-3",
"location": 3,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "Closing DockWidget-3",
"params": {
"dockWidgetName": "DockWidget-3"
},
"type": 1
},
{
"comment": "AddDockWidget DockWidget-3-[hidden] to left",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-3",
"location": 1,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-1-[hidden] to top, relative to DockWidget-3",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-1",
"location": 2,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-3"
},
"type": 4
},
{
"comment": "Hiding DockWidget-3",
"params": {
"dockWidgetName": "DockWidget-3"
},
"type": 2
},
{
"comment": "Closing DockWidget-1",
"params": {
"dockWidgetName": "DockWidget-1"
},
"type": 1
},
{
"comment": "Showing DockWidget-3-[hidden]",
"params": {
"dockWidgetName": "DockWidget-3"
},
"type": 3
}
]
}

View File

@@ -1,905 +0,0 @@
{
"initialLayout": {
"dockWidgets": [
{
"geometry": {
"size": {
"height": 496,
"width": 260
},
"x": 213,
"y": 149
},
"isFloating": false,
"isVisible": false,
"minSize": {
"height": 324,
"width": 183
},
"name": "DockWidget-1"
},
{
"geometry": {
"size": {
"height": 784,
"width": 342
},
"x": 42,
"y": 428
},
"isFloating": false,
"isVisible": false,
"minSize": {
"height": 247,
"width": 247
},
"name": "DockWidget-2"
},
{
"geometry": {
"size": {
"height": 789,
"width": 566
},
"x": 294,
"y": 396
},
"isFloating": true,
"isVisible": false,
"minSize": {
"height": 502,
"width": 345
},
"name": "DockWidget-3"
},
{
"geometry": {
"size": {
"height": 948,
"width": 440
},
"x": 461,
"y": 56
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 568,
"width": 246
},
"name": "DockWidget-4"
},
{
"geometry": {
"size": {
"height": 642,
"width": 529
},
"x": 172,
"y": 192
},
"isFloating": true,
"isVisible": false,
"minSize": {
"height": 213,
"width": 268
},
"name": "DockWidget-5"
},
{
"geometry": {
"size": {
"height": 1089,
"width": 305
},
"x": 212,
"y": 8
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 567,
"width": 165
},
"name": "DockWidget-6"
},
{
"geometry": {
"size": {
"height": 632,
"width": 892
},
"x": 477,
"y": 51
},
"isFloating": false,
"isVisible": false,
"minSize": {
"height": 329,
"width": 407
},
"name": "DockWidget-7"
},
{
"geometry": {
"size": {
"height": 653,
"width": 665
},
"x": 228,
"y": 458
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 440,
"width": 371
},
"name": "DockWidget-8"
},
{
"geometry": {
"size": {
"height": 612,
"width": 560
},
"x": 371,
"y": 63
},
"isFloating": false,
"isVisible": false,
"minSize": {
"height": 534,
"width": 300
},
"name": "DockWidget-9"
}
],
"mainWindows": [
{
"geometry": {
"size": {
"height": 1199,
"width": 305
},
"x": 180,
"y": 209
},
"mainWindowOption": 0,
"name": "MainWindow-1"
}
]
},
"operations": [
{
"comment": "AddDockWidget DockWidget-5-[hidden] to top",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-5",
"location": 2,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-4 to right",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-4",
"location": 3,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidgetAsTab DockWidget-5 onto DockWidget-8",
"params": {
"dockWidgetName": "DockWidget-8",
"dockWidgetToAddName": "DockWidget-5"
},
"type": 5
},
{
"comment": "AddDockWidget DockWidget-6 to top, relative to DockWidget-4",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-6",
"location": 2,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-4"
},
"type": 4
},
{
"comment": "AddDockWidgetAsTab DockWidget-1-[hidden] onto DockWidget-7",
"params": {
"dockWidgetName": "DockWidget-7",
"dockWidgetToAddName": "DockWidget-1"
},
"type": 5
},
{
"comment": "Hiding DockWidget-4",
"params": {
"dockWidgetName": "DockWidget-4"
},
"type": 2
},
{
"comment": "AddDockWidget DockWidget-2-[hidden] to left, relative to DockWidget-6",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-2",
"location": 1,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-6"
},
"type": 4
},
{
"comment": "Closing DockWidget-6",
"params": {
"dockWidgetName": "DockWidget-6"
},
"type": 1
},
{
"comment": "Closing DockWidget-2",
"params": {
"dockWidgetName": "DockWidget-2"
},
"type": 1
},
{
"comment": "Showing DockWidget-4-[hidden]",
"params": {
"dockWidgetName": "DockWidget-4"
},
"type": 3
},
{
"comment": "AddDockWidget DockWidget-7-[hidden] to right, relative to DockWidget-4",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-7",
"location": 3,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-4"
},
"type": 4
},
{
"comment": "Closing DockWidget-1",
"params": {
"dockWidgetName": "DockWidget-1"
},
"type": 1
},
{
"comment": "AddDockWidget DockWidget-6-[hidden] to right",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-6",
"location": 3,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-2 to top",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-2",
"location": 2,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "Hiding DockWidget-5",
"params": {
"dockWidgetName": "DockWidget-5"
},
"type": 2
},
{
"comment": "Hiding DockWidget-7",
"params": {
"dockWidgetName": "DockWidget-7"
},
"type": 2
},
{
"comment": "Closing DockWidget-8",
"params": {
"dockWidgetName": "DockWidget-8"
},
"type": 1
},
{
"comment": "Closing DockWidget-4",
"params": {
"dockWidgetName": "DockWidget-4"
},
"type": 1
},
{
"comment": "AddDockWidgetAsTab DockWidget-7-[hidden] onto DockWidget-2",
"params": {
"dockWidgetName": "DockWidget-2",
"dockWidgetToAddName": "DockWidget-7"
},
"type": 5
},
{
"comment": "AddDockWidget DockWidget-3-[hidden] to left",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-3",
"location": 1,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "Closing DockWidget-3",
"params": {
"dockWidgetName": "DockWidget-3"
},
"type": 1
},
{
"comment": "Showing DockWidget-4-[hidden]",
"params": {
"dockWidgetName": "DockWidget-4"
},
"type": 3
},
{
"comment": "AddDockWidget DockWidget-9-[hidden] to left, relative to DockWidget-6",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-9",
"location": 1,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-6"
},
"type": 4
},
{
"comment": "Hiding DockWidget-9",
"params": {
"dockWidgetName": "DockWidget-9"
},
"type": 2
},
{
"comment": "AddDockWidgetAsTab DockWidget-5-[hidden] onto DockWidget-6",
"params": {
"dockWidgetName": "DockWidget-6",
"dockWidgetToAddName": "DockWidget-5"
},
"type": 5
},
{
"comment": "AddDockWidget DockWidget-5 to right, relative to DockWidget-6-[hidden]",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-5",
"location": 3,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-6"
},
"type": 4
},
{
"comment": "Showing DockWidget-1-[hidden]",
"params": {
"dockWidgetName": "DockWidget-1"
},
"type": 3
},
{
"comment": "Showing DockWidget-2-[hidden]",
"params": {
"dockWidgetName": "DockWidget-2"
},
"type": 3
},
{
"comment": "Closing DockWidget-4",
"params": {
"dockWidgetName": "DockWidget-4"
},
"type": 1
},
{
"comment": "Showing DockWidget-9-[hidden]",
"params": {
"dockWidgetName": "DockWidget-9"
},
"type": 3
},
{
"comment": "AddDockWidget DockWidget-4-[hidden] to right, relative to DockWidget-2",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-4",
"location": 3,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-2"
},
"type": 4
},
{
"comment": "Showing DockWidget-3-[hidden]",
"params": {
"dockWidgetName": "DockWidget-3"
},
"type": 3
},
{
"comment": "AddDockWidgetAsTab DockWidget-1 onto DockWidget-5",
"params": {
"dockWidgetName": "DockWidget-5",
"dockWidgetToAddName": "DockWidget-1"
},
"type": 5
},
{
"comment": "Showing DockWidget-5-[hidden]",
"params": {
"dockWidgetName": "DockWidget-5"
},
"type": 3
},
{
"comment": "Hiding DockWidget-2",
"params": {
"dockWidgetName": "DockWidget-2"
},
"type": 2
},
{
"comment": "Hiding DockWidget-5",
"params": {
"dockWidgetName": "DockWidget-5"
},
"type": 2
},
{
"comment": "Hiding DockWidget-7",
"params": {
"dockWidgetName": "DockWidget-7"
},
"type": 2
},
{
"comment": "AddDockWidget DockWidget-9 to left",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-9",
"location": 1,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-6 to top, relative to DockWidget-4",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-6",
"location": 2,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-4"
},
"type": 4
},
{
"comment": "Closing DockWidget-3",
"params": {
"dockWidgetName": "DockWidget-3"
},
"type": 1
},
{
"comment": "AddDockWidget DockWidget-3-[hidden] to left, relative to DockWidget-6",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-3",
"location": 1,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-6"
},
"type": 4
},
{
"comment": "Showing DockWidget-5-[hidden]",
"params": {
"dockWidgetName": "DockWidget-5"
},
"type": 3
},
{
"comment": "AddDockWidget DockWidget-2-[hidden] to bottom",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-2",
"location": 4,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-6 to bottom",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-6",
"location": 4,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidgetAsTab DockWidget-7-[hidden] onto DockWidget-2",
"params": {
"dockWidgetName": "DockWidget-2",
"dockWidgetToAddName": "DockWidget-7"
},
"type": 5
},
{
"comment": "AddDockWidgetAsTab DockWidget-8-[hidden] onto DockWidget-3",
"params": {
"dockWidgetName": "DockWidget-3",
"dockWidgetToAddName": "DockWidget-8"
},
"type": 5
},
{
"comment": "Hiding DockWidget-9",
"params": {
"dockWidgetName": "DockWidget-9"
},
"type": 2
},
{
"comment": "Closing DockWidget-7",
"params": {
"dockWidgetName": "DockWidget-7"
},
"type": 1
},
{
"comment": "Closing DockWidget-4",
"params": {
"dockWidgetName": "DockWidget-4"
},
"type": 1
},
{
"comment": "AddDockWidget DockWidget-1-[hidden] to top",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-1",
"location": 2,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "Hiding DockWidget-6",
"params": {
"dockWidgetName": "DockWidget-6"
},
"type": 2
},
{
"comment": "AddDockWidgetAsTab DockWidget-6-[hidden] onto DockWidget-8",
"params": {
"dockWidgetName": "DockWidget-8",
"dockWidgetToAddName": "DockWidget-6"
},
"type": 5
},
{
"comment": "AddDockWidget DockWidget-2 to bottom",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-2",
"location": 4,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-6 to bottom",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-6",
"location": 4,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-5 to left",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-5",
"location": 1,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-3-[hidden] to bottom, relative to DockWidget-6",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-3",
"location": 4,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-6"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-3 to right",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-3",
"location": 3,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "Showing DockWidget-7-[hidden]",
"params": {
"dockWidgetName": "DockWidget-7"
},
"type": 3
},
{
"comment": "Closing DockWidget-1",
"params": {
"dockWidgetName": "DockWidget-1"
},
"type": 1
},
{
"comment": "Hiding DockWidget-8",
"params": {
"dockWidgetName": "DockWidget-8"
},
"type": 2
},
{
"comment": "Hiding DockWidget-2",
"params": {
"dockWidgetName": "DockWidget-2"
},
"type": 2
},
{
"comment": "AddDockWidget DockWidget-9-[hidden] to left",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-9",
"location": 1,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-6 to right, relative to DockWidget-5",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-6",
"location": 3,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-5"
},
"type": 4
},
{
"comment": "AddDockWidgetAsTab DockWidget-1-[hidden] onto DockWidget-3",
"params": {
"dockWidgetName": "DockWidget-3",
"dockWidgetToAddName": "DockWidget-1"
},
"type": 5
},
{
"comment": "AddDockWidget DockWidget-9 to left, relative to DockWidget-3-[hidden]",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-9",
"location": 1,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-3"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-7 to bottom",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-7",
"location": 4,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "Closing DockWidget-6",
"params": {
"dockWidgetName": "DockWidget-6"
},
"type": 1
},
{
"comment": "AddDockWidget DockWidget-9 to top",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-9",
"location": 2,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-1 to bottom",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-1",
"location": 4,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-6-[hidden] to right",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-6",
"location": 3,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "Hiding DockWidget-6",
"params": {
"dockWidgetName": "DockWidget-6"
},
"type": 2
},
{
"comment": "Closing DockWidget-5",
"params": {
"dockWidgetName": "DockWidget-5"
},
"type": 1
},
{
"comment": "Showing DockWidget-8-[hidden]",
"params": {
"dockWidgetName": "DockWidget-8"
},
"type": 3
},
{
"comment": "Closing DockWidget-3",
"params": {
"dockWidgetName": "DockWidget-3"
},
"type": 1
},
{
"comment": "Hiding DockWidget-1",
"params": {
"dockWidgetName": "DockWidget-1"
},
"type": 2
},
{
"comment": "AddDockWidget DockWidget-8 to bottom",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-8",
"location": 4,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "Closing DockWidget-9",
"params": {
"dockWidgetName": "DockWidget-9"
},
"type": 1
},
{
"comment": "AddDockWidget DockWidget-8-[hidden] to top, relative to DockWidget-7",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-8",
"location": 2,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-7"
},
"type": 4
},
{
"comment": "Showing DockWidget-6-[hidden]",
"params": {
"dockWidgetName": "DockWidget-6"
},
"type": 3
},
{
"comment": "Closing DockWidget-8",
"params": {
"dockWidgetName": "DockWidget-8"
},
"type": 1
},
{
"comment": "Hiding DockWidget-7",
"params": {
"dockWidgetName": "DockWidget-7"
},
"type": 2
},
{
"comment": "Showing DockWidget-9-[hidden]",
"params": {
"dockWidgetName": "DockWidget-9"
},
"type": 3
},
{
"comment": "AddDockWidget DockWidget-9 to top",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-9",
"location": 2,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "Hiding DockWidget-9",
"params": {
"dockWidgetName": "DockWidget-9"
},
"type": 2
},
{
"comment": "Showing DockWidget-7-[hidden]",
"params": {
"dockWidgetName": "DockWidget-7"
},
"type": 3
},
{
"comment": "Showing DockWidget-4-[hidden]",
"params": {
"dockWidgetName": "DockWidget-4"
},
"type": 3
},
{
"comment": "Showing DockWidget-9-[hidden]",
"params": {
"dockWidgetName": "DockWidget-9"
},
"type": 3
}
]
}

View File

@@ -1,378 +0,0 @@
{
"initialLayout": {
"dockWidgets": [
{
"geometry": {
"size": {
"height": 774,
"width": 1127
},
"x": 176,
"y": 165
},
"isFloating": true,
"isVisible": false,
"minSize": {
"height": 476,
"width": 564
},
"name": "DockWidget-1"
},
{
"geometry": {
"size": {
"height": 518,
"width": 755
},
"x": 319,
"y": 447
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 178,
"width": 459
},
"name": "DockWidget-2"
},
{
"geometry": {
"size": {
"height": 828,
"width": 838
},
"x": 260,
"y": 237
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 266,
"width": 485
},
"name": "DockWidget-3"
},
{
"geometry": {
"size": {
"height": 808,
"width": 509
},
"x": 243,
"y": 415
},
"isFloating": false,
"isVisible": false,
"minSize": {
"height": 578,
"width": 351
},
"name": "DockWidget-4"
},
{
"geometry": {
"size": {
"height": 773,
"width": 754
},
"x": 494,
"y": 428
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 369,
"width": 327
},
"name": "DockWidget-5"
},
{
"geometry": {
"size": {
"height": 672,
"width": 471
},
"x": 433,
"y": 245
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 463,
"width": 191
},
"name": "DockWidget-6"
},
{
"geometry": {
"size": {
"height": 701,
"width": 525
},
"x": 30,
"y": 367
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 596,
"width": 156
},
"name": "DockWidget-7"
},
{
"geometry": {
"size": {
"height": 723,
"width": 599
},
"x": 254,
"y": 203
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 251,
"width": 447
},
"name": "DockWidget-8"
}
],
"mainWindows": [
{
"geometry": {
"size": {
"height": 808,
"width": 126
},
"x": 173,
"y": 460
},
"mainWindowOption": 0,
"name": "MainWindow-1"
}
]
},
"operations": [
{
"comment": "AddDockWidget DockWidget-4-[hidden] to left",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-4",
"location": 1,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "",
"params": {
},
"type": 3
},
{
"comment": "AddDockWidget DockWidget-2 to right, relative to DockWidget-4",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-2",
"location": 3,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-4"
},
"type": 4
},
{
"comment": "AddDockWidgetAsTab DockWidget-4 onto DockWidget-3",
"params": {
"dockWidgetName": "DockWidget-3",
"dockWidgetToAddName": "DockWidget-4"
},
"type": 5
},
{
"comment": "",
"params": {
},
"type": 3
},
{
"comment": "",
"params": {
},
"type": 5
},
{
"comment": "",
"params": {
},
"type": 3
},
{
"comment": "AddDockWidget DockWidget-2 to bottom",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-2",
"location": 4,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "SaveLayout",
"params": {
},
"type": 6
},
{
"comment": "SaveLayout",
"params": {
},
"type": 6
},
{
"comment": "AddDockWidgetAsTab DockWidget-4 onto DockWidget-6",
"params": {
"dockWidgetName": "DockWidget-6",
"dockWidgetToAddName": "DockWidget-4"
},
"type": 5
},
{
"comment": "",
"params": {
},
"type": 2
},
{
"comment": "AddDockWidget DockWidget-2 to bottom",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-2",
"location": 4,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "SaveLayout",
"params": {
},
"type": 6
},
{
"comment": "Closing DockWidget-4",
"params": {
"dockWidgetName": "DockWidget-4"
},
"type": 1
},
{
"comment": "Hiding DockWidget-2",
"params": {
"dockWidgetName": "DockWidget-2"
},
"type": 2
},
{
"comment": "SaveLayout",
"params": {
},
"type": 6
},
{
"comment": "RestoreLayout",
"params": {
},
"type": 7
},
{
"comment": "AddDockWidget DockWidget-2-[hidden] to right",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-2",
"location": 3,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-4-[hidden] to left, relative to DockWidget-2",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-4",
"location": 1,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-2"
},
"type": 4
},
{
"comment": "AddDockWidgetAsTab DockWidget-5 onto DockWidget-3",
"params": {
"dockWidgetName": "DockWidget-3",
"dockWidgetToAddName": "DockWidget-5"
},
"type": 5
},
{
"comment": "AddDockWidget DockWidget-5 to left",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-5",
"location": 1,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-5 to left",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-5",
"location": 1,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "",
"params": {
},
"type": 3
},
{
"comment": "AddDockWidget DockWidget-7 to right, relative to DockWidget-5",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-7",
"location": 3,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-5"
},
"type": 4
},
{
"comment": "AddDockWidgetAsTab DockWidget-1-[hidden] onto DockWidget-4",
"params": {
"dockWidgetName": "DockWidget-4",
"dockWidgetToAddName": "DockWidget-1"
},
"type": 5
},
{
"comment": "",
"params": {
},
"type": 3
},
{
"comment": "AddDockWidgetAsTab DockWidget-1 onto DockWidget-8",
"params": {
"dockWidgetName": "DockWidget-8",
"dockWidgetToAddName": "DockWidget-1"
},
"type": 5
}
]
}

View File

@@ -1,212 +0,0 @@
{
"initialLayout": {
"dockWidgets": [
{
"geometry": {
"size": {
"height": 410,
"width": 531
},
"x": 359,
"y": 134
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 258,
"width": 175
},
"name": "DockWidget-1"
},
{
"geometry": {
"size": {
"height": 588,
"width": 651
},
"x": 369,
"y": 7
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 438,
"width": 373
},
"name": "DockWidget-2"
},
{
"geometry": {
"size": {
"height": 969,
"width": 279
},
"x": 302,
"y": 60
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 392,
"width": 172
},
"name": "DockWidget-3"
},
{
"geometry": {
"size": {
"height": 645,
"width": 562
},
"x": 115,
"y": 448
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 584,
"width": 346
},
"name": "DockWidget-4"
},
{
"geometry": {
"size": {
"height": 586,
"width": 270
},
"x": 217,
"y": 397
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 458,
"width": 152
},
"name": "DockWidget-5"
},
{
"geometry": {
"size": {
"height": 762,
"width": 460
},
"x": 40,
"y": 90
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 476,
"width": 268
},
"name": "DockWidget-6"
},
{
"geometry": {
"size": {
"height": 873,
"width": 644
},
"x": 3,
"y": 26
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 533,
"width": 246
},
"name": "DockWidget-7"
}
],
"mainWindows": [
{
"geometry": {
"size": {
"height": 1163,
"width": 36
},
"x": 95,
"y": 56
},
"mainWindowOption": 0,
"name": "MainWindow-1"
}
]
},
"operations": [
{
"comment": "AddDockWidget DockWidget-2 to right",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-2",
"location": 3,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidgetAsTab DockWidget-7 onto DockWidget-2",
"params": {
"dockWidgetName": "DockWidget-2",
"dockWidgetToAddName": "DockWidget-7"
},
"type": 5
},
{
"comment": "AddDockWidgetAsTab DockWidget-2-[hidden] onto DockWidget-4",
"params": {
"dockWidgetName": "DockWidget-4",
"dockWidgetToAddName": "DockWidget-2"
},
"type": 5
},
{
"comment": "AddDockWidget DockWidget-4-[hidden] to bottom, relative to DockWidget-7",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-4",
"location": 4,
"mainWindowName": "MainWindow-1",
"relativeToName": "DockWidget-7"
},
"type": 4
},
{
"comment": "Hiding DockWidget-7",
"params": {
"dockWidgetName": "DockWidget-7"
},
"type": 2
},
{
"comment": "AddDockWidget DockWidget-3 to bottom",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-3",
"location": 4,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-5 to top",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-5",
"location": 2,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "Showing DockWidget-7-[hidden]",
"params": {
"dockWidgetName": "DockWidget-7"
},
"type": 3
}
]
}

View File

@@ -1,833 +0,0 @@
{
"initialLayout": {
"dockWidgets": [
{
"geometry": {
"size": {
"height": 793,
"width": 728
},
"x": 143,
"y": 290
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 445,
"width": 576
},
"name": "DockWidget-70"
},
{
"geometry": {
"size": {
"height": 749,
"width": 1001
},
"x": 358,
"y": 224
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 406,
"width": 579
},
"name": "DockWidget-71"
},
{
"geometry": {
"size": {
"height": 243,
"width": 480
},
"x": 498,
"y": 284
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 184,
"width": 191
},
"name": "DockWidget-72"
}
],
"mainWindows": [
{
"geometry": {
"size": {
"height": 1409,
"width": 109
},
"x": 243,
"y": 241
},
"mainWindowOption": 0,
"name": "MainWindow-14"
}
]
},
"operations": [
{
"comment": "Closing DockWidget-72",
"params": {
"dockWidgetName": "DockWidget-72"
},
"type": 1
},
{
"comment": "RestoreLayout",
"params": {
},
"type": 7
},
{
"comment": "Closing DockWidget-70",
"params": {
"dockWidgetName": "DockWidget-70"
},
"type": 1
},
{
"comment": "Closing DockWidget-71",
"params": {
"dockWidgetName": "DockWidget-71"
},
"type": 1
},
{
"comment": "SaveLayout",
"params": {
},
"type": 6
},
{
"comment": "SaveLayout",
"params": {
},
"type": 6
},
{
"comment": "Showing DockWidget-70-[hidden]",
"params": {
"dockWidgetName": "DockWidget-70"
},
"type": 3
},
{
"comment": "SaveLayout",
"params": {
},
"type": 6
},
{
"comment": "SaveLayout",
"params": {
},
"type": 6
},
{
"comment": "Hiding DockWidget-70",
"params": {
"dockWidgetName": "DockWidget-70"
},
"type": 2
},
{
"comment": "Showing DockWidget-71-[hidden]",
"params": {
"dockWidgetName": "DockWidget-71"
},
"type": 3
},
{
"comment": "AddDockWidgetAsTab DockWidget-72-[hidden] onto DockWidget-71",
"params": {
"dockWidgetName": "DockWidget-71",
"dockWidgetToAddName": "DockWidget-72"
},
"type": 5
},
{
"comment": "AddDockWidget DockWidget-70-[hidden] to left",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-70",
"location": 1,
"mainWindowName": "MainWindow-14"
},
"type": 4
},
{
"comment": "SaveLayout",
"params": {
},
"type": 6
},
{
"comment": "Hiding DockWidget-72",
"params": {
"dockWidgetName": "DockWidget-72"
},
"type": 2
},
{
"comment": "SaveLayout",
"params": {
},
"type": 6
},
{
"comment": "AddDockWidgetAsTab DockWidget-72-[hidden] onto DockWidget-71",
"params": {
"dockWidgetName": "DockWidget-71",
"dockWidgetToAddName": "DockWidget-72"
},
"type": 5
},
{
"comment": "Showing DockWidget-71-[hidden]",
"params": {
"dockWidgetName": "DockWidget-71"
},
"type": 3
},
{
"comment": "Hiding DockWidget-72",
"params": {
"dockWidgetName": "DockWidget-72"
},
"type": 2
},
{
"comment": "Showing DockWidget-72-[hidden]",
"params": {
"dockWidgetName": "DockWidget-72"
},
"type": 3
},
{
"comment": "Hiding DockWidget-71",
"params": {
"dockWidgetName": "DockWidget-71"
},
"type": 2
},
{
"comment": "AddDockWidgetAsTab DockWidget-71-[hidden] onto DockWidget-70",
"params": {
"dockWidgetName": "DockWidget-70",
"dockWidgetToAddName": "DockWidget-71"
},
"type": 5
},
{
"comment": "RestoreLayout",
"params": {
},
"type": 7
},
{
"comment": "Closing DockWidget-70",
"params": {
"dockWidgetName": "DockWidget-70"
},
"type": 1
},
{
"comment": "Hiding DockWidget-71",
"params": {
"dockWidgetName": "DockWidget-71"
},
"type": 2
},
{
"comment": "Showing DockWidget-72-[hidden]",
"params": {
"dockWidgetName": "DockWidget-72"
},
"type": 3
},
{
"comment": "RestoreLayout",
"params": {
},
"type": 7
},
{
"comment": "Hiding DockWidget-71",
"params": {
"dockWidgetName": "DockWidget-71"
},
"type": 2
},
{
"comment": "AddDockWidgetAsTab DockWidget-71-[hidden] onto DockWidget-70",
"params": {
"dockWidgetName": "DockWidget-70",
"dockWidgetToAddName": "DockWidget-71"
},
"type": 5
},
{
"comment": "AddDockWidget DockWidget-71 to left",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-71",
"location": 1,
"mainWindowName": "MainWindow-14"
},
"type": 4
},
{
"comment": "RestoreLayout",
"params": {
},
"type": 7
},
{
"comment": "RestoreLayout",
"params": {
},
"type": 7
},
{
"comment": "RestoreLayout",
"params": {
},
"type": 7
},
{
"comment": "Closing DockWidget-70",
"params": {
"dockWidgetName": "DockWidget-70"
},
"type": 1
},
{
"comment": "AddDockWidgetAsTab DockWidget-72-[hidden] onto DockWidget-71",
"params": {
"dockWidgetName": "DockWidget-71",
"dockWidgetToAddName": "DockWidget-72"
},
"type": 5
},
{
"comment": "AddDockWidgetAsTab DockWidget-70-[hidden] onto DockWidget-71-[hidden]",
"params": {
"dockWidgetName": "DockWidget-71",
"dockWidgetToAddName": "DockWidget-70"
},
"type": 5
},
{
"comment": "SaveLayout",
"params": {
},
"type": 6
},
{
"comment": "AddDockWidget DockWidget-72-[hidden] to left",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-72",
"location": 1,
"mainWindowName": "MainWindow-14"
},
"type": 4
},
{
"comment": "SaveLayout",
"params": {
},
"type": 6
},
{
"comment": "AddDockWidget DockWidget-72 to top",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-72",
"location": 2,
"mainWindowName": "MainWindow-14"
},
"type": 4
},
{
"comment": "Closing DockWidget-70",
"params": {
"dockWidgetName": "DockWidget-70"
},
"type": 1
},
{
"comment": "Hiding DockWidget-71",
"params": {
"dockWidgetName": "DockWidget-71"
},
"type": 2
},
{
"comment": "AddDockWidgetAsTab DockWidget-70-[hidden] onto DockWidget-72",
"params": {
"dockWidgetName": "DockWidget-72",
"dockWidgetToAddName": "DockWidget-70"
},
"type": 5
},
{
"comment": "Showing DockWidget-72-[hidden]",
"params": {
"dockWidgetName": "DockWidget-72"
},
"type": 3
},
{
"comment": "Hiding DockWidget-72",
"params": {
"dockWidgetName": "DockWidget-72"
},
"type": 2
},
{
"comment": "SaveLayout",
"params": {
},
"type": 6
},
{
"comment": "RestoreLayout",
"params": {
},
"type": 7
},
{
"comment": "SaveLayout",
"params": {
},
"type": 6
},
{
"comment": "Showing DockWidget-71-[hidden]",
"params": {
"dockWidgetName": "DockWidget-71"
},
"type": 3
},
{
"comment": "RestoreLayout",
"params": {
},
"type": 7
},
{
"comment": "RestoreLayout",
"params": {
},
"type": 7
},
{
"comment": "RestoreLayout",
"params": {
},
"type": 7
},
{
"comment": "AddDockWidget DockWidget-70 to left",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-70",
"location": 1,
"mainWindowName": "MainWindow-14"
},
"type": 4
},
{
"comment": "SaveLayout",
"params": {
},
"type": 6
},
{
"comment": "RestoreLayout",
"params": {
},
"type": 7
},
{
"comment": "Showing DockWidget-72-[hidden]",
"params": {
"dockWidgetName": "DockWidget-72"
},
"type": 3
},
{
"comment": "Closing DockWidget-72",
"params": {
"dockWidgetName": "DockWidget-72"
},
"type": 1
},
{
"comment": "SaveLayout",
"params": {
},
"type": 6
},
{
"comment": "AddDockWidget DockWidget-70 to right",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-70",
"location": 3,
"mainWindowName": "MainWindow-14"
},
"type": 4
},
{
"comment": "RestoreLayout",
"params": {
},
"type": 7
},
{
"comment": "RestoreLayout",
"params": {
},
"type": 7
},
{
"comment": "AddDockWidget DockWidget-70 to top",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-70",
"location": 2,
"mainWindowName": "MainWindow-14"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-71-[hidden] to bottom, relative to DockWidget-70",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-71",
"location": 4,
"mainWindowName": "MainWindow-14",
"relativeToName": "DockWidget-70"
},
"type": 4
},
{
"comment": "SaveLayout",
"params": {
},
"type": 6
},
{
"comment": "AddDockWidget DockWidget-72-[hidden] to right",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-72",
"location": 3,
"mainWindowName": "MainWindow-14"
},
"type": 4
},
{
"comment": "Hiding DockWidget-72",
"params": {
"dockWidgetName": "DockWidget-72"
},
"type": 2
},
{
"comment": "AddDockWidget DockWidget-72-[hidden] to right, relative to DockWidget-70",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-72",
"location": 3,
"mainWindowName": "MainWindow-14",
"relativeToName": "DockWidget-70"
},
"type": 4
},
{
"comment": "Closing DockWidget-71",
"params": {
"dockWidgetName": "DockWidget-71"
},
"type": 1
},
{
"comment": "Showing DockWidget-71-[hidden]",
"params": {
"dockWidgetName": "DockWidget-71"
},
"type": 3
},
{
"comment": "Hiding DockWidget-71",
"params": {
"dockWidgetName": "DockWidget-71"
},
"type": 2
},
{
"comment": "AddDockWidget DockWidget-70 to left",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-70",
"location": 1,
"mainWindowName": "MainWindow-14"
},
"type": 4
},
{
"comment": "Closing DockWidget-70",
"params": {
"dockWidgetName": "DockWidget-70"
},
"type": 1
},
{
"comment": "Hiding DockWidget-72",
"params": {
"dockWidgetName": "DockWidget-72"
},
"type": 2
},
{
"comment": "Showing DockWidget-70-[hidden]",
"params": {
"dockWidgetName": "DockWidget-70"
},
"type": 3
},
{
"comment": "AddDockWidget DockWidget-72-[hidden] to top",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-72",
"location": 2,
"mainWindowName": "MainWindow-14"
},
"type": 4
},
{
"comment": "AddDockWidgetAsTab DockWidget-71-[hidden] onto DockWidget-70",
"params": {
"dockWidgetName": "DockWidget-70",
"dockWidgetToAddName": "DockWidget-71"
},
"type": 5
},
{
"comment": "Showing DockWidget-70-[hidden]",
"params": {
"dockWidgetName": "DockWidget-70"
},
"type": 3
},
{
"comment": "AddDockWidget DockWidget-70 to top",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-70",
"location": 2,
"mainWindowName": "MainWindow-14"
},
"type": 4
},
{
"comment": "RestoreLayout",
"params": {
},
"type": 7
},
{
"comment": "SaveLayout",
"params": {
},
"type": 6
},
{
"comment": "AddDockWidget DockWidget-70 to bottom",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-70",
"location": 4,
"mainWindowName": "MainWindow-14"
},
"type": 4
},
{
"comment": "Showing DockWidget-72-[hidden]",
"params": {
"dockWidgetName": "DockWidget-72"
},
"type": 3
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 7
},
{
"comment": "",
"params": {
},
"type": 7
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 7
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 7
},
{
"comment": "",
"params": {
},
"type": 7
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 7
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 7
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 7
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 7
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 7
},
{
"comment": "",
"params": {
},
"type": 6
}
]
}

View File

@@ -1,645 +0,0 @@
{
"initialLayout": {
"dockWidgets": [
{
"geometry": {
"size": {
"height": 807,
"width": 1022
},
"x": 481,
"y": 53
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 242,
"width": 459
},
"name": "DockWidget-1"
},
{
"geometry": {
"size": {
"height": 991,
"width": 1097
},
"x": 500,
"y": 373
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 537,
"width": 519
},
"name": "DockWidget-2"
},
{
"geometry": {
"size": {
"height": 550,
"width": 856
},
"x": 286,
"y": 486
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 319,
"width": 536
},
"name": "DockWidget-3"
},
{
"geometry": {
"size": {
"height": 565,
"width": 840
},
"x": 55,
"y": 69
},
"isFloating": false,
"isVisible": false,
"minSize": {
"height": 179,
"width": 312
},
"name": "DockWidget-4"
},
{
"geometry": {
"size": {
"height": 707,
"width": 1045
},
"x": 195,
"y": 183
},
"isFloating": false,
"isVisible": false,
"minSize": {
"height": 539,
"width": 589
},
"name": "DockWidget-5"
},
{
"geometry": {
"size": {
"height": 555,
"width": 987
},
"x": 406,
"y": 351
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 375,
"width": 594
},
"name": "DockWidget-6"
}
],
"mainWindows": [
{
"geometry": {
"size": {
"height": 895,
"width": 126
},
"x": 320,
"y": 109
},
"mainWindowOption": 0,
"name": "MainWindow-1"
}
]
},
"operations": [
{
"comment": "RestoreLayout",
"params": {
},
"type": 7
},
{
"comment": "AddDockWidgetAsTab DockWidget-2 onto DockWidget-6",
"params": {
"dockWidgetName": "DockWidget-6",
"dockWidgetToAddName": "DockWidget-2"
},
"type": 5
},
{
"comment": "Showing DockWidget-6-[hidden]",
"params": {
"dockWidgetName": "DockWidget-6"
},
"type": 3
},
{
"comment": "Hiding DockWidget-2",
"params": {
"dockWidgetName": "DockWidget-2"
},
"type": 2
},
{
"comment": "AddDockWidget DockWidget-5-[hidden] to right",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-5",
"location": 3,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "SaveLayout",
"params": {
},
"type": 6
},
{
"comment": "Showing DockWidget-2-[hidden]",
"params": {
"dockWidgetName": "DockWidget-2"
},
"type": 3
},
{
"comment": "AddDockWidgetAsTab DockWidget-4-[hidden] onto DockWidget-3",
"params": {
"dockWidgetName": "DockWidget-3",
"dockWidgetToAddName": "DockWidget-4"
},
"type": 5
},
{
"comment": "Hiding DockWidget-6",
"params": {
"dockWidgetName": "DockWidget-6"
},
"type": 2
},
{
"comment": "AddDockWidget DockWidget-6-[hidden] to bottom",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-6",
"location": 4,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-4 to right",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-4",
"location": 3,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidgetAsTab DockWidget-6 onto DockWidget-2",
"params": {
"dockWidgetName": "DockWidget-2",
"dockWidgetToAddName": "DockWidget-6"
},
"type": 5
},
{
"comment": "AddDockWidgetAsTab DockWidget-6 onto DockWidget-5",
"params": {
"dockWidgetName": "DockWidget-5",
"dockWidgetToAddName": "DockWidget-6"
},
"type": 5
},
{
"comment": "SaveLayout",
"params": {
},
"type": 6
},
{
"comment": "Closing DockWidget-3",
"params": {
"dockWidgetName": "DockWidget-3"
},
"type": 1
},
{
"comment": "Closing DockWidget-2",
"params": {
"dockWidgetName": "DockWidget-2"
},
"type": 1
},
{
"comment": "Closing DockWidget-4",
"params": {
"dockWidgetName": "DockWidget-4"
},
"type": 1
},
{
"comment": "RestoreLayout",
"params": {
},
"type": 7
},
{
"comment": "Closing DockWidget-1",
"params": {
"dockWidgetName": "DockWidget-1"
},
"type": 1
},
{
"comment": "AddDockWidgetAsTab DockWidget-1-[hidden] onto DockWidget-2",
"params": {
"dockWidgetName": "DockWidget-2",
"dockWidgetToAddName": "DockWidget-1"
},
"type": 5
},
{
"comment": "Closing DockWidget-1",
"params": {
"dockWidgetName": "DockWidget-1"
},
"type": 1
},
{
"comment": "Showing DockWidget-1-[hidden]",
"params": {
"dockWidgetName": "DockWidget-1"
},
"type": 3
},
{
"comment": "Showing DockWidget-5-[hidden]",
"params": {
"dockWidgetName": "DockWidget-5"
},
"type": 3
},
{
"comment": "AddDockWidgetAsTab DockWidget-3 onto DockWidget-4",
"params": {
"dockWidgetName": "DockWidget-4",
"dockWidgetToAddName": "DockWidget-3"
},
"type": 5
},
{
"comment": "AddDockWidget DockWidget-3 to bottom",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-3",
"location": 4,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "Closing DockWidget-6",
"params": {
"dockWidgetName": "DockWidget-6"
},
"type": 1
},
{
"comment": "AddDockWidget DockWidget-5 to bottom",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-5",
"location": 4,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-6-[hidden] to bottom",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-6",
"location": 4,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-6 to right",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-6",
"location": 3,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-4 to right",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-4",
"location": 3,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "RestoreLayout",
"params": {
},
"type": 7
},
{
"comment": "SaveLayout",
"params": {
},
"type": 6
},
{
"comment": "SaveLayout",
"params": {
},
"type": 6
},
{
"comment": "AddDockWidgetAsTab DockWidget-2 onto DockWidget-1",
"params": {
"dockWidgetName": "DockWidget-1",
"dockWidgetToAddName": "DockWidget-2"
},
"type": 5
},
{
"comment": "SaveLayout",
"params": {
},
"type": 6
},
{
"comment": "Closing DockWidget-2",
"params": {
"dockWidgetName": "DockWidget-2"
},
"type": 1
},
{
"comment": "RestoreLayout",
"params": {
},
"type": 7
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 7
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 7
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 7
},
{
"comment": "",
"params": {
},
"type": 7
},
{
"comment": "",
"params": {
},
"type": 7
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 7
},
{
"comment": "",
"params": {
},
"type": 7
},
{
"comment": "",
"params": {
},
"type": 7
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 7
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 7
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 7
},
{
"comment": "",
"params": {
},
"type": 7
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 7
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 7
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 7
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 7
},
{
"comment": "",
"params": {
},
"type": 7
},
{
"comment": "",
"params": {
},
"type": 6
},
{
"comment": "",
"params": {
},
"type": 7
}
]
}

View File

@@ -1,142 +0,0 @@
{
"initialLayout": {
"dockWidgets": [
{
"geometry": {
"size": {
"height": 903,
"width": 596
},
"x": 212,
"y": 195
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 579,
"width": 519
},
"name": "DockWidget-1"
},
{
"geometry": {
"size": {
"height": 696,
"width": 530
},
"x": 103,
"y": 264
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 497,
"width": 213
},
"name": "DockWidget-2"
},
{
"geometry": {
"size": {
"height": 745,
"width": 732
},
"x": 403,
"y": 397
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 388,
"width": 322
},
"name": "DockWidget-3"
},
{
"geometry": {
"size": {
"height": 609,
"width": 734
},
"x": 311,
"y": 337
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 201,
"width": 436
},
"name": "DockWidget-4"
}
],
"mainWindows": [
{
"geometry": {
"size": {
"height": 723,
"width": 297
},
"x": 179,
"y": 93
},
"mainWindowOption": 0,
"name": "MainWindow-1"
}
]
},
"operations": [
{
"comment": "AddDockWidget DockWidget-1 to left",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-1",
"location": 1,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidgetAsTab DockWidget-2 onto DockWidget-1",
"params": {
"dockWidgetName": "DockWidget-1",
"dockWidgetToAddName": "DockWidget-2"
},
"type": 5
},
{
"comment": "AddDockWidget DockWidget-1-[hidden] to left",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-1",
"location": 1,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidgetAsTab DockWidget-4 onto DockWidget-2",
"params": {
"dockWidgetName": "DockWidget-2",
"dockWidgetToAddName": "DockWidget-4"
},
"type": 5
},
{
"comment": "AddDockWidgetAsTab DockWidget-3 onto DockWidget-4",
"params": {
"dockWidgetName": "DockWidget-4",
"dockWidgetToAddName": "DockWidget-3"
},
"type": 5
},
{
"comment": "AddDockWidgetAsTab DockWidget-1 onto DockWidget-3",
"params": {
"dockWidgetName": "DockWidget-3",
"dockWidgetToAddName": "DockWidget-1"
},
"type": 5
}
]
}

View File

@@ -1,135 +0,0 @@
{
"initialLayout": {
"dockWidgets": [
{
"geometry": {
"size": {
"height": 886,
"width": 305
},
"x": 265,
"y": 179
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 583,
"width": 160
},
"name": "DockWidget-1"
},
{
"geometry": {
"size": {
"height": 1004,
"width": 744
},
"x": 119,
"y": 271
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 507,
"width": 378
},
"name": "DockWidget-2"
},
{
"geometry": {
"size": {
"height": 735,
"width": 530
},
"x": 107,
"y": 112
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 351,
"width": 480
},
"name": "DockWidget-3"
},
{
"geometry": {
"size": {
"height": 493,
"width": 515
},
"x": 126,
"y": 80
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 197,
"width": 437
},
"name": "DockWidget-4"
}
],
"mainWindows": [
{
"geometry": {
"size": {
"height": 1050,
"width": 462
},
"x": 130,
"y": 421
},
"mainWindowOption": 0,
"name": "MainWindow-1"
}
]
},
"operations": [
{
"comment": "AddDockWidget DockWidget-3 to bottom",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-3",
"location": 4,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "Hiding DockWidget-3",
"params": {
"dockWidgetName": "DockWidget-3"
},
"type": 2
},
{
"comment": "AddDockWidget DockWidget-1 to right",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-1",
"location": 3,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-4 to bottom",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-4",
"location": 4,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidgetAsTab DockWidget-2 onto DockWidget-1",
"params": {
"dockWidgetName": "DockWidget-1",
"dockWidgetToAddName": "DockWidget-2"
},
"type": 5
}
]
}

View File

@@ -1,76 +0,0 @@
{
"initialLayout": {
"dockWidgets": [
{
"geometry": {
"size": {
"height": 818,
"width": 425
},
"x": 146,
"y": 436
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 425,
"width": 259
},
"name": "DockWidget-1"
},
{
"geometry": {
"size": {
"height": 698,
"width": 614
},
"x": 438,
"y": 291
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 410,
"width": 363
},
"name": "DockWidget-2"
}
],
"mainWindows": [
{
"geometry": {
"size": {
"height": 1400,
"width": 457
},
"x": 91,
"y": 388
},
"mainWindowOption": 0,
"name": "MainWindow-1"
}
]
},
"operations": [
{
"comment": "AddDockWidget DockWidget-2 to top",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-2",
"location": 2,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-1 to top",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-1",
"location": 2,
"mainWindowName": "MainWindow-1"
},
"type": 4
}
]
}

View File

@@ -1,122 +0,0 @@
{
"initialLayout": {
"dockWidgets": [
{
"geometry": {
"size": {
"height": 1053,
"width": 1025
},
"x": 66,
"y": 252
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 503,
"width": 490
},
"name": "DockWidget-1"
},
{
"geometry": {
"size": {
"height": 912,
"width": 835
},
"x": 94,
"y": 437
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 506,
"width": 532
},
"name": "DockWidget-2"
},
{
"geometry": {
"size": {
"height": 774,
"width": 925
},
"x": 222,
"y": 299
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 596,
"width": 418
},
"name": "DockWidget-3"
}
],
"mainWindows": [
{
"geometry": {
"size": {
"height": 1054,
"width": 171
},
"x": 321,
"y": 131
},
"mainWindowOption": 0,
"name": "MainWindow-1"
}
]
},
"operations": [
{
"comment": "AddDockWidget DockWidget-1 to top",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-1",
"location": 2,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-3 to left",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-3",
"location": 1,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "Hiding DockWidget-1",
"params": {
"dockWidgetName": "DockWidget-1"
},
"type": 2
},
{
"comment": "Hiding DockWidget-3",
"params": {
"dockWidgetName": "DockWidget-3"
},
"type": 2
},
{
"comment": "Showing DockWidget-1-[hidden]",
"params": {
"dockWidgetName": "DockWidget-1"
},
"type": 3
},
{
"comment": "AddDockWidgetAsTab DockWidget-2 onto DockWidget-1",
"params": {
"dockWidgetName": "DockWidget-1",
"dockWidgetToAddName": "DockWidget-2"
},
"type": 5
}
]
}

View File

@@ -1,245 +0,0 @@
{
"initialLayout": {
"dockWidgets": [
{
"geometry": {
"size": {
"height": 428,
"width": 800
},
"x": 212,
"y": 102
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 361,
"width": 599
},
"name": "DockWidget-1"
},
{
"geometry": {
"size": {
"height": 744,
"width": 568
},
"x": 437,
"y": 127
},
"isFloating": true,
"isVisible": false,
"minSize": {
"height": 422,
"width": 261
},
"name": "DockWidget-2"
},
{
"geometry": {
"size": {
"height": 1055,
"width": 768
},
"x": 452,
"y": 224
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 512,
"width": 386
},
"name": "DockWidget-3"
},
{
"geometry": {
"size": {
"height": 647,
"width": 677
},
"x": 458,
"y": 188
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 358,
"width": 224
},
"name": "DockWidget-4"
},
{
"geometry": {
"size": {
"height": 333,
"width": 739
},
"x": 408,
"y": 100
},
"isFloating": false,
"isVisible": false,
"minSize": {
"height": 252,
"width": 267
},
"name": "DockWidget-5"
},
{
"geometry": {
"size": {
"height": 1042,
"width": 468
},
"x": 343,
"y": 320
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 526,
"width": 234
},
"name": "DockWidget-6"
}
],
"mainWindows": [
{
"geometry": {
"size": {
"height": 1039,
"width": 94
},
"x": 364,
"y": 197
},
"mainWindowOption": 0,
"name": "MainWindow-1"
}
]
},
"operations": [
{
"comment": "Closing DockWidget-3",
"params": {
"dockWidgetName": "DockWidget-3"
},
"type": 1
},
{
"comment": "Closing DockWidget-6",
"params": {
"dockWidgetName": "DockWidget-6"
},
"type": 1
},
{
"comment": "AddDockWidget DockWidget-4 to bottom",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-4",
"location": 4,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-2-[hidden] to bottom",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-2",
"location": 4,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-2 to top",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-2",
"location": 2,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "Closing DockWidget-1",
"params": {
"dockWidgetName": "DockWidget-1"
},
"type": 1
},
{
"comment": "Closing DockWidget-2",
"params": {
"dockWidgetName": "DockWidget-2"
},
"type": 1
},
{
"comment": "Showing DockWidget-2-[hidden]",
"params": {
"dockWidgetName": "DockWidget-2"
},
"type": 3
},
{
"comment": "Showing DockWidget-3-[hidden]",
"params": {
"dockWidgetName": "DockWidget-3"
},
"type": 3
},
{
"comment": "Showing DockWidget-1-[hidden]",
"params": {
"dockWidgetName": "DockWidget-1"
},
"type": 3
},
{
"comment": "AddDockWidgetAsTab DockWidget-4 onto DockWidget-1",
"params": {
"dockWidgetName": "DockWidget-1",
"dockWidgetToAddName": "DockWidget-4"
},
"type": 5
},
{
"comment": "Closing DockWidget-2",
"params": {
"dockWidgetName": "DockWidget-2"
},
"type": 1
},
{
"comment": "AddDockWidget DockWidget-3 to right",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-3",
"location": 3,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-1-[hidden] to left",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-1",
"location": 1,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "Showing DockWidget-2-[hidden]",
"params": {
"dockWidgetName": "DockWidget-2"
},
"type": 3
}
]
}

View File

@@ -1,205 +0,0 @@
{
"initialLayout": {
"dockWidgets": [
{
"geometry": {
"size": {
"height": 292,
"width": 1062
},
"x": 163,
"y": 468
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 183,
"width": 485
},
"name": "DockWidget-1"
},
{
"geometry": {
"size": {
"height": 858,
"width": 559
},
"x": 39,
"y": 491
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 584,
"width": 388
},
"name": "DockWidget-2"
},
{
"geometry": {
"size": {
"height": 625,
"width": 693
},
"x": 390,
"y": 121
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 460,
"width": 386
},
"name": "DockWidget-3"
},
{
"geometry": {
"size": {
"height": 684,
"width": 740
},
"x": 243,
"y": 117
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 332,
"width": 414
},
"name": "DockWidget-5"
},
{
"geometry": {
"size": {
"height": 690,
"width": 676
},
"x": 288,
"y": 108
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 494,
"width": 506
},
"name": "DockWidget-6"
},
{
"geometry": {
"size": {
"height": 1011,
"width": 412
},
"x": 136,
"y": 197
},
"isFloating": true,
"isVisible": true,
"minSize": {
"height": 590,
"width": 209
},
"name": "DockWidget-8"
},
{
"geometry": {
"size": {
"height": 792,
"width": 754
},
"x": 64,
"y": 69
},
"isFloating": false,
"isVisible": true,
"minSize": {
"height": 560,
"width": 534
},
"name": "DockWidget-9"
}
],
"mainWindows": [
{
"geometry": {
"size": {
"height": 1346,
"width": 219
},
"x": 209,
"y": 85
},
"mainWindowOption": 0,
"name": "MainWindow-1"
}
]
},
"operations": [
{
"comment": "AddDockWidget DockWidget-8 to left",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-8",
"location": 1,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidgetAsTab DockWidget-8 onto DockWidget-9",
"params": {
"dockWidgetName": "DockWidget-9",
"dockWidgetToAddName": "DockWidget-8"
},
"type": 5
},
{
"comment": "AddDockWidget DockWidget-2 to left",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-2",
"location": 1,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-1 to top",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-1",
"location": 2,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidget DockWidget-6 to right",
"params": {
"addingOption": 0,
"dockWidgetName": "DockWidget-6",
"location": 3,
"mainWindowName": "MainWindow-1"
},
"type": 4
},
{
"comment": "AddDockWidgetAsTab DockWidget-5 onto DockWidget-3",
"params": {
"dockWidgetName": "DockWidget-3",
"dockWidgetToAddName": "DockWidget-5"
},
"type": 5
},
{
"comment": "AddDockWidgetAsTab DockWidget-9-[hidden] onto DockWidget-2",
"params": {
"dockWidgetName": "DockWidget-2",
"dockWidgetToAddName": "DockWidget-9"
},
"type": 5
}
]
}

View File

@@ -0,0 +1,133 @@
{
"allDockWidgets": [
{
"lastPosition": {
"lastFloatingGeometry": {
"height": 0,
"width": 0,
"x": 0,
"y": 0
},
"placeholders": [
{
"indexOfFloatingWindow": 0,
"isFloatingWindow": true,
"itemIndex": 0
}
],
"tabIndex": -1,
"wasFloating": false
},
"uniqueName": "1"
}
],
"closedDockWidgets": [
],
"floatingWindows": [
{
"geometry": {
"height": 129,
"width": 400,
"x": 0,
"y": 0
},
"isVisible": true,
"multiSplitterLayout": {
"frames": {
"1": {
"currentTabIndex": 0,
"dockWidgets": [
"1"
],
"geometry": {
"height": 90,
"width": 392,
"x": 0,
"y": 0
},
"id": "1",
"isNull": false,
"mainWindowUniqueName": "",
"objectName": "1",
"options": 0
}
},
"layout": {
"children": [
{
"guestId": "1",
"isContainer": false,
"isVisible": true,
"objectName": "1",
"sizingInfo": {
"geometry": {
"height": 90,
"width": 392,
"x": 0,
"y": 0
},
"maxSize": {
"height": 90,
"width": 524291
},
"minSize": {
"height": 90,
"width": 84
}
}
}
],
"isContainer": true,
"isVisible": false,
"objectName": "",
"orientation": 2,
"sizingInfo": {
"geometry": {
"height": 90,
"width": 392,
"x": 0,
"y": 0
},
"maxSize": {
"height": 16777215,
"width": 16777215
},
"minSize": {
"height": 90,
"width": 80
}
}
}
},
"normalGeometry": {
"height": 129,
"width": 400,
"x": 0,
"y": 0
},
"parentIndex": -1,
"screenIndex": 0,
"screenSize": {
"height": 600,
"width": 800
},
"windowState": 0
}
],
"mainWindows": [
],
"screenInfo": [
{
"devicePixelRatio": 1,
"geometry": {
"height": 600,
"width": 800,
"x": 0,
"y": 0
},
"index": 0,
"name": ""
}
],
"serializationVersion": 3
}

View File

@@ -6,6 +6,7 @@
<file>layouts/stuck-separator.json</file>
<file>layouts/layoutEquallyCrash.json</file>
<file>layouts/restoreWithIncompleteFactory.json</file>
<file>layouts/1.6layoutWithoutFloatingWindowFlags.json</file>
<file>main.qml</file>
<file>main2.qml</file>
</qresource>

View File

@@ -5078,6 +5078,13 @@ void TestDocks::tst_mdi_mixed_with_docking()
mdiArea->addDockWidget(mdiWidget1, QPoint(10, 10));
mdiArea->addDockWidget(mdiWidget2, QPoint(50, 50));
// We don't support LayoutSaver with mdi yet, but it shouldn't crash
// so test it as well
LayoutSaver saver;
saver.serializeLayout();
Frame *frameMDI1 = mdiWidget1->d->frame();
Frame *frame1 = dock1->d->frame();
QVERIFY(!frame1->isMDI());
@@ -7797,6 +7804,11 @@ void TestDocks::tst_addMDIDockWidget()
auto m = createMainWindow(QSize(800, 500), MainWindowOption_MDI);
auto dock0 = createDockWidget("dock0", new MyWidget2(QSize(400, 400)));
qobject_cast<MDILayoutWidget *>(m->layoutWidget())->addDockWidget(dock0, QPoint(0, 0), {});
// MDI doesn't support LayoutSaver yet, but it was crashing, so add a test
// to catch further crashes
LayoutSaver saver;
const QByteArray saved = saver.serializeLayout();
}
void TestDocks::tst_redockToMDIRestoresPosition()
@@ -7986,3 +7998,19 @@ void TestDocks::tst_crash326()
QEXPECT_FAIL("", "Bug #326, to be fixed", Continue);
QVERIFY(originalFrame != dock1->d->frame());
}
void TestDocks::tst_restoreFlagsFromVersion16()
{
EnsureTopLevelsDeleted e;
KDDockWidgets::Config::self().setFlags(KDDockWidgets::Config::Flag_HideTitleBarWhenTabsVisible);
// Save a layout with a floating window:
auto dock1 = createDockWidget("1", new QPushButton("1"));
LayoutSaver saver;
saver.restoreFromFile(":/layouts/1.6layoutWithoutFloatingWindowFlags.json");
auto floatingWindow = dock1->floatingWindow();
QVERIFY(floatingWindow);
QCOMPARE(floatingWindow->floatingWindowFlags(), FloatingWindowFlag::HideTitleBarWhenTabsVisible);
}

View File

@@ -248,6 +248,7 @@ private Q_SLOTS:
void tst_persistentCentralWidget();
void tst_setFloatingWindowFlags();
void tst_crash326();
void tst_restoreFlagsFromVersion16();
#ifdef KDDOCKWIDGETS_QTWIDGETS
// TODO: Port these to QtQuick

27
vscode.code-workspace Normal file
View File

@@ -0,0 +1,27 @@
{
"folders": [
{
"path": "."
}
],
"settings": {
"files.trimTrailingWhitespace": true,
"editor.formatOnType": true,
"cmake.copyCompileCommands": "${workspaceFolder}/compile_commands.json"
},
"launch": {
"version": "0.2.0",
"configurations": [
{
"name": "Current Target (LLDB)",
"type": "lldb",
"request": "launch",
"program": "${command:cmake.launchTargetPath}",
"args": [
""
],
"cwd": "${command:cmake.buildDirectory}"
}
]
}
}