show bookmarked rooms in invite to menu when possible. Fixes #4455
This commit is contained in:
parent
1b0406a814
commit
6e410b463b
3 changed files with 76 additions and 13 deletions
|
@ -44,6 +44,7 @@ import config
|
||||||
import vcard
|
import vcard
|
||||||
import cell_renderer_image
|
import cell_renderer_image
|
||||||
import dataforms_widget
|
import dataforms_widget
|
||||||
|
import nbxmpp
|
||||||
|
|
||||||
from common import gajim
|
from common import gajim
|
||||||
from common import helpers
|
from common import helpers
|
||||||
|
@ -2509,9 +2510,13 @@ class GroupchatControl(ChatControlBase):
|
||||||
muc_icon = gtkgui_helpers.load_icon('muc_active')
|
muc_icon = gtkgui_helpers.load_icon('muc_active')
|
||||||
if muc_icon:
|
if muc_icon:
|
||||||
item.set_image(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),),
|
gui_menu_builder.build_invite_submenu(item, ((c, self.account),),
|
||||||
ignore_rooms=[self.room_jid])
|
ignore_rooms=[self.room_jid], show_bookmarked=bookmarked)
|
||||||
else:
|
else:
|
||||||
item.set_sensitive(False)
|
item.set_sensitive(False)
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,7 @@ import message_control
|
||||||
from common import gajim
|
from common import gajim
|
||||||
from common import helpers
|
from common import helpers
|
||||||
from nbxmpp.protocol import NS_COMMANDS, NS_FILE, NS_MUC, NS_ESESSION
|
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,
|
def build_resources_submenu(contacts, account, action, room_jid=None,
|
||||||
room_account=None, cap=None):
|
room_account=None, cap=None):
|
||||||
|
@ -63,7 +63,8 @@ def build_resources_submenu(contacts, account, action, room_jid=None,
|
||||||
|
|
||||||
return sub_menu
|
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)
|
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
|
item = Gtk.SeparatorMenuItem.new() # separator
|
||||||
invite_to_submenu.append(item)
|
invite_to_submenu.append(item)
|
||||||
for (room_jid, account) in rooms:
|
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
|
if len(contact_list) > 1: # several resources
|
||||||
menuitem.set_submenu(build_resources_submenu(
|
menuitem.set_submenu(build_resources_submenu(
|
||||||
contact_list, account, roster.on_invite_to_room, room_jid,
|
contact_list, account, roster.on_invite_to_room, room_jid,
|
||||||
|
@ -163,9 +166,45 @@ def build_invite_submenu(invite_menuitem, list_, ignore_rooms=[]):
|
||||||
else:
|
else:
|
||||||
resource = None
|
resource = None
|
||||||
menuitem.connect('activate', roster.on_invite_to_room, list_,
|
menuitem.connect('activate', roster.on_invite_to_room, list_,
|
||||||
room_jid, account, resource)
|
room_jid, account, resource)
|
||||||
invite_to_submenu.append(menuitem)
|
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,
|
def get_contact_menu(contact, account, use_multiple_contacts=True,
|
||||||
show_start_chat=True, show_encryption=False, show_buttonbar_items=True,
|
show_start_chat=True, show_encryption=False, show_buttonbar_items=True,
|
||||||
control=None, gc_contact=None, is_anonymous=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
|
# it's a pm and we don't know real JID
|
||||||
invite_menuitem.set_sensitive(False)
|
invite_menuitem.set_sensitive(False)
|
||||||
else:
|
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:
|
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):
|
if gajim.account_is_disconnected(account):
|
||||||
invite_menuitem.set_sensitive(False)
|
invite_menuitem.set_sensitive(False)
|
||||||
|
@ -655,3 +701,4 @@ def get_transport_menu(contact, account):
|
||||||
menu.connect('selection-done', gtkgui_helpers.destroy_widget)
|
menu.connect('selection-done', gtkgui_helpers.destroy_widget)
|
||||||
menu.show_all()
|
menu.show_all()
|
||||||
return menu
|
return menu
|
||||||
|
|
||||||
|
|
|
@ -73,7 +73,7 @@ from common import dbus_support
|
||||||
if dbus_support.supported:
|
if dbus_support.supported:
|
||||||
import dbus
|
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
|
from common.pep import MOODS, ACTIVITIES
|
||||||
|
|
||||||
#(icon, name, type, jid, account, editable, second pixbuf)
|
#(icon, name, type, jid, account, editable, second pixbuf)
|
||||||
|
@ -5740,9 +5740,10 @@ class RosterWindow:
|
||||||
group = model[titer][C_JID]
|
group = model[titer][C_JID]
|
||||||
account = model[titer][C_ACCOUNT]
|
account = model[titer][C_ACCOUNT]
|
||||||
|
|
||||||
list_ = [] # list of (jid, account) tuples
|
list_ = [] # list of (contact, account) tuples
|
||||||
list_online = [] # list of (jid, account) tuples
|
list_online = [] # list of (contact, account) tuples
|
||||||
|
|
||||||
|
show_bookmarked = True
|
||||||
group = model[titer][C_JID]
|
group = model[titer][C_JID]
|
||||||
for jid in gajim.contacts.get_jid_list(account):
|
for jid in gajim.contacts.get_jid_list(account):
|
||||||
contact = gajim.contacts.get_contact_with_highest_priority(account,
|
contact = gajim.contacts.get_contact_with_highest_priority(account,
|
||||||
|
@ -5750,6 +5751,9 @@ class RosterWindow:
|
||||||
if group in contact.get_shown_groups():
|
if group in contact.get_shown_groups():
|
||||||
if contact.show not in ('offline', 'error'):
|
if contact.show not in ('offline', 'error'):
|
||||||
list_online.append((contact, account))
|
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))
|
list_.append((contact, account))
|
||||||
menu = Gtk.Menu()
|
menu = Gtk.Menu()
|
||||||
|
|
||||||
|
@ -5797,7 +5801,7 @@ class RosterWindow:
|
||||||
invite_menuitem.set_image(muc_icon)
|
invite_menuitem.set_image(muc_icon)
|
||||||
|
|
||||||
gui_menu_builder.build_invite_submenu(invite_menuitem,
|
gui_menu_builder.build_invite_submenu(invite_menuitem,
|
||||||
list_online)
|
list_online, show_bookmarked=show_bookmarked)
|
||||||
menu.append(invite_menuitem)
|
menu.append(invite_menuitem)
|
||||||
|
|
||||||
# Send Custom Status
|
# Send Custom Status
|
||||||
|
@ -5947,6 +5951,12 @@ class RosterWindow:
|
||||||
account = None
|
account = None
|
||||||
break
|
break
|
||||||
account = current_account
|
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:
|
if account is not None:
|
||||||
send_group_message_item = Gtk.ImageMenuItem.new_with_mnemonic(
|
send_group_message_item = Gtk.ImageMenuItem.new_with_mnemonic(
|
||||||
_('Send Group M_essage'))
|
_('Send Group M_essage'))
|
||||||
|
@ -5962,7 +5972,8 @@ class RosterWindow:
|
||||||
if muc_icon:
|
if muc_icon:
|
||||||
invite_item.set_image(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)
|
menu.append(invite_item)
|
||||||
|
|
||||||
item = Gtk.SeparatorMenuItem.new() # separator
|
item = Gtk.SeparatorMenuItem.new() # separator
|
||||||
|
|
Loading…
Add table
Reference in a new issue