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 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)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,45 @@ 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,
 | 
			
		||||
                    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)
 | 
			
		||||
 | 
			
		||||
    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,
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue