Browse Source

Merge pull request #31188 from codecustard/LineEdit_disable_shortcuts

Add Ability to Enable/Disable Shortcuts and Selection for LineEdit/TextEdit
Rémi Verschelde 6 years ago
parent
commit
fae14153f7
4 changed files with 161 additions and 41 deletions
  1. 60 29
      scene/gui/line_edit.cpp
  2. 12 0
      scene/gui/line_edit.h
  3. 78 12
      scene/gui/text_edit.cpp
  4. 11 0
      scene/gui/text_edit.h

+ 60 - 29
scene/gui/line_edit.cpp

@@ -87,7 +87,7 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) {
 
 			} else {
 
-				if (b->is_doubleclick()) {
+				if (b->is_doubleclick() && selecting_enabled) {
 
 					selection.enabled = true;
 					selection.begin = 0;
@@ -195,7 +195,7 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) {
 
 		unsigned int code = k->get_scancode();
 
-		if (k->get_command()) {
+		if (k->get_command() && is_shortcut_keys_enabled()) {
 
 			bool handled = true;
 
@@ -210,7 +210,6 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) {
 				} break;
 
 				case (KEY_C): { // COPY
-
 					copy_text();
 
 				} break;
@@ -275,6 +274,7 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) {
 				} break;
 				case (KEY_A): { //Select All
 					select();
+
 				} break;
 #ifdef APPLE_STYLE_KEYS
 				case (KEY_LEFT): { // Go to start of text - like HOME key
@@ -1347,6 +1347,8 @@ int LineEdit::get_max_length() const {
 }
 
 void LineEdit::selection_fill_at_cursor() {
+	if (!selecting_enabled)
+		return;
 
 	selection.begin = cursor_pos;
 	selection.end = selection.cursor_start;
@@ -1361,6 +1363,8 @@ void LineEdit::selection_fill_at_cursor() {
 }
 
 void LineEdit::select_all() {
+	if (!selecting_enabled)
+		return;
 
 	if (!text.length())
 		return;
@@ -1377,32 +1381,7 @@ void LineEdit::set_editable(bool p_editable) {
 		return;
 
 	editable = p_editable;
-
-	// Reorganize context menu.
-	menu->clear();
-
-	if (editable) {
-		menu->add_item(RTR("Undo"), MENU_UNDO, KEY_MASK_CMD | KEY_Z);
-		menu->add_item(RTR("Redo"), MENU_REDO, KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_Z);
-	}
-
-	if (editable) {
-		menu->add_separator();
-		menu->add_item(RTR("Cut"), MENU_CUT, KEY_MASK_CMD | KEY_X);
-	}
-
-	menu->add_item(RTR("Copy"), MENU_COPY, KEY_MASK_CMD | KEY_C);
-
-	if (editable) {
-		menu->add_item(RTR("Paste"), MENU_PASTE, KEY_MASK_CMD | KEY_V);
-	}
-
-	menu->add_separator();
-	menu->add_item(RTR("Select All"), MENU_SELECT_ALL, KEY_MASK_CMD | KEY_A);
-
-	if (editable) {
-		menu->add_item(RTR("Clear"), MENU_CLEAR);
-	}
+	_generate_context_menu();
 
 	update();
 }
@@ -1438,6 +1417,8 @@ String LineEdit::get_secret_character() const {
 }
 
 void LineEdit::select(int p_from, int p_to) {
+	if (!selecting_enabled)
+		return;
 
 	if (p_from == 0 && p_to == 0) {
 		deselect();
@@ -1545,6 +1526,29 @@ bool LineEdit::is_clear_button_enabled() const {
 	return clear_button_enabled;
 }
 
+void LineEdit::set_shortcut_keys_enabled(bool p_enabled) {
+	shortcut_keys_enabled = p_enabled;
+
+	_generate_context_menu();
+}
+
+bool LineEdit::is_shortcut_keys_enabled() const {
+	return shortcut_keys_enabled;
+}
+
+void LineEdit::set_selecting_enabled(bool p_enabled) {
+	selecting_enabled = p_enabled;
+
+	if (!selecting_enabled)
+		deselect();
+
+	_generate_context_menu();
+}
+
+bool LineEdit::is_selecting_enabled() const {
+	return selecting_enabled;
+}
+
 void LineEdit::set_right_icon(const Ref<Texture> &p_icon) {
 	if (right_icon == p_icon) {
 		return;
@@ -1608,6 +1612,25 @@ void LineEdit::_create_undo_state() {
 	undo_stack.push_back(op);
 }
 
+void LineEdit::_generate_context_menu() {
+	// Reorganize context menu.
+	menu->clear();
+	if (editable)
+		menu->add_item(RTR("Cut"), MENU_CUT, is_shortcut_keys_enabled() ? KEY_MASK_CMD | KEY_X : 0);
+	menu->add_item(RTR("Copy"), MENU_COPY, is_shortcut_keys_enabled() ? KEY_MASK_CMD | KEY_C : 0);
+	if (editable)
+		menu->add_item(RTR("Paste"), MENU_PASTE, is_shortcut_keys_enabled() ? KEY_MASK_CMD | KEY_V : 0);
+	menu->add_separator();
+	if (is_selecting_enabled())
+		menu->add_item(RTR("Select All"), MENU_SELECT_ALL, is_shortcut_keys_enabled() ? KEY_MASK_CMD | KEY_A : 0);
+	if (editable) {
+		menu->add_item(RTR("Clear"), MENU_CLEAR);
+		menu->add_separator();
+		menu->add_item(RTR("Undo"), MENU_UNDO, is_shortcut_keys_enabled() ? KEY_MASK_CMD | KEY_Z : 0);
+		menu->add_item(RTR("Redo"), MENU_REDO, is_shortcut_keys_enabled() ? KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_Z : 0);
+	}
+}
+
 void LineEdit::_bind_methods() {
 
 	ClassDB::bind_method(D_METHOD("_text_changed"), &LineEdit::_text_changed);
@@ -1652,6 +1675,10 @@ void LineEdit::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("is_context_menu_enabled"), &LineEdit::is_context_menu_enabled);
 	ClassDB::bind_method(D_METHOD("set_clear_button_enabled", "enable"), &LineEdit::set_clear_button_enabled);
 	ClassDB::bind_method(D_METHOD("is_clear_button_enabled"), &LineEdit::is_clear_button_enabled);
+	ClassDB::bind_method(D_METHOD("set_shortcut_keys_enabled", "enable"), &LineEdit::set_shortcut_keys_enabled);
+	ClassDB::bind_method(D_METHOD("is_shortcut_keys_enabled"), &LineEdit::is_shortcut_keys_enabled);
+	ClassDB::bind_method(D_METHOD("set_selecting_enabled", "enable"), &LineEdit::set_selecting_enabled);
+	ClassDB::bind_method(D_METHOD("is_selecting_enabled"), &LineEdit::is_selecting_enabled);
 
 	ADD_SIGNAL(MethodInfo("text_changed", PropertyInfo(Variant::STRING, "new_text")));
 	ADD_SIGNAL(MethodInfo("text_entered", PropertyInfo(Variant::STRING, "new_text")));
@@ -1680,6 +1707,8 @@ void LineEdit::_bind_methods() {
 	ADD_PROPERTY(PropertyInfo(Variant::INT, "focus_mode", PROPERTY_HINT_ENUM, "None,Click,All"), "set_focus_mode", "get_focus_mode");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "context_menu_enabled"), "set_context_menu_enabled", "is_context_menu_enabled");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "clear_button_enabled"), "set_clear_button_enabled", "is_clear_button_enabled");
+	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "shortcut_keys_enabled"), "set_shortcut_keys_enabled", "is_shortcut_keys_enabled");
+	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "selecting_enabled"), "set_selecting_enabled", "is_selecting_enabled");
 	ADD_GROUP("Placeholder", "placeholder_");
 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "placeholder_text"), "set_placeholder", "get_placeholder");
 	ADD_PROPERTY(PropertyInfo(Variant::REAL, "placeholder_alpha", PROPERTY_HINT_RANGE, "0,1,0.001"), "set_placeholder_alpha", "get_placeholder_alpha");
@@ -1707,6 +1736,8 @@ LineEdit::LineEdit() {
 	clear_button_enabled = false;
 	clear_button_status.press_attempt = false;
 	clear_button_status.pressing_inside = false;
+	shortcut_keys_enabled = true;
+	selecting_enabled = true;
 
 	deselect();
 	set_focus_mode(FOCUS_ALL);

+ 12 - 0
scene/gui/line_edit.h

@@ -75,6 +75,8 @@ private:
 	String ime_text;
 	Point2 ime_selection;
 
+	bool selecting_enabled;
+
 	bool context_menu_enabled;
 	PopupMenu *menu;
 
@@ -87,6 +89,8 @@ private:
 
 	bool clear_button_enabled;
 
+	bool shortcut_keys_enabled;
+
 	Ref<Texture> right_icon;
 
 	struct Selection {
@@ -118,6 +122,8 @@ private:
 	void _clear_redo();
 	void _create_undo_state();
 
+	void _generate_context_menu();
+
 	Timer *caret_blink_timer;
 
 	void _text_changed();
@@ -216,6 +222,12 @@ public:
 	void set_clear_button_enabled(bool p_enabled);
 	bool is_clear_button_enabled() const;
 
+	void set_shortcut_keys_enabled(bool p_enabled);
+	bool is_shortcut_keys_enabled() const;
+
+	void set_selecting_enabled(bool p_enabled);
+	bool is_selecting_enabled() const;
+
 	void set_right_icon(const Ref<Texture> &p_icon);
 
 	virtual bool is_text_field() const;

+ 78 - 12
scene/gui/text_edit.cpp

@@ -3222,7 +3222,7 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
 				if (readonly)
 					break;
 
-				if (k->get_shift() && !k->get_command() && !k->get_alt()) {
+				if (k->get_shift() && !k->get_command() && !k->get_alt() && is_shortcut_keys_enabled()) {
 					cut();
 					break;
 				}
@@ -3453,13 +3453,15 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
 					scancode_handled = false;
 					break;
 				}
-				select_all();
+				if (is_shortcut_keys_enabled()) {
+					select_all();
+				}
 #else
 				if ((!k->get_command() && !k->get_control())) {
 					scancode_handled = false;
 					break;
 				}
-				if (!k->get_shift() && k->get_command())
+				if (!k->get_shift() && k->get_command() && is_shortcut_keys_enabled())
 					select_all();
 				else if (k->get_control()) {
 					if (k->get_shift())
@@ -3515,8 +3517,9 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
 					scancode_handled = false;
 					break;
 				}
-
-				cut();
+				if (is_shortcut_keys_enabled()) {
+					cut();
+				}
 
 			} break;
 			case KEY_C: {
@@ -3526,7 +3529,9 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
 					break;
 				}
 
-				copy();
+				if (is_shortcut_keys_enabled()) {
+					copy();
+				}
 
 			} break;
 			case KEY_Z: {
@@ -3540,10 +3545,12 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
 					break;
 				}
 
-				if (k->get_shift())
-					redo();
-				else
-					undo();
+				if (is_shortcut_keys_enabled()) {
+					if (k->get_shift())
+						redo();
+					else
+						undo();
+				}
 			} break;
 			case KEY_Y: {
 
@@ -3556,7 +3563,9 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
 					break;
 				}
 
