diff --git a/CMakeLists.txt b/CMakeLists.txt index 73a0b10..a246a97 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,6 +50,7 @@ set(ads_INSTALL_INCLUDE src/ads_globals.h src/DockAreaTabBar.h src/DockAreaTitleBar.h + src/DockAreaTitleBar_p.h src/DockAreaWidget.h src/DockContainerWidget.h src/DockManager.h diff --git a/src/DockAreaTitleBar.cpp b/src/DockAreaTitleBar.cpp index ac9f345..aec4cc9 100644 --- a/src/DockAreaTitleBar.cpp +++ b/src/DockAreaTitleBar.cpp @@ -39,6 +39,7 @@ #include #include +#include "DockAreaTitleBar_p.h" #include "ads_globals.h" #include "FloatingDockContainer.h" #include "FloatingDragPreview.h" @@ -55,8 +56,6 @@ namespace ads { -using tTitleBarButton = QToolButton; - /** * Private data class of CDockAreaTitleBar class (pimpl) @@ -130,86 +129,6 @@ struct DockAreaTitleBarPrivate IFloatingWidget* makeAreaFloating(const QPoint& Offset, eDragState DragState); };// struct DockAreaTitleBarPrivate - -/** - * Title bar button of a dock area that customizes tTitleBarButton appearance/behaviour - * according to various config flags such as: - * CDockManager::DockAreaHas_xxx_Button - if set to 'false' keeps the button always invisible - * CDockManager::DockAreaHideDisabledButtons - if set to 'true' hides button when it is disabled - */ -class CTitleBarButton : public tTitleBarButton -{ - Q_OBJECT - bool Visible = true; - bool HideWhenDisabled = false; -public: - using Super = tTitleBarButton; - CTitleBarButton(bool visible = true, QWidget* parent = nullptr) - : tTitleBarButton(parent), - Visible(visible), - HideWhenDisabled(DockAreaTitleBarPrivate::testConfigFlag(CDockManager::DockAreaHideDisabledButtons)) - {} - - - /** - * Adjust this visibility change request with our internal settings: - */ - virtual void setVisible(bool visible) override - { - // 'visible' can stay 'true' if and only if this button is configured to generaly visible: - visible = visible && this->Visible; - - // 'visible' can stay 'true' unless: this button is configured to be invisible when it is disabled and it is currently disabled: - if(visible && HideWhenDisabled) - { - visible = isEnabled(); - } - - Super::setVisible(visible); - } - -protected: - /** - * Handle EnabledChanged signal to set button invisible if the configured - */ - bool event(QEvent *ev) override - { - if(QEvent::EnabledChange == ev->type() && HideWhenDisabled) - { - // force setVisible() call - // Calling setVisible() directly here doesn't work well when button is expected to be shown first time - QMetaObject::invokeMethod(this, "setVisible", Qt::QueuedConnection, Q_ARG(bool, isEnabled())); - } - - return Super::event(ev); - } -}; - - -/** - * This spacer widget is here because of the following problem. - * The dock area title bar handles mouse dragging and moving the floating widget. - * The problem is, that if the title bar becomes invisible, i.e. if the dock - * area contains only one single dock widget and the dock area is moved - * into a floating widget, then mouse events are not handled anymore and dragging - * of the floating widget stops. - */ -class CSpacerWidget : public QWidget -{ - Q_OBJECT -public: - using Super = QWidget; - CSpacerWidget(QWidget* Parent = 0) - : Super(Parent) - { - setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - setStyleSheet("border: none; background: none;"); - } - virtual QSize sizeHint() const override {return QSize(0, 0);} - virtual QSize minimumSizeHint() const override {return QSize(0, 0);} -}; - - //============================================================================ DockAreaTitleBarPrivate::DockAreaTitleBarPrivate(CDockAreaTitleBar* _public) : _this(_public) @@ -674,10 +593,50 @@ int CDockAreaTitleBar::indexOf(QWidget *widget) const return d->Layout->indexOf(widget); } +//============================================================================ +CTitleBarButton::CTitleBarButton(bool visible /*= true*/, QWidget* parent /*= nullptr*/) : tTitleBarButton(parent), +Visible(visible), +HideWhenDisabled(DockAreaTitleBarPrivate::testConfigFlag(CDockManager::DockAreaHideDisabledButtons)) +{ + +} + +//============================================================================ +void CTitleBarButton::setVisible(bool visible) +{ + // 'visible' can stay 'true' if and only if this button is configured to generaly visible: + visible = visible && this->Visible; + + // 'visible' can stay 'true' unless: this button is configured to be invisible when it is disabled and it is currently disabled: + if (visible && HideWhenDisabled) + { + visible = isEnabled(); + } + + Super::setVisible(visible); +} + +//============================================================================ +bool CTitleBarButton::event(QEvent *ev) +{ + if (QEvent::EnabledChange == ev->type() && HideWhenDisabled) + { + // force setVisible() call + // Calling setVisible() directly here doesn't work well when button is expected to be shown first time + QMetaObject::invokeMethod(this, "setVisible", Qt::QueuedConnection, Q_ARG(bool, isEnabled())); + } + + return Super::event(ev); +} + +//============================================================================ +CSpacerWidget::CSpacerWidget(QWidget* Parent /*= 0*/) : Super(Parent) +{ + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + setStyleSheet("border: none; background: none;"); +} } // namespace ads -#include "DockAreaTitleBar.moc" - //--------------------------------------------------------------------------- // EOF DockAreaTitleBar.cpp diff --git a/src/DockAreaTitleBar.h b/src/DockAreaTitleBar.h index cd28842..2a4505f 100644 --- a/src/DockAreaTitleBar.h +++ b/src/DockAreaTitleBar.h @@ -155,6 +155,7 @@ signals: */ void tabBarClicked(int index); }; // class name + } // namespace ads //----------------------------------------------------------------------------- diff --git a/src/DockAreaTitleBar_p.h b/src/DockAreaTitleBar_p.h new file mode 100644 index 0000000..b94a510 --- /dev/null +++ b/src/DockAreaTitleBar_p.h @@ -0,0 +1,94 @@ +#ifndef DockAreaTitleBar_pH +#define DockAreaTitleBar_pH +/******************************************************************************* +** Qt Advanced Docking System +** Copyright (C) 2017 Uwe Kindler +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Lesser General Public +** License as published by the Free Software Foundation; either +** version 2.1 of the License, or (at your option) any later version. +** +** This library is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser General Public +** License along with this library; If not, see . +******************************************************************************/ + + +//============================================================================ +/// \file DockAreaTitleBar_p.h +/// \author Uwe Kindler +/// \date 12.10.2018 +/// \brief Declaration of classes CTitleBarButton and CSpacerWidget +//============================================================================ + + +//============================================================================ +// INCLUDES +//============================================================================ +#include +#include + +#include "ads_globals.h" + +namespace ads +{ +using tTitleBarButton = QToolButton; + +/** +* Title bar button of a dock area that customizes tTitleBarButton appearance/behaviour +* according to various config flags such as: +* CDockManager::DockAreaHas_xxx_Button - if set to 'false' keeps the button always invisible +* CDockManager::DockAreaHideDisabledButtons - if set to 'true' hides button when it is disabled +*/ +class CTitleBarButton : public tTitleBarButton +{ + Q_OBJECT + +private: + bool Visible = true; + bool HideWhenDisabled = false; + +public: + using Super = tTitleBarButton; + CTitleBarButton(bool visible = true, QWidget* parent = nullptr); + + /** + * Adjust this visibility change request with our internal settings: + */ + virtual void setVisible(bool visible) override; + +protected: + /** + * Handle EnabledChanged signal to set button invisible if the configured + */ + bool event(QEvent *ev) override; +}; + + +/** +* This spacer widget is here because of the following problem. +* The dock area title bar handles mouse dragging and moving the floating widget. +* The problem is, that if the title bar becomes invisible, i.e. if the dock +* area contains only one single dock widget and the dock area is moved +* into a floating widget, then mouse events are not handled anymore and dragging +* of the floating widget stops. +*/ +class CSpacerWidget : public QWidget +{ + Q_OBJECT +public: + using Super = QWidget; + CSpacerWidget(QWidget* Parent = 0); + virtual QSize sizeHint() const override {return QSize(0, 0);} + virtual QSize minimumSizeHint() const override {return QSize(0, 0);} +}; + +} + // namespace ads +//----------------------------------------------------------------------------- +#endif // DockAreaTitleBar_pH diff --git a/src/src.pro b/src/src.pro index 73367b0..f117495 100644 --- a/src/src.pro +++ b/src/src.pro @@ -41,6 +41,7 @@ HEADERS += \ FloatingDragPreview.h \ DockOverlay.h \ DockSplitter.h \ + DockAreaTitleBar_p.h \ DockAreaTitleBar.h \ ElidingLabel.h \ IconProvider.h \