From 94c5754b422ed5cdb2c20f0a480656e988b90ce8 Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Mon, 13 Jun 2022 12:15:31 +0400 Subject: [PATCH] Hide titlebar & border when there are no controls If the user doesn't want to control the window with buttons, then he moves/resizes the window in other way as well --- ui/platform/ui_platform_utility.cpp | 14 +++++++++++--- ui/platform/ui_platform_utility.h | 3 ++- ui/platform/ui_platform_window.cpp | 19 +++++++++++++------ ui/platform/ui_platform_window_title.cpp | 13 +++++++------ ui/platform/ui_platform_window_title.h | 1 + 5 files changed, 34 insertions(+), 16 deletions(-) diff --git a/ui/platform/ui_platform_utility.cpp b/ui/platform/ui_platform_utility.cpp index 2d07ec5..9a5d462 100644 --- a/ui/platform/ui_platform_utility.cpp +++ b/ui/platform/ui_platform_utility.cpp @@ -10,16 +10,24 @@ namespace Ui { namespace Platform { namespace { -rpl::event_stream<> TitleControlsLayoutChanges; +rpl::event_stream TitleControlsLayoutChanges; } // namespace -rpl::producer<> TitleControlsLayoutChanged() { +rpl::producer TitleControlsLayoutValue() { + return rpl::single( + TitleControlsLayout() + ) | rpl::then( + TitleControlsLayoutChanged() + ); +} + +rpl::producer TitleControlsLayoutChanged() { return TitleControlsLayoutChanges.events(); } void NotifyTitleControlsLayoutChanged() { - TitleControlsLayoutChanges.fire({}); + TitleControlsLayoutChanges.fire_copy(TitleControlsLayout()); } } // namespace Platform diff --git a/ui/platform/ui_platform_utility.h b/ui/platform/ui_platform_utility.h index 4452332..e85d64b 100644 --- a/ui/platform/ui_platform_utility.h +++ b/ui/platform/ui_platform_utility.h @@ -44,7 +44,8 @@ void UnsetWindowExtents(QWindow *window); bool ShowWindowMenu(QWindow *window); [[nodiscard]] TitleControls::Layout TitleControlsLayout(); -[[nodiscard]] rpl::producer<> TitleControlsLayoutChanged(); +[[nodiscard]] rpl::producer TitleControlsLayoutValue(); +[[nodiscard]] rpl::producer TitleControlsLayoutChanged(); void NotifyTitleControlsLayoutChanged(); } // namespace Platform diff --git a/ui/platform/ui_platform_window.cpp b/ui/platform/ui_platform_window.cpp index 6b34218..54c7ca6 100644 --- a/ui/platform/ui_platform_window.cpp +++ b/ui/platform/ui_platform_window.cpp @@ -202,29 +202,35 @@ void DefaultWindowHelper::init() { rpl::combine( window()->widthValue(), _windowState.value(), - _title->shownValue() + _title->shownValue(), + TitleControlsLayoutValue() ) | rpl::start_with_next([=]( int width, Qt::WindowStates windowState, - bool shown) { + bool shown, + TitleControls::Layout controlsLayout) { const auto area = resizeArea(); _title->setGeometry( area.left(), area.top(), width - area.left() - area.right(), - _title->st()->height); + _title->controlsGeometry().height() + ? _title->st()->height + : 0); }, _title->lifetime()); rpl::combine( window()->sizeValue(), _windowState.value(), _title->heightValue(), - _title->shownValue() + _title->shownValue(), + TitleControlsLayoutValue() ) | rpl::start_with_next([=]( QSize size, Qt::WindowStates windowState, int titleHeight, - bool titleShown) { + bool titleShown, + TitleControls::Layout controlsLayout) { const auto area = resizeArea(); const auto sizeWithoutMargins = size @@ -342,7 +348,8 @@ bool DefaultWindowHelper::hasShadow() const { QMargins DefaultWindowHelper::resizeArea() const { if (window()->isMaximized() || window()->isFullScreen() - || _title->isHidden()) { + || _title->isHidden() + || (!hasShadow() && !_title->controlsGeometry().height())) { return QMargins(); } diff --git a/ui/platform/ui_platform_window_title.cpp b/ui/platform/ui_platform_window_title.cpp index 420e198..fadbcae 100644 --- a/ui/platform/ui_platform_window_title.cpp +++ b/ui/platform/ui_platform_window_title.cpp @@ -167,12 +167,9 @@ void TitleControls::init(Fn maximize) { }); _close->setPointerCursor(false); - parent()->widthValue( - ) | rpl::start_with_next([=](int width) { - updateControlsPosition(); - }, _close->lifetime()); - - TitleControlsLayoutChanged( + rpl::combine( + parent()->widthValue(), + TitleControlsLayoutValue() ) | rpl::start_with_next([=] { updateControlsPosition(); }, _close->lifetime()); @@ -417,6 +414,10 @@ not_null DefaultTitleWidget::st() const { return _controls.st(); } +QRect DefaultTitleWidget::controlsGeometry() const { + return _controls.geometry(); +} + void DefaultTitleWidget::setText(const QString &text) { window()->setWindowTitle(text); } diff --git a/ui/platform/ui_platform_window_title.h b/ui/platform/ui_platform_window_title.h index 863171e..278dbad 100644 --- a/ui/platform/ui_platform_window_title.h +++ b/ui/platform/ui_platform_window_title.h @@ -118,6 +118,7 @@ public: explicit DefaultTitleWidget(not_null parent); [[nodiscard]] not_null st() const; + [[nodiscard]] QRect controlsGeometry() const; void setText(const QString &text); void setStyle(const style::WindowTitle &st); void setResizeEnabled(bool enabled);