info_global_media_widget.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  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/global_media/info_global_media_widget.h"
  8. #include "info/global_media/info_global_media_inner_widget.h"
  9. #include "info/info_controller.h"
  10. #include "info/info_memento.h"
  11. #include "main/main_session.h"
  12. #include "ui/boxes/confirm_box.h"
  13. #include "ui/search_field_controller.h"
  14. #include "ui/widgets/menu/menu_add_action_callback.h"
  15. #include "ui/widgets/scroll_area.h"
  16. #include "ui/ui_utility.h"
  17. #include "data/data_download_manager.h"
  18. #include "data/data_user.h"
  19. #include "core/application.h"
  20. #include "lang/lang_keys.h"
  21. #include "styles/style_info.h"
  22. #include "styles/style_layers.h"
  23. #include "styles/style_menu_icons.h"
  24. namespace Info::GlobalMedia {
  25. Memento::Memento(not_null<Controller*> controller)
  26. : ContentMemento(Tag{ controller->session().user() })
  27. , _media(controller) {
  28. }
  29. Memento::Memento(not_null<UserData*> self, Storage::SharedMediaType type)
  30. : ContentMemento(Tag{ self })
  31. , _media(self, 0, type) {
  32. }
  33. Memento::~Memento() = default;
  34. Section Memento::section() const {
  35. return Section(_media.type(), Section::Type::GlobalMedia);
  36. }
  37. object_ptr<ContentWidget> Memento::createWidget(
  38. QWidget *parent,
  39. not_null<Controller*> controller,
  40. const QRect &geometry) {
  41. auto result = object_ptr<Widget>(parent, controller);
  42. result->setInternalState(geometry, this);
  43. return result;
  44. }
  45. Widget::Widget(QWidget *parent, not_null<Controller*> controller)
  46. : ContentWidget(parent, controller) {
  47. _inner = setInnerWidget(object_ptr<InnerWidget>(
  48. this,
  49. controller));
  50. _inner->setScrollHeightValue(scrollHeightValue());
  51. _inner->scrollToRequests(
  52. ) | rpl::start_with_next([this](Ui::ScrollToRequest request) {
  53. scrollTo(request);
  54. }, _inner->lifetime());
  55. }
  56. bool Widget::showInternal(not_null<ContentMemento*> memento) {
  57. if (auto globalMediaMemento = dynamic_cast<Memento*>(memento.get())) {
  58. restoreState(globalMediaMemento);
  59. return true;
  60. }
  61. return false;
  62. }
  63. void Widget::setInternalState(
  64. const QRect &geometry,
  65. not_null<Memento*> memento) {
  66. setGeometry(geometry);
  67. Ui::SendPendingMoveResizeEvents(this);
  68. restoreState(memento);
  69. }
  70. std::shared_ptr<ContentMemento> Widget::doCreateMemento() {
  71. auto result = std::make_shared<Memento>(controller());
  72. saveState(result.get());
  73. return result;
  74. }
  75. void Widget::saveState(not_null<Memento*> memento) {
  76. memento->setScrollTop(scrollTopSave());
  77. _inner->saveState(memento);
  78. }
  79. void Widget::restoreState(not_null<Memento*> memento) {
  80. _inner->restoreState(memento);
  81. scrollTopRestore(memento->scrollTop());
  82. }
  83. rpl::producer<SelectedItems> Widget::selectedListValue() const {
  84. return _inner->selectedListValue();
  85. }
  86. void Widget::selectionAction(SelectionAction action) {
  87. _inner->selectionAction(action);
  88. }
  89. void Widget::fillTopBarMenu(const Ui::Menu::MenuCallback &addAction) {
  90. const auto window = controller()->parentController();
  91. const auto deleteAll = [=] {
  92. auto &manager = Core::App().downloadManager();
  93. const auto phrase = tr::lng_downloads_delete_sure_all(tr::now);
  94. const auto added = manager.loadedHasNonCloudFile()
  95. ? QString()
  96. : tr::lng_downloads_delete_in_cloud(tr::now);
  97. const auto deleteSure = [=, &manager](Fn<void()> close) {
  98. Ui::PostponeCall(this, close);
  99. manager.deleteAll();
  100. };
  101. window->show(Ui::MakeConfirmBox({
  102. .text = phrase + (added.isEmpty() ? QString() : "\n\n" + added),
  103. .confirmed = deleteSure,
  104. .confirmText = tr::lng_box_delete(tr::now),
  105. .confirmStyle = &st::attentionBoxButton,
  106. }));
  107. };
  108. addAction(
  109. tr::lng_context_delete_all_files(tr::now),
  110. deleteAll,
  111. &st::menuIconDelete);
  112. }
  113. rpl::producer<QString> Widget::title() {
  114. return tr::lng_profile_shared_media();
  115. }
  116. std::shared_ptr<Info::Memento> Make(
  117. not_null<UserData*> self,
  118. Storage::SharedMediaType type) {
  119. return std::make_shared<Info::Memento>(
  120. std::vector<std::shared_ptr<ContentMemento>>(
  121. 1,
  122. std::make_shared<Memento>(self, type)));
  123. }
  124. } // namespace Info::GlobalMedia