mirror of
https://github.com/godotengine/godot.git
synced 2025-11-01 22:21:18 +00:00
Basic context menu added to connections docker w/ code cleanup.
This commit is contained in:
parent
dc7ed4b547
commit
62a858d4c9
2 changed files with 147 additions and 75 deletions
|
|
@ -35,6 +35,7 @@
|
||||||
#include "plugins/script_editor_plugin.h"
|
#include "plugins/script_editor_plugin.h"
|
||||||
#include "print_string.h"
|
#include "print_string.h"
|
||||||
#include "scene/gui/label.h"
|
#include "scene/gui/label.h"
|
||||||
|
#include "scene/gui/popup_menu.h"
|
||||||
|
|
||||||
class ConnectDialogBinds : public Object {
|
class ConnectDialogBinds : public Object {
|
||||||
|
|
||||||
|
|
@ -408,56 +409,62 @@ void ConnectionsDock::_connect() {
|
||||||
update_tree();
|
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();
|
TreeItem *item = tree->get_selected();
|
||||||
if (!item) {
|
if (!item) {
|
||||||
//no idea how this happened, but disable
|
|
||||||
connect_button->set_disabled(true);
|
connect_button->set_disabled(true);
|
||||||
return;
|
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 {
|
} else {
|
||||||
//a slot- disconnect
|
_disconnect( 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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -611,7 +618,6 @@ void ConnectionsDock::update_tree() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectionsDock::set_node(Node *p_node) {
|
void ConnectionsDock::set_node(Node *p_node) {
|
||||||
|
|
||||||
node = p_node;
|
node = p_node;
|
||||||
update_tree();
|
update_tree();
|
||||||
}
|
}
|
||||||
|
|
@ -624,13 +630,11 @@ void ConnectionsDock::_something_selected() {
|
||||||
connect_button->set_text(TTR("Connect..."));
|
connect_button->set_text(TTR("Connect..."));
|
||||||
connect_button->set_disabled(true);
|
connect_button->set_disabled(true);
|
||||||
|
|
||||||
} else if (item->get_parent() == tree->get_root() || item->get_parent()->get_parent() == tree->get_root()) {
|
} else if (_is_item_signal( item )) {
|
||||||
//a signal - connect
|
|
||||||
connect_button->set_text(TTR("Connect..."));
|
connect_button->set_text(TTR("Connect..."));
|
||||||
connect_button->set_disabled(false);
|
connect_button->set_disabled(false);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
//a slot- disconnect
|
|
||||||
connect_button->set_text(TTR("Disconnect"));
|
connect_button->set_text(TTR("Disconnect"));
|
||||||
connect_button->set_disabled(false);
|
connect_button->set_disabled(false);
|
||||||
}
|
}
|
||||||
|
|
@ -643,31 +647,10 @@ void ConnectionsDock::_something_activated() {
|
||||||
if (!item)
|
if (!item)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (item->get_parent() == tree->get_root() || item->get_parent()->get_parent() == tree->get_root()) {
|
if (_is_item_signal( item )) {
|
||||||
// a signal - connect
|
_open_connection_dialog( item );
|
||||||
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);
|
|
||||||
} else {
|
} else {
|
||||||
// a slot - go to target method
|
//Go to method within script editor, if avaiable.
|
||||||
Connection c = item->get_metadata(0);
|
Connection c = item->get_metadata(0);
|
||||||
ERR_FAIL_COND(c.source != node); //shouldn't happen but...bugcheck
|
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("_connect", &ConnectionsDock::_connect);
|
||||||
ClassDB::bind_method("_something_selected", &ConnectionsDock::_something_selected);
|
ClassDB::bind_method("_something_selected", &ConnectionsDock::_something_selected);
|
||||||
ClassDB::bind_method("_something_activated", &ConnectionsDock::_something_activated);
|
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("_close", &ConnectionsDock::_close);
|
||||||
ClassDB::bind_method("_connect_pressed", &ConnectionsDock::_connect_pressed);
|
ClassDB::bind_method("_connect_pressed", &ConnectionsDock::_connect_pressed);
|
||||||
ClassDB::bind_method("update_tree", &ConnectionsDock::update_tree);
|
ClassDB::bind_method("update_tree", &ConnectionsDock::update_tree);
|
||||||
|
|
@ -705,6 +742,7 @@ ConnectionsDock::ConnectionsDock(EditorNode *p_editor) {
|
||||||
tree->set_hide_root(true);
|
tree->set_hide_root(true);
|
||||||
vbc->add_child(tree);
|
vbc->add_child(tree);
|
||||||
tree->set_v_size_flags(SIZE_EXPAND_FILL);
|
tree->set_v_size_flags(SIZE_EXPAND_FILL);
|
||||||
|
tree->set_allow_rmb_select(true);
|
||||||
|
|
||||||
connect_button = memnew(Button);
|
connect_button = memnew(Button);
|
||||||
connect_button->set_text(TTR("Connect"));
|
connect_button->set_text(TTR("Connect"));
|
||||||
|
|
@ -723,6 +761,17 @@ ConnectionsDock::ConnectionsDock(EditorNode *p_editor) {
|
||||||
remove_confirm->set_as_toplevel(true);
|
remove_confirm->set_as_toplevel(true);
|
||||||
add_child(remove_confirm);
|
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_TOP, ANCHOR_END );
|
||||||
node_only->set_anchor( MARGIN_BOTTOM, 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");
|
connect_dialog->connect("connected", this, "_connect");
|
||||||
tree->connect("item_selected", this, "_something_selected");
|
tree->connect("item_selected", this, "_something_selected");
|
||||||
tree->connect("item_activated", this, "_something_activated");
|
tree->connect("item_activated", this, "_something_activated");
|
||||||
|
tree->connect("item_rmb_selected", this, "_rmb_pressed" );
|
||||||
|
|
||||||
add_constant_override("separation", 3 * EDSCALE);
|
add_constant_override("separation", 3 * EDSCALE);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,10 @@
|
||||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
@author Juan Linietsky <reduzio@gmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef CONNECTIONS_DIALOG_H
|
#ifndef CONNECTIONS_DIALOG_H
|
||||||
#define CONNECTIONS_DIALOG_H
|
#define CONNECTIONS_DIALOG_H
|
||||||
|
|
||||||
|
|
@ -42,10 +46,7 @@
|
||||||
#include "scene/gui/tree.h"
|
#include "scene/gui/tree.h"
|
||||||
#include "undo_redo.h"
|
#include "undo_redo.h"
|
||||||
|
|
||||||
/**
|
class PopupMenu;
|
||||||
@author Juan Linietsky <reduzio@gmail.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
class ConnectDialogBinds;
|
class ConnectDialogBinds;
|
||||||
|
|
||||||
class ConnectDialog : public ConfirmationDialog {
|
class ConnectDialog : public ConfirmationDialog {
|
||||||
|
|
@ -93,6 +94,15 @@ class ConnectionsDock : public VBoxContainer {
|
||||||
|
|
||||||
GDCLASS(ConnectionsDock, VBoxContainer);
|
GDCLASS(ConnectionsDock, VBoxContainer);
|
||||||
|
|
||||||
|
enum SignalMenuOption {
|
||||||
|
CONNECT
|
||||||
|
};
|
||||||
|
|
||||||
|
enum SlotMenuOption {
|
||||||
|
EDIT,
|
||||||
|
DISCONNECT
|
||||||
|
};
|
||||||
|
|
||||||
Button *connect_button;
|
Button *connect_button;
|
||||||
EditorNode *editor;
|
EditorNode *editor;
|
||||||
Node *node;
|
Node *node;
|
||||||
|
|
@ -100,10 +110,17 @@ class ConnectionsDock : public VBoxContainer {
|
||||||
ConfirmationDialog *remove_confirm;
|
ConfirmationDialog *remove_confirm;
|
||||||
ConnectDialog *connect_dialog;
|
ConnectDialog *connect_dialog;
|
||||||
|
|
||||||
|
PopupMenu *signal_menu;
|
||||||
|
PopupMenu *slot_menu;
|
||||||
|
|
||||||
void _close();
|
void _close();
|
||||||
void _connect();
|
void _connect();
|
||||||
|
void _disconnect( TreeItem *item );
|
||||||
void _something_selected();
|
void _something_selected();
|
||||||
void _something_activated();
|
void _something_activated();
|
||||||
|
void _handle_signal_option( int option );
|
||||||
|
void _handle_slot_option( int option );
|
||||||
|
void _rmb_pressed( Vector2 position );
|
||||||
UndoRedo *undo_redo;
|
UndoRedo *undo_redo;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
@ -111,6 +128,11 @@ protected:
|
||||||
void _notification(int p_what);
|
void _notification(int p_what);
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool _is_item_signal( TreeItem *item );
|
||||||
|
void _open_connection_dialog( TreeItem *item );
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void set_undoredo(UndoRedo *p_undo_redo) { undo_redo = p_undo_redo; }
|
void set_undoredo(UndoRedo *p_undo_redo) { undo_redo = p_undo_redo; }
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue