diff options
author | Joscha <joscha@plugh.de> | 2022-09-25 20:02:58 +0200 |
---|---|---|
committer | Joscha <joscha@plugh.de> | 2022-09-25 20:03:03 +0200 |
commit | 8703a62887d5a66c049c7c01d11e3b4587da799b (patch) | |
tree | 08dc66a7c0c4418acd0287386d5e10dd38d7b1c1 | |
parent | 147c3eaf92afe0c1c6c89d44d3b0f0f28e5c9c72 (diff) |
Track focus in room
-rw-r--r-- | src/ui.rs | 2 | ||||
-rw-r--r-- | src/ui/chat.rs | 3 | ||||
-rw-r--r-- | src/ui/euph/nick_list.rs | 3 | ||||
-rw-r--r-- | src/ui/euph/room.rs | 31 |
4 files changed, 33 insertions, 6 deletions
@@ -188,7 +188,7 @@ impl Ui { async fn widget(&mut self) -> BoxedWidget { let widget = match self.mode { Mode::Main => self.rooms.widget().await, - Mode::Log => self.log_chat.widget(String::new()).into(), + Mode::Log => self.log_chat.widget(String::new(), true).into(), }; if let Some(key_bindings_list) = &self.key_bindings_list { diff --git a/src/ui/chat.rs b/src/ui/chat.rs index 467307d..b43da76 100644 --- a/src/ui/chat.rs +++ b/src/ui/chat.rs @@ -66,7 +66,8 @@ impl<M: Msg, S: MsgStore<M>> ChatState<M, S> { &self.store } - pub fn widget(&self, nick: String) -> Chat<M, S> { + pub fn widget(&self, nick: String, focus: bool) -> Chat<M, S> { + // TODO Handle focus match self.mode { Mode::Tree => Chat::Tree(self.tree.widget(nick)), } diff --git a/src/ui/euph/nick_list.rs b/src/ui/euph/nick_list.rs index d54a58a..ae12823 100644 --- a/src/ui/euph/nick_list.rs +++ b/src/ui/euph/nick_list.rs @@ -12,7 +12,8 @@ use crate::ui::widgets::list::{List, ListState}; use crate::ui::widgets::text::Text; use crate::ui::widgets::BoxedWidget; -pub fn widget(state: &ListState<String>, joined: &Joined) -> BoxedWidget { +pub fn widget(state: &ListState<String>, joined: &Joined, focus: bool) -> BoxedWidget { + // TODO Handle focus let mut list = state.widget(); render_rows(&mut list, joined); list.into() diff --git a/src/ui/euph/room.rs b/src/ui/euph/room.rs index 656a13f..bf721b1 100644 --- a/src/ui/euph/room.rs +++ b/src/ui/euph/room.rs @@ -31,6 +31,12 @@ use super::links::{self, LinksState}; use super::popup::RoomPopup; use super::{auth, inspect, nick, nick_list}; +#[derive(Debug, PartialEq, Eq)] +enum Focus { + Chat, + NickList, +} + #[allow(clippy::large_enum_variant)] enum State { Normal, @@ -67,6 +73,7 @@ pub struct EuphRoom { vault: EuphRoomVault, room: Option<euph::Room>, + focus: Focus, state: State, popups: VecDeque<RoomPopup>, @@ -87,6 +94,7 @@ impl EuphRoom { ui_event_tx, vault: vault.clone(), room: None, + focus: Focus::Chat, state: State::Normal, popups: VecDeque::new(), chat: ChatState::new(vault), @@ -178,6 +186,13 @@ impl EuphRoom { } } + fn stabilize_focus(&mut self, status: &RoomStatus) { + match status { + RoomStatus::Connected(Status::Joined(_)) => {} + _ => self.focus = Focus::Chat, // There is no nick list to focus on + } + } + fn stabilize_state(&mut self, status: &RoomStatus) { match &mut self.state { State::Auth(_) @@ -205,6 +220,7 @@ impl EuphRoom { async fn stabilize(&mut self, status: &RoomStatus) { self.stabilize_pseudo_msg().await; + self.stabilize_focus(status); self.stabilize_state(status); } @@ -242,7 +258,7 @@ impl EuphRoom { Padding::new(self.status_widget(status).await).horizontal(1), )), // TODO Use last known nick? - Segment::new(self.chat.widget(String::new())).expanding(true), + Segment::new(self.chat.widget(String::new(), true)).expanding(true), ]) .into() } @@ -253,11 +269,20 @@ impl EuphRoom { Segment::new(Border::new( Padding::new(self.status_widget(status).await).horizontal(1), )), - Segment::new(self.chat.widget(joined.session.name.clone())).expanding(true), + Segment::new( + self.chat + .widget(joined.session.name.clone(), self.focus == Focus::Chat), + ) + .expanding(true), ])) .expanding(true), Segment::new(Border::new( - Padding::new(nick_list::widget(&self.nick_list, joined)).right(1), + Padding::new(nick_list::widget( + &self.nick_list, + joined, + self.focus == Focus::NickList, + )) + .right(1), )), ]) .into() |