diff options
author | Aram Drevekenin <aram@poor.dev> | 2024-03-26 15:33:33 +0100 |
---|---|---|
committer | Aram Drevekenin <aram@poor.dev> | 2024-03-26 15:33:33 +0100 |
commit | 562bbe656b4f7918191ef104c911dc3af4a2aa5a (patch) | |
tree | 8fcf227f2ec7824794d3a1f4a488c81beb64d000 | |
parent | 34222eb3b9b62641337762e0149e3f6a4fcfefb4 (diff) |
fix(ui): scrolling layout list in welcome screen
-rw-r--r-- | default-plugins/session-manager/src/new_session_info.rs | 36 | ||||
-rw-r--r-- | default-plugins/session-manager/src/ui/components.rs | 4 |
2 files changed, 33 insertions, 7 deletions
diff --git a/default-plugins/session-manager/src/new_session_info.rs b/default-plugins/session-manager/src/new_session_info.rs index 02e539668..65a1f8e4b 100644 --- a/default-plugins/session-manager/src/new_session_info.rs +++ b/default-plugins/session-manager/src/new_session_info.rs @@ -126,21 +126,24 @@ impl NewSessionInfo { pub fn update_layout_list(&mut self, layout_info: Vec<LayoutInfo>) { self.layout_list.update_layout_list(layout_info); } - pub fn layout_list(&self) -> Vec<(LayoutInfo, bool)> { + pub fn layout_list(&self, max_rows: usize) -> Vec<(LayoutInfo, bool)> { // bool - is_selected + let range_to_render = self.range_to_render(max_rows, self.layout_count(), Some(self.layout_list.selected_layout_index)); self.layout_list .layout_list .iter() .enumerate() .map(|(i, l)| (l.clone(), i == self.layout_list.selected_layout_index)) + .take(range_to_render.1) + .skip(range_to_render.0) .collect() } - pub fn layouts_to_render(&self) -> Vec<(LayoutInfo, Vec<usize>, bool)> { + pub fn layouts_to_render(&self, max_rows: usize) -> Vec<(LayoutInfo, Vec<usize>, bool)> { // (layout_info, // search_indices, // is_selected) if self.is_searching() { - self.layout_search_results() + self.layout_search_results(max_rows) .into_iter() .map(|(layout_search_result, is_selected)| { ( @@ -151,21 +154,44 @@ impl NewSessionInfo { }) .collect() } else { - self.layout_list() + self.layout_list(max_rows) .into_iter() .map(|(layout_info, is_selected)| (layout_info, vec![], is_selected)) .collect() } } - pub fn layout_search_results(&self) -> Vec<(LayoutSearchResult, bool)> { + pub fn layout_search_results(&self, max_rows: usize) -> Vec<(LayoutSearchResult, bool)> { // bool - is_selected + let range_to_render = self.range_to_render(max_rows, self.layout_list.layout_search_results.len(), Some(self.layout_list.selected_layout_index)); self.layout_list .layout_search_results .iter() .enumerate() .map(|(i, l)| (l.clone(), i == self.layout_list.selected_layout_index)) + .take(range_to_render.1) + .skip(range_to_render.0) .collect() } + // TODO: merge with similar function in resurrectable_sessions + fn range_to_render( + &self, + table_rows: usize, + results_len: usize, + selected_index: Option<usize>, + ) -> (usize, usize) { + if table_rows <= results_len { + let row_count_to_render = table_rows.saturating_sub(1); // 1 for the title + let first_row_index_to_render = selected_index + .unwrap_or(0) + .saturating_sub(row_count_to_render / 2); + let last_row_index_to_render = first_row_index_to_render + row_count_to_render; + (first_row_index_to_render, last_row_index_to_render) + } else { + let first_row_index_to_render = 0; + let last_row_index_to_render = results_len; + (first_row_index_to_render, last_row_index_to_render) + } + } pub fn is_searching(&self) -> bool { !self.layout_list.layout_search_term.is_empty() } diff --git a/default-plugins/session-manager/src/ui/components.rs b/default-plugins/session-manager/src/ui/components.rs index 0824e173c..ac4193b59 100644 --- a/default-plugins/session-manager/src/ui/components.rs +++ b/default-plugins/session-manager/src/ui/components.rs @@ -761,7 +761,7 @@ pub fn render_new_session_block( } render_layout_selection_list( new_session_info, - max_rows_of_new_session_block.saturating_sub(1), + max_rows_of_new_session_block.saturating_sub(8), max_cols_of_new_session_block, x, y + 1, @@ -806,7 +806,7 @@ pub fn render_layout_selection_list( println!(); let mut table = Table::new(); for (i, (layout_info, indices, is_selected)) in - new_session_info.layouts_to_render().into_iter().enumerate() + new_session_info.layouts_to_render(max_rows_of_new_session_block).into_iter().enumerate() { let layout_name = layout_info.name(); let layout_name_len = layout_name.width(); |