Force correct separate title bar controls geometry.
This commit is contained in:
parent
64fa3d83b5
commit
e5c8a6ebc4
10 changed files with 104 additions and 3 deletions
|
|
@ -41,6 +41,14 @@ QMargins BasicWindowHelper::frameMargins() {
|
||||||
return nativeFrameMargins();
|
return nativeFrameMargins();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int BasicWindowHelper::additionalContentPadding() const {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
rpl::producer<int> BasicWindowHelper::additionalContentPaddingValue() const {
|
||||||
|
return rpl::single(0);
|
||||||
|
}
|
||||||
|
|
||||||
void BasicWindowHelper::setTitle(const QString &title) {
|
void BasicWindowHelper::setTitle(const QString &title) {
|
||||||
_window->setWindowTitle(title);
|
_window->setWindowTitle(title);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,9 @@ public:
|
||||||
|
|
||||||
[[nodiscard]] virtual not_null<RpWidget*> body();
|
[[nodiscard]] virtual not_null<RpWidget*> body();
|
||||||
[[nodiscard]] virtual QMargins frameMargins();
|
[[nodiscard]] virtual QMargins frameMargins();
|
||||||
|
[[nodiscard]] virtual int additionalContentPadding() const;
|
||||||
|
[[nodiscard]] virtual auto additionalContentPaddingValue() const
|
||||||
|
-> rpl::producer<int>;
|
||||||
virtual void setTitle(const QString &title);
|
virtual void setTitle(const QString &title);
|
||||||
virtual void setTitleStyle(const style::WindowTitle &st);
|
virtual void setTitleStyle(const style::WindowTitle &st);
|
||||||
virtual void setNativeFrame(bool enabled);
|
virtual void setNativeFrame(bool enabled);
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@
|
||||||
#include "ui/widgets/buttons.h"
|
#include "ui/widgets/buttons.h"
|
||||||
#include "ui/widgets/shadow.h"
|
#include "ui/widgets/shadow.h"
|
||||||
#include "ui/ui_utility.h"
|
#include "ui/ui_utility.h"
|
||||||
|
#include "ui/widgets/rp_window.h"
|
||||||
#include "styles/style_widgets.h"
|
#include "styles/style_widgets.h"
|
||||||
#include "styles/palette.h"
|
#include "styles/palette.h"
|
||||||
#include "base/algorithm.h"
|
#include "base/algorithm.h"
|
||||||
|
|
@ -438,5 +439,36 @@ void DefaultTitleWidget::mouseDoubleClickEvent(QMouseEvent *e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SeparateTitleControls::SeparateTitleControls(
|
||||||
|
QWidget *parent,
|
||||||
|
const style::WindowTitle &st,
|
||||||
|
Fn<void(bool maximized)> maximize)
|
||||||
|
: wrap(parent)
|
||||||
|
, controls(&wrap, st, std::move(maximize)) {
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<SeparateTitleControls> SetupSeparateTitleControls(
|
||||||
|
not_null<RpWindow*> window,
|
||||||
|
const style::WindowTitle &st,
|
||||||
|
Fn<void(bool maximized)> maximize) {
|
||||||
|
auto result = std::make_unique<SeparateTitleControls>(
|
||||||
|
window->body(),
|
||||||
|
st,
|
||||||
|
std::move(maximize));
|
||||||
|
|
||||||
|
rpl::combine(
|
||||||
|
window->body()->widthValue(),
|
||||||
|
window->additionalContentPaddingValue()
|
||||||
|
) | rpl::start_with_next([raw = result.get()](int width, int padding) {
|
||||||
|
raw->wrap.setGeometry(
|
||||||
|
padding,
|
||||||
|
0,
|
||||||
|
width - 2 * padding,
|
||||||
|
raw->controls.geometry().height());
|
||||||
|
}, result->wrap.lifetime());
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Platform
|
} // namespace Platform
|
||||||
} // namespace Ui
|
} // namespace Ui
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ namespace Ui {
|
||||||
|
|
||||||
class IconButton;
|
class IconButton;
|
||||||
class PlainShadow;
|
class PlainShadow;
|
||||||
|
class RpWindow;
|
||||||
|
|
||||||
namespace Platform {
|
namespace Platform {
|
||||||
|
|
||||||
|
|
@ -122,5 +123,21 @@ private:
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct SeparateTitleControls {
|
||||||
|
SeparateTitleControls(
|
||||||
|
QWidget *parent,
|
||||||
|
const style::WindowTitle &st,
|
||||||
|
Fn<void(bool maximized)> maximize);
|
||||||
|
|
||||||
|
RpWidget wrap;
|
||||||
|
TitleControls controls;
|
||||||
|
};
|
||||||
|
|
||||||
|
[[nodiscard]] auto SetupSeparateTitleControls(
|
||||||
|
not_null<RpWindow*> window,
|
||||||
|
const style::WindowTitle &st,
|
||||||
|
Fn<void(bool maximized)> maximize = nullptr)
|
||||||
|
-> std::unique_ptr<SeparateTitleControls>;
|
||||||
|
|
||||||
} // namespace Platform
|
} // namespace Platform
|
||||||
} // namespace Ui
|
} // namespace Ui
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,7 @@ struct TitleWidget::PaddingHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
RpWidget controlsParent;
|
RpWidget controlsParent;
|
||||||
int padding = 0;
|
rpl::variable<int> padding = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
TitleWidget::TitleWidget(not_null<RpWidget*> parent)
|
TitleWidget::TitleWidget(not_null<RpWidget*> parent)
|
||||||
|
|
@ -80,7 +80,7 @@ void TitleWidget::setStyle(const style::WindowTitle &st) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void TitleWidget::refreshGeometryWithWidth(int width) {
|
void TitleWidget::refreshGeometryWithWidth(int width) {
|
||||||
const auto add = _paddingHelper ? _paddingHelper->padding : 0;
|
const auto add = additionalPadding();
|
||||||
setGeometry(0, 0, width, _controls.st()->height + add);
|
setGeometry(0, 0, width, _controls.st()->height + add);
|
||||||
if (_paddingHelper) {
|
if (_paddingHelper) {
|
||||||
_paddingHelper->controlsParent.setGeometry(
|
_paddingHelper->controlsParent.setGeometry(
|
||||||
|
|
@ -201,10 +201,18 @@ void TitleWidget::refreshAdditionalPaddings(
|
||||||
setAdditionalPadding(padding);
|
setAdditionalPadding(padding);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int TitleWidget::additionalPadding() const {
|
||||||
|
return _paddingHelper ? _paddingHelper->padding.current() : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
rpl::producer<int> TitleWidget::additionalPaddingValue() const {
|
||||||
|
return _paddingHelper ? _paddingHelper->padding.value() : rpl::single(0);
|
||||||
|
}
|
||||||
|
|
||||||
void TitleWidget::setAdditionalPadding(int padding) {
|
void TitleWidget::setAdditionalPadding(int padding) {
|
||||||
Expects(_paddingHelper != nullptr);
|
Expects(_paddingHelper != nullptr);
|
||||||
|
|
||||||
if (_paddingHelper->padding == padding) {
|
if (_paddingHelper->padding.current() == padding) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_paddingHelper->padding = padding;
|
_paddingHelper->padding = padding;
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,8 @@ public:
|
||||||
void refreshAdditionalPaddings(
|
void refreshAdditionalPaddings(
|
||||||
HWND handle,
|
HWND handle,
|
||||||
const WINDOWPLACEMENT &placement);
|
const WINDOWPLACEMENT &placement);
|
||||||
|
[[nodiscard]] int additionalPadding() const;
|
||||||
|
[[nodiscard]] rpl::producer<int> additionalPaddingValue() const;
|
||||||
|
|
||||||
void sysButtonOver(HitTestResult testResult);
|
void sysButtonOver(HitTestResult testResult);
|
||||||
void sysButtonDown(HitTestResult testResult, bool down);
|
void sysButtonDown(HitTestResult testResult, bool down);
|
||||||
|
|
|
||||||
|
|
@ -179,6 +179,19 @@ QMargins WindowHelper::frameMargins() {
|
||||||
: QMargins{ 0, _title->height(), 0, 0 };
|
: QMargins{ 0, _title->height(), 0, 0 };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int WindowHelper::additionalContentPadding() const {
|
||||||
|
return _title->isHidden() ? 0 : _title->additionalPadding();
|
||||||
|
}
|
||||||
|
|
||||||
|
rpl::producer<int> WindowHelper::additionalContentPaddingValue() const {
|
||||||
|
return rpl::combine(
|
||||||
|
_title->shownValue(),
|
||||||
|
_title->additionalPaddingValue()
|
||||||
|
) | rpl::map([](bool shown, int padding) {
|
||||||
|
return shown ? padding : 0;
|
||||||
|
}) | rpl::distinct_until_changed();
|
||||||
|
}
|
||||||
|
|
||||||
void WindowHelper::setTitle(const QString &title) {
|
void WindowHelper::setTitle(const QString &title) {
|
||||||
_title->setText(title);
|
_title->setText(title);
|
||||||
window()->setWindowTitle(title);
|
window()->setWindowTitle(title);
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,8 @@ public:
|
||||||
|
|
||||||
not_null<RpWidget*> body() override;
|
not_null<RpWidget*> body() override;
|
||||||
QMargins frameMargins() override;
|
QMargins frameMargins() override;
|
||||||
|
int additionalContentPadding() const override;
|
||||||
|
rpl::producer<int> additionalContentPaddingValue() const override;
|
||||||
void setTitle(const QString &title) override;
|
void setTitle(const QString &title) override;
|
||||||
void setTitleStyle(const style::WindowTitle &st) override;
|
void setTitleStyle(const style::WindowTitle &st) override;
|
||||||
void setNativeFrame(bool enabled) override;
|
void setNativeFrame(bool enabled) override;
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,14 @@ QMargins RpWindow::frameMargins() const {
|
||||||
return _helper->frameMargins();
|
return _helper->frameMargins();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int RpWindow::additionalContentPadding() const {
|
||||||
|
return _helper->additionalContentPadding();
|
||||||
|
}
|
||||||
|
|
||||||
|
rpl::producer<int> RpWindow::additionalContentPaddingValue() const {
|
||||||
|
return _helper->additionalContentPaddingValue();
|
||||||
|
}
|
||||||
|
|
||||||
void RpWindow::setTitle(const QString &title) {
|
void RpWindow::setTitle(const QString &title) {
|
||||||
_helper->setTitle(title);
|
_helper->setTitle(title);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -38,6 +38,14 @@ public:
|
||||||
[[nodiscard]] not_null<const RpWidget*> body() const;
|
[[nodiscard]] not_null<const RpWidget*> body() const;
|
||||||
[[nodiscard]] QMargins frameMargins() const;
|
[[nodiscard]] QMargins frameMargins() const;
|
||||||
|
|
||||||
|
// In Windows 11 the window rounding shadow takes about
|
||||||
|
// round(1px * system_scale) from the window geometry on each side.
|
||||||
|
//
|
||||||
|
// Top shift is made by the TitleWidget height, but the rest of the
|
||||||
|
// side shifts are left for the RpWindow client to consider.
|
||||||
|
[[nodiscard]] int additionalContentPadding() const;
|
||||||
|
[[nodiscard]] rpl::producer<int> additionalContentPaddingValue() const;
|
||||||
|
|
||||||
void setTitle(const QString &title);
|
void setTitle(const QString &title);
|
||||||
void setTitleStyle(const style::WindowTitle &st);
|
void setTitleStyle(const style::WindowTitle &st);
|
||||||
void setNativeFrame(bool enabled);
|
void setNativeFrame(bool enabled);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue