Skip to content

Commit

Permalink
Fix force caret not working for different windows, and port code to T…
Browse files Browse the repository at this point in the history
…extEdit
  • Loading branch information
rsubtil committed Oct 22, 2023
1 parent 381098a commit 0f7b9b4
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 3 deletions.
2 changes: 1 addition & 1 deletion scene/gui/line_edit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1485,7 +1485,7 @@ void LineEdit::_validate_caret_can_draw() {
draw_caret = true;
caret_blink_timer = 0.0;
}
caret_can_draw = editable && (window_has_focus || (menu && menu->has_focus())) && (has_focus() || caret_force_displayed);
caret_can_draw = editable && (caret_force_displayed || ((window_has_focus || (menu && menu->has_focus())) && has_focus()));
}

void LineEdit::delete_char() {
Expand Down
22 changes: 20 additions & 2 deletions scene/gui/text_edit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -515,7 +515,7 @@ void TextEdit::_notification(int p_what) {

Size2 size = get_size();
bool rtl = is_layout_rtl();
if ((!has_focus() && !(menu && menu->has_focus())) || !window_has_focus) {
if ((!has_focus() && !(menu && menu->has_focus())) || (!window_has_focus && !caret_force_displayed)) {
draw_caret = false;
}

Expand Down Expand Up @@ -4499,6 +4499,20 @@ bool TextEdit::is_caret_blink_enabled() const {
return caret_blink_enabled;
}

void TextEdit::set_caret_force_displayed(const bool p_enabled) {
if (caret_force_displayed == p_enabled) {
return;
}

caret_force_displayed = p_enabled;

queue_redraw();
}

bool TextEdit::is_caret_force_displayed() const {
return caret_force_displayed;
}

float TextEdit::get_caret_blink_interval() const {
return caret_blink_timer->get_wait_time();
}
Expand Down Expand Up @@ -6216,6 +6230,9 @@ void TextEdit::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_caret_blink_enabled", "enable"), &TextEdit::set_caret_blink_enabled);
ClassDB::bind_method(D_METHOD("is_caret_blink_enabled"), &TextEdit::is_caret_blink_enabled);

ClassDB::bind_method(D_METHOD("set_caret_force_displayed", "enable"), &TextEdit::set_caret_force_displayed);
ClassDB::bind_method(D_METHOD("is_caret_force_displayed"), &TextEdit::is_caret_force_displayed);

ClassDB::bind_method(D_METHOD("set_caret_blink_interval", "interval"), &TextEdit::set_caret_blink_interval);
ClassDB::bind_method(D_METHOD("get_caret_blink_interval"), &TextEdit::get_caret_blink_interval);

Expand Down Expand Up @@ -6471,6 +6488,7 @@ void TextEdit::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "caret_move_on_right_click"), "set_move_caret_on_right_click_enabled", "is_move_caret_on_right_click_enabled");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "caret_mid_grapheme"), "set_caret_mid_grapheme_enabled", "is_caret_mid_grapheme_enabled");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "caret_multiple"), "set_multiple_carets_enabled", "is_multiple_carets_enabled");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "caret_force_displayed"), "set_caret_force_displayed", "is_caret_force_displayed");

ADD_GROUP("BiDi", "");
ADD_PROPERTY(PropertyInfo(Variant::INT, "text_direction", PROPERTY_HINT_ENUM, "Auto,Left-to-Right,Right-to-Left,Inherited"), "set_text_direction", "get_text_direction");
Expand Down Expand Up @@ -7060,7 +7078,7 @@ void TextEdit::_reset_caret_blink_timer() {

void TextEdit::_toggle_draw_caret() {
draw_caret = !draw_caret;
if (is_visible_in_tree() && has_focus() && window_has_focus) {
if (is_visible_in_tree() && has_focus() && (window_has_focus || caret_force_displayed)) {
queue_redraw();
}
}
Expand Down
4 changes: 4 additions & 0 deletions scene/gui/text_edit.h
Original file line number Diff line number Diff line change
Expand Up @@ -419,6 +419,7 @@ class TextEdit : public Control {
bool draw_caret_when_editable_disabled = false;

bool caret_blink_enabled = false;
bool caret_force_displayed = false;
Timer *caret_blink_timer = nullptr;

bool move_caret_on_right_click = true;
Expand Down Expand Up @@ -823,6 +824,9 @@ class TextEdit : public Control {
void set_caret_blink_enabled(const bool p_enabled);
bool is_caret_blink_enabled() const;

void set_caret_force_displayed(const bool p_enabled);
bool is_caret_force_displayed() const;

void set_caret_blink_interval(const float p_interval);
float get_caret_blink_interval() const;

Expand Down

0 comments on commit 0f7b9b4

Please sign in to comment.