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_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<Event *> selectedEvents,
EventDelete(Editor *editor, Map *map,
QList<Event *> 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<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:
Map *map;
QList<Event *> selectedEvents; // allow multiple deletion of events

View file

@ -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<Event *> selectedEvents,
EventDelete::EventDelete(Editor *editor, Map *map,
QList<Event *> 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<Event *> 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<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();
}

View file

@ -1098,7 +1098,6 @@ void Editor::mouseEvent_map(QGraphicsSceneMouseEvent *event, MapPixmapItem *item
QList<Event *> 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<DraggablePixmapItem*> *duplicates = new QList<DraggablePixmapItem*>;
QList<Event *> 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) {

View file

@ -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<Event *> 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<DraggablePixmapItem *>(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));
}
}
}