show bookmarked rooms in invite to menu when possible. Fixes #4455

This commit is contained in:
Yann Leboulanger 2013-12-02 12:17:32 +01:00
parent 1b0406a814
commit 6e410b463b
3 changed files with 76 additions and 13 deletions

View File

@ -44,6 +44,7 @@ import config
import vcard
import cell_renderer_image
import dataforms_widget
import nbxmpp
from common import gajim
from common import helpers
@ -2509,9 +2510,13 @@ class GroupchatControl(ChatControlBase):
muc_icon = gtkgui_helpers.load_icon('muc_active')
if muc_icon:
item.set_image(muc_icon)
if c.jid and c.name != self.nick:
if jid and c.name != self.nick:
bookmarked = False
contact = gajim.contacts.get_contact(self.account, jid, c.resource)
if contact and contact.supports(nbxmpp.NS_CONFERENCE):
bookmarked=True
gui_menu_builder.build_invite_submenu(item, ((c, self.account),),
ignore_rooms=[self.room_jid])
ignore_rooms=[self.room_jid], show_bookmarked=bookmarked)
else:
item.set_sensitive(False)

View File

@ -26,7 +26,7 @@ import message_control
from common import gajim
from common import helpers
from nbxmpp.protocol import NS_COMMANDS, NS_FILE, NS_MUC, NS_ESESSION
from nbxmpp.protocol import NS_JINGLE_FILE_TRANSFER
from nbxmpp.protocol import NS_JINGLE_FILE_TRANSFER, NS_CONFERENCE
def build_resources_submenu(contacts, account, action, room_jid=None,
room_account=None, cap=None):
@ -63,7 +63,8 @@ def build_resources_submenu(contacts, account, action, room_jid=None,
return sub_menu
def build_invite_submenu(invite_menuitem, list_, ignore_rooms=[]):
def build_invite_submenu(invite_menuitem, list_, ignore_rooms=[],
show_bookmarked=False):
"""
list_ in a list of (contact, account)
"""
@ -151,7 +152,9 @@ def build_invite_submenu(invite_menuitem, list_, ignore_rooms=[]):
item = Gtk.SeparatorMenuItem.new() # separator
invite_to_submenu.append(item)
for (room_jid, account) in rooms:
menuitem = Gtk.MenuItem(room_jid.split('@')[0])
menuitem = Gtk.ImageMenuItem(room_jid.split('@')[0])
muc_active_icon = gtkgui_helpers.load_icon('muc_active')
menuitem.set_image(muc_active_icon)
if len(contact_list) > 1: # several resources
menuitem.set_submenu(build_resources_submenu(
contact_list, account, roster.on_invite_to_room, room_jid,
@ -163,9 +166,45 @@ def build_invite_submenu(invite_menuitem, list_, ignore_rooms=[]):
else:
resource = None
menuitem.connect('activate', roster.on_invite_to_room, list_,
room_jid, account, resource)
room_jid, account, resource)
invite_to_submenu.append(menuitem)
if not show_bookmarked:
return
rooms2 = [] # a list of (room_jid, account) tuple
r_jids = [] # list of room jids
for account in connected_accounts:
for room in gajim.connections[account].bookmarks:
r_jid = room['jid']
if r_jid in r_jids:
continue
if r_jid not in gajim.gc_connected[account] or not \
gajim.gc_connected[account][r_jid]:
rooms2.append((r_jid, account))
r_jids.append(r_jid)
if not rooms2:
return
item = Gtk.SeparatorMenuItem.new() # separator
invite_to_submenu.append(item)
for (room_jid, account) in rooms2:
menuitem = Gtk.ImageMenuItem(room_jid.split('@')[0])
muc_inactive_icon = gtkgui_helpers.load_icon('muc_inactive')
menuitem.set_image(muc_inactive_icon)
if len(contact_list) > 1: # several resources
menuitem.set_submenu(build_resources_submenu(
contact_list, account, roster.on_invite_to_room, room_jid,
account))
else:
# use resource if it's self contact
if contact.jid == gajim.get_jid_from_account(account):
resource = contact.resource
else:
resource = None
menuitem.connect('activate', roster.on_invite_to_room, list_,
room_jid, account, resource)
invite_to_submenu.append(menuitem)
def get_contact_menu(contact, account, use_multiple_contacts=True,
show_start_chat=True, show_encryption=False, show_buttonbar_items=True,
control=None, gc_contact=None, is_anonymous=True):
@ -403,9 +442,16 @@ control=None, gc_contact=None, is_anonymous=True):
# it's a pm and we don't know real JID
invite_menuitem.set_sensitive(False)
else:
build_invite_submenu(invite_menuitem, [(gc_contact, account)])
bookmarked = False
c_ = gajim.contacts.get_contact(account, gc_contact.jid,
gc_contact.resource)
if c_ and c_.supports(nbxmpp.NS_CONFERENCE):
bookmarked=True
build_invite_submenu(invite_menuitem, [(gc_contact, account)],
show_bookmarked=bookmarked)
else:
build_invite_submenu(invite_menuitem, [(contact, account)])
build_invite_submenu(invite_menuitem, [(contact, account)],
show_bookmarked=contact.supports(NS_CONFERENCE))
if gajim.account_is_disconnected(account):
invite_menuitem.set_sensitive(False)
@ -655,3 +701,4 @@ def get_transport_menu(contact, account):
menu.connect('selection-done', gtkgui_helpers.destroy_widget)
menu.show_all()
return menu

View File

@ -73,7 +73,7 @@ from common import dbus_support
if dbus_support.supported:
import dbus
from nbxmpp.protocol import NS_FILE, NS_ROSTERX
from nbxmpp.protocol import NS_FILE, NS_ROSTERX, NS_CONFERENCE
from common.pep import MOODS, ACTIVITIES
#(icon, name, type, jid, account, editable, second pixbuf)
@ -5740,9 +5740,10 @@ class RosterWindow:
group = model[titer][C_JID]
account = model[titer][C_ACCOUNT]
list_ = [] # list of (jid, account) tuples
list_online = [] # list of (jid, account) tuples
list_ = [] # list of (contact, account) tuples
list_online = [] # list of (contact, account) tuples
show_bookmarked = True
group = model[titer][C_JID]
for jid in gajim.contacts.get_jid_list(account):
contact = gajim.contacts.get_contact_with_highest_priority(account,
@ -5750,6 +5751,9 @@ class RosterWindow:
if group in contact.get_shown_groups():
if contact.show not in ('offline', 'error'):
list_online.append((contact, account))
# Check that all contacts support direct NUC invite
if not contact.supports(NS_CONFERENCE):
show_bookmarked = False
list_.append((contact, account))
menu = Gtk.Menu()
@ -5797,7 +5801,7 @@ class RosterWindow:
invite_menuitem.set_image(muc_icon)
gui_menu_builder.build_invite_submenu(invite_menuitem,
list_online)
list_online, show_bookmarked=show_bookmarked)
menu.append(invite_menuitem)
# Send Custom Status
@ -5947,6 +5951,12 @@ class RosterWindow:
account = None
break
account = current_account
show_bookmarked = True
for (contact, current_account) in list_:
# Check that all contacts support direct NUC invite
if not contact.supports(NS_CONFERENCE):
show_bookmarked = False
break
if account is not None:
send_group_message_item = Gtk.ImageMenuItem.new_with_mnemonic(
_('Send Group M_essage'))
@ -5962,7 +5972,8 @@ class RosterWindow:
if muc_icon:
invite_item.set_image(muc_icon)
gui_menu_builder.build_invite_submenu(invite_item, list_)
gui_menu_builder.build_invite_submenu(invite_item, list_,
show_bookmarked=show_bookmarked)
menu.append(invite_item)
item = Gtk.SeparatorMenuItem.new() # separator