Browse Source

Merge pull request #15269 from ianb96/context_menu_improvements

Context Menu Improvements
Juan Linietsky 7 years ago
parent
commit
0fcc28b6f3

+ 38 - 1
editor/editor_node.cpp

@@ -1752,6 +1752,11 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
 			} else {
 			} else {
 				tab_closing = editor_data.get_edited_scene();
 				tab_closing = editor_data.get_edited_scene();
 			}
 			}
+			if (!editor_data.get_edited_scene_root(tab_closing)) {
+				// empty tab
+				_scene_tab_closed(tab_closing);
+				break;
+			}
 
 
 		} // fallthrough
 		} // fallthrough
 		case SCENE_TAB_CLOSE:
 		case SCENE_TAB_CLOSE:
@@ -3844,6 +3849,7 @@ void EditorNode::_scene_tab_input(const Ref<InputEvent> &p_input) {
 	Ref<InputEventMouseButton> mb = p_input;
 	Ref<InputEventMouseButton> mb = p_input;
 
 
 	if (mb.is_valid()) {
 	if (mb.is_valid()) {
+
 		if (scene_tabs->get_hovered_tab() >= 0) {
 		if (scene_tabs->get_hovered_tab() >= 0) {
 			if (mb->get_button_index() == BUTTON_MIDDLE && mb->is_pressed()) {
 			if (mb->get_button_index() == BUTTON_MIDDLE && mb->is_pressed()) {
 				_scene_tab_closed(scene_tabs->get_hovered_tab());
 				_scene_tab_closed(scene_tabs->get_hovered_tab());
@@ -3853,6 +3859,26 @@ void EditorNode::_scene_tab_input(const Ref<InputEvent> &p_input) {
 				_menu_option_confirm(FILE_NEW_SCENE, true);
 				_menu_option_confirm(FILE_NEW_SCENE, true);
 			}
 			}
 		}
 		}
+		if (mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed()) {
+
+			// context menu
+			scene_tabs_context_menu->clear();
+			scene_tabs_context_menu->set_size(Size2(1, 1));
+
+			scene_tabs_context_menu->add_shortcut(ED_GET_SHORTCUT("editor/new_scene"), FILE_NEW_SCENE);
+			if (scene_tabs->get_hovered_tab() >= 0) {
+				scene_tabs_context_menu->add_shortcut(ED_GET_SHORTCUT("editor/save_scene"), FILE_SAVE_SCENE);
+				scene_tabs_context_menu->add_shortcut(ED_GET_SHORTCUT("editor/save_scene_as"), FILE_SAVE_AS_SCENE);
+			}
+			scene_tabs_context_menu->add_shortcut(ED_GET_SHORTCUT("editor/save_all_scenes"), FILE_SAVE_ALL_SCENES);
+			if (scene_tabs->get_hovered_tab() >= 0) {
+				scene_tabs_context_menu->add_separator();
+				scene_tabs_context_menu->add_item(TTR("Play This Scene"), RUN_PLAY_SCENE);
+				scene_tabs_context_menu->add_item(TTR("Close Tab"), FILE_CLOSE);
+			}
+			scene_tabs_context_menu->set_position(mb->get_global_position());
+			scene_tabs_context_menu->popup();
+		}
 	}
 	}
 }
 }
 
 
