# This file is part of KDDockWidgets. # # SPDX-FileCopyrightText: 2019-2022 Klarälvdalens Datakonsult AB, a KDAB Group company # Author: Sergio Martins # # SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only # # Contact KDAB at for commercial licensing options. # if(POLICY CMP0043) cmake_policy(SET CMP0043 NEW) endif() add_definitions(-DQT_NO_SIGNALS_SLOTS_KEYWORDS -DQT_USE_QSTRINGBUILDER -DQT_NO_NARROWING_CONVERSIONS_IN_CONNECT -DQT_STRICT_ITERATORS -DQT_NO_KEYWORDS -DQT_NO_FOREACH ) set(KDDW_BACKEND_SRCS KDDockWidgets.cpp Config.cpp Config.h Qt5Qt6Compat_p.h FocusScope.cpp FocusScope.h ViewFactory.cpp ViewFactory.h LayoutSaver.cpp LayoutSaver.h DockRegistry.cpp private/LayoutSaver_p.h private/Position.cpp private/Position_p.h private/Logging.cpp private/Logging_p.h private/Draggable.cpp private/Draggable_p.h private/WindowBeingDragged.cpp private/WindowBeingDragged_p.h private/DragController.cpp private/DragController_p.h private/WidgetResizeHandler.cpp private/WidgetResizeHandler_p.h private/WindowZOrder_x11_p.h private/multisplitter/Item.cpp private/multisplitter/Item_p.h private/multisplitter/ItemFreeContainer.cpp private/multisplitter/ItemFreeContainer_p.h controllers/DockWidget.cpp controllers/DockWidget.h controllers/DropArea.cpp controllers/DropArea.h controllers/DropIndicatorOverlay.cpp controllers/DropIndicatorOverlay.h controllers/FloatingWindow.cpp controllers/FloatingWindow.h controllers/Group.cpp controllers/Layout.cpp controllers/Layout.h controllers/MainWindow.cpp controllers/MainWindow.h controllers/MDILayout.cpp controllers/MDILayout.h controllers/Separator.cpp controllers/Separator.h controllers/SideBar.cpp controllers/SideBar.h controllers/Stack.cpp controllers/Stack.h controllers/TitleBar.cpp controllers/TitleBar.h controllers/TabBar.cpp controllers/TabBar.h controllers/indicators/NullIndicators.cpp controllers/indicators/NullIndicators.h controllers/indicators/ClassicIndicators.cpp controllers/indicators/ClassicIndicators.h controllers/indicators/SegmentedIndicators.cpp controllers/indicators/SegmentedIndicators.h Action.cpp Action.h Window.cpp Window.h View.cpp View.h ViewGuard.cpp ViewGuard.h ViewWrapper.cpp ViewWrapper.h Controller.cpp Controller.h Platform.cpp Platform.h views/ClassicIndicatorWindowViewInterface.cpp views/MainWindowMDIViewInterface.cpp views/MainWindowViewInterface.cpp views/MainWindowViewInterface.h views/GroupViewInterface.cpp views/DockWidgetViewInterface.cpp views/DockWidgetViewInterface.h views/GroupViewInterface.h views/StackViewInterface.cpp views/TabBarViewInterface.cpp views/TitleBarViewInterface.cpp views/SideBarViewInterface.cpp qtcommon/Platform_qt.cpp qtcommon/Window_qt.cpp kddockwidgets_resources.qrc ) SET(KDDW_FRONTEND_QTWIDGETS_SRCS qtwidgets/Window_qtwidgets.cpp qtwidgets/Platform_qtwidgets.cpp qtwidgets/Platform_qtwidgets.h qtwidgets/views/View_qtwidgets.cpp qtwidgets/views/View_qtwidgets.h qtwidgets/views/ViewWrapper_qtwidgets.cpp qtwidgets/views/ViewWrapper_qtwidgets.h qtwidgets/views/FloatingWindow_qtwidgets.cpp qtwidgets/views/FloatingWindow_qtwidgets.h qtwidgets/views/DockWidget_qtwidgets.cpp qtwidgets/views/DockWidget_qtwidgets.h qtwidgets/views/DropArea_qtwidgets.cpp qtwidgets/views/DropArea_qtwidgets.h qtwidgets/views/MDILayout_qtwidgets.cpp qtwidgets/views/MDILayout_qtwidgets.h qtwidgets/views/Group_qtwidgets.cpp qtwidgets/views/MainWindow_qtwidgets.cpp qtwidgets/views/MainWindow_qtwidgets.h qtwidgets/views/MainWindowMDI_qtwidgets.cpp qtwidgets/views/MDIArea_qtwidgets.cpp qtwidgets/views/RubberBand_qtwidgets.cpp qtwidgets/views/RubberBand_qtwidgets.h qtwidgets/views/Separator_qtwidgets.cpp qtwidgets/views/Separator_qtwidgets.h qtwidgets/views/TitleBar_qtwidgets.cpp qtwidgets/views/TitleBar_qtwidgets.h qtwidgets/views/TabBar_qtwidgets.cpp qtwidgets/views/TabBar_qtwidgets.h qtwidgets/views/Stack_qtwidgets.cpp qtwidgets/views/Stack_qtwidgets.h qtwidgets/views/SideBar_qtwidgets.cpp qtwidgets/views/ClassicIndicatorsOverlay_qtwidgets.cpp qtwidgets/views/ClassicIndicatorsOverlay_qtwidgets.h qtwidgets/views/ClassicIndicatorsWindow_qtwidgets.cpp qtwidgets/views/ClassicIndicatorsWindow_qtwidgets.h qtwidgets/views/SegmentedIndicatorsOverlay_qtwidgets.cpp qtwidgets/views/SegmentedIndicatorsOverlay_qtwidgets.h qtwidgets/TestHelpers_qtwidgets.cpp qtwidgets/ViewFactory_qtwidgets.cpp qtwidgets/ViewFactory_qtwidgets.h qtwidgets/DebugWindow.cpp qtwidgets/DebugWindow.h qtwidgets/ObjectViewer.cpp qtwidgets/ObjectViewer.h ) SET(KDDW_FRONTEND_QTQUICK_SRCS qtquick/Window_qtquick.cpp qtquick/Window_qtquick.h qtquick/Platform_qtquick.cpp qtquick/Platform_qtquick.h qtquick/Helpers.cpp qtquick/TestHelpers_qtquick.cpp qtquick/ViewFactory_qtquick.cpp qtquick/ViewFactory_qtquick.h qtquick/LayoutSaverInstantiator.cpp qtquick/LayoutSaverInstantiator.h qtquick/MainWindowInstantiator.cpp qtquick/MainWindowInstantiator.h qtquick/DockWidgetInstantiator.cpp qtquick/DockWidgetInstantiator.h qtquick/QmlTypes.cpp qtquick/QmlTypes.h qtquick/views/DropArea_qtquick.cpp qtquick/views/DropArea_qtquick.h qtquick/views/DockWidget_qtquick.cpp qtquick/views/DockWidget_qtquick.h qtquick/views/FloatingWindow_qtquick.cpp qtquick/views/FloatingWindow_qtquick.h qtquick/views/Group_qtquick.cpp qtquick/views/MainWindow_qtquick.cpp qtquick/views/MainWindow_qtquick.h qtquick/views/MainWindowMDI_qtquick.cpp qtquick/views/MainWindowMDI_qtquick.h qtquick/views/MDILayout_qtquick.cpp qtquick/views/MDILayout_qtquick.h qtquick/views/RubberBand_qtquick.cpp qtquick/views/RubberBand_qtquick.h qtquick/views/Separator_qtquick.cpp qtquick/views/Separator_qtquick.h qtquick/views/Stack_qtquick.cpp qtquick/views/Stack_qtquick.h qtquick/views/TabBar_qtquick.cpp qtquick/views/TabBar_qtquick.h qtquick/views/TitleBar_qtquick.cpp qtquick/views/TitleBar_qtquick.h qtquick/views/View_qtquick.cpp qtquick/views/View_qtquick.h qtquick/views/ViewWrapper_qtquick.cpp qtquick/views/ViewWrapper_qtquick.h qtquick/views/ClassicIndicatorsWindow_qtquick.cpp qtquick/views/ClassicIndicatorsWindow_qtquick.h qtquick/kddockwidgets_qtquick.qrc ) set(KDDW_PUBLIC_HEADERS docks_export.h Config.h KDDockWidgets.h FocusScope.h LayoutSaver.h Action.h Controller.h View.h ViewWrapper.h Window.h ViewFactory.h Qt5Qt6Compat_p.h Platform.h ) set(KDDW_PRIVATE_HEADERS private/DragController_p.h private/Draggable_p.h private/LayoutSaver_p.h private/WindowBeingDragged_p.h private/WidgetResizeHandler_p.h DockRegistry.h # No ABI guarantees for now, so copy to private/ ) set(KDDW_CONTROLLER_HEADERS controllers/DockWidget.h controllers/DockWidget_p.h controllers/DropIndicatorOverlay.h controllers/DropArea.h controllers/FloatingWindow.h controllers/Group.h controllers/Layout.h controllers/MDILayout.h controllers/SideBar.h controllers/TabBar.h controllers/MainWindow.h controllers/Separator.h controllers/Stack.h controllers/TitleBar.h ) set(KDDW_VIEWINTERFACE_HEADERS views/StackViewInterface.h views/SideBarViewInterface.h views/ClassicIndicatorWindowViewInterface.h views/TabBarViewInterface.h views/TitleBarViewInterface.h views/DockWidgetViewInterface.h views/MainWindowMDIViewInterface.h views/MainWindowViewInterface.h views/GroupViewInterface.h ) set(KDDW_INDICATOR_HEADERS controllers/indicators/NullIndicators.h controllers/indicators/ClassicIndicators.h controllers/indicators/SegmentedIndicators.h ) set(DOCKSLIBS_SRCS ${KDDW_BACKEND_SRCS}) if (KDDW_FRONTEND_QTWIDGETS) set(DOCKSLIBS_SRCS ${DOCKSLIBS_SRCS} ${KDDW_FRONTEND_QTWIDGETS_SRCS}) endif() if (KDDW_FRONTEND_QTQUICK) set(DOCKSLIBS_SRCS ${DOCKSLIBS_SRCS} ${KDDW_FRONTEND_QTQUICK_SRCS}) endif() #Generate C/C++ CamelCase forwarding headers (only public includes) include(ECMGenerateHeaders) ecm_generate_headers(camelcase_HEADERS ORIGINAL CAMELCASE HEADER_NAMES Config # DockWidget # DockWidgetBase FocusScope ViewFactory, # DefaultWidgetFactory LayoutSaver # MainWindow # MainWindowBase # MainWindowMDI ) add_library(kddockwidgets ${KDDockWidgets_LIBRARY_MODE} ${DOCKSLIBS_SRCS} ${KDDW_PUBLIC_HEADERS}) add_library(KDAB::kddockwidgets ALIAS kddockwidgets) set_target_properties(kddockwidgets PROPERTIES OUTPUT_NAME "kddockwidgets${KDDockWidgets_LIBRARY_QTID}") set_compiler_flags(kddockwidgets) if(KDDockWidgets_QT6) set(DOCKS_INCLUDES_INSTALL_PATH "include/kddockwidgets-qt6") else() set(DOCKS_INCLUDES_INSTALL_PATH "include/") endif() # Use a separate target for our kdbindings/signal.h header # as it doesn't compile with -Wweak-vtables add_library(kdbindings INTERFACE) target_include_directories(kdbindings SYSTEM INTERFACE $ ) target_include_directories(kddockwidgets PUBLIC $ $ PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ) if (KDDW_FRONTEND_QTWIDGETS) target_include_directories(kddockwidgets PUBLIC $ ) endif() if (KDDW_FRONTEND_QTQUICK) target_include_directories(kddockwidgets PUBLIC $ ) endif() target_compile_definitions(kddockwidgets PRIVATE QT_NO_CAST_TO_ASCII QT_NO_CAST_FROM_ASCII QT_NO_URL_CAST_FROM_STRING QT_NO_CAST_FROM_BYTEARRAY ) if(KDDockWidgets_STATIC) target_compile_definitions(kddockwidgets PUBLIC KDDOCKWIDGETS_STATICLIB) else() target_compile_definitions(kddockwidgets PRIVATE BUILDING_DOCKS_LIBRARY) endif() if(CMAKE_COMPILER_IS_GNUCXX OR IS_CLANG_BUILD) target_compile_options(kddockwidgets PRIVATE -Wshadow) if(NOT MSVC) target_compile_options(kddockwidgets PRIVATE -fvisibility=hidden) endif() # Disable -Wconversion for Qt6. The qsizetype to int conversions are harmless if(NOT KDDockWidgets_QT6) target_compile_options(kddockwidgets PRIVATE -Wconversion) endif() if(IS_CLANG_BUILD) target_compile_options(kddockwidgets PRIVATE -Wweak-vtables) endif() endif() # BEGIN coverage add_library(coverage_options INTERFACE) if(KDDockWidgets_CODE_COVERAGE AND (CMAKE_COMPILER_IS_GNUCXX OR IS_CLANG_BUILD) AND NOT MSVC) if(KDDockWidgets_DEVELOPER_MODE) # Add required flags (GCC & LLVM/Clang) target_compile_options(coverage_options INTERFACE --coverage) if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.13) target_link_options(coverage_options INTERFACE --coverage) else() target_link_libraries(coverage_options INTERFACE --coverage) endif() endif() endif() # END coverage if (KDDW_FRONTEND_QTWIDGETS) target_link_libraries(kddockwidgets PUBLIC Qt${Qt_VERSION_MAJOR}::Widgets PRIVATE Qt${Qt_VERSION_MAJOR}::WidgetsPrivate) endif() if (KDDW_FRONTEND_QTQUICK) target_link_libraries(kddockwidgets PUBLIC Qt${Qt_VERSION_MAJOR}::Quick Qt${Qt_VERSION_MAJOR}::QuickControls2) target_link_libraries(kddockwidgets PRIVATE Qt${Qt_VERSION_MAJOR}::GuiPrivate) endif() if (KDDockWidgets_CODE_COVERAGE) target_link_libraries(kddockwidgets PUBLIC coverage_options) endif() if (KDDockWidgets_DEVELOPER_MODE) find_package(Qt${Qt_VERSION_MAJOR}Test ${QT_MIN_VERSION} REQUIRED) target_link_libraries(kddockwidgets PUBLIC Qt${Qt_VERSION_MAJOR}::Test) endif() target_link_libraries(kddockwidgets PRIVATE kdbindings) if(WIN32) target_link_libraries(kddockwidgets PRIVATE Qt${Qt_VERSION_MAJOR}::GuiPrivate dwmapi) elseif(NOT APPLE AND NOT EMSCRIPTEN AND NOT KDDockWidgets_QT6 AND KDDockWidgets_X11EXTRAS) find_package(Qt${Qt_VERSION_MAJOR}X11Extras) target_link_libraries(kddockwidgets PUBLIC Qt${Qt_VERSION_MAJOR}::X11Extras) endif() if(KDDockWidgets_XLib) target_link_libraries(kddockwidgets PRIVATE X11) endif() find_package(nlohmann_json) if (nlohmann_json_FOUND) target_link_libraries(kddockwidgets PRIVATE nlohmann_json::nlohmann_json) else() message("nlohmann_json not found in system. Using our own bundled one") target_include_directories(kddockwidgets SYSTEM PRIVATE 3rdparty/nlohmann) endif() set_target_properties(kddockwidgets PROPERTIES SOVERSION ${KDDockWidgets_SOVERSION} VERSION ${KDDockWidgets_VERSION} ) #version libraries on Windows if(WIN32) if(CMAKE_BUILD_TYPE) set(postfix ${KDDockWidgets_VERSION_MAJOR}) string(TOUPPER ${CMAKE_BUILD_TYPE} UPPER_BUILD_TYPE) if(${UPPER_BUILD_TYPE} MATCHES "^DEBUG") string(CONCAT postfix ${postfix} "d") set_target_properties(kddockwidgets PROPERTIES DEBUG_POSTFIX ${postfix}) else() set_target_properties(kddockwidgets PROPERTIES ${UPPER_BUILD_TYPE}_POSTFIX ${postfix}) endif() elseif(CMAKE_CONFIGURATION_TYPES) # Visual Studio generator set_target_properties(kddockwidgets PROPERTIES DEBUG_POSTFIX d) endif() endif() install(TARGETS kddockwidgets EXPORT kddockwidgetsTargets RUNTIME DESTINATION ${INSTALL_RUNTIME_DIR} LIBRARY DESTINATION ${INSTALL_LIBRARY_DIR} ARCHIVE DESTINATION ${INSTALL_ARCHIVE_DIR} ) if(MSVC AND NOT KDDockWidgets_STATIC) install(FILES "$/$" DESTINATION ${INSTALL_LIBRARY_DIR} CONFIGURATIONS Debug RelWithDebInfo) endif() # install(FILES ${camelcase_HEADERS} DESTINATION ${DOCKS_INCLUDES_INSTALL_PATH}/kddockwidgets) install(FILES ${KDDW_PUBLIC_HEADERS} DESTINATION ${DOCKS_INCLUDES_INSTALL_PATH}/kddockwidgets) install(FILES ${KDDW_PRIVATE_HEADERS} DESTINATION ${DOCKS_INCLUDES_INSTALL_PATH}/kddockwidgets/private) install(FILES ${KDDW_CONTROLLER_HEADERS} DESTINATION ${DOCKS_INCLUDES_INSTALL_PATH}/kddockwidgets/controllers) install(FILES ${KDDW_VIEWINTERFACE_HEADERS} DESTINATION ${DOCKS_INCLUDES_INSTALL_PATH}/kddockwidgets/views) install(FILES ${KDDW_INDICATOR_HEADERS} DESTINATION ${DOCKS_INCLUDES_INSTALL_PATH}/kddockwidgets/controllers/indicators) if (KDDW_FRONTEND_QTWIDGETS) SET(KDDW_QTWIDGET_HEADERS qtwidgets/Platform_qtwidgets.h qtwidgets/ViewFactory_qtwidgets.h ) SET(KDDW_QTWIDGET_VIEW_HEADERS qtwidgets/views/DockWidget_qtwidgets.h qtwidgets/views/Separator_qtwidgets.h qtwidgets/views/RubberBand_qtwidgets.h qtwidgets/views/SideBar_qtwidgets.h qtwidgets/views/FloatingWindow_qtwidgets.h qtwidgets/views/View_qtwidgets.h qtwidgets/views/MainWindowMDI_qtwidgets.h qtwidgets/views/ViewWrapper_qtwidgets.h qtwidgets/views/MDILayout_qtwidgets.h qtwidgets/views/MDIArea_qtwidgets.h qtwidgets/views/DropArea_qtwidgets.h qtwidgets/views/ClassicIndicatorsOverlay_qtwidgets.h qtwidgets/views/Stack_qtwidgets.h qtwidgets/views/Group_qtwidgets.h qtwidgets/views/TabBar_qtwidgets.h qtwidgets/views/ClassicIndicatorsWindow_qtwidgets.h qtwidgets/views/SegmentedIndicatorsOverlay_qtwidgets.h qtwidgets/views/MainWindow_qtwidgets.h qtwidgets/views/TitleBar_qtwidgets.h ) install(FILES ${KDDW_QTWIDGET_HEADERS} DESTINATION ${DOCKS_INCLUDES_INSTALL_PATH}/kddockwidgets) install(FILES ${KDDW_QTWIDGET_VIEW_HEADERS} DESTINATION ${DOCKS_INCLUDES_INSTALL_PATH}/kddockwidgets/views) endif() if (KDDW_FRONTEND_QTQUICK) SET(KDDW_QTQUICK_HEADERS qtquick/ViewFactory_qtquick.h qtquick/DockWidgetInstantiator.h qtquick/Platform_qtquick.h qtquick/LayoutSaverInstantiator.h qtquick/MainWindowInstantiator.h ) SET(KDDW_QTQUICK_VIEW_HEADERS qtquick/views/ClassicIndicatorsWindow_qtquick.h qtquick/views/View_qtquick.h qtquick/views/Separator_qtquick.h qtquick/views/MainWindowMDI_qtquick.h qtquick/views/RubberBand_qtquick.h qtquick/views/MainWindow_qtquick.h qtquick/views/Separator_quick.h qtquick/views/FloatingWindow_qtquick.h qtquick/views/SideBar_qtquick.h qtquick/views/TabBar_qtquick.h qtquick/views/DockWidget_qtquick.h qtquick/views/Stack_qtquick.h qtquick/views/MDILayout_qtquick.h qtquick/views/DropArea_qtquick.h qtquick/views/Group_qtquick.h qtquick/views/TitleBar_qtquick.h qtquick/views/ViewWrapper_qtquick.h ) install(FILES ${KDDW_QTQUICK_HEADERS} DESTINATION ${DOCKS_INCLUDES_INSTALL_PATH}/kddockwidgets) install(FILES ${KDDW_QTQUICK_VIEW_HEADERS} DESTINATION ${DOCKS_INCLUDES_INSTALL_PATH}/kddockwidgets/views) endif() if (KDDW_FRONTEND_QTWIDGETS OR KDDW_FRONTEND_QTQUICK) SET(KDDW_QT_HEADERS qtcommon/Platform_qt.h ) install(FILES ${KDDW_QT_HEADERS} DESTINATION ${DOCKS_INCLUDES_INSTALL_PATH}/kddockwidgets) endif() # Generate library version files include(ECMSetupVersion) ecm_setup_version( ${KDDockWidgets_VERSION} VARIABLE_PREFIX KDDOCKWIDGETS VERSION_HEADER "${CMAKE_CURRENT_BINARY_DIR}/kddockwidgets_version.h" PACKAGE_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/KDDockWidgets${KDDockWidgets_LIBRARY_QTID}ConfigVersion.cmake" SOVERSION ${KDDockWidgets_SOVERSION} COMPATIBILITY AnyNewerVersion ) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/kddockwidgets_version.h" DESTINATION ${DOCKS_INCLUDES_INSTALL_PATH}/kddockwidgets) install(EXPORT kddockwidgetsTargets FILE KDDockWidgets${KDDockWidgets_LIBRARY_QTID}Targets.cmake NAMESPACE KDAB:: DESTINATION ${INSTALL_LIBRARY_DIR}/cmake/KDDockWidgets${KDDockWidgets_LIBRARY_QTID} ) configure_file(KDDockWidgetsConfig.cmake.in KDDockWidgets${KDDockWidgets_LIBRARY_QTID}Config.cmake @ONLY) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/KDDockWidgets${KDDockWidgets_LIBRARY_QTID}Config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/KDDockWidgets${KDDockWidgets_LIBRARY_QTID}ConfigVersion.cmake" DESTINATION ${INSTALL_LIBRARY_DIR}/cmake/KDDockWidgets${KDDockWidgets_LIBRARY_QTID} ) if(KDDockWidgets_DEVELOPER_MODE) # Under developer mode since kddw might be a sub-folder of a project setting a different value for QT_DISABLE_DEPRECATED_BEFORE target_compile_definitions(kddockwidgets PRIVATE QT_DISABLE_DEPRECATED_BEFORE=0x060000) option(KDDockWidgets_LINTER "Build the layout linter" ON) if(KDDockWidgets_LINTER) set(LINTER_SRCS layoutlinter_main.cpp) if (KDDW_FRONTEND_QTQUICK) # QtQuick needs main.qml to create views set(LINTER_SRCS ${LINTER_SRCS} ../tests/test_resources.qrc) endif() add_executable(kddockwidgets_linter ${LINTER_SRCS}) target_link_libraries(kddockwidgets_linter kddockwidgets) endif() endif()