add edit command for duplicating events

- also select next event when performing redo actions on deletion
This commit is contained in:
garakmon 2020-07-31 19:16:16 -04:00 committed by garak
parent c3defd6887
commit 98c3298805
4 changed files with 112 additions and 22 deletions

View file

@ -16,12 +16,16 @@ enum CommandId {
ID_BucketFillMetatile, // - done ID_BucketFillMetatile, // - done
ID_MagicFillMetatile, // - done ID_MagicFillMetatile, // - done
ID_ShiftMetatiles, // - done ID_ShiftMetatiles, // - done
ID_PaintCollision, // -
ID_BucketFillCollision, // -
ID_MagicFillCollision, // -
ID_ResizeMap, // - done ID_ResizeMap, // - done
ID_PaintBorder, // - done ID_PaintBorder, // - done
ID_EventMove, // - done ID_EventMove, // - done
ID_EventShift, // - done ID_EventShift, // - done
ID_EventCreate, // - done ID_EventCreate, // - done
ID_EventDelete, // - done ID_EventDelete, // - done
ID_EventDuplicate, // -
ID_EventSetData, // - ? ID_EventSetData, // - ?
// Region map editor history commands // Region map editor history commands
}; };
@ -238,7 +242,8 @@ private:
/// Applies to every currently selected Event. /// Applies to every currently selected Event.
class EventDelete : public QUndoCommand { class EventDelete : public QUndoCommand {
public: public:
EventDelete(Editor *editor, Map *map, QList<Event *> selectedEvents, EventDelete(Editor *editor, Map *map,
QList<Event *> selectedEvents, Event *nextSelectedEvent,
QUndoCommand *parent = nullptr); QUndoCommand *parent = nullptr);
~EventDelete(); ~EventDelete();
@ -248,6 +253,28 @@ public:
bool mergeWith(const QUndoCommand *command) override { return false; } bool mergeWith(const QUndoCommand *command) override { return false; }
int id() const override { return CommandId::ID_EventDelete; } int id() const override { return CommandId::ID_EventDelete; }
private:
Editor *editor;
Map *map;
QList<Event *> 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<Event *> 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: private:
Map *map; Map *map;
QList<Event *> selectedEvents; // allow multiple deletion of events QList<Event *> selectedEvents; // allow multiple deletion of events

View file

@ -358,6 +358,10 @@ void EventCreate::redo() {
editor->addMapEvent(event); editor->addMapEvent(event);
map->objectsChanged(); map->objectsChanged();
// select this event
editor->selected_events->clear();
editor->selectMapEvent(event->pixmapItem, false);
} }
void EventCreate::undo() { void EventCreate::undo() {
@ -379,7 +383,8 @@ void EventCreate::undo() {
************************************************************************ ************************************************************************
******************************************************************************/ ******************************************************************************/
EventDelete::EventDelete(Editor *editor, Map *map, QList<Event *> selectedEvents, EventDelete::EventDelete(Editor *editor, Map *map,
QList<Event *> selectedEvents, Event *nextSelectedEvent,
QUndoCommand *parent) : QUndoCommand(parent) { QUndoCommand *parent) : QUndoCommand(parent) {
if (selectedEvents.size() > 1) { if (selectedEvents.size() > 1) {
setText("Delete Events"); setText("Delete Events");
@ -388,9 +393,10 @@ EventDelete::EventDelete(Editor *editor, Map *map, QList<Event *> selectedEvents
} }
this->editor = editor; this->editor = editor;
this->map = map; this->map = map;
this->selectedEvents = selectedEvents; this->selectedEvents = selectedEvents;
this->nextSelectedEvent = nextSelectedEvent;
} }
EventDelete::~EventDelete() {} EventDelete::~EventDelete() {}
@ -408,6 +414,10 @@ void EventDelete::redo() {
} }
map->objectsChanged(); map->objectsChanged();
editor->selected_events->clear();
editor->selected_events->append(nextSelectedEvent->pixmapItem);
editor->updateSelectedEvents();
} }
void EventDelete::undo() { void EventDelete::undo() {
@ -420,5 +430,68 @@ void EventDelete::undo() {
map->objectsChanged(); 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<Event *> 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(); QUndoCommand::undo();
} }

View file

@ -1098,7 +1098,6 @@ void Editor::mouseEvent_map(QGraphicsSceneMouseEvent *event, MapPixmapItem *item
QList<Event *> selectedEvents; QList<Event *> selectedEvents;
for (DraggablePixmapItem *item : *(getObjects())) { for (DraggablePixmapItem *item : *(getObjects())) {
//item->move(xDelta, yDelta);
selectedEvents.append(item->event); selectedEvents.append(item->event);
} }
selection_origin = QPoint(x, y); selection_origin = QPoint(x, y);
@ -1351,6 +1350,7 @@ void Editor::displayMapEvents() {
DraggablePixmapItem *Editor::addMapEvent(Event *event) { DraggablePixmapItem *Editor::addMapEvent(Event *event) {
DraggablePixmapItem *object = new DraggablePixmapItem(event, this); DraggablePixmapItem *object = new DraggablePixmapItem(event, this);
event->setPixmapItem(object);
this->redrawObject(object); this->redrawObject(object);
events_group->addToGroup(object); events_group->addToGroup(object);
return 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) if (!selected_events || !selected_events->length() || !map || !current_view || map_item->paintingMode != MapPixmapItem::PaintMode::EventObjects)
return; return;
QList<DraggablePixmapItem*> *duplicates = new QList<DraggablePixmapItem*>; QList<Event *> selectedEvents;
for (int i = 0; i < selected_events->length(); i++) { for (int i = 0; i < selected_events->length(); i++) {
Event *original = selected_events->at(i)->event; Event *original = selected_events->at(i)->event;
QString eventType = original->get("event_type"); QString eventType = original->get("event_type");
@ -1833,15 +1833,11 @@ void Editor::duplicateSelectedEvents() {
} }
if (eventType == EventType::HealLocation) continue; if (eventType == EventType::HealLocation) continue;
Event *duplicate = new Event(*original); Event *duplicate = new Event(*original);
map->addEvent(duplicate); duplicate->setX(duplicate->x() + 1);
DraggablePixmapItem *object = addMapEvent(duplicate); duplicate->setY(duplicate->y() + 1);
duplicates->append(object); selectedEvents.append(duplicate);
}
if (duplicates->length()) {
selected_events->clear();
selected_events = duplicates;
updateSelectedEvents();
} }
map->editHistory.push(new EventDuplicate(this, map, selectedEvents));
} }
DraggablePixmapItem* Editor::addNewEvent(QString event_type) { DraggablePixmapItem* Editor::addNewEvent(QString event_type) {

View file

@ -2129,7 +2129,7 @@ void MainWindow::on_toolButton_deleteObject_clicked() {
} }
if (editor && editor->selected_events) { if (editor && editor->selected_events) {
if (editor->selected_events->length()) { if (editor->selected_events->length()) {
DraggablePixmapItem *next_selected_event = nullptr; DraggablePixmapItem *nextSelectedEvent = nullptr;
QList<Event *> selectedEvents; QList<Event *> selectedEvents;
for (DraggablePixmapItem *item : *editor->selected_events) { for (DraggablePixmapItem *item : *editor->selected_events) {
QString event_group = item->event->get("event_group_type"); 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()) { for (QGraphicsItem *child : editor->events_group->childItems()) {
DraggablePixmapItem *event_item = static_cast<DraggablePixmapItem *>(child); DraggablePixmapItem *event_item = static_cast<DraggablePixmapItem *>(child);
if (event_item->event == event) { if (event_item->event == event) {
next_selected_event = event_item; nextSelectedEvent = event_item;
break; 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"))); logWarn(QString("Cannot delete event of type '%1'").arg(item->event->get("event_type")));
} }
} }
editor->map->editHistory.push(new EventDelete(editor, editor->map, selectedEvents)); editor->map->editHistory.push(new EventDelete(editor, editor->map, selectedEvents, nextSelectedEvent->event));
if (next_selected_event) {
editor->selectMapEvent(next_selected_event);
}
else {
updateObjects();
}
} }
} }
} }