/* 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/object_ptr.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" class Image; namespace Data { class PhotoMedia; class GroupCall; } // namespace Data namespace Main { class SessionShow; } // namespace Main namespace Ui { class Show; class BoxContent; class LayerWidget; enum class LayerOption; using LayerOptions = base::flags; class AbstractButton; class ImportantTooltip; class DropdownMenu; class CallButton; class CallMuteButton; class IconButton; class FlatLabel; class RpWidget; class RpWindow; template class FadeWrap; template class PaddingWrap; class ScrollArea; class GenericBox; class GroupCallScheduledLeft; } // namespace Ui namespace Ui::Toast { class Instance; struct Config; } // namespace Ui::Toast namespace style { struct CallSignalBars; struct CallBodyLayout; } // namespace style namespace Calls { struct InviteRequest; struct ConferencePanelMigration; class Window; } // namespace Calls namespace Calls::Group { class Toasts; class Members; class Viewport; enum class PanelMode; enum class StickedTooltip; class MicLevelTester; class Panel final : public base::has_weak_ptr , private Ui::DesktopCapture::ChooseSourceDelegate { public: explicit Panel(not_null call); Panel(not_null call, ConferencePanelMigration info); ~Panel(); [[nodiscard]] not_null widget() const; [[nodiscard]] not_null call() const; [[nodiscard]] bool isVisible() const; [[nodiscard]] bool isActive() const; void migrationShowShareLink(); void migrationInviteUsers(std::vector users); void minimize(); void toggleFullScreen(); void toggleFullScreen(bool fullscreen); void close(); void showAndActivate(); void closeBeforeDestroy(); [[nodiscard]] std::shared_ptr sessionShow(); [[nodiscard]] std::shared_ptr uiShow(); [[nodiscard]] not_null window() const; rpl::lifetime &lifetime(); private: using State = GroupCall::State; struct ControlsBackgroundNarrow; enum class NiceTooltipType { Normal, Sticked, }; enum class StickedTooltipHide { Unavailable, Activated, Discarded, }; [[nodiscard]] PanelMode mode() const; void paint(QRect clip); void initWindow(); void initWidget(); void initControls(); void initShareAction(); void initLayout(ConferencePanelMigration info); void initGeometry(ConferencePanelMigration info); void setupScheduledLabels(rpl::producer date); void setupMembers(); void setupVideo(not_null viewport); void setupRealMuteButtonState(not_null real); [[nodiscard]] rpl::producer titleText(); bool handleClose(); void startScheduledNow(); 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; [[nodiscard]] Fn shareConferenceLinkCallback(); 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; std::shared_ptr _window; rpl::variable _mode; rpl::variable _fullScreenOrMaximized = false; bool _unpinnedMaximized = false; bool _rtmpFull = false; 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; std::unique_ptr _micLevelTester; style::complex_color _controlsBackgroundColor; base::Timer _hideControlsTimer; rpl::lifetime _hideControlsTimerLifetime; rpl::lifetime _peerLifetime; rpl::lifetime _lifetime; }; } // namespace Calls::Group