Visualscript fix crash and generic search does not connect ports.

* Signal change requires function changes to _selected_new_virtual_method
This commit is contained in:
K. S. Ernest (iFire) Lee 2018-07-25 11:49:41 -07:00
parent 96d37769d9
commit 00519debbe
4 changed files with 60 additions and 35 deletions

View File

@ -1330,7 +1330,7 @@ void VisualScriptEditor::_input(const Ref<InputEvent> &p_event) {
} }
void VisualScriptEditor::_generic_search() { void VisualScriptEditor::_generic_search() {
new_connect_node_select->select_from_visual_script(String("")); new_connect_node_select->select_from_visual_script(String(""), false);
} }
void VisualScriptEditor::_members_gui_input(const Ref<InputEvent> &p_event) { void VisualScriptEditor::_members_gui_input(const Ref<InputEvent> &p_event) {
@ -2610,7 +2610,7 @@ void VisualScriptEditor::connect_data(Ref<VisualScriptNode> vnode_old, Ref<Visua
undo_redo->commit_action(); undo_redo->commit_action();
} }
void VisualScriptEditor::_selected_connect_node(const String &p_text, const String &p_category) { void VisualScriptEditor::_selected_connect_node(const String &p_text, const String &p_category, const bool p_connecting) {
Vector2 ofs = graph->get_scroll_ofs() + port_action_pos; Vector2 ofs = graph->get_scroll_ofs() + port_action_pos;
if (graph->is_using_snap()) { if (graph->is_using_snap()) {
int snap = graph->get_snap(); int snap = graph->get_snap();
@ -2625,12 +2625,12 @@ void VisualScriptEditor::_selected_connect_node(const String &p_text, const Stri
Ref<VisualScriptNode> vnode_old = script->get_node(edited_func, port_action_node); Ref<VisualScriptNode> vnode_old = script->get_node(edited_func, port_action_node);
int new_id = script->get_available_id(); int new_id = script->get_available_id();
if (Object::cast_to<VisualScriptOperator>(vnode_new.ptr())) { if (Object::cast_to<VisualScriptOperator>(vnode_new.ptr()) && script->get_node(edited_func, port_action_node).is_valid()) {
Variant::Type type = script->get_node(edited_func, port_action_node)->get_output_value_port_info(port_action_output).type; Variant::Type type = script->get_node(edited_func, port_action_node)->get_output_value_port_info(port_action_output).type;
Object::cast_to<VisualScriptOperator>(vnode_new.ptr())->set_typed(type); Object::cast_to<VisualScriptOperator>(vnode_new.ptr())->set_typed(type);
} }
if (Object::cast_to<VisualScriptTypeCast>(vnode_new.ptr())) { if (Object::cast_to<VisualScriptTypeCast>(vnode_new.ptr()) && script->get_node(edited_func, port_action_node).is_valid()) {
Variant::Type type = script->get_node(edited_func, port_action_node)->get_output_value_port_info(port_action_output).type; Variant::Type type = script->get_node(edited_func, port_action_node)->get_output_value_port_info(port_action_output).type;
String hint_name = script->get_node(edited_func, port_action_node)->get_output_value_port_info(port_action_output).hint_string; String hint_name = script->get_node(edited_func, port_action_node)->get_output_value_port_info(port_action_output).hint_string;
@ -2644,8 +2644,11 @@ void VisualScriptEditor::_selected_connect_node(const String &p_text, const Stri
} }
undo_redo->create_action(TTR("Add Node")); undo_redo->create_action(TTR("Add Node"));
undo_redo->add_do_method(script.ptr(), "add_node", edited_func, new_id, vnode_new, ofs); undo_redo->add_do_method(script.ptr(), "add_node", edited_func, new_id, vnode_new, ofs);
if (vnode_old.is_valid() && p_connecting == true) {
connect_seq(vnode_old, vnode_new, new_id); connect_seq(vnode_old, vnode_new, new_id);
connect_data(vnode_old, vnode_new, new_id); connect_data(vnode_old, vnode_new, new_id);
}
undo_redo->add_undo_method(script.ptr(), "remove_node", edited_func, new_id); undo_redo->add_undo_method(script.ptr(), "remove_node", edited_func, new_id);
undo_redo->add_do_method(this, "_update_graph"); undo_redo->add_do_method(this, "_update_graph");
undo_redo->add_undo_method(this, "_update_graph"); undo_redo->add_undo_method(this, "_update_graph");
@ -2732,7 +2735,7 @@ void VisualScriptEditor::_selected_connect_node(const String &p_text, const Stri
if (tg.gdclass != StringName()) { if (tg.gdclass != StringName()) {
vsfc->set_base_type(tg.gdclass); vsfc->set_base_type(tg.gdclass);
} else { } else if (script->get_node(edited_func, port_action_node).is_valid()) {
PropertyHint hint = script->get_node(edited_func, port_action_node)->get_output_value_port_info(port_action_output).hint; PropertyHint hint = script->get_node(edited_func, port_action_node)->get_output_value_port_info(port_action_output).hint;
String base_type = script->get_node(edited_func, port_action_node)->get_output_value_port_info(port_action_output).hint_string; String base_type = script->get_node(edited_func, port_action_node)->get_output_value_port_info(port_action_output).hint_string;
@ -2766,7 +2769,7 @@ void VisualScriptEditor::_selected_connect_node(const String &p_text, const Stri
if (tg.gdclass != StringName()) { if (tg.gdclass != StringName()) {
vsp->set_base_type(tg.gdclass); vsp->set_base_type(tg.gdclass);
} else { } else if (script->get_node(edited_func, port_action_node).is_valid()) {
PropertyHint hint = script->get_node(edited_func, port_action_node)->get_output_value_port_info(port_action_output).hint; PropertyHint hint = script->get_node(edited_func, port_action_node)->get_output_value_port_info(port_action_output).hint;
String base_type = script->get_node(edited_func, port_action_node)->get_output_value_port_info(port_action_output).hint_string; String base_type = script->get_node(edited_func, port_action_node)->get_output_value_port_info(port_action_output).hint_string;
@ -2796,10 +2799,9 @@ void VisualScriptEditor::_selected_connect_node(const String &p_text, const Stri
if (tg.gdclass != StringName()) { if (tg.gdclass != StringName()) {
vsp->set_base_type(tg.gdclass); vsp->set_base_type(tg.gdclass);
} else { } else if (script->get_node(edited_func, port_action_node).is_valid()) {
PropertyHint hint = script->get_node(edited_func, port_action_node)->get_output_value_port_info(port_action_output).hint; PropertyHint hint = script->get_node(edited_func, port_action_node)->get_output_value_port_info(port_action_output).hint;
String base_type = script->get_node(edited_func, port_action_node)->get_output_value_port_info(port_action_output).hint_string; String base_type = script->get_node(edited_func, port_action_node)->get_output_value_port_info(port_action_output).hint_string;
if (base_type != String() && hint == PROPERTY_HINT_TYPE_STRING) { if (base_type != String() && hint == PROPERTY_HINT_TYPE_STRING) {
vsp->set_base_type(base_type); vsp->set_base_type(base_type);
} }
@ -2816,9 +2818,10 @@ void VisualScriptEditor::_selected_connect_node(const String &p_text, const Stri
} }
} }
Ref<VisualScriptNode> vnode_old = script->get_node(edited_func, port_action_node); Ref<VisualScriptNode> vnode_old = script->get_node(edited_func, port_action_node);
if (vnode_old.is_valid() && p_connecting == true) {
connect_seq(vnode_old, vnode, port_action_new_node); connect_seq(vnode_old, vnode, port_action_new_node);
connect_data(vnode_old, vnode, port_action_new_node); connect_data(vnode_old, vnode, port_action_new_node);
}
_update_graph(port_action_new_node); _update_graph(port_action_new_node);
_update_graph_connections(); _update_graph_connections();
} }
@ -2869,7 +2872,7 @@ void VisualScriptEditor::connect_seq(Ref<VisualScriptNode> vnode_old, Ref<Visual
undo_redo->commit_action(); undo_redo->commit_action();
} }
void VisualScriptEditor::_selected_new_virtual_method(const String &p_text, const String &p_category) { void VisualScriptEditor::_selected_new_virtual_method(const String &p_text, const String &p_category, const bool p_connecting) {
String name = p_text; String name = p_text;
if (script->has_function(name)) { if (script->has_function(name)) {

View File

@ -172,12 +172,12 @@ class VisualScriptEditor : public ScriptEditorBase {
void connect_data(Ref<VisualScriptNode> vnode_old, Ref<VisualScriptNode> vnode, int new_id); void connect_data(Ref<VisualScriptNode> vnode_old, Ref<VisualScriptNode> vnode, int new_id);
void _selected_connect_node(const String &p_text, const String &p_category); void _selected_connect_node(const String &p_text, const String &p_category, const bool p_connecting = true);
void connect_seq(Ref<VisualScriptNode> vnode_old, Ref<VisualScriptNode> vnode_new, int new_id); void connect_seq(Ref<VisualScriptNode> vnode_old, Ref<VisualScriptNode> vnode_new, int new_id);
void _cancel_connect_node(); void _cancel_connect_node();
void _create_new_node(const String &p_text, const String &p_category, const Vector2 &p_point); void _create_new_node(const String &p_text, const String &p_category, const Vector2 &p_point);
void _selected_new_virtual_method(const String &p_text, const String &p_category); void _selected_new_virtual_method(const String &p_text, const String &p_category, const bool p_connecting = true);
int error_line; int error_line;

View File

@ -206,8 +206,10 @@ void VisualScriptPropertySelector::_update_search() {
item->set_icon(0, type_icons[E->get().type]); item->set_icon(0, type_icons[E->get().type]);
item->set_metadata(1, "get"); item->set_metadata(1, "get");
item->set_collapsed(1); item->set_collapsed(1);
item->set_selectable(1, false);
item->set_selectable(0, true); item->set_selectable(0, true);
item->set_selectable(1, false);
item->set_selectable(2, false);
item->set_metadata(2, connecting);
} }
if (input == String() || if (input == String() ||
@ -218,8 +220,10 @@ void VisualScriptPropertySelector::_update_search() {
item->set_metadata(0, E->get().name); item->set_metadata(0, E->get().name);
item->set_icon(0, type_icons[E->get().type]); item->set_icon(0, type_icons[E->get().type]);
item->set_metadata(1, "set"); item->set_metadata(1, "set");
item->set_selectable(1, false);
item->set_selectable(0, true); item->set_selectable(0, true);
item->set_selectable(1, false);
item->set_selectable(2, false);
item->set_metadata(2, connecting);
} }
} }
@ -341,6 +345,9 @@ void VisualScriptPropertySelector::_update_search() {
item->set_collapsed(1); item->set_collapsed(1);
item->set_selectable(1, false); item->set_selectable(1, false);
item->set_selectable(2, false);
item->set_metadata(2, connecting);
if (category && category->get_children() == NULL) { if (category && category->get_children() == NULL) {
memdelete(category); //old category was unused memdelete(category); //old category was unused
} }
@ -369,6 +376,8 @@ void VisualScriptPropertySelector::create_visualscript_item(const String &name,
item->set_selectable(0, true); item->set_selectable(0, true);
item->set_collapsed(1); item->set_collapsed(1);
item->set_selectable(1, false); item->set_selectable(1, false);
item->set_selectable(2, false);
item->set_metadata(2, connecting);
} }
} }
@ -423,6 +432,8 @@ void VisualScriptPropertySelector::get_visual_node_names(const String &root_filt
item->set_selectable(0, true); item->set_selectable(0, true);
item->set_metadata(1, "visualscript"); item->set_metadata(1, "visualscript");
item->set_selectable(1, false); item->set_selectable(1, false);
item->set_selectable(2, false);
item->set_metadata(2, connecting);
} }
} }
@ -431,7 +442,7 @@ void VisualScriptPropertySelector::_confirmed() {
TreeItem *ti = search_options->get_selected(); TreeItem *ti = search_options->get_selected();
if (!ti) if (!ti)
return; return;
emit_signal("selected", ti->get_metadata(0), ti->get_metadata(1)); emit_signal("selected", ti->get_metadata(0), ti->get_metadata(1), ti->get_metadata(2));
hide(); hide();
} }
@ -542,7 +553,7 @@ void VisualScriptPropertySelector::_notification(int p_what) {
} }
} }
void VisualScriptPropertySelector::select_method_from_base_type(const String &p_base, const String &p_current, bool p_virtuals_only) { void VisualScriptPropertySelector::select_method_from_base_type(const String &p_base, const String &p_current, const bool p_virtuals_only, const bool p_connecting) {
base_type = p_base; base_type = p_base;
selected = p_current; selected = p_current;
@ -555,6 +566,8 @@ void VisualScriptPropertySelector::select_method_from_base_type(const String &p_
show_window(.5f); show_window(.5f);
search_box->set_text(""); search_box->set_text("");
search_box->grab_focus(); search_box->grab_focus();
connecting = p_connecting;
_update_search(); _update_search();
} }
@ -562,7 +575,7 @@ void VisualScriptPropertySelector::set_type_filter(const Vector<Variant::Type> &
type_filter = p_type_filter; type_filter = p_type_filter;
} }
void VisualScriptPropertySelector::select_from_base_type(const String &p_base, const String &p_current /*= ""*/, bool p_virtuals_only /*= false*/, bool p_seq_connect /*= false*/) { void VisualScriptPropertySelector::select_from_base_type(const String &p_base, const String &p_current, bool p_virtuals_only, bool p_seq_connect, const bool p_connecting) {
base_type = p_base; base_type = p_base;
selected = p_current; selected = p_current;
@ -576,11 +589,12 @@ void VisualScriptPropertySelector::select_from_base_type(const String &p_base, c
search_box->set_text(""); search_box->set_text("");
search_box->grab_focus(); search_box->grab_focus();
seq_connect = p_seq_connect; seq_connect = p_seq_connect;
connecting = p_connecting;
_update_search(); _update_search();
} }
void VisualScriptPropertySelector::select_from_script(const Ref<Script> &p_script, const String &p_current /*= ""*/) { void VisualScriptPropertySelector::select_from_script(const Ref<Script> &p_script, const String &p_current, const bool p_connecting) {
ERR_FAIL_COND(p_script.is_null()); ERR_FAIL_COND(p_script.is_null());
base_type = p_script->get_instance_base_type(); base_type = p_script->get_instance_base_type();
@ -595,11 +609,12 @@ void VisualScriptPropertySelector::select_from_script(const Ref<Script> &p_scrip
search_box->set_text(""); search_box->set_text("");
search_box->grab_focus(); search_box->grab_focus();
seq_connect = false; seq_connect = false;
connecting = p_connecting;
_update_search(); _update_search();
} }
void VisualScriptPropertySelector::select_from_basic_type(Variant::Type p_type, const String &p_current /*= ""*/) { void VisualScriptPropertySelector::select_from_basic_type(Variant::Type p_type, const String &p_current, const bool p_connecting) {
ERR_FAIL_COND(p_type == Variant::NIL); ERR_FAIL_COND(p_type == Variant::NIL);
base_type = ""; base_type = "";
selected = p_current; selected = p_current;
@ -613,11 +628,12 @@ void VisualScriptPropertySelector::select_from_basic_type(Variant::Type p_type,
search_box->set_text(""); search_box->set_text("");
search_box->grab_focus(); search_box->grab_focus();
seq_connect = false; seq_connect = false;
connecting = p_connecting;
_update_search(); _update_search();
} }
void VisualScriptPropertySelector::select_from_action(const String &p_type, const String &p_current /*= ""*/) { void VisualScriptPropertySelector::select_from_action(const String &p_type, const String &p_current, const bool p_connecting) {
base_type = p_type; base_type = p_type;
selected = p_current; selected = p_current;
type = Variant::NIL; type = Variant::NIL;
@ -630,10 +646,12 @@ void VisualScriptPropertySelector::select_from_action(const String &p_type, cons
search_box->set_text(""); search_box->set_text("");
search_box->grab_focus(); search_box->grab_focus();
seq_connect = true; seq_connect = true;
connecting = p_connecting;
_update_search(); _update_search();
} }
void VisualScriptPropertySelector::select_from_instance(Object *p_instance, const String &p_current /*= ""*/) { void VisualScriptPropertySelector::select_from_instance(Object *p_instance, const String &p_current, const bool p_connecting) {
base_type = ""; base_type = "";
selected = p_current; selected = p_current;
type = Variant::NIL; type = Variant::NIL;
@ -646,11 +664,12 @@ void VisualScriptPropertySelector::select_from_instance(Object *p_instance, cons
search_box->set_text(""); search_box->set_text("");
search_box->grab_focus(); search_box->grab_focus();
seq_connect = false; seq_connect = false;
connecting = p_connecting;
_update_search(); _update_search();
} }
void VisualScriptPropertySelector::select_from_visual_script(const String &p_base) { void VisualScriptPropertySelector::select_from_visual_script(const String &p_base, const bool p_connecting) {
base_type = p_base; base_type = p_base;
selected = ""; selected = "";
type = Variant::NIL; type = Variant::NIL;
@ -662,6 +681,7 @@ void VisualScriptPropertySelector::select_from_visual_script(const String &p_bas
show_window(.5f); show_window(.5f);
search_box->set_text(""); search_box->set_text("");
search_box->grab_focus(); search_box->grab_focus();
connecting = p_connecting;
_update_search(); _update_search();
} }
@ -682,7 +702,7 @@ void VisualScriptPropertySelector::_bind_methods() {
ClassDB::bind_method(D_METHOD("_sbox_input"), &VisualScriptPropertySelector::_sbox_input); ClassDB::bind_method(D_METHOD("_sbox_input"), &VisualScriptPropertySelector::_sbox_input);
ClassDB::bind_method(D_METHOD("_item_selected"), &VisualScriptPropertySelector::_item_selected); ClassDB::bind_method(D_METHOD("_item_selected"), &VisualScriptPropertySelector::_item_selected);
ADD_SIGNAL(MethodInfo("selected", PropertyInfo(Variant::STRING, "name"))); ADD_SIGNAL(MethodInfo("selected", PropertyInfo(Variant::STRING, "name"), PropertyInfo(Variant::STRING, "category"), PropertyInfo(Variant::BOOL, "connecting")));
} }
VisualScriptPropertySelector::VisualScriptPropertySelector() { VisualScriptPropertySelector::VisualScriptPropertySelector() {
@ -708,6 +728,7 @@ VisualScriptPropertySelector::VisualScriptPropertySelector() {
help_bit = memnew(EditorHelpBit); help_bit = memnew(EditorHelpBit);
vbc->add_margin_child(TTR("Description:"), help_bit); vbc->add_margin_child(TTR("Description:"), help_bit);
help_bit->connect("request_hide", this, "_closed"); help_bit->connect("request_hide", this, "_closed");
search_options->set_columns(2); search_options->set_columns(3);
search_options->set_column_expand(1, false); search_options->set_column_expand(1, false);
search_options->set_column_expand(2, false);
} }

View File

@ -56,6 +56,7 @@ class VisualScriptPropertySelector : public ConfirmationDialog {
bool properties; bool properties;
bool visual_script_generic; bool visual_script_generic;
bool connecting;
String selected; String selected;
Variant::Type type; Variant::Type type;
String base_type; String base_type;
@ -74,13 +75,13 @@ protected:
static void _bind_methods(); static void _bind_methods();
public: public:
void select_method_from_base_type(const String &p_base, const String &p_current = "", bool p_virtuals_only = false); void select_method_from_base_type(const String &p_base, const String &p_current = "", const bool p_virtuals_only = false, const bool p_connecting = true);
void select_from_base_type(const String &p_base, const String &p_current = "", bool p_virtuals_only = false, bool p_seq_connect = false); void select_from_base_type(const String &p_base, const String &p_current = "", bool p_virtuals_only = false, bool p_seq_connect = false, const bool p_connecting = true);
void select_from_script(const Ref<Script> &p_script, const String &p_current /*= ""*/); void select_from_script(const Ref<Script> &p_script, const String &p_current = "", const bool p_connecting = true);
void select_from_basic_type(Variant::Type p_type, const String &p_current = ""); void select_from_basic_type(Variant::Type p_type, const String &p_current = "", const bool p_connecting = true);
void select_from_action(const String &p_type, const String &p_current = ""); void select_from_action(const String &p_type, const String &p_current = "", const bool p_connecting = true);
void select_from_instance(Object *p_instance, const String &p_current = ""); void select_from_instance(Object *p_instance, const String &p_current = "", const bool p_connecting = true);
void select_from_visual_script(const String &p_base); void select_from_visual_script(const String &p_base, const bool p_connecting = true);
void show_window(float p_screen_ratio); void show_window(float p_screen_ratio);