diff options
author | 2025-04-11 16:29:53 +0100 | |
---|---|---|
committer | 2025-04-11 16:29:53 +0100 | |
commit | 70532f715f93164fef4313a1bb5064a467811408 (patch) | |
tree | dff79fb375f2aeb4a97433345307899c2fcd91eb /src/message_view.rs | |
parent | 80524e515406007915cb9978f403407a98c44e1e (diff) | |
download | macaw-70532f715f93164fef4313a1bb5064a467811408.tar.gz macaw-70532f715f93164fef4313a1bb5064a467811408.tar.bz2 macaw-70532f715f93164fef4313a1bb5064a467811408.zip |
feat: new message style
Diffstat (limited to 'src/message_view.rs')
-rw-r--r-- | src/message_view.rs | 128 |
1 files changed, 61 insertions, 67 deletions
diff --git a/src/message_view.rs b/src/message_view.rs index fdb1a59..8378164 100644 --- a/src/message_view.rs +++ b/src/message_view.rs @@ -1,18 +1,24 @@ -use chrono::NaiveDate; +use std::{path::PathBuf, time::Duration}; + +use chrono::{NaiveDate, NaiveDateTime, TimeDelta}; use iced::{ border::Radius, - widget::{button, column, container, row, scrollable, text, text_editor, text_editor::Content}, + widget::{ + button, column, container, image, row, scrollable, text, text_editor, text_editor::Content, + }, Border, Color, Element, Length::{Fill, Shrink}, Theme, }; use indexmap::IndexMap; +use jid::JID; use serde::{Deserialize, Serialize}; use uuid::Uuid; use crate::{icons::Icon, MacawChat, MacawMessage}; pub struct MessageView { + pub file_root: PathBuf, // references chats, users pub chat: MacawChat, // references users, messages @@ -49,7 +55,7 @@ pub enum Action { } impl MessageView { - pub fn new(chat: MacawChat, config: &super::Config) -> Self { + pub fn new(chat: MacawChat, config: &super::Config, file_root: PathBuf) -> Self { Self { chat, // TODO: save position in message history @@ -59,6 +65,7 @@ impl MessageView { config: config.message_view_config.clone(), // TODO: have centralised modifier state location? shift_pressed: false, + file_root, } } @@ -137,14 +144,22 @@ impl MessageView { pub fn view(&self) -> Element<Message> { let mut messages_view = column![].spacing(8).padding(8); - let mut latest_date = NaiveDate::MIN; + let mut last_timestamp = NaiveDateTime::MIN; + let mut last_user: Option<JID> = None; for (_id, message) in &self.messages { - let message_date = message.timestamp.naive_local().date(); - if message_date > latest_date { - latest_date = message_date; - messages_view = messages_view.push(date(latest_date)); + let message_timestamp = message.timestamp.naive_local(); + if message_timestamp.date() > last_timestamp.date() { + messages_view = messages_view.push(date(message_timestamp.date())); + } + if last_user.as_ref() != Some(&message.from.jid) + || message_timestamp - last_timestamp > TimeDelta::minutes(3) + { + messages_view = messages_view.push(self.message(message, true)); + } else { + messages_view = messages_view.push(self.message(message, false)); } - messages_view = messages_view.push(self.message(message)); + last_user = Some(message.from.jid.clone()); + last_timestamp = message_timestamp; } let text_editor = text_editor(&self.new_message) .placeholder("new message") @@ -166,68 +181,47 @@ impl MessageView { .into() } - pub fn message<'a>(&'a self, message: &MacawMessage) -> Element<'a, Message> { + pub fn message<'a>(&'a self, message: &'a MacawMessage, major: bool) -> Element<'a, Message> { let timestamp = message.timestamp.naive_local(); let timestamp = timestamp.time().format("%H:%M").to_string(); - if self.chat.user.jid == message.from.jid { - container( - container( - column![ - text(message.body.body.clone()).wrapping(text::Wrapping::WordOrGlyph), - container(text(timestamp).wrapping(text::Wrapping::None).size(12)) // .align_right(Fill) - ] - .width(Shrink) - .max_width(500), - ) - .padding(16) - .style(|theme: &Theme| { - let palette = theme.extended_palette(); - container::Style::default() - .background(palette.primary.weak.color) - .border(Border { - color: Color::BLACK, - width: 0., - // width: 4., - radius: Radius::new(16), - }) - }), - ) - .align_left(Fill) - .into() + if major { + let nick: String = if let Some(nick) = &message.from.nick { + nick.to_string() + } else { + message.from.jid.as_bare().to_string() + }; + let mut header = row![text(nick), text(timestamp)]; + if let Some(delivery) = message.delivery { + let icon = match delivery { + filamento::chat::Delivery::Sending => Some(Icon::Sending16), + filamento::chat::Delivery::Written => None, + filamento::chat::Delivery::Sent => Some(Icon::Sent16), + filamento::chat::Delivery::Delivered => Some(Icon::Delivered16), + filamento::chat::Delivery::Read => Some(Icon::Delivered16), + filamento::chat::Delivery::Failed => Some(Icon::Error16Color), + filamento::chat::Delivery::Queued => Some(Icon::Sending16), + }; + if let Some(icon) = icon { + header = header.push(icon); + } + } + let message_right = column![header, text(&message.body.body)]; + let mut major_message = row([]); + if let Some(avatar) = &message.from.avatar { + let mut path = self.file_root.join(avatar); + path.set_extension("jpg"); + // info!("got avatar: {:?}", path); + major_message = major_message.push(image(path).width(48).height(48)); + } + major_message = major_message.push(message_right); + major_message.into() } else { - let element: Element<Message> = container( - container( - column![ - text(message.body.body.clone()).wrapping(text::Wrapping::WordOrGlyph), - container(text(timestamp).wrapping(text::Wrapping::None).size(12)) - .align_right(Fill) // row![ - // // horizontal_space(), - // // horizontal_space(), - // text(timestamp).wrapping(text::Wrapping::None).size(12) - // ] // container(text(timestamp).wrapping(text::Wrapping::None).size(12)) - // .align_right(Fill) - ] - .width(Shrink) - .max_width(500), - ) - .padding(16) - .style(|theme: &Theme| { - let palette = theme.extended_palette(); - container::Style::default() - .background(palette.primary.base.color) - .border(Border { - color: Color::BLACK, - width: 0., - // width: 4., - radius: Radius::new(16), - }) - }), - ) - .align_right(Fill) - .into(); - // element.explain(Color::BLACK) - element + row![ + container(text(timestamp)).width(48), + text(&message.body.body) + ] + .into() } } } |