add edit command for duplicating events
- also select next event when performing redo actions on deletion
This commit is contained in:
parent
c3defd6887
commit
98c3298805
4 changed files with 112 additions and 22 deletions
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue