info_polls_results_widget.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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/polls/info_polls_results_widget.h"
  8. #include "info/polls/info_polls_results_inner_widget.h"
  9. #include "boxes/peer_list_box.h"
  10. #include "lang/lang_keys.h"
  11. #include "data/data_poll.h"
  12. #include "ui/ui_utility.h"
  13. namespace Info::Polls {
  14. Memento::Memento(not_null<PollData*> poll, FullMsgId contextId)
  15. : ContentMemento(poll, contextId) {
  16. }
  17. Section Memento::section() const {
  18. return Section(Section::Type::PollResults);
  19. }
  20. void Memento::setListStates(base::flat_map<
  21. QByteArray,
  22. std::unique_ptr<PeerListState>> states) {
  23. _listStates = std::move(states);
  24. }
  25. auto Memento::listStates()
  26. -> base::flat_map<QByteArray, std::unique_ptr<PeerListState>> {
  27. return std::move(_listStates);
  28. }
  29. object_ptr<ContentWidget> Memento::createWidget(
  30. QWidget *parent,
  31. not_null<Controller*> controller,
  32. const QRect &geometry) {
  33. auto result = object_ptr<Widget>(parent, controller);
  34. result->setInternalState(geometry, this);
  35. return result;
  36. }
  37. Memento::~Memento() = default;
  38. Widget::Widget(QWidget *parent, not_null<Controller*> controller)
  39. : ContentWidget(parent, controller)
  40. , _inner(setInnerWidget(
  41. object_ptr<InnerWidget>(
  42. this,
  43. controller,
  44. controller->poll(),
  45. controller->pollContextId()))) {
  46. _inner->showPeerInfoRequests(
  47. ) | rpl::start_with_next([=](not_null<PeerData*> peer) {
  48. controller->showPeerInfo(peer);
  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<PollData*> Widget::poll() const {
  56. return _inner->poll();
  57. }
  58. FullMsgId Widget::contextId() const {
  59. return _inner->contextId();
  60. }
  61. bool Widget::showInternal(not_null<ContentMemento*> memento) {
  62. //if (const auto myMemento = dynamic_cast<Memento*>(memento.get())) {
  63. // Assert(myMemento->self() == self());
  64. // if (_inner->showInternal(myMemento)) {
  65. // return true;
  66. // }
  67. //}
  68. return false;
  69. }
  70. void Widget::setInternalState(
  71. const QRect &geometry,
  72. not_null<Memento*> memento) {
  73. setGeometry(geometry);
  74. Ui::SendPendingMoveResizeEvents(this);
  75. restoreState(memento);
  76. }
  77. rpl::producer<QString> Widget::title() {
  78. return poll()->quiz()
  79. ? tr::lng_polls_quiz_results_title()
  80. : tr::lng_polls_poll_results_title();
  81. }
  82. std::shared_ptr<ContentMemento> Widget::doCreateMemento() {
  83. auto result = std::make_shared<Memento>(poll(), contextId());
  84. saveState(result.get());
  85. return result;
  86. }
  87. void Widget::saveState(not_null<Memento*> memento) {
  88. memento->setScrollTop(scrollTopSave());
  89. _inner->saveState(memento);
  90. }
  91. void Widget::restoreState(not_null<Memento*> memento) {
  92. _inner->restoreState(memento);
  93. scrollTopRestore(memento->scrollTop());
  94. }
  95. } // namespace Info::Polls