info_boosts_widget.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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/channel_statistics/boosts/info_boosts_widget.h"
  8. #include "info/channel_statistics/boosts/info_boosts_inner_widget.h"
  9. #include "info/info_controller.h"
  10. #include "info/info_memento.h"
  11. #include "lang/lang_keys.h"
  12. #include "ui/ui_utility.h"
  13. namespace Info::Boosts {
  14. Memento::Memento(not_null<Controller*> controller)
  15. : ContentMemento(controller->statisticsTag()) {
  16. }
  17. Memento::Memento(not_null<PeerData*> peer)
  18. : ContentMemento(Info::Statistics::Tag{ peer, {}, {} }) {
  19. }
  20. Memento::~Memento() = default;
  21. Section Memento::section() const {
  22. return Section(Section::Type::Boosts);
  23. }
  24. void Memento::setState(SavedState state) {
  25. _state = std::move(state);
  26. }
  27. Memento::SavedState Memento::state() {
  28. return base::take(_state);
  29. }
  30. object_ptr<ContentWidget> Memento::createWidget(
  31. QWidget *parent,
  32. not_null<Controller*> controller,
  33. const QRect &geometry) {
  34. auto result = object_ptr<Widget>(parent, controller);
  35. result->setInternalState(geometry, this);
  36. return result;
  37. }
  38. Widget::Widget(
  39. QWidget *parent,
  40. not_null<Controller*> controller)
  41. : ContentWidget(parent, controller)
  42. , _inner(setInnerWidget(
  43. object_ptr<InnerWidget>(
  44. this,
  45. controller,
  46. controller->statisticsTag().peer))) {
  47. _inner->showRequests(
  48. ) | rpl::start_with_next([=](InnerWidget::ShowRequest request) {
  49. }, _inner->lifetime());
  50. _inner->scrollToRequests(
  51. ) | rpl::start_with_next([=](const Ui::ScrollToRequest &request) {
  52. scrollTo(request);
  53. }, _inner->lifetime());
  54. }
  55. not_null<PeerData*> Widget::peer() const {
  56. return _inner->peer();
  57. }
  58. bool Widget::showInternal(not_null<ContentMemento*> memento) {
  59. return (memento->statisticsTag().peer == peer());
  60. }
  61. rpl::producer<QString> Widget::title() {
  62. return tr::lng_boosts_title();
  63. }
  64. void Widget::setInternalState(
  65. const QRect &geometry,
  66. not_null<Memento*> memento) {
  67. setGeometry(geometry);
  68. Ui::SendPendingMoveResizeEvents(this);
  69. restoreState(memento);
  70. }
  71. rpl::producer<bool> Widget::desiredShadowVisibility() const {
  72. return rpl::single<bool>(true);
  73. }
  74. void Widget::showFinished() {
  75. _inner->showFinished();
  76. }
  77. std::shared_ptr<ContentMemento> Widget::doCreateMemento() {
  78. auto result = std::make_shared<Memento>(controller());
  79. saveState(result.get());
  80. return result;
  81. }
  82. void Widget::saveState(not_null<Memento*> memento) {
  83. memento->setScrollTop(scrollTopSave());
  84. _inner->saveState(memento);
  85. }
  86. void Widget::restoreState(not_null<Memento*> memento) {
  87. _inner->restoreState(memento);
  88. scrollTopRestore(memento->scrollTop());
  89. }
  90. std::shared_ptr<Info::Memento> Make(not_null<PeerData*> peer) {
  91. return std::make_shared<Info::Memento>(
  92. std::vector<std::shared_ptr<ContentMemento>>(
  93. 1,
  94. std::make_shared<Memento>(peer)));
  95. }
  96. } // namespace Info::Boosts