From cb18c9a9b3b8a9ec02d8b60fb2058945ad34082a Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 14 Aug 2020 12:32:05 +0400 Subject: [PATCH] Show remote audio muted tooltip. --- .../Resources/icons/calls_mute_tooltip.png | Bin 0 -> 637 bytes .../Resources/icons/calls_mute_tooltip@2x.png | Bin 0 -> 1218 bytes .../Resources/icons/calls_mute_tooltip@3x.png | Bin 0 -> 1909 bytes Telegram/Resources/langs/lang.strings | 12 ++++ Telegram/SourceFiles/calls/calls.style | 12 +++- Telegram/SourceFiles/calls/calls_panel.cpp | 56 ++++++++++++++++++ Telegram/SourceFiles/calls/calls_panel.h | 7 +++ 7 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 Telegram/Resources/icons/calls_mute_tooltip.png create mode 100644 Telegram/Resources/icons/calls_mute_tooltip@2x.png create mode 100644 Telegram/Resources/icons/calls_mute_tooltip@3x.png diff --git a/Telegram/Resources/icons/calls_mute_tooltip.png b/Telegram/Resources/icons/calls_mute_tooltip.png new file mode 100644 index 0000000000000000000000000000000000000000..9581af158997180c524ac62bf5a89d70d682017a GIT binary patch literal 637 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 vXsUw|6adl?&{PK_C;+4(ps5Z call) initWidget(); initControls(); initLayout(); + initBottomShadow(); showAndActivate(); } @@ -475,6 +477,15 @@ void Panel::reinitWithCall(Call *call) { ) | rpl::map([=](Call::RemoteAudioState state) { return (state == Call::RemoteAudioState::Muted); }); + rpl::duplicate( + remoteMuted + ) | rpl::start_with_next([=](bool muted) { + if (muted) { + createRemoteAudioMute(); + } else { + _remoteAudioMute.destroy(); + } + }, _callLifetime); _userpic = std::make_unique( widget(), _user, @@ -541,6 +552,37 @@ void Panel::reinitWithCall(Call *call) { updateStatusText(_call->state()); } +void Panel::createRemoteAudioMute() { + _remoteAudioMute.create( + widget(), + object_ptr( + widget(), + tr::lng_call_microphone_off( + lt_user, + rpl::single(_user->shortName())), + st::callRemoteAudioMute), + st::callTooltipPadding); + + _remoteAudioMute->paintRequest( + ) | rpl::start_with_next([=] { + auto p = QPainter(_remoteAudioMute); + const auto height = _remoteAudioMute->height(); + + auto hq = PainterHighQualityEnabler(p); + p.setBrush(st::toastBg); + p.setPen(Qt::NoPen); + p.drawRoundedRect(_remoteAudioMute->rect(), height / 2, height / 2); + + st::callTooltipMutedIcon.paint( + p, + st::callTooltipMutedIconPosition, + _remoteAudioMute->width()); + }, _remoteAudioMute->lifetime()); + + showControls(); + updateControlsGeometry(); +} + void Panel::initLayout() { initGeometry(); @@ -563,6 +605,9 @@ void Panel::initLayout() { #endif // Q_OS_WIN } +void Panel::initBottomShadow() { +} + void Panel::showControls() { Expects(_call != nullptr); @@ -574,6 +619,9 @@ void Panel::showControls() { _name->setVisible(!shown); _status->setVisible(!shown); _userpic->setVisible(!shown); + if (_remoteAudioMute) { + _remoteAudioMute->setVisible(shown); + } } void Panel::hideBeforeDestroy() { @@ -698,6 +746,14 @@ void Panel::updateControlsGeometry() { _bodyTop + _bodySt->nameTop); updateStatusGeometry(); + if (_remoteAudioMute) { + _remoteAudioMute->moveToLeft( + (widget()->width() - _remoteAudioMute->width()) / 2, + (_buttonsTop + - st::callRemoteAudioMuteSkip + - _remoteAudioMute->height())); + } + if (_outgoingPreviewInBody) { _outgoingVideoBubble->updateGeometry( VideoBubble::DragMode::None, diff --git a/Telegram/SourceFiles/calls/calls_panel.h b/Telegram/SourceFiles/calls/calls_panel.h index 5ba75ac69..30a3d38ca 100644 --- a/Telegram/SourceFiles/calls/calls_panel.h +++ b/Telegram/SourceFiles/calls/calls_panel.h @@ -26,6 +26,8 @@ class IconButton; class FlatLabel; template class FadeWrap; +template +class PaddingWrap; class Window; namespace Platform { class TitleControls; @@ -39,6 +41,7 @@ struct CallBodyLayout; namespace Calls { +class Tooltip; class Userpic; class SignalBars; class VideoBubble; @@ -73,6 +76,7 @@ private: void reinitWithCall(Call *call); void initLayout(); void initGeometry(); + void initBottomShadow(); void handleClose(); void handleMouseMove(not_null e); @@ -94,6 +98,7 @@ private: void refreshOutgoingPreviewInBody(State state); void toggleFullScreen(bool fullscreen); + void createRemoteAudioMute(); [[nodiscard]] QRect incomingFrameGeometry() const; [[nodiscard]] QRect outgoingFrameGeometry() const; @@ -123,10 +128,12 @@ private: object_ptr _name; object_ptr _status; object_ptr _signalBars = { nullptr }; + object_ptr> _remoteAudioMute = { nullptr }; std::unique_ptr _userpic; std::unique_ptr _outgoingVideoBubble; std::vector _fingerprint; QRect _fingerprintArea; + QPixmap _bottomShadow; int _bodyTop = 0; int _buttonsTop = 0; int _fingerprintHeight = 0;