From b02f6c2cbf966dcd56ea28a3202b86bb92dd03fd Mon Sep 17 00:00:00 2001 From: codereader Date: Mon, 26 Dec 2016 06:37:17 +0100 Subject: [PATCH] Resolve #4448: Add option to validate that Conversation actors are existing in the map --- install/ui/conversationeditor.fbp | 91 ++++++++++++++++++- install/ui/conversationeditor.xrc | 10 ++ .../dm.conversation/ConversationEditor.cpp | 36 ++++++++ plugins/dm.conversation/ConversationEditor.h | 2 + 4 files changed, 138 insertions(+), 1 deletion(-) diff --git a/install/ui/conversationeditor.fbp b/install/ui/conversationeditor.fbp index 0ff1ae08ff..1215a80b2b 100644 --- a/install/ui/conversationeditor.fbp +++ b/install/ui/conversationeditor.fbp @@ -1,6 +1,6 @@ - + C++ @@ -717,6 +717,7 @@ + @@ -1170,6 +1171,94 @@ + + 6 + wxEXPAND|wxTOP + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Validate all + + 0 + + + 0 + + 1 + ConvEditorValidateActorsButton + 1 + + + protected + 1 + + Resizable + 1 + 80,-1 + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/install/ui/conversationeditor.xrc b/install/ui/conversationeditor.xrc index b60b334d46..945118a704 100644 --- a/install/ui/conversationeditor.xrc +++ b/install/ui/conversationeditor.xrc @@ -156,6 +156,16 @@ 0 + + + wxEXPAND|wxTOP + 6 + + 80,-1 + + 0 + + diff --git a/plugins/dm.conversation/ConversationEditor.cpp b/plugins/dm.conversation/ConversationEditor.cpp index 7407363b34..728b080eb1 100644 --- a/plugins/dm.conversation/ConversationEditor.cpp +++ b/plugins/dm.conversation/ConversationEditor.cpp @@ -4,9 +4,12 @@ #include "string/string.h" #include +#include #include #include "CommandEditor.h" +#include "ActorNodeFinder.h" +#include "wxutil/dialog/MessageBox.h" #include #include @@ -102,6 +105,10 @@ void ConversationEditor::populateWindow() _delActorButton->Connect(wxEVT_BUTTON, wxCommandEventHandler(ConversationEditor::onDeleteActor), NULL, this); _delActorButton->Enable(false); + _validateActorsButton = findNamedObject(this, "ConvEditorValidateActorsButton"); + _validateActorsButton->Connect(wxEVT_BUTTON, wxCommandEventHandler(ConversationEditor::onValidateActors), NULL, this); + _validateActorsButton->Enable(false); + // Command Panel wxPanel* commandPanel = findNamedObject(this, "ConvEditorCommandPanel"); @@ -161,6 +168,8 @@ void ConversationEditor::updateWidgets() updateCmdActionSensitivity(false); _delActorButton->Enable(false); + _validateActorsButton->Enable(!_conversation.actors.empty()); + // Name findNamedObject(this, "ConvEditorNameEntry")->SetValue(_conversation.name); @@ -432,6 +441,33 @@ void ConversationEditor::onDeleteActor(wxCommandEvent& ev) updateWidgets(); } +void ConversationEditor::onValidateActors(wxCommandEvent& ev) +{ + std::vector errors; + + for (const conversation::Conversation::ActorMap::value_type& i : _conversation.actors) + { + scene::ActorNodeFinder finder(i.second); + GlobalSceneGraph().root()->traverse(finder); + + if (!finder.getFoundNode()) + { + errors.push_back((boost::format(_("The actor %s cannot be found in the current map.")) % i.second).str()); + } + } + + if (!errors.empty()) + { + std::string message = boost::algorithm::join(errors, "\n"); + wxutil::Messagebox::Show(_("Actors missing"), message, IDialog::MESSAGE_ERROR, this); + } + else + { + std::string message = _("All actors are correctly referring to entities in the map."); + wxutil::Messagebox::Show(_("Actors OK"), message, IDialog::MESSAGE_CONFIRM, this); + } +} + void ConversationEditor::onActorEdited(wxDataViewEvent& ev) { wxutil::TreeModel::Row row(ev.GetItem(), *_actorStore); diff --git a/plugins/dm.conversation/ConversationEditor.h b/plugins/dm.conversation/ConversationEditor.h index dbc753cd84..7aa7bfdcb5 100644 --- a/plugins/dm.conversation/ConversationEditor.h +++ b/plugins/dm.conversation/ConversationEditor.h @@ -58,6 +58,7 @@ class ConversationEditor : wxButton* _addActorButton; wxButton* _delActorButton; + wxButton* _validateActorsButton; wxButton* _addCmdButton; wxButton* _delCmdButton; @@ -104,6 +105,7 @@ class ConversationEditor : void onAddActor(wxCommandEvent& ev); void onDeleteActor(wxCommandEvent& ev); + void onValidateActors(wxCommandEvent& ev); void onActorEdited(wxDataViewEvent& ev); void onAddCommand(wxCommandEvent& ev);