make some performance improvements to event rendering
This commit is contained in:
parent
2a11760afd
commit
1151f9fc26
6 changed files with 52 additions and 52 deletions
|
@ -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,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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())
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue