From 124fcae69a684a3430d66f1e5cc79f7e2fedd069 Mon Sep 17 00:00:00 2001 From: Rusty Pickle Date: Sat, 27 Jun 2026 21:53:50 +0600 Subject: [PATCH 1/8] Remove expect, simpily logic a bit --- src/lib.rs | 10 -- src/row_selection.rs | 318 +++++++++++++++++++++---------------------- 2 files changed, 154 insertions(+), 174 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 3893b46..bf339fa 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -607,16 +607,6 @@ where } } - /// Get the previous column of the provided column - fn previous_column(&self, column: &F) -> F { - let current_column_num = self.column_to_num(column); - if current_column_num == 0 { - self.all_columns[self.all_columns.len() - 1].clone() - } else { - self.all_columns[current_column_num - 1].clone() - } - } - /// Builds the table's Body section fn handle_table_body(&mut self, mut row: TableRow, row_data: &SelectableRow) { for column_name in &self.all_columns.clone() { diff --git a/src/row_selection.rs b/src/row_selection.rs index de46da5..2c74567 100644 --- a/src/row_selection.rs +++ b/src/row_selection.rs @@ -1,5 +1,5 @@ use egui::Ui; -use egui::ahash::{HashMap, HashMapExt, HashSet, HashSetExt}; +use egui::ahash::{HashMap, HashMapExt, HashSet}; use rayon::iter::{IntoParallelRefIterator, ParallelIterator}; use std::fmt::Write as _; use std::hash::Hash; @@ -26,16 +26,15 @@ where self.active_columns.insert(column_name.clone()); self.active_rows.insert(id); - // Should never panic, if it does, either a library issue or it was used incorrectly - let target_index = self.indexed_ids.get(&id).expect("target_index not found"); - let target_row = self - .formatted_rows - .get_mut(*target_index) - .expect("target_row not found"); + let Some(target_index) = self.indexed_ids.get(&id) else { + return; + }; + let Some(target_row) = self.formatted_rows.get_mut(*target_index) else { + return; + }; if self.select_full_row { self.active_columns.extend(self.all_columns.clone()); - target_row.selected_columns.extend(self.all_columns.clone()); } else { target_row.selected_columns.insert(column_name.clone()); @@ -80,13 +79,27 @@ where } } + /// Called on every frame per cell that the pointer rests on during an active drag. + /// + /// Handles the core drag-selection logic: + /// 1. Computes the column range from drag start to current pointer position + /// 2. Updates `active_columns` to reflect exactly the rectangle's column set (not accumulated + /// across multiple drags). For Ctrl+drag this unions with existing columns on each row so + /// independent drag regions don't interfere. + /// 3. Handles "backwards movement": when the mouse moves back through previously-selected + /// territory within a drag, it may need to unselect cells that are no longer in the + /// active path (the `row_contains_column` / `no_checking` block) + /// 4. Calls `check_row_selection` bidirectionally to fill any rows skipped by fast mouse + /// movement between the drag start row and current row + /// 5. Calls `remove_row_selection` to sync rows inside the drag range and clear rows that + /// fell out of it (only for non-Ctrl; Ctrl+drag preserves committed selections) pub(crate) fn select_dragged_row_cell( &mut self, id: i64, column_name: &F, is_ctrl_pressed: bool, ) { - // If both same then the mouse is still on the same column on the same row so nothing to process + // If the pointer hasn't actually moved to a new cell since last frame, nothing to do if self.last_active_row == Some(id) && self.last_active_column == Some(column_name.clone()) { return; @@ -96,78 +109,48 @@ where return; } - self.active_columns.insert(column_name.clone()); self.beyond_drag_point = true; let drag_start = self.drag_started_on.clone().expect("Drag start not found"); - // Number of the column of drag starting point and the current cell that we are trying to select + // Compute the column range from drag start to current position. let drag_start_num = self.column_to_num(&drag_start.1); let ongoing_column_num = self.column_to_num(column_name); - let mut new_column_set = HashSet::new(); - - let get_previous = ongoing_column_num > drag_start_num; - let mut ongoing_val = Some(drag_start.1.clone()); - - // row1: column(drag started here) column column - // row2: column column column - // row3: column column column - // row4: column column column (currently here) - // - // The goal of this is to ensure from the drag starting point to all the columns till the currently here - // are considered selected and the rest are removed from active selection even if it was considered active - // - // During fast mouse movement active rows can contain columns that are not in the range we are targeting - // We go from one point to the other point and ensure except those columns nothing else is selected - // - // No active row removal if ctrl is being pressed! - if is_ctrl_pressed { - self.active_columns.insert(column_name.clone()); - } else if ongoing_column_num == drag_start_num { - new_column_set.insert(drag_start.1.clone()); - self.active_columns = new_column_set; - } else { - while let Some(col) = ongoing_val { - let next_column = if get_previous { - self.next_column(&col) - } else { - self.previous_column(&col) - }; + let col_min = drag_start_num.min(ongoing_column_num); + let col_max = drag_start_num.max(ongoing_column_num); - new_column_set.insert(col); + let new_column_set: HashSet = (col_min..=col_max) + .map(|i| self.all_columns[i].clone()) + .collect(); - if &next_column == column_name { - new_column_set.insert(next_column); - ongoing_val = None; - } else { - ongoing_val = Some(next_column); - } + if is_ctrl_pressed { + for col in &new_column_set { + self.active_columns.insert(col.clone()); } + } else { self.active_columns = new_column_set; } - let current_row_index = self - .indexed_ids - .get(&id) - .expect("Current row index not found"); - // The row the mouse pointer is on - let current_row = self - .formatted_rows - .get_mut(*current_row_index) - .expect("Current row not found"); - - // If this row already selects the column that we are trying to select, it means the mouse - // moved backwards from an active column to another active column. - // - // Row: column1 column2 (mouse is here) column3 column4 - // - // In this case, if column 3 or 4 is also found in the active selection then - // the mouse moved backwards + let Some(current_row_index) = self.indexed_ids.get(&id).copied() else { + return; + }; + let Some(current_row) = self.formatted_rows.get_mut(current_row_index) else { + return; + }; + + // Detect "backwards movement": if the current row already has this column + // selected, the mouse may be moving back through previously-selected territory. + // We need to unselect cells that are no longer on the active path. let row_contains_column = current_row.selected_columns.contains(column_name); let mut no_checking = false; - // If we have some data of the last row and column that the mouse was on, then try to unselect + // Backwards movement handling: + // Row: col1 col2 (mouse here) col3 col4 + // If mouse was on col4 last frame and is now on col2 on the same row, + // col4 should be unselected from this row since the mouse retracted. + // When crossing to a different row altogether, we clear the entire + // previous row's selection so the drag rectangle resizes cleanly. if row_contains_column && self.last_active_row.is_some() && self.last_active_column.is_some() @@ -175,124 +158,127 @@ where if let (Some(last_active_column), Some(last_active_row)) = (self.last_active_column.clone(), self.last_active_row) { - // Remove the last column selection from the current row where the mouse is if - // the previous row and the current one matches - // - // column column column - // column column column - // column column (mouse is currently here) column(mouse was here) - // - // We unselect the bottom right corner column if &last_active_column != column_name && last_active_row == id { current_row.selected_columns.remove(&last_active_column); self.active_columns.remove(&last_active_column); } - // Get the last row where the mouse was - let last_row_index = self - .indexed_ids - .get(&last_active_row) - .expect("Last row not found"); - let last_row = self - .formatted_rows - .get_mut(*last_row_index) - .expect("Last row not found"); + let Some(last_row_index) = self.indexed_ids.get(&last_active_row).copied() else { + return; + }; + let Some(last_row) = self.formatted_rows.get_mut(last_row_index) else { + return; + }; self.last_active_row = Some(id); - // If on the same row as the last row, then unselect the column from all other select row if id == last_row.id { if &last_active_column != column_name { self.last_active_column = Some(column_name.clone()); } } else { no_checking = true; - // Mouse went 1 row above or below. So just clear all selection from that previous row last_row.selected_columns.clear(); } } } else { - // We are in a new row which we have not selected before + // First time this drag touches this row. Apply the active column set. + // For Ctrl+drag, extend (union) to preserve columns from prior selections. self.active_rows.insert(current_row.id); self.last_active_row = Some(id); self.last_active_column = Some(column_name.clone()); - current_row - .selected_columns - .clone_from(&self.active_columns); + if is_ctrl_pressed { + current_row + .selected_columns + .extend(self.active_columns.clone()); + } else { + current_row + .selected_columns + .clone_from(&self.active_columns); + } } - let current_row_index = self - .indexed_ids - .get(&id) - .expect("Current row index not found") - .to_owned(); + let Some(current_row_index) = self.indexed_ids.get(&id).copied() else { + return; + }; - // Get the row number where the drag started on - let drag_start_index = self - .indexed_ids - .get(&drag_start.0) - .expect("Could not find drag start") - .to_owned(); + let Some(drag_start_index) = self.indexed_ids.get(&drag_start.0).copied() else { + return; + }; if !no_checking { - // If drag started on row 1, currently on row 5, check from row 4 to 1 and select all columns - // else go through all rows till a row without any selected column is found. Applied both by incrementing or decrementing index. - // In case of fast mouse movement following drag started point mitigates the risk of some rows not getting selected - self.check_row_selection(true, current_row_index, drag_start_index); - self.check_row_selection(false, current_row_index, drag_start_index); + // Walk both directions from current row toward drag start to fill + // any rows skipped by fast mouse movement (missed pointer-in-cell events). + self.check_row_selection(true, current_row_index, drag_start_index, is_ctrl_pressed); + self.check_row_selection(false, current_row_index, drag_start_index, is_ctrl_pressed); } + // Sync rows inside the drag range and clear rows that left it self.remove_row_selection(current_row_index, drag_start_index, is_ctrl_pressed); } - fn check_row_selection(&mut self, check_previous: bool, index: usize, drag_start: usize) { - if index == 0 && check_previous { - return; - } - - if index + 1 == self.formatted_rows.len() && !check_previous { - return; - } - - let index = if check_previous { index - 1 } else { index + 1 }; - - let current_row = self - .formatted_rows - .get(index) - .expect("Current row not found"); + /// Walks from the current row toward (or away from) the drag-start row, selecting + /// intermediate rows to fill gaps from fast mouse movement. Stops when hitting either + /// the drag-start row boundary or a row with no selection (end of previously-selected + /// territory). Uses a loop instead of recursion to avoid stack overflow on large tables. + fn check_row_selection( + &mut self, + check_previous: bool, + index: usize, + drag_start: usize, + is_ctrl_pressed: bool, + ) { + let mut idx = index; + loop { + if idx == 0 && check_previous { + return; + } + if idx + 1 == self.formatted_rows.len() && !check_previous { + return; + } + idx = if check_previous { idx - 1 } else { idx + 1 }; + + let Some(current_row) = self.formatted_rows.get(idx) else { + return; + }; + + // Consider a row "unselected" when we've walked past the drag-start + // boundary AND the row has no columns selected (meaning it's beyond + // the previously-selected range). Rows between current and drag-start + // are always treated as selected (unselected_row = false) so they + // get filled in even if they were missed by fast mouse movement. + let unselected_row = if (check_previous && idx >= drag_start) + || (!check_previous && idx <= drag_start) + { + false + } else { + current_row.selected_columns.is_empty() + }; - // If for example drag started on row 5 and ended on row 10 but missed drag on row 7 - // Mark the rows as selected till the drag start row is hit (if recursively going that way) - let unselected_row = if (check_previous && index >= drag_start) - || (!check_previous && index <= drag_start) - { - false - } else { - current_row.selected_columns.is_empty() - }; + if unselected_row { + return; + } - let target_row = self - .formatted_rows - .get_mut(index) - .expect("Target row not found"); + let Some(target_row) = self.formatted_rows.get_mut(idx) else { + return; + }; - if !unselected_row { if self.select_full_row { target_row.selected_columns.extend(self.all_columns.clone()); + } else if is_ctrl_pressed { + target_row + .selected_columns + .extend(self.active_columns.clone()); } else { target_row.selected_columns.clone_from(&self.active_columns); } self.active_rows.insert(target_row.id); - - if check_previous { - if index != 0 { - self.check_row_selection(check_previous, index, drag_start); - } - } else if index + 1 != self.formatted_rows.len() { - self.check_row_selection(check_previous, index, drag_start); - } } } + /// Iterates all currently-active rows and syncs their selection state. + /// Rows inside the drag range get their columns updated to match `active_columns`. + /// For non-Ctrl drags, rows outside the range are cleared entirely. + /// For Ctrl+drags, rows outside the range are left untouched (preserving prior selections). fn remove_row_selection( &mut self, current_index: usize, @@ -301,20 +287,21 @@ where ) { let active_ids = self.active_rows.clone(); for id in active_ids { - let ongoing_index = self - .indexed_ids - .get(&id) - .expect("Could not get ongoing index") - .to_owned(); - let target_row = self - .formatted_rows - .get_mut(ongoing_index) - .expect("target row not found"); + let Some(ongoing_index) = self.indexed_ids.get(&id).copied() else { + continue; + }; + let Some(target_row) = self.formatted_rows.get_mut(ongoing_index) else { + continue; + }; if current_index > drag_start { if ongoing_index >= drag_start && ongoing_index <= current_index { if self.select_full_row { target_row.selected_columns.extend(self.all_columns.clone()); + } else if is_ctrl_pressed { + target_row + .selected_columns + .extend(self.active_columns.clone()); } else { target_row.selected_columns.clone_from(&self.active_columns); } @@ -325,6 +312,10 @@ where } else if ongoing_index <= drag_start && ongoing_index >= current_index { if self.select_full_row { target_row.selected_columns.extend(self.all_columns.clone()); + } else if is_ctrl_pressed { + target_row + .selected_columns + .extend(self.active_columns.clone()); } else { target_row.selected_columns.clone_from(&self.active_columns); } @@ -349,12 +340,11 @@ where /// ``` pub fn unselect_all(&mut self) { for id in &self.active_rows { - let id_index = self.indexed_ids.get(id).expect("Could not get id index"); - let target_row = self - .formatted_rows - .get_mut(*id_index) - .expect("Could not get row"); - target_row.selected_columns.clear(); + if let Some(id_index) = self.indexed_ids.get(id) + && let Some(target_row) = self.formatted_rows.get_mut(*id_index) + { + target_row.selected_columns.clear(); + } } self.active_columns.clear(); self.last_active_row = None; @@ -371,17 +361,17 @@ where /// table.select_all(); // Selects all rows and columns. /// ``` pub fn select_all(&mut self) { - let mut all_rows = Vec::new(); - - for row in &mut self.formatted_rows { - row.selected_columns.extend(self.all_columns.clone()); - all_rows.push(row.id); - } - self.active_columns.extend(self.all_columns.clone()); - self.active_rows.extend(all_rows); + self.active_rows.clear(); self.last_active_row = None; self.last_active_column = None; + + for row in &mut self.formatted_rows { + if row.selected_columns.len() != self.all_columns.len() { + row.selected_columns.extend(self.all_columns.clone()); + } + self.active_rows.insert(row.id); + } } /// Retrieves the currently selected rows. From e77cac805262783d2c7554b609c2a4890c4bb271 Mon Sep 17 00:00:00 2001 From: Rusty Pickle Date: Sat, 27 Jun 2026 22:25:44 +0600 Subject: [PATCH 2/8] Add shift click selection --- src/lib.rs | 64 +++++++++++++++++++++++++++++++++++++++----- src/row_selection.rs | 52 +++++++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+), 6 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index bf339fa..2a9fa2c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -589,6 +589,40 @@ where self.all_columns[self.all_columns.len() - 1].clone() } + /// Returns the row ID to use as the anchor for shift+click range selection. + /// Uses the first selected row (by display order) if any, otherwise the first visible row. + fn anchor_row_id(&self) -> i64 { + if self.active_rows.is_empty() || self.formatted_rows.is_empty() { + return 0; + } + let mut min_idx = usize::MAX; + let mut anchor = 0; + for id in &self.active_rows { + if let Some(idx) = self.indexed_ids.get(id) + && *idx < min_idx + { + min_idx = *idx; + anchor = *id; + } + } + anchor + } + + /// Returns the column to use as the anchor for shift+click range selection. + /// Uses the first column in `active_columns` (by configured order) if any, + /// otherwise the first column in the table. + fn anchor_column(&self) -> &F { + if self.active_columns.is_empty() { + return &self.all_columns[0]; + } + for col in &self.all_columns { + if self.active_columns.contains(col) { + return col; + } + } + &self.all_columns[0] + } + /// Convert a number to a column value fn column_to_num(&self, column: &F) -> usize { *self @@ -638,13 +672,31 @@ where } if resp.clicked() { - // If CTRL is not pressed down and the mouse right click is not pressed, unselect all cells - if !ui.ctx().input(|i| i.modifiers.ctrl) - && !ui.ctx().input(|i| i.pointer.secondary_clicked()) - { - self.unselect_all(); + let shift = ui.ctx().input(|i| i.modifiers.shift); + let ctrl = ui.ctx().input(|i| i.modifiers.ctrl); + let secondary = ui.ctx().input(|i| i.pointer.secondary_clicked()); + + if shift { + let anchor_id = self.anchor_row_id(); + let anchor_col = self.anchor_column().clone(); + if !ctrl && !secondary { + self.unselect_all(); + } + self.select_rectangle( + anchor_id, + &anchor_col, + row_data.id, + column_name, + ctrl, + ); + } else { + // If CTRL is not pressed down and the mouse right click is not pressed, unselect all cells + // Right click for context menu + if !ctrl && !secondary { + self.unselect_all(); + } + self.select_single_row_cell(row_data.id, column_name); } - self.select_single_row_cell(row_data.id, column_name); } if ui.ui_contains_pointer() diff --git a/src/row_selection.rs b/src/row_selection.rs index 2c74567..203610b 100644 --- a/src/row_selection.rs +++ b/src/row_selection.rs @@ -22,6 +22,58 @@ where + ColumnOrdering, Conf: Default, { + /// Selects all cells in the rectangle from (`start_id`, `start_col`) to + /// (`end_id`, `end_col`). Used by shift+click range selection. + /// For Ctrl+drag, `extend` is used to union with existing selections. + pub(crate) fn select_rectangle( + &mut self, + start_id: i64, + start_col: &F, + end_id: i64, + end_col: &F, + extend: bool, + ) { + let Some(start_idx) = self.indexed_ids.get(&start_id).copied() else { + return; + }; + let Some(end_idx) = self.indexed_ids.get(&end_id).copied() else { + return; + }; + + let start_col_num = self.column_to_num(start_col); + let end_col_num = self.column_to_num(end_col); + let col_min = start_col_num.min(end_col_num); + let col_max = start_col_num.max(end_col_num); + let row_min = start_idx.min(end_idx); + let row_max = start_idx.max(end_idx); + + let col_range: HashSet = (col_min..=col_max) + .map(|i| self.all_columns[i].clone()) + .collect(); + + if extend { + for col in &col_range { + self.active_columns.insert(col.clone()); + } + } else { + self.active_columns.clone_from(&col_range); + } + + for row_idx in row_min..=row_max { + let Some(row) = self.formatted_rows.get_mut(row_idx) else { + continue; + }; + if self.select_full_row { + row.selected_columns.extend(self.all_columns.clone()); + } else if extend { + row.selected_columns.extend(col_range.clone()); + } else { + row.selected_columns.clone_from(&col_range); + } + self.active_rows.insert(row.id); + } + } + pub(crate) fn select_single_row_cell(&mut self, id: i64, column_name: &F) { self.active_columns.insert(column_name.clone()); self.active_rows.insert(id); From 7feda6ab32afec8f99c77d1cd48689ffd3c4faf1 Mon Sep 17 00:00:00 2001 From: Rusty Pickle Date: Sat, 27 Jun 2026 22:26:16 +0600 Subject: [PATCH 3/8] Rename modify_shown_row, add simple update_row --- src/row_modification.rs | 49 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/row_modification.rs b/src/row_modification.rs index d6a0784..0b52300 100644 --- a/src/row_modification.rs +++ b/src/row_modification.rs @@ -79,6 +79,54 @@ where to_return } + /// Modify a single row by its ID + /// + /// Changes go to the source-of-truth row storage. Call [`recreate_rows`](SelectableTable::recreate_rows) + /// afterwards to reflect the change in the UI, or rely on `auto_reload`. + /// + /// # Example: + /// ```rust,ignore + /// table.update_row(42, |row| { row.name = "new name".into(); }); + /// ``` + pub fn update_row(&mut self, id: i64, f: impl FnOnce(&mut Row)) { + self.add_modify_row(|rows| { + if let Some(row) = rows.get_mut(&id) { + f(&mut row.row_data); + } + None + }); + } + + /// Modify only the rows currently displayed in the UI. + /// + /// This provides direct access to the currently formatted rows for lightweight updates. + /// + /// # Important: + /// - This does **not** require calling [`recreate_rows`](SelectableTable::recreate_rows) to reflect changes in the UI. + /// - **Do not delete rows** from inside this closure. + /// - Changes **evaporate** on the next [`recreate_rows`](SelectableTable::recreate_rows) call. + /// To persist changes, also call [`update_row`](Self::update_row) or [`add_modify_row`](Self::add_modify_row). + /// - Does not contribute toward `auto_reload` count. + /// + /// # When to use: + /// - When you need a modification visible immediately without an expensive recreate. + /// + /// # Example: + /// ```rust,ignore + /// table.patch_visible_row(|formatted_rows, indexed_ids| { + /// let row_id = 0; + /// let target_index = indexed_ids.get(&row_id).unwrap(); + /// let row = formatted_rows.get_mut(*target_index).unwrap(); + /// row.row_data.name = "updated".into(); + /// }); + /// ``` + pub fn patch_visible_row(&mut self, mut f: Fn) + where + Fn: FnMut(&mut Vec>, &HashMap), + { + f(&mut self.formatted_rows, &self.indexed_ids); + } + /// Modify only the rows currently displayed in the UI. /// /// This provides direct access to the currently formatted rows for lightweight updates. @@ -119,6 +167,7 @@ where /// // Safely modify row contents here /// }); /// ``` + #[deprecated = "use `patch_visible_row` instead"] pub fn modify_shown_row(&mut self, mut rows: Fn) where Fn: FnMut(&mut Vec>, &HashMap), From 6134d2c81c6fb49ab988dcfebd93e0907dbef505 Mon Sep 17 00:00:00 2001 From: Rusty Pickle Date: Sat, 27 Jun 2026 22:26:23 +0600 Subject: [PATCH 4/8] Update deprecation --- demo/src/app.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo/src/app.rs b/demo/src/app.rs index d08c344..5c847dd 100644 --- a/demo/src/app.rs +++ b/demo/src/app.rs @@ -344,7 +344,7 @@ impl ColumnOperations for TableColumns { None }); if !config.counting_ongoing { - table.modify_shown_row(|t, index| { + table.patch_visible_row(|t, index| { let target_index = index.get(&row_id).unwrap(); let target_row = t.get_mut(*target_index).unwrap(); target_row.row_data.create_count += 1; From e8c4125b2123f7f07f5780b0e4dcf9016378b522 Mon Sep 17 00:00:00 2001 From: Rusty Pickle Date: Sat, 27 Jun 2026 22:26:29 +0600 Subject: [PATCH 5/8] Update egui --- Cargo.toml | 6 +- demo/Cargo.lock | 379 +++++++++++++++++++++++++++++++++++------------- demo/Cargo.toml | 4 +- 3 files changed, 285 insertions(+), 104 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 471290c..8ee532e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,10 +19,10 @@ features = ["fuzzy-matching"] rustdoc-args = ["--cfg", "docsrs"] [dependencies] -egui = { version = "0.34", default-features = false, features = ["rayon"] } -egui_extras = { version = "0.34", default-features = false } +egui = { version = "0.35", default-features = false, features = ["rayon"] } +egui_extras = { version = "0.35", default-features = false } nucleo-matcher = { version = "0.3.1", optional = true } -rayon = "1.11.0" +rayon = "1.12.0" [features] default = [] diff --git a/demo/Cargo.lock b/demo/Cargo.lock index 7701afd..19e12e2 100644 --- a/demo/Cargo.lock +++ b/demo/Cargo.lock @@ -20,9 +20,9 @@ checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618" [[package]] name = "accesskit" -version = "0.24.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5351dcebb14b579ccab05f288596b2ae097005be7ee50a7c3d4ca9d0d5a66f6a" +checksum = "d3b7f7f85a7e5f68090000ed7622545829afd484d210358702ae4cb97dd0c320" dependencies = [ "uuid", ] @@ -143,7 +143,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f2a1bb052857d5dd49572219344a7332b31b76405648eabac5bc68978251bcd" dependencies = [ "android-properties", - "bitflags 2.11.0", + "bitflags 2.13.0", "cc", "jni", "libc", @@ -426,9 +426,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.11.0" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" +checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" [[package]] name = "block2" @@ -505,7 +505,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "log", "polling", "rustix 0.38.44", @@ -519,7 +519,7 @@ version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4dbf9978365bac10f54d1d4b04f7ce4427e51f71d61f2fe15e3fed5166474df7" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "polling", "rustix 1.1.4", "slab", @@ -605,9 +605,9 @@ dependencies = [ [[package]] name = "color" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a18ef4657441fb193b65f34dc39b3781f0dfec23d3bd94d0eeb4e88cde421edb" +checksum = "2ec7c5eb7a16992b1904d76c517d170ab353b0e0b3d5a0c81a8a0cd1037893cf" dependencies = [ "bytemuck", ] @@ -753,7 +753,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "objc2 0.6.4", ] @@ -803,21 +803,30 @@ name = "ecolor" version = "0.34.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "137c0ce4ce4152ff7e223a7ce22ee1057cdff61fce0a45c32459c3ccec64868d" +dependencies = [ + "emath 0.34.1", +] + +[[package]] +name = "ecolor" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6758be723a3f298bbfda4db75748bc2ba0abafe096b6383c7c32da264764fbc3" dependencies = [ "bytemuck", - "emath", + "emath 0.35.0", ] [[package]] name = "eframe" -version = "0.34.1" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6e995b8e434d65aefd12c4519221be3e8f38efd77804ef39ca10553f4ad7063" +checksum = "8dc8234e2f681b2afd2b2e8c332fa614de2fddbdcb28d0acf5c420449682ea90" dependencies = [ "ahash", "bytemuck", "document-features", - "egui", + "egui 0.35.0", "egui-wgpu", "egui-winit", "egui_glow", @@ -852,9 +861,28 @@ checksum = "f34aaf627da598dfadd64b0fee6101d22e9c451d1e5348157312720b7f459f0f" dependencies = [ "accesskit", "ahash", - "bitflags 2.11.0", - "emath", - "epaint", + "bitflags 2.13.0", + "emath 0.34.1", + "epaint 0.34.1", + "log", + "nohash-hasher", + "profiling", + "smallvec", + "unicode-segmentation", +] + +[[package]] +name = "egui" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2796c98d50b79631281d516343a6f6e93c0666462ca36e2c93b39f25d7793325" +dependencies = [ + "accesskit", + "ahash", + "bitflags 2.13.0", + "emath 0.35.0", + "epaint 0.35.0", + "itertools", "log", "nohash-hasher", "profiling", @@ -866,7 +894,7 @@ dependencies = [ name = "egui-selectable-table" version = "0.6.0" dependencies = [ - "egui", + "egui 0.35.0", "egui_extras", "nucleo-matcher", "rayon", @@ -878,20 +906,20 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d58d636ef5253d61ef2ac900a3295edf5da70bb98c7b019bf899050284f1e7d8" dependencies = [ - "egui", + "egui 0.34.1", ] [[package]] name = "egui-wgpu" -version = "0.34.1" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71033ff78b041c9c363450f4498ff95468ef3ecbcc71a62f67036a6207d98fa4" +checksum = "d2e6cfac0725563555fa4f91e9f799b9d7c6c5dd831fca6abc8234afc64b7a34" dependencies = [ "ahash", "bytemuck", "document-features", - "egui", - "epaint", + "egui 0.35.0", + "epaint 0.35.0", "log", "profiling", "thiserror 2.0.18", @@ -903,14 +931,14 @@ dependencies = [ [[package]] name = "egui-winit" -version = "0.34.1" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11a2881b2bf1a305e413e644af63f836737a33d85077705ff808e88f902ff742" +checksum = "9ea6bf3608db949588b95b8b341ee358d0c3f95cf4dc3f53d8d76717edee87db" dependencies = [ "accesskit_winit", "arboard", "bytemuck", - "egui", + "egui 0.35.0", "log", "objc2 0.6.4", "objc2-foundation 0.3.2", @@ -925,13 +953,14 @@ dependencies = [ [[package]] name = "egui_extras" -version = "0.34.1" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bfc6870c68d3f254e33aca8200095d422e09edacb0f365f79fe23a5ba10963" +checksum = "e2bd33be7338367bf21f54d62e069d58a5fb3ae033fa8bc6df7a77b9ef4cf957" dependencies = [ "ahash", - "egui", + "egui 0.35.0", "enum-map", + "itertools", "log", "mime_guess2", "profiling", @@ -939,18 +968,16 @@ dependencies = [ [[package]] name = "egui_glow" -version = "0.34.1" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3b28d39ab6c0cac238190e6cb1e8c9047d02cb470ab942a7a3302e4cb3a8e74" +checksum = "52274b9bfb8d8e252cd0f00c9f6214f360d75a0962baa77a2d62ddb002fe99d4" dependencies = [ "bytemuck", - "egui", + "egui 0.35.0", "glow", "log", "memoffset", "profiling", - "wasm-bindgen", - "web-sys", "winit", ] @@ -965,6 +992,12 @@ name = "emath" version = "0.34.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a05cd8bdf3b598488c627ca97c7fe8909448ffa26278dd3c7e535cdb554d721" + +[[package]] +name = "emath" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd4ec073c9898516584d8c6cfdcee95b530b3d941cd5031ef4050aa36812308b" dependencies = [ "bytemuck", ] @@ -1021,29 +1054,52 @@ name = "epaint" version = "0.34.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04f3017dd67f147a697ee0c8484fb568fd9553e2a0c114be5020dbbc11962841" +dependencies = [ + "ahash", + "ecolor 0.34.1", + "emath 0.34.1", + "font-types", + "log", + "nohash-hasher", + "parking_lot", + "profiling", + "self_cell", + "skrifa 0.40.0", + "smallvec", + "vello_cpu 0.0.6", +] + +[[package]] +name = "epaint" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e60a8888b51da911df23918fd7301359b1d43a406a0ff3b8863af093dd7fc6c" dependencies = [ "ahash", "bytemuck", - "ecolor", - "emath", + "ecolor 0.35.0", + "emath 0.35.0", "epaint_default_fonts", "font-types", + "harfrust", "log", "nohash-hasher", "parking_lot", "profiling", "rayon", "self_cell", - "skrifa", + "skrifa 0.42.1", "smallvec", - "vello_cpu", + "unicode-general-category", + "unicode-segmentation", + "vello_cpu 0.0.9", ] [[package]] name = "epaint_default_fonts" -version = "0.34.1" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e3b85a2bb775a3ab02d077a65cc31575c11b2584581913253cc11ce49f48bba" +checksum = "13ee4e1f553a3584c301f3a56ff1a775f1384781396cea301c8d952e9b93f560" [[package]] name = "equivalent" @@ -1141,6 +1197,12 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "fearless_simd" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97b65636e5b9ef369943878ac74335ba1c55c1cb6adbf1e2c293c624248d693" + [[package]] name = "find-msvc-tools" version = "0.1.9" @@ -1171,9 +1233,9 @@ checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" [[package]] name = "font-types" -version = "0.11.1" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73829a7b5c91198af28a99159b7ae4afbb252fb906159ff7f189f3a2ceaa3df2" +checksum = "5b38ad915f6dadd993ced50848a8291a543bd41ca62bc10740d5e64e2ab4cfd7" dependencies = [ "bytemuck", ] @@ -1315,6 +1377,22 @@ dependencies = [ "xml-rs", ] +[[package]] +name = "glifo" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d99fc21d493812643aae86d53b7bbd02f376434a90317e8a790bc209fdd6605e" +dependencies = [ + "bytemuck", + "foldhash 0.2.0", + "hashbrown 0.17.1", + "log", + "peniko", + "skrifa 0.42.1", + "smallvec", + "vello_common 0.0.9", +] + [[package]] name = "glow" version = "0.17.0" @@ -1333,7 +1411,7 @@ version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12124de845cacfebedff80e877bb37b5b75c34c5a4c89e47e1cdd67fb6041325" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "cfg_aliases", "cgl", "dispatch2", @@ -1413,7 +1491,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "gpu-descriptor-types", "hashbrown 0.15.5", ] @@ -1424,7 +1502,16 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", +] + +[[package]] +name = "guillotiere" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b17e70c989c36bad147b27a58d148c0741c51448aa5653436547323e524d0ab" +dependencies = [ + "euclid", ] [[package]] @@ -1439,6 +1526,18 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "harfrust" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0431e8e389aa0f1e72bb9d1c2db8957a1a7a3580e8ed97db819c14837aac9b3e" +dependencies = [ + "bitflags 2.13.0", + "bytemuck", + "read-fonts 0.39.2", + "smallvec", +] + [[package]] name = "hashbrown" version = "0.15.5" @@ -1459,6 +1558,15 @@ dependencies = [ "foldhash 0.2.0", ] +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" +dependencies = [ + "foldhash 0.2.0", +] + [[package]] name = "heck" version = "0.5.0" @@ -1617,6 +1725,15 @@ dependencies = [ "serde_core", ] +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.18" @@ -1722,12 +1839,13 @@ checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" [[package]] name = "kurbo" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7564e90fe3c0d5771e1f0bc95322b21baaeaa0d9213fa6a0b61c99f8b17b3bfb" +checksum = "4b60dfc32f652b926df6192e55525b16d186c69d47876c3ead4da5cc9f8450e2" dependencies = [ "arrayvec", "euclid", + "polycool", "smallvec", ] @@ -1765,7 +1883,7 @@ version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ddbf48fd451246b1f8c2610bd3b4ac0cc6e149d89832867093ab69a17194f08" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "libc", "plain", "redox_syscall 0.7.3", @@ -1812,9 +1930,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.29" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" [[package]] name = "memchr" @@ -1886,7 +2004,7 @@ checksum = "aa2630921705b9b01dcdd0b6864b9562ca3c1951eecd0f0c4f5f04f61e412647" dependencies = [ "arrayvec", "bit-set", - "bitflags 2.11.0", + "bitflags 2.13.0", "cfg-if", "cfg_aliases", "codespan-reporting", @@ -1910,7 +2028,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "jni-sys 0.3.1", "log", "ndk-sys", @@ -2013,7 +2131,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "block2 0.5.1", "libc", "objc2 0.5.2", @@ -2029,7 +2147,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "objc2 0.6.4", "objc2-core-foundation", "objc2-core-graphics", @@ -2042,7 +2160,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "block2 0.5.1", "objc2 0.5.2", "objc2-core-location", @@ -2066,7 +2184,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -2078,7 +2196,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "dispatch2", "objc2 0.6.4", ] @@ -2089,7 +2207,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "dispatch2", "objc2 0.6.4", "objc2-core-foundation", @@ -2132,7 +2250,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "block2 0.5.1", "dispatch", "libc", @@ -2145,7 +2263,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "block2 0.6.2", "objc2 0.6.4", "objc2-core-foundation", @@ -2157,7 +2275,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "objc2 0.6.4", "objc2-core-foundation", ] @@ -2180,7 +2298,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -2192,7 +2310,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0125f776a10d00af4152d74616409f0d4a2053a6f57fa5b7d6aa2854ac04794" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "block2 0.6.2", "objc2 0.6.4", "objc2-foundation 0.3.2", @@ -2204,7 +2322,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -2217,7 +2335,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "objc2 0.6.4", "objc2-core-foundation", "objc2-foundation 0.3.2", @@ -2240,7 +2358,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "block2 0.5.1", "objc2 0.5.2", "objc2-cloud-kit", @@ -2261,7 +2379,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "objc2 0.6.4", "objc2-core-foundation", "objc2-foundation 0.3.2", @@ -2284,7 +2402,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "block2 0.5.1", "objc2 0.5.2", "objc2-core-location", @@ -2366,9 +2484,9 @@ dependencies = [ [[package]] name = "peniko" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2b6aadb221872732e87d465213e9be5af2849b0e8cc5300a8ba98fffa2e00a" +checksum = "839c8299360d2e998bdb106dc0a6cd71dcc5f4df51df1b620361bf50e283cca6" dependencies = [ "bytemuck", "color", @@ -2525,7 +2643,7 @@ version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "crc32fast", "fdeflate", "flate2", @@ -2552,6 +2670,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" +[[package]] +name = "polycool" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50596ddc09eb5ad5f75cacd40209568e66df71baf86e1499a0e99c4cff12a5a6" +dependencies = [ + "arrayvec", +] + [[package]] name = "portable-atomic" version = "1.13.1" @@ -2709,9 +2836,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" dependencies = [ "either", "rayon-core", @@ -2737,6 +2864,16 @@ dependencies = [ "font-types", ] +[[package]] +name = "read-fonts" +version = "0.39.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4ed38b89c2c77ff968c524145ad65fb010f38af5c7a224b53b81d47ac2daa81" +dependencies = [ + "bytemuck", + "font-types", +] + [[package]] name = "redox_syscall" version = "0.4.1" @@ -2752,7 +2889,7 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", ] [[package]] @@ -2761,7 +2898,7 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce70a74e890531977d37e532c34d45e9055d2409ed08ddba14529471ed0be16" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", ] [[package]] @@ -2797,7 +2934,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "errno", "libc", "linux-raw-sys 0.4.15", @@ -2810,7 +2947,7 @@ version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "errno", "libc", "linux-raw-sys 0.12.1", @@ -2974,7 +3111,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fbdfe3d2475fbd7ddd1f3e5cf8288a30eb3e5f95832829570cd88115a7434ac" dependencies = [ "bytemuck", - "read-fonts", + "read-fonts 0.37.0", +] + +[[package]] +name = "skrifa" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c34617370ae968efb7161bb2beb517d9084659aae19e24b89e3db25b46e4564" +dependencies = [ + "bytemuck", + "read-fonts 0.39.2", ] [[package]] @@ -3004,7 +3151,7 @@ version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "calloop 0.13.0", "calloop-wayland-source 0.3.0", "cursor-icon", @@ -3029,7 +3176,7 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0512da38f5e2b31201a93524adb8d3136276fa4fe4aafab4e1f727a82b534cc0" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "calloop 0.14.4", "calloop-wayland-source 0.4.1", "cursor-icon", @@ -3076,7 +3223,7 @@ version = "0.4.0+sdk-1.4.341.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9571ea910ebd84c86af4b3ed27f9dbdc6ad06f17c5f96146b2b671e2976744f" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", ] [[package]] @@ -3342,6 +3489,12 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" +[[package]] +name = "unicode-general-category" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b993bddc193ae5bd0d623b49ec06ac3e9312875fdae725a975c51db1cc1677f" + [[package]] name = "unicode-ident" version = "1.0.24" @@ -3402,14 +3555,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bd1a4c633ce09e7d713df1a6e036644a125e15e0c169cfb5180ddf5836ca04b" dependencies = [ "bytemuck", - "fearless_simd", + "fearless_simd 0.3.0", "hashbrown 0.16.1", "log", "peniko", - "skrifa", + "skrifa 0.40.0", "smallvec", ] +[[package]] +name = "vello_common" +version = "0.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d672facaa2d697285a786cd9d44d614cd2ce54cdc022504bf339f8fff3b750" +dependencies = [ + "bytemuck", + "fearless_simd 0.4.1", + "guillotiere", + "hashbrown 0.17.1", + "log", + "peniko", + "smallvec", + "thiserror 2.0.18", +] + [[package]] name = "vello_cpu" version = "0.0.6" @@ -3418,7 +3587,19 @@ checksum = "0162bfe48aabf6a9fdcd401b628c7d9f260c2cbabb343c70a65feba6f7849edc" dependencies = [ "bytemuck", "hashbrown 0.16.1", - "vello_common", + "vello_common 0.0.6", +] + +[[package]] +name = "vello_cpu" +version = "0.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "588691169aed86b5c8fb487266afee01323234e6fd0a3f2aaec0eaa8e4007f23" +dependencies = [ + "bytemuck", + "glifo", + "hashbrown 0.17.1", + "vello_common 0.0.9", ] [[package]] @@ -3538,7 +3719,7 @@ version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "hashbrown 0.15.5", "indexmap", "semver", @@ -3564,7 +3745,7 @@ version = "0.31.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab51d9f7c071abeee76007e2b742499e535148035bb835f97aaed1338cf516c3" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "rustix 1.1.4", "wayland-backend", "wayland-scanner", @@ -3576,7 +3757,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "cursor-icon", "wayland-backend", ] @@ -3598,7 +3779,7 @@ version = "0.32.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b23b5df31ceff1328f06ac607591d5ba360cf58f90c8fad4ac8d3a55a3c4aec7" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "wayland-backend", "wayland-client", "wayland-scanner", @@ -3610,7 +3791,7 @@ version = "20250721.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40a1f863128dcaaec790d7b4b396cc9b9a7a079e878e18c47e6c2d2c5a8dcbb1" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -3623,7 +3804,7 @@ version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "429b99200febaf95d4f4e46deff6fe4382bcff3280ee16a41cf887b3c3364984" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -3636,7 +3817,7 @@ version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d392fc283a87774afc9beefcd6f931582bb97fe0e6ced0b306a62cb1d026527c" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -3649,7 +3830,7 @@ version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78248e4cc0eff8163370ba5c158630dcae1f3497a586b826eca2ef5f348d6235" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -3728,7 +3909,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72c239a9a747bbd379590985bac952c2e53cb19873f7072b3370c6a6a8e06837" dependencies = [ "arrayvec", - "bitflags 2.11.0", + "bitflags 2.13.0", "bytemuck", "cfg-if", "cfg_aliases", @@ -3760,7 +3941,7 @@ dependencies = [ "arrayvec", "bit-set", "bit-vec", - "bitflags 2.11.0", + "bitflags 2.13.0", "bytemuck", "cfg_aliases", "document-features", @@ -3831,7 +4012,7 @@ dependencies = [ "arrayvec", "ash", "bit-set", - "bitflags 2.11.0", + "bitflags 2.13.0", "block2 0.6.2", "bytemuck", "cfg-if", @@ -3890,7 +4071,7 @@ version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec2675540fb1a5cfa5ef122d3d5f390e2c75711a0b946410f2d6ac3a0f77d1f6" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "bytemuck", "js-sys", "log", @@ -4191,7 +4372,7 @@ dependencies = [ "ahash", "android-activity", "atomic-waker", - "bitflags 2.11.0", + "bitflags 2.13.0", "block2 0.5.1", "bytemuck", "calloop 0.13.0", @@ -4310,7 +4491,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", - "bitflags 2.11.0", + "bitflags 2.13.0", "indexmap", "log", "serde", @@ -4390,7 +4571,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "dlib", "log", "once_cell", diff --git a/demo/Cargo.toml b/demo/Cargo.toml index cf0e2f8..2750d43 100644 --- a/demo/Cargo.toml +++ b/demo/Cargo.toml @@ -4,9 +4,9 @@ version = "0.1.0" edition = "2024" [dependencies] -eframe = "0.34.1" +eframe = "0.35.0" egui-selectable-table = { path = "..", features = ["fuzzy-matching"] } -egui_extras = "0.34.1" +egui_extras = "0.35.0" strum = "0.28.0" strum_macros = "0.28.0" egui-theme-lerp = "0.5.0" From d773ee4b61917748398f72780a264cf845bfa6bc Mon Sep 17 00:00:00 2001 From: Rusty Pickle Date: Sat, 27 Jun 2026 22:38:25 +0600 Subject: [PATCH 6/8] Fix breaking changes --- Cargo.toml | 1 + demo/Cargo.lock | 155 +++++++--------------------------------- demo/Cargo.toml | 4 +- demo/src/app.rs | 8 +-- src/lib.rs | 2 +- src/row_modification.rs | 2 +- src/row_selection.rs | 2 +- 7 files changed, 34 insertions(+), 140 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 8ee532e..52f83fe 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,6 +19,7 @@ features = ["fuzzy-matching"] rustdoc-args = ["--cfg", "docsrs"] [dependencies] +ahash = "0.8.12" egui = { version = "0.35", default-features = false, features = ["rayon"] } egui_extras = { version = "0.35", default-features = false } nucleo-matcher = { version = "0.3.1", optional = true } diff --git a/demo/Cargo.lock b/demo/Cargo.lock index 19e12e2..75cbca7 100644 --- a/demo/Cargo.lock +++ b/demo/Cargo.lock @@ -798,15 +798,6 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" -[[package]] -name = "ecolor" -version = "0.34.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "137c0ce4ce4152ff7e223a7ce22ee1057cdff61fce0a45c32459c3ccec64868d" -dependencies = [ - "emath 0.34.1", -] - [[package]] name = "ecolor" version = "0.35.0" @@ -814,7 +805,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6758be723a3f298bbfda4db75748bc2ba0abafe096b6383c7c32da264764fbc3" dependencies = [ "bytemuck", - "emath 0.35.0", + "emath", ] [[package]] @@ -826,7 +817,7 @@ dependencies = [ "ahash", "bytemuck", "document-features", - "egui 0.35.0", + "egui", "egui-wgpu", "egui-winit", "egui_glow", @@ -853,24 +844,6 @@ dependencies = [ "winit", ] -[[package]] -name = "egui" -version = "0.34.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f34aaf627da598dfadd64b0fee6101d22e9c451d1e5348157312720b7f459f0f" -dependencies = [ - "accesskit", - "ahash", - "bitflags 2.13.0", - "emath 0.34.1", - "epaint 0.34.1", - "log", - "nohash-hasher", - "profiling", - "smallvec", - "unicode-segmentation", -] - [[package]] name = "egui" version = "0.35.0" @@ -880,8 +853,8 @@ dependencies = [ "accesskit", "ahash", "bitflags 2.13.0", - "emath 0.35.0", - "epaint 0.35.0", + "emath", + "epaint", "itertools", "log", "nohash-hasher", @@ -894,7 +867,8 @@ dependencies = [ name = "egui-selectable-table" version = "0.6.0" dependencies = [ - "egui 0.35.0", + "ahash", + "egui", "egui_extras", "nucleo-matcher", "rayon", @@ -902,11 +876,11 @@ dependencies = [ [[package]] name = "egui-theme-lerp" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d58d636ef5253d61ef2ac900a3295edf5da70bb98c7b019bf899050284f1e7d8" +checksum = "1cbf0d991969d50682603b5afa9c5aa206600a73e720f8e61cbce45a29140fc6" dependencies = [ - "egui 0.34.1", + "egui", ] [[package]] @@ -918,8 +892,8 @@ dependencies = [ "ahash", "bytemuck", "document-features", - "egui 0.35.0", - "epaint 0.35.0", + "egui", + "epaint", "log", "profiling", "thiserror 2.0.18", @@ -938,7 +912,7 @@ dependencies = [ "accesskit_winit", "arboard", "bytemuck", - "egui 0.35.0", + "egui", "log", "objc2 0.6.4", "objc2-foundation 0.3.2", @@ -958,7 +932,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2bd33be7338367bf21f54d62e069d58a5fb3ae033fa8bc6df7a77b9ef4cf957" dependencies = [ "ahash", - "egui 0.35.0", + "egui", "enum-map", "itertools", "log", @@ -973,7 +947,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52274b9bfb8d8e252cd0f00c9f6214f360d75a0962baa77a2d62ddb002fe99d4" dependencies = [ "bytemuck", - "egui 0.35.0", + "egui", "glow", "log", "memoffset", @@ -987,12 +961,6 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" -[[package]] -name = "emath" -version = "0.34.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a05cd8bdf3b598488c627ca97c7fe8909448ffa26278dd3c7e535cdb554d721" - [[package]] name = "emath" version = "0.35.0" @@ -1049,26 +1017,6 @@ dependencies = [ "syn", ] -[[package]] -name = "epaint" -version = "0.34.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04f3017dd67f147a697ee0c8484fb568fd9553e2a0c114be5020dbbc11962841" -dependencies = [ - "ahash", - "ecolor 0.34.1", - "emath 0.34.1", - "font-types", - "log", - "nohash-hasher", - "parking_lot", - "profiling", - "self_cell", - "skrifa 0.40.0", - "smallvec", - "vello_cpu 0.0.6", -] - [[package]] name = "epaint" version = "0.35.0" @@ -1077,8 +1025,8 @@ checksum = "4e60a8888b51da911df23918fd7301359b1d43a406a0ff3b8863af093dd7fc6c" dependencies = [ "ahash", "bytemuck", - "ecolor 0.35.0", - "emath 0.35.0", + "ecolor", + "emath", "epaint_default_fonts", "font-types", "harfrust", @@ -1088,11 +1036,11 @@ dependencies = [ "profiling", "rayon", "self_cell", - "skrifa 0.42.1", + "skrifa", "smallvec", "unicode-general-category", "unicode-segmentation", - "vello_cpu 0.0.9", + "vello_cpu", ] [[package]] @@ -1188,15 +1136,6 @@ dependencies = [ "simd-adler32", ] -[[package]] -name = "fearless_simd" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fb2907d1f08b2b316b9223ced5b0e89d87028ba8deae9764741dba8ff7f3903" -dependencies = [ - "bytemuck", -] - [[package]] name = "fearless_simd" version = "0.4.1" @@ -1388,9 +1327,9 @@ dependencies = [ "hashbrown 0.17.1", "log", "peniko", - "skrifa 0.42.1", + "skrifa", "smallvec", - "vello_common 0.0.9", + "vello_common", ] [[package]] @@ -1534,7 +1473,7 @@ checksum = "0431e8e389aa0f1e72bb9d1c2db8957a1a7a3580e8ed97db819c14837aac9b3e" dependencies = [ "bitflags 2.13.0", "bytemuck", - "read-fonts 0.39.2", + "read-fonts", "smallvec", ] @@ -2854,16 +2793,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "read-fonts" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b634fabf032fab15307ffd272149b622260f55974d9fad689292a5d33df02e5" -dependencies = [ - "bytemuck", - "font-types", -] - [[package]] name = "read-fonts" version = "0.39.2" @@ -3104,16 +3033,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" -[[package]] -name = "skrifa" -version = "0.40.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fbdfe3d2475fbd7ddd1f3e5cf8288a30eb3e5f95832829570cd88115a7434ac" -dependencies = [ - "bytemuck", - "read-fonts 0.37.0", -] - [[package]] name = "skrifa" version = "0.42.1" @@ -3121,7 +3040,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c34617370ae968efb7161bb2beb517d9084659aae19e24b89e3db25b46e4564" dependencies = [ "bytemuck", - "read-fonts 0.39.2", + "read-fonts", ] [[package]] @@ -3548,21 +3467,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "vello_common" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bd1a4c633ce09e7d713df1a6e036644a125e15e0c169cfb5180ddf5836ca04b" -dependencies = [ - "bytemuck", - "fearless_simd 0.3.0", - "hashbrown 0.16.1", - "log", - "peniko", - "skrifa 0.40.0", - "smallvec", -] - [[package]] name = "vello_common" version = "0.0.9" @@ -3570,7 +3474,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19d672facaa2d697285a786cd9d44d614cd2ce54cdc022504bf339f8fff3b750" dependencies = [ "bytemuck", - "fearless_simd 0.4.1", + "fearless_simd", "guillotiere", "hashbrown 0.17.1", "log", @@ -3579,17 +3483,6 @@ dependencies = [ "thiserror 2.0.18", ] -[[package]] -name = "vello_cpu" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0162bfe48aabf6a9fdcd401b628c7d9f260c2cbabb343c70a65feba6f7849edc" -dependencies = [ - "bytemuck", - "hashbrown 0.16.1", - "vello_common 0.0.6", -] - [[package]] name = "vello_cpu" version = "0.0.9" @@ -3599,7 +3492,7 @@ dependencies = [ "bytemuck", "glifo", "hashbrown 0.17.1", - "vello_common 0.0.9", + "vello_common", ] [[package]] diff --git a/demo/Cargo.toml b/demo/Cargo.toml index 2750d43..d0ee14f 100644 --- a/demo/Cargo.toml +++ b/demo/Cargo.toml @@ -5,11 +5,11 @@ edition = "2024" [dependencies] eframe = "0.35.0" -egui-selectable-table = { path = "..", features = ["fuzzy-matching"] } egui_extras = "0.35.0" +egui-selectable-table = { path = "..", features = ["fuzzy-matching"] } +egui-theme-lerp = "0.6.0" strum = "0.28.0" strum_macros = "0.28.0" -egui-theme-lerp = "0.5.0" [target.'cfg(target_arch = "wasm32")'.dependencies] wasm-bindgen-futures = "0.4" diff --git a/demo/src/app.rs b/demo/src/app.rs index 5c847dd..d4aab0f 100644 --- a/demo/src/app.rs +++ b/demo/src/app.rs @@ -1,11 +1,12 @@ +use eframe::egui::scroll_area::DragScroll; use eframe::{App, CreationContext, Frame, egui}; -use egui::ahash::{HashSet, HashSetExt}; use egui::{Align, Button, CentralPanel, Layout, Slider, TextEdit, ThemePreference, Ui, Visuals}; use egui_extras::Column; use egui_selectable_table::{ AutoScroll, ColumnOperations, ColumnOrdering, SelectableRow, SelectableTable, SortOrder, }; use egui_theme_lerp::ThemeAnimator; +use std::collections::HashSet; use strum::IntoEnumIterator; use strum_macros::{Display, EnumIter}; @@ -76,7 +77,7 @@ impl App for MainWindow { "☀" }; - CentralPanel::default().show_inside(ui, |ui| { + CentralPanel::default().show(ui, |ui| { if self.theme_animator.anim_id.is_none() { self.theme_animator.create_id(ui); } else { @@ -201,11 +202,10 @@ impl App for MainWindow { self.table.show_ui(ui, |table| { let mut table = table - .drag_to_scroll(false) + .drag_to_scroll(DragScroll::Never) .striped(true) .resizable(true) .cell_layout(Layout::left_to_right(Align::Center)) - .drag_to_scroll(false) .auto_shrink([false; 2]) .min_scrolled_height(0.0); diff --git a/src/lib.rs b/src/lib.rs index 2a9fa2c..1abad3e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -9,9 +9,9 @@ mod row_selection; #[cfg_attr(docsrs, doc(cfg(feature = "fuzzy-matching")))] mod fuzzy_matcher; +use ahash::{HashMap, HashMapExt, HashSet, HashSetExt}; use auto_reload::AutoReload; pub use auto_scroll::AutoScroll; -use egui::ahash::{HashMap, HashMapExt, HashSet, HashSetExt}; use egui::{Event, Key, Label, Response, ScrollArea, Sense, Ui}; use egui_extras::{Column, TableBuilder, TableRow}; use std::cmp::Ordering; diff --git a/src/row_modification.rs b/src/row_modification.rs index 0b52300..ff20c1f 100644 --- a/src/row_modification.rs +++ b/src/row_modification.rs @@ -1,4 +1,4 @@ -use egui::ahash::{HashMap, HashSet, HashSetExt}; +use ahash::{HashMap, HashSet, HashSetExt}; use rayon::prelude::*; use std::hash::Hash; diff --git a/src/row_selection.rs b/src/row_selection.rs index 203610b..3d0dd28 100644 --- a/src/row_selection.rs +++ b/src/row_selection.rs @@ -1,5 +1,5 @@ +use ahash::{HashMap, HashMapExt, HashSet}; use egui::Ui; -use egui::ahash::{HashMap, HashMapExt, HashSet}; use rayon::iter::{IntoParallelRefIterator, ParallelIterator}; use std::fmt::Write as _; use std::hash::Hash; From 727f3b23a810ba286a12ba73cfb580b0ac08694d Mon Sep 17 00:00:00 2001 From: Rusty Pickle Date: Sat, 27 Jun 2026 22:47:04 +0600 Subject: [PATCH 7/8] Clippy fix --- src/auto_scroll.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/auto_scroll.rs b/src/auto_scroll.rs index e922b2f..eee28e2 100644 --- a/src/auto_scroll.rs +++ b/src/auto_scroll.rs @@ -150,7 +150,7 @@ impl AutoScroll { // Scale the speed by distance, with a cap at max_speed let speed_factor = max_speed * (distance / 100.0).clamp(0.1, 1.0); - self.scroll_offset += direction * speed_factor; + self.scroll_offset = direction.mul_add(speed_factor, self.scroll_offset); // Ensure scroll offset doesn't go negative if self.scroll_offset < 0.0 { From 18657d4ed6186d7e1a72b8bb9a07b5cabb9df1e3 Mon Sep 17 00:00:00 2001 From: Rusty Pickle Date: Sat, 27 Jun 2026 22:47:18 +0600 Subject: [PATCH 8/8] Update version --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 52f83fe..f446970 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "egui-selectable-table" -version = "0.6.0" +version = "0.7.0" edition = "2024" description = """ A library for egui to create tables with draggable cell and row selection.