Daniel Brötzmann pushed to branch master at gajim / gajim
Commits: 52d46908 by wurstsalat at 2023-05-18T00:33:50+02:00 imprv: GroupchatState: Show MAM sync
- - - - -
4 changed files:
- gajim/data/gui/groupchat_state.ui - gajim/data/style/gajim.css - gajim/gtk/chat_list_row.py - gajim/gtk/groupchat_state.py
Changes:
===================================== gajim/data/gui/groupchat_state.ui ===================================== @@ -115,6 +115,7 @@ <object class="GtkSpinner"> <property name="visible">True</property> <property name="can-focus">False</property> + <property name="active">True</property> </object> <packing> <property name="expand">False</property> @@ -139,9 +140,75 @@ </style> </object> <packing> - <property name="name">fetching</property> + <property name="name">mam-sync-started</property> <property name="position">2</property> </packing> </child> + <child> + <object class="GtkBox"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="spacing">12</property> + <child> + <object class="GtkImage"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="icon-name">dialog-error-symbolic</property> + <style> + <class name="error-color"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes">There has been an error while trying to fetch messages.</property> + <property name="wrap">True</property> + <property name="max-width-chars">50</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="tooltip-text" translatable="yes">Close</property> + <property name="valign">center</property> + <signal name="clicked" handler="_on_close_clicked" swapped="no"/> + <child> + <object class="GtkImage"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="icon-name">window-close-symbolic</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <style> + <class name="floating-overlay-box"/> + </style> + </object> + <packing> + <property name="name">mam-sync-error</property> + <property name="position">3</property> + </packing> + </child> </object> </interface>
===================================== gajim/data/style/gajim.css ===================================== @@ -95,6 +95,7 @@ .padding-left30 { padding-left: 30px; } .success-color { color: @success_color; } .error-color { color: @error_color; } .warning-color { color: @warning_color; } +.info-color { color: rgb(75, 150, 200); } .selected-color { color: @theme_selected_bg_color; } .insensitive-fg-color {color: @insensitive_fg_color;} .encrypted-color { color: rgb(75, 181, 67); }
===================================== gajim/gtk/chat_list_row.py ===================================== @@ -517,6 +517,9 @@ def _connect_contact_signals(self) -> None: elif isinstance(self.contact, GroupchatContact): self.contact.connect('avatar-update', self._on_avatar_update) self.contact.connect('state-changed', self._on_muc_state_changed) + self.contact.connect('mam-sync-started', self._on_mam_sync_changed) + self.contact.connect('mam-sync-finished', self._on_mam_sync_changed) + self.contact.connect('mam-sync-error', self._on_mam_sync_changed)
self._client.connect_signal('state-changed', self._on_client_state_changed) @@ -555,29 +558,55 @@ def _on_muc_state_changed(self, *args: Any) -> None: self._update_joined_state()
def _update_joined_state(self) -> None: - self._ui.connection_icon.get_style_context().remove_class('spin') - self._ui.connection_icon.get_style_context().remove_class( - 'warning-color') - self._ui.connection_icon.get_style_context().remove_class( - 'dim-label') + self._reset_connection_icon() + context = self._ui.connection_icon.get_style_context()
if self.contact.is_joining: self._ui.connection_icon.set_from_icon_name( 'feather-refresh-cw-symbolic', Gtk.IconSize.MENU) - self._ui.connection_icon.get_style_context().add_class('spin') - self._ui.connection_icon.get_style_context().add_class('dim-label') + context.add_class('spin') + context.add_class('dim-label') self._ui.connection_icon.set_tooltip_text(_('Joining Group Chat…')) self._ui.connection_icon.show() elif (self.contact.is_not_joined or not self._client.state.is_available): self._ui.connection_icon.set_from_icon_name( 'feather-zap-symbolic', Gtk.IconSize.MENU) - self._ui.connection_icon.get_style_context().add_class( - 'warning-color') + context.add_class('warning-color') self._ui.connection_icon.set_tooltip_text(_('Not connected')) self._ui.connection_icon.show() - else: - self._ui.connection_icon.hide() + + def _on_mam_sync_changed(self, + _contact: GroupchatContact, + signal_name: str + ) -> None: + + self._reset_connection_icon() + context = self._ui.connection_icon.get_style_context() + + if signal_name == 'mam-sync-started': + self._ui.connection_icon.set_from_icon_name( + 'feather-refresh-cw-symbolic', Gtk.IconSize.MENU) + context.add_class('spin') + context.add_class('info-color') + self._ui.connection_icon.set_tooltip_text(_('Fetching messages…')) + self._ui.connection_icon.show() + elif signal_name == 'mam-sync-error': + self._ui.connection_icon.set_from_icon_name( + 'feather-zap-symbolic', Gtk.IconSize.MENU) + context.add_class('error-color') + self._ui.connection_icon.set_tooltip_text( + _('There has been an error while trying to fetch messages.')) + self._ui.connection_icon.show() + + def _reset_connection_icon(self) -> None: + self._ui.connection_icon.hide() + context = self._ui.connection_icon.get_style_context() + context.remove_class('spin') + context.remove_class('dim-label') + context.remove_class('info-color') + context.remove_class('warning-color') + context.remove_class('error-color')
def _on_muc_user_update(self, _contact: GroupchatParticipant,
===================================== gajim/gtk/groupchat_state.py ===================================== @@ -59,6 +59,9 @@ def switch_contact(self, contact: types.ChatContactT) -> None:
self._contact = contact self._contact.connect('state-changed', self._on_muc_state_changed) + self._contact.connect('mam-sync-started', self._on_mam_sync_changed) + self._contact.connect('mam-sync-finished', self._on_mam_sync_changed) + self._contact.connect('mam-sync-error', self._on_mam_sync_changed)
self._client = app.get_client(contact.account) self._client.connect_signal('state-changed', @@ -92,8 +95,20 @@ def _update_state(self, contact: GroupchatContact) -> None: self.set_visible(self._client.state.is_available and not contact.is_joined)
- def set_fetching(self) -> None: - self._ui.groupchat_state.set_visible_child_name('fetching') + def _on_mam_sync_changed(self, + _contact: GroupchatContact, + signal_name: str + ) -> None: + + if signal_name in ('mam-sync-started', 'mam-sync-error'): + self.set_visible(True) + self._ui.groupchat_state.set_visible_child_name(signal_name) + return + + self.hide() + + def _on_close_clicked(self, _button: Gtk.Button) -> None: + self.hide()
def _on_join_clicked(self, _button: Gtk.Button) -> None: assert self._contact is not None
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/commit/52d469082e3e7bd5c061587f9cd31b1fe...