info_common_groups_widget.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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/common_groups/info_common_groups_widget.h"
  8. #include "info/common_groups/info_common_groups_inner_widget.h"
  9. #include "info/info_controller.h"
  10. #include "ui/widgets/scroll_area.h"
  11. #include "ui/ui_utility.h"
  12. #include "lang/lang_keys.h"
  13. #include "data/data_user.h"
  14. #include "data/data_session.h"
  15. #include "main/main_session.h"
  16. #include "styles/style_info.h"
  17. namespace Info {
  18. namespace CommonGroups {
  19. Memento::Memento(not_null<UserData*> user)
  20. : ContentMemento(user, nullptr, PeerId()) {
  21. }
  22. Section Memento::section() const {
  23. return Section(Section::Type::CommonGroups);
  24. }
  25. not_null<UserData*> Memento::user() const {
  26. return peer()->asUser();
  27. }
  28. object_ptr<ContentWidget> Memento::createWidget(
  29. QWidget *parent,
  30. not_null<Controller*> controller,
  31. const QRect &geometry) {
  32. auto result = object_ptr<Widget>(parent, controller, user());
  33. result->setInternalState(geometry, this);
  34. return result;
  35. }
  36. void Memento::setListState(std::unique_ptr<PeerListState> state) {
  37. _listState = std::move(state);
  38. }
  39. std::unique_ptr<PeerListState> Memento::listState() {
  40. return std::move(_listState);
  41. }
  42. Memento::~Memento() = default;
  43. Widget::Widget(
  44. QWidget *parent,
  45. not_null<Controller*> controller,
  46. not_null<UserData*> user)
  47. : ContentWidget(parent, controller) {
  48. _inner = setInnerWidget(object_ptr<InnerWidget>(
  49. this,
  50. controller,
  51. user));
  52. }
  53. rpl::producer<QString> Widget::title() {
  54. return tr::lng_profile_common_groups_section();
  55. }
  56. not_null<UserData*> Widget::user() const {
  57. return _inner->user();
  58. }
  59. bool Widget::showInternal(not_null<ContentMemento*> memento) {
  60. if (!controller()->validateMementoPeer(memento)) {
  61. return false;
  62. }
  63. if (auto groupsMemento = dynamic_cast<Memento*>(memento.get())) {
  64. if (groupsMemento->user() == user()) {
  65. restoreState(groupsMemento);
  66. return true;
  67. }
  68. }
  69. return false;
  70. }
  71. void Widget::setInternalState(
  72. const QRect &geometry,
  73. not_null<Memento*> memento) {
  74. setGeometry(geometry);
  75. Ui::SendPendingMoveResizeEvents(this);
  76. restoreState(memento);
  77. }
  78. std::shared_ptr<ContentMemento> Widget::doCreateMemento() {
  79. auto result = std::make_shared<Memento>(user());
  80. saveState(result.get());
  81. return result;
  82. }
  83. void Widget::saveState(not_null<Memento*> memento) {
  84. memento->setScrollTop(scrollTopSave());
  85. _inner->saveState(memento);
  86. }
  87. void Widget::restoreState(not_null<Memento*> memento) {
  88. _inner->restoreState(memento);
  89. scrollTopRestore(memento->scrollTop());
  90. }
  91. } // namespace CommonGroups
  92. } // namespace Info