From 478dab3ecdbdbac3b058b30e185b8ffb1b4a26b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Commaille?= Date: Fri, 4 Oct 2024 14:40:43 +0200 Subject: [PATCH] room-history: Fix style of new messages divider --- data/resources/style.css | 19 ++++- po/POTFILES.in | 1 + .../view/content/room_history/divider_row.rs | 73 +++++++++++++------ .../view/content/room_history/divider_row.ui | 9 +-- .../view/content/room_history/item_row.rs | 64 +++++----------- 5 files changed, 91 insertions(+), 75 deletions(-) diff --git a/data/resources/style.css b/data/resources/style.css index 9cdda459..8d0b6882 100644 --- a/data/resources/style.css +++ b/data/resources/style.css @@ -700,11 +700,28 @@ read-receipts-list:checked { background-color: color-mix(in srgb, currentColor 10%, transparent); } -.divider-row { +divider-row { font-size: 0.9em; font-weight: bold; } +divider-row label { + opacity: var(--dim-opacity); +} + +divider-row.new-messages { + color: var(--accent-color); +} + +divider-row.new-messages label { + opacity: 1; +} + +divider-row.new-messages separator { + min-height: 2px; + background-color: var(--accent-color); +} + .timestamp { min-width: 36px; font-weight: normal; diff --git a/po/POTFILES.in b/po/POTFILES.in index c555aab9..e0a42304 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -134,6 +134,7 @@ src/session/view/content/room_details/permissions/members_subpage.ui src/session/view/content/room_details/permissions/permissions_subpage.rs src/session/view/content/room_details/permissions/permissions_subpage.ui src/session/view/content/room_details/room_upgrade_dialog.rs +src/session/view/content/room_history/divider_row.rs src/session/view/content/room_history/event_actions.ui src/session/view/content/room_history/item_row.rs src/session/view/content/room_history/message_row/audio.rs diff --git a/src/session/view/content/room_history/divider_row.rs b/src/session/view/content/room_history/divider_row.rs index 1522e1a6..8fdc210e 100644 --- a/src/session/view/content/room_history/divider_row.rs +++ b/src/session/view/content/room_history/divider_row.rs @@ -1,22 +1,19 @@ use adw::subclass::prelude::*; +use gettextrs::gettext; use gtk::{glib, prelude::*, CompositeTemplate}; -mod imp { - use std::marker::PhantomData; +use crate::session::model::VirtualItemKind; +mod imp { use glib::subclass::InitializingObject; use super::*; - #[derive(Debug, Default, CompositeTemplate, glib::Properties)] + #[derive(Debug, Default, CompositeTemplate)] #[template(resource = "/org/gnome/Fractal/ui/session/view/content/room_history/divider_row.ui")] - #[properties(wrapper_type = super::DividerRow)] pub struct DividerRow { #[template_child] - pub inner_label: TemplateChild, - /// The label of this divider. - #[property(get = Self::label, set = Self::set_label)] - label: PhantomData, + pub(super) inner_label: TemplateChild, } #[glib::object_subclass] @@ -27,6 +24,8 @@ mod imp { fn class_init(klass: &mut Self::Class) { Self::bind_template(klass); + + klass.set_css_name("divider-row"); } fn instance_init(obj: &InitializingObject) { @@ -34,23 +33,10 @@ mod imp { } } - #[glib::derived_properties] impl ObjectImpl for DividerRow {} impl WidgetImpl for DividerRow {} impl BinImpl for DividerRow {} - - impl DividerRow { - /// The label of this divider. - fn label(&self) -> String { - self.inner_label.text().into() - } - - /// Set the label of this divider. - fn set_label(&self, label: String) { - self.inner_label.set_text(&label); - } - } } glib::wrapper! { @@ -64,7 +50,48 @@ impl DividerRow { glib::Object::new() } - pub fn with_label(label: String) -> Self { - glib::Object::builder().property("label", &label).build() + /// Set the kind of this divider. + /// + /// Panics if the kind is not `TimelineStart`, `DayDivider` or + /// `NewMessages`. + pub fn set_kind(&self, kind: &VirtualItemKind) { + let label = match kind { + VirtualItemKind::TimelineStart => gettext("This is the start of the visible history"), + VirtualItemKind::DayDivider(utc_date) => { + let date = utc_date.to_local().unwrap_or(utc_date.clone()); + + let fmt = if date.year() + == glib::DateTime::now_local() + .expect("we should be able to get the local datetime") + .year() + { + // Translators: This is a date format in the day divider without the + // year. For example, "Friday, May 5". + // Please use `-` before specifiers that add spaces on single + // digits. See `man strftime` or the documentation of g_date_time_format for the available specifiers: + gettext("%A, %B %-e") + } else { + // Translators: This is a date format in the day divider with the + // year. For ex. "Friday, May 5, 2023". + // Please use `-` before specifiers that add spaces on single + // digits. See `man strftime` or the documentation of g_date_time_format for the available specifiers: + gettext("%A, %B %-e, %Y") + }; + + date.format(&fmt) + .expect("we should be able to format the datetime") + .into() + } + VirtualItemKind::NewMessages => gettext("New Messages"), + _ => unimplemented!(), + }; + + if matches!(kind, VirtualItemKind::NewMessages) { + self.add_css_class("new-messages"); + } else { + self.remove_css_class("new-messages"); + } + + self.imp().inner_label.set_label(&label); } } diff --git a/src/session/view/content/room_history/divider_row.ui b/src/session/view/content/room_history/divider_row.ui index c0e9fc39..56982936 100644 --- a/src/session/view/content/room_history/divider_row.ui +++ b/src/session/view/content/room_history/divider_row.ui @@ -5,9 +5,8 @@ inner_label False - + 20 + 10 12 @@ -21,9 +20,7 @@ - + end diff --git a/src/session/view/content/room_history/item_row.rs b/src/session/view/content/room_history/item_row.rs index 67be3a68..0a78b440 100644 --- a/src/session/view/content/room_history/item_row.rs +++ b/src/session/view/content/room_history/item_row.rs @@ -306,7 +306,8 @@ mod imp { obj.set_popover(None); obj.update_event_actions(None); - match &*item.kind() { + let kind = &*item.kind(); + match kind { VirtualItemKind::Spinner => { if !obj .child() @@ -337,8 +338,6 @@ mod imp { ); } VirtualItemKind::TimelineStart => { - let label = gettext("This is the start of the visible history"); - // Hide this if the `m.room.create` event is visible. if let Some(timeline) = self .room_history @@ -354,51 +353,26 @@ mod imp { self.binding.replace(Some(binding)); } - if let Some(child) = obj.child().and_downcast::() { - child.set_label(label); - } else { - let child = DividerRow::with_label(label); - obj.set_child(Some(&child)); - }; - } - VirtualItemKind::DayDivider(date) => { - let child = - if let Some(child) = obj.child().and_downcast::() { - child + let divider = + if let Some(divider) = obj.child().and_downcast::() { + divider } else { - let child = DividerRow::new(); - obj.set_child(Some(&child)); - child + let divider = DividerRow::new(); + obj.set_child(Some(÷r)); + divider }; - - let date = date.to_local().unwrap_or(date.clone()); - - let fmt = if date.year() == glib::DateTime::now_local().unwrap().year() - { - // Translators: This is a date format in the day divider without the - // year. For example, "Friday, May 5". - // Please use `-` before specifiers that add spaces on single - // digits. See `man strftime` or the documentation of g_date_time_format for the available specifiers: - gettext("%A, %B %-e") - } else { - // Translators: This is a date format in the day divider with the - // year. For ex. "Friday, May 5, 2023". - // Please use `-` before specifiers that add spaces on single - // digits. See `man strftime` or the documentation of g_date_time_format for the available specifiers: - gettext("%A, %B %-e, %Y") - }; - - child.set_label(date.format(&fmt).unwrap()) + divider.set_kind(kind); } - VirtualItemKind::NewMessages => { - let label = gettext("New Messages"); - - if let Some(child) = obj.child().and_downcast::() { - child.set_label(label); - } else { - let child = DividerRow::with_label(label); - obj.set_child(Some(&child)); - }; + VirtualItemKind::DayDivider(_) | VirtualItemKind::NewMessages => { + let divider = + if let Some(divider) = obj.child().and_downcast::() { + divider + } else { + let divider = DividerRow::new(); + obj.set_child(Some(÷r)); + divider + }; + divider.set_kind(kind); } } }