Added ability to save and restore items state in photo editor.

This commit is contained in:
23rd 2021-07-07 21:14:50 +03:00
parent d2d97a3e47
commit 78b25c694e
10 changed files with 89 additions and 5 deletions

View File

@ -161,6 +161,7 @@ void Paint::applyTransform(QRect geometry, int angle, bool flipped) {
} }
std::shared_ptr<Scene> Paint::saveScene() const { std::shared_ptr<Scene> Paint::saveScene() const {
_scene->saveItemsState(SaveState::Save);
_scene->clearSelection(); _scene->clearSelection();
return _scene->items().empty() return _scene->items().empty()
? nullptr ? nullptr
@ -169,7 +170,12 @@ std::shared_ptr<Scene> Paint::saveScene() const {
: _scene; : _scene;
} }
void Paint::restoreScene() {
_scene->restoreItemsState(SaveState::Save);
}
void Paint::cancel() { void Paint::cancel() {
_scene->restoreItemsState(SaveState::Keep);
_scene->clearSelection(); _scene->clearSelection();
_scene->cancelDrawing(); _scene->cancelDrawing();
@ -194,6 +200,7 @@ void Paint::cancel() {
} }
void Paint::keepResult() { void Paint::keepResult() {
_scene->saveItemsState(SaveState::Keep);
_scene->clearSelection(); _scene->clearSelection();
_scene->cancelDrawing(); _scene->cancelDrawing();

View File

@ -31,6 +31,7 @@ public:
std::shared_ptr<Controllers> controllers); std::shared_ptr<Controllers> controllers);
[[nodiscard]] std::shared_ptr<Scene> saveScene() const; [[nodiscard]] std::shared_ptr<Scene> saveScene() const;
void restoreScene();
void applyTransform(QRect geometry, int angle, bool flipped); void applyTransform(QRect geometry, int angle, bool flipped);
void applyBrush(const Brush &brush); void applyBrush(const Brush &brush);

View File

@ -136,6 +136,10 @@ PhotoEditor::PhotoEditor(
.action = PhotoEditorMode::Action::Save, .action = PhotoEditorMode::Action::Save,
}; };
} else if (mode == PhotoEditorMode::Mode::Transform) { } else if (mode == PhotoEditorMode::Mode::Transform) {
_mode = PhotoEditorMode{
.mode = PhotoEditorMode::Mode::Out,
.action = PhotoEditorMode::Action::Save,
};
save(); save();
} }
}, lifetime()); }, lifetime());
@ -149,6 +153,10 @@ PhotoEditor::PhotoEditor(
.action = PhotoEditorMode::Action::Discard, .action = PhotoEditorMode::Action::Discard,
}; };
} else if (mode == PhotoEditorMode::Mode::Transform) { } else if (mode == PhotoEditorMode::Mode::Transform) {
_mode = PhotoEditorMode{
.mode = PhotoEditorMode::Mode::Out,
.action = PhotoEditorMode::Action::Discard,
};
_cancel.fire({}); _cancel.fire({});
} }
}, lifetime()); }, lifetime());

View File

