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; + } } }