mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 06:33:57 +02:00
Fixed undo and redo paint actions.
This commit is contained in:
parent
a3e54fcd7c
commit
690a7d1608
7 changed files with 57 additions and 23 deletions
|
@ -36,10 +36,6 @@ std::shared_ptr<Scene> EnsureScene(
|
||||||
return mods.paint;
|
return mods.paint;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Filter(QGraphicsItem *i) {
|
|
||||||
return i->type() != ItemCanvas::Type;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
Paint::Paint(
|
Paint::Paint(
|
||||||
|
@ -72,7 +68,7 @@ Paint::Paint(
|
||||||
) | rpl::start_with_next([=](const Undo &command) {
|
) | rpl::start_with_next([=](const Undo &command) {
|
||||||
const auto isUndo = (command == Undo::Undo);
|
const auto isUndo = (command == Undo::Undo);
|
||||||
|
|
||||||
const auto filtered = filteredItems(isUndo
|
const auto filtered = _scene->items(isUndo
|
||||||
? Qt::DescendingOrder
|
? Qt::DescendingOrder
|
||||||
: Qt::AscendingOrder);
|
: Qt::AscendingOrder);
|
||||||
|
|
||||||
|
@ -150,7 +146,7 @@ std::shared_ptr<Scene> Paint::saveScene() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Paint::cancel() {
|
void Paint::cancel() {
|
||||||
const auto filtered = filteredItems(Qt::AscendingOrder);
|
const auto filtered = _scene->items(Qt::AscendingOrder);
|
||||||
if (filtered.empty()) {
|
if (filtered.empty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -184,17 +180,17 @@ void Paint::keepResult() {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Paint::hasUndo() const {
|
bool Paint::hasUndo() const {
|
||||||
return ranges::any_of(filteredItems(), &QGraphicsItem::isVisible);
|
return ranges::any_of(_scene->items(), &QGraphicsItem::isVisible);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Paint::hasRedo() const {
|
bool Paint::hasRedo() const {
|
||||||
return ranges::any_of(
|
return ranges::any_of(
|
||||||
filteredItems(),
|
_scene->items(),
|
||||||
[=](QGraphicsItem *i) { return isItemHidden(i); });
|
[=](QGraphicsItem *i) { return isItemHidden(i); });
|
||||||
}
|
}
|
||||||
|
|
||||||
void Paint::clearRedoList() {
|
void Paint::clearRedoList() {
|
||||||
const auto items = filteredItems(Qt::AscendingOrder);
|
const auto items = _scene->items(Qt::AscendingOrder);
|
||||||
auto &&filtered = ranges::views::all(
|
auto &&filtered = ranges::views::all(
|
||||||
items
|
items
|
||||||
) | ranges::views::filter(
|
) | ranges::views::filter(
|
||||||
|
@ -222,13 +218,6 @@ void Paint::updateUndoState() {
|
||||||
_hasRedo = hasRedo();
|
_hasRedo = hasRedo();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<QGraphicsItem*> Paint::filteredItems(Qt::SortOrder order) const {
|
|
||||||
const auto items = _scene->items(order);
|
|
||||||
return ranges::views::all(
|
|
||||||
items
|
|
||||||
) | ranges::views::filter(Filter) | ranges::to_vector;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Paint::applyBrush(const Brush &brush) {
|
void Paint::applyBrush(const Brush &brush) {
|
||||||
_scene->applyBrush(
|
_scene->applyBrush(
|
||||||
brush.color,
|
brush.color,
|
||||||
|
|
|
@ -50,9 +50,6 @@ private:
|
||||||
bool isItemToRemove(not_null<QGraphicsItem*> item) const;
|
bool isItemToRemove(not_null<QGraphicsItem*> item) const;
|
||||||
bool isItemHidden(not_null<QGraphicsItem*> item) const;
|
bool isItemHidden(not_null<QGraphicsItem*> item) const;
|
||||||
|
|
||||||
std::vector<QGraphicsItem*> filteredItems(
|
|
||||||
Qt::SortOrder order = Qt::DescendingOrder) const;
|
|
||||||
|
|
||||||
const std::shared_ptr<float64> _lastZ;
|
const std::shared_ptr<float64> _lastZ;
|
||||||
const std::shared_ptr<Scene> _scene;
|
const std::shared_ptr<Scene> _scene;
|
||||||
const base::unique_qptr<QGraphicsView> _view;
|
const base::unique_qptr<QGraphicsView> _view;
|
||||||
|
|
|
@ -22,7 +22,7 @@ Scene::Scene(const QRectF &rect)
|
||||||
, _canvas(new ItemCanvas) {
|
, _canvas(new ItemCanvas) {
|
||||||
clearPath();
|
clearPath();
|
||||||
|
|
||||||
addItem(_canvas);
|
QGraphicsScene::addItem(_canvas);
|
||||||
|
|
||||||
_canvas->paintRequest(
|
_canvas->paintRequest(
|
||||||
) | rpl::start_with_next([=](not_null<QPainter*> p) {
|
) | rpl::start_with_next([=](not_null<QPainter*> p) {
|
||||||
|
@ -33,6 +33,11 @@ Scene::Scene(const QRectF &rect)
|
||||||
}, _lifetime);
|
}, _lifetime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Scene::addItem(not_null<NumberedItem*> item) {
|
||||||
|
item->setNumber(_itemNumber++);
|
||||||
|
QGraphicsScene::addItem(item);
|
||||||
|
}
|
||||||
|
|
||||||
void Scene::mousePressEvent(QGraphicsSceneMouseEvent *event) {
|
void Scene::mousePressEvent(QGraphicsSceneMouseEvent *event) {
|
||||||
QGraphicsScene::mousePressEvent(event);
|
QGraphicsScene::mousePressEvent(event);
|
||||||
if (event->isAccepted() || (event->button() == Qt::RightButton)) {
|
if (event->isAccepted() || (event->button() == Qt::RightButton)) {
|
||||||
|
@ -93,6 +98,25 @@ rpl::producer<> Scene::mousePresses() const {
|
||||||
return _mousePresses.events();
|
return _mousePresses.events();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<QGraphicsItem*> Scene::items(Qt::SortOrder order) const {
|
||||||
|
using Item = QGraphicsItem;
|
||||||
|
auto rawItems = QGraphicsScene::items();
|
||||||
|
|
||||||
|
auto filteredItems = ranges::views::all(
|
||||||
|
rawItems
|
||||||
|
) | ranges::views::filter([](Item *i) {
|
||||||
|
return i->type() != ItemCanvas::Type;
|
||||||
|
}) | ranges::to_vector;
|
||||||
|
|
||||||
|
ranges::sort(filteredItems, [&](not_null<Item*> a, not_null<Item*> b) {
|
||||||
|
const auto numA = qgraphicsitem_cast<NumberedItem*>(a)->number();
|
||||||
|
const auto numB = qgraphicsitem_cast<NumberedItem*>(b)->number();
|
||||||
|
return (order == Qt::AscendingOrder) ? (numA < numB) : (numA > numB);
|
||||||
|
});
|
||||||
|
|
||||||
|
return filteredItems;
|
||||||
|
}
|
||||||
|
|
||||||
Scene::~Scene() {
|
Scene::~Scene() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,7 @@ class RpWidget;
|
||||||
namespace Editor {
|
namespace Editor {
|
||||||
|
|
||||||
class ItemCanvas;
|
class ItemCanvas;
|
||||||
|
class NumberedItem;
|
||||||
|
|
||||||
class Scene final : public QGraphicsScene {
|
class Scene final : public QGraphicsScene {
|
||||||
public:
|
public:
|
||||||
|
@ -29,6 +30,9 @@ public:
|
||||||
~Scene();
|
~Scene();
|
||||||
void applyBrush(const QColor &color, float size);
|
void applyBrush(const QColor &color, float size);
|
||||||
|
|
||||||
|
[[nodiscard]] std::vector<QGraphicsItem*> items(
|
||||||
|
Qt::SortOrder order = Qt::DescendingOrder) const;
|
||||||
|
void addItem(not_null<NumberedItem*> item);
|
||||||
[[nodiscard]] rpl::producer<> mousePresses() const;
|
[[nodiscard]] rpl::producer<> mousePresses() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -46,6 +50,8 @@ private:
|
||||||
|
|
||||||
float64 _lastLineZ = 0.;
|
float64 _lastLineZ = 0.;
|
||||||
|
|
||||||
|
int _itemNumber = 0;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
float size = 1.;
|
float size = 1.;
|
||||||
QColor color;
|
QColor color;
|
||||||
|
|
|
@ -28,6 +28,14 @@ QPen PenStyled(QPen pen, Qt::PenStyle style) {
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
int NumberedItem::number() const {
|
||||||
|
return _number;
|
||||||
|
}
|
||||||
|
|
||||||
|
void NumberedItem::setNumber(int number) {
|
||||||
|
_number = number;
|
||||||
|
}
|
||||||
|
|
||||||
ItemBase::ItemBase(std::shared_ptr<float64> zPtr, int size, int x, int y)
|
ItemBase::ItemBase(std::shared_ptr<float64> zPtr, int size, int x, int y)
|
||||||
: _lastZ(zPtr)
|
: _lastZ(zPtr)
|
||||||
, _handleSize(st::photoEditorItemHandleSize)
|
, _handleSize(st::photoEditorItemHandleSize)
|
||||||
|
|
|
@ -15,7 +15,17 @@ class QStyleOptionGraphicsItem;
|
||||||
|
|
||||||
namespace Editor {
|
namespace Editor {
|
||||||
|
|
||||||
class ItemBase : public QGraphicsItem {
|
class NumberedItem : public QGraphicsItem {
|
||||||
|
public:
|
||||||
|
using QGraphicsItem::QGraphicsItem;
|
||||||
|
|
||||||
|
void setNumber(int number);
|
||||||
|
[[nodiscard]] int number() const;
|
||||||
|
private:
|
||||||
|
int _number = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
class ItemBase : public NumberedItem {
|
||||||
public:
|
public:
|
||||||
enum { Type = UserType + 1 };
|
enum { Type = UserType + 1 };
|
||||||
|
|
||||||
|
|
|
@ -7,11 +7,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <QGraphicsItem>
|
#include "editor/scene_item_base.h"
|
||||||
|
|
||||||
namespace Editor {
|
namespace Editor {
|
||||||
|
|
||||||
class ItemLine : public QGraphicsItem {
|
class ItemLine : public NumberedItem {
|
||||||
public:
|
public:
|
||||||
enum { Type = UserType + 5 };
|
enum { Type = UserType + 5 };
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue