From 3efca6a6d148e5a812ac7f14137f58933fb5bf2e Mon Sep 17 00:00:00 2001 From: Joscha Date: Sat, 26 Feb 2022 19:17:25 +0100 Subject: [PATCH] Prepare room rendering --- cove-tui/src/ui.rs | 19 +++++++++++++------ cove-tui/src/ui/room.rs | 31 +++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 cove-tui/src/ui/room.rs diff --git a/cove-tui/src/ui.rs b/cove-tui/src/ui.rs index 4cb4801..46e5af4 100644 --- a/cove-tui/src/ui.rs +++ b/cove-tui/src/ui.rs @@ -1,6 +1,7 @@ mod input; mod layout; mod overlays; +mod room; mod rooms; mod textline; @@ -24,6 +25,7 @@ use crate::ui::overlays::OverlayReaction; use self::input::EventHandler; use self::overlays::{JoinRoom, JoinRoomState}; +use self::room::RoomInfo; use self::rooms::{Rooms, RoomsState}; pub type Backend = CrosstermBackend; @@ -48,6 +50,7 @@ pub struct Ui { event_tx: UnboundedSender, rooms: HashMap>>, rooms_state: RoomsState, + room: Option, overlay: Option, } @@ -58,6 +61,7 @@ impl Ui { event_tx, rooms: HashMap::new(), rooms_state: RoomsState::default(), + room: None, overlay: None, } } @@ -225,13 +229,16 @@ impl Ui { } async fn switch_to_room(&mut self, name: String) { - match self.rooms.entry(name.clone()) { - Entry::Occupied(_) => {} + let room = match self.rooms.entry(name.clone()) { + Entry::Occupied(entry) => entry.get().clone(), Entry::Vacant(entry) => { - entry.insert( - Room::new(name, self.config.cove_identity.clone(), None, self.config).await, - ); + let identity = self.config.cove_identity.clone(); + let room = Room::new(name.clone(), identity, None, self.config).await; + entry.insert(room.clone()); + room } - } + }; + + self.room = Some(RoomInfo::new(name, room)) } } diff --git a/cove-tui/src/ui/room.rs b/cove-tui/src/ui/room.rs new file mode 100644 index 0000000..7270e60 --- /dev/null +++ b/cove-tui/src/ui/room.rs @@ -0,0 +1,31 @@ +use std::sync::Arc; + +use tokio::sync::Mutex; +use tui::backend::Backend; +use tui::layout::Rect; +use tui::Frame; + +use crate::room::Room; + +pub struct RoomInfo { + name: String, + room: Arc>, +} + +impl RoomInfo { + pub fn new(name: String, room: Arc>) -> Self { + Self { name, room } + } + + pub fn name(&self) -> &str { + &self.name + } + + pub async fn render_messages(&mut self, frame: &mut Frame<'_, B>, area: Rect) { + // TODO Implement + } + + pub async fn render_users(&mut self, frame: &mut Frame<'_, B>, area: Rect) { + // TODO Implement + } +}