summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/editor/scene_tree_dock.cpp49
-rw-r--r--tools/editor/scene_tree_dock.h5
-rw-r--r--tools/editor/scene_tree_editor.cpp9
-rw-r--r--tools/editor/scene_tree_editor.h3
4 files changed, 64 insertions, 2 deletions
diff --git a/tools/editor/scene_tree_dock.cpp b/tools/editor/scene_tree_dock.cpp
index ce7a0b2911..88bed4c23f 100644
--- a/tools/editor/scene_tree_dock.cpp
+++ b/tools/editor/scene_tree_dock.cpp
@@ -1681,9 +1681,50 @@ void SceneTreeDock::_nodes_dragged(Array p_nodes,NodePath p_to,int p_type) {
}
+void SceneTreeDock::_tree_rmb(const Vector2& p_menu_pos) {
+
+ List<Node*> selection = editor_selection->get_selected_node_list();
+
+ if (selection.size()==0)
+ return;
+ menu->clear();
+
+
+ if (selection.size()==1) {
+ menu->add_item("Add Child Node",TOOL_NEW,KEY_MASK_CMD|KEY_A);
+ menu->add_item("Instance Child",TOOL_INSTANCE);
+ menu->add_separator();
+ menu->add_item("Change Type",TOOL_REPLACE);
+ menu->add_separator();
+ menu->add_item("Edit Groups",TOOL_GROUP);
+ menu->add_item("Edit Connections",TOOL_CONNECT);
+ menu->add_separator();
+ menu->add_item("Add Script",TOOL_SCRIPT);
+ menu->add_separator();
+ }
+
+ menu->add_item("Move Up",TOOL_MOVE_UP,KEY_MASK_CMD|KEY_UP);
+ menu->add_item("Move Down",TOOL_MOVE_DOWN,KEY_MASK_CMD|KEY_DOWN);
+ menu->add_item("Duplicate",TOOL_DUPLICATE,KEY_MASK_CMD|KEY_D);
+ menu->add_item("Reparent",TOOL_REPARENT);
+
+ if (selection.size()==1) {
+ menu->add_separator();
+ menu->add_item("Save Branch as Scene",TOOL_NEW_SCENE_FROM);
+ }
+ menu->add_separator();
+
+ menu->add_item("Delete Node(s)",TOOL_ERASE,KEY_DELETE);
+
+ menu->set_size(Size2(1,1));
+ menu->set_pos(p_menu_pos);
+ menu->popup();
+
+}
+
void SceneTreeDock::_bind_methods() {
- ObjectTypeDB::bind_method(_MD("_tool_selected"),&SceneTreeDock::_tool_selected);
+ ObjectTypeDB::bind_method(_MD("_tool_selected"),&SceneTreeDock::_tool_selected,DEFVAL(false));
ObjectTypeDB::bind_method(_MD("_create"),&SceneTreeDock::_create);
//ObjectTypeDB::bind_method(_MD("_script_created"),&SceneTreeDock::_script_created);
ObjectTypeDB::bind_method(_MD("_node_reparent"),&SceneTreeDock::_node_reparent);
@@ -1701,6 +1742,7 @@ void SceneTreeDock::_bind_methods() {
ObjectTypeDB::bind_method(_MD("_new_scene_from"),&SceneTreeDock::_new_scene_from);
ObjectTypeDB::bind_method(_MD("_nodes_dragged"),&SceneTreeDock::_nodes_dragged);
ObjectTypeDB::bind_method(_MD("_files_dropped"),&SceneTreeDock::_files_dropped);
+ ObjectTypeDB::bind_method(_MD("_tree_rmb"),&SceneTreeDock::_tree_rmb);
ObjectTypeDB::bind_method(_MD("instance"),&SceneTreeDock::instance);
@@ -1765,6 +1807,7 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor,Node *p_scene_root,EditorSelec
scene_tree = memnew( SceneTreeEditor(false,true,true ));
vbc->add_child(scene_tree);
scene_tree->set_v_size_flags(SIZE_EXPAND|SIZE_FILL);
+ scene_tree->connect("rmb_pressed",this,"_tree_rmb");
scene_tree->connect("node_selected", this,"_node_selected",varray(),CONNECT_DEFERRED);
scene_tree->connect("node_renamed", this,"_node_renamed",varray(),CONNECT_DEFERRED);
@@ -1869,7 +1912,9 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor,Node *p_scene_root,EditorSelec
new_scene_from_dialog->connect("file_selected",this,"_new_scene_from");
-
+ menu = memnew( PopupMenu );
+ add_child(menu);
+ menu->connect("item_pressed",this,"_tool_selected");
first_enter=true;
diff --git a/tools/editor/scene_tree_dock.h b/tools/editor/scene_tree_dock.h
index 5dc1e3e12e..9b84c4d44d 100644
--- a/tools/editor/scene_tree_dock.h
+++ b/tools/editor/scene_tree_dock.h
@@ -35,6 +35,7 @@
#include "scene/gui/button.h"
#include "scene/gui/tool_button.h"
#include "scene/gui/box_container.h"
+#include "scene/gui/popup_menu.h"
#include "scene_tree_editor.h"
#include "create_dialog.h"
#include "editor_data.h"
@@ -93,6 +94,8 @@ class SceneTreeDock : public VBoxContainer {
EditorSubScene *import_subscene_dialog;
EditorFileDialog *new_scene_from_dialog;
+ PopupMenu * menu;
+
bool first_enter;
void _create();
@@ -135,6 +138,8 @@ class SceneTreeDock : public VBoxContainer {
void _nodes_dragged(Array p_nodes,NodePath p_to,int p_type);
void _files_dropped(Vector<String> p_files,NodePath p_to,int p_type);
+ void _tree_rmb(const Vector2& p_menu_pos);
+
protected:
void _notification(int p_what);
diff --git a/tools/editor/scene_tree_editor.cpp b/tools/editor/scene_tree_editor.cpp
index fd79460aa8..8760d21c1c 100644
--- a/tools/editor/scene_tree_editor.cpp
+++ b/tools/editor/scene_tree_editor.cpp
@@ -908,6 +908,10 @@ void SceneTreeEditor::drop_data_fw(const Point2& p_point,const Variant& p_data,C
}
+void SceneTreeEditor::_rmb_select(const Vector2& p_pos) {
+
+ emit_signal("rmb_pressed",tree->get_global_transform().xform(p_pos));
+}
void SceneTreeEditor::_bind_methods() {
@@ -923,6 +927,7 @@ void SceneTreeEditor::_bind_methods() {
ObjectTypeDB::bind_method("_cell_button_pressed",&SceneTreeEditor::_cell_button_pressed);
ObjectTypeDB::bind_method("_cell_collapsed",&SceneTreeEditor::_cell_collapsed);
ObjectTypeDB::bind_method("_subscene_option",&SceneTreeEditor::_subscene_option);
+ ObjectTypeDB::bind_method("_rmb_select",&SceneTreeEditor::_rmb_select);
ObjectTypeDB::bind_method("_node_script_changed",&SceneTreeEditor::_node_script_changed);
ObjectTypeDB::bind_method("_node_visibility_changed",&SceneTreeEditor::_node_visibility_changed);
@@ -937,6 +942,7 @@ void SceneTreeEditor::_bind_methods() {
ADD_SIGNAL( MethodInfo("node_changed") );
ADD_SIGNAL( MethodInfo("nodes_rearranged",PropertyInfo(Variant::ARRAY,"paths"),PropertyInfo(Variant::NODE_PATH,"to_path"),PropertyInfo(Variant::INT,"type") ) );
ADD_SIGNAL( MethodInfo("files_dropped",PropertyInfo(Variant::STRING_ARRAY,"files"),PropertyInfo(Variant::NODE_PATH,"to_path"),PropertyInfo(Variant::INT,"type") ) );
+ ADD_SIGNAL( MethodInfo("rmb_pressed",PropertyInfo(Variant::VECTOR2,"pos")) ) ;
ADD_SIGNAL( MethodInfo("open") );
ADD_SIGNAL( MethodInfo("open_script") );
@@ -976,6 +982,9 @@ SceneTreeEditor::SceneTreeEditor(bool p_label,bool p_can_rename, bool p_can_open
add_child( tree );
tree->set_drag_forwarding(this);
+ if (p_can_rename)
+ tree->set_allow_rmb_select(true);
+ tree->connect("item_rmb_selected",this,"_rmb_select");
tree->connect("cell_selected", this,"_selected_changed");
tree->connect("item_edited", this,"_renamed",varray(),CONNECT_DEFERRED);
diff --git a/tools/editor/scene_tree_editor.h b/tools/editor/scene_tree_editor.h
index 283db280ed..5529d36a46 100644
--- a/tools/editor/scene_tree_editor.h
+++ b/tools/editor/scene_tree_editor.h
@@ -112,6 +112,7 @@ class SceneTreeEditor : public Control {
void _subscene_option(int p_idx);
+
void _selection_changed();
Node *get_scene_node();
@@ -119,6 +120,8 @@ class SceneTreeEditor : public Control {
bool can_drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from) const;
void drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from);
+ void _rmb_select(const Vector2& p_pos);
+
public: