Skip to content

Commit

Permalink
Maps: Implement map event management
Browse files Browse the repository at this point in the history
The following changes have been made:
- Implement saving of map event additions and deletions
- Handling of map event additions and deletions by the undo stack
- Implement copying of map events
- Implement cutting of map events
- Implement pasting of map events
  • Loading branch information
rueter37 committed Nov 30, 2021
1 parent 5820ae6 commit 5753e2d
Show file tree
Hide file tree
Showing 2 changed files with 127 additions and 34 deletions.
149 changes: 115 additions & 34 deletions src/ui/map/map_scene.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,9 @@ MapScene::MapScene(ProjectData& project, int id, QGraphicsView *view, QObject *p
actions << new QAction(QIcon(":/icons/share/old_event_layer.png"),
"New Event",
this);
actions << new QAction(QIcon(":/icons/share/old_event_layer.png"),
"Edit Event",
this);
actions << new QAction(QIcon(":/icons/share/old_event_layer.png"),
"Copy Event",
this);
Expand All @@ -79,7 +82,11 @@ MapScene::MapScene(ProjectData& project, int id, QGraphicsView *view, QObject *p
connect(actions[0],SIGNAL(triggered()),this,SLOT(on_actionRunHere()));
connect(actions[1],SIGNAL(triggered()),this,SLOT(on_actionSetStartPosition()));
connect(actions[2],SIGNAL(triggered()),this,SLOT(on_actionNewEvent()));
connect(actions[6],SIGNAL(triggered()),this,SLOT(on_actionDeleteEvent()));
connect(actions[3],SIGNAL(triggered()),this,SLOT(on_actionEditEvent()));
connect(actions[4],SIGNAL(triggered()),this,SLOT(on_actionCopyEvent()));
connect(actions[5],SIGNAL(triggered()),this,SLOT(on_actionCutEvent()));
connect(actions[6],SIGNAL(triggered()),this,SLOT(on_actionPasteEvent()));
connect(actions[7],SIGNAL(triggered()),this,SLOT(on_actionDeleteEvent()));

m_eventMenu->addActions(actions);
m_lowerpix = new QGraphicsPixmapItem();
Expand Down Expand Up @@ -203,9 +210,21 @@ void MapScene::setLayerData(Core::Layer layer, std::vector<short> data)

void MapScene::setEventData(int id, const lcf::rpg::Event &data)
{
for (unsigned int i = 0; i < m_map->events.size(); i++)
if (m_map->events[i].ID == id)
m_map->events[i] = data;
for (unsigned int i = 0; i < m_map->events.size(); i++) {
if (m_map->events[i].ID == id) {
if (m_map->events[i] == data) {
m_map->events.erase(m_map->events.begin() + i);
redrawMap();
return;
} else {
m_map->events[i] = data;
return;
}
}
}

m_map->events.push_back(data);
redrawMap();
}

QMap<int, lcf::rpg::Event*> *MapScene::mapEvents()
Expand Down Expand Up @@ -391,20 +410,7 @@ void MapScene::undo()
void MapScene::on_actionNewEvent()
{
// Find first free id
std::vector<lcf::rpg::Event>::iterator ev;
int id = 1;
for (;;++id)
{
bool valid = true;
for (ev = m_map->events.begin(); ev != m_map->events.end(); ++ev)
if (ev->ID == id)
{
valid = false;
break;
}
if (valid)
break;
}
int id = getFirstFreeId();

lcf::rpg::Event event;
event.ID = id;
Expand All @@ -417,11 +423,54 @@ void MapScene::on_actionNewEvent()
if (result != QDialogButtonBox::Cancel)
{
m_map->events.push_back(event);
m_undoStack->push(new UndoEvent(event, this));
redrawMap();
emit mapChanged();
}
}

void MapScene::on_actionEditEvent() {
std::vector<lcf::rpg::Event>::iterator ev;
for (ev = m_map->events.begin(); ev != m_map->events.end(); ++ev) {
if (_index(cur_x, cur_y) == _index(ev->x, ev->y)) {
lcf::rpg::Event backup = *ev;
int result = EventDialog::edit(m_view, *ev, m_project);
if (result != QDialogButtonBox::Cancel) {
m_undoStack->push(new UndoEvent(backup, this));
emit mapChanged();
}
redrawMap();
return;
}
}
}

void MapScene::on_actionCopyEvent() {
event_clipboard = *getEventAt(cur_x, cur_y);
event_clipboard_set = true;
}

void MapScene::on_actionCutEvent() {
on_actionCopyEvent();
on_actionDeleteEvent();
}

void MapScene::on_actionPasteEvent() {
// Find first free id
int id = getFirstFreeId();

lcf::rpg::Event event = event_clipboard;
event.ID = id;
event.name = ToDBString(QString("EV%1").arg(QString::number(id), 4, QLatin1Char('0')));
event.x = cur_x;
event.y = cur_y;

m_map->events.push_back(event);
m_undoStack->push(new UndoEvent(event, this));
redrawMap();
emit mapChanged();
}

void MapScene::on_actionDeleteEvent()
{
std::vector<lcf::rpg::Event>::iterator ev;
Expand All @@ -431,6 +480,9 @@ void MapScene::on_actionDeleteEvent()

if (ev != m_map->events.end())
{
lcf::rpg::Event backup = *ev;
m_undoStack->push(new UndoEvent(backup, this));

m_map->events.erase(ev);
redrawMap();
emit mapChanged();
Expand Down Expand Up @@ -488,6 +540,13 @@ void MapScene::mousePressEvent(QGraphicsSceneMouseEvent *event)
}
if (sceneRect().contains(event->scenePos()) && core().layer() == Core::EVENT)
{
m_eventMenu->actions()[2]->setEnabled(!getEventAt(cur_x, cur_y));
m_eventMenu->actions()[3]->setEnabled(getEventAt(cur_x, cur_y));
m_eventMenu->actions()[4]->setEnabled(getEventAt(cur_x, cur_y));
m_eventMenu->actions()[5]->setEnabled(getEventAt(cur_x, cur_y));
m_eventMenu->actions()[6]->setEnabled(!getEventAt(cur_x, cur_y) && event_clipboard_set);
m_eventMenu->actions()[7]->setEnabled(getEventAt(cur_x, cur_y));

lst_x = cur_x;
lst_y = cur_y;
m_eventMenu->popup(event->screenPos());
Expand Down Expand Up @@ -631,23 +690,11 @@ void MapScene::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
return;
}

std::vector<lcf::rpg::Event>::iterator ev;
for (ev = m_map->events.begin(); ev != m_map->events.end(); ++ev)
{
if (_index(cur_x,cur_y) == _index(ev->x,ev->y))
{
lcf::rpg::Event backup = *ev;
int result = EventDialog::edit(m_view, *ev, m_project);
if (result != QDialogButtonBox::Cancel)
{
m_undoStack->push(new UndoEvent(backup, this));
emit mapChanged();
}
redrawMap();
return;
}
if (getEventAt(cur_x, cur_y)) {
on_actionEditEvent();
} else {
on_actionNewEvent();
}
on_actionNewEvent();
}

int MapScene::_x(int index)
Expand Down Expand Up @@ -959,3 +1006,37 @@ void MapScene::centerOnTile(int x, int y)
{
m_view->centerOn(x * s_tileSize, y * s_tileSize);
}

lcf::rpg::Event* MapScene::getEventAt(int x, int y) {
std::vector<lcf::rpg::Event>::iterator ev;
for (ev = m_map->events.begin(); ev != m_map->events.end(); ++ev) {
if (_index(x, y) == _index(ev->x, ev->y)) {
break;
}
}

if (ev != m_map->events.end()) {
return &(*ev);
}

return nullptr;
}

int MapScene::getFirstFreeId() {
std::vector<lcf::rpg::Event>::iterator ev;
int id = 1;
for (;;++id) {
bool valid = true;
for (ev = m_map->events.begin(); ev != m_map->events.end(); ++ev) {
if (ev->ID == id) {
valid = false;
break;
}
}
if (valid) {
break;
}
}

return id;
}
12 changes: 12 additions & 0 deletions src/ui/map/map_scene.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,14 @@ private slots:

void on_actionNewEvent();

void on_actionEditEvent();

void on_actionCopyEvent();

void on_actionCutEvent();

void on_actionPasteEvent();

void on_actionDeleteEvent();

void on_user_interaction();
Expand Down Expand Up @@ -111,6 +119,8 @@ private slots:
void drawRect();
void drawFill(int terrain_id, int x, int y);
short bind(int x, int y);
lcf::rpg::Event* getEventAt(int x, int y);
int getFirstFreeId();


QMenu *m_eventMenu;
Expand Down Expand Up @@ -138,5 +148,7 @@ private slots:
bool m_selecting;
bool m_userInteraction = false;
ProjectData& m_project;
lcf::rpg::Event event_clipboard;
bool event_clipboard_set = false;
};

0 comments on commit 5753e2d

Please sign in to comment.