calls_group_members.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. /*
  2. This file is part of Telegram Desktop,
  3. the official desktop application for the Telegram messaging service.
  4. For license and copyright information please follow this link:
  5. https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
  6. */
  7. #pragma once
  8. #include "boxes/peer_list_box.h"
  9. namespace Ui {
  10. class RpWidget;
  11. class ScrollArea;
  12. class VerticalLayout;
  13. class SettingsButton;
  14. namespace GL {
  15. enum class Backend;
  16. } // namespace GL
  17. } // namespace Ui
  18. namespace Data {
  19. class GroupCall;
  20. } // namespace Data
  21. namespace Calls {
  22. class GroupCall;
  23. } // namespace Calls
  24. namespace Calls::Group {
  25. class Viewport;
  26. class MembersRow;
  27. struct VolumeRequest;
  28. struct MuteRequest;
  29. enum class PanelMode;
  30. class Members final
  31. : public Ui::RpWidget
  32. , private PeerListContentDelegate {
  33. public:
  34. Members(
  35. not_null<QWidget*> parent,
  36. not_null<GroupCall*> call,
  37. PanelMode mode,
  38. Ui::GL::Backend backend);
  39. ~Members();
  40. [[nodiscard]] not_null<Viewport*> viewport() const;
  41. [[nodiscard]] int desiredHeight() const;
  42. [[nodiscard]] rpl::producer<int> desiredHeightValue() const override;
  43. [[nodiscard]] rpl::producer<int> fullCountValue() const;
  44. [[nodiscard]] auto toggleMuteRequests() const
  45. -> rpl::producer<Group::MuteRequest>;
  46. [[nodiscard]] auto changeVolumeRequests() const
  47. -> rpl::producer<Group::VolumeRequest>;
  48. [[nodiscard]] auto kickParticipantRequests() const
  49. -> rpl::producer<not_null<PeerData*>>;
  50. [[nodiscard]] rpl::producer<> addMembersRequests() const {
  51. return _addMemberRequests.events();
  52. }
  53. [[nodiscard]] MembersRow *lookupRow(not_null<PeerData*> peer) const;
  54. [[nodiscard]] not_null<MembersRow*> rtmpFakeRow(
  55. not_null<PeerData*> peer) const;
  56. void setMode(PanelMode mode);
  57. [[nodiscard]] QRect getInnerGeometry() const;
  58. private:
  59. class Controller;
  60. struct VideoTile;
  61. using ListWidget = PeerListContent;
  62. void resizeEvent(QResizeEvent *e) override;
  63. // PeerListContentDelegate interface.
  64. void peerListSetTitle(rpl::producer<QString> title) override;
  65. void peerListSetAdditionalTitle(rpl::producer<QString> title) override;
  66. void peerListSetHideEmpty(bool hide) override;
  67. bool peerListIsRowChecked(not_null<PeerListRow*> row) override;
  68. int peerListSelectedRowsCount() override;
  69. void peerListScrollToTop() override;
  70. void peerListAddSelectedPeerInBunch(
  71. not_null<PeerData*> peer) override;
  72. void peerListAddSelectedRowInBunch(
  73. not_null<PeerListRow*> row) override;
  74. void peerListFinishSelectedRowsBunch() override;
  75. void peerListSetDescription(
  76. object_ptr<Ui::FlatLabel> description) override;
  77. std::shared_ptr<Main::SessionShow> peerListUiShow() override;
  78. void setupAddMember(not_null<GroupCall*> call);
  79. void resizeToList();
  80. void setupList();
  81. void setupFakeRoundCorners();
  82. void trackViewportGeometry();
  83. void updateControlsGeometry();
  84. const not_null<GroupCall*> _call;
  85. rpl::variable<PanelMode> _mode = PanelMode();
  86. object_ptr<Ui::ScrollArea> _scroll;
  87. std::unique_ptr<Controller> _listController;
  88. not_null<Ui::VerticalLayout*> _layout;
  89. const not_null<Ui::RpWidget*> _videoWrap;
  90. std::unique_ptr<Viewport> _viewport;
  91. rpl::variable<Ui::RpWidget*> _addMemberButton = nullptr;
  92. RpWidget *_topSkip = nullptr;
  93. RpWidget *_bottomSkip = nullptr;
  94. ListWidget *_list = nullptr;
  95. rpl::event_stream<> _addMemberRequests;
  96. mutable std::unique_ptr<MembersRow> _rtmpFakeRow;
  97. rpl::variable<bool> _canInviteByLink;
  98. rpl::variable<bool> _canAddMembers;
  99. };
  100. } // namespace Calls