make some performance improvements to event rendering

This commit is contained in:
garakmon 2020-08-06 19:46:23 -04:00 committed by garak
parent 2a11760afd
commit 1151f9fc26
6 changed files with 52 additions and 52 deletions

View file

@ -21,13 +21,12 @@ enum CommandId {
ID_MagicFillCollision, ID_MagicFillCollision,
ID_ResizeMap, ID_ResizeMap,
ID_PaintBorder, ID_PaintBorder,
ID_ScriptEditMap,
ID_EventMove, ID_EventMove,
ID_EventShift, ID_EventShift,
ID_EventCreate, ID_EventCreate,
ID_EventDelete, ID_EventDelete,
ID_EventDuplicate, ID_EventDuplicate,
ID_EventSetData,
ID_ScriptEditMap,
}; };

View file

@ -110,7 +110,6 @@ private:
signals: signals:
void mapChanged(Map *map); void mapChanged(Map *map);
void mapNeedsRedrawing(); void mapNeedsRedrawing();
void objectsChanged();
}; };
#endif // MAP_H #endif // MAP_H

View file

@ -101,7 +101,7 @@ public:
void updateSelectedEvents(); void updateSelectedEvents();
void duplicateSelectedEvents(); void duplicateSelectedEvents();
void redrawObject(DraggablePixmapItem *item); void redrawObject(DraggablePixmapItem *item);
QList<DraggablePixmapItem *> *getObjects(); QList<DraggablePixmapItem *> getObjects();
QGraphicsScene *scene = nullptr; QGraphicsScene *scene = nullptr;
QGraphicsPixmapItem *current_view = nullptr; QGraphicsPixmapItem *current_view = nullptr;
@ -147,6 +147,8 @@ public:
bool selectingEvent = false; bool selectingEvent = false;
void shouldReselectEvents();
private: private:
void setConnectionItemsVisible(bool); void setConnectionItemsVisible(bool);
void setBorderItemsVisible(bool, qreal = 1); void setBorderItemsVisible(bool, qreal = 1);

View file

@ -343,8 +343,6 @@ void EventCreate::redo() {
editor->project->loadEventPixmaps(map->getAllEvents()); editor->project->loadEventPixmaps(map->getAllEvents());
editor->addMapEvent(event); editor->addMapEvent(event);
map->objectsChanged();
// select this event // select this event
editor->selected_events->clear(); editor->selected_events->clear();
editor->selectMapEvent(event->pixmapItem, false); editor->selectMapEvent(event->pixmapItem, false);
@ -358,9 +356,7 @@ void EventCreate::undo() {
} }
editor->selected_events->removeOne(event->pixmapItem); editor->selected_events->removeOne(event->pixmapItem);
editor->updateSelectedEvents(); editor->shouldReselectEvents();
map->objectsChanged();
QUndoCommand::undo(); QUndoCommand::undo();
} }
@ -399,12 +395,10 @@ void EventDelete::redo() {
editor->selected_events->removeOne(event->pixmapItem); editor->selected_events->removeOne(event->pixmapItem);
} }
map->objectsChanged();
editor->selected_events->clear(); editor->selected_events->clear();
if (nextSelectedEvent) if (nextSelectedEvent)
editor->selected_events->append(nextSelectedEvent->pixmapItem); editor->selected_events->append(nextSelectedEvent->pixmapItem);
editor->updateSelectedEvents(); editor->shouldReselectEvents();
} }
void EventDelete::undo() { void EventDelete::undo() {
@ -415,14 +409,12 @@ void EventDelete::undo() {
editor->addMapEvent(event); editor->addMapEvent(event);
} }
map->objectsChanged();
// select these events // select these events
editor->selected_events->clear(); editor->selected_events->clear();
for (Event *event : selectedEvents) { for (Event *event : selectedEvents) {
editor->selected_events->append(event->pixmapItem); editor->selected_events->append(event->pixmapItem);
} }
editor->updateSelectedEvents(); editor->shouldReselectEvents();
QUndoCommand::undo(); QUndoCommand::undo();
} }
@ -434,7 +426,6 @@ void EventDelete::undo() {
EventDuplicate::EventDuplicate(Editor *editor, Map *map, EventDuplicate::EventDuplicate(Editor *editor, Map *map,
QList<Event *> selectedEvents, QList<Event *> selectedEvents,
QUndoCommand *parent) : QUndoCommand(parent) { QUndoCommand *parent) : QUndoCommand(parent) {
//
setText("Duplicate Event"); setText("Duplicate Event");
this->editor = editor; this->editor = editor;
@ -458,14 +449,12 @@ void EventDuplicate::redo() {
editor->addMapEvent(event); editor->addMapEvent(event);
} }
map->objectsChanged();
// select these events // select these events
editor->selected_events->clear(); editor->selected_events->clear();
for (Event *event : selectedEvents) { for (Event *event : selectedEvents) {
editor->selected_events->append(event->pixmapItem); editor->selected_events->append(event->pixmapItem);
} }
editor->updateSelectedEvents(); editor->shouldReselectEvents();
} }
void EventDuplicate::undo() { void EventDuplicate::undo() {
@ -478,7 +467,7 @@ void EventDuplicate::undo() {
editor->selected_events->removeOne(event->pixmapItem); editor->selected_events->removeOne(event->pixmapItem);
} }
map->objectsChanged(); editor->shouldReselectEvents();
QUndoCommand::undo(); QUndoCommand::undo();
} }

