info_profile_widget.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  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. #include "info/profile/info_profile_widget.h"
  8. #include "dialogs/ui/dialogs_stories_content.h"
  9. #include "info/profile/info_profile_inner_widget.h"
  10. #include "info/profile/info_profile_members.h"
  11. #include "ui/widgets/scroll_area.h"
  12. #include "ui/ui_utility.h"
  13. #include "data/data_peer.h"
  14. #include "data/data_channel.h"
  15. #include "data/data_forum_topic.h"
  16. #include "data/data_user.h"
  17. #include "lang/lang_keys.h"
  18. #include "info/info_controller.h"
  19. namespace Info::Profile {
  20. Memento::Memento(not_null<Controller*> controller)
  21. : Memento(
  22. controller->peer(),
  23. controller->topic(),
  24. controller->migratedPeerId(),
  25. { v::null }) {
  26. }
  27. Memento::Memento(
  28. not_null<PeerData*> peer,
  29. PeerId migratedPeerId,
  30. Origin origin)
  31. : Memento(peer, nullptr, migratedPeerId, origin) {
  32. }
  33. Memento::Memento(
  34. not_null<PeerData*> peer,
  35. Data::ForumTopic *topic,
  36. PeerId migratedPeerId,
  37. Origin origin)
  38. : ContentMemento(peer, topic, migratedPeerId)
  39. , _origin(origin) {
  40. }
  41. Memento::Memento(not_null<Data::ForumTopic*> topic)
  42. : ContentMemento(topic->channel(), topic, 0) {
  43. }
  44. Section Memento::section() const {
  45. return Section(Section::Type::Profile);
  46. }
  47. object_ptr<ContentWidget> Memento::createWidget(
  48. QWidget *parent,
  49. not_null<Controller*> controller,
  50. const QRect &geometry) {
  51. auto result = object_ptr<Widget>(parent, controller, _origin);
  52. result->setInternalState(geometry, this);
  53. return result;
  54. }
  55. void Memento::setMembersState(std::unique_ptr<MembersState> state) {
  56. _membersState = std::move(state);
  57. }
  58. std::unique_ptr<MembersState> Memento::membersState() {
  59. return std::move(_membersState);
  60. }
  61. Memento::~Memento() = default;
  62. Widget::Widget(
  63. QWidget *parent,
  64. not_null<Controller*> controller,
  65. Origin origin)
  66. : ContentWidget(parent, controller) {
  67. controller->setSearchEnabledByContent(false);
  68. _inner = setInnerWidget(object_ptr<InnerWidget>(
  69. this,
  70. controller,
  71. origin));
  72. _inner->move(0, 0);
  73. _inner->scrollToRequests(
  74. ) | rpl::start_with_next([this](Ui::ScrollToRequest request) {
  75. if (request.ymin < 0) {
  76. scrollTopRestore(
  77. qMin(scrollTopSave(), request.ymax));
  78. } else {
  79. scrollTo(request);
  80. }
  81. }, lifetime());
  82. }
  83. void Widget::setInnerFocus() {
  84. _inner->setFocus();
  85. }
  86. rpl::producer<QString> Widget::title() {
  87. if (const auto topic = controller()->key().topic()) {
  88. return tr::lng_info_topic_title();
  89. }
  90. const auto peer = controller()->key().peer();
  91. if (const auto user = peer->asUser()) {
  92. return (user->isBot() && !user->isSupport())
  93. ? tr::lng_info_bot_title()
  94. : tr::lng_info_user_title();
  95. } else if (const auto channel = peer->asChannel()) {
  96. return channel->isMegagroup()
  97. ? tr::lng_info_group_title()
  98. : tr::lng_info_channel_title();
  99. } else if (peer->isChat()) {
  100. return tr::lng_info_group_title();
  101. }
  102. Unexpected("Bad peer type in Info::TitleValue()");
  103. }
  104. rpl::producer<Dialogs::Stories::Content> Widget::titleStories() {
  105. const auto peer = controller()->key().peer();
  106. if (peer && !peer->isChat()) {
  107. return Dialogs::Stories::LastForPeer(peer);
  108. }
  109. return nullptr;
  110. }
  111. bool Widget::showInternal(not_null<ContentMemento*> memento) {
  112. if (!controller()->validateMementoPeer(memento)) {
  113. return false;
  114. }
  115. if (auto profileMemento = dynamic_cast<Memento*>(memento.get())) {
  116. restoreState(profileMemento);
  117. return true;
  118. }
  119. return false;
  120. }
  121. void Widget::setInternalState(
  122. const QRect &geometry,
  123. not_null<Memento*> memento) {
  124. setGeometry(geometry);
  125. Ui::SendPendingMoveResizeEvents(this);
  126. restoreState(memento);
  127. }
  128. std::shared_ptr<ContentMemento> Widget::doCreateMemento() {
  129. auto result = std::make_shared<Memento>(controller());
  130. saveState(result.get());
  131. return result;
  132. }
  133. void Widget::saveState(not_null<Memento*> memento) {
  134. memento->setScrollTop(scrollTopSave());
  135. _inner->saveState(memento);
  136. }
  137. void Widget::restoreState(not_null<Memento*> memento) {
  138. _inner->restoreState(memento);
  139. scrollTopRestore(memento->scrollTop());
  140. }
  141. } // namespace Info::Profile