-				redo();
+				if (is_shortcut_keys_enabled()) {
+					redo();
+				}
 			} break;
 			case KEY_V: {
 				if (readonly) {
@@ -3567,7 +3576,9 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
 					break;
 				}
 
-				paste();
+				if (is_shortcut_keys_enabled()) {
+					paste();
+				}
 
 			} break;
 			case KEY_SPACE: {
@@ -4061,6 +4072,25 @@ int TextEdit::_get_control_height() const {
 	return control_height;
 }
 
+void TextEdit::_generate_context_menu() {
+	// Reorganize context menu.
+	menu->clear();
+	if (!readonly)
+		menu->add_item(RTR("Cut"), MENU_CUT, is_shortcut_keys_enabled() ? KEY_MASK_CMD | KEY_X : 0);
+	menu->add_item(RTR("Copy"), MENU_COPY, is_shortcut_keys_enabled() ? KEY_MASK_CMD | KEY_C : 0);
+	if (!readonly)
+		menu->add_item(RTR("Paste"), MENU_PASTE, is_shortcut_keys_enabled() ? KEY_MASK_CMD | KEY_V : 0);
+	menu->add_separator();
+	if (is_selecting_enabled())
+		menu->add_item(RTR("Select All"), MENU_SELECT_ALL, is_shortcut_keys_enabled() ? KEY_MASK_CMD | KEY_A : 0);
+	if (!readonly) {
+		menu->add_item(RTR("Clear"), MENU_CLEAR);
+		menu->add_separator();
+		menu->add_item(RTR("Undo"), MENU_UNDO, is_shortcut_keys_enabled() ? KEY_MASK_CMD | KEY_Z : 0);
+		menu->add_item(RTR("Redo"), MENU_REDO, is_shortcut_keys_enabled() ? KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_Z : 0);
+	}
+}
+
 int TextEdit::get_visible_rows() const {
 	return _get_control_height() / get_row_height();
 }
@@ -4769,6 +4799,7 @@ void TextEdit::set_readonly(bool p_readonly) {
 		return;
 
 	readonly = p_readonly;
+	_generate_context_menu();
 
 	// Reorganize context menu.
 	menu->clear();
@@ -5108,6 +5139,8 @@ void TextEdit::paste() {
 }
 
 void TextEdit::select_all() {
+	if (!selecting_enabled)
+		return;
 
 	if (text.size() == 1 && text[0].length() == 0)
 		return;
@@ -5132,6 +5165,8 @@ void TextEdit::deselect() {
 }
 
 void TextEdit::select(int p_from_line, int p_from_column, int p_to_line, int p_to_column) {
+	if (!selecting_enabled)
+		return;
 
 	if (p_from_line < 0)
 		p_from_line = 0;
@@ -6775,6 +6810,29 @@ bool TextEdit::is_context_menu_enabled() {
 	return context_menu_enabled;
 }
 
+void TextEdit::set_shortcut_keys_enabled(bool p_enabled) {
+	shortcut_keys_enabled = p_enabled;
+
+	_generate_context_menu();
+}
+
+void TextEdit::set_selecting_enabled(bool p_enabled) {
+	selecting_enabled = p_enabled;
+
+	if (!selecting_enabled)
+		deselect();
+
+	_generate_context_menu();
+}
+
+bool TextEdit::is_selecting_enabled() const {
+	return selecting_enabled;
+}
+
+bool TextEdit::is_shortcut_keys_enabled() const {
+	return shortcut_keys_enabled;
+}
+
 PopupMenu *TextEdit::get_menu() const {
 	return menu;
 }
@@ -6830,6 +6888,10 @@ void TextEdit::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("is_wrap_enabled"), &TextEdit::is_wrap_enabled);
 	ClassDB::bind_method(D_METHOD("set_context_menu_enabled", "enable"), &TextEdit::set_context_menu_enabled);
 	ClassDB::bind_method(D_METHOD("is_context_menu_enabled"), &TextEdit::is_context_menu_enabled);
+	ClassDB::bind_method(D_METHOD("set_shortcut_keys_enabled", "enable"), &TextEdit::set_shortcut_keys_enabled);
+	ClassDB::bind_method(D_METHOD("is_shortcut_keys_enabled"), &TextEdit::is_shortcut_keys_enabled);
+	ClassDB::bind_method(D_METHOD("set_selecting_enabled", "enable"), &TextEdit::set_selecting_enabled);
+	ClassDB::bind_method(D_METHOD("is_selecting_enabled"), &TextEdit::is_selecting_enabled);
 
 	ClassDB::bind_method(D_METHOD("cut"), &TextEdit::cut);
 	ClassDB::bind_method(D_METHOD("copy"), &TextEdit::copy);
@@ -6920,6 +6982,8 @@ void TextEdit::_bind_methods() {
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "highlight_all_occurrences"), "set_highlight_all_occurrences", "is_highlight_all_occurrences_enabled");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "override_selected_font_color"), "set_override_selected_font_color", "is_overriding_selected_font_color");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "context_menu_enabled"), "set_context_menu_enabled", "is_context_menu_enabled");
+	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "shortcut_keys_enabled"), "set_shortcut_keys_enabled", "is_shortcut_keys_enabled");
+	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "selecting_enabled"), "set_selecting_enabled", "is_selecting_enabled");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "smooth_scrolling"), "set_smooth_scroll_enable", "is_smooth_scroll_enabled");
 	ADD_PROPERTY(PropertyInfo(Variant::REAL, "v_scroll_speed"), "set_v_scroll_speed", "get_v_scroll_speed");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "hiding_enabled"), "set_hiding_enabled", "is_hiding_enabled");
