refactor invite to submenu code and add it to group context menu. fixes #3658
This commit is contained in:
parent
77804ee7aa
commit
0bfe53c158
1 changed files with 118 additions and 125 deletions
|
@ -1922,7 +1922,7 @@ class RosterWindow:
|
||||||
keys_str += jid + ' ' + keys[jid] + ' '
|
keys_str += jid + ' ' + keys[jid] + ' '
|
||||||
gajim.config.set_per('accounts', account, 'attached_gpg_keys', keys_str)
|
gajim.config.set_per('accounts', account, 'attached_gpg_keys', keys_str)
|
||||||
for u in gajim.contacts.get_contacts(account, contact.jid):
|
for u in gajim.contacts.get_contacts(account, contact.jid):
|
||||||
u.keyID = helpers.prepare_and_validate_gpg_keyID(account,
|
u.keyID = helpers.prepare_and_validate_gpg_keyID(account,
|
||||||
contact.jid, keyID)
|
contact.jid, keyID)
|
||||||
|
|
||||||
def update_avatar_in_gui(self, jid, account):
|
def update_avatar_in_gui(self, jid, account):
|
||||||
|
@ -2023,6 +2023,104 @@ class RosterWindow:
|
||||||
def on_add_special_notification_menuitem_activate(self, widget, jid):
|
def on_add_special_notification_menuitem_activate(self, widget, jid):
|
||||||
dialogs.AddSpecialNotificationDialog(jid)
|
dialogs.AddSpecialNotificationDialog(jid)
|
||||||
|
|
||||||
|
def build_resources_submenu(self, contacts, account, action, room_jid=None,
|
||||||
|
room_account=None):
|
||||||
|
''' Build a submenu with contact's resources.
|
||||||
|
room_jid and room_account are for action self.on_invite_to_room '''
|
||||||
|
sub_menu = gtk.Menu()
|
||||||
|
|
||||||
|
iconset = gajim.config.get('iconset')
|
||||||
|
if not iconset:
|
||||||
|
iconset = gajim.config.DEFAULT_ICONSET
|
||||||
|
path = os.path.join(helpers.get_iconset_path(iconset), '16x16')
|
||||||
|
for c in contacts:
|
||||||
|
# icon MUST be different instance for every item
|
||||||
|
state_images = self.load_iconset(path)
|
||||||
|
item = gtk.ImageMenuItem('%s (%s)' % (c.resource, str(c.priority)))
|
||||||
|
icon_name = helpers.get_icon_name_to_show(c, account)
|
||||||
|
icon = state_images[icon_name]
|
||||||
|
item.set_image(icon)
|
||||||
|
sub_menu.append(item)
|
||||||
|
if action == self.on_invite_to_room:
|
||||||
|
item.connect('activate', action, [(c, account)],
|
||||||
|
room_jid, room_account, c.resource)
|
||||||
|
elif action == self.on_invite_to_new_room:
|
||||||
|
item.connect('activate', action, [(c, account)], c.resource)
|
||||||
|
else: # start_chat, execute_command, send_file
|
||||||
|
item.connect('activate', action, c, account, c.resource)
|
||||||
|
return sub_menu
|
||||||
|
|
||||||
|
def build_invite_submenu(self, invite_menuitem, list_):
|
||||||
|
'''list_ in a list of (contact, account)'''
|
||||||
|
# used if we invite only one contact with several resources
|
||||||
|
contact_list = []
|
||||||
|
if len(list_) == 1:
|
||||||
|
contact, account = list_[0]
|
||||||
|
contact_list = gajim.contacts.get_contacts(account, contact.jid)
|
||||||
|
contacts_transport = -1
|
||||||
|
connected_accounts = []
|
||||||
|
# -1 is at start, False when not from the same, None when jabber
|
||||||
|
for (contact, account) in list_:
|
||||||
|
if not account in connected_accounts:
|
||||||
|
connected_accounts.append(account)
|
||||||
|
transport = gajim.get_transport_name_from_jid(contact.jid)
|
||||||
|
if contacts_transport == -1:
|
||||||
|
contacts_transport = transport
|
||||||
|
elif contacts_transport != transport:
|
||||||
|
contacts_transport = False
|
||||||
|
|
||||||
|
if contacts_transport == False:
|
||||||
|
# they are not all from the same transport
|
||||||
|
invite_menuitem.set_sensitive(False)
|
||||||
|
return
|
||||||
|
invite_to_submenu = gtk.Menu()
|
||||||
|
invite_menuitem.set_submenu(invite_to_submenu)
|
||||||
|
invite_to_new_room_menuitem = gtk.ImageMenuItem(_('_New Group Chat'))
|
||||||
|
icon = gtk.image_new_from_stock(gtk.STOCK_NEW, gtk.ICON_SIZE_MENU)
|
||||||
|
invite_to_new_room_menuitem.set_image(icon)
|
||||||
|
if len(contact_list) > 1: # several resources
|
||||||
|
invite_to_new_room_menuitem.set_submenu(self.build_resources_submenu(
|
||||||
|
contact_list, account, self.on_invite_to_new_room))
|
||||||
|
else:
|
||||||
|
invite_to_new_room_menuitem.connect('activate',
|
||||||
|
self.on_invite_to_new_room, list_)
|
||||||
|
# transform None in 'jabber'
|
||||||
|
c_t = contacts_transport or 'jabber'
|
||||||
|
muc_jid = {}
|
||||||
|
for account in connected_accounts:
|
||||||
|
for t in gajim.connections[account].muc_jid:
|
||||||
|
muc_jid[t] = gajim.connections[account].muc_jid[t]
|
||||||
|
if not muc_jid.has_key(c_t):
|
||||||
|
invite_to_new_room_menuitem.set_sensitive(False)
|
||||||
|
rooms = [] # a list of (room_jid, account) tuple
|
||||||
|
invite_to_submenu.append(invite_to_new_room_menuitem)
|
||||||
|
rooms = [] # a list of (room_jid, account) tuple
|
||||||
|
minimized_controls = []
|
||||||
|
for account in connected_accounts:
|
||||||
|
minimized_controls += \
|
||||||
|
gajim.interface.minimized_controls[account].values()
|
||||||
|
for gc_control in gajim.interface.msg_win_mgr.get_controls(
|
||||||
|
message_control.TYPE_GC) + minimized_controls:
|
||||||
|
acct = gc_control.account
|
||||||
|
room_jid = gc_control.room_jid
|
||||||
|
if gajim.gc_connected[acct].has_key(room_jid) and \
|
||||||
|
gajim.gc_connected[acct][room_jid] and \
|
||||||
|
contacts_transport == gajim.get_transport_name_from_jid(room_jid):
|
||||||
|
rooms.append((room_jid, acct))
|
||||||
|
if len(rooms):
|
||||||
|
item = gtk.SeparatorMenuItem() # separator
|
||||||
|
invite_to_submenu.append(item)
|
||||||
|
for (room_jid, account) in rooms:
|
||||||
|
menuitem = gtk.MenuItem(room_jid.split('@')[0])
|
||||||
|
if len(contact_list) > 1: # several resources
|
||||||
|
menuitem.set_submenu(self.build_resources_submenu(
|
||||||
|
contact_list, account, self.on_invite_to_new_room, room_jid,
|
||||||
|
account))
|
||||||
|
else:
|
||||||
|
menuitem.connect('activate', self.on_invite_to_room, list_,
|
||||||
|
room_jid, account)
|
||||||
|
invite_to_submenu.append(menuitem)
|
||||||
|
|
||||||
def make_contact_menu(self, event, iter):
|
def make_contact_menu(self, event, iter):
|
||||||
'''Make contact\'s popup menu'''
|
'''Make contact\'s popup menu'''
|
||||||
model = self.tree.get_model()
|
model = self.tree.get_model()
|
||||||
|
@ -2205,6 +2303,8 @@ class RosterWindow:
|
||||||
if muc_icon:
|
if muc_icon:
|
||||||
invite_menuitem.set_image(muc_icon)
|
invite_menuitem.set_image(muc_icon)
|
||||||
|
|
||||||
|
self.build_invite_submenu(invite_menuitem, [(contact, account)])
|
||||||
|
|
||||||
# Subscription submenu
|
# Subscription submenu
|
||||||
subscription_menuitem = xml.get_widget('subscription_menuitem')
|
subscription_menuitem = xml.get_widget('subscription_menuitem')
|
||||||
send_auth_menuitem, ask_auth_menuitem, revoke_auth_menuitem =\
|
send_auth_menuitem, ask_auth_menuitem, revoke_auth_menuitem =\
|
||||||
|
@ -2218,31 +2318,6 @@ class RosterWindow:
|
||||||
|
|
||||||
contacts = gajim.contacts.get_contacts(account, jid)
|
contacts = gajim.contacts.get_contacts(account, jid)
|
||||||
|
|
||||||
# Invite to
|
|
||||||
invite_to_submenu = gtk.Menu()
|
|
||||||
invite_menuitem.set_submenu(invite_to_submenu)
|
|
||||||
invite_to_new_room_menuitem = gtk.ImageMenuItem(_('_New Group Chat'))
|
|
||||||
icon = gtk.image_new_from_stock(gtk.STOCK_NEW, gtk.ICON_SIZE_MENU)
|
|
||||||
invite_to_new_room_menuitem.set_image(icon)
|
|
||||||
contact_transport = gajim.get_transport_name_from_jid(contact.jid)
|
|
||||||
t = contact_transport or 'jabber' # transform None in 'jabber'
|
|
||||||
if not gajim.connections[account].muc_jid.has_key(t):
|
|
||||||
invite_menuitem.set_sensitive(False)
|
|
||||||
invite_to_submenu.append(invite_to_new_room_menuitem)
|
|
||||||
rooms = [] # a list of (room_jid, account) tuple
|
|
||||||
for gc_control in gajim.interface.msg_win_mgr.get_controls(
|
|
||||||
message_control.TYPE_GC) + \
|
|
||||||
gajim.interface.minimized_controls[account].values():
|
|
||||||
acct = gc_control.account
|
|
||||||
room_jid = gc_control.room_jid
|
|
||||||
if gajim.gc_connected[acct].has_key(room_jid) and \
|
|
||||||
gajim.gc_connected[acct][room_jid] and \
|
|
||||||
contact_transport == gajim.get_transport_name_from_jid(room_jid):
|
|
||||||
rooms.append((room_jid, acct))
|
|
||||||
if len(rooms):
|
|
||||||
item = gtk.SeparatorMenuItem() # separator
|
|
||||||
invite_to_submenu.append(item)
|
|
||||||
|
|
||||||
# One or several resource, we do the same for send_custom_status
|
# One or several resource, we do the same for send_custom_status
|
||||||
status_menuitems = gtk.Menu()
|
status_menuitems = gtk.Menu()
|
||||||
send_custom_status_menuitem.set_submenu(status_menuitems)
|
send_custom_status_menuitem.set_submenu(status_menuitems)
|
||||||
|
@ -2258,46 +2333,12 @@ class RosterWindow:
|
||||||
status_menuitem.set_image(icon)
|
status_menuitem.set_image(icon)
|
||||||
status_menuitems.append(status_menuitem)
|
status_menuitems.append(status_menuitem)
|
||||||
if len(contacts) > 1: # several resources
|
if len(contacts) > 1: # several resources
|
||||||
def resources_submenu(action, room_jid = None, room_account = None):
|
start_chat_menuitem.set_submenu(self.build_resources_submenu(contacts,
|
||||||
''' Build a submenu with contact\'s resources.
|
account, self.on_open_chat_window))
|
||||||
room_jid and room_account are for action self.on_invite_to_room '''
|
send_file_menuitem.set_submenu(self.build_resources_submenu(contacts,
|
||||||
sub_menu = gtk.Menu()
|
account, self.on_send_file_menuitem_activate))
|
||||||
|
execute_command_menuitem.set_submenu(self.build_resources_submenu(
|
||||||
iconset = gajim.config.get('iconset')
|
contacts, account, self.on_execute_command))
|
||||||
if not iconset:
|
|
||||||
iconset = gajim.config.DEFAULT_ICONSET
|
|
||||||
path = os.path.join(helpers.get_iconset_path(iconset), '16x16')
|
|
||||||
for c in contacts:
|
|
||||||
# icon MUST be different instance for every item
|
|
||||||
state_images = self.load_iconset(path)
|
|
||||||
item = gtk.ImageMenuItem('%s (%s)' % (c.resource,
|
|
||||||
str(c.priority)))
|
|
||||||
icon_name = helpers.get_icon_name_to_show(c, account)
|
|
||||||
icon = state_images[icon_name]
|
|
||||||
item.set_image(icon)
|
|
||||||
sub_menu.append(item)
|
|
||||||
if action == self.on_invite_to_room:
|
|
||||||
item.connect('activate', action, [(c, account)],
|
|
||||||
room_jid, room_account, c.resource)
|
|
||||||
elif action == self.on_invite_to_new_room:
|
|
||||||
item.connect('activate', action, [(c, account)], c.resource)
|
|
||||||
else: # start_chat, execute_command
|
|
||||||
item.connect('activate', action, c, account, c.resource)
|
|
||||||
return sub_menu
|
|
||||||
|
|
||||||
start_chat_menuitem.set_submenu(resources_submenu(
|
|
||||||
self.on_open_chat_window))
|
|
||||||
send_file_menuitem.set_submenu(resources_submenu(
|
|
||||||
self.on_send_file_menuitem_activate))
|
|
||||||
execute_command_menuitem.set_submenu(resources_submenu(
|
|
||||||
self.on_execute_command))
|
|
||||||
invite_to_new_room_menuitem.set_submenu(resources_submenu(
|
|
||||||
self.on_invite_to_new_room))
|
|
||||||
for (room_jid, room_account) in rooms:
|
|
||||||
menuitem = gtk.MenuItem(room_jid.split('@')[0])
|
|
||||||
menuitem.set_submenu(resources_submenu(self.on_invite_to_room,
|
|
||||||
room_jid, room_account))
|
|
||||||
invite_to_submenu.append(menuitem)
|
|
||||||
|
|
||||||
else: # one resource
|
else: # one resource
|
||||||
start_chat_menuitem.connect('activate',
|
start_chat_menuitem.connect('activate',
|
||||||
|
@ -2311,16 +2352,6 @@ class RosterWindow:
|
||||||
our_jid_other_resource = contact.resource
|
our_jid_other_resource = contact.resource
|
||||||
# Else this var is useless but harmless in next connect calls
|
# Else this var is useless but harmless in next connect calls
|
||||||
|
|
||||||
invite_to_new_room_menuitem.connect('activate',
|
|
||||||
self.on_invite_to_new_room, [(contact, account)],
|
|
||||||
our_jid_other_resource)
|
|
||||||
for (room_jid, room_account) in rooms:
|
|
||||||
menuitem = gtk.MenuItem(room_jid.split('@')[0])
|
|
||||||
menuitem.connect('activate', self.on_invite_to_room,
|
|
||||||
[(contact, account)], room_jid, room_account,
|
|
||||||
our_jid_other_resource)
|
|
||||||
invite_to_submenu.append(menuitem)
|
|
||||||
|
|
||||||
if contact.resource:
|
if contact.resource:
|
||||||
send_file_menuitem.connect('activate',
|
send_file_menuitem.connect('activate',
|
||||||
self.on_send_file_menuitem_activate, contact, account)
|
self.on_send_file_menuitem_activate, contact, account)
|
||||||
|
@ -2464,24 +2495,14 @@ class RosterWindow:
|
||||||
model = self.tree.get_model()
|
model = self.tree.get_model()
|
||||||
list_ = [] # list of (jid, account) tuples
|
list_ = [] # list of (jid, account) tuples
|
||||||
one_account_offline = False
|
one_account_offline = False
|
||||||
connected_accounts = []
|
|
||||||
contacts_transport = -1
|
|
||||||
# -1 is at start, False when not from the same, None when jabber
|
|
||||||
is_blocked = True
|
is_blocked = True
|
||||||
for iter in iters:
|
for iter in iters:
|
||||||
jid = model[iter][C_JID].decode('utf-8')
|
jid = model[iter][C_JID].decode('utf-8')
|
||||||
account = model[iter][C_ACCOUNT].decode('utf-8')
|
account = model[iter][C_ACCOUNT].decode('utf-8')
|
||||||
if gajim.connections[account].connected < 2:
|
if gajim.connections[account].connected < 2:
|
||||||
one_account_offline = True
|
one_account_offline = True
|
||||||
elif not account in connected_accounts:
|
|
||||||
connected_accounts.append(account)
|
|
||||||
contact = gajim.contacts.get_contact_with_highest_priority(account,
|
contact = gajim.contacts.get_contact_with_highest_priority(account,
|
||||||
jid)
|
jid)
|
||||||
transport = gajim.get_transport_name_from_jid(contact.jid)
|
|
||||||
if contacts_transport == -1:
|
|
||||||
contacts_transport = transport
|
|
||||||
if contacts_transport != transport:
|
|
||||||
contacts_transport = False
|
|
||||||
if jid not in gajim.connections[account].blocked_contacts:
|
if jid not in gajim.connections[account].blocked_contacts:
|
||||||
is_blocked = False
|
is_blocked = False
|
||||||
list_.append((contact, account))
|
list_.append((contact, account))
|
||||||
|
@ -2508,44 +2529,7 @@ class RosterWindow:
|
||||||
if muc_icon:
|
if muc_icon:
|
||||||
invite_item.set_image(muc_icon)
|
invite_item.set_image(muc_icon)
|
||||||
|
|
||||||
if contacts_transport == False:
|
self.build_invite_submenu(invite_item, list_)
|
||||||
# they are not all from the same transport
|
|
||||||
invite_item.set_sensitive(False)
|
|
||||||
else:
|
|
||||||
|
|
||||||
sub_menu = gtk.Menu()
|
|
||||||
menuitem = gtk.ImageMenuItem(_('_New group chat'))
|
|
||||||
icon = gtk.image_new_from_stock(gtk.STOCK_NEW, gtk.ICON_SIZE_MENU)
|
|
||||||
menuitem.set_image(icon)
|
|
||||||
menuitem.connect('activate', self.on_invite_to_new_room, list_)
|
|
||||||
muc_jid = {}
|
|
||||||
c_t = contacts_transport or 'jabber' # transform None in 'jabber'
|
|
||||||
for account in connected_accounts:
|
|
||||||
for t in gajim.connections[account].muc_jid:
|
|
||||||
muc_jid[t] = gajim.connections[account].muc_jid[t]
|
|
||||||
if not muc_jid.has_key(c_t):
|
|
||||||
menuitem.set_sensitive(False)
|
|
||||||
sub_menu.append(menuitem)
|
|
||||||
rooms = [] # a list of (room_jid, account) tuple
|
|
||||||
for gc_control in gajim.interface.msg_win_mgr.get_controls(
|
|
||||||
message_control.TYPE_GC) + \
|
|
||||||
gajim.interface.minimized_controls[account].values():
|
|
||||||
account = gc_control.account
|
|
||||||
room_jid = gc_control.room_jid
|
|
||||||
if gajim.gc_connected[account].has_key(room_jid) and \
|
|
||||||
gajim.gc_connected[account][room_jid] and \
|
|
||||||
contacts_transport == gajim.get_transport_name_from_jid(room_jid):
|
|
||||||
rooms.append((room_jid, account))
|
|
||||||
if len(rooms):
|
|
||||||
item = gtk.SeparatorMenuItem() # separator
|
|
||||||
sub_menu.append(item)
|
|
||||||
for (room_jid, account) in rooms:
|
|
||||||
menuitem = gtk.MenuItem(room_jid.split('@')[0])
|
|
||||||
menuitem.connect('activate', self.on_invite_to_room, list_,
|
|
||||||
room_jid, account)
|
|
||||||
sub_menu.append(menuitem)
|
|
||||||
|
|
||||||
invite_item.set_submenu(sub_menu)
|
|
||||||
menu.append(invite_item)
|
menu.append(invite_item)
|
||||||
|
|
||||||
item = gtk.SeparatorMenuItem() # separator
|
item = gtk.SeparatorMenuItem() # separator
|
||||||
|
@ -2702,7 +2686,7 @@ class RosterWindow:
|
||||||
maximize_menuitem = gtk.ImageMenuItem(_('_Maximize All'))
|
maximize_menuitem = gtk.ImageMenuItem(_('_Maximize All'))
|
||||||
icon = gtk.image_new_from_stock(gtk.STOCK_GOTO_TOP, gtk.ICON_SIZE_MENU)
|
icon = gtk.image_new_from_stock(gtk.STOCK_GOTO_TOP, gtk.ICON_SIZE_MENU)
|
||||||
maximize_menuitem.set_image(icon)
|
maximize_menuitem.set_image(icon)
|
||||||
maximize_menuitem.connect('activate', self.on_all_groupchat_maximized, \
|
maximize_menuitem.connect('activate', self.on_all_groupchat_maximized,\
|
||||||
list_)
|
list_)
|
||||||
menu.append(maximize_menuitem)
|
menu.append(maximize_menuitem)
|
||||||
else:
|
else:
|
||||||
|
@ -2726,6 +2710,15 @@ class RosterWindow:
|
||||||
group_message_to_all_item.connect('activate',
|
group_message_to_all_item.connect('activate',
|
||||||
self.on_send_single_message_menuitem_activate, account, list_)
|
self.on_send_single_message_menuitem_activate, account, list_)
|
||||||
|
|
||||||
|
# Invite to
|
||||||
|
invite_menuitem = gtk.ImageMenuItem(_('In_vite to'))
|
||||||
|
muc_icon = self.load_icon('muc_active')
|
||||||
|
if muc_icon:
|
||||||
|
invite_menuitem.set_image(muc_icon)
|
||||||
|
|
||||||
|
self.build_invite_submenu(invite_menuitem, list_online)
|
||||||
|
menu.append(invite_menuitem)
|
||||||
|
|
||||||
# Send Custom Status
|
# Send Custom Status
|
||||||
send_custom_status_menuitem = gtk.ImageMenuItem(_('Send Cus_tom Status'))
|
send_custom_status_menuitem = gtk.ImageMenuItem(_('Send Cus_tom Status'))
|
||||||
# add a special img for this menuitem
|
# add a special img for this menuitem
|
||||||
|
|
Loading…
Add table
Reference in a new issue