Change LineEdit caret blink to use process

Now using internal process for blinking instead of a Timer node
This commit is contained in:
Nolkaloid 2022-07-04 23:17:34 +02:00
parent 100d223736
commit 9dc58511c6
2 changed files with 26 additions and 15 deletions

View File

@ -744,6 +744,17 @@ void LineEdit::_notification(int p_what) {
update();
} break;
case NOTIFICATION_INTERNAL_PROCESS: {
if (caret_blinking) {
caret_blink_timer += get_process_delta_time();
if (caret_blink_timer >= caret_blink_speed) {
caret_blink_timer = 0.0;
_toggle_draw_caret();
}
}
} break;
case NOTIFICATION_DRAW: {
if ((!has_focus() && !(menu && menu->has_focus()) && !caret_force_displayed) || !window_has_focus) {
draw_caret = false;
@ -991,8 +1002,9 @@ void LineEdit::_notification(int p_what) {
case NOTIFICATION_FOCUS_ENTER: {
if (!caret_force_displayed) {
if (caret_blink_enabled) {
if (caret_blink_timer->is_stopped()) {
caret_blink_timer->start();
if (!caret_blinking) {
caret_blinking = true;
caret_blink_timer = 0.0;
}
} else {
draw_caret = true;
@ -1010,7 +1022,7 @@ void LineEdit::_notification(int p_what) {
case NOTIFICATION_FOCUS_EXIT: {
if (caret_blink_enabled && !caret_force_displayed) {
caret_blink_timer->stop();
caret_blinking = false;
}
if (get_viewport()->get_window_id() != DisplayServer::INVALID_WINDOW_ID && DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_IME)) {
@ -1318,14 +1330,16 @@ bool LineEdit::is_caret_blink_enabled() const {
void LineEdit::set_caret_blink_enabled(const bool p_enabled) {
caret_blink_enabled = p_enabled;
set_process_internal(p_enabled);
if (has_focus() || caret_force_displayed) {
if (p_enabled) {
if (caret_blink_timer->is_stopped()) {
caret_blink_timer->start();
if (!caret_blinking) {
caret_blinking = true;
caret_blink_timer = 0.0;
}
} else {
caret_blink_timer->stop();
caret_blinking = false;
}
}
@ -1345,20 +1359,19 @@ void LineEdit::set_caret_force_displayed(const bool p_enabled) {
}
float LineEdit::get_caret_blink_speed() const {
return caret_blink_timer->get_wait_time();
return caret_blink_speed;
}
void LineEdit::set_caret_blink_speed(const float p_speed) {
ERR_FAIL_COND(p_speed <= 0);
caret_blink_timer->set_wait_time(p_speed);
caret_blink_speed = p_speed;
}
void LineEdit::_reset_caret_blink_timer() {
if (caret_blink_enabled) {
draw_caret = true;
if (has_focus()) {
caret_blink_timer->stop();
caret_blink_timer->start();
caret_blink_timer = 0.0;
update();
}
}
@ -2508,10 +2521,6 @@ LineEdit::LineEdit(const String &p_placeholder) {
set_mouse_filter(MOUSE_FILTER_STOP);
set_process_unhandled_key_input(true);
caret_blink_timer = memnew(Timer);
add_child(caret_blink_timer, false, INTERNAL_MODE_FRONT);
caret_blink_timer->set_wait_time(0.65);
caret_blink_timer->connect("timeout", callable_mp(this, &LineEdit::_toggle_draw_caret));
set_caret_blink_enabled(false);
set_placeholder(p_placeholder);

View File

@ -160,7 +160,9 @@ private:
bool caret_blink_enabled = false;
bool caret_force_displayed = false;
bool draw_caret = true;
Timer *caret_blink_timer = nullptr;
float caret_blink_speed = 0.65;
double caret_blink_timer = 0.0;
bool caret_blinking = false;
bool _is_over_clear_button(const Point2 &p_pos) const;