Pin RTMP stream on top.

This commit is contained in:
John Preston 2022-02-28 20:06:54 +03:00
parent 282b3592c2
commit 4b93f58d2f
4 changed files with 66 additions and 4 deletions

View file

@ -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";

View file

@ -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;

View file

@ -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<Data::GroupCall*> 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) {

View file

@ -160,6 +160,7 @@ private:
void refreshVideoButtons(
std::optional<bool> overrideWideMode = std::nullopt);
void refreshTopButton();
void createPinOnTop();
void toggleWideControls(bool shown);
void updateWideControlsVisibility();
[[nodiscard]] bool videoButtonInNarrowMode() const;
@ -201,7 +202,7 @@ private:
rpl::variable<bool> _fullScreen = false;
#ifndef Q_OS_MAC
std::unique_ptr<Ui::Platform::SeparateTitleControls> _controls;
const std::unique_ptr<Ui::Platform::SeparateTitleControls> _controls;
#endif // !Q_OS_MAC
const std::unique_ptr<base::PowerSaveBlocker> _powerSaveBlocker;
@ -212,6 +213,7 @@ private:
object_ptr<Ui::FlatLabel> _subtitle = { nullptr };
object_ptr<Ui::AbstractButton> _recordingMark = { nullptr };
object_ptr<Ui::IconButton> _menuToggle = { nullptr };
object_ptr<Ui::IconButton> _pinOnTop = { nullptr };
object_ptr<Ui::DropdownMenu> _menu = { nullptr };
rpl::variable<bool> _wideMenuShown = false;
object_ptr<Ui::AbstractButton> _joinAsToggle = { nullptr };