Skip to content

TextInput view: UI does not react when updating buffer value to previous value entered #789

@sexnine

Description

@sexnine

When the signal that serves as the value for a TextInput is updated, if the value it was last set to by method of user input is the same, the UI does not react.

This is due to TextInput.buffer.last_buffer only being set on user input and an optimization where request_layout is not called when the last buffer and the current buffer are the same:

floem/src/views/text_input.rs

Lines 1044 to 1060 in 4bf974c

fn update(&mut self, cx: &mut UpdateCx, state: Box<dyn Any>) {
if let Ok(state) = state.downcast::<(String, bool)>() {
let (value, is_focused) = *state;
// Only update recomputation if the state has actually changed
if self.is_focused != is_focused || value != self.buffer.last_buffer {
if is_focused && !cx.app_state.is_active(&self.id) {
self.selection = None;
self.cursor_glyph_idx = self.buffer.with_untracked(|buf| buf.len());
}
self.is_focused = is_focused;
self.id.request_layout();
}
} else {
eprintln!("downcast failed");
}
}

My use case for this is listening to arrow key up/down events and increasing the value in the TextInput accordingly. As a temporary fix, I am calling request_layout myself in that event handler when I update the value.

Demo of issue with my use case:

upnp_3cHDqTShhs.mp4

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions