From aa5e608485db77f7febaf8c568aab888b13a4016 Mon Sep 17 00:00:00 2001 From: Nicolas Meylan Date: Fri, 28 Jun 2024 15:10:19 +0200 Subject: [PATCH] Scroll to column: we can go to all matching columns --- src/array_table.rs | 35 +++++++++++++++++++----------- src/main.rs | 54 +++++++++++++++++++++++++++++++++++++++------- 2 files changed, 69 insertions(+), 20 deletions(-) diff --git a/src/array_table.rs b/src/array_table.rs index abd221d..268801c 100644 --- a/src/array_table.rs +++ b/src/array_table.rs @@ -82,7 +82,6 @@ pub enum ScrollToRowMode { } - impl ScrollToRowMode { pub fn as_str(&self) -> &'static str { match self { @@ -114,6 +113,8 @@ pub struct ArrayTable { seed2: usize, // seed for Id pub matching_rows: Vec, pub matching_row_selected: usize, + pub matching_columns: Vec, + pub matching_column_selected: usize, pub scroll_to_column: String, pub scroll_to_row: String, pub scroll_to_row_mode: ScrollToRowMode, @@ -121,6 +122,7 @@ pub struct ArrayTable { // Handle interaction pub next_frame_reset_scroll: bool, pub changed_scroll_to_column_value: bool, + pub changed_matching_column_selected: bool, pub changed_matching_row_selected: bool, pub changed_scroll_to_row_value: Option, @@ -151,16 +153,23 @@ impl super::View for ArrayTable { let mut scroll_to_x = None; if self.changed_scroll_to_column_value { self.changed_scroll_to_column_value = false; - let mut index = self.column_selected.iter().position(|c| { - c.name.to_lowercase().eq(&concat_string!("/", &self.scroll_to_column.to_lowercase())) - }); - if index.is_none() { - index = self.column_selected.iter().position(|c| { - c.name.to_lowercase().contains(&self.scroll_to_column.to_lowercase()) - }); + self.changed_matching_column_selected = true; + self.matching_columns.clear(); + self.matching_column_selected = 0; + if !self.scroll_to_column.is_empty() { + for (index, column) in self.column_selected.iter().enumerate() { + if column.name.to_lowercase().eq(&concat_string!("/", &self.scroll_to_column.to_lowercase())) + || column.name.to_lowercase().contains(&self.scroll_to_column.to_lowercase()) { + self.matching_columns.push(index); + } + } } - if let Some(index) = index { - if let Some(offset) = self.columns_offset.get(index) { + } + + if self.changed_matching_column_selected { + self.changed_matching_column_selected = false; + if !self.matching_columns.is_empty() { + if let Some(offset) = self.columns_offset.get(self.matching_columns[self.matching_column_selected]) { scroll_to_x = Some(*offset); } } @@ -243,6 +252,8 @@ impl ArrayTable { windows: vec![], matching_rows: vec![], matching_row_selected: 0, + matching_columns: vec![], + matching_column_selected: 0, scroll_to_column: "".to_string(), changed_scroll_to_column_value: false, last_parsed_max_depth, @@ -251,6 +262,7 @@ impl ArrayTable { scroll_to_row: "".to_string(), changed_scroll_to_row_value: None, changed_matching_row_selected: false, + changed_matching_column_selected: false, editing_index: RefCell::new(None), editing_value: RefCell::new(String::new()), is_sub_table: false, @@ -343,7 +355,6 @@ impl ArrayTable { } pub fn row_height(style: &Arc