Compare commits

..

1 Commits

Author SHA1 Message Date
pre-commit-ci[bot]
038f4fdb44 [pre-commit.ci] pre-commit autoupdate
updates:
- [github.com/pre-commit/pre-commit-hooks: v4.3.0 → v4.4.0](https://github.com/pre-commit/pre-commit-hooks/compare/v4.3.0...v4.4.0)
- [github.com/pre-commit/mirrors-clang-format: v14.0.6 → v15.0.7](https://github.com/pre-commit/mirrors-clang-format/compare/v14.0.6...v15.0.7)
- [github.com/PyCQA/pylint: v2.15.5 → v2.16.1](https://github.com/PyCQA/pylint/compare/v2.15.5...v2.16.1)
- [github.com/pre-commit/mirrors-autopep8: v1.7.0 → v2.0.1](https://github.com/pre-commit/mirrors-autopep8/compare/v1.7.0...v2.0.1)
- [github.com/fsfe/reuse-tool: v1.0.0 → v1.1.0](https://github.com/fsfe/reuse-tool/compare/v1.0.0...v1.1.0)
2023-02-07 02:41:47 +00:00
81 changed files with 12247 additions and 650 deletions

View File

@@ -1,9 +1,5 @@
# 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
@@ -17,22 +13,22 @@ repos:
args: [--allow-multiple-documents]
- id: check-json
- repo: https://github.com/pre-commit/mirrors-clang-format
rev: v14.0.6
rev: v15.0.7
hooks:
- id: clang-format
exclude: (.json)
- repo: https://github.com/PyCQA/pylint
rev: v2.17.1
rev: v2.16.1
hooks:
- id: pylint
exclude: ^(.cmake-format.py|conan/conanfile.py)
additional_dependencies: ["PySide2", "PySide6"]
- repo: https://github.com/pre-commit/mirrors-autopep8
rev: v2.0.2
rev: v2.0.1
hooks:
- id: autopep8
- repo: https://github.com/codespell-project/codespell
rev: v2.2.4
rev: v2.2.2
hooks:
- id: codespell
- repo: https://github.com/cheshirekow/cmake-format-precommit
@@ -50,6 +46,6 @@ repos:
language: ruby
files: \.(md|mdown|markdown)$
- repo: https://github.com/fsfe/reuse-tool
rev: v1.1.2
rev: v1.1.0
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 vscode.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 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,6 +63,11 @@
# 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)
@@ -88,8 +93,8 @@ project(
)
set(${PROJECT_NAME}_VERSION_MAJOR 1)
set(${PROJECT_NAME}_VERSION_MINOR 7)
set(${PROJECT_NAME}_VERSION_PATCH 1)
set(${PROJECT_NAME}_VERSION_MINOR 6)
set(${PROJECT_NAME}_VERSION_PATCH 95)
set(${PROJECT_NAME}_VERSION
${${PROJECT_NAME}_VERSION_MAJOR}.${${PROJECT_NAME}_VERSION_MINOR}.${${PROJECT_NAME}_VERSION_PATCH}
)
@@ -348,7 +353,29 @@ if(${PROJECT_NAME}_TESTS)
if(${PROJECT_NAME}_DEVELOPER_MODE)
add_subdirectory(tests)
add_test(NAME tst_docks COMMAND tst_docks)
# 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
if(NOT ${PROJECT_NAME}_QTQUICK)
# tst_multisplitter depends on QWidget

View File

@@ -9,10 +9,11 @@
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"KDDockWidgets_DEVELOPER_MODE": "ON",
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON"
"CMAKE_EXPORT_COMPILE_COMMANDS" : "ON",
"KDDockWidgets_FUZZER" : "OFF"
},
"warnings": {
"uninitialized": true
"warnings" : {
"uninitialized" : true
}
},
{
@@ -24,11 +25,12 @@
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"KDDockWidgets_DEVELOPER_MODE": "ON",
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON",
"ECM_ENABLE_SANITIZERS": "'address;undefined'"
"CMAKE_EXPORT_COMPILE_COMMANDS" : "ON",
"KDDockWidgets_FUZZER" : "OFF",
"ECM_ENABLE_SANITIZERS" : "'address;undefined'"
},
"warnings": {
"uninitialized": true
"warnings" : {
"uninitialized" : true
}
},
{
@@ -39,11 +41,11 @@
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"KDDockWidgets_WERROR": "ON",
"KDDockWidgets_EXAMPLES": "OFF"
"KDDockWidgets_EXAMPLES" : "OFF"
},
"environment": {
"CXX": "clazy",
"CCACHE_DISABLE": "ON"
"CCACHE_DISABLE" : "ON"
}
},
{
@@ -53,13 +55,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"
}
},
{
@@ -78,7 +80,7 @@
"binaryDir": "${sourceDir}/build-release-no-x11extras",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release",
"KDDockWidgets_X11EXTRAS": "OFF"
"KDDockWidgets_X11EXTRAS" : "OFF"
}
},
{
@@ -100,8 +102,9 @@
"CMAKE_BUILD_TYPE": "Debug",
"KDDockWidgets_QTQUICK": "ON",
"KDDockWidgets_DEVELOPER_MODE": "ON",
"ECM_ENABLE_SANITIZERS": "'address;undefined'",
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON"
"ECM_ENABLE_SANITIZERS" : "'address;undefined'",
"CMAKE_EXPORT_COMPILE_COMMANDS" : "ON",
"KDDockWidgets_FUZZER" : "OFF"
}
},
{
@@ -154,7 +157,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}"
@@ -169,8 +172,9 @@
"CMAKE_BUILD_TYPE": "Debug",
"KDDockWidgets_QT6": "ON",
"KDDockWidgets_DEVELOPER_MODE": "ON",
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON",
"CMAKE_PREFIX_PATH": "$env{QT6_DIR}"
"CMAKE_EXPORT_COMPILE_COMMANDS" : "ON",
"KDDockWidgets_FUZZER" : "OFF",
"CMAKE_PREFIX_PATH" : "$env{QT6_DIR}"
},
"environment": {
"PATH": "$env{QT6_DIR}/bin:$penv{PATH}"
@@ -185,9 +189,10 @@
"CMAKE_BUILD_TYPE": "Debug",
"KDDockWidgets_QT6": "ON",
"KDDockWidgets_DEVELOPER_MODE": "ON",
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON",
"ECM_ENABLE_SANITIZERS": "'address;undefined'",
"CMAKE_PREFIX_PATH": "$env{QT6_DIR}"
"CMAKE_EXPORT_COMPILE_COMMANDS" : "ON",
"ECM_ENABLE_SANITIZERS" : "'address;undefined'",
"KDDockWidgets_FUZZER" : "OFF",
"CMAKE_PREFIX_PATH" : "$env{QT6_DIR}"
},
"environment": {
"PATH": "$env{QT6_DIR}/bin:$penv{PATH}"
@@ -201,8 +206,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}"
@@ -216,16 +221,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"
}
},
{
@@ -236,10 +241,11 @@
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"KDDockWidgets_DEVELOPER_MODE": "ON",
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON"
"CMAKE_EXPORT_COMPILE_COMMANDS" : "ON",
"KDDockWidgets_FUZZER" : "ON"
},
"warnings": {
"uninitialized": true
"warnings" : {
"uninitialized" : true
},
"environment": {
"CC": "clang-cl",
@@ -254,10 +260,11 @@
"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",
@@ -272,11 +279,12 @@
"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",
@@ -292,19 +300,20 @@
"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"
}
},
{
@@ -315,17 +324,18 @@
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"KDDockWidgets_DEVELOPER_MODE": "ON",
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON",
"CMAKE_C_FLAGS_INIT": "-ftime-trace",
"CMAKE_EXPORT_COMPILE_COMMANDS" : "ON",
"KDDockWidgets_FUZZER" : "OFF",
"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"
}
},
{
@@ -336,18 +346,19 @@
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"KDDockWidgets_DEVELOPER_MODE": "ON",
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON",
"KDDockWidgets_QT6": "ON",
"CMAKE_C_FLAGS_INIT": "-ftime-trace",
"CMAKE_EXPORT_COMPILE_COMMANDS" : "ON",
"KDDockWidgets_FUZZER" : "OFF",
"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"
}
},
{
@@ -448,23 +459,17 @@
},
{
"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"
}
],
@@ -473,16 +478,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,21 +1,7 @@
* v1.7.1 (unreleased)
- Fixed pin button appearing by mistake when using Flag_TitleBarNoFloatButton (#359)
* v1.7.0 (03 May 2023)
* v1.7.0 (unreleased)
- 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,3 +1,19 @@
# KDDockWidgets and QtQuick
Please use branch 2.0 for QtQuick support.
## 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.

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
% python3 -m pip install \
% pip3 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
python3 -m pip list | grep PySide
pip3 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 pip.
except installing `shiboken6 pyside6 shiboken6_generator` with pip3.
## Building KDDockWidgets Python Bindings
@@ -79,14 +79,6 @@ 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,6 +62,7 @@ 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,9 +23,18 @@ 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})
@@ -36,8 +45,7 @@ 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
@@ -50,18 +58,16 @@ 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])
@@ -71,8 +77,7 @@ 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__)))
@@ -98,17 +103,10 @@ else()
#PySide
#===============================================================================
if(PYSIDE_CUSTOM_PREFIX STREQUAL "")
set(PYSIDE_CUSTOM_PREFIX ${PYSIDE2_BASEDIR})
endif()
find_path(
PYSIDE_INCLUDE_DIR pyside.h
find_path(PYSIDE_INCLUDE_DIR
pyside.h
PATHS ${PYSIDE2_BASEDIR}/include ${PYSIDE_CUSTOM_PREFIX}/include/PySide2
NO_DEFAULT_PATH
NO_CACHE
NO_SYSTEM_ENVIRONMENT_PATH
)
NO_DEFAULT_PATH)
# Platform specific library names
if(MSVC)
@@ -121,17 +119,15 @@ 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)
@@ -146,20 +142,17 @@ 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,8 +20,7 @@ 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
@@ -34,19 +33,17 @@ 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])
@@ -56,8 +53,7 @@ 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__)))
@@ -85,11 +81,10 @@ 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)
@@ -102,17 +97,15 @@ 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)
@@ -127,20 +120,17 @@ 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,15 +24,23 @@ 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
@@ -44,13 +52,14 @@ 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
@@ -62,13 +71,14 @@ 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__))))
@@ -81,21 +91,15 @@ 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")
@@ -105,13 +109,15 @@ 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}
)
@@ -123,35 +129,29 @@ 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,18 +177,15 @@ 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
@@ -196,8 +193,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,8 +17,7 @@
set(SHIBOKEN_FOUND FALSE)
execute_process(
COMMAND
${Python3_EXECUTABLE} -c "if True:
COMMAND ${Python3_EXECUTABLE} -c "if True:
import os
try:
import shiboken6_generator
@@ -30,13 +29,14 @@ 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,13 +48,14 @@ 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__))))
@@ -72,8 +73,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
)
@@ -85,13 +86,15 @@ 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}
)
@@ -103,35 +106,29 @@ 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)
@@ -157,18 +154,15 @@ 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
@@ -181,3 +175,4 @@ find_package_handle_standard_args(
REQUIRED_VARS SHIBOKEN_BASEDIR SHIBOKEN_INCLUDE_DIR SHIBOKEN_LIBRARY SHIBOKEN_BINARY
VERSION_VAR SHIBOKEN_VERSION
)