@@ -4908,6 +4934,7 @@ EditorNode::EditorNode() {
 	scene_tabs = memnew(Tabs);
 	scene_tabs = memnew(Tabs);
 	scene_tabs->add_style_override("tab_fg", gui_base->get_stylebox("SceneTabFG", "EditorStyles"));
 	scene_tabs->add_style_override("tab_fg", gui_base->get_stylebox("SceneTabFG", "EditorStyles"));
 	scene_tabs->add_style_override("tab_bg", gui_base->get_stylebox("SceneTabBG", "EditorStyles"));
 	scene_tabs->add_style_override("tab_bg", gui_base->get_stylebox("SceneTabBG", "EditorStyles"));
+	scene_tabs->set_select_with_rmb(true);
 	scene_tabs->add_tab("unsaved");
 	scene_tabs->add_tab("unsaved");
 	scene_tabs->set_tab_align(Tabs::ALIGN_LEFT);
 	scene_tabs->set_tab_align(Tabs::ALIGN_LEFT);
 	scene_tabs->set_tab_close_display_policy((bool(EDITOR_DEF("interface/scene_tabs/always_show_close_button", false)) ? Tabs::CLOSE_BUTTON_SHOW_ALWAYS : Tabs::CLOSE_BUTTON_SHOW_ACTIVE_ONLY));
 	scene_tabs->set_tab_close_display_policy((bool(EDITOR_DEF("interface/scene_tabs/always_show_close_button", false)) ? Tabs::CLOSE_BUTTON_SHOW_ALWAYS : Tabs::CLOSE_BUTTON_SHOW_ACTIVE_ONLY));
@@ -4925,6 +4952,11 @@ EditorNode::EditorNode() {
 	tabbar_container = memnew(HBoxContainer);
 	tabbar_container = memnew(HBoxContainer);
 	scene_tabs->set_h_size_flags(Control::SIZE_EXPAND_FILL);
 	scene_tabs->set_h_size_flags(Control::SIZE_EXPAND_FILL);
 
 
+	scene_tabs_context_menu = memnew(PopupMenu);
+	tabbar_container->add_child(scene_tabs_context_menu);
+	scene_tabs_context_menu->connect("id_pressed", this, "_menu_option");
+	scene_tabs_context_menu->set_hide_on_window_lose_focus(true);
+
 	srt->add_child(tabbar_container);
 	srt->add_child(tabbar_container);
 	tabbar_container->add_child(scene_tabs);
 	tabbar_container->add_child(scene_tabs);
 	distraction_free = memnew(ToolButton);
 	distraction_free = memnew(ToolButton);
@@ -5031,6 +5063,7 @@ EditorNode::EditorNode() {
 
 
 	file_menu->set_tooltip(TTR("Operations with scene files."));
 	file_menu->set_tooltip(TTR("Operations with scene files."));
 	p = file_menu->get_popup();
 	p = file_menu->get_popup();
+	p->set_hide_on_window_lose_focus(true);
 	p->add_shortcut(ED_SHORTCUT("editor/new_scene", TTR("New Scene")), FILE_NEW_SCENE);
 	p->add_shortcut(ED_SHORTCUT("editor/new_scene", TTR("New Scene")), FILE_NEW_SCENE);
 	p->add_shortcut(ED_SHORTCUT("editor/new_inherited_scene", TTR("New Inherited Scene...")), FILE_NEW_INHERITED_SCENE);
 	p->add_shortcut(ED_SHORTCUT("editor/new_inherited_scene", TTR("New Inherited Scene...")), FILE_NEW_INHERITED_SCENE);
 	p->add_shortcut(ED_SHORTCUT("editor/open_scene", TTR("Open Scene..."), KEY_MASK_CMD + KEY_O), FILE_OPEN_SCENE);
 	p->add_shortcut(ED_SHORTCUT("editor/open_scene", TTR("Open Scene..."), KEY_MASK_CMD + KEY_O), FILE_OPEN_SCENE);
@@ -5076,6 +5109,7 @@ EditorNode::EditorNode() {
 	left_menu_hb->add_child(project_menu);
 	left_menu_hb->add_child(project_menu);
 
 
 	p = project_menu->get_popup();
 	p = project_menu->get_popup();
+	p->set_hide_on_window_lose_focus(true);
 	p->add_item(TTR("Project Settings"), RUN_SETTINGS);
 	p->add_item(TTR("Project Settings"), RUN_SETTINGS);
 	p->add_separator();
 	p->add_separator();
 	p->connect("id_pressed", this, "_menu_option");
 	p->connect("id_pressed", this, "_menu_option");
@@ -5111,6 +5145,7 @@ EditorNode::EditorNode() {
 	left_menu_hb->add_child(debug_menu);
 	left_menu_hb->add_child(debug_menu);
 
 
 	p = debug_menu->get_popup();
 	p = debug_menu->get_popup();
+	p->set_hide_on_window_lose_focus(true);
 	p->set_hide_on_item_selection(false);
 	p->set_hide_on_item_selection(false);
 	p->add_check_item(TTR("Deploy with Remote Debug"), RUN_DEPLOY_REMOTE_DEBUG);
 	p->add_check_item(TTR("Deploy with Remote Debug"), RUN_DEPLOY_REMOTE_DEBUG);
 	p->set_item_tooltip(p->get_item_count() - 1, TTR("When exporting or deploying, the resulting executable will attempt to connect to the IP of this computer in order to be debugged."));
 	p->set_item_tooltip(p->get_item_count() - 1, TTR("When exporting or deploying, the resulting executable will attempt to connect to the IP of this computer in order to be debugged."));
@@ -5135,8 +5170,9 @@ EditorNode::EditorNode() {
 	settings_menu->set_text(TTR("Editor"));
 	settings_menu->set_text(TTR("Editor"));
 	settings_menu->add_style_override("hover", gui_base->get_stylebox("MenuHover", "EditorStyles"));
 	settings_menu->add_style_override("hover", gui_base->get_stylebox("MenuHover", "EditorStyles"));
 	left_menu_hb->add_child(settings_menu);
 	left_menu_hb->add_child(settings_menu);
-	p = settings_menu->get_popup();
 
 
+	p = settings_menu->get_popup();
+	p->set_hide_on_window_lose_focus(true);
 	p->add_item(TTR("Editor Settings"), SETTINGS_PREFERENCES);
 	p->add_item(TTR("Editor Settings"), SETTINGS_PREFERENCES);
 	p->add_separator();
 	p->add_separator();
 
 
@@ -5172,6 +5208,7 @@ EditorNode::EditorNode() {
 	left_menu_hb->add_child(help_menu);
 	left_menu_hb->add_child(help_menu);
 
 
 	p = help_menu->get_popup();
 	p = help_menu->get_popup();
+	p->set_hide_on_window_lose_focus(true);
 	p->connect("id_pressed", this, "_menu_option");
 	p->connect("id_pressed", this, "_menu_option");
 	p->add_icon_item(gui_base->get_icon("ClassList", "EditorIcons"), TTR("Classes"), HELP_CLASSES);
 	p->add_icon_item(gui_base->get_icon("ClassList", "EditorIcons"), TTR("Classes"), HELP_CLASSES);
 	p->add_icon_item(gui_base->get_icon("HelpSearch", "EditorIcons"), TTR("Search"), HELP_SEARCH);
 	p->add_icon_item(gui_base->get_icon("HelpSearch", "EditorIcons"), TTR("Search"), HELP_SEARCH);

+ 1 - 0
editor/editor_node.h

@@ -223,6 +223,7 @@ private:
 	//main tabs
 	//main tabs
 
 
 	Tabs *scene_tabs;
 	Tabs *scene_tabs;
+	PopupMenu *scene_tabs_context_menu;
 	Panel *tab_preview_panel;
 	Panel *tab_preview_panel;
 	TextureRect *tab_preview;
 	TextureRect *tab_preview;
 	int tab_closing;
 	int tab_closing;

+ 2 - 0
editor/filesystem_dock.cpp

@@ -1983,9 +1983,11 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) {
 
 
 */
 */
 	file_options = memnew(PopupMenu);
 	file_options = memnew(PopupMenu);
+	file_options->set_hide_on_window_lose_focus(true);
 	add_child(file_options);
 	add_child(file_options);
 
 
 	folder_options = memnew(PopupMenu);
 	folder_options = memnew(PopupMenu);
+	folder_options->set_hide_on_window_lose_focus(true);
 	add_child(folder_options);
 	add_child(folder_options);
 
 
 	split_box = memnew(VSplitContainer);
 	split_box = memnew(VSplitContainer);

+ 14 - 11
editor/plugins/script_editor_plugin.cpp

@@ -2402,26 +2402,25 @@ void ScriptEditor::_make_script_list_context_menu() {
 	if (se) {
 	if (se) {
 		context_menu->add_shortcut(ED_GET_SHORTCUT("script_editor/save"), FILE_SAVE);
 		context_menu->add_shortcut(ED_GET_SHORTCUT("script_editor/save"), FILE_SAVE);
 		context_menu->add_shortcut(ED_GET_SHORTCUT("script_editor/save_as"), FILE_SAVE_AS);
 		context_menu->add_shortcut(ED_GET_SHORTCUT("script_editor/save_as"), FILE_SAVE_AS);
-		context_menu->add_shortcut(ED_GET_SHORTCUT("script_editor/close_file"), FILE_CLOSE);
-		context_menu->add_shortcut(ED_GET_SHORTCUT("script_editor/close_all"), CLOSE_ALL);
-		context_menu->add_shortcut(ED_GET_SHORTCUT("script_editor/close_other_tabs"), CLOSE_OTHER_TABS);
-		context_menu->add_separator();
-		context_menu->add_shortcut(ED_GET_SHORTCUT("script_editor/copy_path"), FILE_COPY_PATH);
-		context_menu->add_shortcut(ED_GET_SHORTCUT("script_editor/show_in_file_system"), SHOW_IN_FILE_SYSTEM);
-
+	}
+	context_menu->add_shortcut(ED_GET_SHORTCUT("script_editor/close_file"), FILE_CLOSE);
+	context_menu->add_shortcut(ED_GET_SHORTCUT("script_editor/close_all"), CLOSE_ALL);
+	context_menu->add_shortcut(ED_GET_SHORTCUT("script_editor/close_other_tabs"), CLOSE_OTHER_TABS);
+	context_menu->add_separator();
+	if (se) {
 		Ref<Script> scr = se->get_edited_resource();
 		Ref<Script> scr = se->get_edited_resource();
 		if (scr != NULL) {
 		if (scr != NULL) {
 			context_menu->add_shortcut(ED_GET_SHORTCUT("script_editor/reload_script_soft"), FILE_TOOL_RELOAD_SOFT);
 			context_menu->add_shortcut(ED_GET_SHORTCUT("script_editor/reload_script_soft"), FILE_TOOL_RELOAD_SOFT);
 			if (!scr.is_null() && scr->is_tool()) {
 			if (!scr.is_null() && scr->is_tool()) {
-				context_menu->add_separator();
 				context_menu->add_shortcut(ED_GET_SHORTCUT("script_editor/run_file"), FILE_RUN);
 				context_menu->add_shortcut(ED_GET_SHORTCUT("script_editor/run_file"), FILE_RUN);
+				context_menu->add_separator();
 			}
 			}
 		}
 		}
-	} else {
-		context_menu->add_shortcut(ED_GET_SHORTCUT("script_editor/close_file"), FILE_CLOSE);
+		context_menu->add_shortcut(ED_GET_SHORTCUT("script_editor/copy_path"), FILE_COPY_PATH);
+		context_menu->add_shortcut(ED_GET_SHORTCUT("script_editor/show_in_file_system"), SHOW_IN_FILE_SYSTEM);
+		context_menu->add_separator();
 	}
 	}
 
 
-	context_menu->add_separator();
 	context_menu->add_shortcut(ED_GET_SHORTCUT("script_editor/window_move_up"), WINDOW_MOVE_UP);
 	context_menu->add_shortcut(ED_GET_SHORTCUT("script_editor/window_move_up"), WINDOW_MOVE_UP);
 	context_menu->add_shortcut(ED_GET_SHORTCUT("script_editor/window_move_down"), WINDOW_MOVE_DOWN);
 	context_menu->add_shortcut(ED_GET_SHORTCUT("script_editor/window_move_down"), WINDOW_MOVE_DOWN);
 	context_menu->add_shortcut(ED_GET_SHORTCUT("script_editor/window_sort"), WINDOW_SORT);
 	context_menu->add_shortcut(ED_GET_SHORTCUT("script_editor/window_sort"), WINDOW_SORT);
@@ -2902,6 +2901,7 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
 	context_menu = memnew(PopupMenu);
 	context_menu = memnew(PopupMenu);
 	add_child(context_menu);
 	add_child(context_menu);
 	context_menu->connect("id_pressed", this, "_menu_option");
 	context_menu->connect("id_pressed", this, "_menu_option");
+	context_menu->set_hide_on_window_lose_focus(true);
 
 
 	overview_vbox = memnew(VBoxContainer);
 	overview_vbox = memnew(VBoxContainer);
 	overview_vbox->set_custom_minimum_size(Size2(0, 90));
 	overview_vbox->set_custom_minimum_size(Size2(0, 90));
@@ -2956,6 +2956,7 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
 	file_menu = memnew(MenuButton);
 	file_menu = memnew(MenuButton);
 	menu_hb->add_child(file_menu);
 	menu_hb->add_child(file_menu);
 	file_menu->set_text(TTR("File"));
 	file_menu->set_text(TTR("File"));
+	file_menu->get_popup()->set_hide_on_window_lose_focus(true);
 	file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/new", TTR("New")), FILE_NEW);
 	file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/new", TTR("New")), FILE_NEW);
 	file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/open", TTR("Open")), FILE_OPEN);
 	file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/open", TTR("Open")), FILE_OPEN);
 	file_menu->get_popup()->add_submenu_item(TTR("Open Recent"), "RecentScripts", FILE_OPEN_RECENT);
 	file_menu->get_popup()->add_submenu_item(TTR("Open Recent"), "RecentScripts", FILE_OPEN_RECENT);
@@ -3005,6 +3006,7 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
 	script_search_menu = memnew(MenuButton);
 	script_search_menu = memnew(MenuButton);
 	menu_hb->add_child(script_search_menu);
 	menu_hb->add_child(script_search_menu);
 	script_search_menu->set_text(TTR("Search"));
 	script_search_menu->set_text(TTR("Search"));
+	script_search_menu->get_popup()->set_hide_on_window_lose_focus(true);
 	script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find", TTR("Find..."), KEY_MASK_CMD | KEY_F), HELP_SEARCH_FIND);
 	script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find", TTR("Find..."), KEY_MASK_CMD | KEY_F), HELP_SEARCH_FIND);
 	script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find_next", TTR("Find Next"), KEY_F3), HELP_SEARCH_FIND_NEXT);
 	script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find_next", TTR("Find Next"), KEY_F3), HELP_SEARCH_FIND_NEXT);
 	script_search_menu->get_popup()->connect("id_pressed", this, "_menu_option");
 	script_search_menu->get_popup()->connect("id_pressed", this, "_menu_option");
@@ -3013,6 +3015,7 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
 	debug_menu = memnew(MenuButton);
 	debug_menu = memnew(MenuButton);
 	menu_hb->add_child(debug_menu);
 	menu_hb->add_child(debug_menu);
 	debug_menu->set_text(TTR("Debug"));
 	debug_menu->set_text(TTR("Debug"));
+	debug_menu->get_popup()->set_hide_on_window_lose_focus(true);
 	debug_menu->get_popup()->add_shortcut(ED_SHORTCUT("debugger/step_over", TTR("Step Over"), KEY_F10), DEBUG_NEXT);
 	debug_menu->get_popup()->add_shortcut(ED_SHORTCUT("debugger/step_over", TTR("Step Over"), KEY_F10), DEBUG_NEXT);
 	debug_menu->get_popup()->add_shortcut(ED_SHORTCUT("debugger/step_into", TTR("Step Into"), KEY_F11), DEBUG_STEP);
 	debug_menu->get_popup()->add_shortcut(ED_SHORTCUT("debugger/step_into", TTR("Step Into"), KEY_F11), DEBUG_STEP);
 	debug_menu->get_popup()->add_separator();
 	debug_menu->get_popup()->add_separator();

+ 73 - 40
editor/plugins/script_text_editor.cpp

@@ -967,7 +967,6 @@ void ScriptTextEditor::_edit_option(int p_op) {
 			}
 			}
 
 
 		} break;
 		} break;
-
 		case HELP_CONTEXTUAL: {
 		case HELP_CONTEXTUAL: {
 
 
 			String text = tx->get_selection_text();
 			String text = tx->get_selection_text();
@@ -977,6 +976,15 @@ void ScriptTextEditor::_edit_option(int p_op) {
 				emit_signal("request_help_search", text);
 				emit_signal("request_help_search", text);
 			}
 			}
 		} break;
 		} break;
+		case LOOKUP_SYMBOL: {
+
+			String text = tx->get_word_under_cursor();
+			if (text == "")
+				text = tx->get_selection_text();
+			if (text != "") {
+				_lookup_symbol(text, tx->cursor_get_line(), tx->cursor_get_column());
+			}
+		} break;
 	}
 	}
 }
 }
 
 
