From 868f2671fa9f0bf180eef0795d5c31d4ee4e3770 Mon Sep 17 00:00:00 2001 From: John Preston Date: Thu, 29 Jul 2021 18:12:44 +0300 Subject: [PATCH] Fix Ui::RpWidget geometry constraints. --- ui/platform/ui_platform_window.cpp | 21 ++++++++++++--------- ui/platform/ui_platform_window.h | 2 ++ ui/platform/win/ui_window_win.cpp | 20 ++++++++++++-------- ui/platform/win/ui_window_win.h | 1 + 4 files changed, 27 insertions(+), 17 deletions(-) diff --git a/ui/platform/ui_platform_window.cpp b/ui/platform/ui_platform_window.cpp index aa3b0f1..959a03d 100644 --- a/ui/platform/ui_platform_window.cpp +++ b/ui/platform/ui_platform_window.cpp @@ -146,6 +146,7 @@ DefaultWindowHelper::DefaultWindowHelper(not_null window) } void DefaultWindowHelper::init() { + _title->show(); // Be consistent with _nativeFrame == false. window()->setWindowFlag(Qt::FramelessWindowHint); if (WindowExtentsSupported()) { @@ -327,24 +328,18 @@ void DefaultWindowHelper::setNativeFrame(bool enabled) { } void DefaultWindowHelper::setMinimumSize(QSize size) { - const auto sizeWithMargins = size - .grownBy({ 0, _title->isVisible() ? _title->height() : 0, 0, 0 }) - .grownBy(resizeArea()); + const auto sizeWithMargins = size.grownBy(bodyPadding()); window()->setMinimumSize(sizeWithMargins); } void DefaultWindowHelper::setFixedSize(QSize size) { - const auto sizeWithMargins = size - .grownBy({ 0, _title->isVisible() ? _title->height() : 0, 0, 0 }) - .grownBy(resizeArea()); + const auto sizeWithMargins = size.grownBy(bodyPadding()); window()->setFixedSize(sizeWithMargins); _title->setResizeEnabled(false); } void DefaultWindowHelper::setGeometry(QRect rect) { - window()->setGeometry(rect - .marginsAdded({ 0, _title->isVisible() ? _title->height() : 0, 0, 0 }) - .marginsAdded(resizeArea())); + window()->setGeometry(rect.marginsAdded(bodyPadding())); } void DefaultWindowHelper::paintBorders(QPainter &p) { @@ -404,6 +399,14 @@ void DefaultWindowHelper::updateWindowExtents() { } } +int DefaultWindowHelper::titleHeight() const { + return _title->isHidden() ? 0 : _title->height(); +} + +QMargins DefaultWindowHelper::bodyPadding() const { + return resizeArea() + QMargins{ 0, titleHeight(), 0, 0 }; +} + void DefaultWindowHelper::updateCursor(Qt::Edges edges) { if (((edges & Qt::LeftEdge) && (edges & Qt::TopEdge)) || ((edges & Qt::RightEdge) && (edges & Qt::BottomEdge))) { diff --git a/ui/platform/ui_platform_window.h b/ui/platform/ui_platform_window.h index 60e102d..46bced2 100644 --- a/ui/platform/ui_platform_window.h +++ b/ui/platform/ui_platform_window.h @@ -84,6 +84,8 @@ private: void paintBorders(QPainter &p); void updateWindowExtents(); void updateCursor(Qt::Edges edges); + [[nodiscard]] int titleHeight() const; + [[nodiscard]] QMargins bodyPadding() const; const not_null _title; const not_null _body; diff --git a/ui/platform/win/ui_window_win.cpp b/ui/platform/win/ui_window_win.cpp index 26bad2b..a1b2c59 100644 --- a/ui/platform/win/ui_window_win.cpp +++ b/ui/platform/win/ui_window_win.cpp @@ -151,7 +151,6 @@ WindowHelper::WindowHelper(not_null window) , _shadow(std::in_place, window, st::windowShadowFg->c) { Expects(_handle != nullptr); - GetNativeFilter()->registerWindow(_handle, this); init(); } @@ -186,13 +185,11 @@ void WindowHelper::setNativeFrame(bool enabled) { } void WindowHelper::setMinimumSize(QSize size) { - const auto titleHeight = _title->isVisible() ? _title->height() : 0; - window()->setMinimumSize(size.width(), titleHeight + size.height()); + window()->setMinimumSize(size.width(), titleHeight() + size.height()); } void WindowHelper::setFixedSize(QSize size) { - const auto titleHeight = _title->isVisible() ? _title->height() : 0; - window()->setFixedSize(size.width(), titleHeight + size.height()); + window()->setFixedSize(size.width(), titleHeight() + size.height()); _title->setResizeEnabled(false); if (_shadow) { _shadow->setResizeEnabled(false); @@ -200,8 +197,7 @@ void WindowHelper::setFixedSize(QSize size) { } void WindowHelper::setGeometry(QRect rect) { - const auto titleHeight = _title->isVisible() ? _title->height() : 0; - window()->setGeometry(rect.marginsAdded({ 0, titleHeight, 0, 0 })); + window()->setGeometry(rect.marginsAdded({ 0, titleHeight(), 0, 0 })); } void WindowHelper::showFullScreen() { @@ -221,6 +217,9 @@ void WindowHelper::showNormal() { } void WindowHelper::init() { + _title->show(); // Be consistent with _nativeFrame == false. + GetNativeFilter()->registerWindow(_handle, this); + style::PaletteChanged( ) | rpl::start_with_next([=] { if (_shadow) { @@ -429,7 +428,8 @@ bool WindowHelper::handleNativeEvent( p.y - r.top + _marginsDelta.top()); if (!window()->rect().contains(mapped)) { *result = HTTRANSPARENT; - } else if (!_title->isVisible() || !_title->geometry().contains(mapped)) { + } else if (_title->isHidden() + || !_title->geometry().contains(mapped)) { *result = HTCLIENT; } else switch (_title->hitTest(_title->pos() + mapped)) { case HitTestResult::Client: @@ -502,6 +502,10 @@ bool WindowHelper::fixedSize() const { return window()->minimumSize() == window()->maximumSize(); } +int WindowHelper::titleHeight() const { + return _title->isHidden() ? 0 : _title->height(); +} + void WindowHelper::updateMargins() { if (_updatingMargins) return; diff --git a/ui/platform/win/ui_window_win.h b/ui/platform/win/ui_window_win.h index cee1b22..da61530 100644 --- a/ui/platform/win/ui_window_win.h +++ b/ui/platform/win/ui_window_win.h @@ -47,6 +47,7 @@ private: LRESULT *result); [[nodiscard]] bool fixedSize() const; + [[nodiscard]] int titleHeight() const; static not_null GetNativeFilter(); const HWND _handle = nullptr;