diff --git a/src/chat_control.py b/src/chat_control.py index 172f17935..2dbd3e89c 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -2690,7 +2690,11 @@ class ChatControl(ChatControlBase): tranasports) and file_transfer_menuitem and hide()/show() for add_to_roster_menuitem """ - menu = gui_menu_builder.get_contact_menu(self.contact, self.account, + if gajim.jid_is_transport(self.contact.jid): + menu = gui_menu_builder.get_transport_menu(self.contact, + self.account) + else: + menu = gui_menu_builder.get_contact_menu(self.contact, self.account, use_multiple_contacts=False, show_start_chat=False, show_encryption=True, control=self, show_buttonbar_items=not hide_buttonbar_items) diff --git a/src/gui_menu_builder.py b/src/gui_menu_builder.py index 3f7a0691b..4a020ad11 100644 --- a/src/gui_menu_builder.py +++ b/src/gui_menu_builder.py @@ -509,3 +509,139 @@ control=None, gc_contact=None, is_anonymous=True): contact_context_menu.connect('selection-done', gtkgui_helpers.destroy_widget) contact_context_menu.show_all() return contact_context_menu + +def get_transport_menu(contact, account): + roster = gajim.interface.roster + jid = contact.jid + + menu = Gtk.Menu() + + # Send single message + item = Gtk.ImageMenuItem.new_with_mnemonic(_('Send Single _Message...')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_NEW, Gtk.IconSize.MENU) + item.set_image(icon) + item.connect('activate', roster.on_send_single_message_menuitem_activate, + account, contact) + menu.append(item) + if gajim.account_is_disconnected(account): + item.set_sensitive(False) + + blocked = False + if helpers.jid_is_blocked(account, jid): + blocked = True + + # Send Custom Status + send_custom_status_menuitem = Gtk.ImageMenuItem.new_with_mnemonic( + _('Send Cus_tom Status')) + # add a special img for this menuitem + if blocked: + send_custom_status_menuitem.set_image(gtkgui_helpers.load_icon( + 'offline')) + send_custom_status_menuitem.set_sensitive(False) + else: + if account in gajim.interface.status_sent_to_users and \ + jid in gajim.interface.status_sent_to_users[account]: + send_custom_status_menuitem.set_image(gtkgui_helpers.load_icon( + gajim.interface.status_sent_to_users[account][jid])) + else: + icon = Gtk.Imag.new_from_stock(Gtk.STOCK_NETWORK, + Gtk.IconSize.MENU) + send_custom_status_menuitem.set_image(icon) + status_menuitems = Gtk.Menu() + send_custom_status_menuitem.set_submenu(status_menuitems) + iconset = gajim.config.get('iconset') + path = os.path.join(helpers.get_iconset_path(iconset), '16x16') + for s in ('online', 'chat', 'away', 'xa', 'dnd', 'offline'): + # icon MUST be different instance for every item + state_images = gtkgui_helpers.load_iconset(path) + status_menuitem = Gtk.ImageMenuItem(helpers.get_uf_show(s)) + status_menuitem.connect('activate', roster.on_send_custom_status, + [(contact, account)], s) + icon = state_images[s] + status_menuitem.set_image(icon) + status_menuitems.append(status_menuitem) + menu.append(send_custom_status_menuitem) + if gajim.account_is_disconnected(account): + send_custom_status_menuitem.set_sensitive(False) + + item = Gtk.SeparatorMenuItem.new() # separator + menu.append(item) + + # Execute Command + item = Gtk.ImageMenuItem.new_with_mnemonic(_('E_xecute Command...')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_EXECUTE, Gtk.IconSize.MENU) + item.set_image(icon) + menu.append(item) + item.connect('activate', roster.on_execute_command, contact, account, + contact.resource) + if gajim.account_is_disconnected(account): + item.set_sensitive(False) + + # Manage Transport submenu + item = Gtk.ImageMenuItem.new_with_mnemonic(_('_Manage Transport')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_PROPERTIES, Gtk.IconSize.MENU) + item.set_image(icon) + manage_transport_submenu = Gtk.Menu() + item.set_submenu(manage_transport_submenu) + menu.append(item) + + # Modify Transport + item = Gtk.ImageMenuItem.new_with_mnemonic(_('_Modify Transport')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_PREFERENCES, Gtk.IconSize.MENU) + item.set_image(icon) + manage_transport_submenu.append(item) + item.connect('activate', roster.on_edit_agent, contact, account) + if gajim.account_is_disconnected(account): + item.set_sensitive(False) + + # Rename + item = Gtk.ImageMenuItem.new_with_mnemonic(_('_Rename...')) + # add a special img for rename menuitem + gtkgui_helpers.add_image_to_menuitem(item, 'gajim-kbd_input') + manage_transport_submenu.append(item) + item.connect('activate', roster.on_rename, 'agent', jid, account) + if gajim.account_is_disconnected(account): + item.set_sensitive(False) + + item = Gtk.SeparatorMenuItem.new() # separator + manage_transport_submenu.append(item) + + # Block + if blocked: + item = Gtk.ImageMenuItem.new_with_mnemonic(_('_Unblock')) + item.connect('activate', roster.on_unblock, [(contact, account)]) + else: + item = Gtk.ImageMenuItem.new_with_mnemonic(_('_Block')) + item.connect('activate', roster.on_block, [(contact, account)]) + + icon = Gtk.Image.new_from_stock(Gtk.STOCK_STOP, Gtk.IconSize.MENU) + item.set_image(icon) + manage_transport_submenu.append(item) + if gajim.account_is_disconnected(account): + item.set_sensitive(False) + + # Remove + item = Gtk.ImageMenuItem.new_with_mnemonic(_('Remo_ve')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_REMOVE, Gtk.IconSize.MENU) + item.set_image(icon) + manage_transport_submenu.append(item) + item.connect('activate', roster.on_remove_agent, [(contact, account)]) + if gajim.account_is_disconnected(account): + item.set_sensitive(False) + + item = Gtk.SeparatorMenuItem.new() # separator + menu.append(item) + + # Information + information_menuitem = Gtk.ImageMenuItem.new_with_mnemonic( + _('_Information')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_INFO, Gtk.IconSize.MENU) + information_menuitem.set_image(icon) + menu.append(information_menuitem) + information_menuitem.connect('activate', roster.on_info, contact, account) + if gajim.account_is_disconnected(account): + information_menuitem.set_sensitive(False) + + menu.connect('selection-done', gtkgui_helpers.destroy_widget) + menu.show_all() + return menu diff --git a/src/roster_window.py b/src/roster_window.py index 8997700aa..b09261985 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -6021,141 +6021,9 @@ class RosterWindow: path = model.get_path(titer) account = model[titer][C_ACCOUNT] contact = gajim.contacts.get_contact_with_highest_priority(account, jid) - menu = Gtk.Menu() - - # Send single message - item = Gtk.ImageMenuItem.new_with_mnemonic(_('Send Single Message...')) - icon = Gtk.Image.new_from_stock(Gtk.STOCK_NEW, Gtk.IconSize.MENU) - item.set_image(icon) - item.connect('activate', - self.on_send_single_message_menuitem_activate, account, contact) - menu.append(item) - if gajim.account_is_disconnected(account): - item.set_sensitive(False) - - blocked = False - if helpers.jid_is_blocked(account, jid): - blocked = True - - # Send Custom Status - send_custom_status_menuitem = Gtk.ImageMenuItem.new_with_mnemonic( - _('Send Cus_tom Status')) - # add a special img for this menuitem - if blocked: - send_custom_status_menuitem.set_image(gtkgui_helpers.load_icon( - 'offline')) - send_custom_status_menuitem.set_sensitive(False) - else: - if account in gajim.interface.status_sent_to_users and \ - jid in gajim.interface.status_sent_to_users[account]: - send_custom_status_menuitem.set_image(gtkgui_helpers.load_icon( - gajim.interface.status_sent_to_users[account][jid])) - else: - icon = Gtk.Image.new_from_stock(Gtk.STOCK_NETWORK, - Gtk.IconSize.MENU) - send_custom_status_menuitem.set_image(icon) - status_menuitems = Gtk.Menu() - send_custom_status_menuitem.set_submenu(status_menuitems) - iconset = gajim.config.get('iconset') - path = os.path.join(helpers.get_iconset_path(iconset), '16x16') - for s in ('online', 'chat', 'away', 'xa', 'dnd', 'offline'): - # icon MUST be different instance for every item - state_images = gtkgui_helpers.load_iconset(path) - status_menuitem = Gtk.ImageMenuItem(helpers.get_uf_show(s)) - status_menuitem.connect('activate', self.on_send_custom_status, - [(contact, account)], s) - icon = state_images[s] - status_menuitem.set_image(icon) - status_menuitems.append(status_menuitem) - menu.append(send_custom_status_menuitem) - if gajim.account_is_disconnected(account): - send_custom_status_menuitem.set_sensitive(False) - - item = Gtk.SeparatorMenuItem.new() # separator - menu.append(item) - - # Execute Command - item = Gtk.ImageMenuItem.new_with_mnemonic(_('E_xecute Command...')) - icon = Gtk.Image.new_from_stock(Gtk.STOCK_EXECUTE, Gtk.IconSize.MENU) - item.set_image(icon) - menu.append(item) - item.connect('activate', self.on_execute_command, contact, account, - contact.resource) - if gajim.account_is_disconnected(account): - item.set_sensitive(False) - - # Manage Transport submenu - item = Gtk.ImageMenuItem.new_with_mnemonic(_('_Manage Transport')) - icon = Gtk.Image.new_from_stock(Gtk.STOCK_PROPERTIES, - Gtk.IconSize.MENU) - item.set_image(icon) - manage_transport_submenu = Gtk.Menu() - item.set_submenu(manage_transport_submenu) - menu.append(item) - - # Modify Transport - item = Gtk.ImageMenuItem.new_with_mnemonic(_('_Modify Transport')) - icon = Gtk.Image.new_from_stock(Gtk.STOCK_PREFERENCES, - Gtk.IconSize.MENU) - item.set_image(icon) - manage_transport_submenu.append(item) - item.connect('activate', self.on_edit_agent, contact, account) - if gajim.account_is_disconnected(account): - item.set_sensitive(False) - - # Rename - item = Gtk.ImageMenuItem.new_with_mnemonic(_('_Rename...')) - # add a special img for rename menuitem - gtkgui_helpers.add_image_to_menuitem(item, 'gajim-kbd_input') - manage_transport_submenu.append(item) - item.connect('activate', self.on_rename, 'agent', jid, account) - if gajim.account_is_disconnected(account): - item.set_sensitive(False) - - item = Gtk.SeparatorMenuItem.new() # separator - manage_transport_submenu.append(item) - - # Block - if blocked: - item = Gtk.ImageMenuItem.new_with_mnemonic(_('_Unblock')) - item.connect('activate', self.on_unblock, [(contact, account)]) - else: - item = Gtk.ImageMenuItem.new_with_mnemonic(_('_Block')) - item.connect('activate', self.on_block, [(contact, account)]) - - icon = Gtk.Image.new_from_stock(Gtk.STOCK_STOP, Gtk.IconSize.MENU) - item.set_image(icon) - manage_transport_submenu.append(item) - if gajim.account_is_disconnected(account): - item.set_sensitive(False) - - # Remove - item = Gtk.ImageMenuItem.new_with_mnemonic(_('Remo_ve')) - icon = Gtk.Image.new_from_stock(Gtk.STOCK_REMOVE, Gtk.IconSize.MENU) - item.set_image(icon) - manage_transport_submenu.append(item) - item.connect('activate', self.on_remove_agent, [(contact, account)]) - if gajim.account_is_disconnected(account): - item.set_sensitive(False) - - item = Gtk.SeparatorMenuItem.new() # separator - menu.append(item) - - # Information - information_menuitem = Gtk.ImageMenuItem.new_with_mnemonic(_( - '_Information')) - icon = Gtk.Image.new_from_stock(Gtk.STOCK_INFO, Gtk.IconSize.MENU) - information_menuitem.set_image(icon) - menu.append(information_menuitem) - information_menuitem.connect('activate', self.on_info, contact, account) - if gajim.account_is_disconnected(account): - information_menuitem.set_sensitive(False) - + menu = gui_menu_builder.get_transport_menu(contact, account) event_button = gtkgui_helpers.get_possible_button_event(event) - menu.attach_to_widget(self.tree, None) - menu.connect('selection-done', gtkgui_helpers.destroy_widget) - menu.show_all() menu.popup(None, None, None, None, event_button, event.time) def make_groupchat_menu(self, event, titer):