@@ -1182,19 +1190,13 @@ void ScriptTextEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) {
 
 
 	if (mb.is_valid()) {
 	if (mb.is_valid()) {
 
 
-		if (mb->get_button_index() == BUTTON_RIGHT) {
-
+		if (mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed()) {
 			int col, row;
 			int col, row;
 			TextEdit *tx = code_editor->get_text_edit();
 			TextEdit *tx = code_editor->get_text_edit();
 			tx->_get_mouse_pos(mb->get_global_position() - tx->get_global_position(), row, col);
 			tx->_get_mouse_pos(mb->get_global_position() - tx->get_global_position(), row, col);
 			Vector2 mpos = mb->get_global_position() - tx->get_global_position();
 			Vector2 mpos = mb->get_global_position() - tx->get_global_position();
 
 
 			tx->set_right_click_moves_caret(EditorSettings::get_singleton()->get("text_editor/cursor/right_click_moves_caret"));
 			tx->set_right_click_moves_caret(EditorSettings::get_singleton()->get("text_editor/cursor/right_click_moves_caret"));
-			bool has_color = (tx->get_word_at_pos(mpos) == "Color");
-			int fold_state = 0;
-			bool can_fold = tx->can_fold(row);
-			bool is_folded = tx->is_folded(row);
-
 			if (tx->is_right_click_moving_caret()) {
 			if (tx->is_right_click_moving_caret()) {
 				if (tx->is_selection_active()) {
 				if (tx->is_selection_active()) {
 
 
@@ -1214,38 +1216,62 @@ void ScriptTextEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) {
 				}
 				}
 			}
 			}
 
 
-			if (!mb->is_pressed()) {
-				if (has_color) {
-					String line = tx->get_line(row);
-					color_line = row;
-					int begin = 0;
-					int end = 0;
-					bool valid = false;
-					for (int i = col; i < line.length(); i++) {
-						if (line[i] == '(') {
-							begin = i;
-							continue;
-						} else if (line[i] == ')') {
-							end = i + 1;
-							valid = true;
-							break;
-						}
+			String word_at_mouse = tx->get_word_at_pos(mpos);
+			if (word_at_mouse == "")
+				word_at_mouse = tx->get_word_under_cursor();
+			if (word_at_mouse == "")
+				word_at_mouse = tx->get_selection_text();
+
+			bool has_color = (word_at_mouse == "Color");
+			int fold_state = 0;
+			bool foldable = tx->can_fold(row) || tx->is_folded(row);
+			bool open_docs = false;
+			bool goto_definition = false;
+
+			if (word_at_mouse.is_resource_file()) {
+				open_docs = true;
+			} else {
+
+				Node *base = get_tree()->get_edited_scene_root();
+				if (base) {
+					base = _find_node_for_script(base, base, script);
+				}
+				ScriptLanguage::LookupResult result;
+				if (script->get_language()->lookup_code(code_editor->get_text_edit()->get_text_for_lookup_completion(), word_at_mouse, script->get_path().get_base_dir(), base, result) == OK) {
+					open_docs = true;
+				}
+			}
+
+			if (has_color) {
+				String line = tx->get_line(row);
+				color_line = row;
+				int begin = 0;
+				int end = 0;
+				bool valid = false;
+				for (int i = col; i < line.length(); i++) {
+					if (line[i] == '(') {
+						begin = i;
+						continue;
+					} else if (line[i] == ')') {
+						end = i + 1;
+						valid = true;
+						break;
 					}
 					}
-					if (valid) {
-						color_args = line.substr(begin, end - begin);
-						String stripped = color_args.replace(" ", "").replace("(", "").replace(")", "");
-						Vector<float> color = stripped.split_floats(",");
-						if (color.size() > 2) {
-							float alpha = color.size() > 3 ? color[3] : 1.0f;
-							color_picker->set_pick_color(Color(color[0], color[1], color[2], alpha));
-						}
-						color_panel->set_position(get_global_transform().xform(get_local_mouse_position()));
-					} else {
-						has_color = false;
+				}
+				if (valid) {
+					color_args = line.substr(begin, end - begin);
+					String stripped = color_args.replace(" ", "").replace("(", "").replace(")", "");
+					Vector<float> color = stripped.split_floats(",");
+					if (color.size() > 2) {
+						float alpha = color.size() > 3 ? color[3] : 1.0f;
+						color_picker->set_pick_color(Color(color[0], color[1], color[2], alpha));
 					}
 					}
+					color_panel->set_position(get_global_transform().xform(get_local_mouse_position()));
+				} else {
+					has_color = false;
 				}
 				}
-				_make_context_menu(tx->is_selection_active(), has_color, can_fold, is_folded);
 			}
 			}
+			_make_context_menu(tx->is_selection_active(), has_color, foldable, open_docs, goto_definition);
 		}
 		}
 	}
 	}
 }
 }
