From f042b1bc24acae73923d2ae8ec291d15c7fc1fa3 Mon Sep 17 00:00:00 2001 From: Greg Williamson Date: Sun, 16 Aug 2020 20:00:07 -0400 Subject: [PATCH 01/29] idk wtf im doing --- CMakeLists.txt | 2 + Editors/ObjectEditor.cpp | 15 +++++++ Editors/ObjectEditor.h | 7 +++ Editors/ObjectEditor.ui | 52 +---------------------- MainWindow.cpp | 9 ++-- MainWindow.h | 7 +-- Models/EventsListModel.cpp | 87 ++++++++++++++++++++++++++++++++++++++ Models/EventsListModel.h | 30 +++++++++++++ RadialGM.pro | 2 + 9 files changed, 153 insertions(+), 58 deletions(-) create mode 100644 Models/EventsListModel.cpp create mode 100644 Models/EventsListModel.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 348337364..744b32ec1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -68,6 +68,7 @@ set(RGM_SOURCES Models/ImmediateMapper.cpp Models/ResourceModelMap.cpp Models/TreeModel.cpp + Models/EventsListModel.cpp Editors/ObjectEditor.cpp Editors/PathEditor.cpp Editors/CodeEditor.cpp @@ -117,6 +118,7 @@ set(RGM_HEADERS Models/RepeatedMessageModel.h Models/ProtoModel.h Models/RepeatedModel.h + Models/EventsListModel.h Editors/FontEditor.h Editors/PathEditor.h Editors/SpriteEditor.h diff --git a/Editors/ObjectEditor.cpp b/Editors/ObjectEditor.cpp index a6ab15656..da5f37765 100644 --- a/Editors/ObjectEditor.cpp +++ b/Editors/ObjectEditor.cpp @@ -1,10 +1,25 @@ +#include "Models/RepeatedMessageModel.h" #include "ObjectEditor.h" +#include "MainWindow.h" #include "ui_ObjectEditor.h" ObjectEditor::ObjectEditor(MessageModel* model, QWidget* parent) : BaseEditor(model, parent), _ui(new Ui::ObjectEditor) { _ui->setupUi(this); connect(_ui->saveButton, &QAbstractButton::pressed, this, &BaseEditor::OnSave); + + _eventsModel = new EventsListModel(MainWindow::GetEventData(), this); + + RebindSubModels(); } ObjectEditor::~ObjectEditor() { delete _ui; } + +void ObjectEditor::RebindSubModels() { + _objectModel = _model->GetSubModel(TreeNode::kObjectFieldNumber); + _eventsModel->setSourceModel(_objectModel->GetSubModel(Object::kEgmEventsFieldNumber)); + _eventsModel->sort(0, Qt::DescendingOrder); + _ui->eventsList->setModel(_eventsModel); + + BaseEditor::RebindSubModels(); +} diff --git a/Editors/ObjectEditor.h b/Editors/ObjectEditor.h index 0c9bd20a9..a4cb27e43 100644 --- a/Editors/ObjectEditor.h +++ b/Editors/ObjectEditor.h @@ -3,6 +3,8 @@ #include "BaseEditor.h" +#include "Models/EventsListModel.h" + namespace Ui { class ObjectEditor; } @@ -14,8 +16,13 @@ class ObjectEditor : public BaseEditor { explicit ObjectEditor(MessageModel* model, QWidget* parent); ~ObjectEditor() override; + public slots: + void RebindSubModels() override; + private: Ui::ObjectEditor* _ui; + MessageModel* _objectModel = nullptr; + EventsListModel* _eventsModel = nullptr; }; #endif // OBJECTEDITOR_H diff --git a/Editors/ObjectEditor.ui b/Editors/ObjectEditor.ui index 670b7f56b..1346cc340 100644 --- a/Editors/ObjectEditor.ui +++ b/Editors/ObjectEditor.ui @@ -477,7 +477,7 @@ - + 0 @@ -487,56 +487,6 @@ false - - true - - - false - - - false - - - true - - - false - - - false - - - - Events - - - - - Create - - - - :/events/create.png:/events/create.png - - - - - Step - - - - :/events/step.png:/events/step.png - - - - - Draw - - - - :/events/draw.png:/events/draw.png - - diff --git a/MainWindow.cpp b/MainWindow.cpp index 8278f8954..9247ab862 100644 --- a/MainWindow.cpp +++ b/MainWindow.cpp @@ -44,6 +44,7 @@ QList MainWindow::systemCache; MainWindow *MainWindow::_instance = nullptr; QScopedPointer MainWindow::resourceMap; QScopedPointer MainWindow::treeModel; +std::unique_ptr MainWindow::_event_data; static QTextEdit *diagnosticTextEdit = nullptr; static QAction *toggleDiagnosticsAction = nullptr; @@ -96,11 +97,11 @@ QFileInfo MainWindow::getEnigmaRoot() { break; } } - + return EnigmaRoot; } -MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), _ui(new Ui::MainWindow), _event_data(nullptr), egm(nullptr) { +MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), _ui(new Ui::MainWindow), egm(nullptr) { if (!EnigmaRoot.filePath().isEmpty()) { _event_data = std::make_unique(ParseEventFile((EnigmaRoot.absolutePath() + "/events.ey").toStdString())); @@ -112,9 +113,9 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), _ui(new Ui::MainW ss << internal_events.readAll().toStdString(); _event_data = std::make_unique(ParseEventFile(ss)); } - + egm = egm::EGM(_event_data.get()); - + ArtManager::Init(); _instance = this; diff --git a/MainWindow.h b/MainWindow.h index 00c06578c..4a5c1559e 100644 --- a/MainWindow.h +++ b/MainWindow.h @@ -36,9 +36,10 @@ class MainWindow : public QMainWindow { ~MainWindow(); void openProject(std::unique_ptr openedProject); buffers::Game *Game() const { return this->_project->mutable_game(); } - + static QList EnigmaSearchPaths; static QFileInfo EnigmaRoot; + static EventData* GetEventData() { return _event_data.get(); } signals: void CurrentConfigChanged(const buffers::resources::Settings &settings); @@ -114,8 +115,8 @@ class MainWindow : public QMainWindow { std::unique_ptr _project; QPointer _recentFiles; - - std::unique_ptr _event_data; + + static std::unique_ptr _event_data; egm::EGM egm; void openSubWindow(buffers::TreeNode *item); diff --git a/Models/EventsListModel.cpp b/Models/EventsListModel.cpp new file mode 100644 index 000000000..7efa7f2ba --- /dev/null +++ b/Models/EventsListModel.cpp @@ -0,0 +1,87 @@ +#include "EventsListModel.h" +#include "MessageModel.h" +#include "RepeatedStringModel.h" +#include "RepeatedMessageModel.h" + +const Event EventsListModel::GetEvent(const QModelIndex &index) const { + std::string name = sourceModel()->data(index, Qt::DisplayRole).toString().toStdString(); + std::vector arguments_vec; + + MessageModel* event = + static_cast( + sourceModel())->GetSubModel(index.row()); + + RepeatedStringModel* arguments = event->GetSubModel(Object::EgmEvent::kArgumentsFieldNumber); + + for (int i = 0; i < arguments->rowCount(); ++i) { + arguments_vec.emplace_back(arguments->Data(i).toString().toStdString()); + } + + const Event eventDesc = eventData_->get_event(name, arguments_vec); + + QString group = QString::fromStdString(eventDesc.GroupName()); + QString fullname = QString::fromStdString(eventDesc.HumanName()); + if (eventGroups_.contains(group)) { + //Qt's const fuxing me + //eventGroups_[group] = QPair>(eventGroups_.size(), QSet()); + } + //eventGroups_[group].second.insert(fullname); + + return eventDesc; +} + +QVariant EventsListModel::data(const QModelIndex &index, int role) const { + switch(role) { + case Qt::DisplayRole: { + const Event& event = GetEvent(index); + return QString::fromStdString(event.HumanName()); + } + case Qt::UserRole: { + const Event& event = GetEvent(index); + return QString::fromStdString(event.GroupName()); + } + //case Qt::DecorationRole return QIcon(); + default: return sourceModel()->data(index, role); + } +} + +QModelIndex EventsListModel::index(int row, int column, const QModelIndex &parent) const { + if (!hasIndex(row, column, parent)) + return QModelIndex(); + + //const Event& event = GetEvent(sourceModel()->index(row, column)); + //QString group = QString::fromStdString(event.GroupName()); + + return createIndex(parent.row(), column); +} + +QModelIndex EventsListModel::parent(const QModelIndex& index) const { + QString group = data(index, Qt::UserRole).toString(); + if (!group.isEmpty()) + return createIndex(eventGroups_[group].first, 0); + + return QModelIndex(); +} + +int EventsListModel::rowCount(const QModelIndex &parent) const { + if (parent.column() > 0) + return 0; + + if (!parent.isValid()) + return eventGroups_[data(parent, Qt::UserRole).toString()].second.size(); + + return 0; +} + +int EventsListModel::columnCount(const QModelIndex &parent) const { + return parent.isValid(); +} + +QModelIndex EventsListModel::mapFromSource(const QModelIndex &sourceIndex) const { + QString group = data(sourceIndex, Qt::UserRole).toString(); + return QModelIndex(); // ??? index(eventGroups_[group].first, +} + +QModelIndex EventsListModel::mapToSource(const QModelIndex &proxyIndex) const { + return QModelIndex(); // ??? +} diff --git a/Models/EventsListModel.h b/Models/EventsListModel.h new file mode 100644 index 000000000..5acf2b880 --- /dev/null +++ b/Models/EventsListModel.h @@ -0,0 +1,30 @@ +#ifndef EVENTSLISTSMODEL_H +#define EVENTSLISTSMODEL_H + +#include "event_reader/event_parser.h" + +#include +#include + +class EventsListModel : public QAbstractProxyModel { + private: + EventData* eventData_; + QMap>> eventGroups_; + + public: + EventsListModel(EventData* eventData, QObject* parent = nullptr) : + QAbstractProxyModel(parent), eventData_(eventData) {} + + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override; + QModelIndex parent(const QModelIndex &index) const override; + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + int columnCount(const QModelIndex &parent = QModelIndex()) const override; + QModelIndex mapFromSource(const QModelIndex &sourceIndex) const override; + QModelIndex mapToSource(const QModelIndex &proxyIndex) const override; + + const Event GetEvent(const QModelIndex &index) const; + +}; + +#endif // EVENTSLISTS_H diff --git a/RadialGM.pro b/RadialGM.pro index 934c7703e..385b012fd 100644 --- a/RadialGM.pro +++ b/RadialGM.pro @@ -71,6 +71,7 @@ SOURCES += \ Dialogs/TimelineChangeMoment.cpp \ Editors/ShaderEditor.cpp \ Editors/SpriteEditor.cpp \ + Models/EventsListModel.cpp \ Models/MessageModel.cpp \ Models/RepeatedImageModel.cpp \ Models/RepeatedMessageModel.cpp \ @@ -126,6 +127,7 @@ HEADERS += \ Editors/TimelineEditor.h \ Editors/RoomEditor.h \ Editors/SettingsEditor.h \ + Models/EventsListModel.h \ Models/MessageModel.h \ Models/RepeatedImageModel.h \ Models/RepeatedMessageModel.h \ From 1774a9f8881ded4a29e514e514591e35ad482d39 Mon Sep 17 00:00:00 2001 From: Goombert Date: Mon, 17 Aug 2020 21:11:50 -0400 Subject: [PATCH 02/29] fix events tree parents n stuffs --- Editors/ObjectEditor.cpp | 2 +- Models/EventsListModel.cpp | 117 ++++++++++++++++++++++++++++--------- Models/EventsListModel.h | 17 ++++-- Models/RepeatedModel.h | 4 +- Submodules/enigma-dev | 2 +- 5 files changed, 106 insertions(+), 36 deletions(-) diff --git a/Editors/ObjectEditor.cpp b/Editors/ObjectEditor.cpp index da5f37765..8eabb62d6 100644 --- a/Editors/ObjectEditor.cpp +++ b/Editors/ObjectEditor.cpp @@ -18,7 +18,7 @@ ObjectEditor::~ObjectEditor() { delete _ui; } void ObjectEditor::RebindSubModels() { _objectModel = _model->GetSubModel(TreeNode::kObjectFieldNumber); _eventsModel->setSourceModel(_objectModel->GetSubModel(Object::kEgmEventsFieldNumber)); - _eventsModel->sort(0, Qt::DescendingOrder); + //_eventsModel->sort(0, Qt::DescendingOrder); _ui->eventsList->setModel(_eventsModel); BaseEditor::RebindSubModels(); diff --git a/Models/EventsListModel.cpp b/Models/EventsListModel.cpp index 7efa7f2ba..f81e6e1a0 100644 --- a/Models/EventsListModel.cpp +++ b/Models/EventsListModel.cpp @@ -3,78 +3,139 @@ #include "RepeatedStringModel.h" #include "RepeatedMessageModel.h" -const Event EventsListModel::GetEvent(const QModelIndex &index) const { - std::string name = sourceModel()->data(index, Qt::DisplayRole).toString().toStdString(); +#include + +static inline bool IsEventGroup(const QModelIndex &index) { + if (!index.isValid()) return true; // << invisible root is a group + if (!index.parent().isValid()) return true; // << root immediate children are groups + return false; // << regular events have valid parents & grandparents +} + +Event EventsListModel::GetEvent(const QModelIndex &index) const { + auto sourceIndex = sourceModel()->index(index.row(), Object::EgmEvent::kIdFieldNumber); + std::string name = sourceModel()->data(sourceIndex, + Qt::DisplayRole).toString().toStdString(); std::vector arguments_vec; MessageModel* event = static_cast( sourceModel())->GetSubModel(index.row()); - RepeatedStringModel* arguments = event->GetSubModel(Object::EgmEvent::kArgumentsFieldNumber); + RepeatedStringModel* arguments = event->GetSubModel( + Object::EgmEvent::kArgumentsFieldNumber); for (int i = 0; i < arguments->rowCount(); ++i) { arguments_vec.emplace_back(arguments->Data(i).toString().toStdString()); } - const Event eventDesc = eventData_->get_event(name, arguments_vec); + Event eventDesc = eventData_->get_event(name, arguments_vec); - QString group = QString::fromStdString(eventDesc.GroupName()); + QString group = QString::fromStdString(eventDesc.bare_id()); QString fullname = QString::fromStdString(eventDesc.HumanName()); - if (eventGroups_.contains(group)) { + //if (eventGroups_.contains(group)) { //Qt's const fuxing me //eventGroups_[group] = QPair>(eventGroups_.size(), QSet()); - } + //} //eventGroups_[group].second.insert(fullname); return eventDesc; } -QVariant EventsListModel::data(const QModelIndex &index, int role) const { - switch(role) { - case Qt::DisplayRole: { - const Event& event = GetEvent(index); - return QString::fromStdString(event.HumanName()); +EventsListModel::EventsListModel(EventData* eventData, QObject* parent) : + QAbstractProxyModel(parent), eventData_(eventData) { +} + +void EventsListModel::setSourceModel(QAbstractItemModel* model) { + QAbstractProxyModel::setSourceModel(model); + int group = 0; + auto lastEvent = GetEvent(createIndex(0,0)); + groupRowStart[group] = 0; + groupRowCount[group]++; + for (int i = 1; i < sourceModel()->rowCount(QModelIndex()); ++i) { + auto event = GetEvent(createIndex(i,0)); + if (event.bare_id() != lastEvent.bare_id()) { + lastEvent = event; + groupRowStart[++group] = i; } - case Qt::UserRole: { - const Event& event = GetEvent(index); - return QString::fromStdString(event.GroupName()); + ++groupRowCount[group]; + } + qDebug() << groupRowStart << groupRowCount; +} + +QVariant EventsListModel::headerData(int section, Qt::Orientation /*orientation*/, int role) const { + if (role != Qt::DisplayRole || section > 0) return QVariant(); + return tr("Events"); +} + +QVariant EventsListModel::data(const QModelIndex &index, int role) const { + if (role != Qt::DisplayRole && role != Qt::DecorationRole) return QVariant(); + if (!index.isValid()) return QVariant(); // << invisible root + + if (IsEventGroup(index)) { // << group node + auto sourceStart = groupRowStart[index.row()]; + Event event = GetEvent(createIndex(sourceStart,0)); + auto rowCount = groupRowCount[index.row()]; + if (rowCount > 1) { + if (role == Qt::DecorationRole) + return QIcon(":/events/" + QString::fromStdString(event.bare_id()).toLower() + "-folder.png"); + return QString::fromStdString(event.bare_id()); } - //case Qt::DecorationRole return QIcon(); - default: return sourceModel()->data(index, role); + if (role == Qt::DecorationRole) + return QIcon(":/events/" + QString::fromStdString(event.bare_id()).toLower() + ".png"); + return QString::fromStdString(event.HumanName()); + } else { // << regular event node + auto sourceStart = index.internalId()-1+index.row(); + Event event = GetEvent(createIndex(sourceStart,0)); + if (role == Qt::DecorationRole) + return QIcon(":/events/" + QString::fromStdString(event.bare_id()).toLower() + ".png"); + return QString::fromStdString(event.HumanName()); } + + return QVariant(); // << unknown } QModelIndex EventsListModel::index(int row, int column, const QModelIndex &parent) const { if (!hasIndex(row, column, parent)) return QModelIndex(); - //const Event& event = GetEvent(sourceModel()->index(row, column)); - //QString group = QString::fromStdString(event.GroupName()); + if (!parent.isValid()) // << group + createIndex(row, column); - return createIndex(parent.row(), column); + return createIndex(row, column, parent.row()+1); } QModelIndex EventsListModel::parent(const QModelIndex& index) const { - QString group = data(index, Qt::UserRole).toString(); - if (!group.isEmpty()) - return createIndex(eventGroups_[group].first, 0); + //QString group = data(index, Qt::UserRole).toString(); + + if (index.internalId()) { // << regular event + auto parentRow = index.internalId()-1; + return createIndex(parentRow, 0); + } return QModelIndex(); } int EventsListModel::rowCount(const QModelIndex &parent) const { - if (parent.column() > 0) - return 0; + if (parent.column() > 0) return 0; - if (!parent.isValid()) - return eventGroups_[data(parent, Qt::UserRole).toString()].second.size(); + if (!parent.isValid()) return groupRowStart.size(); + if (parent.parent().isValid()) return 0; + auto rows = groupRowCount[parent.row()]; + if (rows > 1) return rows; return 0; } int EventsListModel::columnCount(const QModelIndex &parent) const { - return parent.isValid(); + return 1; +} + +Qt::ItemFlags EventsListModel::flags(const QModelIndex &index) const { + Qt::ItemFlags itemFlags = QAbstractItemModel::flags(index); + auto rows = rowCount(index); + if (rows > 0) + itemFlags.setFlag(Qt::ItemIsSelectable, false); + return itemFlags; } QModelIndex EventsListModel::mapFromSource(const QModelIndex &sourceIndex) const { diff --git a/Models/EventsListModel.h b/Models/EventsListModel.h index 5acf2b880..45b3fcd82 100644 --- a/Models/EventsListModel.h +++ b/Models/EventsListModel.h @@ -3,27 +3,36 @@ #include "event_reader/event_parser.h" +#include "RepeatedMessageModel.h" + #include #include class EventsListModel : public QAbstractProxyModel { private: EventData* eventData_; - QMap>> eventGroups_; + + QMap groupRowStart; + QMap groupRowCount; public: - EventsListModel(EventData* eventData, QObject* parent = nullptr) : - QAbstractProxyModel(parent), eventData_(eventData) {} + EventsListModel(EventData* eventData, QObject* parent = nullptr); + Qt::ItemFlags flags(const QModelIndex &index) const override; + void setSourceModel(QAbstractItemModel* model) override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override; QModelIndex parent(const QModelIndex &index) const override; int rowCount(const QModelIndex &parent = QModelIndex()) const override; + bool hasChildren(const QModelIndex &parent = QModelIndex()) const override { + return rowCount(parent) > 0; + } int columnCount(const QModelIndex &parent = QModelIndex()) const override; QModelIndex mapFromSource(const QModelIndex &sourceIndex) const override; QModelIndex mapToSource(const QModelIndex &proxyIndex) const override; - const Event GetEvent(const QModelIndex &index) const; + Event GetEvent(const QModelIndex &index) const; }; diff --git a/Models/RepeatedModel.h b/Models/RepeatedModel.h index 8cfab7a07..9feb50572 100644 --- a/Models/RepeatedModel.h +++ b/Models/RepeatedModel.h @@ -69,11 +69,11 @@ class RepeatedModel : public ProtoModel { } virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override { - if (section == 0 || role != Qt::DisplayRole || orientation != Qt::Orientation::Horizontal) return QVariant(); + if (section < 1 || role != Qt::DisplayRole || orientation != Qt::Orientation::Horizontal) return QVariant(); return QString::fromStdString(_field->message_type()->field(section - 1)->name()); } - // Convience function for internal moves + // Convenience function for internal moves bool moveRows(int source, int count, int destination) { return moveRows(QModelIndex(), source, count, QModelIndex(), destination); } diff --git a/Submodules/enigma-dev b/Submodules/enigma-dev index 2e697aa79..4e1cb8d85 160000 --- a/Submodules/enigma-dev +++ b/Submodules/enigma-dev @@ -1 +1 @@ -Subproject commit 2e697aa79c921eab6a3d3dbfdcf597449fc03e2a +Subproject commit 4e1cb8d85e1ff45969f74a02dcf94d51f06beb1b From 2735ed5b530de9e456f6e257796b4bd1c55cd8b5 Mon Sep 17 00:00:00 2001 From: Goombert Date: Mon, 17 Aug 2020 21:33:19 -0400 Subject: [PATCH 03/29] oopsie --- Models/EventsListModel.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Models/EventsListModel.cpp b/Models/EventsListModel.cpp index f81e6e1a0..77efc3bec 100644 --- a/Models/EventsListModel.cpp +++ b/Models/EventsListModel.cpp @@ -84,7 +84,8 @@ QVariant EventsListModel::data(const QModelIndex &index, int role) const { return QIcon(":/events/" + QString::fromStdString(event.bare_id()).toLower() + ".png"); return QString::fromStdString(event.HumanName()); } else { // << regular event node - auto sourceStart = index.internalId()-1+index.row(); + auto parentRow = index.internalId()-1; + auto sourceStart = groupRowStart[parentRow]+index.row(); Event event = GetEvent(createIndex(sourceStart,0)); if (role == Qt::DecorationRole) return QIcon(":/events/" + QString::fromStdString(event.bare_id()).toLower() + ".png"); From ff34f35335f26baa24c4ffeb57afd7f87f717a9f Mon Sep 17 00:00:00 2001 From: Goombert Date: Mon, 17 Aug 2020 21:57:23 -0400 Subject: [PATCH 04/29] clean up events other icon --- Models/EventsListModel.cpp | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/Models/EventsListModel.cpp b/Models/EventsListModel.cpp index 77efc3bec..fddfc946f 100644 --- a/Models/EventsListModel.cpp +++ b/Models/EventsListModel.cpp @@ -71,24 +71,27 @@ QVariant EventsListModel::data(const QModelIndex &index, int role) const { if (role != Qt::DisplayRole && role != Qt::DecorationRole) return QVariant(); if (!index.isValid()) return QVariant(); // << invisible root + size_t sourceStart = 0; + size_t rowCount = 0; if (IsEventGroup(index)) { // << group node - auto sourceStart = groupRowStart[index.row()]; - Event event = GetEvent(createIndex(sourceStart,0)); - auto rowCount = groupRowCount[index.row()]; - if (rowCount > 1) { - if (role == Qt::DecorationRole) - return QIcon(":/events/" + QString::fromStdString(event.bare_id()).toLower() + "-folder.png"); - return QString::fromStdString(event.bare_id()); - } - if (role == Qt::DecorationRole) - return QIcon(":/events/" + QString::fromStdString(event.bare_id()).toLower() + ".png"); - return QString::fromStdString(event.HumanName()); + sourceStart = groupRowStart[index.row()]; + rowCount = groupRowCount[index.row()]; } else { // << regular event node auto parentRow = index.internalId()-1; - auto sourceStart = groupRowStart[parentRow]+index.row(); - Event event = GetEvent(createIndex(sourceStart,0)); - if (role == Qt::DecorationRole) - return QIcon(":/events/" + QString::fromStdString(event.bare_id()).toLower() + ".png"); + sourceStart = groupRowStart[parentRow]+index.row(); + } + + Event event = GetEvent(createIndex(sourceStart,0)); + + if (role == Qt::DecorationRole) { + auto suffix = (rowCount > 1) ? "-folder.png" : ".png"; + auto icon = QIcon(":/events/" + QString::fromStdString(event.bare_id()).toLower() + suffix); + if (!icon.availableSizes().empty()) return icon; + icon = QIcon(":/events/other.png"); + if (!icon.availableSizes().empty()) return icon; + // shit out of luck... return invalid QVariant + } else { + if (rowCount > 1) return QString::fromStdString(event.bare_id()); return QString::fromStdString(event.HumanName()); } From 75d464fd959bfc4116702c29d697d373acb593f3 Mon Sep 17 00:00:00 2001 From: Goombert Date: Mon, 17 Aug 2020 22:08:13 -0400 Subject: [PATCH 05/29] rename key press/release icons to match events.ey event name --- .../{key-press-folder.png => keypressed-folder.png} | Bin Images/events/{key-press.png => keypressed.png} | Bin ...ey-release-folder.png => keyreleased-folder.png} | Bin Images/events/{key-release.png => keyreleased.png} | Bin images.qrc | 8 ++++---- 5 files changed, 4 insertions(+), 4 deletions(-) rename Images/events/{key-press-folder.png => keypressed-folder.png} (100%) rename Images/events/{key-press.png => keypressed.png} (100%) rename Images/events/{key-release-folder.png => keyreleased-folder.png} (100%) rename Images/events/{key-release.png => keyreleased.png} (100%) diff --git a/Images/events/key-press-folder.png b/Images/events/keypressed-folder.png similarity index 100% rename from Images/events/key-press-folder.png rename to Images/events/keypressed-folder.png diff --git a/Images/events/key-press.png b/Images/events/keypressed.png similarity index 100% rename from Images/events/key-press.png rename to Images/events/keypressed.png diff --git a/Images/events/key-release-folder.png b/Images/events/keyreleased-folder.png similarity index 100% rename from Images/events/key-release-folder.png rename to Images/events/keyreleased-folder.png diff --git a/Images/events/key-release.png b/Images/events/keyreleased.png similarity index 100% rename from Images/events/key-release.png rename to Images/events/keyreleased.png diff --git a/images.qrc b/images.qrc index f2485c3b3..1255eb416 100644 --- a/images.qrc +++ b/images.qrc @@ -85,16 +85,16 @@ Images/events/event.png Images/events/keyboard.png Images/events/keyboard-folder.png - Images/events/key-press.png - Images/events/key-press-folder.png - Images/events/key-release.png - Images/events/key-release-folder.png Images/events/mouse.png Images/events/mouse-folder.png Images/events/other.png Images/events/other-folder.png Images/events/step.png Images/events/step-folder.png + Images/events/keypressed.png + Images/events/keypressed-folder.png + Images/events/keyreleased.png + Images/events/keyreleased-folder.png Images/banner.png From c2f898f057938f16347026f2f8875999a969dc5c Mon Sep 17 00:00:00 2001 From: Greg Williamson Date: Tue, 18 Aug 2020 03:20:50 -0400 Subject: [PATCH 06/29] new ui --- Editors/ObjectEditor.ui | 793 +++++++++++++++++++--------------------- 1 file changed, 377 insertions(+), 416 deletions(-) diff --git a/Editors/ObjectEditor.ui b/Editors/ObjectEditor.ui index 1346cc340..de58972f1 100644 --- a/Editors/ObjectEditor.ui +++ b/Editors/ObjectEditor.ui @@ -6,8 +6,8 @@ 0 0 - 669 - 310 + 353 + 473 @@ -23,13 +23,7 @@ :/resources/object.png:/resources/object.png - - - 4 - - - QLayout::SetDefaultConstraint - + 2 @@ -43,453 +37,420 @@ 2 - - - 4 - - - QLayout::SetDefaultConstraint - - - 4 - - - 4 - - + + 0 - - 4 - - - - - 4 + + + Events + + + + 2 - - - - obj_0 - - - - - - - Qt::LeftToRight - - - Name - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - QComboBox::AdjustToContentsOnFirstShow - - - - <same as sprite> + + 2 + + + 2 + + + 2 + + + + + + 0 - - - - - - - - 0 - 0 - - - - true - - - QComboBox::AdjustToContentsOnFirstShow - - - true - - - - <no parent> + + 0 - - - - - - - - <no sprite> + + 0 - - - - - - - true - - - - 0 - 0 - - - - Add a new sprite or edit the selected mask - - - Mask - - - - :/actions/add.png:/actions/add.png - - - QToolButton::DelayedPopup - - - Qt::ToolButtonTextBesideIcon - - - Qt::NoArrow - - - - - - - - 0 - 0 - - - - Add a new sprite or edit the selected one - - - Sprite - - - - :/actions/add.png:/actions/add.png - - - Qt::ToolButtonTextBesideIcon - - - - - - - - 0 - 0 - - - - Add a new object as parent or edit the selected one - - - Parent - - - - :/actions/add.png:/actions/add.png - - - QToolButton::DelayedPopup - - - Qt::ToolButtonTextBesideIcon - - - - - - - Depth - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - + + 0 + + + + + Event + + + + + + + + + + + 0 + 0 + + + + Add Event + + + Add Event + + + + :/actions/add.png:/actions/add.png + + + false + + + false + + + QToolButton::MenuButtonPopup + + + + + + + Change Moment + + + Change Moment + + + + :/events/event.png:/events/event.png + + + + + + + + 0 + 0 + + + + Delete Event + + + Delete Event + + + + :/actions/delete.png:/actions/delete.png + + + false + + + Qt::ToolButtonIconOnly + + + Qt::NoArrow + + + + + + + + 0 + 0 + + + + Undo + + + Undo + + + + :/actions/undo.png:/actions/undo.png + + + + - - + + - + 0 0 - - - - - - - - QLayout::SetDefaultConstraint - - - 4 - - - - - Persistent - - - - - - - Solid - - - - - - - Visible + + false - - - - - Qt::Vertical + + + + Properties + + + + 2 - - QSizePolicy::Expanding + + 2 - - - 20 - 40 - + + 2 - - - - - - Save - - - - :/actions/accept.png:/actions/accept.png - - - true - - - - - - - - - 4 - - - 4 - - - 4 - - - 4 - - - - - 4 + + 2 - - - - 0 - 0 - - - - Add Event - - - Add Event - - - - :/actions/add.png:/actions/add.png - - - false - - - false - - - QToolButton::MenuButtonPopup - + + + + + + Qt::LeftToRight + + + Name + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + obj_0 + + + + + + + Depth + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + - - - - 0 - 0 - - - - Change Event - - - Change Event - - - - :/events/event.png:/events/event.png - - - true - + + + + + + + 0 + 0 + + + + Add a new sprite or edit the selected one + + + Sprite + + + + :/actions/add.png:/actions/add.png + + + Qt::ToolButtonTextBesideIcon + + + + + + + + <no sprite> + + + + + + + + + 0 + 0 + + + + Add a new object as parent or edit the selected one + + + Parent + + + + :/actions/add.png:/actions/add.png + + + QToolButton::DelayedPopup + + + Qt::ToolButtonTextBesideIcon + + + + + + + + 0 + 0 + + + + true + + + QComboBox::AdjustToContentsOnFirstShow + + + true + + + + <no parent> + + + + + + + + true + + + + 0 + 0 + + + + Add a new sprite or edit the selected mask + + + Mask + + + + :/actions/add.png:/actions/add.png + + + QToolButton::DelayedPopup + + + Qt::ToolButtonTextBesideIcon + + + Qt::NoArrow + + + + + + + + 0 + 0 + + + + QComboBox::AdjustToContentsOnFirstShow + + + + <same as sprite> + + + + + - - - - 0 - 0 - - - - Create Event - - - - :/events/create.png:/events/create.png - - - QToolButton::MenuButtonPopup - - - Qt::ToolButtonTextBesideIcon - - - - - - - - 0 - 0 - - - - Delete Event - - - Delete Event - - - - :/actions/delete.png:/actions/delete.png - - - false - - - Qt::ToolButtonIconOnly - - - Qt::NoArrow - - - - - - - - 0 - 0 - - - - Undo - - - Undo - - - - :/actions/undo.png:/actions/undo.png - + + + + + + Solid + + + + + + + Visible + + + + + + + Persistent + + + + - + - Qt::Horizontal + Qt::Vertical - 40 - 20 + 20 + 137 - - - - Edit Event - - - Edit Event - - - - :/actions/edit.png:/actions/edit.png - - - - - - - - - 0 - 0 - - - - false - - - - + + + + + + + Save + + + + :/actions/accept.png:/actions/accept.png + + + true + + From 4d0f95d2ac564ea95462b323ea303f62391dc2d9 Mon Sep 17 00:00:00 2001 From: Greg Williamson Date: Wed, 19 Aug 2020 06:27:47 -0400 Subject: [PATCH 07/29] gut roberts code --- Editors/ObjectEditor.ui | 11 +++-- Models/EventsListModel.cpp | 97 +++++++++++++------------------------- Models/EventsListModel.h | 10 ++-- 3 files changed, 46 insertions(+), 72 deletions(-) diff --git a/Editors/ObjectEditor.ui b/Editors/ObjectEditor.ui index de58972f1..c517032d5 100644 --- a/Editors/ObjectEditor.ui +++ b/Editors/ObjectEditor.ui @@ -59,7 +59,7 @@ 2 - + 0 @@ -189,6 +189,9 @@ false + + true + @@ -211,7 +214,7 @@ 2 - + @@ -257,7 +260,7 @@ - + @@ -395,7 +398,7 @@ - + diff --git a/Models/EventsListModel.cpp b/Models/EventsListModel.cpp index fddfc946f..84d5f51df 100644 --- a/Models/EventsListModel.cpp +++ b/Models/EventsListModel.cpp @@ -28,17 +28,7 @@ Event EventsListModel::GetEvent(const QModelIndex &index) const { arguments_vec.emplace_back(arguments->Data(i).toString().toStdString()); } - Event eventDesc = eventData_->get_event(name, arguments_vec); - - QString group = QString::fromStdString(eventDesc.bare_id()); - QString fullname = QString::fromStdString(eventDesc.HumanName()); - //if (eventGroups_.contains(group)) { - //Qt's const fuxing me - //eventGroups_[group] = QPair>(eventGroups_.size(), QSet()); - //} - //eventGroups_[group].second.insert(fullname); - - return eventDesc; + return eventData_->get_event(name, arguments_vec); } EventsListModel::EventsListModel(EventData* eventData, QObject* parent) : @@ -47,19 +37,33 @@ EventsListModel::EventsListModel(EventData* eventData, QObject* parent) : void EventsListModel::setSourceModel(QAbstractItemModel* model) { QAbstractProxyModel::setSourceModel(model); - int group = 0; - auto lastEvent = GetEvent(createIndex(0,0)); - groupRowStart[group] = 0; - groupRowCount[group]++; - for (int i = 1; i < sourceModel()->rowCount(QModelIndex()); ++i) { - auto event = GetEvent(createIndex(i,0)); - if (event.bare_id() != lastEvent.bare_id()) { - lastEvent = event; - groupRowStart[++group] = i; + + // For each event in source model + for (int i = 0; i < sourceModel()->rowCount(QModelIndex()); ++i) { + // Get the event info from the source model + const Event& event = GetEvent(createIndex(i, 0)); + QString group = QString::fromStdString(event.bare_id()); + + // Look for a group matching the current event + int groupIndex = 0; + for (auto& idx : modelEvents_) { + if (idx.first == group) { + break; + } + groupIndex++; + } + + // If no matching group found add one + if (groupIndex >= modelEvents_.size()) { + groupIndex = modelEvents_.size(); + modelEvents_.push_back({ group, {} }); + // Store the position of the group in the vector in a map for quick lookups + groupIDs_[group] = groupIndex; } - ++groupRowCount[group]; + + // Add the event to the group we found or added above + modelEvents_[groupIndex].second.push_back(QString::fromStdString(event.HumanName())); } - qDebug() << groupRowStart << groupRowCount; } QVariant EventsListModel::headerData(int section, Qt::Orientation /*orientation*/, int role) const { @@ -68,65 +72,28 @@ QVariant EventsListModel::headerData(int section, Qt::Orientation /*orientation* } QVariant EventsListModel::data(const QModelIndex &index, int role) const { - if (role != Qt::DisplayRole && role != Qt::DecorationRole) return QVariant(); + if (role != Qt::DisplayRole /*&& role != Qt::DecorationRole*/) return QVariant(); if (!index.isValid()) return QVariant(); // << invisible root - size_t sourceStart = 0; - size_t rowCount = 0; - if (IsEventGroup(index)) { // << group node - sourceStart = groupRowStart[index.row()]; - rowCount = groupRowCount[index.row()]; - } else { // << regular event node - auto parentRow = index.internalId()-1; - sourceStart = groupRowStart[parentRow]+index.row(); - } - - Event event = GetEvent(createIndex(sourceStart,0)); - - if (role == Qt::DecorationRole) { - auto suffix = (rowCount > 1) ? "-folder.png" : ".png"; - auto icon = QIcon(":/events/" + QString::fromStdString(event.bare_id()).toLower() + suffix); - if (!icon.availableSizes().empty()) return icon; - icon = QIcon(":/events/other.png"); - if (!icon.availableSizes().empty()) return icon; - // shit out of luck... return invalid QVariant - } else { - if (rowCount > 1) return QString::fromStdString(event.bare_id()); - return QString::fromStdString(event.HumanName()); - } - - return QVariant(); // << unknown + qDebug() << index.row() << "," << index.column() << Qt::endl; + //return modelEvents_[index.row()].second[index.column()]; } QModelIndex EventsListModel::index(int row, int column, const QModelIndex &parent) const { if (!hasIndex(row, column, parent)) return QModelIndex(); - if (!parent.isValid()) // << group - createIndex(row, column); + //if (!parent.isValid()) // << group + //createIndex(row, column); - return createIndex(row, column, parent.row()+1); + return createIndex(row, column); } QModelIndex EventsListModel::parent(const QModelIndex& index) const { - //QString group = data(index, Qt::UserRole).toString(); - - if (index.internalId()) { // << regular event - auto parentRow = index.internalId()-1; - return createIndex(parentRow, 0); - } - return QModelIndex(); } int EventsListModel::rowCount(const QModelIndex &parent) const { - if (parent.column() > 0) return 0; - - if (!parent.isValid()) return groupRowStart.size(); - if (parent.parent().isValid()) return 0; - - auto rows = groupRowCount[parent.row()]; - if (rows > 1) return rows; return 0; } diff --git a/Models/EventsListModel.h b/Models/EventsListModel.h index 45b3fcd82..9e763ad89 100644 --- a/Models/EventsListModel.h +++ b/Models/EventsListModel.h @@ -10,10 +10,14 @@ class EventsListModel : public QAbstractProxyModel { private: - EventData* eventData_; + EventData* eventData_; + + // group name, vector + // In vector so we can access group & events by positions in vectors + QVector>> modelEvents_; + // Store groups position in vector for fast look up + QMap groupIDs_; - QMap groupRowStart; - QMap groupRowCount; public: EventsListModel(EventData* eventData, QObject* parent = nullptr); From 95ed18e07421b55cc7b30ea02cc75a9703169f91 Mon Sep 17 00:00:00 2001 From: Greg Williamson Date: Wed, 19 Aug 2020 19:38:12 -0400 Subject: [PATCH 08/29] still fuxed --- Models/EventsListModel.cpp | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/Models/EventsListModel.cpp b/Models/EventsListModel.cpp index 84d5f51df..474f018e4 100644 --- a/Models/EventsListModel.cpp +++ b/Models/EventsListModel.cpp @@ -4,6 +4,7 @@ #include "RepeatedMessageModel.h" #include +#include static inline bool IsEventGroup(const QModelIndex &index) { if (!index.isValid()) return true; // << invisible root is a group @@ -64,6 +65,13 @@ void EventsListModel::setSourceModel(QAbstractItemModel* model) { // Add the event to the group we found or added above modelEvents_[groupIndex].second.push_back(QString::fromStdString(event.HumanName())); } + + for (const auto& group : modelEvents_) { + std::cout << "Group: " << group.first.toStdString() << std::endl; + for (const auto& event : group.second) { + std::cout << " event: " << event.toStdString() << std::endl; + } + } } QVariant EventsListModel::headerData(int section, Qt::Orientation /*orientation*/, int role) const { @@ -75,8 +83,13 @@ QVariant EventsListModel::data(const QModelIndex &index, int role) const { if (role != Qt::DisplayRole /*&& role != Qt::DecorationRole*/) return QVariant(); if (!index.isValid()) return QVariant(); // << invisible root - qDebug() << index.row() << "," << index.column() << Qt::endl; - //return modelEvents_[index.row()].second[index.column()]; + /*if (index.internalId() == -1) + return modelEvents_[index.row()].first; + else if (modelEvents_[index.internalId()].second.size() > 1) + return modelEvents_[index.internalId()].first; + else + return modelEvents_[index.internalId()].second[index.column()];*/ + return "ugh"; } QModelIndex EventsListModel::index(int row, int column, const QModelIndex &parent) const { @@ -84,16 +97,23 @@ QModelIndex EventsListModel::index(int row, int column, const QModelIndex &paren return QModelIndex(); //if (!parent.isValid()) // << group - //createIndex(row, column); + //createIndex(row, column, -1); - return createIndex(row, column); + return createIndex(row, column, parent.row()); } QModelIndex EventsListModel::parent(const QModelIndex& index) const { + if (modelEvents_.size() > index.row() && modelEvents_[index.row()].second.size() > 1) { + return createIndex(index.row(), 0); + } return QModelIndex(); } int EventsListModel::rowCount(const QModelIndex &parent) const { + //qDebug() << parent.internalId() << Qt::endl; + if (!parent.isValid()) { + return modelEvents_[parent.internalId()].second.size(); + } return 0; } From fba3d34bfa298ca24ba6711eb53e115bbbcd7f66 Mon Sep 17 00:00:00 2001 From: Greg Williamson Date: Thu, 20 Aug 2020 02:58:06 -0400 Subject: [PATCH 09/29] robert quit hidin pls --- Models/EventsListModel.cpp | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/Models/EventsListModel.cpp b/Models/EventsListModel.cpp index 474f018e4..d8673ed2c 100644 --- a/Models/EventsListModel.cpp +++ b/Models/EventsListModel.cpp @@ -83,37 +83,45 @@ QVariant EventsListModel::data(const QModelIndex &index, int role) const { if (role != Qt::DisplayRole /*&& role != Qt::DecorationRole*/) return QVariant(); if (!index.isValid()) return QVariant(); // << invisible root - /*if (index.internalId() == -1) + if (index.internalId() == -1) return modelEvents_[index.row()].first; else if (modelEvents_[index.internalId()].second.size() > 1) return modelEvents_[index.internalId()].first; else - return modelEvents_[index.internalId()].second[index.column()];*/ - return "ugh"; + return modelEvents_[index.internalId()].second[index.column()]; } QModelIndex EventsListModel::index(int row, int column, const QModelIndex &parent) const { if (!hasIndex(row, column, parent)) return QModelIndex(); - //if (!parent.isValid()) // << group - //createIndex(row, column, -1); + if (!parent.isValid()) // << group + createIndex(row, column, -1); return createIndex(row, column, parent.row()); } QModelIndex EventsListModel::parent(const QModelIndex& index) const { + if (!index.isValid()) + return QModelIndex(); + if (modelEvents_.size() > index.row() && modelEvents_[index.row()].second.size() > 1) { - return createIndex(index.row(), 0); + return createIndex(index.row(), 0, -1); } + return QModelIndex(); } int EventsListModel::rowCount(const QModelIndex &parent) const { + if (parent.column() > 0) + return 0; + //qDebug() << parent.internalId() << Qt::endl; - if (!parent.isValid()) { + if (!parent.isValid()) + return modelEvents_.size(); + + if (parent.internalId() != -1) return modelEvents_[parent.internalId()].second.size(); - } return 0; } From 84646f09291f24386e008778c86da9a0341b53ec Mon Sep 17 00:00:00 2001 From: Greg Williamson Date: Fri, 21 Aug 2020 07:29:17 -0400 Subject: [PATCH 10/29] start stacked code editor --- Editors/ObjectEditor.cpp | 103 +++++++++++++++++++++++++++++++-- Editors/ObjectEditor.h | 12 +++- Editors/ObjectEditor.ui | 25 ++------ Models/EventsListModel.cpp | 113 ++++++++----------------------------- Models/EventsListModel.h | 16 +----- Models/RepeatedModel.h | 3 +- 6 files changed, 141 insertions(+), 131 deletions(-) diff --git a/Editors/ObjectEditor.cpp b/Editors/ObjectEditor.cpp index 8eabb62d6..9f7218b96 100644 --- a/Editors/ObjectEditor.cpp +++ b/Editors/ObjectEditor.cpp @@ -1,11 +1,47 @@ #include "Models/RepeatedMessageModel.h" +#include "Models/RepeatedStringModel.h" #include "ObjectEditor.h" #include "MainWindow.h" #include "ui_ObjectEditor.h" -ObjectEditor::ObjectEditor(MessageModel* model, QWidget* parent) : BaseEditor(model, parent), _ui(new Ui::ObjectEditor) { - _ui->setupUi(this); +#include +#include + +ObjectEditor::ObjectEditor(MessageModel* model, QWidget* parent) : BaseEditor(model, parent), + _ui(new Ui::ObjectEditor), + _codeEditor(new CodeEditor(this, true)) +{ + + QLayout* layout = new QVBoxLayout(this); + QSplitter* splitter = new QSplitter(this); + + QWidget* eventsWidget = new QWidget(this); + _ui->setupUi(eventsWidget); + + _nodeMapper->addMapping(_ui->nameEdit, TreeNode::kNameFieldNumber); + + connect(_ui->saveButton, &QAbstractButton::pressed, this, &BaseEditor::OnSave); + + splitter->addWidget(eventsWidget); + splitter->addWidget(_codeEditor); + + layout->addWidget(splitter); + + layout->setMargin(0); + setLayout(layout); + + // Prefer resizing the code editor over the moments editor + splitter->setStretchFactor(0, 0); + splitter->setStretchFactor(1, 1); + + // Tell frankensteined widget to resize to proper size + resize(_codeEditor->geometry().width() + eventsWidget->geometry().width(), _codeEditor->geometry().height()); + connect(_ui->eventsList, &QAbstractItemView::clicked, [=](const QModelIndex& index) { + SetCurrentEditor(index.row()); + //_ui->stepBox->setValue(_momentsModel->Data(index.row(), Timeline::Moment::kStepFieldNumber).toInt()); + }); + connect(_ui->saveButton, &QAbstractButton::pressed, this, &BaseEditor::OnSave); _eventsModel = new EventsListModel(MainWindow::GetEventData(), this); @@ -18,8 +54,67 @@ ObjectEditor::~ObjectEditor() { delete _ui; } void ObjectEditor::RebindSubModels() { _objectModel = _model->GetSubModel(TreeNode::kObjectFieldNumber); _eventsModel->setSourceModel(_objectModel->GetSubModel(Object::kEgmEventsFieldNumber)); - //_eventsModel->sort(0, Qt::DescendingOrder); - _ui->eventsList->setModel(_eventsModel); + + QSortFilterProxyModel* sortedEvents = new QSortFilterProxyModel(_eventsModel); + sortedEvents->setSourceModel(_eventsModel); + sortedEvents->sort(0); + _ui->eventsList->setModel(sortedEvents); + + for (int event = 0; event < _eventsModel->rowCount(); ++event) { + BindEventEditor(event); + } BaseEditor::RebindSubModels(); } + +void ObjectEditor::CheckDisableButtons(int value) { + +} + +void ObjectEditor::AddEvent(Object::EgmEvent event) { + RepeatedMessageModel* eventsModel = _objectModel->GetSubModel(Object::kEgmEventsFieldNumber); + int idx = eventsModel->rowCount(); + bool insert = eventsModel->insertRow(idx); + if (insert) { ChangeEvent(idx, event); } +} + +void ObjectEditor::ChangeEvent(int idx, Object::EgmEvent event) { + RepeatedMessageModel* eventsModel = _objectModel->GetSubModel(Object::kEgmEventsFieldNumber); + + eventsModel->SetData(QString::fromStdString(event.id()), idx, Object::EgmEvent::kIdFieldNumber); + eventsModel->SetData(QString::fromStdString(event.code()), idx, Object::EgmEvent::kCodeFieldNumber); + + RepeatedStringModel* argsModel = + eventsModel->GetSubModel(idx) + ->GetSubModel(Object::EgmEvent::kArgumentsFieldNumber); + + size_t argc = 0; + argsModel->removeRows(0, argsModel->rowCount()); // clear old arguments + argsModel->insertRows(argsModel->rowCount(), event.arguments_size()); + for (const auto& arg : event.arguments()) { + argsModel->SetData(QString::fromStdString(arg), argc++); + } +} + +void ObjectEditor::RemoveEvent(int idx) { + RepeatedMessageModel* eventsModel = _objectModel->GetSubModel(Object::kEgmEventsFieldNumber); + eventsModel->removeRow(idx); +} + +int ObjectEditor::IndexOf(Object::EgmEvent event) { + return -1; +} + +void ObjectEditor::BindEventEditor(int idx) { + RepeatedMessageModel* eventsModel = _objectModel->GetSubModel(Object::kEgmEventsFieldNumber); + CodeWidget* codeWidget = _codeEditor->AddCodeWidget(); + ModelMapper* mapper(new ModelMapper(eventsModel->GetSubModel(idx), this)); + mapper->addMapping(codeWidget, Object::EgmEvent::kCodeFieldNumber); + mapper->toFirst(); +} + +void ObjectEditor::SetCurrentEditor(int idx) { + _codeEditor->SetCurrentIndex(idx); + /*_ui->momentsList->selectionModel()->select(_momentsModel->index(modelIndex, Timeline::Moment::kStepFieldNumber), + QItemSelectionModel::QItemSelectionModel::ClearAndSelec*/ +} diff --git a/Editors/ObjectEditor.h b/Editors/ObjectEditor.h index a4cb27e43..480138212 100644 --- a/Editors/ObjectEditor.h +++ b/Editors/ObjectEditor.h @@ -2,7 +2,8 @@ #define OBJECTEDITOR_H #include "BaseEditor.h" - +#include "CodeEditor.h" +#include "Object.pb.h" #include "Models/EventsListModel.h" namespace Ui { @@ -20,9 +21,18 @@ class ObjectEditor : public BaseEditor { void RebindSubModels() override; private: + void CheckDisableButtons(int value); + void AddEvent(Object::EgmEvent event); + void ChangeEvent(int idx, Object::EgmEvent event); + void RemoveEvent(int idx); + int IndexOf(Object::EgmEvent event); + void BindEventEditor(int idx); + void SetCurrentEditor(int idx); + Ui::ObjectEditor* _ui; MessageModel* _objectModel = nullptr; EventsListModel* _eventsModel = nullptr; + CodeEditor* _codeEditor; }; #endif // OBJECTEDITOR_H diff --git a/Editors/ObjectEditor.ui b/Editors/ObjectEditor.ui index c517032d5..7af5747e0 100644 --- a/Editors/ObjectEditor.ui +++ b/Editors/ObjectEditor.ui @@ -6,7 +6,7 @@ 0 0 - 353 + 278 473 @@ -124,6 +124,9 @@ :/events/event.png:/events/event.png + + QToolButton::MenuButtonPopup + @@ -155,26 +158,6 @@ - - - - - 0 - 0 - - - - Undo - - - Undo - - - - :/actions/undo.png:/actions/undo.png - - - diff --git a/Models/EventsListModel.cpp b/Models/EventsListModel.cpp index d8673ed2c..d7ffa65b5 100644 --- a/Models/EventsListModel.cpp +++ b/Models/EventsListModel.cpp @@ -6,12 +6,6 @@ #include #include -static inline bool IsEventGroup(const QModelIndex &index) { - if (!index.isValid()) return true; // << invisible root is a group - if (!index.parent().isValid()) return true; // << root immediate children are groups - return false; // << regular events have valid parents & grandparents -} - Event EventsListModel::GetEvent(const QModelIndex &index) const { auto sourceIndex = sourceModel()->index(index.row(), Object::EgmEvent::kIdFieldNumber); std::string name = sourceModel()->data(sourceIndex, @@ -36,112 +30,53 @@ EventsListModel::EventsListModel(EventData* eventData, QObject* parent) : QAbstractProxyModel(parent), eventData_(eventData) { } -void EventsListModel::setSourceModel(QAbstractItemModel* model) { - QAbstractProxyModel::setSourceModel(model); - - // For each event in source model - for (int i = 0; i < sourceModel()->rowCount(QModelIndex()); ++i) { - // Get the event info from the source model - const Event& event = GetEvent(createIndex(i, 0)); - QString group = QString::fromStdString(event.bare_id()); - - // Look for a group matching the current event - int groupIndex = 0; - for (auto& idx : modelEvents_) { - if (idx.first == group) { - break; - } - groupIndex++; - } - - // If no matching group found add one - if (groupIndex >= modelEvents_.size()) { - groupIndex = modelEvents_.size(); - modelEvents_.push_back({ group, {} }); - // Store the position of the group in the vector in a map for quick lookups - groupIDs_[group] = groupIndex; - } - - // Add the event to the group we found or added above - modelEvents_[groupIndex].second.push_back(QString::fromStdString(event.HumanName())); - } - - for (const auto& group : modelEvents_) { - std::cout << "Group: " << group.first.toStdString() << std::endl; - for (const auto& event : group.second) { - std::cout << " event: " << event.toStdString() << std::endl; - } - } -} - QVariant EventsListModel::headerData(int section, Qt::Orientation /*orientation*/, int role) const { if (role != Qt::DisplayRole || section > 0) return QVariant(); return tr("Events"); } QVariant EventsListModel::data(const QModelIndex &index, int role) const { - if (role != Qt::DisplayRole /*&& role != Qt::DecorationRole*/) return QVariant(); if (!index.isValid()) return QVariant(); // << invisible root - if (index.internalId() == -1) - return modelEvents_[index.row()].first; - else if (modelEvents_[index.internalId()].second.size() > 1) - return modelEvents_[index.internalId()].first; - else - return modelEvents_[index.internalId()].second[index.column()]; -} + const Event event = GetEvent(index); -QModelIndex EventsListModel::index(int row, int column, const QModelIndex &parent) const { - if (!hasIndex(row, column, parent)) - return QModelIndex(); - - if (!parent.isValid()) // << group - createIndex(row, column, -1); + switch (role) { + case Qt::DisplayRole: return QString::fromStdString(event.HumanName()); + case Qt::DecorationRole: { + QIcon icon(":/events/" + QString::fromStdString(event.bare_id()).toLower() + ".png"); + if (!icon.availableSizes().empty()) return icon; + return QIcon(":/events/other.png"); + } + case Qt::ToolTipRole: { + MessageModel* event = + static_cast( + sourceModel())->GetSubModel(index.row()); + return event->Data(Object::EgmEvent::kCodeFieldNumber); + } + default: return QVariant(); + } +} - return createIndex(row, column, parent.row()); +QModelIndex EventsListModel::index(int row, int column, const QModelIndex& /*parent*/) const { + return createIndex(row, column); } QModelIndex EventsListModel::parent(const QModelIndex& index) const { - if (!index.isValid()) - return QModelIndex(); - - if (modelEvents_.size() > index.row() && modelEvents_[index.row()].second.size() > 1) { - return createIndex(index.row(), 0, -1); - } - - return QModelIndex(); + return sourceModel()->parent(index); } int EventsListModel::rowCount(const QModelIndex &parent) const { - if (parent.column() > 0) - return 0; - - //qDebug() << parent.internalId() << Qt::endl; - if (!parent.isValid()) - return modelEvents_.size(); - - if (parent.internalId() != -1) - return modelEvents_[parent.internalId()].second.size(); - return 0; + return sourceModel()->rowCount(parent); } int EventsListModel::columnCount(const QModelIndex &parent) const { - return 1; -} - -Qt::ItemFlags EventsListModel::flags(const QModelIndex &index) const { - Qt::ItemFlags itemFlags = QAbstractItemModel::flags(index); - auto rows = rowCount(index); - if (rows > 0) - itemFlags.setFlag(Qt::ItemIsSelectable, false); - return itemFlags; + return (parent.isValid()) ? 0 : 1; } QModelIndex EventsListModel::mapFromSource(const QModelIndex &sourceIndex) const { - QString group = data(sourceIndex, Qt::UserRole).toString(); - return QModelIndex(); // ??? index(eventGroups_[group].first, + return index(sourceIndex.row(), sourceIndex.column()); } QModelIndex EventsListModel::mapToSource(const QModelIndex &proxyIndex) const { - return QModelIndex(); // ??? + return sourceModel()->index(proxyIndex.row(), proxyIndex.column()); } diff --git a/Models/EventsListModel.h b/Models/EventsListModel.h index 9e763ad89..71091cdb7 100644 --- a/Models/EventsListModel.h +++ b/Models/EventsListModel.h @@ -12,32 +12,18 @@ class EventsListModel : public QAbstractProxyModel { private: EventData* eventData_; - // group name, vector - // In vector so we can access group & events by positions in vectors - QVector>> modelEvents_; - // Store groups position in vector for fast look up - QMap groupIDs_; - - public: EventsListModel(EventData* eventData, QObject* parent = nullptr); + Event GetEvent(const QModelIndex &index) const; - Qt::ItemFlags flags(const QModelIndex &index) const override; - void setSourceModel(QAbstractItemModel* model) override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override; QModelIndex parent(const QModelIndex &index) const override; int rowCount(const QModelIndex &parent = QModelIndex()) const override; - bool hasChildren(const QModelIndex &parent = QModelIndex()) const override { - return rowCount(parent) > 0; - } int columnCount(const QModelIndex &parent = QModelIndex()) const override; QModelIndex mapFromSource(const QModelIndex &sourceIndex) const override; QModelIndex mapToSource(const QModelIndex &proxyIndex) const override; - - Event GetEvent(const QModelIndex &index) const; - }; #endif // EVENTSLISTS_H diff --git a/Models/RepeatedModel.h b/Models/RepeatedModel.h index 9feb50572..ec11f6622 100644 --- a/Models/RepeatedModel.h +++ b/Models/RepeatedModel.h @@ -95,7 +95,8 @@ class RepeatedModel : public ProtoModel { return true; }; - virtual bool removeRows(int position, int count, const QModelIndex & /*parent*/) override { + virtual bool removeRows(int position, int count, const QModelIndex& parent = QModelIndex()) override { + Q_UNUSED(parent); RowRemovalOperation remover(this); remover.RemoveRows(position, count); return true; From 8a3af4e4f158b1c64cd665be0ea44b71462dca76 Mon Sep 17 00:00:00 2001 From: Greg Williamson Date: Fri, 21 Aug 2020 09:33:11 -0400 Subject: [PATCH 11/29] why menu no work? --- Editors/ObjectEditor.cpp | 7 +++++++ Models/EventTypesListModel.h | 31 +++++++++++++++++++++++++++++++ RadialGM.pro | 1 + 3 files changed, 39 insertions(+) create mode 100644 Models/EventTypesListModel.h diff --git a/Editors/ObjectEditor.cpp b/Editors/ObjectEditor.cpp index 9f7218b96..f6b87dd5d 100644 --- a/Editors/ObjectEditor.cpp +++ b/Editors/ObjectEditor.cpp @@ -2,6 +2,8 @@ #include "Models/RepeatedStringModel.h" #include "ObjectEditor.h" #include "MainWindow.h" +#include "Components/QMenuView.h" +#include "Models/EventTypesListModel.h" #include "ui_ObjectEditor.h" @@ -46,6 +48,11 @@ ObjectEditor::ObjectEditor(MessageModel* model, QWidget* parent) : BaseEditor(mo _eventsModel = new EventsListModel(MainWindow::GetEventData(), this); + EventTypesListModel* m = new EventTypesListModel(MainWindow::GetEventData(), this); + QMenuView* eventsMenu = new QMenuView(this); + eventsMenu->setModel(m); + _ui->addEventButton->setMenu(eventsMenu); + RebindSubModels(); } diff --git a/Models/EventTypesListModel.h b/Models/EventTypesListModel.h new file mode 100644 index 000000000..97d8543dc --- /dev/null +++ b/Models/EventTypesListModel.h @@ -0,0 +1,31 @@ +#ifndef EVENTTYPESSLISTSMODEL_H +#define EVENTTYPESSLISTSMODEL_H + +#include "RepeatedMessageModel.h" +#include "event_reader/event_parser.h" + +#include + +class EventTypesListModel : public QSortFilterProxyModel { + private: + EventData* eventData_; + + public: + EventTypesListModel(EventData* eventData, QObject* parent = nullptr) : + QSortFilterProxyModel(parent), eventData_(eventData) { + + } + + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override { + if (!index.isValid()) return QVariant(); + if (role == Qt::DisplayRole) { + return QString::fromStdString(eventData_->events()[index.row()].bare_id()); + } + return QVariant(); + }; + int rowCount(const QModelIndex &parent = QModelIndex()) const override { return eventData_->events().size(); } + int columnCount(const QModelIndex &parent = QModelIndex()) const override { return 1; } + +}; + +#endif // EVENTTYPESSLISTS_H diff --git a/RadialGM.pro b/RadialGM.pro index 385b012fd..50d659621 100644 --- a/RadialGM.pro +++ b/RadialGM.pro @@ -127,6 +127,7 @@ HEADERS += \ Editors/TimelineEditor.h \ Editors/RoomEditor.h \ Editors/SettingsEditor.h \ + Models/EventTypesListModel.h \ Models/EventsListModel.h \ Models/MessageModel.h \ Models/RepeatedImageModel.h \ From 5db84542c2c1063978981320126dd0ff70788c75 Mon Sep 17 00:00:00 2001 From: Greg Williamson Date: Fri, 21 Aug 2020 15:17:58 -0400 Subject: [PATCH 12/29] ugh --- Editors/ObjectEditor.cpp | 5 +++- Models/EventTypesListModel.h | 55 ++++++++++++++++++++++++++++++++---- 2 files changed, 53 insertions(+), 7 deletions(-) diff --git a/Editors/ObjectEditor.cpp b/Editors/ObjectEditor.cpp index f6b87dd5d..5b0c8e7a4 100644 --- a/Editors/ObjectEditor.cpp +++ b/Editors/ObjectEditor.cpp @@ -50,7 +50,10 @@ ObjectEditor::ObjectEditor(MessageModel* model, QWidget* parent) : BaseEditor(mo EventTypesListModel* m = new EventTypesListModel(MainWindow::GetEventData(), this); QMenuView* eventsMenu = new QMenuView(this); - eventsMenu->setModel(m); + EventTypesListSortFilterProxyModel* mm = new EventTypesListSortFilterProxyModel(m); + mm->setSourceModel(m); + mm->sort(0); + eventsMenu->setModel(mm); _ui->addEventButton->setMenu(eventsMenu); RebindSubModels(); diff --git a/Models/EventTypesListModel.h b/Models/EventTypesListModel.h index 97d8543dc..606b6e953 100644 --- a/Models/EventTypesListModel.h +++ b/Models/EventTypesListModel.h @@ -3,29 +3,72 @@ #include "RepeatedMessageModel.h" #include "event_reader/event_parser.h" +#include "EventDescriptor.pb.h" +#include #include +#include -class EventTypesListModel : public QSortFilterProxyModel { +class EventTypesListModel : public QAbstractListModel { private: EventData* eventData_; public: EventTypesListModel(EventData* eventData, QObject* parent = nullptr) : - QSortFilterProxyModel(parent), eventData_(eventData) { + QAbstractListModel(parent), eventData_(eventData) { } QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override { if (!index.isValid()) return QVariant(); - if (role == Qt::DisplayRole) { - return QString::fromStdString(eventData_->events()[index.row()].bare_id()); + + switch (role) { + case Qt::DecorationRole: { + QIcon icon(":/events/" + QString::fromStdString(eventData_->events()[index.row()].bare_id()).toLower() + ".png"); + if (!icon.availableSizes().empty()) return icon; + return QIcon(":/events/other.png"); + } + + case Qt::DisplayRole: { + QString str = QString::fromStdString(eventData_->events()[index.row()].HumanName()); + while (str.contains("%")) { + str = str.arg(""); + } + return str; + } + + case Qt::ToolTipRole: return QString::fromStdString(eventData_->events()[index.row()].HumanDescription()); + case Qt::UserRole: return eventData_->events()[index.row()].event->type() != 5; //FIXME: mark hidden events in ey + case Qt::UserRole+1: return QString::fromStdString(eventData_->events()[index.row()].GroupName()); + default: return QVariant(); + } - return QVariant(); - }; + } + int rowCount(const QModelIndex &parent = QModelIndex()) const override { return eventData_->events().size(); } int columnCount(const QModelIndex &parent = QModelIndex()) const override { return 1; } }; +class EventTypesListSortFilterProxyModel : public QSortFilterProxyModel { +public: + EventTypesListSortFilterProxyModel(QObject* parent = nullptr) : QSortFilterProxyModel(parent) {} + bool filterAcceptsRow(int source_row, const QModelIndex& /*source_parent*/) const override { + return sourceModel()->data(sourceModel()->index(source_row, 0), Qt::UserRole).toBool(); + } + bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const override { + //FIXME: trying to sort alpha but keep grouped events together + QString leftGroup = sourceModel()->data(source_left, Qt::UserRole+1).toString(); + QString rightGroup = sourceModel()->data(source_right, Qt::UserRole+1).toString(); + + if (leftGroup == rightGroup) { + return sourceModel()->data(source_left, Qt::DisplayRole).toString() < + sourceModel()->data(source_right, Qt::DisplayRole).toString(); + } + + //if (leftGroup.isEmpty() && !rightGroup.isEmpty()) return false; + return leftGroup < rightGroup; + } +}; + #endif // EVENTTYPESSLISTS_H From d281e408f88c92ee4561478b4c8a1bcfe42394aa Mon Sep 17 00:00:00 2001 From: Greg Williamson Date: Sat, 22 Aug 2020 13:29:08 -0400 Subject: [PATCH 13/29] correct indexes --- Editors/ObjectEditor.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Editors/ObjectEditor.cpp b/Editors/ObjectEditor.cpp index 5b0c8e7a4..19047c302 100644 --- a/Editors/ObjectEditor.cpp +++ b/Editors/ObjectEditor.cpp @@ -39,10 +39,6 @@ ObjectEditor::ObjectEditor(MessageModel* model, QWidget* parent) : BaseEditor(mo // Tell frankensteined widget to resize to proper size resize(_codeEditor->geometry().width() + eventsWidget->geometry().width(), _codeEditor->geometry().height()); - connect(_ui->eventsList, &QAbstractItemView::clicked, [=](const QModelIndex& index) { - SetCurrentEditor(index.row()); - //_ui->stepBox->setValue(_momentsModel->Data(index.row(), Timeline::Moment::kStepFieldNumber).toInt()); - }); connect(_ui->saveButton, &QAbstractButton::pressed, this, &BaseEditor::OnSave); @@ -70,6 +66,10 @@ void ObjectEditor::RebindSubModels() { sortedEvents->sort(0); _ui->eventsList->setModel(sortedEvents); + connect(_ui->eventsList, &QAbstractItemView::clicked, [=](const QModelIndex& index) { + SetCurrentEditor(sortedEvents->mapFromSource(_eventsModel->index(index.row(), 0)).row()); + }); + for (int event = 0; event < _eventsModel->rowCount(); ++event) { BindEventEditor(event); } From 461d7a1f1e027bf5ced9f01b594c780bc1a9576d Mon Sep 17 00:00:00 2001 From: Greg Williamson Date: Sun, 23 Aug 2020 11:22:25 -0400 Subject: [PATCH 14/29] wip --- Dialogs/EventArgumentsDialog.cpp | 105 +++++++++++++++++++++++++++++++ Dialogs/EventArgumentsDialog.h | 22 +++++++ Editors/ObjectEditor.cpp | 29 ++++++++- Models/EventTypesListModel.h | 11 ++++ RadialGM.pro | 2 + Submodules/enigma-dev | 2 +- 6 files changed, 169 insertions(+), 2 deletions(-) create mode 100644 Dialogs/EventArgumentsDialog.cpp create mode 100644 Dialogs/EventArgumentsDialog.h diff --git a/Dialogs/EventArgumentsDialog.cpp b/Dialogs/EventArgumentsDialog.cpp new file mode 100644 index 000000000..85c69e589 --- /dev/null +++ b/Dialogs/EventArgumentsDialog.cpp @@ -0,0 +1,105 @@ +#include "EventArgumentsDialog.h" +#include "MainWindow.h" +#include "Components/QMenuView.h" +#include "Models/TreeSortFilterProxyModel.h" + +#include +#include +#include +#include +#include +#include +#include + +EventArgumentsDialog::EventArgumentsDialog(QWidget* parent, const QStringList& arguments) + : QDialog(parent) { + QGridLayout* layout = new QGridLayout(this); + + int row = 0; + for (const auto& arg : arguments) { + QLabel* name = new QLabel(this); + name->setText(arg); + + QWidget* value; + + if (arg == "integer") { + QSpinBox* integer = new QSpinBox(this); + integer->setMinimum(0); + value = integer; + layout->addWidget(value, row, 1); + } else if (arg == "object") { + QHBoxLayout* objLayout = new QHBoxLayout(this); + QToolButton* objButton = new QToolButton(this); + + QMenuView* objMenu = new QMenuView(this); + TreeSortFilterProxyModel* treeProxy = new TreeSortFilterProxyModel(this); + treeProxy->SetFilterType(TreeNode::TypeCase::kObject); + treeProxy->setSourceModel(MainWindow::treeModel.get()); + objMenu->setModel(treeProxy); + objButton->setMenu(objMenu); + objButton->setPopupMode(QToolButton::MenuButtonPopup); + objButton->setIcon(ArtManager::GetIcon(":/resources/object.png")); + + QLineEdit* lineEdit = new QLineEdit(this); + lineEdit->setDisabled(true); + + connect(objMenu, &QMenuView::triggered, [=](const QModelIndex& index) { + lineEdit->setText(treeProxy->data(index, Qt::DisplayRole).toString()); + objButton->setIcon(treeProxy->data(index, Qt::DecorationRole).value()); + }); + + objLayout->addWidget(lineEdit); + objLayout->addWidget(objButton); + + layout->addItem(objLayout, row, 1); + + value = lineEdit; + } else { + QComboBox* combo = new QComboBox(this); + //combo->setModel() + value = combo; + layout->addWidget(value, row, 1); + } + + widgets_.append(value); + + layout->addWidget(name, row, 0); + row++; + } + + QDialogButtonBox* btn = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); + layout->addWidget(btn, row, 1); + connect(btn, SIGNAL(accepted()), this, SLOT(accept())); + connect(btn, SIGNAL(rejected()), this, SLOT(reject())); + + setLayout(layout); + setWindowTitle(tr("Event arguments")); +} + +const QStringList& EventArgumentsDialog::GetArguments() const { + return arguments_; +} + +void EventArgumentsDialog::done(int r) { + for (const QWidget* w : widgets_) { + QString widgetType = w->metaObject()->className(); + if (widgetType == "QSpinBox") { + arguments_.append(QString(reinterpret_cast(w)->value())); + } else if (widgetType == "QComboBox") { + arguments_.append(QString(reinterpret_cast(w)->currentText())); + } else if (widgetType == "QLineEdit") { + arguments_.append(QString(reinterpret_cast(w)->text())); + } else { + qDebug() << "Unknown widget type: " << widgetType; + arguments_.append(""); + } + } + + qDebug() << "argumemts sixe: " << arguments_.size(); + + QDialog::done(r); +} + +QSize EventArgumentsDialog::sizeHint() const { + return QSize(300,300); +} diff --git a/Dialogs/EventArgumentsDialog.h b/Dialogs/EventArgumentsDialog.h new file mode 100644 index 000000000..f316dbbc3 --- /dev/null +++ b/Dialogs/EventArgumentsDialog.h @@ -0,0 +1,22 @@ +#ifndef EVENTARGUMENTSDIALOG_H +#define EVENTARGUMENTSDIALOG_H + +#include "event_reader/event_parser.h" + +#include + +class EventArgumentsDialog : public QDialog +{ + Q_OBJECT +public: + EventArgumentsDialog(QWidget* parent, const QStringList& arguments); + QSize sizeHint() const override; + const QStringList& GetArguments() const; + void done(int r) override; + +private: + QStringList arguments_; + QVector widgets_; +}; + +#endif // EVENTARGUMENTSDIALOG_H diff --git a/Editors/ObjectEditor.cpp b/Editors/ObjectEditor.cpp index 19047c302..88677ad21 100644 --- a/Editors/ObjectEditor.cpp +++ b/Editors/ObjectEditor.cpp @@ -1,9 +1,10 @@ #include "Models/RepeatedMessageModel.h" #include "Models/RepeatedStringModel.h" +#include "Models/EventTypesListModel.h" +#include "Dialogs/EventArgumentsDialog.h" #include "ObjectEditor.h" #include "MainWindow.h" #include "Components/QMenuView.h" -#include "Models/EventTypesListModel.h" #include "ui_ObjectEditor.h" @@ -52,6 +53,32 @@ ObjectEditor::ObjectEditor(MessageModel* model, QWidget* parent) : BaseEditor(mo eventsMenu->setModel(mm); _ui->addEventButton->setMenu(eventsMenu); + connect(eventsMenu, &QMenuView::triggered, [=](const QModelIndex& index) { + QStringList args = mm->data(index, Qt::UserRole+2).toStringList(); + EventArgumentsDialog* dialog; + if (args.size() > 0) { + dialog = new EventArgumentsDialog(this, args); + dialog->open(); + } + + qDebug() << dialog->result(); + + if (args.size() == 0 || dialog->result() == 0) { + qDebug() << "wut1"; + Object::EgmEvent event; + event.set_id(mm->data(index, Qt::UserRole+3).toString().toStdString()); + for (const QString& arg : dialog->GetArguments()) { + qDebug() << "wut2"; + std::string* s = event.add_arguments(); + s->assign(arg.toStdString()); + qDebug() << QString::fromStdString(*s); + } + + AddEvent(event); + } + + }); + RebindSubModels(); } diff --git a/Models/EventTypesListModel.h b/Models/EventTypesListModel.h index 606b6e953..58e1651be 100644 --- a/Models/EventTypesListModel.h +++ b/Models/EventTypesListModel.h @@ -40,6 +40,17 @@ class EventTypesListModel : public QAbstractListModel { case Qt::ToolTipRole: return QString::fromStdString(eventData_->events()[index.row()].HumanDescription()); case Qt::UserRole: return eventData_->events()[index.row()].event->type() != 5; //FIXME: mark hidden events in ey case Qt::UserRole+1: return QString::fromStdString(eventData_->events()[index.row()].GroupName()); + case Qt::UserRole+2: { + QStringList args; + for (const auto& str : eventData_->events()[index.row()].event->parameters()) { + args.append(QString::fromStdString(str)); + } + return args; + } + case Qt::UserRole+3: { + return QString::fromStdString(eventData_->events()[index.row()].bare_id()); + } + default: return QVariant(); } diff --git a/RadialGM.pro b/RadialGM.pro index 50d659621..2a9b3dc19 100644 --- a/RadialGM.pro +++ b/RadialGM.pro @@ -68,6 +68,7 @@ LIBS += -L$$PWD/Submodules/enigma-dev/CommandLine/libEGM/ \ -lgrpc++ SOURCES += \ + Dialogs/EventArgumentsDialog.cpp \ Dialogs/TimelineChangeMoment.cpp \ Editors/ShaderEditor.cpp \ Editors/SpriteEditor.cpp \ @@ -113,6 +114,7 @@ SOURCES += \ Models/TreeSortFilterProxyModel.cpp HEADERS += \ + Dialogs/EventArgumentsDialog.h \ Dialogs/TimelineChangeMoment.h \ Editors/ShaderEditor.h \ Editors/SpriteEditor.h \ diff --git a/Submodules/enigma-dev b/Submodules/enigma-dev index 4e1cb8d85..2e697aa79 160000 --- a/Submodules/enigma-dev +++ b/Submodules/enigma-dev @@ -1 +1 @@ -Subproject commit 4e1cb8d85e1ff45969f74a02dcf94d51f06beb1b +Subproject commit 2e697aa79c921eab6a3d3dbfdcf597449fc03e2a From 6f94ae882351c0fd42b27049cfb7c4ae41161ebe Mon Sep 17 00:00:00 2001 From: Robert Colton Date: Sun, 23 Aug 2020 11:40:57 -0400 Subject: [PATCH 15/29] Update Dialogs/EventArgumentsDialog.cpp --- Dialogs/EventArgumentsDialog.cpp | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/Dialogs/EventArgumentsDialog.cpp b/Dialogs/EventArgumentsDialog.cpp index 85c69e589..db2e818b2 100644 --- a/Dialogs/EventArgumentsDialog.cpp +++ b/Dialogs/EventArgumentsDialog.cpp @@ -82,17 +82,11 @@ const QStringList& EventArgumentsDialog::GetArguments() const { void EventArgumentsDialog::done(int r) { for (const QWidget* w : widgets_) { - QString widgetType = w->metaObject()->className(); - if (widgetType == "QSpinBox") { - arguments_.append(QString(reinterpret_cast(w)->value())); - } else if (widgetType == "QComboBox") { - arguments_.append(QString(reinterpret_cast(w)->currentText())); - } else if (widgetType == "QLineEdit") { - arguments_.append(QString(reinterpret_cast(w)->text())); - } else { - qDebug() << "Unknown widget type: " << widgetType; - arguments_.append(""); - } +QVariant argument = w->metaObject()->userProperty()->read(w); +QString argstr = ""; +if (argument.isValid() && argument.type() == QMetaType::QString) + argstr = argument.toString(); +arguments_.append(argstr); } qDebug() << "argumemts sixe: " << arguments_.size(); From 844d83fb68b351772d22d179444e913723ae7156 Mon Sep 17 00:00:00 2001 From: Goombert Date: Tue, 25 Aug 2020 09:50:35 -0400 Subject: [PATCH 16/29] fix the done code --- Dialogs/EventArgumentsDialog.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/Dialogs/EventArgumentsDialog.cpp b/Dialogs/EventArgumentsDialog.cpp index db2e818b2..c9cd61e26 100644 --- a/Dialogs/EventArgumentsDialog.cpp +++ b/Dialogs/EventArgumentsDialog.cpp @@ -10,6 +10,7 @@ #include #include #include +#include EventArgumentsDialog::EventArgumentsDialog(QWidget* parent, const QStringList& arguments) : QDialog(parent) { @@ -81,17 +82,17 @@ const QStringList& EventArgumentsDialog::GetArguments() const { } void EventArgumentsDialog::done(int r) { - for (const QWidget* w : widgets_) { -QVariant argument = w->metaObject()->userProperty()->read(w); -QString argstr = ""; -if (argument.isValid() && argument.type() == QMetaType::QString) - argstr = argument.toString(); -arguments_.append(argstr); - } + for (const QWidget* w : widgets_) { + QVariant argument = w->metaObject()->userProperty().read(w); + QString argstr = ""; + if (argument.isValid() && (QMetaType::Type)argument.type() == QMetaType::QString) + argstr = argument.toString(); + arguments_.append(argstr); + } - qDebug() << "argumemts sixe: " << arguments_.size(); + qDebug() << "argumemts sixe: " << arguments_.size(); - QDialog::done(r); + QDialog::done(r); } QSize EventArgumentsDialog::sizeHint() const { From 9bc186e0e38df65510429372e50c64d04b595770 Mon Sep 17 00:00:00 2001 From: Greg Williamson Date: Tue, 25 Aug 2020 21:17:29 -0400 Subject: [PATCH 17/29] ugh --- Dialogs/EventArgumentsDialog.cpp | 17 ++++++-------- Dialogs/EventArgumentsDialog.h | 2 +- Editors/ObjectEditor.cpp | 39 ++++++++++++++++++-------------- Models/EventTypesListModel.h | 1 - Submodules/enigma-dev | 2 +- 5 files changed, 31 insertions(+), 30 deletions(-) diff --git a/Dialogs/EventArgumentsDialog.cpp b/Dialogs/EventArgumentsDialog.cpp index c9cd61e26..335402432 100644 --- a/Dialogs/EventArgumentsDialog.cpp +++ b/Dialogs/EventArgumentsDialog.cpp @@ -29,7 +29,7 @@ EventArgumentsDialog::EventArgumentsDialog(QWidget* parent, const QStringList& a value = integer; layout->addWidget(value, row, 1); } else if (arg == "object") { - QHBoxLayout* objLayout = new QHBoxLayout(this); + QHBoxLayout* objLayout = new QHBoxLayout(); QToolButton* objButton = new QToolButton(this); QMenuView* objMenu = new QMenuView(this); @@ -73,7 +73,6 @@ EventArgumentsDialog::EventArgumentsDialog(QWidget* parent, const QStringList& a connect(btn, SIGNAL(accepted()), this, SLOT(accept())); connect(btn, SIGNAL(rejected()), this, SLOT(reject())); - setLayout(layout); setWindowTitle(tr("Event arguments")); } @@ -85,16 +84,14 @@ void EventArgumentsDialog::done(int r) { for (const QWidget* w : widgets_) { QVariant argument = w->metaObject()->userProperty().read(w); QString argstr = ""; - if (argument.isValid() && (QMetaType::Type)argument.type() == QMetaType::QString) - argstr = argument.toString(); + if (QString(w->metaObject()->className()) == "QSpinBox") { + argstr = QString::number(reinterpret_cast(w)->value()); + } else { + if (argument.isValid() && (QMetaType::Type)argument.type() == QMetaType::QString) + argstr = argument.toString(); + } arguments_.append(argstr); } - qDebug() << "argumemts sixe: " << arguments_.size(); - QDialog::done(r); } - -QSize EventArgumentsDialog::sizeHint() const { - return QSize(300,300); -} diff --git a/Dialogs/EventArgumentsDialog.h b/Dialogs/EventArgumentsDialog.h index f316dbbc3..a2b3ffe8f 100644 --- a/Dialogs/EventArgumentsDialog.h +++ b/Dialogs/EventArgumentsDialog.h @@ -10,7 +10,7 @@ class EventArgumentsDialog : public QDialog Q_OBJECT public: EventArgumentsDialog(QWidget* parent, const QStringList& arguments); - QSize sizeHint() const override; + //QSize sizeHint() const override; const QStringList& GetArguments() const; void done(int r) override; diff --git a/Editors/ObjectEditor.cpp b/Editors/ObjectEditor.cpp index 88677ad21..b8acfe661 100644 --- a/Editors/ObjectEditor.cpp +++ b/Editors/ObjectEditor.cpp @@ -51,32 +51,33 @@ ObjectEditor::ObjectEditor(MessageModel* model, QWidget* parent) : BaseEditor(mo mm->setSourceModel(m); mm->sort(0); eventsMenu->setModel(mm); + eventsMenu->setToolTipsVisible(true); _ui->addEventButton->setMenu(eventsMenu); connect(eventsMenu, &QMenuView::triggered, [=](const QModelIndex& index) { QStringList args = mm->data(index, Qt::UserRole+2).toStringList(); - EventArgumentsDialog* dialog; + EventArgumentsDialog* dialog = nullptr; if (args.size() > 0) { dialog = new EventArgumentsDialog(this, args); dialog->open(); - } - - qDebug() << dialog->result(); - if (args.size() == 0 || dialog->result() == 0) { - qDebug() << "wut1"; + connect(dialog, &QDialog::accepted, [=]() { + if (dialog->result() == QDialog::Accepted) { + Object::EgmEvent event; + event.set_id(mm->data(index, Qt::UserRole+3).toString().toStdString()); + for (const QString& arg : dialog->GetArguments()) { + std::string* s = event.add_arguments(); + s->assign(arg.toStdString()); + } + + AddEvent(event); + } + }); + } else { Object::EgmEvent event; event.set_id(mm->data(index, Qt::UserRole+3).toString().toStdString()); - for (const QString& arg : dialog->GetArguments()) { - qDebug() << "wut2"; - std::string* s = event.add_arguments(); - s->assign(arg.toStdString()); - qDebug() << QString::fromStdString(*s); - } - AddEvent(event); } - }); RebindSubModels(); @@ -127,10 +128,14 @@ void ObjectEditor::ChangeEvent(int idx, Object::EgmEvent event) { size_t argc = 0; argsModel->removeRows(0, argsModel->rowCount()); // clear old arguments - argsModel->insertRows(argsModel->rowCount(), event.arguments_size()); - for (const auto& arg : event.arguments()) { - argsModel->SetData(QString::fromStdString(arg), argc++); + if (event.arguments_size() > 0) { + argsModel->insertRows(argsModel->rowCount(), event.arguments_size()); + for (const auto& arg : event.arguments()) { + argsModel->SetData(QString::fromStdString(arg), argc++); + } } + + _ui->eventsList->sortByColumn(0, Qt::AscendingOrder); } void ObjectEditor::RemoveEvent(int idx) { diff --git a/Models/EventTypesListModel.h b/Models/EventTypesListModel.h index 58e1651be..5b6668d88 100644 --- a/Models/EventTypesListModel.h +++ b/Models/EventTypesListModel.h @@ -77,7 +77,6 @@ class EventTypesListSortFilterProxyModel : public QSortFilterProxyModel { sourceModel()->data(source_right, Qt::DisplayRole).toString(); } - //if (leftGroup.isEmpty() && !rightGroup.isEmpty()) return false; return leftGroup < rightGroup; } }; diff --git a/Submodules/enigma-dev b/Submodules/enigma-dev index 4e1cb8d85..9195a5ffe 160000 --- a/Submodules/enigma-dev +++ b/Submodules/enigma-dev @@ -1 +1 @@ -Subproject commit 4e1cb8d85e1ff45969f74a02dcf94d51f06beb1b +Subproject commit 9195a5ffe09bc697b3dac76f6231d74e68a1601f From 36b372277cbf4b83741fa9ce0b22cc24b9865ed3 Mon Sep 17 00:00:00 2001 From: Goombert Date: Wed, 26 Aug 2020 00:23:59 -0400 Subject: [PATCH 18/29] fix all that shit with identity proxy model --- Models/EventsListModel.cpp | 29 ++++------------------------- Models/EventsListModel.h | 10 ++-------- 2 files changed, 6 insertions(+), 33 deletions(-) diff --git a/Models/EventsListModel.cpp b/Models/EventsListModel.cpp index d7ffa65b5..7889dd8aa 100644 --- a/Models/EventsListModel.cpp +++ b/Models/EventsListModel.cpp @@ -4,7 +4,6 @@ #include "RepeatedMessageModel.h" #include -#include Event EventsListModel::GetEvent(const QModelIndex &index) const { auto sourceIndex = sourceModel()->index(index.row(), Object::EgmEvent::kIdFieldNumber); @@ -27,7 +26,7 @@ Event EventsListModel::GetEvent(const QModelIndex &index) const { } EventsListModel::EventsListModel(EventData* eventData, QObject* parent) : - QAbstractProxyModel(parent), eventData_(eventData) { + QIdentityProxyModel(parent), eventData_(eventData) { } QVariant EventsListModel::headerData(int section, Qt::Orientation /*orientation*/, int role) const { @@ -38,7 +37,7 @@ QVariant EventsListModel::headerData(int section, Qt::Orientation /*orientation* QVariant EventsListModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); // << invisible root - const Event event = GetEvent(index); + Event event = GetEvent(index); switch (role) { case Qt::DisplayRole: return QString::fromStdString(event.HumanName()); @@ -57,26 +56,6 @@ QVariant EventsListModel::data(const QModelIndex &index, int role) const { } } -QModelIndex EventsListModel::index(int row, int column, const QModelIndex& /*parent*/) const { - return createIndex(row, column); -} - -QModelIndex EventsListModel::parent(const QModelIndex& index) const { - return sourceModel()->parent(index); -} - -int EventsListModel::rowCount(const QModelIndex &parent) const { - return sourceModel()->rowCount(parent); -} - -int EventsListModel::columnCount(const QModelIndex &parent) const { - return (parent.isValid()) ? 0 : 1; -} - -QModelIndex EventsListModel::mapFromSource(const QModelIndex &sourceIndex) const { - return index(sourceIndex.row(), sourceIndex.column()); -} - -QModelIndex EventsListModel::mapToSource(const QModelIndex &proxyIndex) const { - return sourceModel()->index(proxyIndex.row(), proxyIndex.column()); +int EventsListModel::columnCount(const QModelIndex &/*parent*/) const { + return 1; } diff --git a/Models/EventsListModel.h b/Models/EventsListModel.h index 71091cdb7..1f9647081 100644 --- a/Models/EventsListModel.h +++ b/Models/EventsListModel.h @@ -5,10 +5,9 @@ #include "RepeatedMessageModel.h" -#include -#include +#include -class EventsListModel : public QAbstractProxyModel { +class EventsListModel : public QIdentityProxyModel { private: EventData* eventData_; @@ -18,12 +17,7 @@ class EventsListModel : public QAbstractProxyModel { QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; - QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override; - QModelIndex parent(const QModelIndex &index) const override; - int rowCount(const QModelIndex &parent = QModelIndex()) const override; int columnCount(const QModelIndex &parent = QModelIndex()) const override; - QModelIndex mapFromSource(const QModelIndex &sourceIndex) const override; - QModelIndex mapToSource(const QModelIndex &proxyIndex) const override; }; #endif // EVENTSLISTS_H From 4cf51a860e8906c554c048bbc17f40b2cf5c7f94 Mon Sep 17 00:00:00 2001 From: Greg Williamson Date: Fri, 28 Aug 2020 17:36:25 -0400 Subject: [PATCH 19/29] WIP --- Dialogs/EventArgumentsDialog.cpp | 73 ++++++----- Dialogs/EventArgumentsDialog.h | 1 - Editors/ObjectEditor.cpp | 210 ++++++++++++++++++++----------- Editors/ObjectEditor.h | 20 ++- Editors/ObjectEditor.ui | 10 +- Models/TreeModel.cpp | 2 + Models/TreeModel.h | 3 + 7 files changed, 205 insertions(+), 114 deletions(-) diff --git a/Dialogs/EventArgumentsDialog.cpp b/Dialogs/EventArgumentsDialog.cpp index 335402432..e9bb43d9e 100644 --- a/Dialogs/EventArgumentsDialog.cpp +++ b/Dialogs/EventArgumentsDialog.cpp @@ -1,50 +1,61 @@ #include "EventArgumentsDialog.h" -#include "MainWindow.h" #include "Components/QMenuView.h" +#include "MainWindow.h" #include "Models/TreeSortFilterProxyModel.h" -#include #include -#include -#include #include -#include +#include +#include #include #include +#include +#include +#include -EventArgumentsDialog::EventArgumentsDialog(QWidget* parent, const QStringList& arguments) - : QDialog(parent) { - QGridLayout* layout = new QGridLayout(this); +EventArgumentsDialog::EventArgumentsDialog(QWidget *parent, const QStringList &arguments) : QDialog(parent) { + QGridLayout *layout = new QGridLayout(this); int row = 0; - for (const auto& arg : arguments) { - QLabel* name = new QLabel(this); + for (const auto &arg : arguments) { + QLabel *name = new QLabel(this); name->setText(arg); - QWidget* value; + QWidget *value; if (arg == "integer") { - QSpinBox* integer = new QSpinBox(this); + QSpinBox *integer = new QSpinBox(this); integer->setMinimum(0); value = integer; layout->addWidget(value, row, 1); + } else if (arg == "string") { + QLineEdit *lineEdit = new QLineEdit(this); + lineEdit->setText(tr("MyCustomEvent")); + value = lineEdit; + layout->addWidget(value, row, 1); } else if (arg == "object") { - QHBoxLayout* objLayout = new QHBoxLayout(); - QToolButton* objButton = new QToolButton(this); + QHBoxLayout *objLayout = new QHBoxLayout(); + QToolButton *objButton = new QToolButton(this); - QMenuView* objMenu = new QMenuView(this); - TreeSortFilterProxyModel* treeProxy = new TreeSortFilterProxyModel(this); + QMenuView *objMenu = new QMenuView(this); + TreeSortFilterProxyModel *treeProxy = new TreeSortFilterProxyModel(this); treeProxy->SetFilterType(TreeNode::TypeCase::kObject); treeProxy->setSourceModel(MainWindow::treeModel.get()); objMenu->setModel(treeProxy); objButton->setMenu(objMenu); objButton->setPopupMode(QToolButton::MenuButtonPopup); - objButton->setIcon(ArtManager::GetIcon(":/resources/object.png")); - - QLineEdit* lineEdit = new QLineEdit(this); - lineEdit->setDisabled(true); - connect(objMenu, &QMenuView::triggered, [=](const QModelIndex& index) { + QLineEdit *lineEdit = new QLineEdit(this); + lineEdit->setReadOnly(true); + QModelIndex firstObjIdx = treeProxy + ->match(treeProxy->index(0, 0), TreeModel::UserRoles::TypeCaseRole, + TypeCase::kObject, 1, Qt::MatchRecursive) + .first(); + QString firstObj = firstObjIdx.data(Qt::DisplayRole).toString(); + objButton->setIcon(firstObjIdx.data(Qt::DecorationRole).value()); + lineEdit->setText(firstObj); + + connect(objMenu, &QMenuView::triggered, [=](const QModelIndex &index) { lineEdit->setText(treeProxy->data(index, Qt::DisplayRole).toString()); objButton->setIcon(treeProxy->data(index, Qt::DecorationRole).value()); }); @@ -56,8 +67,11 @@ EventArgumentsDialog::EventArgumentsDialog(QWidget* parent, const QStringList& a value = lineEdit; } else { - QComboBox* combo = new QComboBox(this); - //combo->setModel() + QComboBox *combo = new QComboBox(this); + auto argList = MainWindow::GetEventData()->value_names_for_type(name->text().toStdString()); + for (auto a : argList) { + combo->addItem(QString::fromStdString(a.first)); + } value = combo; layout->addWidget(value, row, 1); } @@ -68,7 +82,7 @@ EventArgumentsDialog::EventArgumentsDialog(QWidget* parent, const QStringList& a row++; } - QDialogButtonBox* btn = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); + QDialogButtonBox *btn = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); layout->addWidget(btn, row, 1); connect(btn, SIGNAL(accepted()), this, SLOT(accept())); connect(btn, SIGNAL(rejected()), this, SLOT(reject())); @@ -76,19 +90,16 @@ EventArgumentsDialog::EventArgumentsDialog(QWidget* parent, const QStringList& a setWindowTitle(tr("Event arguments")); } -const QStringList& EventArgumentsDialog::GetArguments() const { - return arguments_; -} +const QStringList &EventArgumentsDialog::GetArguments() const { return arguments_; } void EventArgumentsDialog::done(int r) { - for (const QWidget* w : widgets_) { + for (const QWidget *w : widgets_) { QVariant argument = w->metaObject()->userProperty().read(w); QString argstr = ""; if (QString(w->metaObject()->className()) == "QSpinBox") { - argstr = QString::number(reinterpret_cast(w)->value()); + argstr = QString::number(reinterpret_cast(w)->value()); } else { - if (argument.isValid() && (QMetaType::Type)argument.type() == QMetaType::QString) - argstr = argument.toString(); + if (argument.isValid() && (QMetaType::Type)argument.type() == QMetaType::QString) argstr = argument.toString(); } arguments_.append(argstr); } diff --git a/Dialogs/EventArgumentsDialog.h b/Dialogs/EventArgumentsDialog.h index a2b3ffe8f..dd47db189 100644 --- a/Dialogs/EventArgumentsDialog.h +++ b/Dialogs/EventArgumentsDialog.h @@ -10,7 +10,6 @@ class EventArgumentsDialog : public QDialog Q_OBJECT public: EventArgumentsDialog(QWidget* parent, const QStringList& arguments); - //QSize sizeHint() const override; const QStringList& GetArguments() const; void done(int r) override; diff --git a/Editors/ObjectEditor.cpp b/Editors/ObjectEditor.cpp index b8acfe661..2aa7de264 100644 --- a/Editors/ObjectEditor.cpp +++ b/Editors/ObjectEditor.cpp @@ -1,25 +1,31 @@ -#include "Models/RepeatedMessageModel.h" -#include "Models/RepeatedStringModel.h" -#include "Models/EventTypesListModel.h" -#include "Dialogs/EventArgumentsDialog.h" #include "ObjectEditor.h" -#include "MainWindow.h" #include "Components/QMenuView.h" +#include "Dialogs/EventArgumentsDialog.h" +#include "MainWindow.h" +#include "Models/EventTypesListModel.h" +#include "Models/RepeatedMessageModel.h" +#include "Models/RepeatedStringModel.h" #include "ui_ObjectEditor.h" -#include #include -ObjectEditor::ObjectEditor(MessageModel* model, QWidget* parent) : BaseEditor(model, parent), - _ui(new Ui::ObjectEditor), - _codeEditor(new CodeEditor(this, true)) -{ +void ObjectEditor::BindEventMenu(QToolButton* btn, bool add) { + QMenuView *eventsMenu = new QMenuView(this); + eventsMenu->setModel(_eventsTypesModel); + eventsMenu->setToolTipsVisible(true); + btn->setMenu(eventsMenu); + connect(eventsMenu, &QMenuView::triggered, [=](const QModelIndex &index) { + AddChangeFromMenuEvent(index, add); + }); +} - QLayout* layout = new QVBoxLayout(this); - QSplitter* splitter = new QSplitter(this); +ObjectEditor::ObjectEditor(MessageModel *model, QWidget *parent) + : BaseEditor(model, parent), _ui(new Ui::ObjectEditor), _codeEditor(new CodeEditor(this, true)) { + QLayout *layout = new QVBoxLayout(this); + QSplitter *splitter = new QSplitter(this); - QWidget* eventsWidget = new QWidget(this); + QWidget *eventsWidget = new QWidget(this); _ui->setupUi(eventsWidget); _nodeMapper->addMapping(_ui->nameEdit, TreeNode::kNameFieldNumber); @@ -45,118 +51,170 @@ ObjectEditor::ObjectEditor(MessageModel* model, QWidget* parent) : BaseEditor(mo _eventsModel = new EventsListModel(MainWindow::GetEventData(), this); - EventTypesListModel* m = new EventTypesListModel(MainWindow::GetEventData(), this); - QMenuView* eventsMenu = new QMenuView(this); - EventTypesListSortFilterProxyModel* mm = new EventTypesListSortFilterProxyModel(m); - mm->setSourceModel(m); - mm->sort(0); - eventsMenu->setModel(mm); - eventsMenu->setToolTipsVisible(true); - _ui->addEventButton->setMenu(eventsMenu); - - connect(eventsMenu, &QMenuView::triggered, [=](const QModelIndex& index) { - QStringList args = mm->data(index, Qt::UserRole+2).toStringList(); - EventArgumentsDialog* dialog = nullptr; - if (args.size() > 0) { - dialog = new EventArgumentsDialog(this, args); - dialog->open(); - - connect(dialog, &QDialog::accepted, [=]() { - if (dialog->result() == QDialog::Accepted) { - Object::EgmEvent event; - event.set_id(mm->data(index, Qt::UserRole+3).toString().toStdString()); - for (const QString& arg : dialog->GetArguments()) { - std::string* s = event.add_arguments(); - s->assign(arg.toStdString()); - } - - AddEvent(event); - } - }); - } else { - Object::EgmEvent event; - event.set_id(mm->data(index, Qt::UserRole+3).toString().toStdString()); - AddEvent(event); - } - }); + EventTypesListModel *m = new EventTypesListModel(MainWindow::GetEventData(), this); + _eventsTypesModel = new EventTypesListSortFilterProxyModel(m); + _eventsTypesModel->setSourceModel(m); + _eventsTypesModel->sort(0); + + BindEventMenu(_ui->addEventButton, true); + BindEventMenu(_ui->changeEventButton, false); RebindSubModels(); } ObjectEditor::~ObjectEditor() { delete _ui; } +void ObjectEditor::AddChangeEventHelper(const Object::EgmEvent& event, bool add) { + if (add) { + AddEvent(event); + } else { + int existingIdx = MapRowFrom(IndexOf(event)); + int selectedIdx = MapRowTo(_ui->eventsList->selectionModel()->currentIndex().row()); + if (existingIdx == -1 && selectedIdx != -1) { + ChangeEvent(selectedIdx, event, false); + } else qDebug() << "Change event failed"; + } +} + +void ObjectEditor::AddChangeFromMenuEvent(const QModelIndex &index, bool add) { + QStringList args = _eventsTypesModel->data(index, Qt::UserRole + 2).toStringList(); + EventArgumentsDialog *dialog = nullptr; + if (args.size() > 0) { + dialog = new EventArgumentsDialog(this, args); + dialog->open(); + + connect(dialog, &QDialog::accepted, [=]() { + if (dialog->result() == QDialog::Accepted) { + Object::EgmEvent event; + event.set_id(_eventsTypesModel->data(index, Qt::UserRole + 3).toString().toStdString()); + for (const QString &arg : dialog->GetArguments()) { + std::string *s = event.add_arguments(); + s->assign(arg.toStdString()); + } + + AddChangeEventHelper(event, add); + } + }); + } else { + Object::EgmEvent event; + event.set_id(_eventsTypesModel->data(index, Qt::UserRole + 3).toString().toStdString()); + AddChangeEventHelper(event, add); + } +} + void ObjectEditor::RebindSubModels() { - _objectModel = _model->GetSubModel(TreeNode::kObjectFieldNumber); - _eventsModel->setSourceModel(_objectModel->GetSubModel(Object::kEgmEventsFieldNumber)); + _objectModel = _model->GetSubModel(TreeNode::kObjectFieldNumber); + _eventsModel->setSourceModel(_objectModel->GetSubModel(Object::kEgmEventsFieldNumber)); + + _sortedEvents = new QSortFilterProxyModel(_eventsModel); + _sortedEvents->setSourceModel(_eventsModel); + _sortedEvents->sort(0); + _sortedEvents->setDynamicSortFilter(true); + _ui->eventsList->setModel(_sortedEvents); - QSortFilterProxyModel* sortedEvents = new QSortFilterProxyModel(_eventsModel); - sortedEvents->setSourceModel(_eventsModel); - sortedEvents->sort(0); - _ui->eventsList->setModel(sortedEvents); + connect(_ui->eventsList, &QAbstractItemView::clicked, + [=](const QModelIndex &index) { SetCurrentEditor(MapRowTo(index.row())); }); - connect(_ui->eventsList, &QAbstractItemView::clicked, [=](const QModelIndex& index) { - SetCurrentEditor(sortedEvents->mapFromSource(_eventsModel->index(index.row(), 0)).row()); + connect(_ui->deleteEventButton, &QToolButton::pressed, [=]() { + QModelIndex selection = _ui->eventsList->selectionModel()->currentIndex(); + if (selection.row() != -1) RemoveEvent(MapRowTo(selection.row())); }); for (int event = 0; event < _eventsModel->rowCount(); ++event) { BindEventEditor(event); } + SetCurrentEditor(MapRowFrom(0)); + CheckDisableButtons(); + BaseEditor::RebindSubModels(); } -void ObjectEditor::CheckDisableButtons(int value) { - +void ObjectEditor::CheckDisableButtons() { + bool hasEvents = _sortedEvents->rowCount() > 0; + _ui->changeEventButton->setDisabled(!hasEvents); + _ui->deleteEventButton->setDisabled(!hasEvents); + _codeEditor->setDisabled(!hasEvents); + if (!hasEvents) _ui->eventLineEdit->setText(""); } void ObjectEditor::AddEvent(Object::EgmEvent event) { - RepeatedMessageModel* eventsModel = _objectModel->GetSubModel(Object::kEgmEventsFieldNumber); + RepeatedMessageModel *eventsModel = _objectModel->GetSubModel(Object::kEgmEventsFieldNumber); int idx = eventsModel->rowCount(); - bool insert = eventsModel->insertRow(idx); - if (insert) { ChangeEvent(idx, event); } + + if (IndexOf(event) == -1) { + bool insert = eventsModel->insertRow(idx); + if (insert) { + BindEventEditor(idx); + ChangeEvent(idx, event); + } + } else + qDebug() << "Event already exists"; } -void ObjectEditor::ChangeEvent(int idx, Object::EgmEvent event) { - RepeatedMessageModel* eventsModel = _objectModel->GetSubModel(Object::kEgmEventsFieldNumber); +void ObjectEditor::ChangeEvent(int idx, Object::EgmEvent event, bool changeCode) { + RepeatedMessageModel *eventsModel = _objectModel->GetSubModel(Object::kEgmEventsFieldNumber); eventsModel->SetData(QString::fromStdString(event.id()), idx, Object::EgmEvent::kIdFieldNumber); - eventsModel->SetData(QString::fromStdString(event.code()), idx, Object::EgmEvent::kCodeFieldNumber); - RepeatedStringModel* argsModel = - eventsModel->GetSubModel(idx) - ->GetSubModel(Object::EgmEvent::kArgumentsFieldNumber); + if (changeCode) + eventsModel->SetData(QString::fromStdString(event.code()), idx, Object::EgmEvent::kCodeFieldNumber); + + RepeatedStringModel *argsModel = eventsModel->GetSubModel(idx)->GetSubModel( + Object::EgmEvent::kArgumentsFieldNumber); size_t argc = 0; - argsModel->removeRows(0, argsModel->rowCount()); // clear old arguments + argsModel->removeRows(0, argsModel->rowCount()); // clear old arguments if (event.arguments_size() > 0) { argsModel->insertRows(argsModel->rowCount(), event.arguments_size()); - for (const auto& arg : event.arguments()) { + for (const auto &arg : event.arguments()) { argsModel->SetData(QString::fromStdString(arg), argc++); } } - _ui->eventsList->sortByColumn(0, Qt::AscendingOrder); + SetCurrentEditor(idx); + CheckDisableButtons(); } void ObjectEditor::RemoveEvent(int idx) { - RepeatedMessageModel* eventsModel = _objectModel->GetSubModel(Object::kEgmEventsFieldNumber); + RepeatedMessageModel *eventsModel = _objectModel->GetSubModel(Object::kEgmEventsFieldNumber); eventsModel->removeRow(idx); + _codeEditor->RemoveCodeWidget(idx); + SetCurrentEditor(MapRowFrom(0)); + CheckDisableButtons(); } int ObjectEditor::IndexOf(Object::EgmEvent event) { + std::vector args(event.arguments().begin(), event.arguments().end()); + Event e = MainWindow::GetEventData()->get_event(event.id(), args); + for (int i = 0; i < _eventsModel->rowCount(); ++i) { + if (_eventsModel->data(_eventsModel->index(i, 0)).toString() == QString::fromStdString(e.HumanName())) return i; + } return -1; } void ObjectEditor::BindEventEditor(int idx) { - RepeatedMessageModel* eventsModel = _objectModel->GetSubModel(Object::kEgmEventsFieldNumber); - CodeWidget* codeWidget = _codeEditor->AddCodeWidget(); - ModelMapper* mapper(new ModelMapper(eventsModel->GetSubModel(idx), this)); + RepeatedMessageModel *eventsModel = _objectModel->GetSubModel(Object::kEgmEventsFieldNumber); + CodeWidget *codeWidget = _codeEditor->AddCodeWidget(); + ModelMapper *mapper(new ModelMapper(eventsModel->GetSubModel(idx), this)); mapper->addMapping(codeWidget, Object::EgmEvent::kCodeFieldNumber); mapper->toFirst(); } void ObjectEditor::SetCurrentEditor(int idx) { - _codeEditor->SetCurrentIndex(idx); - /*_ui->momentsList->selectionModel()->select(_momentsModel->index(modelIndex, Timeline::Moment::kStepFieldNumber), - QItemSelectionModel::QItemSelectionModel::ClearAndSelec*/ + if (idx < _sortedEvents->rowCount()) { + _codeEditor->SetCurrentIndex(idx); + _ui->eventLineEdit->setText(_eventsModel->data(_eventsModel->index(idx, 0)).toString()); + _ui->eventsList->selectionModel()->select(_sortedEvents->index(MapRowFrom(idx), 0), + QItemSelectionModel::QItemSelectionModel::ClearAndSelect); + } +} + +int ObjectEditor::MapRowTo(int row) { return _sortedEvents->mapToSource(_sortedEvents->index(row, 0)).row(); } + +int ObjectEditor::MapRowFrom(int row) { return _sortedEvents->mapFromSource(_eventsModel->index(row, 0)).row(); } + +void ObjectEditor::on_spriteButton_triggered(QAction *arg1) +{ + qDebug() << "why slots no work"; } diff --git a/Editors/ObjectEditor.h b/Editors/ObjectEditor.h index 480138212..02233b350 100644 --- a/Editors/ObjectEditor.h +++ b/Editors/ObjectEditor.h @@ -5,6 +5,10 @@ #include "CodeEditor.h" #include "Object.pb.h" #include "Models/EventsListModel.h" +#include "Models/EventTypesListModel.h" + +#include +#include namespace Ui { class ObjectEditor; @@ -20,18 +24,28 @@ class ObjectEditor : public BaseEditor { public slots: void RebindSubModels() override; - private: - void CheckDisableButtons(int value); +private slots: + void on_spriteButton_triggered(QAction *arg1); + +private: + void BindEventMenu(QToolButton* btn, bool add); + void AddChangeFromMenuEvent(const QModelIndex &index, bool add); + void AddChangeEventHelper(const Object::EgmEvent& event, bool add); + void CheckDisableButtons(); void AddEvent(Object::EgmEvent event); - void ChangeEvent(int idx, Object::EgmEvent event); + void ChangeEvent(int idx, Object::EgmEvent event, bool changeCode = true); void RemoveEvent(int idx); int IndexOf(Object::EgmEvent event); void BindEventEditor(int idx); void SetCurrentEditor(int idx); + int MapRowTo(int row); + int MapRowFrom(int row); Ui::ObjectEditor* _ui; MessageModel* _objectModel = nullptr; EventsListModel* _eventsModel = nullptr; + QSortFilterProxyModel* _sortedEvents; + EventTypesListSortFilterProxyModel* _eventsTypesModel; CodeEditor* _codeEditor; }; diff --git a/Editors/ObjectEditor.ui b/Editors/ObjectEditor.ui index 7af5747e0..5801a4350 100644 --- a/Editors/ObjectEditor.ui +++ b/Editors/ObjectEditor.ui @@ -39,7 +39,7 @@ - 0 + 1 @@ -81,7 +81,11 @@ - + + + true + + @@ -113,7 +117,7 @@ - + Change Moment diff --git a/Models/TreeModel.cpp b/Models/TreeModel.cpp index debbc198c..98b18c3bb 100644 --- a/Models/TreeModel.cpp +++ b/Models/TreeModel.cpp @@ -87,6 +87,8 @@ QVariant TreeModel::data(const QModelIndex &index, int role) const { return icon; } else if (role == Qt::EditRole || role == Qt::DisplayRole) { return QString::fromStdString(item->name()); + } else if (role == TypeCaseRole) { + return item->type_case(); } return QVariant(); diff --git a/Models/TreeModel.h b/Models/TreeModel.h index 08415bde2..cadc1f99a 100644 --- a/Models/TreeModel.h +++ b/Models/TreeModel.h @@ -18,6 +18,9 @@ class TreeModel : public QAbstractItemModel { public: static IconMap iconMap; + static enum UserRoles { + TypeCaseRole = Qt::UserRole + } useroles; explicit TreeModel(buffers::TreeNode *root, ResourceModelMap *resourceMap, QObject *parent); From bb87a2a14689ddc863f5e63f5f44d20bcecf9a0b Mon Sep 17 00:00:00 2001 From: Goombert Date: Fri, 28 Aug 2020 19:31:12 -0400 Subject: [PATCH 20/29] fix code editor embedding and auto slot connections --- Editors/ObjectEditor.cpp | 33 +- Editors/ObjectEditor.h | 2 - Editors/ObjectEditor.ui | 810 ++++++++++++++++++++------------------- Submodules/enigma-dev | 2 +- 4 files changed, 425 insertions(+), 422 deletions(-) diff --git a/Editors/ObjectEditor.cpp b/Editors/ObjectEditor.cpp index 2aa7de264..c23e4815a 100644 --- a/Editors/ObjectEditor.cpp +++ b/Editors/ObjectEditor.cpp @@ -21,34 +21,13 @@ void ObjectEditor::BindEventMenu(QToolButton* btn, bool add) { } ObjectEditor::ObjectEditor(MessageModel *model, QWidget *parent) - : BaseEditor(model, parent), _ui(new Ui::ObjectEditor), _codeEditor(new CodeEditor(this, true)) { - QLayout *layout = new QVBoxLayout(this); - QSplitter *splitter = new QSplitter(this); - - QWidget *eventsWidget = new QWidget(this); - _ui->setupUi(eventsWidget); + : BaseEditor(model, parent), _ui(new Ui::ObjectEditor) { + _ui->setupUi(this); _nodeMapper->addMapping(_ui->nameEdit, TreeNode::kNameFieldNumber); connect(_ui->saveButton, &QAbstractButton::pressed, this, &BaseEditor::OnSave); - splitter->addWidget(eventsWidget); - splitter->addWidget(_codeEditor); - - layout->addWidget(splitter); - - layout->setMargin(0); - setLayout(layout); - - // Prefer resizing the code editor over the moments editor - splitter->setStretchFactor(0, 0); - splitter->setStretchFactor(1, 1); - - // Tell frankensteined widget to resize to proper size - resize(_codeEditor->geometry().width() + eventsWidget->geometry().width(), _codeEditor->geometry().height()); - - connect(_ui->saveButton, &QAbstractButton::pressed, this, &BaseEditor::OnSave); - _eventsModel = new EventsListModel(MainWindow::GetEventData(), this); EventTypesListModel *m = new EventTypesListModel(MainWindow::GetEventData(), this); @@ -134,7 +113,7 @@ void ObjectEditor::CheckDisableButtons() { bool hasEvents = _sortedEvents->rowCount() > 0; _ui->changeEventButton->setDisabled(!hasEvents); _ui->deleteEventButton->setDisabled(!hasEvents); - _codeEditor->setDisabled(!hasEvents); + _ui->codeEditor->setDisabled(!hasEvents); if (!hasEvents) _ui->eventLineEdit->setText(""); } @@ -179,7 +158,7 @@ void ObjectEditor::ChangeEvent(int idx, Object::EgmEvent event, bool changeCode) void ObjectEditor::RemoveEvent(int idx) { RepeatedMessageModel *eventsModel = _objectModel->GetSubModel(Object::kEgmEventsFieldNumber); eventsModel->removeRow(idx); - _codeEditor->RemoveCodeWidget(idx); + _ui->codeEditor->RemoveCodeWidget(idx); SetCurrentEditor(MapRowFrom(0)); CheckDisableButtons(); } @@ -195,7 +174,7 @@ int ObjectEditor::IndexOf(Object::EgmEvent event) { void ObjectEditor::BindEventEditor(int idx) { RepeatedMessageModel *eventsModel = _objectModel->GetSubModel(Object::kEgmEventsFieldNumber); - CodeWidget *codeWidget = _codeEditor->AddCodeWidget(); + CodeWidget *codeWidget = _ui->codeEditor->AddCodeWidget(); ModelMapper *mapper(new ModelMapper(eventsModel->GetSubModel(idx), this)); mapper->addMapping(codeWidget, Object::EgmEvent::kCodeFieldNumber); mapper->toFirst(); @@ -203,7 +182,7 @@ void ObjectEditor::BindEventEditor(int idx) { void ObjectEditor::SetCurrentEditor(int idx) { if (idx < _sortedEvents->rowCount()) { - _codeEditor->SetCurrentIndex(idx); + _ui->codeEditor->SetCurrentIndex(idx); _ui->eventLineEdit->setText(_eventsModel->data(_eventsModel->index(idx, 0)).toString()); _ui->eventsList->selectionModel()->select(_sortedEvents->index(MapRowFrom(idx), 0), QItemSelectionModel::QItemSelectionModel::ClearAndSelect); diff --git a/Editors/ObjectEditor.h b/Editors/ObjectEditor.h index 02233b350..fb289ec5a 100644 --- a/Editors/ObjectEditor.h +++ b/Editors/ObjectEditor.h @@ -2,7 +2,6 @@ #define OBJECTEDITOR_H #include "BaseEditor.h" -#include "CodeEditor.h" #include "Object.pb.h" #include "Models/EventsListModel.h" #include "Models/EventTypesListModel.h" @@ -46,7 +45,6 @@ private slots: EventsListModel* _eventsModel = nullptr; QSortFilterProxyModel* _sortedEvents; EventTypesListSortFilterProxyModel* _eventsTypesModel; - CodeEditor* _codeEditor; }; #endif // OBJECTEDITOR_H diff --git a/Editors/ObjectEditor.ui b/Editors/ObjectEditor.ui index 5801a4350..6b99aa667 100644 --- a/Editors/ObjectEditor.ui +++ b/Editors/ObjectEditor.ui @@ -6,8 +6,8 @@ 0 0 - 278 - 473 + 683 + 346 @@ -23,424 +23,443 @@ :/resources/object.png:/resources/object.png - + + + 4 + - 2 + 4 - 2 + 4 - 2 + 4 - 2 + 4 - - - 1 + + + 4 - - - Events - - - - 2 - - - 2 - - - 2 + + + + 1 - - 2 - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Event - - - - - - - true - - - - - - - - 0 - 0 - - - - Add Event - - - Add Event - - - - :/actions/add.png:/actions/add.png - - - false - - - false - - - QToolButton::MenuButtonPopup - - - - - - - Change Moment - - - Change Moment - - - - :/events/event.png:/events/event.png - - - QToolButton::MenuButtonPopup - - - - - - - - 0 - 0 - - - - Delete Event - - - Delete Event - - - - :/actions/delete.png:/actions/delete.png - - - false - - - Qt::ToolButtonIconOnly - - - Qt::NoArrow - - - - - - - - - - - 0 - 0 - + + + Events + + + + 2 - - false + + 2 - - true + + 2 - - - - - - - Properties - - - - 2 - - - 2 - - - 2 - - - 2 - - - - - - - - Qt::LeftToRight - - - Name - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - obj_0 - - - - - - - Depth - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - - - - - - - - - - - - 0 - 0 - - - - Add a new sprite or edit the selected one + + 2 + + + + + + 0 - - Sprite + + 0 - - - :/actions/add.png:/actions/add.png + + 0 - - Qt::ToolButtonTextBesideIcon + + 0 - - - - - - <no sprite> - + + + Event + + - - - - - - - 0 - 0 - - - - Add a new object as parent or edit the selected one - - - Parent - - - - :/actions/add.png:/actions/add.png - - - QToolButton::DelayedPopup - - - Qt::ToolButtonTextBesideIcon - - - - - - - - 0 - 0 - - - - true - - - QComboBox::AdjustToContentsOnFirstShow - - - true - - - <no parent> - + + + true + + - - - - - - true - - - - 0 - 0 - - - - Add a new sprite or edit the selected mask - - - Mask - - - - :/actions/add.png:/actions/add.png - - - QToolButton::DelayedPopup - - - Qt::ToolButtonTextBesideIcon - - - Qt::NoArrow - - - - - - - - 0 - 0 - - - - QComboBox::AdjustToContentsOnFirstShow - - - <same as sprite> - + + + + 0 + 0 + + + + Add Event + + + Add Event + + + + :/actions/add.png:/actions/add.png + + + false + + + false + + + QToolButton::MenuButtonPopup + + - - - - - - - - - - - - Solid - - - - - - - Visible - - - - - - - Persistent - - - - - - - - - - Qt::Vertical + + + + Change Moment + + + Change Moment + + + + :/events/event.png:/events/event.png + + + QToolButton::MenuButtonPopup + + + + + + + + 0 + 0 + + + + Delete Event + + + Delete Event + + + + :/actions/delete.png:/actions/delete.png + + + false + + + Qt::ToolButtonIconOnly + + + Qt::NoArrow + + + + + + + + + + + 0 + 0 + + + + false + + + true + + + + + + + + Properties + + + + 2 - - - 20 - 137 - + + 2 - - - - - + + 2 + + + 2 + + + + + + + + Qt::LeftToRight + + + &Name + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + nameEdit + + + + + + + obj_0 + + + + + + + &Depth + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + depthSpinBox + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + + + + Add a new sprite or edit the selected one + + + Sprite + + + + :/actions/add.png:/actions/add.png + + + Qt::ToolButtonTextBesideIcon + + + + + + + + <no sprite> + + + + + + + + + 0 + 0 + + + + Add a new object as parent or edit the selected one + + + &Parent + + + + :/actions/add.png:/actions/add.png + + + QToolButton::DelayedPopup + + + Qt::ToolButtonTextBesideIcon + + + + + + + + 0 + 0 + + + + true + + + QComboBox::AdjustToContentsOnFirstShow + + + true + + + + <no parent> + + + + + + + + true + + + + 0 + 0 + + + + Add a new sprite or edit the selected mask + + + &Mask + + + + :/actions/add.png:/actions/add.png + + + QToolButton::DelayedPopup + + + Qt::ToolButtonTextBesideIcon + + + Qt::NoArrow + + + + + + + + 0 + 0 + + + + QComboBox::AdjustToContentsOnFirstShow + + + + <same as sprite> + + + + + + + + + + + + + + Solid + + + + + + + Visible + + + + + + + Persistent + + + + + + + + + + Qt::Vertical + + + + 20 + 137 + + + + + + + + + + + + Save + + + + :/actions/accept.png:/actions/accept.png + + + true + + + + - - - Save - - - - :/actions/accept.png:/actions/accept.png - - - true - - + @@ -471,6 +490,13 @@ + + + CodeEditor + QTextEdit +
Editors/CodeEditor.h
+
+
diff --git a/Submodules/enigma-dev b/Submodules/enigma-dev index 9195a5ffe..aafa082b3 160000 --- a/Submodules/enigma-dev +++ b/Submodules/enigma-dev @@ -1 +1 @@ -Subproject commit 9195a5ffe09bc697b3dac76f6231d74e68a1601f +Subproject commit aafa082b3ac79b798fbfba4d9e77b618de9dd07d From daed453ed20d14d78efe6583dda79759fca4663e Mon Sep 17 00:00:00 2001 From: Greg Williamson Date: Mon, 31 Aug 2020 10:47:54 -0400 Subject: [PATCH 21/29] done but buggy --- CMakeLists.txt | 8 +- Editors/ObjectEditor.cpp | 27 +++--- Editors/ObjectEditor.h | 8 +- Editors/ObjectEditor.ui | 2 +- Models/EventTypesListModel.cpp | 43 ++++++++++ Models/EventTypesListModel.h | 84 ++++--------------- Models/EventTypesListSortFilterProxyModel.cpp | 24 ++++++ Models/EventTypesListSortFilterProxyModel.h | 13 +++ RadialGM.pro | 6 ++ Submodules/enigma-dev | 2 +- 10 files changed, 123 insertions(+), 94 deletions(-) create mode 100644 Models/EventTypesListModel.cpp create mode 100644 Models/EventTypesListSortFilterProxyModel.cpp create mode 100644 Models/EventTypesListSortFilterProxyModel.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 744b32ec1..05147143d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -69,6 +69,8 @@ set(RGM_SOURCES Models/ResourceModelMap.cpp Models/TreeModel.cpp Models/EventsListModel.cpp + Models/EventTypesListModel.cpp + Models/EventTypesListSortFilterProxyModel.cpp Editors/ObjectEditor.cpp Editors/PathEditor.cpp Editors/CodeEditor.cpp @@ -119,6 +121,8 @@ set(RGM_HEADERS Models/ProtoModel.h Models/RepeatedModel.h Models/EventsListModel.h + Models/EventTypesListModel.h + Models/EventTypesListSortFilterProxyModel.h Editors/FontEditor.h Editors/PathEditor.h Editors/SpriteEditor.h @@ -205,7 +209,7 @@ set(CompilerFlags CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_RELWITHDEBINFO ) - + foreach(CompilerFlag ${CompilerFlags}) message(STATUS " '${CompilerFlag}': ${${CompilerFlag}}") endforeach() @@ -318,7 +322,7 @@ file(TO_CMAKE_PATH ${VCPKG_ROOT} VCPKG_ROOT) set(SEARCH_PATHS "${VCPKG_ROOT}/installed/x64-windows/bin/") endif() else() - set(LIBS "${CMAKE_INSTALL_PREFIX}/${CMAKE_SHARED_LIBRARY_PREFIX}EGM${CMAKE_SHARED_LIBRARY_SUFFIX}" + set(LIBS "${CMAKE_INSTALL_PREFIX}/${CMAKE_SHARED_LIBRARY_PREFIX}EGM${CMAKE_SHARED_LIBRARY_SUFFIX}" "${CMAKE_INSTALL_PREFIX}/${CMAKE_SHARED_LIBRARY_PREFIX}Protocols${CMAKE_SHARED_LIBRARY_SUFFIX}" "${CMAKE_INSTALL_PREFIX}/${CMAKE_SHARED_LIBRARY_PREFIX}ENIGMAShared${CMAKE_SHARED_LIBRARY_SUFFIX}") endif() diff --git a/Editors/ObjectEditor.cpp b/Editors/ObjectEditor.cpp index 2aa7de264..767f7eadf 100644 --- a/Editors/ObjectEditor.cpp +++ b/Editors/ObjectEditor.cpp @@ -10,14 +10,12 @@ #include -void ObjectEditor::BindEventMenu(QToolButton* btn, bool add) { +void ObjectEditor::BindEventMenu(QToolButton *btn, bool add) { QMenuView *eventsMenu = new QMenuView(this); eventsMenu->setModel(_eventsTypesModel); eventsMenu->setToolTipsVisible(true); btn->setMenu(eventsMenu); - connect(eventsMenu, &QMenuView::triggered, [=](const QModelIndex &index) { - AddChangeFromMenuEvent(index, add); - }); + connect(eventsMenu, &QMenuView::triggered, [=](const QModelIndex &index) { AddChangeFromMenuEvent(index, add); }); } ObjectEditor::ObjectEditor(MessageModel *model, QWidget *parent) @@ -64,7 +62,7 @@ ObjectEditor::ObjectEditor(MessageModel *model, QWidget *parent) ObjectEditor::~ObjectEditor() { delete _ui; } -void ObjectEditor::AddChangeEventHelper(const Object::EgmEvent& event, bool add) { +void ObjectEditor::AddChangeEventHelper(const Object::EgmEvent &event, bool add) { if (add) { AddEvent(event); } else { @@ -72,12 +70,13 @@ void ObjectEditor::AddChangeEventHelper(const Object::EgmEvent& event, bool add) int selectedIdx = MapRowTo(_ui->eventsList->selectionModel()->currentIndex().row()); if (existingIdx == -1 && selectedIdx != -1) { ChangeEvent(selectedIdx, event, false); - } else qDebug() << "Change event failed"; + } else + qDebug() << "Change event failed"; } } void ObjectEditor::AddChangeFromMenuEvent(const QModelIndex &index, bool add) { - QStringList args = _eventsTypesModel->data(index, Qt::UserRole + 2).toStringList(); + QStringList args = _eventsTypesModel->data(index, EventTypesListModel::UserRoles::EventArgumentsRole).toStringList(); EventArgumentsDialog *dialog = nullptr; if (args.size() > 0) { dialog = new EventArgumentsDialog(this, args); @@ -86,7 +85,8 @@ void ObjectEditor::AddChangeFromMenuEvent(const QModelIndex &index, bool add) { connect(dialog, &QDialog::accepted, [=]() { if (dialog->result() == QDialog::Accepted) { Object::EgmEvent event; - event.set_id(_eventsTypesModel->data(index, Qt::UserRole + 3).toString().toStdString()); + event.set_id( + _eventsTypesModel->data(index, EventTypesListModel::UserRoles::EventBareIDRole).toString().toStdString()); for (const QString &arg : dialog->GetArguments()) { std::string *s = event.add_arguments(); s->assign(arg.toStdString()); @@ -97,7 +97,8 @@ void ObjectEditor::AddChangeFromMenuEvent(const QModelIndex &index, bool add) { }); } else { Object::EgmEvent event; - event.set_id(_eventsTypesModel->data(index, Qt::UserRole + 3).toString().toStdString()); + event.set_id( + _eventsTypesModel->data(index, EventTypesListModel::UserRoles::EventBareIDRole).toString().toStdString()); AddChangeEventHelper(event, add); } } @@ -157,8 +158,7 @@ void ObjectEditor::ChangeEvent(int idx, Object::EgmEvent event, bool changeCode) eventsModel->SetData(QString::fromStdString(event.id()), idx, Object::EgmEvent::kIdFieldNumber); - if (changeCode) - eventsModel->SetData(QString::fromStdString(event.code()), idx, Object::EgmEvent::kCodeFieldNumber); + if (changeCode) eventsModel->SetData(QString::fromStdString(event.code()), idx, Object::EgmEvent::kCodeFieldNumber); RepeatedStringModel *argsModel = eventsModel->GetSubModel(idx)->GetSubModel( Object::EgmEvent::kArgumentsFieldNumber); @@ -213,8 +213,3 @@ void ObjectEditor::SetCurrentEditor(int idx) { int ObjectEditor::MapRowTo(int row) { return _sortedEvents->mapToSource(_sortedEvents->index(row, 0)).row(); } int ObjectEditor::MapRowFrom(int row) { return _sortedEvents->mapFromSource(_eventsModel->index(row, 0)).row(); } - -void ObjectEditor::on_spriteButton_triggered(QAction *arg1) -{ - qDebug() << "why slots no work"; -} diff --git a/Editors/ObjectEditor.h b/Editors/ObjectEditor.h index 02233b350..f829fccc6 100644 --- a/Editors/ObjectEditor.h +++ b/Editors/ObjectEditor.h @@ -6,6 +6,7 @@ #include "Object.pb.h" #include "Models/EventsListModel.h" #include "Models/EventTypesListModel.h" +#include "Models/EventTypesListSortFilterProxyModel.h" #include #include @@ -24,9 +25,6 @@ class ObjectEditor : public BaseEditor { public slots: void RebindSubModels() override; -private slots: - void on_spriteButton_triggered(QAction *arg1); - private: void BindEventMenu(QToolButton* btn, bool add); void AddChangeFromMenuEvent(const QModelIndex &index, bool add); @@ -42,8 +40,8 @@ private slots: int MapRowFrom(int row); Ui::ObjectEditor* _ui; - MessageModel* _objectModel = nullptr; - EventsListModel* _eventsModel = nullptr; + MessageModel* _objectModel; + EventsListModel* _eventsModel; QSortFilterProxyModel* _sortedEvents; EventTypesListSortFilterProxyModel* _eventsTypesModel; CodeEditor* _codeEditor; diff --git a/Editors/ObjectEditor.ui b/Editors/ObjectEditor.ui index 5801a4350..a041141f2 100644 --- a/Editors/ObjectEditor.ui +++ b/Editors/ObjectEditor.ui @@ -39,7 +39,7 @@ - 1 + 0 diff --git a/Models/EventTypesListModel.cpp b/Models/EventTypesListModel.cpp new file mode 100644 index 000000000..aa6cbee2e --- /dev/null +++ b/Models/EventTypesListModel.cpp @@ -0,0 +1,43 @@ +#include "EventTypesListModel.h" + +EventTypesListModel::EventTypesListModel(EventData* eventData, QObject* parent) + : QAbstractListModel(parent), eventData_(eventData) {} + +QVariant EventTypesListModel::data(const QModelIndex& index, int role) const { + if (!index.isValid()) return QVariant(); + + switch (role) { + case Qt::DecorationRole: { + QIcon icon(":/events/" + QString::fromStdString(eventData_->events()[index.row()].bare_id()).toLower() + ".png"); + if (!icon.availableSizes().empty()) return icon; + return QIcon(":/events/other.png"); + } + + case Qt::DisplayRole: { + QString str = QString::fromStdString(eventData_->events()[index.row()].HumanName()); + while (str.contains("%")) { + str = str.arg(""); + } + return str; + } + + case Qt::ToolTipRole: return QString::fromStdString(eventData_->events()[index.row()].HumanDescription()); + case EventTypeRole: return eventData_->events()[index.row()].event->type() != 5; //FIXME: mark hidden events in ey + case EventGroupRole: return QString::fromStdString(eventData_->events()[index.row()].GroupName()); + case EventArgumentsRole: { + QStringList args; + for (const auto& str : eventData_->events()[index.row()].event->parameters()) { + args.append(QString::fromStdString(str)); + } + return args; + } + case EventBareIDRole: { + return QString::fromStdString(eventData_->events()[index.row()].bare_id()); + } + + default: return QVariant(); + } +} + +int EventTypesListModel::rowCount(const QModelIndex& parent) const { return eventData_->events().size(); } +int EventTypesListModel::columnCount(const QModelIndex& parent) const { return 1; } diff --git a/Models/EventTypesListModel.h b/Models/EventTypesListModel.h index 5b6668d88..503660668 100644 --- a/Models/EventTypesListModel.h +++ b/Models/EventTypesListModel.h @@ -1,84 +1,30 @@ #ifndef EVENTTYPESSLISTSMODEL_H #define EVENTTYPESSLISTSMODEL_H +#include "EventDescriptor.pb.h" #include "RepeatedMessageModel.h" #include "event_reader/event_parser.h" -#include "EventDescriptor.pb.h" #include -#include #include +#include class EventTypesListModel : public QAbstractListModel { private: - EventData* eventData_; + EventData* eventData_; public: - EventTypesListModel(EventData* eventData, QObject* parent = nullptr) : - QAbstractListModel(parent), eventData_(eventData) { - - } - - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override { - if (!index.isValid()) return QVariant(); - - switch (role) { - case Qt::DecorationRole: { - QIcon icon(":/events/" + QString::fromStdString(eventData_->events()[index.row()].bare_id()).toLower() + ".png"); - if (!icon.availableSizes().empty()) return icon; - return QIcon(":/events/other.png"); - } - - case Qt::DisplayRole: { - QString str = QString::fromStdString(eventData_->events()[index.row()].HumanName()); - while (str.contains("%")) { - str = str.arg(""); - } - return str; - } - - case Qt::ToolTipRole: return QString::fromStdString(eventData_->events()[index.row()].HumanDescription()); - case Qt::UserRole: return eventData_->events()[index.row()].event->type() != 5; //FIXME: mark hidden events in ey - case Qt::UserRole+1: return QString::fromStdString(eventData_->events()[index.row()].GroupName()); - case Qt::UserRole+2: { - QStringList args; - for (const auto& str : eventData_->events()[index.row()].event->parameters()) { - args.append(QString::fromStdString(str)); - } - return args; - } - case Qt::UserRole+3: { - return QString::fromStdString(eventData_->events()[index.row()].bare_id()); - } - - default: return QVariant(); - - } - } - - int rowCount(const QModelIndex &parent = QModelIndex()) const override { return eventData_->events().size(); } - int columnCount(const QModelIndex &parent = QModelIndex()) const override { return 1; } - -}; - -class EventTypesListSortFilterProxyModel : public QSortFilterProxyModel { -public: - EventTypesListSortFilterProxyModel(QObject* parent = nullptr) : QSortFilterProxyModel(parent) {} - bool filterAcceptsRow(int source_row, const QModelIndex& /*source_parent*/) const override { - return sourceModel()->data(sourceModel()->index(source_row, 0), Qt::UserRole).toBool(); - } - bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const override { - //FIXME: trying to sort alpha but keep grouped events together - QString leftGroup = sourceModel()->data(source_left, Qt::UserRole+1).toString(); - QString rightGroup = sourceModel()->data(source_right, Qt::UserRole+1).toString(); - - if (leftGroup == rightGroup) { - return sourceModel()->data(source_left, Qt::DisplayRole).toString() < - sourceModel()->data(source_right, Qt::DisplayRole).toString(); - } - - return leftGroup < rightGroup; - } + static enum UserRoles { + EventTypeRole = Qt::UserRole, + EventGroupRole = Qt::UserRole + 1, + EventArgumentsRole = Qt::UserRole + 2, + EventBareIDRole = Qt::UserRole + 3 + } useroles; + + EventTypesListModel(EventData* eventData, QObject* parent = nullptr); + QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override; + int rowCount(const QModelIndex& parent = QModelIndex()) const override; + int columnCount(const QModelIndex& parent = QModelIndex()) const override; }; -#endif // EVENTTYPESSLISTS_H +#endif // EVENTTYPESSLISTS_H diff --git a/Models/EventTypesListSortFilterProxyModel.cpp b/Models/EventTypesListSortFilterProxyModel.cpp new file mode 100644 index 000000000..eff9b4cf8 --- /dev/null +++ b/Models/EventTypesListSortFilterProxyModel.cpp @@ -0,0 +1,24 @@ +#include "EventTypesListSortFilterProxyModel.h" +#include "EventTypesListModel.h" + + +EventTypesListSortFilterProxyModel::EventTypesListSortFilterProxyModel(QObject* parent) + : QSortFilterProxyModel(parent) {} + +bool EventTypesListSortFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex& /*source_parent*/) const { + return sourceModel()->data(sourceModel()->index(source_row, 0), Qt::UserRole).toBool(); +} + +bool EventTypesListSortFilterProxyModel::lessThan(const QModelIndex& source_left, + const QModelIndex& source_right) const { + //Try to sort alpha but keep grouped events together + QString leftGroup = sourceModel()->data(source_left, EventTypesListModel::UserRoles::EventGroupRole).toString(); + QString rightGroup = sourceModel()->data(source_right, EventTypesListModel::UserRoles::EventGroupRole).toString(); + + if (leftGroup == rightGroup) { + return sourceModel()->data(source_left, Qt::DisplayRole).toString() < + sourceModel()->data(source_right, Qt::DisplayRole).toString(); + } + + return leftGroup < rightGroup; +} diff --git a/Models/EventTypesListSortFilterProxyModel.h b/Models/EventTypesListSortFilterProxyModel.h new file mode 100644 index 000000000..d119d4636 --- /dev/null +++ b/Models/EventTypesListSortFilterProxyModel.h @@ -0,0 +1,13 @@ +#ifndef EVENTTYPESLISTSORTFILTERPROXYMODEL_H +#define EVENTTYPESLISTSORTFILTERPROXYMODEL_H + +#include + +class EventTypesListSortFilterProxyModel : public QSortFilterProxyModel { + public: + EventTypesListSortFilterProxyModel(QObject* parent = nullptr); + bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const override; + bool lessThan(const QModelIndex& source_left, const QModelIndex& source_right) const override; +}; + +#endif // EVENTTYPESLISTSORTFILTERPROXYMODEL_H diff --git a/RadialGM.pro b/RadialGM.pro index 2a9b3dc19..0014574d4 100644 --- a/RadialGM.pro +++ b/RadialGM.pro @@ -72,6 +72,8 @@ SOURCES += \ Dialogs/TimelineChangeMoment.cpp \ Editors/ShaderEditor.cpp \ Editors/SpriteEditor.cpp \ + Models/EventTypesListModel.cpp \ + Models/EventTypesListSortFilterProxyModel.cpp \ Models/EventsListModel.cpp \ Models/MessageModel.cpp \ Models/RepeatedImageModel.cpp \ @@ -130,6 +132,7 @@ HEADERS += \ Editors/RoomEditor.h \ Editors/SettingsEditor.h \ Models/EventTypesListModel.h \ + Models/EventTypesListSortFilterProxyModel.h \ Models/EventsListModel.h \ Models/MessageModel.h \ Models/RepeatedImageModel.h \ @@ -184,3 +187,6 @@ FORMS += \ RESOURCES += \ images.qrc + +DISTFILES += \ + CMakeLists.txt diff --git a/Submodules/enigma-dev b/Submodules/enigma-dev index 9195a5ffe..f82929201 160000 --- a/Submodules/enigma-dev +++ b/Submodules/enigma-dev @@ -1 +1 @@ -Subproject commit 9195a5ffe09bc697b3dac76f6231d74e68a1601f +Subproject commit f829292014cc870cf05a7484b26496612742279d From 0e8efc3ca92b0d8fae26090df2fc40fa0739555b Mon Sep 17 00:00:00 2001 From: Goombert Date: Mon, 31 Aug 2020 11:53:30 -0400 Subject: [PATCH 22/29] readd splitter --- Editors/ObjectEditor.ui | 820 ++++++++++++++++++++-------------------- 1 file changed, 416 insertions(+), 404 deletions(-) diff --git a/Editors/ObjectEditor.ui b/Editors/ObjectEditor.ui index 6d660e397..d36d85a23 100644 --- a/Editors/ObjectEditor.ui +++ b/Editors/ObjectEditor.ui @@ -6,7 +6,7 @@ 0 0 - 903 + 727 357 @@ -23,7 +23,7 @@ :/resources/object.png:/resources/object.png - + 4 @@ -40,426 +40,438 @@ 4 - - - 4 + + + Qt::Horizontal - - - - 0 + + + + 4 - - - Events - - - - 2 + + + + 0 - - 2 - - - 2 - - - 2 - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Event - - - - - - - true - - - - - - - - 0 - 0 - - - - Add Event - - - Add Event - - - - :/actions/add.png:/actions/add.png - - - false - - - false - - - QToolButton::MenuButtonPopup - - - - - - - Change Moment - - - Change Moment - - - - :/events/event.png:/events/event.png - - - QToolButton::MenuButtonPopup - - - - - - - - 0 - 0 - - - - Delete Event - - - Delete Event - - - - :/actions/delete.png:/actions/delete.png - - - false - - - Qt::ToolButtonIconOnly - - - Qt::NoArrow - - - - - - - - - - - 0 - 0 - + + + Events + + + + 2 - - false + + 2 - - true + + 2 - - - - - - - Properties - - - - 2 - - - 2 - - - 2 - - - 2 - - - - - - - - Qt::LeftToRight - - - &Name - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - nameEdit - - - - - - - obj_0 - - - - - - - &Depth - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - depthSpinBox - - - - - - - - 0 - 0 - - - - - - - - - - - - - - - 0 - 0 - - - - Add a new sprite or edit the selected one + + 2 + + + + + + 0 - - Sprite + + 0 - - - :/actions/add.png:/actions/add.png + + 0 - - Qt::ToolButtonTextBesideIcon + + 0 - - - - - - <no sprite> - + + + Event + + - - - - - - - 0 - 0 - - - - Add a new object as parent or edit the selected one - - - &Parent - - - - :/actions/add.png:/actions/add.png - - - QToolButton::DelayedPopup - - - Qt::ToolButtonTextBesideIcon - - - - - - - - 0 - 0 - - - - true - - - QComboBox::AdjustToContentsOnFirstShow - - - true - - - <no parent> - + + + true + + - - - - - - true - - - - 0 - 0 - - - - Add a new sprite or edit the selected mask - - - &Mask - - - - :/actions/add.png:/actions/add.png - - - QToolButton::DelayedPopup - - - Qt::ToolButtonTextBesideIcon - - - Qt::NoArrow - - - - - - - - 0 - 0 - - - - QComboBox::AdjustToContentsOnFirstShow - - - <same as sprite> - + + + + 0 + 0 + + + + Add Event + + + Add Event + + + + :/actions/add.png:/actions/add.png + + + false + + + false + + + QToolButton::MenuButtonPopup + + - - - - - - - - - - - - Solid - - - - - - - Visible - - - - - - - Persistent - - - - - - - - - - Qt::Vertical + + + + Change Moment + + + Change Moment + + + + :/events/event.png:/events/event.png + + + QToolButton::MenuButtonPopup + + + + + + + + 0 + 0 + + + + Delete Event + + + Delete Event + + + + :/actions/delete.png:/actions/delete.png + + + false + + + Qt::ToolButtonIconOnly + + + Qt::NoArrow + + + + + + + + + + + 0 + 0 + + + + false + + + true + + + + + + + + Properties + + + + 2 - - - 20 - 137 - + + 2 - - - - - - - - - - Save - - - - :/actions/accept.png:/actions/accept.png - - - true - - - - - - - + + 2 + + + 2 + + + + + + + + Qt::LeftToRight + + + &Name + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + nameEdit + + + + + + + obj_0 + + + + + + + &Depth + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + depthSpinBox + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + 0 + 0 + + + + Add a new sprite or edit the selected one + + + Sprite + + + + :/actions/add.png:/actions/add.png + + + Qt::ToolButtonTextBesideIcon + + + + + + + + <no sprite> + + + + + + + + + 0 + 0 + + + + Add a new object as parent or edit the selected one + + + &Parent + + + + :/actions/add.png:/actions/add.png + + + QToolButton::DelayedPopup + + + Qt::ToolButtonTextBesideIcon + + + + + + + + 0 + 0 + + + + true + + + QComboBox::AdjustToContentsOnFirstShow + + + true + + + + <no parent> + + + + + + + + true + + + + 0 + 0 + + + + Add a new sprite or edit the selected mask + + + &Mask + + + + :/actions/add.png:/actions/add.png + + + QToolButton::DelayedPopup + + + Qt::ToolButtonTextBesideIcon + + + Qt::NoArrow + + + + + + + + 0 + 0 + + + + QComboBox::AdjustToContentsOnFirstShow + + + + <same as sprite> + + + + + + + + + + + + + + Solid + + + + + + + Visible + + + + + + + Persistent + + + + + + + + + + Qt::Vertical + + + + 20 + 137 + + + + + + + + + + + + Save + + + + :/actions/accept.png:/actions/accept.png + + + true + + + + + + + + + 1 + 0 + + + + From 69bbd4e13043af35587200f2d1b58d33031ea8a4 Mon Sep 17 00:00:00 2001 From: Goombert Date: Mon, 31 Aug 2020 12:35:06 -0400 Subject: [PATCH 23/29] return explicit invalid model index --- Models/RepeatedModel.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Models/RepeatedModel.h b/Models/RepeatedModel.h index fd4a80881..2d3427f09 100644 --- a/Models/RepeatedModel.h +++ b/Models/RepeatedModel.h @@ -71,8 +71,8 @@ class RepeatedModel : public ProtoModel { virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override { auto data = ProtoModel::headerData(section, orientation, role); if (data.isValid()) return data; - if (section < 0 || role != Qt::DisplayRole || orientation != Qt::Orientation::Horizontal) - return data; + if (section <= 0 || role != Qt::DisplayRole || orientation != Qt::Orientation::Horizontal) + return QModelIndex(); return QString::fromStdString(_field->message_type()->field(section - 1)->name()); } From 3722673d30843872d1b12237670ad87e1f8b82e8 Mon Sep 17 00:00:00 2001 From: Goombert Date: Mon, 31 Aug 2020 17:51:34 -0400 Subject: [PATCH 24/29] Simplify event argument dialog done --- Dialogs/EventArgumentsDialog.cpp | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/Dialogs/EventArgumentsDialog.cpp b/Dialogs/EventArgumentsDialog.cpp index e9bb43d9e..d3c1af563 100644 --- a/Dialogs/EventArgumentsDialog.cpp +++ b/Dialogs/EventArgumentsDialog.cpp @@ -95,13 +95,8 @@ const QStringList &EventArgumentsDialog::GetArguments() const { return arguments void EventArgumentsDialog::done(int r) { for (const QWidget *w : widgets_) { QVariant argument = w->metaObject()->userProperty().read(w); - QString argstr = ""; - if (QString(w->metaObject()->className()) == "QSpinBox") { - argstr = QString::number(reinterpret_cast(w)->value()); - } else { - if (argument.isValid() && (QMetaType::Type)argument.type() == QMetaType::QString) argstr = argument.toString(); - } - arguments_.append(argstr); + if (argument.isValid()) + arguments_.append(argument.toString()); } QDialog::done(r); From 42ca589b27c686426c303e4df95a42e494155384 Mon Sep 17 00:00:00 2001 From: Goombert Date: Mon, 31 Aug 2020 18:09:22 -0400 Subject: [PATCH 25/29] fundies wants fail safe in case arg is invalid so correct number of args --- Dialogs/EventArgumentsDialog.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Dialogs/EventArgumentsDialog.cpp b/Dialogs/EventArgumentsDialog.cpp index d3c1af563..457b2d4af 100644 --- a/Dialogs/EventArgumentsDialog.cpp +++ b/Dialogs/EventArgumentsDialog.cpp @@ -95,8 +95,10 @@ const QStringList &EventArgumentsDialog::GetArguments() const { return arguments void EventArgumentsDialog::done(int r) { for (const QWidget *w : widgets_) { QVariant argument = w->metaObject()->userProperty().read(w); + QString argstr = ""; if (argument.isValid()) - arguments_.append(argument.toString()); + argstr = argument.toString(); + arguments_.append(argstr); } QDialog::done(r); From 0d7c65c3f91be5fe9281470318cb934afb27cee1 Mon Sep 17 00:00:00 2001 From: Robert Colton Date: Mon, 31 Aug 2020 18:16:17 -0400 Subject: [PATCH 26/29] Update Models/EventTypesListModel.h --- Models/EventTypesListModel.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Models/EventTypesListModel.h b/Models/EventTypesListModel.h index 503660668..ccc115d19 100644 --- a/Models/EventTypesListModel.h +++ b/Models/EventTypesListModel.h @@ -16,9 +16,9 @@ class EventTypesListModel : public QAbstractListModel { public: static enum UserRoles { EventTypeRole = Qt::UserRole, - EventGroupRole = Qt::UserRole + 1, - EventArgumentsRole = Qt::UserRole + 2, - EventBareIDRole = Qt::UserRole + 3 + EventGroupRole, + EventArgumentsRole, + EventBareIDRole } useroles; EventTypesListModel(EventData* eventData, QObject* parent = nullptr); From a7d04386a35adceacca6d22194c7f8c13e76f566 Mon Sep 17 00:00:00 2001 From: Robert Colton Date: Mon, 31 Aug 2020 18:25:16 -0400 Subject: [PATCH 27/29] Update EventTypesListModel.h --- Models/EventTypesListModel.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Models/EventTypesListModel.h b/Models/EventTypesListModel.h index ccc115d19..e3b3c4254 100644 --- a/Models/EventTypesListModel.h +++ b/Models/EventTypesListModel.h @@ -14,6 +14,9 @@ class EventTypesListModel : public QAbstractListModel { EventData* eventData_; public: + // define our application specific roles starting at Qt::UserRole + // https://doc.qt.io/qt-5/qt.html#ItemDataRole-enum + // NOTE: C++ enums increment the previous value by one automatically static enum UserRoles { EventTypeRole = Qt::UserRole, EventGroupRole, From 01fe6acfdf331e3e55f9dfb59426ac33319c9b7e Mon Sep 17 00:00:00 2001 From: Robert Colton Date: Mon, 31 Aug 2020 18:36:24 -0400 Subject: [PATCH 28/29] Update Models/EventTypesListSortFilterProxyModel.cpp --- Models/EventTypesListSortFilterProxyModel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Models/EventTypesListSortFilterProxyModel.cpp b/Models/EventTypesListSortFilterProxyModel.cpp index eff9b4cf8..efc54c76e 100644 --- a/Models/EventTypesListSortFilterProxyModel.cpp +++ b/Models/EventTypesListSortFilterProxyModel.cpp @@ -6,7 +6,7 @@ EventTypesListSortFilterProxyModel::EventTypesListSortFilterProxyModel(QObject* : QSortFilterProxyModel(parent) {} bool EventTypesListSortFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex& /*source_parent*/) const { - return sourceModel()->data(sourceModel()->index(source_row, 0), Qt::UserRole).toBool(); + return sourceModel()->data(sourceModel()->index(source_row, 0), EventTypesListModel::UserRoles::EventTypeRole).toBool(); } bool EventTypesListSortFilterProxyModel::lessThan(const QModelIndex& source_left, From 27d26917364ac34912ee4ae82915a782c8b6ce90 Mon Sep 17 00:00:00 2001 From: Goombert Date: Tue, 1 Sep 2020 19:32:13 -0400 Subject: [PATCH 29/29] add event args dialog to cmakelists --- CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 207c12d3b..f6791e816 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,6 +52,7 @@ set(RGM_SOURCES Plugins/RGMPlugin.cpp main.cpp MainWindow.cpp + Dialogs/EventArgumentsDialog.cpp Dialogs/PreferencesDialog.cpp Dialogs/TimelineChangeMoment.cpp Components/ArtManager.cpp @@ -101,6 +102,7 @@ set(RGM_HEADERS Plugins/RGMPlugin.h MainWindow.h main.h + Dialogs/EventArgumentsDialog.h Dialogs/PreferencesDialog.h Dialogs/PreferencesKeys.h Dialogs/TimelineChangeMoment.h