From 1e3044fbf4268d38461b7303a2c6c5885bbe7e28 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Thu, 8 Jul 2021 01:03:00 +0300 Subject: [PATCH] Moved performing of Undo/Redo from Editor::Paint to Editor::Scene. --- Telegram/SourceFiles/editor/editor_paint.cpp | 16 ++++------------ Telegram/SourceFiles/editor/scene/scene.cpp | 18 ++++++++++++++++++ Telegram/SourceFiles/editor/scene/scene.h | 3 +++ 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/Telegram/SourceFiles/editor/editor_paint.cpp b/Telegram/SourceFiles/editor/editor_paint.cpp index a1bdaccf4..3f80c00f4 100644 --- a/Telegram/SourceFiles/editor/editor_paint.cpp +++ b/Telegram/SourceFiles/editor/editor_paint.cpp @@ -67,18 +67,10 @@ Paint::Paint( // Undo / Redo. controllers->undoController->performRequestChanges( ) | rpl::start_with_next([=](const Undo &command) { - const auto isUndo = (command == Undo::Undo); - - const auto filtered = _scene->items(isUndo - ? Qt::DescendingOrder - : Qt::AscendingOrder); - - auto proj = [&](const ItemPtr &i) { - return isUndo ? i->isVisible() : isItemHidden(i); - }; - const auto it = ranges::find_if(filtered, std::move(proj)); - if (it != filtered.end()) { - (*it)->setVisible(!isUndo); + if (command == Undo::Undo) { + _scene->performUndo(); + } else { + _scene->performRedo(); } _hasUndo = _scene->hasUndo(); diff --git a/Telegram/SourceFiles/editor/scene/scene.cpp b/Telegram/SourceFiles/editor/scene/scene.cpp index 53803fb10..b5378ee64 100644 --- a/Telegram/SourceFiles/editor/scene/scene.cpp +++ b/Telegram/SourceFiles/editor/scene/scene.cpp @@ -171,6 +171,24 @@ bool Scene::hasRedo() const { return ranges::any_of(_items, &NumberedItem::isUndidStatus); } +void Scene::performUndo() { + const auto filtered = items(Qt::DescendingOrder); + + const auto it = ranges::find_if(filtered, &NumberedItem::isNormalStatus); + if (it != filtered.end()) { + (*it)->setStatus(NumberedItem::Status::Undid); + } +} + +void Scene::performRedo() { + const auto filtered = items(Qt::AscendingOrder); + + const auto it = ranges::find_if(filtered, &NumberedItem::isUndidStatus); + if (it != filtered.end()) { + (*it)->setStatus(NumberedItem::Status::Normal); + } +} + Scene::~Scene() { // Prevent destroying by scene of all items. QGraphicsScene::removeItem(_canvas.get()); diff --git a/Telegram/SourceFiles/editor/scene/scene.h b/Telegram/SourceFiles/editor/scene/scene.h index 930866861..731632ebd 100644 --- a/Telegram/SourceFiles/editor/scene/scene.h +++ b/Telegram/SourceFiles/editor/scene/scene.h @@ -52,6 +52,9 @@ public: [[nodiscard]] bool hasUndo() const; [[nodiscard]] bool hasRedo() const; + + void performUndo(); + void performRedo(); protected: void mousePressEvent(QGraphicsSceneMouseEvent *event) override; void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override;