@ -113,6 +113,12 @@ void PhotoEditorContent::save(PhotoModifications &modifications) {
} }
void PhotoEditorContent::applyMode(const PhotoEditorMode &mode) { void PhotoEditorContent::applyMode(const PhotoEditorMode &mode) {
if (mode.mode == PhotoEditorMode::Mode::Out) {
if (mode.action == PhotoEditorMode::Action::Discard) {
_paint->restoreScene();
}
return;
}
const auto isTransform = (mode.mode == PhotoEditorMode::Mode::Transform); const auto isTransform = (mode.mode == PhotoEditorMode::Mode::Transform);
_crop->setVisible(isTransform); _crop->setVisible(isTransform);
@ -139,9 +145,9 @@ bool PhotoEditorContent::handleKeyPress(not_null<QKeyEvent*> e) const {
void PhotoEditorContent::setupDragArea() { void PhotoEditorContent::setupDragArea() {
auto dragEnterFilter = [=](const QMimeData *data) { auto dragEnterFilter = [=](const QMimeData *data) {
return (_mode.mode == PhotoEditorMode::Mode::Transform) return (_mode.mode == PhotoEditorMode::Mode::Paint)
? false ? Storage::ValidatePhotoEditorMediaDragData(data)
: Storage::ValidatePhotoEditorMediaDragData(data); : false;
}; };
const auto areas = DragArea::SetupDragAreaToContainer( const auto areas = DragArea::SetupDragAreaToContainer(

View File

@ -267,6 +267,9 @@ PhotoEditorControls::PhotoEditorControls(
_mode.changes( _mode.changes(
) | rpl::start_with_next([=](const PhotoEditorMode &mode) { ) | rpl::start_with_next([=](const PhotoEditorMode &mode) {
if (mode.mode == PhotoEditorMode::Mode::Out) {
return;
}
const auto animated = (_paintBottomButtons->isVisible() const auto animated = (_paintBottomButtons->isVisible()
== _transformButtons->isVisible()) == _transformButtons->isVisible())
? anim::type::instant ? anim::type::instant

View File

@ -15,6 +15,7 @@ struct PhotoEditorMode {
enum class Mode { enum class Mode {
Transform, Transform,
Paint, Paint,
Out,
} mode = Mode::Transform; } mode = Mode::Transform;
enum class Action { enum class Action {
@ -29,4 +30,9 @@ struct Brush {
QColor color; QColor color;
}; };
enum class SaveState {
Save,
Keep,
};
} // namespace Editor } // namespace Editor

View File

@ -147,6 +147,22 @@ void Scene::updateZoom(float64 zoom) {
} }
} }
void Scene::saveItemsState(SaveState state) {
for (const auto &item : items()) {
if (item->type() >= ItemBase::Type) {
static_cast<ItemBase*>(item.get())->save(state);
}
}
}
void Scene::restoreItemsState(SaveState state) {
for (const auto &item : items()) {
if (item->type() >= ItemBase::Type) {
static_cast<ItemBase*>(item.get())->restore(state);
}
}
}
Scene::~Scene() { Scene::~Scene() {
// Prevent destroying by scene of all items. // Prevent destroying by scene of all items.
QGraphicsScene::removeItem(_canvas.get()); QGraphicsScene::removeItem(_canvas.get());

View File

@ -8,6 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#pragma once #pragma once
#include <base/unique_qptr.h> #include <base/unique_qptr.h>
#include <editor/photo_editor_inner_common.h>
#include <QGraphicsScene> #include <QGraphicsScene>
@ -45,6 +46,9 @@ public:
void updateZoom(float64 zoom); void updateZoom(float64 zoom);
void cancelDrawing(); void cancelDrawing();
void saveItemsState(SaveState state);
void restoreItemsState(SaveState state);
protected: protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event) override; void mousePressEvent(QGraphicsSceneMouseEvent *event) override;
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override; void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override;

View File

@ -383,4 +383,27 @@ void ItemBase::applyData(const Data &data) {
update(); update();
} }
void ItemBase::save(SaveState state) {
if (state == SaveState::Keep) {
const auto z = zValue();
_keeped = {
.data = generateData(),
.zValue = z,
.visible = isVisible(),
};
} else if (state == SaveState::Save) {
_saved = _keeped;
}
}
void ItemBase::restore(SaveState state) {
const auto &saved = (state == SaveState::Keep) ? _keeped : _saved;
if (!saved.zValue) {
return;
}
applyData(saved.data);
setZValue(saved.zValue);
setVisible(saved.visible);
}
} // namespace Editor } // namespace Editor

View File

@ -8,6 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#pragma once #pragma once
#include "base/unique_qptr.h" #include "base/unique_qptr.h"
#include "editor/photo_editor_inner_common.h"
#include <QGraphicsItem> #include <QGraphicsItem>
@ -60,6 +61,9 @@ public:
void setFlip(bool value); void setFlip(bool value);
void updateZoom(float64 zoom); void updateZoom(float64 zoom);
void save(SaveState state);
void restore(SaveState state);
protected: protected:
enum HandleType { enum HandleType {
None, None,
@ -113,8 +117,14 @@ private:
base::unique_qptr<Ui::PopupMenu> _menu; base::unique_qptr<Ui::PopupMenu> _menu;
struct { struct {
int min = 0.; Data data;
int max = 0.; float64 zValue = 0.;
bool visible = true;
} _saved, _keeped;
struct {
int min = 0;
int max = 0;
} _sizeLimits; } _sizeLimits;
float64 _scaledHandleSize = 1.0; float64 _scaledHandleSize = 1.0;
QMarginsF _scaledInnerMargins; QMarginsF _scaledInnerMargins;