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_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
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue