Daniel Brötzmann pushed to branch mainwindow at gajim / gajim
Commits: 433a6e88 by wurstsalat at 2021-09-05T20:05:02+02:00 GroupChatSettings: Add description for print_status
- - - - - d9fd0b90 by wurstsalat at 2021-09-05T22:08:51+02:00 Roster: Improve Transport handling
- - - - -
7 changed files:
- gajim/common/modules/contacts.py - gajim/gtk/contact_info.py - gajim/gtk/groupchat_settings.py - gajim/gtk/roster.py - gajim/gtk/tooltips.py - gajim/gtkgui_helpers.py - gajim/gui_menu_builder.py
Changes:
===================================== gajim/common/modules/contacts.py ===================================== @@ -280,6 +280,16 @@ def is_in_roster(self): item = self._module('Roster').get_item(self._jid) return item is not None
+ @property + def is_transport(self): + disco_info = app.storage.cache.get_last_disco_info(self._jid) + if disco_info is None: + return False + for identity in disco_info.identities: + if identity.category == 'gateway': + return True + return False + @property def ask(self): return self._get_roster_attr('ask')
===================================== gajim/gtk/contact_info.py ===================================== @@ -78,8 +78,12 @@ def __init__(self, account, contact, page=None):
if contact.is_in_roster: self._ui.edit_name_button.show() - self._fill_settings_page() self._fill_groups_page() + if contact.is_transport: + side_bar_switcher.hide_row('settings') + side_bar_switcher.hide_row('devices') + else: + self._fill_settings_page() else: side_bar_switcher.hide_row('settings') side_bar_switcher.hide_row('groups')
===================================== gajim/gtk/groupchat_settings.py ===================================== @@ -47,7 +47,8 @@ def __init__(self, account, jid): Setting(SettingKind.SWITCH, _('Show Status Changes'), SettingType.GROUP_CHAT, - 'print_status'), + 'print_status', + desc=_('For example: "Julia is now online"')),
Setting(SettingKind.SWITCH, _('Notify on all Messages'),
===================================== gajim/gtk/roster.py ===================================== @@ -19,7 +19,10 @@
from gajim.gui_menu_builder import get_roster_menu
+from .dialogs import ConfirmationDialog +from .dialogs import DialogButton from .tooltips import RosterTooltip +from .service_registration import ServiceRegistration from .util import EventHelper from .util import get_builder
@@ -111,6 +114,7 @@ def __init__(self, account): def _add_actions(self): actions = [ ('contact-info', self._on_contact_info), + ('modify-transport', self._on_modify_transport), ('execute-command', self._on_execute_command), ('block-contact', self._on_block_contact), ('remove-contact', self._on_remove_contact), @@ -135,6 +139,8 @@ def update_actions(self):
app.window.lookup_action( f'contact-info-{self._account}').set_enabled(online) + app.window.lookup_action( + f'modify-transport-{self._account}').set_enabled(online) app.window.lookup_action( f'execute-command-{self._account}').set_enabled(online) app.window.lookup_action( @@ -146,6 +152,7 @@ def update_actions(self): def _remove_actions(self): actions = [ 'contact-info', + 'modify-transport', 'execute-command', 'block-contact', 'remove-contact', @@ -258,6 +265,9 @@ def _on_show_offline(self, action, param): def _on_contact_info(self, _action, param): app.window.contact_info(self._account, param.get_string())
+ def _on_modify_transport(self, _action, param): + ServiceRegistration(self._account, param.get_string()) + def _on_execute_command(self, _action, param): app.window.execute_command(self._account, param.get_string())
@@ -265,7 +275,37 @@ def _on_block_contact(self, _action, param): app.window.block_contact(self._account, param.get_string())
def _on_remove_contact(self, _action, param): - app.window.remove_contact(self._account, param.get_string()) + jid = param.get_string() + selected_contact = self._client.get_module('Contacts').get_contact(jid) + if selected_contact.is_transport: + # Check for transport users in roster and warn about removing the + # transport if there are any + has_transport_contacts = False + for contact in self._client.get_module('Roster').iter_contacts(): + if contact.jid.domain == selected_contact.jid.domain: + has_transport_contacts = True + break + if has_transport_contacts: + def _on_remove(): + self._client.get_module('Gateway').unsubscribe( + selected_contact.jid) + app.window.remove_contact(self._account, jid) + + ConfirmationDialog( + _('Remove Transport'), + _('Transport '%s' will be ' + 'removed') % selected_contact.name, + _('You will no longer be able to send and receive ' + 'messages from and to contacts using this transport.'), + [DialogButton.make('Cancel'), + DialogButton.make('Remove', + callback=_on_remove)], + transient_for=app.window).show() + else: + _on_remove() + return + + app.window.remove_contact(self._account, jid)
def _on_roster_row_activated(self, _treeview, path, _column): path = self._modelfilter.convert_path_to_child_path(path) @@ -305,7 +345,9 @@ def _on_focus_out(treeview, _param): treeview.get_selection().unselect_all()
def _show_contact_menu(self, jid, treeview, event): - menu = get_roster_menu(self._account, jid) + contact = self._client.get_module('Contacts').get_contact(jid) + menu = get_roster_menu( + self._account, jid, transport=contact.is_transport)
rectangle = Gdk.Rectangle() rectangle.x = event.x @@ -379,6 +421,7 @@ def _initial_draw(self):
def _connect_contact_signals(self, contact): contact.connect('presence-update', self._on_contact_update) + contact.connect('caps-update', self._on_contact_update) contact.connect('avatar-update', self._on_contact_update) contact.connect('blocking-update', self._on_contact_update)
@@ -531,7 +574,9 @@ def _draw_contact_row(self, ref, contact): self._store[iter_][Column.TEXT] = name
surface = contact.get_avatar( - AvatarSize.ROSTER, self.get_scale_factor()) + AvatarSize.ROSTER, + self.get_scale_factor(), + add_show=bool(not contact.is_transport)) self._store[iter_][Column.AVATAR] = surface
def _get_total_user_count(self):
===================================== gajim/gtk/tooltips.py ===================================== @@ -152,7 +152,10 @@ def _populate_grid(self, contact): scale = self._ui.tooltip_grid.get_scale_factor()
# Avatar - surface = contact.get_avatar(AvatarSize.TOOLTIP, scale) + surface = contact.get_avatar( + AvatarSize.TOOLTIP, + scale, + add_show=bool(not contact.is_transport)) self._ui.avatar.set_from_surface(surface) self._ui.avatar.show()
===================================== gajim/gtkgui_helpers.py ===================================== @@ -122,8 +122,6 @@ def get_possible_button_event(event): # BUTTON_PRESS event, so pass event.button return event.button
-def destroy_widget(widget): - widget.destroy()
def scale_with_ratio(size, width, height): if height == width:
===================================== gajim/gui_menu_builder.py ===================================== @@ -25,94 +25,6 @@ from gajim.common.i18n import _ from gajim.common.const import URIType from gajim.common.const import URIAction -from gajim.gtkgui_helpers import destroy_widget - - -def get_transport_menu(contact, account): - # TODO: - roster = app.interface.roster - jid = contact.jid - - menu = Gtk.Menu() - - # Send single message - item = Gtk.MenuItem.new_with_mnemonic(_('Send Single _Message…')) - item.connect('activate', roster.on_send_single_message_menuitem_activate, - account, contact) - menu.append(item) - if app.account_is_disconnected(account): - item.set_sensitive(False) - - blocked = False - if helpers.jid_is_blocked(account, jid): - blocked = True - - item = Gtk.SeparatorMenuItem.new() - menu.append(item) - - # Execute Command - item = Gtk.MenuItem.new_with_mnemonic(_('E_xecute Command…')) - menu.append(item) - item.connect('activate', roster.on_execute_command, contact, account, - contact.resource) - if app.account_is_disconnected(account): - item.set_sensitive(False) - - # Manage Transport submenu - item = Gtk.MenuItem.new_with_mnemonic(_('_Manage Transport')) - manage_transport_submenu = Gtk.Menu() - item.set_submenu(manage_transport_submenu) - menu.append(item) - - # Modify Transport - item = Gtk.MenuItem.new_with_mnemonic(_('_Modify Transport')) - manage_transport_submenu.append(item) - item.connect('activate', roster.on_edit_agent, contact, account) - if app.account_is_disconnected(account): - item.set_sensitive(False) - - # Rename - item = Gtk.MenuItem.new_with_mnemonic(_('_Rename…')) - manage_transport_submenu.append(item) - item.connect('activate', roster.on_rename, 'agent', jid, account) - if app.account_is_disconnected(account): - item.set_sensitive(False) - - item = Gtk.SeparatorMenuItem.new() - manage_transport_submenu.append(item) - - # Block - if blocked: - item = Gtk.MenuItem.new_with_mnemonic(_('_Unblock')) - item.connect('activate', roster.on_unblock, [(contact, account)]) - else: - item = Gtk.MenuItem.new_with_mnemonic(_('_Block')) - item.connect('activate', roster.on_block, [(contact, account)]) - - manage_transport_submenu.append(item) - if app.account_is_disconnected(account): - item.set_sensitive(False) - - # Remove - item = Gtk.MenuItem.new_with_mnemonic(_('Remo_ve')) - manage_transport_submenu.append(item) - item.connect('activate', roster.on_remove_agent, [(contact, account)]) - if app.account_is_disconnected(account): - item.set_sensitive(False) - - item = Gtk.SeparatorMenuItem.new() - menu.append(item) - - # Information - information_menuitem = Gtk.MenuItem.new_with_mnemonic(_('_Information')) - menu.append(information_menuitem) - information_menuitem.connect('activate', roster.on_info, contact, account) - if app.account_is_disconnected(account): - information_menuitem.set_sensitive(False) - - menu.connect('selection-done', destroy_widget) - menu.show_all() - return menu
def get_singlechat_menu(control_id, account, jid, type_): @@ -408,7 +320,7 @@ def get_conv_context_menu(account, uri): return menu
-def get_roster_menu(account, jid): +def get_roster_menu(account, jid, transport=False): if helpers.jid_is_blocked(account, jid): block_label = _('Unblock') else: @@ -419,6 +331,8 @@ def get_roster_menu(account, jid): ('block-contact', block_label), ('remove-contact', _('Remove…')), ] + if transport: + menu_items.insert(1, ('modify-transport', _('Modify Transport…')))
menu = Gio.Menu() for item in menu_items:
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/compare/f7a5d2c7fc5b42c48fbcf9e8718bdbdf...