View File

@@ -7,8 +7,7 @@
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()
@@ -92,8 +91,7 @@ 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
@@ -103,17 +101,12 @@ macro(
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}")
@@ -126,10 +119,13 @@ macro(
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..."
@@ -140,10 +136,10 @@ macro(
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")
@@ -157,14 +153,18 @@ macro(
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,8 +7,7 @@
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()
@@ -92,8 +91,7 @@ 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
@@ -103,17 +101,12 @@ macro(
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}")
@@ -126,10 +119,13 @@ macro(
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..."
@@ -140,10 +136,10 @@ macro(
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")
@@ -157,14 +153,18 @@ macro(
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,10 +46,7 @@ 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

@@ -0,0 +1,145 @@
{
"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

@@ -0,0 +1,97 @@
{
"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

@@ -0,0 +1,145 @@
{
"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.7.0"
version = "1.6.95"
default_user = "kdab"
default_channel = "stable"
license = ("https://raw.githubusercontent.com/KDAB/KDDockWidgets/master/LICENSES/GPL-2.0-only.txt",

View File

@@ -1,9 +1,3 @@
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.7.0-1
Version: 1.6.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.7.0.tar.gz
00000000000000000000000000000000 00000 qt5-kddockwidgets-1.6.0.tar.gz

View File

@@ -1,5 +1,5 @@
Name: qt5-kddockwidgets
Version: 1.7.0
Version: 1.6.0
Release: 1
Summary: KDAB's Dock Widget Framework for Qt5
Source0: %{name}-%{version}.tar.gz
@@ -98,8 +98,6 @@ 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.7.0-1
Version: 1.6.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.7.0.tar.gz
00000000000000000000000000000000 00000 qt6-kddockwidgets-1.6.0.tar.gz

View File

@@ -1,5 +1,5 @@
Name: qt6-kddockwidgets
Version: 1.7.0
Version: 1.6.0
Release: 1
Summary: KDAB's Dock Widget Framework for Qt6
Source0: %{name}-%{version}.tar.gz
@@ -92,8 +92,6 @@ 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,9 +121,6 @@ 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()
@@ -213,26 +210,3 @@ 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,7 +27,6 @@ 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,21 +32,11 @@ 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)
# 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}"
)
set(${PROJECT_NAME}_PYTHON_BINDINGS_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
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 CONFIG)
find_package(Qt${Qt_VERSION_MAJOR}X11Extras)
target_link_libraries(kddockwidgets PUBLIC Qt${Qt_VERSION_MAJOR}::X11Extras)
endif()

View File

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

View File

@@ -317,9 +317,6 @@ 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 (grouped/nested with other dock widgets. Use this function
* main window or into a floating window (groupped/nested with other dock widgets. Use this function
* then if you need to disambiguate
*/
bool isInMainWindow() const;

View File

@@ -21,6 +21,8 @@
#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"
@@ -240,8 +242,8 @@ QUrl DefaultWidgetFactory::floatingWindowFilename() const
QIcon DefaultWidgetFactory::iconForButtonType(TitleBarButtonType type, qreal dpr) const
{
auto key = std::make_pair(type, dpr);
auto it = m_cachedIcons.constFind(key);
if (it != m_cachedIcons.cend())
auto it = m_cachedIcons.find(key);
if (it != m_cachedIcons.end())
return *it;
QString iconName;
@@ -275,11 +277,12 @@ QIcon DefaultWidgetFactory::iconForButtonType(TitleBarButtonType type, qreal dpr
QIcon icon(QStringLiteral(":/img/%1.png").arg(iconName));
if (!scalingFactorIsSupported(dpr)) {
auto atScopeEnd = qScopeGuard([&icon, this, key] {
m_cachedIcons.insert(key, icon);
});
if (!scalingFactorIsSupported(dpr))
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
@@ -288,7 +291,6 @@ 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,9 +182,8 @@ private:
enum RestoreOption {
RestoreOption_None = 0,
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.
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.
};
Q_DECLARE_FLAGS(RestoreOptions, RestoreOption)
Q_ENUM_NS(RestoreOptions)

View File

@@ -66,22 +66,15 @@ LayoutSaver::Layout *LayoutSaver::Layout::s_currentLayoutBeingRestored = nullptr
inline InternalRestoreOptions internalRestoreOptions(RestoreOptions options)
{
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) {
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 {};
}
return ret;
}
bool LayoutSaver::Private::s_restoreInProgress = false;
@@ -838,7 +831,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"), int(FloatingWindowFlag::FromGlobalConfig)).toInt();
flags = map.value(QStringLiteral("flags")).toInt();
screenSize = Layouting::mapToSize(map.value(QStringLiteral("screenSize")).toMap());
isVisible = map.value(QStringLiteral("isVisible")).toBool();
affinities = variantToStringList(map.value(QStringLiteral("affinities")).toList());

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, sb, frame] {
dw->d->lastPosition()->setLastOverlayedGeometry(sb->location(), frame->QWidgetAdapter::geometry());
connect(frame, &QWidgetAdapter::widgetGeometryChanged, this, [dw, loc = sb->location(), frame] {
dw->d->lastPosition()->setLastOverlayedGeometry(loc, frame->QWidgetAdapter::geometry());
});
frame->setAllowedResizeSides(d->allowedResizeSides(sb->location()));

View File

@@ -476,7 +476,7 @@ bool DockRegistry::isSane() const
names.insert(name);
}
if (!mainwindow->layoutWidget()->checkSanity())
if (!mainwindow->multiSplitter()->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->layoutWidget()->clearLayout();
mw->multiSplitter()->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. If during this the framework spits a
* This is called by the unit-tests or the fuzzer. If during this the framework spits a
* qWarning() then the app will qFatal()
*/
void checkSanityAll(bool dumpDebug = false);

View File

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

View File

@@ -31,14 +31,10 @@ DropIndicatorOverlayInterface::DropIndicatorOverlayInterface(DropArea *dropArea)
connect(DockRegistry::self(), &DockRegistry::dropIndicatorsInhibitedChanged, this,
[this](bool inhibited) {
if (inhibited) {
if (inhibited)
removeHover();
} 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());
}
}
// if false then simply moving the mouse will make the drop indicators appear again
});
}

View File

@@ -807,8 +807,3 @@ 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,9 +233,6 @@ 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,11 +173,10 @@ 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(/*honourNesting=*/true);
auto mainWindow = layout->mainWindow();
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) == Config::Flag_AutoHideSupport)
, m_supportsAutoHide(Config::self().flags() & 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) == Config::Flag_AutoHideSupport)
, m_supportsAutoHide(Config::self().flags() & Config::Flag_AutoHideSupport)
{
connect(m_floatingWindow, &FloatingWindow::numFramesChanged, this, &TitleBar::updateButtons);
connect(m_floatingWindow, &FloatingWindow::windowStateChanged, this, &TitleBar::updateMaximizeButton);

View File

@@ -369,7 +369,6 @@ 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);
@@ -377,13 +376,13 @@ bool WidgetResizeHandler::handleWindowsNativeEvent(QWindow *w, MSG *msg,
RECT rect;
GetWindowRect(reinterpret_cast<HWND>(w->winId()), &rect);
if (!hasFixedWidthOrHeight && xPos >= rect.left && xPos <= rect.left + borderWidth && yPos <= rect.bottom && yPos >= rect.bottom - borderWidth && features.hasResize()) {
if (xPos >= rect.left && xPos <= rect.left + borderWidth && yPos <= rect.bottom && yPos >= rect.bottom - borderWidth && features.hasResize()) {
*result = HTBOTTOMLEFT;
} else if (!hasFixedWidthOrHeight && xPos < rect.right && xPos >= rect.right - borderWidth && yPos <= rect.bottom && yPos >= rect.bottom - borderWidth && features.hasResize()) {
} else if (xPos < rect.right && xPos >= rect.right - borderWidth && yPos <= rect.bottom && yPos >= rect.bottom - borderWidth && features.hasResize()) {
*result = HTBOTTOMRIGHT;
} else if (!hasFixedWidthOrHeight && xPos >= rect.left && xPos <= rect.left + borderWidth && yPos >= rect.top && yPos <= rect.top + borderWidth && features.hasResize()) {
} else if (xPos >= rect.left && xPos <= rect.left + borderWidth && yPos >= rect.top && yPos <= rect.top + borderWidth && features.hasResize()) {
*result = HTTOPLEFT;
} else if (!hasFixedWidthOrHeight && xPos <= rect.right && xPos >= rect.right - borderWidth && yPos >= rect.top && yPos < rect.top + borderWidth && features.hasResize()) {
} else if (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() && m_floatingWindow) { // Wayland doesn't support setting opacity
if (!isWayland()) { // 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,6 +9,10 @@
# 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()
@@ -25,6 +29,8 @@ 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(
@@ -40,4 +46,16 @@ 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
)

1016
tests/fuzzer/9.json Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,21 @@
#
# 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)

404
tests/fuzzer/Fuzzer.cpp Normal file
View File

@@ -0,0 +1,404 @@
/*
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();
}

283
tests/fuzzer/Fuzzer.h Normal file
View File

@@ -0,0 +1,283 @@
/*
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

483
tests/fuzzer/Operations.cpp Normal file
View File

@@ -0,0 +1,483 @@
/*
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 &)
{
}

217
tests/fuzzer/Operations.h Normal file
View File

@@ -0,0 +1,217 @@
/*
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

104
tests/fuzzer/main.cpp Normal file
View File

@@ -0,0 +1,104 @@
/*
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

@@ -0,0 +1,138 @@
{
"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

@@ -0,0 +1,761 @@
{
"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

@@ -0,0 +1,312 @@
{
"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

@@ -0,0 +1,599 @@
{
"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

@@ -0,0 +1,364 @@
{
"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

@@ -0,0 +1,212 @@
{
"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

@@ -0,0 +1,159 @@
{
"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

@@ -0,0 +1,905 @@
{
"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

@@ -0,0 +1,378 @@
{
"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

@@ -0,0 +1,212 @@
{
"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

@@ -0,0 +1,833 @@
{
"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

@@ -0,0 +1,645 @@
{
"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

@@ -0,0 +1,142 @@
{
"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

@@ -0,0 +1,135 @@
{
"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

@@ -0,0 +1,76 @@
{
"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

@@ -0,0 +1,122 @@
{
"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

@@ -0,0 +1,245 @@
{
"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

@@ -0,0 +1,205 @@
{
"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

View File

@@ -1,133 +0,0 @@
{
"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,7 +6,6 @@
<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,13 +5078,6 @@ 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());
@@ -7804,11 +7797,6 @@ 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()
@@ -7998,19 +7986,3 @@ 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,7 +248,6 @@ private Q_SLOTS:
void tst_persistentCentralWidget();
void tst_setFloatingWindowFlags();
void tst_crash326();
void tst_restoreFlagsFromVersion16();
#ifdef KDDOCKWIDGETS_QTWIDGETS
// TODO: Port these to QtQuick

View File

@@ -1,27 +0,0 @@
{
"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}"
}
]
}
}