From 4b93f58d2f1977a62eb7a9ba069b8e71d49102d7 Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 28 Feb 2022 20:06:54 +0300 Subject: [PATCH] Pin RTMP stream on top. --- Telegram/Resources/langs/lang.strings | 2 + Telegram/SourceFiles/calls/calls.style | 5 ++ .../calls/group/calls_group_panel.cpp | 59 ++++++++++++++++++- .../calls/group/calls_group_panel.h | 4 +- 4 files changed, 66 insertions(+), 4 deletions(-) diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index bfeea416e..60eaa4c13 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -2364,6 +2364,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_group_call_unpinned_camera" = "{user}'s video is unpinned."; "lng_group_call_unpinned_screen" = "{user}'s screencast is unpinned."; "lng_group_call_sure_screencast" = "{user} is screensharing. This action will make your screencast pinned for all participants."; +"lng_group_call_pinned_on_top" = "Live stream pinned on top."; +"lng_group_call_unpinned_on_top" = "Live stream unpinned from top."; "lng_group_call_recording_start_sure" = "Participants will see the chat is being recorded."; "lng_group_call_recording_stop_sure" = "Do you want to stop recording this chat?"; "lng_group_call_recording_start_field" = "Recording Title"; diff --git a/Telegram/SourceFiles/calls/calls.style b/Telegram/SourceFiles/calls/calls.style index 6c7ba8738..2dacab597 100644 --- a/Telegram/SourceFiles/calls/calls.style +++ b/Telegram/SourceFiles/calls/calls.style @@ -1117,6 +1117,11 @@ groupCallTitle: WindowTitle(defaultWindowTitle) { closeIconActive: groupCallTitleCloseIcon; closeIconActiveOver: groupCallTitleCloseIconOver; } +groupCallPinOnTop: IconButton(groupCallTitleButton) { + icon: icon{{ "dialogs/dialogs_pinned", groupCallMemberNotJoinedStatus }}; + iconOver: icon{{ "dialogs/dialogs_pinned", groupCallMembersFg }}; + iconPosition: point(8px, 2px); +} groupCallMajorBlobIdleRadius: 2px; groupCallMajorBlobMaxRadius: 4px; diff --git a/Telegram/SourceFiles/calls/group/calls_group_panel.cpp b/Telegram/SourceFiles/calls/group/calls_group_panel.cpp index 5fd09d6d2..d3b6ac564 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_panel.cpp +++ b/Telegram/SourceFiles/calls/group/calls_group_panel.cpp @@ -935,6 +935,9 @@ void Panel::raiseControls() { if (_recordingMark) { _recordingMark->raise(); } + if (_pinOnTop) { + _pinOnTop->raise(); + } _layerBg->raise(); if (_niceTooltip) { _niceTooltip->raise(); @@ -1142,7 +1145,44 @@ void Panel::subscribeToChanges(not_null real) { updateControlsGeometry(); } +void Panel::createPinOnTop() { + _pinOnTop.create(window(), st::groupCallPinOnTop); + const auto pinned = [=] { + const auto handle = window()->windowHandle(); + return handle && (handle->flags() & Qt::WindowStaysOnTopHint); + }; + const auto pin = [=](bool pin) { + if (const auto handle = window()->windowHandle()) { + handle->setFlag(Qt::WindowStaysOnTopHint, pin); + _pinOnTop->setIconOverride( + pin ? &st::groupCallPinOnTop.iconOver : nullptr, + nullptr); + if (!_pinOnTop->isHidden()) { + showToast({ pin + ? tr::lng_group_call_pinned_on_top(tr::now) + : tr::lng_group_call_unpinned_on_top(tr::now) }); + } + } + }; + _fullScreen.value( + ) | rpl::start_with_next([=](bool fullscreen) { + _pinOnTop->setVisible(!fullscreen); + if (fullscreen) { + pin(false); + } + }, _pinOnTop->lifetime()); + + _pinOnTop->setClickedCallback([=] { + pin(!pinned()); + }); + + updateControlsGeometry(); +} + void Panel::refreshTopButton() { + if (_call->rtmp() && !_pinOnTop) { + createPinOnTop(); + } if (_mode.current() == PanelMode::Wide) { _menuToggle.destroy(); _joinAsToggle.destroy(); @@ -1458,10 +1498,15 @@ void Panel::initGeometry() { QRect Panel::computeTitleRect() const { const auto skip = st::groupCallTitleTop; - const auto remove = skip + (_menuToggle - ? (_menuToggle->width() + st::groupCallMenuTogglePosition.x()) - : 0) + (_joinAsToggle + const auto remove = skip + + (_menuToggle + ? (_menuToggle->width() + st::groupCallMenuTogglePosition.x()) + : 0) + + (_joinAsToggle ? (_joinAsToggle->width() + st::groupCallMenuTogglePosition.x()) + : 0) + + (_pinOnTop + ? (_pinOnTop->width() + skip) : 0); const auto width = widget()->width(); #ifdef Q_OS_MAC @@ -1939,20 +1984,28 @@ void Panel::updateControlsGeometry() { #ifdef Q_OS_MAC const auto controlsOnTheLeft = true; + const auto controlsPadding = 0; #else // Q_OS_MAC const auto center = _controls->controls.geometry().center(); const auto controlsOnTheLeft = center.x() < widget()->width() / 2; + const auto controlsPadding = _controls->wrap.y(); #endif // Q_OS_MAC const auto menux = st::groupCallMenuTogglePosition.x(); const auto menuy = st::groupCallMenuTogglePosition.y(); if (controlsOnTheLeft) { + if (_pinOnTop) { + _pinOnTop->moveToRight(controlsPadding, controlsPadding); + } if (_menuToggle) { _menuToggle->moveToRight(menux, menuy); } else if (_joinAsToggle) { _joinAsToggle->moveToRight(menux, menuy); } } else { + if (_pinOnTop) { + _pinOnTop->moveToLeft(controlsPadding, controlsPadding); + } if (_menuToggle) { _menuToggle->moveToLeft(menux, menuy); } else if (_joinAsToggle) { diff --git a/Telegram/SourceFiles/calls/group/calls_group_panel.h b/Telegram/SourceFiles/calls/group/calls_group_panel.h index 5ae61bf47..3b1e022b0 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_panel.h +++ b/Telegram/SourceFiles/calls/group/calls_group_panel.h @@ -160,6 +160,7 @@ private: void refreshVideoButtons( std::optional overrideWideMode = std::nullopt); void refreshTopButton(); + void createPinOnTop(); void toggleWideControls(bool shown); void updateWideControlsVisibility(); [[nodiscard]] bool videoButtonInNarrowMode() const; @@ -201,7 +202,7 @@ private: rpl::variable _fullScreen = false; #ifndef Q_OS_MAC - std::unique_ptr _controls; + const std::unique_ptr _controls; #endif // !Q_OS_MAC const std::unique_ptr _powerSaveBlocker; @@ -212,6 +213,7 @@ private: object_ptr _subtitle = { nullptr }; object_ptr _recordingMark = { nullptr }; object_ptr _menuToggle = { nullptr }; + object_ptr _pinOnTop = { nullptr }; object_ptr _menu = { nullptr }; rpl::variable _wideMenuShown = false; object_ptr _joinAsToggle = { nullptr };