diff --git a/src/dialogs.py b/src/dialogs.py
index 6f51d4a91..602e1346f 100644
--- a/src/dialogs.py
+++ b/src/dialogs.py
@@ -44,86 +44,97 @@ from common import helpers
class EditGroupsDialog:
'''Class for the edit group dialog window'''
- def __init__(self, user, account):
+ def __init__(self, list_):
+ '''list_ is a list of (contact, account) tuples'''
self.xml = gtkgui_helpers.get_glade('edit_groups_dialog.glade')
self.dialog = self.xml.get_widget('edit_groups_dialog')
self.dialog.set_transient_for(gajim.interface.roster.window)
- self.account = account
- self.user = user
+ self.list_ = list_
self.changes_made = False
self.list = self.xml.get_widget('groups_treeview')
- self.xml.get_widget('nickname_label').set_markup(
- _("Contact's name: %s") % user.get_shown_name())
- self.xml.get_widget('jid_label').set_markup(
- _('JID: %s') % user.jid)
-
+ if len(list_) == 1:
+ contact = list_[0][0]
+ self.xml.get_widget('nickname_label').set_markup(
+ _("Contact's name: %s") % contact.get_shown_name())
+ self.xml.get_widget('jid_label').set_markup(
+ _('JID: %s') % contact.jid)
+ else:
+ self.xml.get_widget('nickname_label').set_no_show_all(True)
+ self.xml.get_widget('nickname_label').hide()
+ self.xml.get_widget('jid_label').set_no_show_all(True)
+ self.xml.get_widget('jid_label').hide()
+
self.xml.signal_autoconnect(self)
self.init_list()
def run(self):
self.dialog.show_all()
if self.changes_made:
- gajim.connections[self.account].update_contact(self.user.jid,
- self.user.name, self.user.groups)
+ for (contact, account) in self.list_:
+ gajim.connections[account].update_contact(contact.jid, contact.name,
+ contact.groups)
def on_edit_groups_dialog_response(self, widget, response_id):
if response_id == gtk.RESPONSE_CLOSE:
self.dialog.destroy()
def update_contact(self):
- tag = gajim.contacts.get_metacontacts_tag(self.account, self.user.jid)
- if not tag:
- gajim.interface.roster.remove_contact(self.user, self.account)
- gajim.interface.roster.add_contact_to_roster(self.user.jid,
- self.account)
- gajim.connections[self.account].update_contact(self.user.jid,
- self.user.name, self.user.groups)
- return
- all_jid = gajim.contacts.get_metacontacts_jids(tag)
- for _account in all_jid:
- if not gajim.interface.roster.regroup and _account != self.account:
+ for (contact, account) in self.list_:
+ tag = gajim.contacts.get_metacontacts_tag(account, contact.jid)
+ if not tag:
+ gajim.interface.roster.remove_contact(contact, account)
+ gajim.interface.roster.add_contact_to_roster(contact.jid, account)
+ gajim.connections[account].update_contact(contact.jid, contact.name,
+ contact.groups)
continue
- for _jid in all_jid[_account]:
- c = gajim.contacts.get_first_contact_from_jid(_account, _jid)
- if not c:
+ all_jid = gajim.contacts.get_metacontacts_jids(tag)
+ for _account in all_jid:
+ if not gajim.interface.roster.regroup and _account != account:
continue
- gajim.interface.roster.remove_contact(c, _account)
- gajim.interface.roster.add_contact_to_roster(_jid, _account)
- gajim.connections[_account].update_contact(_jid, c.name, c.groups)
+ for _jid in all_jid[_account]:
+ c = gajim.contacts.get_first_contact_from_jid(_account, _jid)
+ if not c:
+ continue
+ gajim.interface.roster.remove_contact(c, _account)
+ gajim.interface.roster.add_contact_to_roster(_jid, _account)
+ gajim.connections[_account].update_contact(_jid, c.name,
+ c.groups)
def remove_group(self, group):
- '''add group group to self.user and all his brothers'''
- tag = gajim.contacts.get_metacontacts_tag(self.account, self.user.jid)
- if not tag:
- if group in self.user.groups:
- self.user.groups.remove(group)
- return
- all_jid = gajim.contacts.get_metacontacts_jids(tag)
- for _account in all_jid:
- if not gajim.interface.roster.regroup and _account != self.account:
+ '''remove group group from all contacts and all their brothers'''
+ for (contact, account) in self.list_:
+ tag = gajim.contacts.get_metacontacts_tag(account, contact.jid)
+ if not tag:
+ if group in contact.groups:
+ contact.groups.remove(group)
continue
- for _jid in all_jid[_account]:
- contacts = gajim.contacts.get_contact(_account, _jid)
- for contact in contacts:
- if group in contact.groups:
- contact.groups.remove(group)
+ all_jid = gajim.contacts.get_metacontacts_jids(tag)
+ for _account in all_jid:
+ if not gajim.interface.roster.regroup and _account != account:
+ continue
+ for _jid in all_jid[_account]:
+ contacts = gajim.contacts.get_contact(_account, _jid)
+ for c in contacts:
+ if group in c.groups:
+ c.groups.remove(group)
def add_group(self, group):
- '''add group group to self.user and all his brothers'''
- tag = gajim.contacts.get_metacontacts_tag(self.account, self.user.jid)
- if not tag:
- if group not in self.user.groups:
- self.user.groups.append(group)
- return
- all_jid = gajim.contacts.get_metacontacts_jids(tag)
- for _account in all_jid:
- if not gajim.interface.roster.regroup and _account != self.account:
+ '''add group group to all contacts and all their brothers'''
+ for (contact, account) in self.list_:
+ tag = gajim.contacts.get_metacontacts_tag(account, contact.jid)
+ if not tag:
+ if group not in contact.groups:
+ contact.groups.append(group)
continue
- for _jid in all_jid[_account]:
- contacts = gajim.contacts.get_contact(_account, _jid)
- for contact in contacts:
- if not group in contact.groups:
- contact.groups.append(group)
+ all_jid = gajim.contacts.get_metacontacts_jids(tag)
+ for _account in all_jid:
+ if not gajim.interface.roster.regroup and _account != account:
+ continue
+ for _jid in all_jid[_account]:
+ contacts = gajim.contacts.get_contact(_account, _jid)
+ for c in contacts:
+ if not group in c.groups:
+ c.groups.append(group)
def on_add_button_clicked(self, widget):
group = self.xml.get_widget('group_entry').get_text().decode('utf-8')
@@ -145,7 +156,11 @@ class EditGroupsDialog:
def group_toggled_cb(self, cell, path):
self.changes_made = True
model = self.list.get_model()
- model[path][1] = not model[path][1]
+ if model[path][2]:
+ model[path][2] = False
+ model[path][1] = True
+ else:
+ model[path][1] = not model[path][1]
group = model[path][0].decode('utf-8')
if model[path][1]:
self.add_group(group)
@@ -154,23 +169,39 @@ class EditGroupsDialog:
self.update_contact()
def init_list(self):
- store = gtk.ListStore(str, bool)
+ store = gtk.ListStore(str, bool, bool)
self.list.set_model(store)
for column in self.list.get_columns(): # Clear treeview when re-drawing
self.list.remove_column(column)
- groups = [] # Store accounts in a list so we can sort them
- for g in gajim.groups[self.account].keys():
- if g in helpers.special_groups:
- continue
- in_group = False
- if g in self.user.groups:
- in_group = True
- groups.append([g, in_group])
- groups.sort()
- for group in groups:
+ accounts = []
+ # Store groups in a list so we can sort them and the number of contacts in
+ # it
+ groups = {}
+ for (contact, account) in self.list_:
+ if account not in accounts:
+ accounts.append(account)
+ for g in gajim.groups[account].keys():
+ if g in helpers.special_groups:
+ continue
+ if g in groups:
+ continue
+ groups[g] = 0
+ for g in contact.groups:
+ groups[g] += 1
+ group_list = groups.keys()
+ group_list.sort()
+ for group in group_list:
iter = store.append()
- store.set(iter, 0, group[0]) # Group name
- store.set(iter, 1, group[1]) # In group boolean
+ store.set(iter, 0, group) # Group name
+ if groups[group] == 0:
+ store.set(iter, 1, False)
+ else:
+ store.set(iter, 1, True)
+ if groups[group] == len(self.list_):
+ # all contacts are in this group
+ store.set(iter, 2, False)
+ else:
+ store.set(iter, 2, True)
column = gtk.TreeViewColumn(_('Group'))
column.set_expand(True)
self.list.append_column(column)
@@ -185,7 +216,7 @@ class EditGroupsDialog:
column.pack_start(renderer)
renderer.set_property('activatable', True)
renderer.connect('toggled', self.group_toggled_cb)
- column.set_attributes(renderer, active = 1)
+ column.set_attributes(renderer, active = 1, inconsistent = 2)
class PassphraseDialog:
'''Class for Passphrase dialog'''
diff --git a/src/roster_window.py b/src/roster_window.py
index a93072dc2..6642d7731 100644
--- a/src/roster_window.py
+++ b/src/roster_window.py
@@ -1290,8 +1290,8 @@ class RosterWindow:
keys_str += jid + ' ' + keys[jid] + ' '
gajim.config.set_per('accounts', account, 'attached_gpg_keys', keys_str)
- def on_edit_groups(self, widget, contact, account):
- dlg = dialogs.EditGroupsDialog(contact, account)
+ def on_edit_groups(self, widget, list_):
+ dlg = dialogs.EditGroupsDialog(list_)
dlg.run()
def on_history(self, widget, contact, account):
@@ -1444,8 +1444,8 @@ class RosterWindow:
assign_openpgp_key_menuitem.set_no_show_all(False)
add_to_roster_menuitem.hide()
add_to_roster_menuitem.set_no_show_all(True)
- edit_groups_menuitem.connect('activate', self.on_edit_groups, contact,
- account)
+ edit_groups_menuitem.connect('activate', self.on_edit_groups, [(
+ contact,account)])
if gajim.config.get('usegpg'):
assign_openpgp_key_menuitem.connect('activate',
@@ -1592,6 +1592,10 @@ class RosterWindow:
invite_item.set_submenu(sub_menu)
menu.append(invite_item)
+ edit_groups_item = gtk.MenuItem(_('Edit _Groups'))
+ menu.append(edit_groups_item)
+ edit_groups_item.connect('activate', self.on_edit_groups, list_)
+
# unsensitive if one account is not connected
if one_account_offline:
remove_item.set_sensitive(False)