Implemented metadata editor. closes #19
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
#include <scene/gui/item_list.h>
|
||||
#include <scene/gui/button.h>
|
||||
#include <scene/gui/line_edit.h>
|
||||
#include <scene/gui/text_edit.h>
|
||||
#include <scene/gui/spin_box.h>
|
||||
#include <scene/gui/menu_button.h>
|
||||
#include <scene/3d/immediate_geometry.h>
|
||||
@@ -236,17 +237,41 @@ public:
|
||||
"%road_lines_create_new_cancel");
|
||||
LineEdit *line_name = editor->get_as_node<LineEdit>(
|
||||
"%road_lines_create_new_line_name");
|
||||
Button *cancel_metadata_button = editor->get_as_node<Button>(
|
||||
"%road_lines_metadata_cancel");
|
||||
Button *update_metadata_button = editor->get_as_node<Button>(
|
||||
"%road_lines_metadata_update");
|
||||
TextEdit *metadata_edit = editor->get_as_node<TextEdit>(
|
||||
"%road_lines_metadata_edit");
|
||||
cancel_button->connect("pressed", this, "cancel_handler");
|
||||
line_name->connect("text_entered", this, "entered_handler");
|
||||
line_name->connect("text_changed", this, "changed_handler");
|
||||
cancel_metadata_button->connect("pressed", this,
|
||||
"cancel_metadata_handler");
|
||||
update_metadata_button->connect("pressed", this,
|
||||
"update_metadata_handler");
|
||||
metadata_edit->connect("text_changed", this,
|
||||
"metadata_changed_handler");
|
||||
}
|
||||
virtual ~HandleCreateNewLine()
|
||||
{
|
||||
int i;
|
||||
TextEdit *metadata_edit = editor->get_as_node<TextEdit>(
|
||||
"%road_lines_metadata_edit");
|
||||
Button *update_metadata_button = editor->get_as_node<Button>(
|
||||
"%road_lines_metadata_update");
|
||||
Button *cancel_metadata_button = editor->get_as_node<Button>(
|
||||
"%road_lines_metadata_cancel");
|
||||
Button *cancel_button = editor->get_as_node<Button>(
|
||||
"%road_lines_create_new_cancel");
|
||||
LineEdit *line_name = editor->get_as_node<LineEdit>(
|
||||
"%road_lines_create_new_line_name");
|
||||
metadata_edit->disconnect("text_changed", this,
|
||||
"metadata_changed_handler");
|
||||
update_metadata_button->disconnect("pressed", this,
|
||||
"update_metadata_handler");
|
||||
cancel_metadata_button->disconnect("pressed", this,
|
||||
"cancel_metadata_handler");
|
||||
line_name->disconnect("text_changed", this, "changed_handler");
|
||||
line_name->disconnect("text_entered", this, "entered_handler");
|
||||
cancel_button->disconnect("pressed", this, "cancel_handler");
|
||||
@@ -264,6 +289,13 @@ public:
|
||||
}
|
||||
|
||||
protected:
|
||||
void update_metadata_editor()
|
||||
{
|
||||
TextEdit *metadata_edit = editor->get_as_node<TextEdit>(
|
||||
"%road_lines_metadata_edit");
|
||||
String text = editor->get_current_line_metadata();
|
||||
metadata_edit->set_text(text);
|
||||
}
|
||||
void main_handler(int id)
|
||||
{
|
||||
switch (id) {
|
||||
@@ -284,6 +316,14 @@ protected:
|
||||
/* delete line */
|
||||
editor->delete_current_line();
|
||||
break;
|
||||
case 23:
|
||||
/* edit line metadata */
|
||||
editor->get_as_node<Control>("%road_lines_base")->hide();
|
||||
editor->get_as_node<Control>(
|
||||
"%road_lines_edit_metadata_dlg")
|
||||
->show();
|
||||
update_metadata_editor();
|
||||
break;
|
||||
case 51:
|
||||
editor->set_point_to_cursor();
|
||||
break;
|
||||
@@ -344,6 +384,50 @@ protected:
|
||||
} else
|
||||
line_name->remove_color_override("font_color");
|
||||
}
|
||||
void cancel_metadata_handler()
|
||||
{
|
||||
TextEdit *metadata_text = editor->get_as_node<TextEdit>(
|
||||
"%road_lines_metadata_edit");
|
||||
editor->get_as_node<Control>("%road_lines_base")->show();
|
||||
editor->get_as_node<Control>("%road_lines_edit_metadata_dlg")
|
||||
->hide();
|
||||
metadata_text->set_text("");
|
||||
}
|
||||
void update_metadata_handler()
|
||||
{
|
||||
TextEdit *metadata_text = editor->get_as_node<TextEdit>(
|
||||
"%road_lines_metadata_edit");
|
||||
editor->get_as_node<Control>("%road_lines_base")->show();
|
||||
editor->get_as_node<Control>("%road_lines_edit_metadata_dlg")
|
||||
->hide();
|
||||
editor->update_current_line_metadata(metadata_text->get_text());
|
||||
metadata_text->set_text("");
|
||||
}
|
||||
bool check_metadata(const String &text)
|
||||
{
|
||||
if (!text.begins_with("{"))
|
||||
return false;
|
||||
Variant p;
|
||||
String err_s;
|
||||
int line;
|
||||
// TODO: create status string for errors
|
||||
Error err = JSON::parse(text, p, err_s, line);
|
||||
return (err == OK);
|
||||
}
|
||||
/* Unlike LineEdit, no arguments */
|
||||
void metadata_changed_handler()
|
||||
{
|
||||
TextEdit *metadata_text = editor->get_as_node<TextEdit>(
|
||||
"%road_lines_metadata_edit");
|
||||
String new_text = metadata_text->get_text();
|
||||
String text = new_text.strip_edges();
|
||||
if (!check_metadata(text)) {
|
||||
metadata_text->add_color_override(
|
||||
"font_color", Color(1.0f, 0.0f, 0.0f, 1.0f));
|
||||
return;
|
||||
} else
|
||||
metadata_text->remove_color_override("font_color");
|
||||
}
|
||||
static void _bind_methods()
|
||||
{
|
||||
ClassDB::bind_method(D_METHOD("main_handler", "id"),
|
||||
@@ -354,6 +438,15 @@ protected:
|
||||
&HandleCreateNewLine::entered_handler);
|
||||
ClassDB::bind_method(D_METHOD("changed_handler", "new_text"),
|
||||
&HandleCreateNewLine::changed_handler);
|
||||
ClassDB::bind_method(
|
||||
D_METHOD("cancel_metadata_handler"),
|
||||
&HandleCreateNewLine::cancel_metadata_handler);
|
||||
ClassDB::bind_method(
|
||||
D_METHOD("update_metadata_handler"),
|
||||
&HandleCreateNewLine::update_metadata_handler);
|
||||
ClassDB::bind_method(
|
||||
D_METHOD("metadata_changed_handler"),
|
||||
&HandleCreateNewLine::metadata_changed_handler);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -588,6 +681,7 @@ void RoadLinesEditor::update_ui()
|
||||
{
|
||||
get_as_node<Control>("%road_lines_base")->show();
|
||||
get_as_node<Control>("%road_lines_create_new_line_dlg")->hide();
|
||||
get_as_node<Control>("%road_lines_edit_metadata_dlg")->hide();
|
||||
ItemList *lines_list = get_as_node<ItemList>("%lines_list");
|
||||
List<String> line_keys;
|
||||
lines.get_key_list(&line_keys);
|
||||
@@ -780,7 +874,7 @@ void RoadLinesEditor::load_data()
|
||||
ConfigFile config;
|
||||
Error result = config.load("res://config/stream.conf");
|
||||
ERR_FAIL_COND_MSG(result != OK, "Failed to load config");
|
||||
String road_lines_path = config.get_value("road", "road_lines_path");
|
||||
String road_lines_path = config.get_value("lines", "road_lines_path");
|
||||
String road_lines_json =
|
||||
FileAccess::get_file_as_string(road_lines_path);
|
||||
Variant json_v;
|
||||
@@ -843,14 +937,14 @@ void RoadLinesEditor::save_data()
|
||||
for (i = 0; i < (int)lines[e->get()].indices.size(); i++)
|
||||
indices[i] = lines[e->get()].indices[i];
|
||||
pvalues["points"] = points;
|
||||
pvalues["indices"] = indices;
|
||||
// pvalues["indices"] = indices;
|
||||
pvalues["metadata"] = lines[e->get()].metadata;
|
||||
pvalues["lanes"] = lines[e->get()].lanes;
|
||||
pvalues["pattern"] = lines[e->get()].pattern;
|
||||
output[e->get()] = pvalues;
|
||||
e = e->next();
|
||||
}
|
||||
print_line(JSON::print(output, "\t", false));
|
||||
print_verbose(JSON::print(output, "\t", false));
|
||||
Error err = OK;
|
||||
if (FileAccess::exists(road_lines_path)) {
|
||||
DirAccess *dir = DirAccess::open("res:///", &err);
|
||||
@@ -869,6 +963,31 @@ void RoadLinesEditor::save_data()
|
||||
fd->close();
|
||||
}
|
||||
}
|
||||
void RoadLinesEditor::update_current_line_metadata(const String &text)
|
||||
{
|
||||
assert(lines.has(current_line));
|
||||
if (!text.begins_with("{"))
|
||||
return;
|
||||
String err_s;
|
||||
int err_line;
|
||||
Variant v;
|
||||
Error err = JSON::parse(text, v, err_s, err_line);
|
||||
if (err != OK) {
|
||||
print_line("metadata parse error " + err_s + " at line " +
|
||||
itos(err_line));
|
||||
return;
|
||||
}
|
||||
if (v.get_type() != Variant::DICTIONARY) {
|
||||
print_line("Invalid metadata type, should be Dictionary");
|
||||
return;
|
||||
}
|
||||
lines[current_line].metadata = v;
|
||||
}
|
||||
String RoadLinesEditor::get_current_line_metadata() const
|
||||
{
|
||||
assert(lines.has(current_line));
|
||||
return JSON::print(lines[current_line].metadata, "\t", true);
|
||||
}
|
||||
template <class T> T *RoadLinesEditor::get_as_node(const String &path)
|
||||
{
|
||||
Node *node = scene()->get_node(NodePath(path));
|
||||
|
||||
Reference in New Issue
Block a user