Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Ability to Enable/Disable Shortcuts and Selection for LineEdit/TextEdit #31188

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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();
codecustard marked this conversation as resolved.
Show resolved Hide resolved
}

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