View file

@ -14,7 +14,7 @@
#include <QDir> #include <QDir>
#include <math.h> #include <math.h>
static bool selectingEvent = false; static bool selectNewEvents = false;
Editor::Editor(Ui::MainWindow* ui) Editor::Editor(Ui::MainWindow* ui)
{ {
@ -23,6 +23,16 @@ Editor::Editor(Ui::MainWindow* ui)
this->settings = new Settings(); this->settings = new Settings();
this->playerViewRect = new MovableRect(&this->settings->playerViewRectEnabled, 30 * 8, 20 * 8, qRgb(255, 255, 255)); this->playerViewRect = new MovableRect(&this->settings->playerViewRectEnabled, 30 * 8, 20 * 8, qRgb(255, 255, 255));
this->cursorMapTileRect = new CursorTileRect(&this->settings->cursorTileRectEnabled, qRgb(255, 255, 255)); this->cursorMapTileRect = new CursorTileRect(&this->settings->cursorTileRectEnabled, qRgb(255, 255, 255));
/// Instead of updating the selected events after every single undo action
/// (eg when the user rolls back several at once), only reselect events when
/// the index is changed.
connect(&editGroup, &QUndoGroup::indexChanged, [this](int) {
if (selectNewEvents) {
updateSelectedEvents();
selectNewEvents = false;
}
});
} }
Editor::~Editor() Editor::~Editor()
@ -1097,7 +1107,7 @@ void Editor::mouseEvent_map(QGraphicsSceneMouseEvent *event, MapPixmapItem *item
QList<Event *> selectedEvents; QList<Event *> selectedEvents;
for (DraggablePixmapItem *item : *(getObjects())) { for (DraggablePixmapItem *item : getObjects()) {
selectedEvents.append(item->event); selectedEvents.append(item->event);
} }
selection_origin = QPoint(x, y); selection_origin = QPoint(x, y);
@ -1760,16 +1770,10 @@ Tileset* Editor::getCurrentMapPrimaryTileset()
return project->getTileset(tilesetLabel); return project->getTileset(tilesetLabel);
} }
QList<DraggablePixmapItem *> *Editor::getObjects() { QList<DraggablePixmapItem *> Editor::getObjects() {
QList<DraggablePixmapItem *> *list = new QList<DraggablePixmapItem *>; QList<DraggablePixmapItem *> list;
for (Event *event : map->getAllEvents()) { for (QGraphicsItem *child : events_group->childItems()) {
for (QGraphicsItem *child : events_group->childItems()) { list.append(static_cast<DraggablePixmapItem *>(child));
DraggablePixmapItem *item = static_cast<DraggablePixmapItem *>(child);
if (item->event == event) {
list->append(item);
break;
}
}
} }
return list; return list;
} }
@ -1792,10 +1796,15 @@ void Editor::redrawObject(DraggablePixmapItem *item) {
} }
} }
void Editor::shouldReselectEvents() {
selectNewEvents = true;
}
void Editor::updateSelectedEvents() { void Editor::updateSelectedEvents() {
for (DraggablePixmapItem *item : *(getObjects())) { for (DraggablePixmapItem *item : getObjects()) {
redrawObject(item); redrawObject(item);
} }
emit selectedObjectsChanged(); emit selectedObjectsChanged();
} }
@ -1870,6 +1879,11 @@ void Editor::deleteEvent(Event *event) {
Map *map = project->getMap(event->get("map_name")); Map *map = project->getMap(event->get("map_name"));
if (map) { if (map) {
map->removeEvent(event); map->removeEvent(event);
if (event->pixmapItem) {
events_group->removeFromGroup(event->pixmapItem);
delete event->pixmapItem;
event->pixmapItem = nullptr;
}
} }
//selected_events->removeAll(event); //selected_events->removeAll(event);
//updateSelectedObjects(); //updateSelectedObjects();

View file

@ -35,6 +35,8 @@
#include <QSignalBlocker> #include <QSignalBlocker>
#include <QSet> #include <QSet>
MainWindow::MainWindow(QWidget *parent) : MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent), QMainWindow(parent),
ui(new Ui::MainWindow), ui(new Ui::MainWindow),
@ -533,7 +535,6 @@ bool MainWindow::setMap(QString map_name, bool scrollTreeView) {
connect(editor->map, SIGNAL(mapChanged(Map*)), this, SLOT(onMapChanged(Map *))); connect(editor->map, SIGNAL(mapChanged(Map*)), this, SLOT(onMapChanged(Map *)));
connect(editor->map, SIGNAL(mapNeedsRedrawing()), this, SLOT(onMapNeedsRedrawing())); connect(editor->map, SIGNAL(mapNeedsRedrawing()), this, SLOT(onMapNeedsRedrawing()));
connect(editor->map, SIGNAL(objectsChanged()), this, SLOT(updateObjects()));
setRecentMap(map_name); setRecentMap(map_name);
updateMapList(); updateMapList();
@ -616,16 +617,13 @@ void MainWindow::openWarpMap(QString map_name, QString warp_num) {
QList<Event*> warp_events = editor->map->events["warp_event_group"]; QList<Event*> warp_events = editor->map->events["warp_event_group"];
if (warp_events.length() > warpNum) { if (warp_events.length() > warpNum) {
Event *warp_event = warp_events.at(warpNum); Event *warp_event = warp_events.at(warpNum);
QList<DraggablePixmapItem *> *all_events = editor->getObjects(); for (DraggablePixmapItem *item : editor->getObjects()) {
for (DraggablePixmapItem *item : *all_events) {
if (item->event == warp_event) { if (item->event == warp_event) {
editor->selected_events->clear(); editor->selected_events->clear();
editor->selected_events->append(item); editor->selected_events->append(item);
editor->updateSelectedEvents(); editor->updateSelectedEvents();
} }
} }
delete all_events;
} }
} }
@ -1497,7 +1495,7 @@ void MainWindow::updateObjects() {
bool hasBGs = false; bool hasBGs = false;
bool hasHealspots = false; bool hasHealspots = false;
for (DraggablePixmapItem *item : *editor->getObjects()) for (DraggablePixmapItem *item : editor->getObjects())
{ {
QString event_type = item->event->get("event_type"); QString event_type = item->event->get("event_type");
@ -1548,18 +1546,17 @@ void MainWindow::updateObjects() {
// Should probably just pass layout and let the editor work it out // Should probably just pass layout and let the editor work it out
void MainWindow::updateSelectedObjects() { void MainWindow::updateSelectedObjects() {
QList<DraggablePixmapItem *> *all_events = editor->getObjects(); QList<DraggablePixmapItem *> all_events = editor->getObjects();
QList<DraggablePixmapItem *> *events = nullptr; QList<DraggablePixmapItem *> events;
if (editor->selected_events && editor->selected_events->length()) { if (editor->selected_events && editor->selected_events->length()) {
events = editor->selected_events; events = *editor->selected_events;
} else { } else {
events = new QList<DraggablePixmapItem*>; if (all_events.length()) {
if (all_events && all_events->length()) { DraggablePixmapItem *selectedEvent = all_events.first();
DraggablePixmapItem *selectedEvent = all_events->first();
editor->selected_events->append(selectedEvent); editor->selected_events->append(selectedEvent);
editor->redrawObject(selectedEvent); editor->redrawObject(selectedEvent);
events->append(selectedEvent); events.append(selectedEvent);
} }
} }
@ -1571,7 +1568,7 @@ void MainWindow::updateSelectedObjects() {
bool quantityEnabled = projectConfig.getHiddenItemQuantityEnabled(); bool quantityEnabled = projectConfig.getHiddenItemQuantityEnabled();
bool underfootEnabled = projectConfig.getHiddenItemRequiresItemfinderEnabled(); bool underfootEnabled = projectConfig.getHiddenItemRequiresItemfinderEnabled();
bool respawnDataEnabled = projectConfig.getHealLocationRespawnDataEnabled(); bool respawnDataEnabled = projectConfig.getHealLocationRespawnDataEnabled();
for (DraggablePixmapItem *item : *events) { for (DraggablePixmapItem *item : events) {
EventPropertiesFrame *frame = new EventPropertiesFrame(item->event); EventPropertiesFrame *frame = new EventPropertiesFrame(item->event);
// frame->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); // frame->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
@ -1607,7 +1604,7 @@ void MainWindow::updateSelectedObjects() {
else { event_offs = 1; } else { event_offs = 1; }
frame->ui->label_name->setText(QString("%1 Id").arg(event_type)); frame->ui->label_name->setText(QString("%1 Id").arg(event_type));
if (events->count() == 1) if (events.count() == 1)
{ {
frame->ui->spinBox_index->setValue(editor->project->getMap(map_name)->events.value(event_group_type).indexOf(item->event) + event_offs); frame->ui->spinBox_index->setValue(editor->project->getMap(map_name)->events.value(event_group_type).indexOf(item->event) + event_offs);
frame->ui->spinBox_index->setMinimum(event_offs); frame->ui->spinBox_index->setMinimum(event_offs);
@ -1901,9 +1898,9 @@ void MainWindow::updateSelectedObjects() {
isProgrammaticEventTabChange = true; isProgrammaticEventTabChange = true;
if (events->length() == 1) if (events.length() == 1)
{ {
QString event_group_type = (*events)[0]->event->get("event_group_type"); QString event_group_type = events[0]->event->get("event_group_type");
if (event_group_type == "object_event_group") { if (event_group_type == "object_event_group") {
scrollTarget = ui->scrollArea_Objects; scrollTarget = ui->scrollArea_Objects;
@ -1932,7 +1929,7 @@ void MainWindow::updateSelectedObjects() {
} }
ui->tabWidget_EventType->removeTab(ui->tabWidget_EventType->indexOf(ui->tab_Multiple)); ui->tabWidget_EventType->removeTab(ui->tabWidget_EventType->indexOf(ui->tab_Multiple));
} }
else if (events->length() > 1) else if (events.length() > 1)
{ {
ui->tabWidget_EventType->addTab(ui->tab_Multiple, "Multiple"); ui->tabWidget_EventType->addTab(ui->tab_Multiple, "Multiple");
ui->tabWidget_EventType->setCurrentWidget(ui->tab_Multiple); ui->tabWidget_EventType->setCurrentWidget(ui->tab_Multiple);
@ -1940,7 +1937,7 @@ void MainWindow::updateSelectedObjects() {
isProgrammaticEventTabChange = false; isProgrammaticEventTabChange = false;
if (events->length() != 0) if (events.length() != 0)
{ {
if (target->children().length()) if (target->children().length())
{ {