Floating windows now support a minimize button

Introduced Flag_TitleBarHasMinimizeButton for it.
It implies Flag_DontUseUtilityFloatingWindows too, since Qt::Tool
don't appear in the task bar.

example: kddockwidgets_example -k
This commit is contained in:
Sergio Martins
2020-09-17 21:33:38 +01:00
parent deec6ffa31
commit e92ef472b3
6 changed files with 51 additions and 4 deletions

View File

@@ -78,8 +78,11 @@ int main(int argc, char **argv)
QCommandLineOption nonDockable("d", QCoreApplication::translate("main", "DockWidget #9 will be non-dockable"));
parser.addOption(nonDockable);
QCommandLineOption maximizeButton("b", QCoreApplication::translate("main", "DockWidgets have maximize/restore buttons instead of float/dock button"));
parser.addOption(maximizeButton);
QCommandLineOption maximizeButtonOption("b", QCoreApplication::translate("main", "Floating dockWidgets have maximize/restore buttons instead of float/dock button"));
parser.addOption(maximizeButtonOption);
QCommandLineOption minimizeButtonOption("k", QCoreApplication::translate("main", "Floating dockWidgets have a minimize button. Implies not being an utility window (~Qt::Tool)"));
parser.addOption(minimizeButtonOption);
QCommandLineOption segmentedIndicators("y", QCoreApplication::translate("main", "Use segmented indicators instead of classical"));
parser.addOption(segmentedIndicators);
@@ -169,9 +172,12 @@ int main(int argc, char **argv)
if (parser.isSet(reorderTabsOption))
flags |= KDDockWidgets::Config::Flag_AllowReorderTabs;
if (parser.isSet(maximizeButton))
if (parser.isSet(maximizeButtonOption))
flags |= KDDockWidgets::Config::Flag_TitleBarHasMaximizeButton;
if (parser.isSet(minimizeButtonOption))
flags |= KDDockWidgets::Config::Flag_TitleBarHasMinimizeButton;
if (parser.isSet(lazyResizeOption))
flags |= KDDockWidgets::Config::Flag_LazyResize;

View File

@@ -71,6 +71,7 @@ public:
Flag_internal_DontUseParentForFloatingWindows = 0x1000, ///> FloatingWindows won't have a parent top-level. Internal, use Flag_DontUseUtilityFloatingWindows instead.
Flag_DontUseUtilityFloatingWindows = Flag_internal_DontUseQtToolWindowsForFloatingWindows | Flag_internal_DontUseParentForFloatingWindows,
Flag_TitleBarHasMinimizeButton = 0x2000 | Flag_DontUseUtilityFloatingWindows, ///> The title bar will have a minimize button when floating. This implies Flag_DontUseUtilityFloatingWindows too, otherwise they wouldn't appear in the task bar.
Flag_Default = Flag_AeroSnapWithClientDecos ///> The defaults
};
Q_DECLARE_FLAGS(Flags, Flag)

View File

