diff --git a/CHANGELOG.md b/CHANGELOG.md index 0392309..0ac199d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,10 @@ Procedure when bumping the version number: ## Unreleased +### Added +- Support for setting window title +- More information to room list heading + ### Removed - Key binding to open present page diff --git a/Cargo.lock b/Cargo.lock index 4e31d05..f6f8d1c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1477,8 +1477,8 @@ dependencies = [ [[package]] name = "toss" -version = "0.2.0" -source = "git+https://github.com/Garmelon/toss.git?tag=v0.2.0#2c7888fa413c9b12bec7d55a73051aa96d59386f" +version = "0.2.1" +source = "git+https://github.com/Garmelon/toss.git?tag=v0.2.1#b01ee297d5bdbb3b28cafe2b5b130c2767667974" dependencies = [ "async-trait", "crossterm", diff --git a/Cargo.toml b/Cargo.toml index f7b582f..aa6a315 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,7 +17,7 @@ thiserror = "1.0.56" [workspace.dependencies.toss] git = "https://github.com/Garmelon/toss.git" -tag = "v0.2.0" +tag = "v0.2.1" [profile.dev.package."*"] opt-level = 3 diff --git a/cove/src/ui/euph/room.rs b/cove/src/ui/euph/room.rs index d79ab3d..8fc2fe5 100644 --- a/cove/src/ui/euph/room.rs +++ b/cove/src/ui/euph/room.rs @@ -319,7 +319,17 @@ impl EuphRoom { .then_plain(")"); } - Text::new(info).padding().with_horizontal(1).border() + let title = if unseen > 0 { + format!("&{} ({unseen})", self.name()) + } else { + format!("&{}", self.name()) + }; + + Text::new(info) + .padding() + .with_horizontal(1) + .border() + .title(title) } async fn handle_chat_input_event(&mut self, event: &mut InputEvent<'_>, keys: &Keys) -> bool { diff --git a/cove/src/ui/rooms.rs b/cove/src/ui/rooms.rs index 4275b48..f40bfc5 100644 --- a/cove/src/ui/rooms.rs +++ b/cove/src/ui/rooms.rs @@ -237,12 +237,16 @@ impl Rooms { } match &mut self.state { - State::ShowList => { - Self::rooms_widget(self.config, &mut self.list, self.order, &self.euph_rooms) - .await - .desync() - .boxed_async() - } + State::ShowList => Self::rooms_widget( + &self.vault, + self.config, + &mut self.list, + self.order, + &self.euph_rooms, + ) + .await + .desync() + .boxed_async(), State::ShowRoom(id) => { self.euph_rooms @@ -252,21 +256,29 @@ impl Rooms { .await } - State::Connect(connect) => { - Self::rooms_widget(self.config, &mut self.list, self.order, &self.euph_rooms) - .await - .below(connect.widget()) - .desync() - .boxed_async() - } + State::Connect(connect) => Self::rooms_widget( + &self.vault, + self.config, + &mut self.list, + self.order, + &self.euph_rooms, + ) + .await + .below(connect.widget()) + .desync() + .boxed_async(), - State::Delete(delete) => { - Self::rooms_widget(self.config, &mut self.list, self.order, &self.euph_rooms) - .await - .below(delete.widget()) - .desync() - .boxed_async() - } + State::Delete(delete) => Self::rooms_widget( + &self.vault, + self.config, + &mut self.list, + self.order, + &self.euph_rooms, + ) + .await + .below(delete.widget()) + .desync() + .boxed_async(), } } @@ -400,6 +412,7 @@ impl Rooms { } async fn rooms_widget<'a>( + vault: &Vault, config: &Config, list: &'a mut ListState, order: Order, @@ -419,8 +432,24 @@ impl Rooms { .with_horizontal(1) .border(); - let heading = Styled::new("Rooms", Style::new().bold()) - .then_plain(format!(" ({})", euph_rooms.len())); + let mut heading = Styled::new("Rooms", Style::new().bold()); + let mut title = "Rooms".to_string(); + + let total_rooms = euph_rooms.len(); + let connected_rooms = euph_rooms + .iter() + .filter(|r| r.1.room_state().is_some()) + .count(); + let total_unseen = logging_unwrap!(vault.euph().total_unseen_msgs_count().await); + if total_unseen > 0 { + heading = heading + .then_plain(format!(" ({connected_rooms}/{total_rooms}, ")) + .then(format!("{total_unseen}"), Style::new().bold().green()) + .then_plain(")"); + title.push_str(&format!(" ({total_unseen})")); + } else { + heading = heading.then_plain(format!(" ({connected_rooms}/{total_rooms})")) + } let mut list_builder = ListBuilder::new(); Self::render_rows(&mut list_builder, order, euph_rooms).await; @@ -435,6 +464,7 @@ impl Rooms { .segment() .with_growing(false), ) + .title(title) } async fn handle_showlist_input_event( diff --git a/cove/src/vault/euph.rs b/cove/src/vault/euph.rs index 8091613..f922345 100644 --- a/cove/src/vault/euph.rs +++ b/cove/src/vault/euph.rs @@ -115,6 +115,7 @@ euph_vault_actions! { SetCookies : set_cookies(domain: String, cookies: CookieJar) -> (); ClearCookies : clear_cookies(domain: Option) -> (); GetRooms : rooms() -> Vec; + GetTotalUnseenMsgsCount : total_unseen_msgs_count() -> usize; } impl Action for GetCookies { @@ -212,6 +213,21 @@ impl Action for GetRooms { } } +impl Action for GetTotalUnseenMsgsCount { + type Output = usize; + type Error = rusqlite::Error; + + fn run(self, conn: &mut Connection) -> Result { + conn.prepare( + " + SELECT COALESCE(SUM(amount), 0) + FROM euph_unseen_counts + ", + )? + .query_row([], |row| row.get(0)) + } +} + /////////////////// // EuphRoomVault // ///////////////////