From 38b9111bf5e49d0cc6ea0529813d1adca7237fc3 Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 12 Aug 2020 17:35:31 +0400 Subject: [PATCH] Use Ui::Window for the Calls::Panel. --- Telegram/SourceFiles/calls/calls.style | 77 ++++ Telegram/SourceFiles/calls/calls_instance.cpp | 20 +- Telegram/SourceFiles/calls/calls_instance.h | 1 - Telegram/SourceFiles/calls/calls_panel.cpp | 415 ++++++------------ Telegram/SourceFiles/calls/calls_panel.h | 52 +-- .../SourceFiles/calls/calls_video_bubble.cpp | 4 + .../SourceFiles/calls/calls_video_bubble.h | 1 + Telegram/lib_ui | 2 +- 8 files changed, 230 insertions(+), 342 deletions(-) diff --git a/Telegram/SourceFiles/calls/calls.style b/Telegram/SourceFiles/calls/calls.style index 075662184..5cf2d860c 100644 --- a/Telegram/SourceFiles/calls/calls.style +++ b/Telegram/SourceFiles/calls/calls.style @@ -259,3 +259,80 @@ callBarSignalBars: CallSignalBars(callPanelSignalBars) { } callSignalMargin: 8px; callSignalPadding: 4px; + +callTitle: WindowTitle(defaultWindowTitle) { + bg: callBgOpaque; + bgActive: callBgOpaque; + fg: transparent; + fgActive: transparent; + minimize: IconButton(windowTitleButton) { + icon: icon { + { size(24px, 21px), callBgOpaque }, + { "title_button_minimize", callStatusFg, point(4px, 4px) }, + }; + iconOver: icon { + { size(24px, 21px), callMuteRipple }, + { "title_button_minimize", callStatusFg, point(4px, 4px) }, + }; + } + minimizeIconActive: icon { + { size(24px, 21px), callBgOpaque }, + { "title_button_minimize", callStatusFg, point(4px, 4px) }, + }; + minimizeIconActiveOver: icon { + { size(24px, 21px), callMuteRipple }, + { "title_button_minimize", callStatusFg, point(4px, 4px) }, + }; + maximize: IconButton(windowTitleButton) { + icon: icon { + { size(24px, 21px), callBgOpaque }, + { "title_button_maximize", callStatusFg, point(4px, 4px) }, + }; + iconOver: icon { + { size(24px, 21px), callMuteRipple }, + { "title_button_maximize", callStatusFg, point(4px, 4px) }, + }; + } + maximizeIconActive: icon { + { size(24px, 21px), callBgOpaque }, + { "title_button_maximize", callStatusFg, point(4px, 4px) }, + }; + maximizeIconActiveOver: icon { + { size(24px, 21px), callMuteRipple }, + { "title_button_maximize", callStatusFg, point(4px, 4px) }, + }; + restoreIcon: icon { + { size(24px, 21px), callBgOpaque }, + { "title_button_restore", callStatusFg, point(4px, 4px) }, + }; + restoreIconOver: icon { + { size(24px, 21px), callMuteRipple }, + { "title_button_restore", callStatusFg, point(4px, 4px) }, + }; + restoreIconActive: icon { + { size(24px, 21px), callBgOpaque }, + { "title_button_restore", callStatusFg, point(4px, 4px) }, + }; + restoreIconActiveOver: icon { + { size(24px, 21px), callMuteRipple }, + { "title_button_restore", callStatusFg, point(4px, 4px) }, + }; + close: IconButton(windowTitleButtonClose) { + icon: icon { + { size(25px, 21px), callBgOpaque }, + { "title_button_close", callStatusFg, point(5px, 4px) }, + }; + iconOver: icon { + { size(25px, 21px), titleButtonCloseBgOver }, + { "title_button_close", titleButtonCloseFgOver, point(5px, 4px) }, + }; + } + closeIconActive: icon { + { size(25px, 21px), callBgOpaque }, + { "title_button_close", callStatusFg, point(5px, 4px) }, + }; + closeIconActiveOver: icon { + { size(25px, 21px), titleButtonCloseBgActiveOver }, + { "title_button_close", titleButtonCloseFgActiveOver, point(5px, 4px) }, + }; +} diff --git a/Telegram/SourceFiles/calls/calls_instance.cpp b/Telegram/SourceFiles/calls/calls_instance.cpp index c131ade2c..325a66372 100644 --- a/Telegram/SourceFiles/calls/calls_instance.cpp +++ b/Telegram/SourceFiles/calls/calls_instance.cpp @@ -35,13 +35,7 @@ constexpr auto kServerConfigUpdateTimeoutMs = 24 * 3600 * crl::time(1000); Instance::Instance() = default; -Instance::~Instance() { - for (const auto panel : _pendingPanels) { - if (panel) { - delete panel; - } - } -} +Instance::~Instance() = default; void Instance::startOutgoingCall(not_null user, bool video) { if (alreadyInCall()) { // Already in a call. @@ -120,14 +114,10 @@ void Instance::destroyCall(not_null call) { } void Instance::destroyCurrentPanel() { - _pendingPanels.erase( - std::remove_if( - _pendingPanels.begin(), - _pendingPanels.end(), - [](auto &&panel) { return !panel; }), - _pendingPanels.end()); - _pendingPanels.emplace_back(_currentCallPanel.release()); - _pendingPanels.back()->hideAndDestroy(); // Always queues the destruction. + _currentCallPanel->hideBeforeDestroy(); + + // Always queue the destruction. + crl::on_main([panel = std::move(_currentCallPanel)]{}); } void Instance::createCall(not_null user, Call::Type type, bool video) { diff --git a/Telegram/SourceFiles/calls/calls_instance.h b/Telegram/SourceFiles/calls/calls_instance.h index 53e5cd6a2..9ea58bec0 100644 --- a/Telegram/SourceFiles/calls/calls_instance.h +++ b/Telegram/SourceFiles/calls/calls_instance.h @@ -85,7 +85,6 @@ private: std::unique_ptr _currentCallPanel; base::Observable _currentCallChanged; base::Observable _newServiceMessage; - std::vector> _pendingPanels; std::unique_ptr _callConnectingTrack; std::unique_ptr _callEndedTrack; diff --git a/Telegram/SourceFiles/calls/calls_panel.cpp b/Telegram/SourceFiles/calls/calls_panel.cpp index 97de27e4c..09eb9be6d 100644 --- a/Telegram/SourceFiles/calls/calls_panel.cpp +++ b/Telegram/SourceFiles/calls/calls_panel.cpp @@ -21,6 +21,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/widgets/buttons.h" #include "ui/widgets/labels.h" #include "ui/widgets/shadow.h" +#include "ui/widgets/window.h" #include "ui/effects/ripple_animation.h" #include "ui/image/image.h" #include "ui/wrap/fade_wrap.h" @@ -50,7 +51,7 @@ constexpr auto kTooltipShowTimeoutMs = 1000; } // namespace -class Panel::Button : public Ui::RippleButton { +class Panel::Button final : public Ui::RippleButton { public: Button(QWidget *parent, const style::CallButton &stFrom, const style::CallButton *stTo = nullptr); @@ -86,7 +87,8 @@ private: }; -Panel::Button::Button(QWidget *parent, const style::CallButton &stFrom, const style::CallButton *stTo) : Ui::RippleButton(parent, stFrom.button.ripple) +Panel::Button::Button(QWidget *parent, const style::CallButton &stFrom, const style::CallButton *stTo) +: Ui::RippleButton(parent, stFrom.button.ripple) , _stFrom(&stFrom) , _stTo(stTo) { resize(_stFrom->button.width, _stFrom->button.height); @@ -255,22 +257,22 @@ QImage Panel::Button::prepareRippleMask() const { } Panel::Panel(not_null call) -: RpWidget(Core::App().getModalParent()) -, _call(call) +: _call(call) , _user(call->user()) +, _window(std::make_unique(Core::App().getModalParent())) , _bodySt(&st::callBodyLayout) -, _answerHangupRedial(this, st::callAnswer, &st::callHangup) -, _decline(this, object_ptr