summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAram Drevekenin <aram@poor.dev>2024-03-26 15:33:33 +0100
committerAram Drevekenin <aram@poor.dev>2024-03-26 15:33:33 +0100
commit562bbe656b4f7918191ef104c911dc3af4a2aa5a (patch)
tree8fcf227f2ec7824794d3a1f4a488c81beb64d000
parent34222eb3b9b62641337762e0149e3f6a4fcfefb4 (diff)
fix(ui): scrolling layout list in welcome screen
-rw-r--r--default-plugins/session-manager/src/new_session_info.rs36
-rw-r--r--default-plugins/session-manager/src/ui/components.rs4
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();