diff --git a/Changelog b/Changelog index 46127fe5..3cee0c7b 100644 --- a/Changelog +++ b/Changelog @@ -19,9 +19,8 @@ - Fixed crash with an MFC application - Allows to disable translucency via the KDDW_NO_TRANSLUCENCY env var, useful in case running on weird Window Managers. - -* v1.3.2 (unreleased) - - + - Added Flag_ShowButtonsOnTabBarIfTitleBarHidden, which can be used when using Flag_HideTitleBarWhenTabsVisible. + The close and float buttons will be shown directly in the tab-bar. * v1.3.1 (7 June 2021) - Improve restoring layout when RestoreOption_RelativeToMainWindow is used (#171) diff --git a/examples/dockwidgets/main.cpp b/examples/dockwidgets/main.cpp index 43399899..80542802 100644 --- a/examples/dockwidgets/main.cpp +++ b/examples/dockwidgets/main.cpp @@ -119,6 +119,10 @@ int main(int argc, char **argv) QCoreApplication::translate("main", "DockWidget #5 wont be closed before a restore. Illustrates LayoutSaverOption::DontCloseBeforeRestore")); parser.addOption(dontCloseBeforeRestore); + QCommandLineOption showButtonsInTabBarIfTitleBarHidden("show-buttons-in-tabbar-if-titlebar-hidden", + QCoreApplication::translate("main", "If we're not using title bars we'll still show the close and float button in the tab bar")); + parser.addOption(showButtonsInTabBarIfTitleBarHidden); + #if defined(DOCKS_DEVELOPER_MODE) parser.addOption(centralFrame); @@ -188,6 +192,9 @@ int main(int argc, char **argv) if (parser.isSet(closeOnlyCurrentTab)) flags |= Config::Flag_CloseOnlyCurrentTab; + if (parser.isSet(showButtonsInTabBarIfTitleBarHidden)) + flags |= Config::Flag_ShowButtonsOnTabBarIfTitleBarHidden; + if (parser.isSet(noTitleBars)) flags |= KDDockWidgets::Config::Flag_HideTitleBarWhenTabsVisible; diff --git a/src/Config.cpp b/src/Config.cpp index bba01b88..0605f040 100644 --- a/src/Config.cpp +++ b/src/Config.cpp @@ -305,6 +305,11 @@ void Config::Private::fixFlags() m_internalFlags |= InternalFlag_DontUseParentForFloatingWindows; m_internalFlags |= InternalFlag_DontUseQtToolWindowsForFloatingWindows; } + + if (m_flags & Flag_ShowButtonsOnTabBarIfTitleBarHidden) { + // Flag_ShowButtonsOnTabBarIfTitleBarHidden doesn't make sense if used alone + m_flags |= Flag_HideTitleBarWhenTabsVisible; + } } void Config::setDisabledPaintEvents(CustomizableWidgets widgets) diff --git a/src/Config.h b/src/Config.h index e6fa8689..5b9f637b 100644 --- a/src/Config.h +++ b/src/Config.h @@ -83,6 +83,7 @@ public: ///< By default it also turns off the float button, but you can remove Flag_TitleBarNoFloatButton to have both. Flag_KeepAboveIfNotUtilityWindow = 0x10000, ///< Only meaningful if Flag_DontUseUtilityFloatingWindows is set. If floating windows are normal windows, you might still want them to keep above and not minimize when you focus the main window. Flag_CloseOnlyCurrentTab = 0x20000, ///< The TitleBar's close button will only close the current tab, instead of all of them + Flag_ShowButtonsOnTabBarIfTitleBarHidden = 0x40000, ///< When using Flag_HideTitleBarWhenTabsVisible the close/float buttons disappear with the title bar. With Flag_ShowButtonsOnTabBarIfHidden they'll be shown in the tab bar. Flag_Default = Flag_AeroSnapWithClientDecos ///< The defaults }; Q_DECLARE_FLAGS(Flags, Flag) diff --git a/src/private/TitleBar.cpp b/src/private/TitleBar.cpp index 0679b69f..d2c787ab 100644 --- a/src/private/TitleBar.cpp +++ b/src/private/TitleBar.cpp @@ -193,7 +193,12 @@ void TitleBar::setIcon(const QIcon &icon) std::unique_ptr TitleBar::makeWindow() { - if (!isVisible() && window()->isVisible()) { + if (!isVisible() && window()->isVisible() && + !(Config::self().flags() & Config::Flag_ShowButtonsOnTabBarIfTitleBarHidden)) { + + // When using Flag_ShowButtonsOnTabBarIfTitleBarHidden we forward the call from the tab bar's + // buttons to the title bar's buttons, just ot reuse logic + qWarning() << "TitleBar::makeWindow shouldn't be called on invisible title bar" << this << window()->isVisible(); if (m_frame) { diff --git a/src/private/TitleBar_p.h b/src/private/TitleBar_p.h index ffc57786..1bffc617 100644 --- a/src/private/TitleBar_p.h +++ b/src/private/TitleBar_p.h @@ -149,6 +149,7 @@ protected: private: friend class ::TestDocks; friend class FloatingWindowWidget; + friend class TabWidgetWidget; void updateFloatButton(); void updateCloseButton(); void setCloseButtonEnabled(bool); diff --git a/src/private/widgets/TabWidgetWidget.cpp b/src/private/widgets/TabWidgetWidget.cpp index d44ce839..7ef3b6d1 100644 --- a/src/private/widgets/TabWidgetWidget.cpp +++ b/src/private/widgets/TabWidgetWidget.cpp @@ -18,11 +18,14 @@ #include "TabWidgetWidget_p.h" #include "../Frame_p.h" +#include "../TitleBar_p.h" #include "Config.h" #include "FrameworkWidgetFactory.h" #include #include +#include +#include using namespace KDDockWidgets; @@ -55,6 +58,8 @@ TabWidgetWidget::TabWidgetWidget(Frame *parent) if (!QTabWidget::tabBar()->isVisible()) setFocusProxy(nullptr); + + setupTabBarButtons(); } TabBar *TabWidgetWidget::tabBar() const @@ -152,3 +157,37 @@ int TabWidgetWidget::currentIndex() const { return QTabWidget::currentIndex(); } + +void TabWidgetWidget::setupTabBarButtons() +{ + if (!(Config::self().flags() & Config::Flag_ShowButtonsOnTabBarIfTitleBarHidden)) + return; + + auto factory = Config::self().frameworkWidgetFactory(); + m_closeButton = factory->createTitleBarButton(this, TitleBarButtonType::Close); + m_floatButton = factory->createTitleBarButton(this, TitleBarButtonType::Float); + + auto cornerWidget = new QWidget(this); + cornerWidget->setObjectName(QStringLiteral("Corner Widget")); + + setCornerWidget(cornerWidget, Qt::TopRightCorner); + + auto hlay = new QHBoxLayout(cornerWidget); + + hlay->setContentsMargins(QMargins(0, 0, 2, 0)); + hlay->setSpacing(2); + + hlay->addWidget(m_floatButton); + hlay->addWidget(m_closeButton); + + connect(m_floatButton, &QAbstractButton::clicked, this, [this] { + TitleBar *tb = frame()->titleBar(); + tb->onFloatClicked(); + }); + + connect(m_closeButton, &QAbstractButton::clicked, this, [this] { + TitleBar *tb = frame()->titleBar(); + tb->onCloseClicked(); + }); + +} diff --git a/src/private/widgets/TabWidgetWidget_p.h b/src/private/widgets/TabWidgetWidget_p.h index 7642f627..64a6bfd7 100644 --- a/src/private/widgets/TabWidgetWidget_p.h +++ b/src/private/widgets/TabWidgetWidget_p.h @@ -23,6 +23,10 @@ #include +QT_BEGIN_NAMESPACE +class QAbstractButton; +QT_END_NAMESPACE + namespace KDDockWidgets { class Frame; @@ -41,7 +45,6 @@ public: int numDockWidgets() const override; void removeDockWidget(DockWidgetBase *) override; int indexOfDockWidget(const DockWidgetBase *) const override; - Q_SIGNALS: void currentTabChanged(int index) override; void currentDockWidgetChanged(KDDockWidgets::DockWidgetBase *dw) override; @@ -61,8 +64,11 @@ protected: int currentIndex() const override; private: + void setupTabBarButtons(); Q_DISABLE_COPY(TabWidgetWidget) TabBar *const m_tabBar; + QAbstractButton *m_floatButton = nullptr; + QAbstractButton *m_closeButton = nullptr; }; }