From ab81c89854199306c00bcc5c1c30d497d34033c7 Mon Sep 17 00:00:00 2001 From: Joscha Date: Fri, 5 Jan 2024 14:25:09 +0100 Subject: [PATCH] Set window title The title includes the amount of unseen messages in the room or room list. The room list heading also now contains the amount of connected rooms as well as the amount of unseen messages in total (if any). --- CHANGELOG.md | 4 +++ Cargo.lock | 4 +-- Cargo.toml | 2 +- cove/src/ui/euph/room.rs | 12 ++++++- cove/src/ui/rooms.rs | 74 ++++++++++++++++++++++++++++------------ cove/src/vault/euph.rs | 16 +++++++++ 6 files changed, 86 insertions(+), 26 deletions(-) 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 // ///////////////////