From c312607ff8b2ebde176055b8b1f9c50ae847ce3c Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Tue, 23 Feb 2021 13:31:48 +0300 Subject: [PATCH] Added stickers panel controller for photo editor. --- Telegram/CMakeLists.txt | 2 + .../editor/stickers_panel_controller.cpp | 75 +++++++++++++++++++ .../editor/stickers_panel_controller.h | 46 ++++++++++++ 3 files changed, 123 insertions(+) create mode 100644 Telegram/SourceFiles/editor/stickers_panel_controller.cpp create mode 100644 Telegram/SourceFiles/editor/stickers_panel_controller.h diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt index 76e7f3111..40d753436 100644 --- a/Telegram/CMakeLists.txt +++ b/Telegram/CMakeLists.txt @@ -524,6 +524,8 @@ PRIVATE editor/photo_editor_layer_widget.h editor/scene_item_base.cpp editor/scene_item_base.h + editor/stickers_panel_controller.cpp + editor/stickers_panel_controller.h editor/undo_controller.cpp editor/undo_controller.h export/export_manager.cpp diff --git a/Telegram/SourceFiles/editor/stickers_panel_controller.cpp b/Telegram/SourceFiles/editor/stickers_panel_controller.cpp new file mode 100644 index 000000000..863ec837f --- /dev/null +++ b/Telegram/SourceFiles/editor/stickers_panel_controller.cpp @@ -0,0 +1,75 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#include "editor/stickers_panel_controller.h" + +#include "chat_helpers/tabbed_panel.h" +#include "chat_helpers/tabbed_selector.h" +#include "styles/style_chat_helpers.h" + +namespace Editor { + +StickersPanelController::StickersPanelController( + not_null panelContainer, + not_null controller) +: _stickersPanel( + base::make_unique_q( + panelContainer, + controller, + object_ptr( + nullptr, + controller, + ChatHelpers::TabbedSelector::Mode::Full))) { + _stickersPanel->setDesiredHeightValues( + 1., + st::emojiPanMinHeight / 2, + st::emojiPanMinHeight); + _stickersPanel->hide(); +} + +auto StickersPanelController::stickerChosen() const +-> rpl::producer> { + return _stickersPanel->selector()->fileChosen( + ) | rpl::map([](const ChatHelpers::TabbedSelector::FileChosen &data) { + return data.document; + }); +} + +rpl::producer StickersPanelController::panelShown() const { + return _stickersPanel->shownValue(); +} + +void StickersPanelController::setShowRequestChanges( + rpl::producer> &&showRequest) { + std::move( + showRequest + ) | rpl::start_with_next([=](std::optional show) { + if (!show) { + _stickersPanel->toggleAnimated(); + _stickersPanel->raise(); + return; + } + if (*show) { + _stickersPanel->showAnimated(); + } else { + _stickersPanel->toggleAnimated(); + } + }, _stickersPanel->lifetime()); +} + +void StickersPanelController::setMoveRequestChanges( + rpl::producer &&moveRequest) { + std::move( + moveRequest + ) | rpl::start_with_next([=](const QPoint &point) { + _stickersPanel->moveBottomRight( + point.y(), + point.x() + _stickersPanel->width() / 2); + }, _stickersPanel->lifetime()); +} + +} // namespace Editor diff --git a/Telegram/SourceFiles/editor/stickers_panel_controller.h b/Telegram/SourceFiles/editor/stickers_panel_controller.h new file mode 100644 index 000000000..86ae519a4 --- /dev/null +++ b/Telegram/SourceFiles/editor/stickers_panel_controller.h @@ -0,0 +1,46 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#pragma once + +#include "base/unique_qptr.h" + +namespace ChatHelpers { +class TabbedPanel; +} // namespace ChatHelpers + +namespace Ui { +class RpWidget; +} // namespace Ui + +namespace Window { +class SessionController; +} // namespace Window + +namespace Editor { + +class StickersPanelController final { +public: + StickersPanelController( + not_null panelContainer, + not_null controller); + + [[nodiscard]] auto stickerChosen() const + -> rpl::producer>; + [[nodiscard]] rpl::producer panelShown() const; + + void setShowRequestChanges( + rpl::producer> &&showRequest); + // Middle x and plain y position. + void setMoveRequestChanges(rpl::producer &&moveRequest); + +private: + const base::unique_qptr _stickersPanel; + +}; + +} // namespace Editor