From 98c3298805d9e148f5496e25bf08803e1ce6622a Mon Sep 17 00:00:00 2001 From: garakmon Date: Fri, 31 Jul 2020 19:16:16 -0400 Subject: [PATCH] add edit command for duplicating events - also select next event when performing redo actions on deletion --- include/core/editcommands.h | 29 +++++++++++++- src/core/editcommands.cpp | 77 ++++++++++++++++++++++++++++++++++++- src/editor.cpp | 16 +++----- src/mainwindow.cpp | 12 ++---- 4 files changed, 112 insertions(+), 22 deletions(-) diff --git a/include/core/editcommands.h b/include/core/editcommands.h index ab53817d..cb79ff2b 100644 --- a/include/core/editcommands.h +++ b/include/core/editcommands.h @@ -16,12 +16,16 @@ enum CommandId { ID_BucketFillMetatile, // - done ID_MagicFillMetatile, // - done ID_ShiftMetatiles, // - done + ID_PaintCollision, // - + ID_BucketFillCollision, // - + ID_MagicFillCollision, // - ID_ResizeMap, // - done ID_PaintBorder, // - done ID_EventMove, // - done ID_EventShift, // - done ID_EventCreate, // - done ID_EventDelete, // - done + ID_EventDuplicate, // - ID_EventSetData, // - ? // Region map editor history commands }; @@ -238,7 +242,8 @@ private: /// Applies to every currently selected Event. class EventDelete : public QUndoCommand { public: - EventDelete(Editor *editor, Map *map, QList selectedEvents, + EventDelete(Editor *editor, Map *map, + QList selectedEvents, Event *nextSelectedEvent, QUndoCommand *parent = nullptr); ~EventDelete(); @@ -248,6 +253,28 @@ public: bool mergeWith(const QUndoCommand *command) override { return false; } int id() const override { return CommandId::ID_EventDelete; } +private: + Editor *editor; + Map *map; + QList selectedEvents; // allow multiple deletion of events + Event *nextSelectedEvent; +}; + + + +/// Implements a command to commit Event duplications. +class EventDuplicate : public QUndoCommand { +public: + EventDuplicate(Editor *editor, Map *map, QList selectedEvents, + QUndoCommand *parent = nullptr); + ~EventDuplicate(); + + void undo() override; + void redo() override; + + bool mergeWith(const QUndoCommand *command) override { return false; } + int id() const override { return CommandId::ID_EventDuplicate; } + private: Map *map; QList selectedEvents; // allow multiple deletion of events diff --git a/src/core/editcommands.cpp b/src/core/editcommands.cpp index 6c014fbb..25c4befe 100644 --- a/src/core/editcommands.cpp +++ b/src/core/editcommands.cpp @@ -358,6 +358,10 @@ void EventCreate::redo() { editor->addMapEvent(event); map->objectsChanged(); + + // select this event + editor->selected_events->clear(); + editor->selectMapEvent(event->pixmapItem, false); } void EventCreate::undo() { @@ -379,7 +383,8 @@ void EventCreate::undo() { ************************************************************************ ******************************************************************************/ -EventDelete::EventDelete(Editor *editor, Map *map, QList selectedEvents, +EventDelete::EventDelete(Editor *editor, Map *map, + QList selectedEvents, Event *nextSelectedEvent, QUndoCommand *parent) : QUndoCommand(parent) { if (selectedEvents.size() > 1) { setText("Delete Events"); @@ -388,9 +393,10 @@ EventDelete::EventDelete(Editor *editor, Map *map, QList selectedEvents } this->editor = editor; - this->map = map; + this->selectedEvents = selectedEvents; + this->nextSelectedEvent = nextSelectedEvent; } EventDelete::~EventDelete() {} @@ -408,6 +414,10 @@ void EventDelete::redo() { } map->objectsChanged(); + + editor->selected_events->clear(); + editor->selected_events->append(nextSelectedEvent->pixmapItem); + editor->updateSelectedEvents(); } void EventDelete::undo() { @@ -420,5 +430,68 @@ void EventDelete::undo() { map->objectsChanged(); + // select these events + editor->selected_events->clear(); + for (Event *event : selectedEvents) { + editor->selected_events->append(event->pixmapItem); + } + editor->updateSelectedEvents(); + + QUndoCommand::undo(); +} + +/****************************************************************************** + ************************************************************************ + ******************************************************************************/ + +EventDuplicate::EventDuplicate(Editor *editor, Map *map, + QList selectedEvents, + QUndoCommand *parent) : QUndoCommand(parent) { + // + setText("Duplicate Event"); + + this->editor = editor; + + this->map = map; + this->selectedEvents = selectedEvents; +} + +EventDuplicate::~EventDuplicate() {} + +void EventDuplicate::redo() { + QUndoCommand::redo(); + + for (Event *event : selectedEvents) { + map->addEvent(event); + } + + editor->project->loadEventPixmaps(map->getAllEvents()); + + for (Event *event : selectedEvents) { + editor->addMapEvent(event); + } + + map->objectsChanged(); + + // select these events + editor->selected_events->clear(); + for (Event *event : selectedEvents) { + editor->selected_events->append(event->pixmapItem); + } + editor->updateSelectedEvents(); +} + +void EventDuplicate::undo() { + for (Event *event : selectedEvents) { + map->removeEvent(event); + + if (editor->scene->items().contains(event->pixmapItem)) { + editor->scene->removeItem(event->pixmapItem); + } + editor->selected_events->removeOne(event->pixmapItem); + } + + map->objectsChanged(); + QUndoCommand::undo(); } diff --git a/src/editor.cpp b/src/editor.cpp index 8742c958..681af650 100644 --- a/src/editor.cpp +++ b/src/editor.cpp @@ -1098,7 +1098,6 @@ void Editor::mouseEvent_map(QGraphicsSceneMouseEvent *event, MapPixmapItem *item QList selectedEvents; for (DraggablePixmapItem *item : *(getObjects())) { - //item->move(xDelta, yDelta); selectedEvents.append(item->event); } selection_origin = QPoint(x, y); @@ -1351,6 +1350,7 @@ void Editor::displayMapEvents() { DraggablePixmapItem *Editor::addMapEvent(Event *event) { DraggablePixmapItem *object = new DraggablePixmapItem(event, this); + event->setPixmapItem(object); this->redrawObject(object); events_group->addToGroup(object); return object; @@ -1823,7 +1823,7 @@ void Editor::duplicateSelectedEvents() { if (!selected_events || !selected_events->length() || !map || !current_view || map_item->paintingMode != MapPixmapItem::PaintMode::EventObjects) return; - QList *duplicates = new QList; + QList selectedEvents; for (int i = 0; i < selected_events->length(); i++) { Event *original = selected_events->at(i)->event; QString eventType = original->get("event_type"); @@ -1833,15 +1833,11 @@ void Editor::duplicateSelectedEvents() { } if (eventType == EventType::HealLocation) continue; Event *duplicate = new Event(*original); - map->addEvent(duplicate); - DraggablePixmapItem *object = addMapEvent(duplicate); - duplicates->append(object); - } - if (duplicates->length()) { - selected_events->clear(); - selected_events = duplicates; - updateSelectedEvents(); + duplicate->setX(duplicate->x() + 1); + duplicate->setY(duplicate->y() + 1); + selectedEvents.append(duplicate); } + map->editHistory.push(new EventDuplicate(this, map, selectedEvents)); } DraggablePixmapItem* Editor::addNewEvent(QString event_type) { diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index a69c3ee9..b87a8d2e 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2129,7 +2129,7 @@ void MainWindow::on_toolButton_deleteObject_clicked() { } if (editor && editor->selected_events) { if (editor->selected_events->length()) { - DraggablePixmapItem *next_selected_event = nullptr; + DraggablePixmapItem *nextSelectedEvent = nullptr; QList selectedEvents; for (DraggablePixmapItem *item : *editor->selected_events) { QString event_group = item->event->get("event_group_type"); @@ -2149,7 +2149,7 @@ void MainWindow::on_toolButton_deleteObject_clicked() { for (QGraphicsItem *child : editor->events_group->childItems()) { DraggablePixmapItem *event_item = static_cast(child); if (event_item->event == event) { - next_selected_event = event_item; + nextSelectedEvent = event_item; break; } } @@ -2161,13 +2161,7 @@ void MainWindow::on_toolButton_deleteObject_clicked() { logWarn(QString("Cannot delete event of type '%1'").arg(item->event->get("event_type"))); } } - editor->map->editHistory.push(new EventDelete(editor, editor->map, selectedEvents)); - if (next_selected_event) { - editor->selectMapEvent(next_selected_event); - } - else { - updateObjects(); - } + editor->map->editHistory.push(new EventDelete(editor, editor->map, selectedEvents, nextSelectedEvent->event)); } } }