/* This file is part of Telegram Desktop, the official desktop application for the Telegram messaging service. For license and copyright information please follow this link: https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once #include "base/weak_ptr.h" #include "base/timer.h" #include "base/flags.h" #include "base/object_ptr.h" #include "base/unique_qptr.h" #include "calls/group/calls_group_call.h" #include "calls/group/calls_group_common.h" #include "calls/group/calls_choose_join_as.h" #include "calls/group/ui/desktop_capture_choose_source.h" #include "ui/effects/animations.h" #include "ui/gl/gl_window.h" #include "ui/rp_widget.h" class Image; namespace base { class PowerSaveBlocker; } // namespace base namespace Data { class PhotoMedia; class CloudImageView; class GroupCall; } // namespace Data namespace Ui { class BoxContent; enum class LayerOption; using LayerOptions = base::flags; class AbstractButton; class ImportantTooltip; class DropdownMenu; class CallButton; class CallMuteButton; class IconButton; class FlatLabel; class RpWidget; template class FadeWrap; template class PaddingWrap; class ScrollArea; class GenericBox; class LayerManager; class GroupCallScheduledLeft; namespace Toast { class Instance; } // namespace Toast namespace Platform { struct SeparateTitleControls; } // namespace Platform } // namespace Ui namespace style { struct CallSignalBars; struct CallBodyLayout; } // namespace style namespace Calls::Group { class Toasts; class Members; class Viewport; enum class PanelMode; enum class StickedTooltip; class MicLevelTester; class Panel final : private Ui::DesktopCapture::ChooseSourceDelegate { public: Panel(not_null call); ~Panel(); [[nodiscard]] not_null call() const; [[nodiscard]] bool isActive() const; void showToast(TextWithEntities &&text, crl::time duration = 0); void showBox(object_ptr box); void showBox( object_ptr box, Ui::LayerOptions options, anim::type animated = anim::type::normal); void minimize(); void close(); void showAndActivate(); void closeBeforeDestroy(); rpl::lifetime &lifetime(); private: using State = GroupCall::State; struct ControlsBackgroundNarrow; enum class NiceTooltipType { Normal, Sticked, }; enum class StickedTooltipHide { Unavailable, Activated, Discarded, }; [[nodiscard]] not_null window() const; [[nodiscard]] not_null widget() const; [[nodiscard]] PanelMode mode() const; void paint(QRect clip); void initWindow(); void initWidget(); void initControls(); void initShareAction(); void initLayout(); void initGeometry(); void setupScheduledLabels(rpl::producer date); void setupMembers(); void setupVideo(not_null viewport); void setupRealMuteButtonState(not_null real); bool handleClose(); void startScheduledNow(); void toggleFullScreen(); void trackControls(bool track, bool force = false); void raiseControls(); void enlargeVideo(); void trackControl(Ui::RpWidget *widget, rpl::lifetime &lifetime); void trackControlOver(not_null control, bool over); void showNiceTooltip( not_null control, NiceTooltipType type = NiceTooltipType::Normal); void showStickedTooltip(); void hideStickedTooltip(StickedTooltipHide hide); void hideStickedTooltip(StickedTooltip type, StickedTooltipHide hide); void hideNiceTooltip(); bool updateMode(); void updateControlsGeometry(); void updateButtonsGeometry(); void updateTooltipGeometry(); void updateButtonsStyles(); void updateMembersGeometry(); void refreshControlsBackground(); void refreshTitleBackground(); void setupControlsBackgroundWide(); void setupControlsBackgroundNarrow(); void showControls(); void refreshLeftButton(); void refreshVideoButtons( std::optional overrideWideMode = std::nullopt); void refreshTopButton(); void createPinOnTop(); void setupEmptyRtmp(); void toggleWideControls(bool shown); void updateWideControlsVisibility(); [[nodiscard]] bool videoButtonInNarrowMode() const; void endCall(); void showMainMenu(); void chooseJoinAs(); void chooseShareScreenSource(); void screenSharingPrivacyRequest(); void addMembers(); void kickParticipant(not_null participantPeer); void kickParticipantSure(not_null participantPeer); [[nodiscard]] QRect computeTitleRect() const; void refreshTitle(); void refreshTitleGeometry(); void refreshTitleColors(); void setupRealCallViewers(); void subscribeToChanges(not_null real); void migrate(not_null channel); void subscribeToPeerChanges(); QWidget *chooseSourceParent() override; QString chooseSourceActiveDeviceId() override; bool chooseSourceActiveWithAudio() override; bool chooseSourceWithAudioSupported() override; rpl::lifetime &chooseSourceInstanceLifetime() override; void chooseSourceAccepted( const QString &deviceId, bool withAudio) override; void chooseSourceStop() override; const not_null _call; not_null _peer; Ui::GL::Window _window; const std::unique_ptr _layerBg; rpl::variable _mode; rpl::variable _fullScreenOrMaximized = false; #ifndef Q_OS_MAC rpl::variable _controlsTop = 0; const std::unique_ptr _controls; #endif // !Q_OS_MAC const std::unique_ptr _powerSaveBlocker; rpl::lifetime _callLifetime; object_ptr _titleBackground = { nullptr }; object_ptr _title = { nullptr }; object_ptr _titleSeparator = { nullptr }; object_ptr _viewers = { nullptr }; 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 }; object_ptr _members = { nullptr }; std::unique_ptr _viewport; rpl::lifetime _trackControlsOverStateLifetime; rpl::lifetime _trackControlsMenuLifetime; object_ptr _startsIn = { nullptr }; object_ptr _countdown = { nullptr }; std::shared_ptr _countdownData; object_ptr _startsWhen = { nullptr }; object_ptr _emptyRtmp = { nullptr }; ChooseJoinAsProcess _joinAsProcess; std::optional _lastSmallGeometry; std::optional _lastLargeGeometry; bool _lastLargeMaximized = false; bool _showWideControls = false; bool _trackControls = false; bool _wideControlsShown = false; Ui::Animations::Simple _wideControlsAnimation; object_ptr _controlsBackgroundWide = { nullptr }; std::unique_ptr _controlsBackgroundNarrow; object_ptr _settings = { nullptr }; object_ptr _wideMenu = { nullptr }; object_ptr _callShare = { nullptr }; object_ptr _video = { nullptr }; object_ptr _screenShare = { nullptr }; std::unique_ptr _mute; object_ptr _hangup; object_ptr _niceTooltip = { nullptr }; QPointer _stickedTooltipClose; QPointer _niceTooltipControl; StickedTooltips _stickedTooltipsShown; Fn _callShareLinkCallback; const std::unique_ptr _toasts; base::weak_ptr _lastToast; std::unique_ptr _micLevelTester; style::complex_color _controlsBackgroundColor; base::Timer _hideControlsTimer; rpl::lifetime _hideControlsTimerLifetime; rpl::lifetime _peerLifetime; }; } // namespace Calls::Group