Browse Source

room-history: Fix style of new messages divider

fractal-9
Kévin Commaille 1 year ago
parent
commit
478dab3ecd
No known key found for this signature in database
GPG Key ID: C971D9DBC9D678D
  1. 19
      data/resources/style.css
  2. 1
      po/POTFILES.in
  3. 73
      src/session/view/content/room_history/divider_row.rs
  4. 9
      src/session/view/content/room_history/divider_row.ui
  5. 64
      src/session/view/content/room_history/item_row.rs

19
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;

1
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

73
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<gtk::Label>,
/// The label of this divider.
#[property(get = Self::label, set = Self::set_label)]
label: PhantomData<String>,
pub(super) inner_label: TemplateChild<gtk::Label>,
}
#[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<Self>) {
@ -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: <https://docs.gtk.org/glib/method.DateTime.format.html>
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: <https://docs.gtk.org/glib/method.DateTime.format.html>
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);
}
}

9
src/session/view/content/room_history/divider_row.ui

@ -5,9 +5,8 @@
<relation name="labelled-by">inner_label</relation>
</accessibility>
<property name="can-focus">False</property>
<style>
<class name="divider-row"/>
</style>
<property name="margin-top">20</property>
<property name="margin-bottom">10</property>
<property name="child">
<object class="GtkBox">
<property name="spacing">12</property>
@ -21,9 +20,7 @@
</child>
<child>
<object class="GtkLabel" id="inner_label">
<style>
<class name="dim-label"/>
</style>
<property name="ellipsize">end</property>
</object>
</child>
<child>

64
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::<DividerRow>() {
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::<DividerRow>() {
child
let divider =
if let Some(divider) = obj.child().and_downcast::<DividerRow>() {
divider
} else {
let child = DividerRow::new();
obj.set_child(Some(&child));
child
let divider = DividerRow::new();
obj.set_child(Some(&divider));
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: <https://docs.gtk.org/glib/method.DateTime.format.html>
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: <https://docs.gtk.org/glib/method.DateTime.format.html>
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::<DividerRow>() {
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::<DividerRow>() {
divider
} else {
let divider = DividerRow::new();
obj.set_child(Some(&divider));
divider
};
divider.set_kind(kind);
}
}
}

Loading…
Cancel
Save