@@ -7078,7 +7142,9 @@ TextEdit::TextEdit() {
 	minimap_char_size = Point2(1, 2);
 	minimap_line_spacing = 1;
 
+	selecting_enabled = true;
 	context_menu_enabled = true;
+	shortcut_keys_enabled = true;
 	menu = memnew(PopupMenu);
 	add_child(menu);
 	readonly = true; // Initialise to opposite first, so we get past the early-out in set_readonly.

+ 11 - 0
scene/gui/text_edit.h

@@ -365,10 +365,15 @@ private:
 	int search_result_line;
 	int search_result_col;
 
+	bool selecting_enabled;
+
 	bool context_menu_enabled;
+	bool shortcut_keys_enabled;
 
 	int executing_line;
 
+	void _generate_context_menu();
+
 	int get_visible_rows() const;
 	int get_total_visible_rows() const;
 
@@ -737,6 +742,12 @@ public:
 	void set_context_menu_enabled(bool p_enable);
 	bool is_context_menu_enabled();
 
+	void set_selecting_enabled(bool p_enabled);
+	bool is_selecting_enabled() const;
+
+	void set_shortcut_keys_enabled(bool p_enabled);
+	bool is_shortcut_keys_enabled() const;
+
 	PopupMenu *get_menu() const;
 
 	String get_text_for_completion();