Browse Source

message-row: Always allocate space for messsage state

It avoids reflows in the UI when the state changes.
pipelines/786320
Kévin Commaille 1 year ago
parent
commit
ffed9ac679
No known key found for this signature in database
GPG Key ID: C971D9DBC9D678D
  1. 44
      src/session/view/content/room_history/message_row/message_state_stack.rs
  2. 8
      src/session/view/content/room_history/message_row/message_state_stack.ui
  3. 2
      src/session/view/content/room_history/message_row/mod.ui

44
src/session/view/content/room_history/message_row/message_state_stack.rs

@ -57,10 +57,9 @@ mod imp {
return;
}
let obj = self.obj();
let stack = &self.stack;
match state {
let name = match state {
MessageState::None => {
if matches!(
prev_state,
@ -68,35 +67,26 @@ mod imp {
| MessageState::RecoverableError
| MessageState::PermanentError
) {
// Show the sent icon.
stack.set_visible_child_name("sent");
// Show the sent icon for a few seconds.
glib::timeout_add_seconds_local_once(
SENT_VISIBLE_SECONDS,
clone!(
#[weak]
obj,
stack,
move || {
obj.set_visible(false);
stack.set_visible_child_name("none");
}
),
);
"sent"
} else {
obj.set_visible(false);
"none"
}
}
MessageState::Sending => {
stack.set_visible_child_name("sending");
obj.set_visible(true);
}
MessageState::RecoverableError => {
stack.set_visible_child_name("warning");
obj.set_visible(true);
}
MessageState::PermanentError => {
stack.set_visible_child_name("error");
obj.set_visible(true);
}
MessageState::Sending => "sending",
MessageState::RecoverableError => "warning",
MessageState::PermanentError => "error",
MessageState::Edited => {
if matches!(
prev_state,
@ -104,9 +94,7 @@ mod imp {
| MessageState::RecoverableError
| MessageState::PermanentError
) {
// Show the sent icon.
stack.set_visible_child_name("sent");
// Show the sent icon for a few seconds.
glib::timeout_add_seconds_local_once(
SENT_VISIBLE_SECONDS,
clone!(
@ -117,15 +105,17 @@ mod imp {
}
),
);
"sent"
} else {
stack.set_visible_child_name("edited");
obj.set_visible(true);
"edited"
}
}
}
};
stack.set_visible_child_name(name);
self.state.set(state);
obj.notify_state();
self.obj().notify_state();
}
}
}

8
src/session/view/content/room_history/message_row/message_state_stack.ui

@ -4,6 +4,14 @@
<child>
<object class="GtkStack" id="stack">
<property name="transition-type">crossfade</property>
<child>
<object class="GtkStackPage">
<property name="name">none</property>
<property name="child">
<object class="AdwBin"/>
</property>
</object>
</child>
<child>
<object class="GtkStackPage">
<property name="name">sending</property>

2
src/session/view/content/room_history/message_row/mod.ui

@ -60,7 +60,7 @@
</child>
<child>
<object class="MessageStateStack" id="message_state">
<property name="visible">false</property>
<property name="valign">end</property>
<layout>
<property name="column">2</property>
<property name="row">1</property>

Loading…
Cancel
Save