From fc2dc83e6c5dbf559fe81b72a7b477d2cd86b649 Mon Sep 17 00:00:00 2001 From: reugenio Date: Sat, 20 Dec 2025 00:13:43 +0100 Subject: [PATCH] =?UTF-8?q?fix(autocomplete):=20Sync=20last=5Ffilter=20en?= =?UTF-8?q?=20setText/clear=20+=20auto-cierre=20dropdown=20vac=C3=ADo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cambios de Gemini para estabilidad IMGUI: - setText(): Sincroniza last_filter para evitar falsos text_changed - clear(): Resetea last_filter_len - autocompleteRect(): Cierra dropdown si options.len == 0 Parte de la solución para corrupción de memoria en cascade AutoComplete. --- src/widgets/autocomplete.zig | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/widgets/autocomplete.zig b/src/widgets/autocomplete.zig index b0321da..b6a4238 100644 --- a/src/widgets/autocomplete.zig +++ b/src/widgets/autocomplete.zig @@ -59,6 +59,10 @@ pub const AutoCompleteState = struct { @memcpy(self.buffer[0..copy_len], new_text[0..copy_len]); self.len = copy_len; self.cursor = copy_len; + + // Sync filter to avoid spurious text_changed events + @memcpy(self.last_filter[0..copy_len], new_text[0..copy_len]); + self.last_filter_len = copy_len; } /// Clear the input @@ -68,6 +72,7 @@ pub const AutoCompleteState = struct { self.selected = -1; self.highlighted = -1; self.open = false; + self.last_filter_len = 0; } /// Insert a single character at cursor @@ -403,11 +408,15 @@ pub fn autocompleteRect( var filtered_indices: [256]usize = undefined; var filtered_count: usize = 0; - for (options, 0..) |opt, i| { - if (filtered_count >= filtered_indices.len) break; - if (matchesFilter(opt, filter_text, config.match_mode, config.case_sensitive)) { - filtered_indices[filtered_count] = i; - filtered_count += 1; + if (options.len == 0) { + state.closeDropdown(); + } else { + for (options, 0..) |opt, i| { + if (filtered_count >= filtered_indices.len) break; + if (matchesFilter(opt, filter_text, config.match_mode, config.case_sensitive)) { + filtered_indices[filtered_count] = i; + filtered_count += 1; + } } }