@@ -1264,7 +1290,7 @@ void ScriptTextEditor::_color_changed(const Color &p_color) {
 	code_editor->get_text_edit()->set_line(color_line, new_line);
 	code_editor->get_text_edit()->set_line(color_line, new_line);
 }
 }
 
 
-void ScriptTextEditor::_make_context_menu(bool p_selection, bool p_color, bool p_can_fold, bool p_is_folded) {
+void ScriptTextEditor::_make_context_menu(bool p_selection, bool p_color, bool p_foldable, bool p_open_docs, bool p_goto_definition) {
 
 
 	context_menu->clear();
 	context_menu->clear();
 	if (p_selection) {
 	if (p_selection) {
@@ -1287,13 +1313,17 @@ void ScriptTextEditor::_make_context_menu(bool p_selection, bool p_color, bool p
 		context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/convert_to_uppercase"), EDIT_TO_UPPERCASE);
 		context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/convert_to_uppercase"), EDIT_TO_UPPERCASE);
 		context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/convert_to_lowercase"), EDIT_TO_LOWERCASE);
 		context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/convert_to_lowercase"), EDIT_TO_LOWERCASE);
 	}
 	}
-	if (p_can_fold || p_is_folded)
+	if (p_foldable)
 		context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_fold_line"), EDIT_TOGGLE_FOLD_LINE);
 		context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_fold_line"), EDIT_TOGGLE_FOLD_LINE);
 
 
-	if (p_color) {
+	if (p_color || p_open_docs || p_goto_definition) {
 		context_menu->add_separator();
 		context_menu->add_separator();
-		context_menu->add_item(TTR("Pick Color"), EDIT_PICK_COLOR);
+		if (p_open_docs)
+			context_menu->add_item(TTR("Lookup Symbol"), LOOKUP_SYMBOL);
+		if (p_color)
+			context_menu->add_item(TTR("Pick Color"), EDIT_PICK_COLOR);
 	}
 	}
+
 	context_menu->set_position(get_global_transform().xform(get_local_mouse_position()));
 	context_menu->set_position(get_global_transform().xform(get_local_mouse_position()));
 	context_menu->set_size(Vector2(1, 1));
 	context_menu->set_size(Vector2(1, 1));
 	context_menu->popup();
 	context_menu->popup();
@@ -1327,6 +1357,7 @@ ScriptTextEditor::ScriptTextEditor() {
 	context_menu = memnew(PopupMenu);
 	context_menu = memnew(PopupMenu);
 	add_child(context_menu);
 	add_child(context_menu);
 	context_menu->connect("id_pressed", this, "_edit_option");
 	context_menu->connect("id_pressed", this, "_edit_option");
+	context_menu->set_hide_on_window_lose_focus(true);
 
 
 	color_panel = memnew(PopupPanel);
 	color_panel = memnew(PopupPanel);
 	add_child(color_panel);
 	add_child(color_panel);
@@ -1338,6 +1369,7 @@ ScriptTextEditor::ScriptTextEditor() {
 
 
 	edit_menu = memnew(MenuButton);
 	edit_menu = memnew(MenuButton);
 	edit_menu->set_text(TTR("Edit"));
 	edit_menu->set_text(TTR("Edit"));
+	edit_menu->get_popup()->set_hide_on_window_lose_focus(true);
 	edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/undo"), EDIT_UNDO);
 	edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/undo"), EDIT_UNDO);
 	edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/redo"), EDIT_REDO);
 	edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/redo"), EDIT_REDO);
 	edit_menu->get_popup()->add_separator();
 	edit_menu->get_popup()->add_separator();
@@ -1391,6 +1423,7 @@ ScriptTextEditor::ScriptTextEditor() {
 	search_menu = memnew(MenuButton);
 	search_menu = memnew(MenuButton);
 	edit_hb->add_child(search_menu);
 	edit_hb->add_child(search_menu);
 	search_menu->set_text(TTR("Search"));
 	search_menu->set_text(TTR("Search"));
+	search_menu->get_popup()->set_hide_on_window_lose_focus(true);
 	search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find"), SEARCH_FIND);
 	search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find"), SEARCH_FIND);
 	search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find_next"), SEARCH_FIND_NEXT);
 	search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find_next"), SEARCH_FIND_NEXT);
 	search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find_previous"), SEARCH_FIND_PREV);
 	search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find_previous"), SEARCH_FIND_PREV);

+ 2 - 1
editor/plugins/script_text_editor.h

@@ -112,6 +112,7 @@ class ScriptTextEditor : public ScriptEditorBase {
 		DEBUG_GOTO_NEXT_BREAKPOINT,
 		DEBUG_GOTO_NEXT_BREAKPOINT,
 		DEBUG_GOTO_PREV_BREAKPOINT,
 		DEBUG_GOTO_PREV_BREAKPOINT,
 		HELP_CONTEXTUAL,
 		HELP_CONTEXTUAL,
+		LOOKUP_SYMBOL,
 	};
 	};
 
 
 protected:
 protected:
@@ -131,7 +132,7 @@ protected:
 	void _change_syntax_highlighter(int p_idx);
 	void _change_syntax_highlighter(int p_idx);
 
 
 	void _edit_option(int p_op);
 	void _edit_option(int p_op);
-	void _make_context_menu(bool p_selection, bool p_color, bool p_can_fold, bool p_is_folded);
+	void _make_context_menu(bool p_selection, bool p_color, bool p_foldable, bool p_open_docs, bool p_goto_definition);
 	void _text_edit_gui_input(const Ref<InputEvent> &ev);
 	void _text_edit_gui_input(const Ref<InputEvent> &ev);
 	void _color_changed(const Color &p_color);
 	void _color_changed(const Color &p_color);
 
 

+ 5 - 6
editor/plugins/shader_editor_plugin.cpp

@@ -465,7 +465,7 @@ void ShaderEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) {
 
 
 	if (mb.is_valid()) {
 	if (mb.is_valid()) {
 
 
-		if (mb->get_button_index() == BUTTON_RIGHT) {
+		if (mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed()) {
 
 
 			int col, row;
 			int col, row;
 			TextEdit *tx = shader_editor->get_text_edit();
 			TextEdit *tx = shader_editor->get_text_edit();
@@ -491,10 +491,7 @@ void ShaderEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) {
 					tx->cursor_set_column(col);
 					tx->cursor_set_column(col);
 				}
 				}
 			}
 			}
-
-			if (!mb->is_pressed()) {
-				_make_context_menu(tx->is_selection_active());
-			}
+			_make_context_menu(tx->is_selection_active());
 		}
 		}
 	}
 	}
 }
 }
@@ -546,6 +543,7 @@ ShaderEditor::ShaderEditor(EditorNode *p_node) {
 	context_menu = memnew(PopupMenu);
 	context_menu = memnew(PopupMenu);
 	add_child(context_menu);
 	add_child(context_menu);
 	context_menu->connect("id_pressed", this, "_menu_option");
 	context_menu->connect("id_pressed", this, "_menu_option");
+	context_menu->set_hide_on_window_lose_focus(true);
 
 
 	VBoxContainer *main_container = memnew(VBoxContainer);
 	VBoxContainer *main_container = memnew(VBoxContainer);
 	HBoxContainer *hbc = memnew(HBoxContainer);
 	HBoxContainer *hbc = memnew(HBoxContainer);
@@ -554,6 +552,7 @@ ShaderEditor::ShaderEditor(EditorNode *p_node) {
 	//edit_menu->set_position(Point2(5, -1));
 	//edit_menu->set_position(Point2(5, -1));
 	edit_menu->set_text(TTR("Edit"));
 	edit_menu->set_text(TTR("Edit"));
 
 
+	edit_menu->get_popup()->set_hide_on_window_lose_focus(true);
 	edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/undo"), EDIT_UNDO);
 	edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/undo"), EDIT_UNDO);
 	edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/redo"), EDIT_REDO);
 	edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/redo"), EDIT_REDO);
 	edit_menu->get_popup()->add_separator();
 	edit_menu->get_popup()->add_separator();
@@ -578,7 +577,7 @@ ShaderEditor::ShaderEditor(EditorNode *p_node) {
 	search_menu = memnew(MenuButton);
 	search_menu = memnew(MenuButton);
 	//search_menu->set_position(Point2(38, -1));
 	//search_menu->set_position(Point2(38, -1));
 	search_menu->set_text(TTR("Search"));
 	search_menu->set_text(TTR("Search"));
-
+	search_menu->get_popup()->set_hide_on_window_lose_focus(true);
 	search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find"), SEARCH_FIND);
 	search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find"), SEARCH_FIND);
 	search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find_next"), SEARCH_FIND_NEXT);
 	search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find_next"), SEARCH_FIND_NEXT);
 	search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find_previous"), SEARCH_FIND_PREV);
 	search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find_previous"), SEARCH_FIND_PREV);

+ 15 - 7
editor/scene_tree_dock.cpp

@@ -1985,6 +1985,8 @@ void SceneTreeDock::_tree_rmb(const Vector2 &p_menu_pos) {
 
 
 	if (selection.size() == 1) {
 	if (selection.size() == 1) {
 
 
+		Node *selected = selection[0];
+
 		subresources.clear();
 		subresources.clear();
 		menu_subresources->clear();
 		menu_subresources->clear();
 		menu_subresources->set_size(Size2(1, 1));
 		menu_subresources->set_size(Size2(1, 1));
@@ -1995,18 +1997,23 @@ void SceneTreeDock::_tree_rmb(const Vector2 &p_menu_pos) {
 		menu->add_icon_shortcut(get_icon("Add", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/add_child_node"), TOOL_NEW);
 		menu->add_icon_shortcut(get_icon("Add", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/add_child_node"), TOOL_NEW);
 		menu->add_icon_shortcut(get_icon("Instance", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/instance_scene"), TOOL_INSTANCE);
 		menu->add_icon_shortcut(get_icon("Instance", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/instance_scene"), TOOL_INSTANCE);
 		menu->add_separator();
 		menu->add_separator();
+
 		menu->add_icon_shortcut(get_icon("ScriptCreate", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/attach_script"), TOOL_ATTACH_SCRIPT);
 		menu->add_icon_shortcut(get_icon("ScriptCreate", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/attach_script"), TOOL_ATTACH_SCRIPT);
-		menu->add_icon_shortcut(get_icon("ScriptRemove", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/clear_script"), TOOL_CLEAR_SCRIPT);
+		Ref<Script> existing = selected->get_script();
+		if (existing.is_valid()) {
+			menu->add_icon_shortcut(get_icon("ScriptRemove", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/clear_script"), TOOL_CLEAR_SCRIPT);
+		}
 		menu->add_separator();
 		menu->add_separator();
 		menu->add_icon_shortcut(get_icon("Rename", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/rename"), TOOL_RENAME);
 		menu->add_icon_shortcut(get_icon("Rename", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/rename"), TOOL_RENAME);
 	}
 	}
 	menu->add_icon_shortcut(get_icon("Reload", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/change_node_type"), TOOL_REPLACE);
 	menu->add_icon_shortcut(get_icon("Reload", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/change_node_type"), TOOL_REPLACE);
-	menu->add_separator();
-	menu->add_icon_shortcut(get_icon("MoveUp", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/move_up"), TOOL_MOVE_UP);
-	menu->add_icon_shortcut(get_icon("MoveDown", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/move_down"), TOOL_MOVE_DOWN);
-	menu->add_icon_shortcut(get_icon("Duplicate", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/duplicate"), TOOL_DUPLICATE);
-	menu->add_icon_shortcut(get_icon("Reparent", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/reparent"), TOOL_REPARENT);
-
+	if (scene_tree->get_selected() != edited_scene) {
+		menu->add_separator();
+		menu->add_icon_shortcut(get_icon("MoveUp", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/move_up"), TOOL_MOVE_UP);
+		menu->add_icon_shortcut(get_icon("MoveDown", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/move_down"), TOOL_MOVE_DOWN);
+		menu->add_icon_shortcut(get_icon("Duplicate", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/duplicate"), TOOL_DUPLICATE);
+		menu->add_icon_shortcut(get_icon("Reparent", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/reparent"), TOOL_REPARENT);
+	}
 	if (selection.size() == 1) {
 	if (selection.size() == 1) {
 
 
 		menu->add_icon_shortcut(get_icon("NewRoot", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/make_root"), TOOL_MAKE_ROOT);
 		menu->add_icon_shortcut(get_icon("NewRoot", "EditorIcons"), ED_GET_SHORTCUT("scene_tree/make_root"), TOOL_MAKE_ROOT);
@@ -2325,6 +2332,7 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSel
 	menu = memnew(PopupMenu);
 	menu = memnew(PopupMenu);
 	add_child(menu);
 	add_child(menu);
 	menu->connect("id_pressed", this, "_tool_selected");
 	menu->connect("id_pressed", this, "_tool_selected");
+	menu->set_hide_on_window_lose_focus(true);
 	menu_subresources = memnew(PopupMenu);
 	menu_subresources = memnew(PopupMenu);
 	menu_subresources->set_name("Sub-Resources");
 	menu_subresources->set_name("Sub-Resources");
 	menu_subresources->connect("id_pressed", this, "_tool_selected");
 	menu_subresources->connect("id_pressed", this, "_tool_selected");

+ 19 - 0
scene/gui/popup_menu.cpp

@@ -530,6 +530,11 @@ void PopupMenu::_notification(int p_what) {
 			}
 			}
 
 
 		} break;
 		} break;
+		case MainLoop::NOTIFICATION_WM_FOCUS_OUT: {
+
+			if (hide_on_window_lose_focus)
+				hide();
+		} break;
 		case NOTIFICATION_MOUSE_ENTER: {
 		case NOTIFICATION_MOUSE_ENTER: {
 
 
 			grab_focus();
 			grab_focus();
@@ -1249,6 +1254,16 @@ float PopupMenu::get_submenu_popup_delay() const {
 	return submenu_timer->get_wait_time();
 	return submenu_timer->get_wait_time();
 }
 }
 
 
+void PopupMenu::set_hide_on_window_lose_focus(bool p_enabled) {
+
+	hide_on_window_lose_focus = p_enabled;
+}
+
+bool PopupMenu::is_hide_on_window_lose_focus() const {
+
+	return hide_on_window_lose_focus;
+}
+
 String PopupMenu::get_tooltip(const Point2 &p_pos) const {
 String PopupMenu::get_tooltip(const Point2 &p_pos) const {
 
 
 	int over = _get_mouse_over(p_pos);
 	int over = _get_mouse_over(p_pos);
@@ -1353,6 +1368,10 @@ void PopupMenu::_bind_methods() {
 
 
 	ClassDB::bind_method(D_METHOD("set_submenu_popup_delay", "seconds"), &PopupMenu::set_submenu_popup_delay);
 	ClassDB::bind_method(D_METHOD("set_submenu_popup_delay", "seconds"), &PopupMenu::set_submenu_popup_delay);
 	ClassDB::bind_method(D_METHOD("get_submenu_popup_delay"), &PopupMenu::get_submenu_popup_delay);
 	ClassDB::bind_method(D_METHOD("get_submenu_popup_delay"), &PopupMenu::get_submenu_popup_delay);
+
+	ClassDB::bind_method(D_METHOD("set_hide_on_window_lose_focus", "enable"), &PopupMenu::set_hide_on_window_lose_focus);
+	ClassDB::bind_method(D_METHOD("is_hide_on_window_lose_focus"), &PopupMenu::is_hide_on_window_lose_focus);
+
 	ClassDB::bind_method(D_METHOD("_submenu_timeout"), &PopupMenu::_submenu_timeout);
 	ClassDB::bind_method(D_METHOD("_submenu_timeout"), &PopupMenu::_submenu_timeout);
 
 
 	ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "items", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL), "_set_items", "_get_items");
 	ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "items", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL), "_set_items", "_get_items");

+ 4 - 0
scene/gui/popup_menu.h

@@ -101,6 +101,7 @@ class PopupMenu : public Popup {
 	bool hide_on_item_selection;
 	bool hide_on_item_selection;
 	bool hide_on_checkable_item_selection;
 	bool hide_on_checkable_item_selection;
 	bool hide_on_multistate_item_selection;
 	bool hide_on_multistate_item_selection;
+	bool hide_on_window_lose_focus;
 	Vector2 moved;
 	Vector2 moved;
 
 
 	Array _get_items() const;
 	Array _get_items() const;
@@ -207,6 +208,9 @@ public:
 
 
 	virtual void popup(const Rect2 &p_bounds = Rect2());
 	virtual void popup(const Rect2 &p_bounds = Rect2());
 
 
+	void set_hide_on_window_lose_focus(bool p_enabled);
+	bool is_hide_on_window_lose_focus() const;
+
 	PopupMenu();
 	PopupMenu();
 	~PopupMenu();
 	~PopupMenu();
 };
 };

+ 14 - 1
scene/gui/tabs.cpp

@@ -189,7 +189,7 @@ void Tabs::_gui_input(const Ref<InputEvent> &p_event) {
 			update();
 			update();
 		}
 		}
 
 
-		if (mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) {
+		if (mb->is_pressed() && (mb->get_button_index() == BUTTON_LEFT || (select_with_rmb && mb->get_button_index() == BUTTON_RIGHT))) {
 
 
 			// clicks
 			// clicks
 			Point2 pos(mb->get_position().x, mb->get_position().y);
 			Point2 pos(mb->get_position().x, mb->get_position().y);
@@ -920,6 +920,14 @@ int Tabs::get_tabs_rearrange_group() const {
 	return tabs_rearrange_group;
 	return tabs_rearrange_group;
 }
 }
 
 
+void Tabs::set_select_with_rmb(bool p_enabled) {
+	select_with_rmb = p_enabled;
+}
+
+bool Tabs::get_select_with_rmb() const {
+	return select_with_rmb;
+}
+
 void Tabs::_bind_methods() {
 void Tabs::_bind_methods() {
 
 
 	ClassDB::bind_method(D_METHOD("_gui_input"), &Tabs::_gui_input);
 	ClassDB::bind_method(D_METHOD("_gui_input"), &Tabs::_gui_input);
@@ -950,6 +958,9 @@ void Tabs::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("set_tabs_rearrange_group", "group_id"), &Tabs::set_tabs_rearrange_group);
 	ClassDB::bind_method(D_METHOD("set_tabs_rearrange_group", "group_id"), &Tabs::set_tabs_rearrange_group);
 	ClassDB::bind_method(D_METHOD("get_tabs_rearrange_group"), &Tabs::get_tabs_rearrange_group);
 	ClassDB::bind_method(D_METHOD("get_tabs_rearrange_group"), &Tabs::get_tabs_rearrange_group);
 
 
+	ClassDB::bind_method(D_METHOD("set_select_with_rmb", "enabled"), &Tabs::set_select_with_rmb);
+	ClassDB::bind_method(D_METHOD("get_select_with_rmb"), &Tabs::get_select_with_rmb);
+
 	ADD_SIGNAL(MethodInfo("tab_changed", PropertyInfo(Variant::INT, "tab")));
 	ADD_SIGNAL(MethodInfo("tab_changed", PropertyInfo(Variant::INT, "tab")));
 	ADD_SIGNAL(MethodInfo("right_button_pressed", PropertyInfo(Variant::INT, "tab")));
 	ADD_SIGNAL(MethodInfo("right_button_pressed", PropertyInfo(Variant::INT, "tab")));
 	ADD_SIGNAL(MethodInfo("tab_close", PropertyInfo(Variant::INT, "tab")));
 	ADD_SIGNAL(MethodInfo("tab_close", PropertyInfo(Variant::INT, "tab")));
@@ -988,6 +999,8 @@ Tabs::Tabs() {
 	offset = 0;
 	offset = 0;
 	max_drawn_tab = 0;
 	max_drawn_tab = 0;
 
 
+	select_with_rmb = false;
+
 	min_width = 0;
 	min_width = 0;
 	scrolling_enabled = true;
 	scrolling_enabled = true;
 	buttons_visible = false;
 	buttons_visible = false;

+ 5 - 0
scene/gui/tabs.h

@@ -83,6 +83,8 @@ private:
 	int rb_hover;
 	int rb_hover;
 	bool rb_pressing;
 	bool rb_pressing;
 
 
+	bool select_with_rmb;
+
 	int cb_hover;
 	int cb_hover;
 	bool cb_pressing;
 	bool cb_pressing;
 	CloseButtonDisplayPolicy cb_displaypolicy;
 	CloseButtonDisplayPolicy cb_displaypolicy;
@@ -150,6 +152,9 @@ public:
 	void set_tabs_rearrange_group(int p_group_id);
 	void set_tabs_rearrange_group(int p_group_id);
 	int get_tabs_rearrange_group() const;
 	int get_tabs_rearrange_group() const;
 
 
+	void set_select_with_rmb(bool p_enabled);
+	bool get_select_with_rmb() const;
+
 	void ensure_tab_visible(int p_idx);
 	void ensure_tab_visible(int p_idx);
 	void set_min_width(int p_width);
 	void set_min_width(int p_width);