From 66d2c06eb42fa4f2430e0881e62b567b4c01562a Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Thu, 4 Aug 2022 18:06:20 +0400 Subject: [PATCH] Update minimum & maximum size in the PiP --- .../SourceFiles/media/view/media_view_pip.cpp | 39 ++++++++++++++++--- .../SourceFiles/media/view/media_view_pip.h | 1 + 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/Telegram/SourceFiles/media/view/media_view_pip.cpp b/Telegram/SourceFiles/media/view/media_view_pip.cpp index b9fe00bad3..6d23f07f07 100644 --- a/Telegram/SourceFiles/media/view/media_view_pip.cpp +++ b/Telegram/SourceFiles/media/view/media_view_pip.cpp @@ -369,6 +369,18 @@ void PipPanel::init() { // Workaround Qt's forced transient parent. Ui::Platform::ClearTransientParent(widget()); }, rp()->lifetime()); + + rp()->sizeValue( + ) | rpl::start_with_next([=](QSize size) { + handleResize(size); + }, rp()->lifetime()); + + QObject::connect( + widget()->windowHandle(), + &QWindow::screenChanged, + [=](QScreen *screen) { + handleScreenChanged(screen); + }); } not_null PipPanel::widget() const { @@ -531,7 +543,7 @@ void PipPanel::setPositionOnScreen(Position position, QRect available) { std::max(normalized.height(), minimalSize.height())); // Apply maximal size. - const auto maximalSize = (_ratio.width() > _ratio.height()) + const auto maximalSize = byWidth ? QSize(fit.width(), fit.width() * _ratio.height() / _ratio.width()) : QSize(fit.height() * _ratio.width() / _ratio.height(), fit.height()); @@ -621,6 +633,22 @@ void PipPanel::handleResize(QSize size) { #endif // QT_WAYLAND_EGL_CLIENT_HW_INTEGRATION_LIB } +void PipPanel::handleScreenChanged(QScreen *screen) { + const auto screenGeometry = screen->availableGeometry(); + const auto minimalSize = _ratio.scaled( + st::pipMinimalSize, + st::pipMinimalSize, + Qt::KeepAspectRatioByExpanding); + const auto maximalSize = _ratio.scaled( + screenGeometry.width() / 2, + screenGeometry.height() / 2, + Qt::KeepAspectRatio); + widget()->setMinimumSize(minimalSize); + widget()->setMaximumSize( + std::max(minimalSize.width(), maximalSize.width()), + std::max(minimalSize.height(), maximalSize.height())); +} + void PipPanel::handleMousePress(QPoint position, Qt::MouseButton button) { if (button != Qt::LeftButton) { return; @@ -770,6 +798,10 @@ void PipPanel::processDrag(QPoint point) { const auto clamped = (dragPart == RectPart::Center) ? ClampToEdges(screen, valid) : valid.topLeft(); + widget()->setMinimumSize(minimalSize); + widget()->setMaximumSize( + std::max(minimalSize.width(), maximalSize.width()), + std::max(minimalSize.height(), maximalSize.height())); if (clamped != valid.topLeft()) { moveAnimated(clamped); } else { @@ -953,11 +985,6 @@ void Pip::setupPanel() { break; } }, _panel.rp()->lifetime()); - - _panel.rp()->sizeValue( - ) | rpl::start_with_next([=](QSize size) { - _panel.handleResize(size); - }, _panel.rp()->lifetime()); } void Pip::handleClose() { diff --git a/Telegram/SourceFiles/media/view/media_view_pip.h b/Telegram/SourceFiles/media/view/media_view_pip.h index 0af3e9c224..92ccfc168e 100644 --- a/Telegram/SourceFiles/media/view/media_view_pip.h +++ b/Telegram/SourceFiles/media/view/media_view_pip.h @@ -77,6 +77,7 @@ public: [[nodiscard]] bool dragging() const; void handleResize(QSize size); + void handleScreenChanged(QScreen *screen); void handleMousePress(QPoint position, Qt::MouseButton button); void handleMouseRelease(QPoint position, Qt::MouseButton button); void handleMouseMove(QPoint position);