Skip to content

Commit

Permalink
Add Ability to Enable/Disable Shortcuts for LineEdit/TextEdit
Browse files Browse the repository at this point in the history
This PR adds the ability to enable/disable shortcut keys and selection for LineEdit/TextEdit. It also updates the context menu when you disable/enable the shortcut keys or selection.
  • Loading branch information
codecustard committed Sep 7, 2019
1 parent 750f8d4 commit b678d68
Show file tree
Hide file tree
Showing 4 changed files with 161 additions and 41 deletions.
89 changes: 60 additions & 29 deletions scene/gui/line_edit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;

Expand All @@ -210,7 +210,6 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) {
} break;

case (KEY_C): { // COPY

copy_text();

} break;
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -1335,6 +1335,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;
Expand All @@ -1349,6 +1351,8 @@ void LineEdit::selection_fill_at_cursor() {
}

void LineEdit::select_all() {
if (!selecting_enabled)
return;

if (!text.length())
return;
Expand All @@ -1365,32 +1369,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();
}
Expand Down Expand Up @@ -1426,6 +1405,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();
Expand Down Expand Up @@ -1533,6 +1514,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;
Expand Down Expand Up @@ -1596,6 +1600,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);
Expand Down Expand Up @@ -1640,6 +1663,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")));
Expand Down Expand Up @@ -1668,6 +1695,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");
Expand Down Expand Up @@ -1695,6 +1724,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);
Expand Down
12 changes: 12 additions & 0 deletions scene/gui/line_edit.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ class LineEdit : public Control {
String ime_text;
Point2 ime_selection;

bool selecting_enabled;

bool context_menu_enabled;
PopupMenu *menu;

Expand All @@ -87,6 +89,8 @@ class LineEdit : public Control {

bool clear_button_enabled;

bool shortcut_keys_enabled;

Ref<Texture> right_icon;

struct Selection {
Expand Down Expand Up @@ -118,6 +122,8 @@ class LineEdit : public Control {
void _clear_redo();
void _create_undo_state();

void _generate_context_menu();

Timer *caret_blink_timer;

void _text_changed();
Expand Down Expand Up @@ -216,6 +222,12 @@ class LineEdit : public Control {
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;
Expand Down
Loading

0 comments on commit b678d68

Please sign in to comment.