From f7d6fe2dbf49202cc792d8709b450c338adda2f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 7 Mar 2025 13:13:17 +0100 Subject: [PATCH] refactor(multiverse): Rename StatefulList to RoomList While we're at it, move the impl block closer to the struct. --- labs/multiverse/src/main.rs | 114 ++++++++++++++++++------------------ 1 file changed, 57 insertions(+), 57 deletions(-) diff --git a/labs/multiverse/src/main.rs b/labs/multiverse/src/main.rs index baae3b4c5..6caff1443 100644 --- a/labs/multiverse/src/main.rs +++ b/labs/multiverse/src/main.rs @@ -84,11 +84,61 @@ async fn main() -> Result<()> { } #[derive(Default)] -struct StatefulList { +struct RoomList { state: ListState, items: Arc>>, } +impl RoomList { + /// Focus the list on the next item, wraps around if needs be. + /// + /// Returns the index only if there was a meaningful change. + fn next(&mut self) -> Option { + let num_items = self.items.lock().unwrap().len(); + + // If there's no item to select, leave early. + if num_items == 0 { + self.state.select(None); + return None; + } + + // Otherwise, select the next one or wrap around. + let prev = self.state.selected(); + let new = prev.map_or(0, |i| if i >= num_items - 1 { 0 } else { i + 1 }); + + if prev != Some(new) { + self.state.select(Some(new)); + Some(new) + } else { + None + } + } + + /// Focus the list on the previous item, wraps around if needs be. + /// + /// Returns the index only if there was a meaningful change. + fn previous(&mut self) -> Option { + let num_items = self.items.lock().unwrap().len(); + + // If there's no item to select, leave early. + if num_items == 0 { + self.state.select(None); + return None; + } + + // Otherwise, select the previous one or wrap around. + let prev = self.state.selected(); + let new = prev.map_or(0, |i| if i == 0 { num_items - 1 } else { i - 1 }); + + if prev != Some(new) { + self.state.select(Some(new)); + Some(new) + } else { + None + } + } +} + #[derive(Default, PartialEq)] enum DetailsMode { ReadReceipts, @@ -131,7 +181,7 @@ struct App { timelines: Arc>>, /// Ratatui's list of room list rooms. - room_list_rooms: StatefulList, + room_list_rooms: RoomList, /// Extra information about rooms. room_info: Arc>>, @@ -281,7 +331,7 @@ impl App { Ok(Self { sync_service, - room_list_rooms: StatefulList { state: Default::default(), items: rooms }, + room_list_rooms: RoomList { state: Default::default(), items: rooms }, room_info: room_infos, client, listen_task, @@ -557,11 +607,11 @@ impl Widget for &mut App { // Create two chunks with equal horizontal screen space. One for the list and // the other for the info block. let horizontal = - Layout::horizontal([Constraint::Percentage(50), Constraint::Percentage(50)]); - let [lhs, rhs] = horizontal.areas(rest_area); + Layout::horizontal([Constraint::Percentage(30), Constraint::Percentage(70)]); + let [room_list, rhs] = horizontal.areas(rest_area); self.render_title(header_area, buf); - self.render_left(lhs, buf); + self.render_room_list(room_list, buf); self.render_right(rhs, buf); self.render_footer(footer_area, buf); } @@ -574,7 +624,7 @@ impl App { } /// Renders the left part of the screen, that is, the list of rooms. - fn render_left(&mut self, area: Rect, buf: &mut Buffer) { + fn render_room_list(&mut self, area: Rect, buf: &mut Buffer) { // We create two blocks, one is for the header (outer) and the other is for list // (inner). let outer_block = Block::default() @@ -914,56 +964,6 @@ impl App { } } -impl StatefulList { - /// Focus the list on the next item, wraps around if needs be. - /// - /// Returns the index only if there was a meaningful change. - fn next(&mut self) -> Option { - let num_items = self.items.lock().unwrap().len(); - - // If there's no item to select, leave early. - if num_items == 0 { - self.state.select(None); - return None; - } - - // Otherwise, select the next one or wrap around. - let prev = self.state.selected(); - let new = prev.map_or(0, |i| if i >= num_items - 1 { 0 } else { i + 1 }); - - if prev != Some(new) { - self.state.select(Some(new)); - Some(new) - } else { - None - } - } - - /// Focus the list on the previous item, wraps around if needs be. - /// - /// Returns the index only if there was a meaningful change. - fn previous(&mut self) -> Option { - let num_items = self.items.lock().unwrap().len(); - - // If there's no item to select, leave early. - if num_items == 0 { - self.state.select(None); - return None; - } - - // Otherwise, select the previous one or wrap around. - let prev = self.state.selected(); - let new = prev.map_or(0, |i| if i == 0 { num_items - 1 } else { i - 1 }); - - if prev != Some(new) { - self.state.select(Some(new)); - Some(new) - } else { - None - } - } -} - /// Configure the client so it's ready for sync'ing. /// /// Will log in or reuse a previous session.