@@ -45,6 +45,7 @@ TitleBar::TitleBar(FloatingWindow *parent)
connect(m_floatingWindow, &FloatingWindow::numFramesChanged, this, &TitleBar::updateCloseButton);
connect(m_floatingWindow, &FloatingWindow::numFramesChanged, this, &TitleBar::updateFloatButton);
connect(m_floatingWindow, &FloatingWindow::numFramesChanged, this, &TitleBar::updateMaximizeButton);
connect(m_floatingWindow, &FloatingWindow::numFramesChanged, this, &TitleBar::updateMinimizeButton);
connect(m_floatingWindow, &FloatingWindow::windowStateChanged, this, &TitleBar::updateMaximizeButton);
connect(m_floatingWindow, &FloatingWindow::activatedChanged , this, &TitleBar::isFocusedChanged);
init();
@@ -190,6 +191,14 @@ bool TitleBar::supportsMaximizeButton() const
return m_floatingWindow != nullptr;
}
bool TitleBar::supportsMinimizeButton() const
{
if ((Config::self().flags() & Config::Flag_TitleBarHasMinimizeButton) != Config::Flag_TitleBarHasMinimizeButton) // this specific flag is not base^2
return false;
return m_floatingWindow != nullptr;
}
bool TitleBar::hasIcon() const
{
return !m_icon.isNull();
@@ -293,3 +302,17 @@ void TitleBar::onMaximizeClicked()
{
toggleMaximized();
}
void TitleBar::onMinimizeClicked()
{
if (!m_floatingWindow)
return;
if (!(Config::self().flags() & Config::Flag_DontUseUtilityFloatingWindows)) {
// Qt::Tool windows don't appear in the task bar.
// Unless someone tells me a good reason to allow this situation.
return;
}
m_floatingWindow->showMinimized();
}

View File

@@ -66,6 +66,9 @@ public:
///@brief returns whether this title bar supports a maximize/restore button
bool supportsMaximizeButton() const;
///@brief returns whether this title bar supports a minimize button
bool supportsMinimizeButton() const;
///@brief returns whether this title bar has an icon
bool hasIcon() const;
@@ -97,10 +100,12 @@ protected:
Q_INVOKABLE void onCloseClicked();
Q_INVOKABLE void onFloatClicked();
Q_INVOKABLE void onMaximizeClicked();
Q_INVOKABLE void onMinimizeClicked();
Q_INVOKABLE void toggleMaximized();
virtual void updateFloatButton() {}
virtual void updateMaximizeButton() {}
virtual void updateMinimizeButton() {}
// The following are needed for the unit-tests
virtual bool isCloseButtonVisible() const { return true; }

View File

@@ -50,8 +50,11 @@ void TitleBarWidget::init()
m_layout->setSpacing(2);
m_maximizeButton = TitleBarWidget::createButton(this, style()->standardIcon(QStyle::SP_TitleBarMaxButton));
m_minimizeButton = TitleBarWidget::createButton(this, style()->standardIcon(QStyle::SP_TitleBarMinButton));
m_floatButton = TitleBarWidget::createButton(this, style()->standardIcon(QStyle::SP_TitleBarNormalButton));
m_closeButton = TitleBarWidget::createButton(this, style()->standardIcon(QStyle::SP_TitleBarCloseButton));
m_layout->addWidget(m_minimizeButton);
m_layout->addWidget(m_maximizeButton);
m_layout->addWidget(m_floatButton);
m_layout->addWidget(m_closeButton);
@@ -59,10 +62,12 @@ void TitleBarWidget::init()
connect(m_floatButton, &QAbstractButton::clicked, this, &TitleBarWidget::onFloatClicked);
connect(m_closeButton, &QAbstractButton::clicked, this, &TitleBarWidget::onCloseClicked);
connect(m_maximizeButton, &QAbstractButton::clicked, this, &TitleBarWidget::onMaximizeClicked);
connect(m_minimizeButton, &QAbstractButton::clicked, this, &TitleBarWidget::onMinimizeClicked);
updateCloseButton();
updateFloatButton();
updateMaximizeButton();
updateMinimizeButton();
connect(this, &TitleBar::titleChanged, this, [this] {
update();
@@ -99,7 +104,7 @@ int TitleBarWidget::buttonAreaWidth() const
TitleBarWidget::~TitleBarWidget()
{
// To avoid a crash
for (auto button : { m_floatButton, m_maximizeButton, m_closeButton }) {
for (auto button : { m_minimizeButton, m_floatButton, m_maximizeButton, m_closeButton }) {
button->setParent(nullptr);
button->deleteLater();
}
@@ -143,6 +148,11 @@ void TitleBarWidget::updateCloseButton()
m_closeButton->setEnabled(!anyNonClosable);
}
void TitleBarWidget::updateMinimizeButton()
{
m_minimizeButton->setVisible(supportsMinimizeButton());
}
void TitleBarWidget::updateMaximizeButton()
{
if (auto fw = floatingWindow()) {

View File

@@ -51,6 +51,7 @@ protected:
void updateFloatButton() override;
void updateCloseButton() override;
void updateMaximizeButton() override;
void updateMinimizeButton() override;
// The following are needed for the unit-tests
bool isCloseButtonVisible() const override;
@@ -68,6 +69,7 @@ private:
QAbstractButton *m_closeButton = nullptr;
QAbstractButton *m_floatButton = nullptr;
QAbstractButton *m_maximizeButton = nullptr;
QAbstractButton *m_minimizeButton = nullptr;
QLabel *m_dockWidgetIcon = nullptr;
};