diff --git a/forms/eventpropertiesframe.ui b/forms/eventpropertiesframe.ui index 5007d951..1e951a75 100644 --- a/forms/eventpropertiesframe.ui +++ b/forms/eventpropertiesframe.ui @@ -84,11 +84,40 @@ - - - Object 1 - - + + + + + + 0 + 0 + + + + Qt::StrongFocus + + + The index of the event currently being inspected. + + + 255 + + + + + + + + 0 + 0 + + + + Object 1 + + + + diff --git a/forms/mainwindow.ui b/forms/mainwindow.ui index eac8a866..d1ace048 100644 --- a/forms/mainwindow.ui +++ b/forms/mainwindow.ui @@ -1177,7 +1177,7 @@ - + true @@ -1341,86 +1341,13 @@ 3 - - - Selected + + + There are no events on the current map. + + + Qt::AlignCenter - - - 6 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - QAbstractScrollArea::AdjustIgnored - - - true - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - - - - - 0 - 0 - 428 - 586 - - - - - 0 - 0 - - - - - - - - - @@ -1537,6 +1464,289 @@ + + + + 0 + + + + Objects + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + true + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + 0 + 0 + 432 + 565 + + + + + 0 + 0 + + + + + + + + + + Warps + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + true + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + 0 + 0 + 432 + 565 + + + + + 0 + 0 + + + + + + + + + + Triggers + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + true + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + 0 + 0 + 432 + 565 + + + + + 0 + 0 + + + + + + + + + + BGs + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + true + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + 0 + 0 + 432 + 565 + + + + + 0 + 0 + + + + + + + + + + Healspots + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + true + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + 0 + 0 + 432 + 565 + + + + + 0 + 0 + + + + + + + + + + Multiple + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + true + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + 0 + 0 + 432 + 565 + + + + + 0 + 0 + + + + + + + + + @@ -2427,6 +2637,11 @@ + + NoScrollComboBox + QComboBox +
noscrollcombobox.h
+
GraphicsView QGraphicsView @@ -2437,11 +2652,6 @@ QToolButton
neweventtoolbutton.h
- - NoScrollComboBox - QComboBox -
noscrollcombobox.h
-
diff --git a/include/mainwindow.h b/include/mainwindow.h index 5fdfae9d..9a6dceae 100644 --- a/include/mainwindow.h +++ b/include/mainwindow.h @@ -78,6 +78,7 @@ private slots: void addNewEvent(QString); void updateSelectedObjects(); + void updateObjects(); void on_toolButton_Paint_clicked(); @@ -133,6 +134,10 @@ private slots: void on_lineEdit_filterBox_textChanged(const QString &arg1); + void eventTabChanged(int index); + + void selectedEventIndexChanged(int index); + private: Ui::MainWindow *ui; TilesetEditor *tilesetEditor = nullptr; @@ -144,6 +149,21 @@ private: QIcon* mapIcon; QIcon* mapEditedIcon; + QWidget *eventTabObjectWidget; + QWidget *eventTabWarpWidget; + QWidget *eventTabTriggerWidget; + QWidget *eventTabBGWidget; + QWidget *eventTabHealspotWidget; + QWidget *eventTabMultipleWidget; + + DraggablePixmapItem *selectedObject; + DraggablePixmapItem *selectedWarp; + DraggablePixmapItem *selectedTrigger; + DraggablePixmapItem *selectedBG; + DraggablePixmapItem *selectedHealspot; + + bool isProgrammaticEventTabChange; + enum MapSortOrder { Group = 0, Name = 1, @@ -178,6 +198,7 @@ private: void loadUserSettings(); bool openRecentProject(); void updateTilesetEditor(); + QString getEventGroupFromTabWidget(QWidget *tab); bool isProjectOpen(); }; diff --git a/src/editor.cpp b/src/editor.cpp index 76ff8fa5..f2f0d90c 100644 --- a/src/editor.cpp +++ b/src/editor.cpp @@ -1015,7 +1015,7 @@ void DraggablePixmapItem::mousePressEvent(QGraphicsSceneMouseEvent *mouse) { last_x = static_cast(mouse->pos().x() + this->pos().x()) / 16; last_y = static_cast(mouse->pos().y() + this->pos().y()) / 16; this->editor->selectMapEvent(this, mouse->modifiers() & Qt::ControlModifier); - this->editor->updateSelectedEvents(); + //this->editor->updateSelectedEvents(); selectingEvent = true; } diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 8dfeb4db..d558177d 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -28,7 +28,13 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), - ui(new Ui::MainWindow) + ui(new Ui::MainWindow), + selectedObject(nullptr), + selectedWarp(nullptr), + selectedTrigger(nullptr), + selectedBG(nullptr), + selectedHealspot(nullptr), + isProgrammaticEventTabChange(false) { QCoreApplication::setOrganizationName("pret"); QCoreApplication::setApplicationName("porymap"); @@ -74,11 +80,12 @@ void MainWindow::initCustomUI() { void MainWindow::initExtraSignals() { connect(ui->newEventToolButton, SIGNAL(newEventAdded(QString)), this, SLOT(addNewEvent(QString))); + connect(ui->tabWidget_EventType, &QTabWidget::currentChanged, this, &MainWindow::eventTabChanged); } void MainWindow::initEditor() { this->editor = new Editor(ui); - connect(this->editor, SIGNAL(objectsChanged()), this, SLOT(updateSelectedObjects())); + connect(this->editor, SIGNAL(objectsChanged()), this, SLOT(updateObjects())); connect(this->editor, SIGNAL(selectedObjectsChanged()), this, SLOT(updateSelectedObjects())); connect(this->editor, SIGNAL(loadMapRequested(QString, QString)), this, SLOT(onLoadMapRequested(QString, QString))); connect(this->editor, SIGNAL(tilesetChanged(QString)), this, SLOT(onTilesetChanged(QString))); @@ -104,6 +111,14 @@ void MainWindow::initMiscHeapObjects() { mapListProxyModel->setSourceModel(mapListModel); ui->mapList->setModel(mapListProxyModel); + + eventTabObjectWidget = ui->tab_Objects; + eventTabWarpWidget = ui->tab_Warps; + eventTabTriggerWidget = ui->tab_Triggers; + eventTabBGWidget = ui->tab_BGs; + eventTabHealspotWidget = ui->tab_Healspots; + eventTabMultipleWidget = ui->tab_Multiple; + ui->tabWidget_EventType->clear(); } void MainWindow::initMapSortOrder() { @@ -900,10 +915,73 @@ void MainWindow::addNewEvent(QString event_type) if (object) { editor->selectMapEvent(object, false); } - updateSelectedObjects(); + updateObjects(); } } +void MainWindow::updateObjects() { + selectedObject = nullptr; + selectedWarp = nullptr; + selectedTrigger = nullptr; + selectedBG = nullptr; + selectedHealspot = nullptr; + ui->tabWidget_EventType->clear(); + + bool hasObjects = false; + bool hasWarps = false; + bool hasTriggers = false; + bool hasBGs = false; + bool hasHealspots = false; + + for (DraggablePixmapItem *item : *editor->getObjects()) + { + QString event_type = item->event->get("event_type"); + + if (event_type == EventType::Object) { + hasObjects = true; + } + else if (event_type == EventType::Warp) { + hasWarps = true; + } + else if (event_type == EventType::CoordScript || event_type == EventType::CoordWeather) { + hasTriggers = true; + } + else if (event_type == EventType::Sign || event_type == EventType::HiddenItem || event_type == EventType::SecretBase) { + hasBGs = true; + } + else if (event_type == EventType::HealLocation) { + hasHealspots = true; + } + } + + if (hasObjects) + { + ui->tabWidget_EventType->addTab(eventTabObjectWidget, "Objects"); + } + + if (hasWarps) + { + ui->tabWidget_EventType->addTab(eventTabWarpWidget, "Warps"); + } + + if (hasTriggers) + { + ui->tabWidget_EventType->addTab(eventTabTriggerWidget, "Triggers"); + } + + if (hasBGs) + { + ui->tabWidget_EventType->addTab(eventTabBGWidget, "BGs"); + } + + if (hasHealspots) + { + ui->tabWidget_EventType->addTab(eventTabHealspotWidget, "Healspots"); + } + + updateSelectedObjects(); +} + // Should probably just pass layout and let the editor work it out void MainWindow::updateSelectedObjects() { QList *all_events = editor->getObjects(); @@ -955,12 +1033,23 @@ void MainWindow::updateSelectedObjects() { if (event_type == "event_warp") { event_offs = 0; } else { event_offs = 1; } frame->ui->label_name->setText( - QString("%1: %2 %3") - .arg(editor->project->getMap(map_name)->events.value(event_group_type).indexOf(item->event) + event_offs) + QString("%1 %2") .arg(map_name) .arg(event_type) ); + 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->setMinimum(event_offs); + frame->ui->spinBox_index->setMaximum(editor->project->getMap(map_name)->events.value(event_group_type).length() + event_offs - 1); + connect(frame->ui->spinBox_index, QOverload::of(&QSpinBox::valueChanged), this, &MainWindow::selectedEventIndexChanged); + } + else + { + frame->ui->spinBox_index->setVisible(false); + } + frame->ui->label_spritePixmap->setPixmap(item->event->pixmap); connect(item, SIGNAL(spriteChanged(QPixmap)), frame->ui->label_spritePixmap, SLOT(setPixmap(QPixmap))); @@ -1142,26 +1231,226 @@ void MainWindow::updateSelectedObjects() { //int scroll = ui->scrollArea_4->verticalScrollBar()->value(); - QWidget *target = ui->scrollAreaWidgetContents; + QScrollArea *scrollTarget = ui->scrollArea_Multiple; + QWidget *target = ui->scrollAreaWidgetContents_Multiple; - if (target->children().length()) { - qDeleteAll(target->children()); + isProgrammaticEventTabChange = true; + + if (events->length() == 1) + { + QString event_group_type = (*events)[0]->event->get("event_group_type"); + + if (event_group_type == "object_event_group") { + scrollTarget = ui->scrollArea_Objects; + target = ui->scrollAreaWidgetContents_Objects; + ui->tabWidget_EventType->setCurrentWidget(ui->tab_Objects); + } + else if (event_group_type == "warp_event_group") { + scrollTarget = ui->scrollArea_Warps; + target = ui->scrollAreaWidgetContents_Warps; + ui->tabWidget_EventType->setCurrentWidget(ui->tab_Warps); + } + else if (event_group_type == "coord_event_group") { + scrollTarget = ui->scrollArea_Triggers; + target = ui->scrollAreaWidgetContents_Triggers; + ui->tabWidget_EventType->setCurrentWidget(ui->tab_Triggers); + } + else if (event_group_type == "bg_event_group") { + scrollTarget = ui->scrollArea_BGs; + target = ui->scrollAreaWidgetContents_BGs; + ui->tabWidget_EventType->setCurrentWidget(ui->tab_BGs); + } + else if (event_group_type == "heal_event_group") { + scrollTarget = ui->scrollArea_Healspots; + target = ui->scrollAreaWidgetContents_Healspots; + ui->tabWidget_EventType->setCurrentWidget(ui->tab_Healspots); + } + ui->tabWidget_EventType->removeTab(ui->tabWidget_EventType->indexOf(ui->tab_Multiple)); + } + else if (events->length() > 1) + { + ui->tabWidget_EventType->addTab(ui->tab_Multiple, "Multiple"); + ui->tabWidget_EventType->setCurrentWidget(ui->tab_Multiple); } - QVBoxLayout *layout = new QVBoxLayout(target); - target->setLayout(layout); - ui->scrollArea_4->setWidgetResizable(true); - ui->scrollArea_4->setWidget(target); + isProgrammaticEventTabChange = false; - for (EventPropertiesFrame *frame : frames) { - layout->addWidget(frame); + if (events->length() != 0) + { + if (target->children().length()) + { + for (QObject *obj : target->children()) + { + obj->deleteLater(); + } + + delete target->layout(); + } + + QVBoxLayout *layout = new QVBoxLayout(target); + target->setLayout(layout); + scrollTarget->setWidgetResizable(true); + scrollTarget->setWidget(target); + + for (EventPropertiesFrame *frame : frames) { + layout->addWidget(frame); + } + + layout->addStretch(1); + + // doesn't work + //QApplication::processEvents(QEventLoop::ExcludeUserInputEvents); + //ui->scrollArea_4->ensureVisible(0, scroll); + + ui->label_NoEvents->hide(); + ui->tabWidget_EventType->show(); + } + else + { + ui->tabWidget_EventType->hide(); + ui->label_NoEvents->show(); + } +} + +QString MainWindow::getEventGroupFromTabWidget(QWidget *tab) +{ + QString ret = ""; + if (tab == eventTabObjectWidget) + { + ret = "object_event_group"; + } + else if (tab == eventTabWarpWidget) + { + ret = "warp_event_group"; + } + else if (tab == eventTabTriggerWidget) + { + ret = "coord_event_group"; + } + else if (tab == eventTabBGWidget) + { + ret = "bg_event_group"; + } + else if (tab == eventTabHealspotWidget) + { + ret = "heal_event_group"; + } + return ret; +} + +void MainWindow::eventTabChanged(int index) +{ + if (!isProgrammaticEventTabChange && editor->map != nullptr) + { + QString group = getEventGroupFromTabWidget(ui->tabWidget_EventType->widget(index)); + DraggablePixmapItem *selectedEvent = nullptr; + + if (group == "object_event_group") + { + if (selectedObject == nullptr && editor->map->events.value(group).count()) + { + Event *event = editor->map->events.value(group).at(0); + for (QGraphicsItem *child : editor->events_group->childItems()) { + DraggablePixmapItem *item = static_cast(child); + if (item->event == event) { + selectedObject = item; + break; + } + } + } + + selectedEvent = selectedObject; + } + else if (group == "warp_event_group") + { + if (selectedWarp == nullptr && editor->map->events.value(group).count()) + { + Event *event = editor->map->events.value(group).at(0); + for (QGraphicsItem *child : editor->events_group->childItems()) { + DraggablePixmapItem *item = static_cast(child); + if (item->event == event) { + selectedWarp = item; + break; + } + } + } + + selectedEvent = selectedWarp; + } + else if (group == "coord_event_group") + { + if (selectedTrigger == nullptr && editor->map->events.value(group).count()) + { + Event *event = editor->map->events.value(group).at(0); + for (QGraphicsItem *child : editor->events_group->childItems()) { + DraggablePixmapItem *item = static_cast(child); + if (item->event == event) { + selectedTrigger = item; + break; + } + } + } + + selectedEvent = selectedTrigger; + } + else if (group == "bg_event_group") + { + if (selectedBG == nullptr && editor->map->events.value(group).count()) + { + Event *event = editor->map->events.value(group).at(0); + for (QGraphicsItem *child : editor->events_group->childItems()) { + DraggablePixmapItem *item = static_cast(child); + if (item->event == event) { + selectedBG = item; + break; + } + } + } + + selectedEvent = selectedBG; + } + else if (group == "heal_event_group") + { + if (selectedHealspot == nullptr && editor->map->events.value(group).count()) + { + Event *event = editor->map->events.value(group).at(0); + for (QGraphicsItem *child : editor->events_group->childItems()) { + DraggablePixmapItem *item = static_cast(child); + if (item->event == event) { + selectedHealspot = item; + break; + } + } + } + + selectedEvent = selectedHealspot; + } + + if (selectedEvent != nullptr) + editor->selectMapEvent(selectedEvent); } - layout->addStretch(1); + isProgrammaticEventTabChange = false; +} - // doesn't work - //QApplication::processEvents(QEventLoop::ExcludeUserInputEvents); - //ui->scrollArea_4->ensureVisible(0, scroll); +void MainWindow::selectedEventIndexChanged(int index) +{ + QString group = getEventGroupFromTabWidget(ui->tabWidget_EventType->currentWidget()); + int event_offs; + if (group == "warp_event_group") { event_offs = 0; } + else { event_offs = 1; } + Event *event = editor->map->events.value(group).at(index - event_offs); + DraggablePixmapItem *selectedEvent = nullptr; + for (QGraphicsItem *child : editor->events_group->childItems()) { + DraggablePixmapItem *item = static_cast(child); + if (item->event == event) { + selectedEvent = item; + break; + } + } + + if (selectedEvent != nullptr) + editor->selectMapEvent(selectedEvent); } void MainWindow::on_toolButton_deleteObject_clicked() @@ -1169,7 +1458,7 @@ void MainWindow::on_toolButton_deleteObject_clicked() if (editor && editor->selected_events) { if (editor->selected_events->length()) { for (DraggablePixmapItem *item : *editor->selected_events) { - if (item->event->get("event_type") != EventType::HealLocation) { + if (item->event->get("event_group_type") != "heal_event_group") { editor->deleteEvent(item->event); if (editor->scene->items().contains(item)) { editor->scene->removeItem(item); @@ -1180,7 +1469,7 @@ void MainWindow::on_toolButton_deleteObject_clicked() logWarn(QString("Cannot delete event of type '%1'").arg(item->event->get("event_type"))); } } - updateSelectedObjects(); + updateObjects(); } } }