summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--editor/connections_dialog.cpp192
-rw-r--r--editor/connections_dialog.h30
2 files changed, 147 insertions, 75 deletions
diff --git a/editor/connections_dialog.cpp b/editor/connections_dialog.cpp
index ef133e2589..9d28664d22 100644
--- a/editor/connections_dialog.cpp
+++ b/editor/connections_dialog.cpp
@@ -35,6 +35,7 @@
#include "plugins/script_editor_plugin.h"
#include "print_string.h"
#include "scene/gui/label.h"
+#include "scene/gui/popup_menu.h"
class ConnectDialogBinds : public Object {
@@ -408,56 +409,62 @@ void ConnectionsDock::_connect() {
update_tree();
}
-void ConnectionsDock::_connect_pressed() {
+void ConnectionsDock::_disconnect( TreeItem *item )
+{
+ Connection c = item->get_metadata(0);
+ ERR_FAIL_COND(c.source != node); //shouldn't happen but...bugcheck
+
+ undo_redo->create_action(vformat(TTR("Disconnect '%s' from '%s'"), c.signal, c.method));
+ undo_redo->add_do_method(node, "disconnect", c.signal, c.target, c.method);
+ undo_redo->add_undo_method(node, "connect", c.signal, c.target, c.method, Vector<Variant>(), c.flags);
+ undo_redo->add_do_method(this, "update_tree");
+ undo_redo->add_undo_method(this, "update_tree");
+ undo_redo->add_do_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree"); //to force redraw of scene tree
+ undo_redo->add_undo_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree"); //to force redraw of scene tree
+ undo_redo->commit_action();
+
+ c.source->disconnect(c.signal, c.target, c.method);
+ update_tree();
+}
+
+void ConnectionsDock::_open_connection_dialog( TreeItem *item )
+{
+ String signal = item->get_metadata(0).operator Dictionary()["name"];
+ String signalname = signal;
+ String midname = node->get_name();
+ for (int i = 0; i < midname.length(); i++) {
+ CharType c = midname[i];
+ if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '_') {
+ //all good
+ } else if (c == ' ') {
+ c = '_';
+ } else {
+ midname.remove(i);
+ i--;
+ continue;
+ }
+
+ midname[i] = c;
+ }
+ connect_dialog->edit(node);
+ connect_dialog->popup_centered_ratio();
+ connect_dialog->set_title(TTR("Connecting Signal:") + " " + signalname);
+ connect_dialog->set_dst_method("_on_" + midname + "_" + signal);
+ connect_dialog->set_dst_node(node->get_owner() ? node->get_owner() : node);
+}
+
+void ConnectionsDock::_connect_pressed() {
TreeItem *item = tree->get_selected();
if (!item) {
- //no idea how this happened, but disable
connect_button->set_disabled(true);
return;
}
- if (item->get_parent() == tree->get_root() || item->get_parent()->get_parent() == tree->get_root()) {
- //a signal - connect
- String signal = item->get_metadata(0).operator Dictionary()["name"];
- String signalname = signal;
- String midname = node->get_name();
- for (int i = 0; i < midname.length(); i++) {
- CharType c = midname[i];
- if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '_') {
- //all good
- } else if (c == ' ') {
- c = '_';
- } else {
- midname.remove(i);
- i--;
- continue;
- }
-
- midname[i] = c;
- }
-
- connect_dialog->edit(node);
- connect_dialog->popup_centered_ratio();
- connect_dialog->set_title(TTR("Connecting Signal:") + " " + signalname);
- connect_dialog->set_dst_method("_on_" + midname + "_" + signal);
- connect_dialog->set_dst_node(node->get_owner() ? node->get_owner() : node);
+ if (_is_item_signal( item )) {
+ _open_connection_dialog( item );
} else {
- //a slot- disconnect
- Connection c = item->get_metadata(0);
- ERR_FAIL_COND(c.source != node); //shouldn't happen but...bugcheck
-
- undo_redo->create_action(vformat(TTR("Disconnect '%s' from '%s'"), c.signal, c.method));
- undo_redo->add_do_method(node, "disconnect", c.signal, c.target, c.method);
- undo_redo->add_undo_method(node, "connect", c.signal, c.target, c.method, Vector<Variant>(), c.flags);
- undo_redo->add_do_method(this, "update_tree");
- undo_redo->add_undo_method(this, "update_tree");
- undo_redo->add_do_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree"); //to force redraw of scene tree
- undo_redo->add_undo_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree"); //to force redraw of scene tree
- undo_redo->commit_action();
-
- c.source->disconnect(c.signal, c.target, c.method);
- update_tree();
+ _disconnect( item );
}
}
@@ -611,7 +618,6 @@ void ConnectionsDock::update_tree() {
}
void ConnectionsDock::set_node(Node *p_node) {
-
node = p_node;
update_tree();
}
@@ -624,13 +630,11 @@ void ConnectionsDock::_something_selected() {
connect_button->set_text(TTR("Connect..."));
connect_button->set_disabled(true);
- } else if (item->get_parent() == tree->get_root() || item->get_parent()->get_parent() == tree->get_root()) {
- //a signal - connect
+ } else if (_is_item_signal( item )) {
connect_button->set_text(TTR("Connect..."));
connect_button->set_disabled(false);
} else {
- //a slot- disconnect
connect_button->set_text(TTR("Disconnect"));
connect_button->set_disabled(false);
}
@@ -643,31 +647,10 @@ void ConnectionsDock::_something_activated() {
if (!item)
return;
- if (item->get_parent() == tree->get_root() || item->get_parent()->get_parent() == tree->get_root()) {
- // a signal - connect
- String signal = item->get_metadata(0).operator Dictionary()["name"];
- String midname = node->get_name();
- for (int i = 0; i < midname.length(); i++) {
- CharType c = midname[i];
- if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '_') {
- //all good
- } else if (c == ' ') {
- c = '_';
- } else {
- midname.remove(i);
- i--;
- continue;
- }
-
- midname[i] = c;
- }
-
- connect_dialog->edit(node);
- connect_dialog->popup_centered_ratio();
- connect_dialog->set_dst_method("_on_" + midname + "_" + signal);
- connect_dialog->set_dst_node(node->get_owner() ? node->get_owner() : node);
+ if (_is_item_signal( item )) {
+ _open_connection_dialog( item );
} else {
- // a slot - go to target method
+ //Go to method within script editor, if avaiable.
Connection c = item->get_metadata(0);
ERR_FAIL_COND(c.source != node); //shouldn't happen but...bugcheck
@@ -682,11 +665,65 @@ void ConnectionsDock::_something_activated() {
}
}
-void ConnectionsDock::_bind_methods() {
+bool ConnectionsDock::_is_item_signal( TreeItem *item ) {
+ return (item->get_parent() == tree->get_root() || item->get_parent()->get_parent() == tree->get_root());
+}
+
+void ConnectionsDock::_handle_signal_option( int option ) {
+ TreeItem *item = tree->get_selected();
+ switch( option )
+ {
+ case SignalMenuOption::CONNECT:
+ {
+ _open_connection_dialog(item);
+ } break;
+ }
+}
+
+void ConnectionsDock::_handle_slot_option( int option ) {
+ TreeItem *item = tree->get_selected();
+
+ switch( option )
+ {
+ case SlotMenuOption::EDIT:
+ {
+ //TODO: add edit functionality
+ } break;
+ case SlotMenuOption::DISCONNECT:
+ {
+ _disconnect(item);
+ } break;
+ }
+}
+
+void ConnectionsDock::_rmb_pressed( Vector2 position ) {
+ TreeItem *item = tree->get_selected();
+
+ if( !item )
+ return;
+
+ Vector2 global_position = tree->get_global_position() + position;
+
+ if( _is_item_signal(item) )
+ {
+ signal_menu->set_position( global_position );
+ signal_menu->popup();
+ }
+ else
+ {
+ slot_menu->set_position( global_position );
+ slot_menu->popup();
+ }
+}
+
+void ConnectionsDock::_bind_methods() {
ClassDB::bind_method("_connect", &ConnectionsDock::_connect);
ClassDB::bind_method("_something_selected", &ConnectionsDock::_something_selected);
ClassDB::bind_method("_something_activated", &ConnectionsDock::_something_activated);
+ ClassDB::bind_method("_handle_signal_option", &ConnectionsDock::_handle_signal_option);
+ ClassDB::bind_method("_handle_slot_option", &ConnectionsDock::_handle_slot_option);
+ ClassDB::bind_method("_rmb_pressed", &ConnectionsDock::_rmb_pressed);
ClassDB::bind_method("_close", &ConnectionsDock::_close);
ClassDB::bind_method("_connect_pressed", &ConnectionsDock::_connect_pressed);
ClassDB::bind_method("update_tree", &ConnectionsDock::update_tree);
@@ -705,6 +742,7 @@ ConnectionsDock::ConnectionsDock(EditorNode *p_editor) {
tree->set_hide_root(true);
vbc->add_child(tree);
tree->set_v_size_flags(SIZE_EXPAND_FILL);
+ tree->set_allow_rmb_select(true);
connect_button = memnew(Button);
connect_button->set_text(TTR("Connect"));
@@ -723,6 +761,17 @@ ConnectionsDock::ConnectionsDock(EditorNode *p_editor) {
remove_confirm->set_as_toplevel(true);
add_child(remove_confirm);
+ signal_menu = memnew(PopupMenu);
+ add_child(signal_menu);
+ signal_menu->connect( "id_pressed", this, "_handle_signal_option" );
+ signal_menu->add_item(TTR("Connect"), SignalMenuOption::CONNECT );
+
+ slot_menu = memnew(PopupMenu);
+ add_child(slot_menu);
+ slot_menu->connect( "id_pressed", this, "_handle_slot_option" );
+ slot_menu->add_item(TTR("Edit"), SlotMenuOption::EDIT);
+ slot_menu->add_item(TTR("Disconnect"), SlotMenuOption::DISCONNECT);
+
/*
node_only->set_anchor( MARGIN_TOP, ANCHOR_END );
node_only->set_anchor( MARGIN_BOTTOM, ANCHOR_END );
@@ -736,6 +785,7 @@ ConnectionsDock::ConnectionsDock(EditorNode *p_editor) {
connect_dialog->connect("connected", this, "_connect");
tree->connect("item_selected", this, "_something_selected");
tree->connect("item_activated", this, "_something_activated");
+ tree->connect("item_rmb_selected", this, "_rmb_pressed" );
add_constant_override("separation", 3 * EDSCALE);
}
diff --git a/editor/connections_dialog.h b/editor/connections_dialog.h
index 5e26e00f67..ca0e404740 100644
--- a/editor/connections_dialog.h
+++ b/editor/connections_dialog.h
@@ -28,6 +28,10 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+/**
+@author Juan Linietsky <reduzio@gmail.com>
+*/
+
#ifndef CONNECTIONS_DIALOG_H
#define CONNECTIONS_DIALOG_H
@@ -42,10 +46,7 @@
#include "scene/gui/tree.h"
#include "undo_redo.h"
-/**
-@author Juan Linietsky <reduzio@gmail.com>
-*/
-
+class PopupMenu;
class ConnectDialogBinds;
class ConnectDialog : public ConfirmationDialog {
@@ -93,6 +94,15 @@ class ConnectionsDock : public VBoxContainer {
GDCLASS(ConnectionsDock, VBoxContainer);
+ enum SignalMenuOption {
+ CONNECT
+ };
+
+ enum SlotMenuOption {
+ EDIT,
+ DISCONNECT
+ };
+
Button *connect_button;
EditorNode *editor;
Node *node;
@@ -100,10 +110,17 @@ class ConnectionsDock : public VBoxContainer {
ConfirmationDialog *remove_confirm;
ConnectDialog *connect_dialog;
+ PopupMenu *signal_menu;
+ PopupMenu *slot_menu;
+
void _close();
void _connect();
+ void _disconnect( TreeItem *item );
void _something_selected();
void _something_activated();
+ void _handle_signal_option( int option );
+ void _handle_slot_option( int option );
+ void _rmb_pressed( Vector2 position );
UndoRedo *undo_redo;
protected:
@@ -111,6 +128,11 @@ protected:
void _notification(int p_what);
static void _bind_methods();
+private:
+ bool _is_item_signal( TreeItem *item );
+ void _open_connection_dialog( TreeItem *item );
+
+
public:
void set_undoredo(UndoRedo *p_undo_redo) { undo_redo = p_undo_redo; }