From 72ac856fa79e8bc80c8f6c75ed02650a47156d06 Mon Sep 17 00:00:00 2001 From: Sergio Martins Date: Sat, 16 Jul 2022 23:47:53 +0100 Subject: [PATCH 1/5] Allow to use TitleBar with non-KDDW widgets For example, on EGLFS, the user might want some dialogs with similar decorations. In the future we can make it draggable as well. --- src/private/TitleBar.cpp | 32 +++++++++++++++++++++++++- src/private/TitleBar_p.h | 7 ++++++ src/private/widgets/TitleBarWidget.cpp | 8 +++++++ src/private/widgets/TitleBarWidget_p.h | 1 + 4 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/private/TitleBar.cpp b/src/private/TitleBar.cpp index ddc4963e..037c93fe 100644 --- a/src/private/TitleBar.cpp +++ b/src/private/TitleBar.cpp @@ -32,6 +32,7 @@ TitleBar::TitleBar(Frame *parent) , Draggable(this) , m_frame(parent) , m_floatingWindow(nullptr) + , m_genericWidget(nullptr) , m_supportsAutoHide(Config::self().flags() & Config::Flag_AutoHideSupport) { connect(m_frame, &Frame::numDockWidgetsChanged, this, &TitleBar::updateCloseButton); @@ -49,6 +50,7 @@ TitleBar::TitleBar(FloatingWindow *parent) , Draggable(this) , m_frame(nullptr) , m_floatingWindow(parent) + , m_genericWidget(nullptr) , m_supportsAutoHide(Config::self().flags() & Config::Flag_AutoHideSupport) { connect(m_floatingWindow, &FloatingWindow::numFramesChanged, this, &TitleBar::updateButtons); @@ -57,6 +59,17 @@ TitleBar::TitleBar(FloatingWindow *parent) init(); } +TitleBar::TitleBar(QWidget *parent) + : QWidgetAdapter(parent) + , Draggable(this, /*enabled=*/false) // We don't allow dragging generic windows at this time + , m_frame(nullptr) + , m_floatingWindow(nullptr) + , m_genericWidget(parent) + , m_supportsAutoHide(false) +{ + init(); +} + void TitleBar::init() { setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed)); @@ -91,7 +104,7 @@ bool TitleBar::onDoubleClicked() MainWindowBase *TitleBar::mainWindow() const { - if (m_floatingWindow) + if (m_floatingWindow || m_genericWidget) return nullptr; if (m_frame) @@ -212,6 +225,9 @@ void TitleBar::setIcon(const QIcon &icon) std::unique_ptr TitleBar::makeWindow() { + if (m_genericWidget) + return {}; // not applicable + if (!isVisible() && window()->isVisible() && !(Config::self().flags() & Config::Flag_ShowButtonsOnTabBarIfTitleBarHidden)) { // When using Flag_ShowButtonsOnTabBarIfTitleBarHidden we forward the call from the tab bar's @@ -262,6 +278,9 @@ DockWidgetBase *TitleBar::singleDockWidget() const bool TitleBar::supportsFloatingButton() const { + if (m_genericWidget) + return {}; // not applicable + if (Config::self().flags() & Config::Flag_TitleBarHasMaximizeButton) { // Apps having a maximize/restore button traditionally don't have a floating one, // QDockWidget style only has floating and no maximize/restore. @@ -318,6 +337,8 @@ bool TitleBar::isFocused() const return m_frame->isFocused(); else if (m_floatingWindow) return m_floatingWindow->isActiveWindow(); + else if (m_genericWidget) + return m_genericWidget->isActiveWindow(); return false; } @@ -362,6 +383,9 @@ void TitleBar::onCloseClicked() } else { m_floatingWindow->close(); } + } else if (m_genericWidget) { + if (auto window = m_genericWidget->window()) + window->close(); } } @@ -373,6 +397,9 @@ bool TitleBar::isFloating() const if (m_frame) return m_frame->isFloating(); + if (m_genericWidget) + return false; // Not applicable + qWarning() << "TitleBar::isFloating: shouldn't happen"; return false; } @@ -390,6 +417,9 @@ DockWidgetBase::List TitleBar::dockWidgets() const if (m_frame) return m_frame->dockWidgets(); + if (m_genericWidget) + return {}; // Not applicable + qWarning() << "TitleBar::dockWidget: shouldn't happen"; return {}; } diff --git a/src/private/TitleBar_p.h b/src/private/TitleBar_p.h index 9862666b..313ebfbf 100644 --- a/src/private/TitleBar_p.h +++ b/src/private/TitleBar_p.h @@ -50,6 +50,11 @@ public: explicit TitleBar(Frame *parent); explicit TitleBar(FloatingWindow *parent); + + /// Allows TitleBar to be used in a non-dockwidget application, for example on a frameless QMessageBox on EGLFS + /// Just so we can reuse the existing styling + explicit TitleBar(QWidget *parent); + ~TitleBar() override; void setTitle(const QString &title); @@ -173,6 +178,7 @@ private: void updateFloatButton(); void updateCloseButton(); void setCloseButtonEnabled(bool); + void setCloseButtonVisible(bool); void setFloatButtonVisible(bool); void setFloatButtonToolTip(const QString &); @@ -184,6 +190,7 @@ private: Frame *const m_frame; FloatingWindow *const m_floatingWindow; + QWidget *const m_genericWidget; const bool m_supportsAutoHide; bool m_closeButtonEnabled = true; bool m_floatButtonVisible = true; diff --git a/src/private/widgets/TitleBarWidget.cpp b/src/private/widgets/TitleBarWidget.cpp index e634f95c..5b5d50d0 100644 --- a/src/private/widgets/TitleBarWidget.cpp +++ b/src/private/widgets/TitleBarWidget.cpp @@ -106,6 +106,14 @@ TitleBarWidget::TitleBarWidget(FloatingWindow *parent) init(); } +TitleBarWidget::TitleBarWidget(QWidget *parent) + : TitleBar(parent) + , m_layout(new QHBoxLayout(this)) +{ + init(); +} + + void TitleBarWidget::init() { qCDebug(creation) << "TitleBarWidget" << this; diff --git a/src/private/widgets/TitleBarWidget_p.h b/src/private/widgets/TitleBarWidget_p.h index 880bb7c0..068d9591 100644 --- a/src/private/widgets/TitleBarWidget_p.h +++ b/src/private/widgets/TitleBarWidget_p.h @@ -38,6 +38,7 @@ class DOCKS_EXPORT TitleBarWidget : public TitleBar public: explicit TitleBarWidget(Frame *parent); explicit TitleBarWidget(FloatingWindow *parent); + explicit TitleBarWidget(QWidget *parent); ~TitleBarWidget() override; ///@brief getter for the close button From cf7f037af4a89c4f843bb6e81cfef6a0ff9a2c5e Mon Sep 17 00:00:00 2001 From: Shantanu Tushar Date: Thu, 14 Jul 2022 11:18:55 +0200 Subject: [PATCH 2/5] Allow custom sidebars to access its dock widgets This is useful in cases where a custom sidebar wants behavior that affects multiple dock widgets it "contains". --- src/private/SideBar.cpp | 5 +++++ src/private/SideBar_p.h | 2 ++ 2 files changed, 7 insertions(+) diff --git a/src/private/SideBar.cpp b/src/private/SideBar.cpp index e082b28f..165a9d53 100644 --- a/src/private/SideBar.cpp +++ b/src/private/SideBar.cpp @@ -68,6 +68,11 @@ void SideBar::onButtonClicked(DockWidgetBase *dw) toggleOverlay(dw); } +QVector SideBar::dockWidgets() const +{ + return m_dockWidgets; +} + void SideBar::onDockWidgetDestroyed(QObject *dw) { removeDockWidget(static_cast(dw)); diff --git a/src/private/SideBar_p.h b/src/private/SideBar_p.h index 88e27585..c64e8cb8 100644 --- a/src/private/SideBar_p.h +++ b/src/private/SideBar_p.h @@ -66,6 +66,8 @@ protected: void onButtonClicked(DockWidgetBase *dw); + QVector dockWidgets() const; + private: void onDockWidgetDestroyed(QObject *dw); void updateSize(); From daebe9e6809f042701a8b23a94605a15e00df937 Mon Sep 17 00:00:00 2001 From: Shantanu Tushar Date: Thu, 14 Jul 2022 11:23:39 +0200 Subject: [PATCH 3/5] Export SideBarButton This allows code to link to subclasses of SideBarButton. --- src/private/widgets/SideBarWidget_p.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/private/widgets/SideBarWidget_p.h b/src/private/widgets/SideBarWidget_p.h index 1f1d837f..ba25c0a6 100644 --- a/src/private/widgets/SideBarWidget_p.h +++ b/src/private/widgets/SideBarWidget_p.h @@ -29,7 +29,7 @@ class DockWidget; class Frame; class SideBarWidget; -class SideBarButton : public QToolButton +class DOCKS_EXPORT SideBarButton : public QToolButton { Q_OBJECT public: From 913c570b2b2ae7619bf1ea13cb77305d4986bab9 Mon Sep 17 00:00:00 2001 From: Allen Winter Date: Tue, 19 Jul 2022 12:48:22 -0400 Subject: [PATCH 4/5] .reuse/dep5 - minor cleaning --- .reuse/dep5 | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.reuse/dep5 b/.reuse/dep5 index ec0227e8..72716575 100644 --- a/.reuse/dep5 +++ b/.reuse/dep5 @@ -1,6 +1,6 @@ Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: KDDockWidgets -Upstream-Contact: +Upstream-Contact: Source: https://www.github.com/KDAB/KDDockWidgets #misc source code @@ -16,7 +16,6 @@ License: GPL-2.0-only OR GPL-3.0-only #misc config files Files: .pre-commit-config.yaml .codespellrc .krazy .cmake-format .clang-format .clazy .gitignore .mdlrc .mdlrc.rb .pep8 .pylintrc appveyor.yml code.dev-*.code-workspace docs/api/Doxyfile.cmake distro/* Copyright: 2019-2022 Klarälvdalens Datakonsult AB, a KDAB Group company -License: GPL-2.0-only OR GPL-3.0-only License: BSD-3-Clause #artwork From 9ce7477cbb99de57676eb9ffc1e31adf05b70ce6 Mon Sep 17 00:00:00 2001 From: Allen Winter Date: Fri, 22 Jul 2022 16:00:08 -0400 Subject: [PATCH 5/5] docs/api/Doxyfile.cmake - add .pngs --- docs/api/Doxyfile.cmake | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/api/Doxyfile.cmake b/docs/api/Doxyfile.cmake index c0ad29cc..57bd1892 100644 --- a/docs/api/Doxyfile.cmake +++ b/docs/api/Doxyfile.cmake @@ -876,7 +876,8 @@ FILE_PATTERNS = *.cpp \ *.h \ *.dox \ *.md \ - *.gif + *.gif \ + *.png # The RECURSIVE tag can be used to specify whether or not subdirectories should # be searched for input files as well.