Author: asterix
Date: 2006-06-28 09:27:40 +0200 (Wed, 28 Jun 2006)
New Revision: 6518
Modified:
trunk/src/dialogs.py
trunk/src/roster_window.py
Log:
* meta contacts over accounts
* DND a contact to another group asks to add it in this group
Fixes #1515
Modified: trunk/src/dialogs.py
===================================================================
--- trunk/src/dialogs.py 2006-06-27 23:12:14 UTC (rev 6517)
+++ trunk/src/dialogs.py 2006-06-28 07:27:40 UTC (rev 6518)
@@ -80,6 +80,8 @@
return
all_jid = gajim.contacts.get_metacontacts_jids(tag)
for _account in all_jid:
+ if not gajim.interface.roster.regroup and _account != self.account:
+ continue
for _jid in all_jid[_account]:
c = gajim.contacts.get_first_contact_from_jid(_account, _jid)
if not c:
@@ -97,6 +99,8 @@
return
all_jid = gajim.contacts.get_metacontacts_jids(tag)
for _account in all_jid:
+ if not gajim.interface.roster.regroup and _account != self.account:
+ continue
for _jid in all_jid[_account]:
contacts = gajim.contacts.get_contact(_account, _jid)
for contact in contacts:
@@ -112,6 +116,8 @@
return
all_jid = gajim.contacts.get_metacontacts_jids(tag)
for _account in all_jid:
+ if not gajim.interface.roster.regroup and _account != self.account:
+ continue
for _jid in all_jid[_account]:
contacts = gajim.contacts.get_contact(_account, _jid)
for contact in contacts:
@@ -355,7 +361,8 @@
class AddNewContactWindow:
'''Class for AddNewContactWindow'''
- def __init__(self, account = None, jid = None, user_nick = None):
+ def __init__(self, account = None, jid = None, user_nick = None,
+ group = None):
self.account = account
if account == None:
# fill accounts with active accounts
@@ -433,11 +440,15 @@
liststore = gtk.ListStore(str)
self.group_comboboxentry.set_model(liststore)
group_names = []
+ i = 0
for acct in accounts:
for g in gajim.groups[acct].keys():
if g not in helpers.special_groups and g not in group_names:
group_names.append(g)
self.group_comboboxentry.append_text(g)
+ if group == g:
+ self.group_comboboxentry.set_active(i)
+ i += 1
if not jid_agents:
# There are no transports, so hide the protocol combobox and label
Modified: trunk/src/roster_window.py
===================================================================
--- trunk/src/roster_window.py 2006-06-27 23:12:14 UTC (rev 6517)
+++ trunk/src/roster_window.py 2006-06-28 07:27:40 UTC (rev 6518)
@@ -237,9 +237,8 @@
if family:
for data in family:
_account = data['account']
- #XXX When we support metacontacts from different servers, make
- # sure that loop from #1953 is fixed and remove next 2 lines!
- if _account != account:
+ # Metacontacts over different accounts only in merged mode
+ if _account != account and not self.regroup:
continue
_jid = data['jid']
@@ -475,15 +474,18 @@
if icon_name in ('error', 'offline'):
# get the icon from the first child as they are sorted by show
child_jid = model[child_iter][C_JID].decode('utf-8')
+ child_account = model[child_iter][C_ACCOUNT].decode('utf-8')
child_contact = gajim.contacts.get_contact_with_highest_priority(
- account, child_jid)
- child_icon_name = helpers.get_icon_name_to_show(child_contact, account)
+ child_account, child_jid)
+ child_icon_name = helpers.get_icon_name_to_show(child_contact,
+ child_account)
if child_icon_name not in ('error', 'not in roster'):
icon_name = child_icon_name
while child_iter:
# a child has awaiting messages ?
child_jid = model[child_iter][C_JID].decode('utf-8')
- if gajim.awaiting_events[account].has_key(child_jid):
+ child_account = model[child_iter][C_ACCOUNT].decode('utf-8')
+ if gajim.awaiting_events[child_account].has_key(child_jid):
icon_name = 'message'
break
child_iter = model.iter_next(child_iter)
@@ -3032,30 +3034,32 @@
data = model[iter][C_JID]
selection.set(selection.target, 8, data)
- def on_drop_in_contact(self, widget, account, c_source, c_dest,
- was_big_brother, context, etime):
+ def on_drop_in_contact(self, widget, account_source, c_source, account_dest,
+ c_dest, was_big_brother, context, etime):
# children must take the new tag too, so remember old tag
- old_tag = gajim.contacts.get_metacontacts_tag(account, c_source.jid)
+ old_tag = gajim.contacts.get_metacontacts_tag(account_source,
+ c_source.jid)
# remove the source row
- self.remove_contact(c_source, account)
+ self.remove_contact(c_source, account_source)
# brother inherite big brother groups
c_source.groups = []
for g in c_dest.groups:
c_source.groups.append(g)
- gajim.contacts.add_metacontact(account, c_dest.jid, account, c_source.jid)
+ gajim.contacts.add_metacontact(account_dest, c_dest.jid, account_source,
+ c_source.jid)
if was_big_brother:
# add brothers too
all_jid = gajim.contacts.get_metacontacts_jids(old_tag)
for _account in all_jid:
for _jid in all_jid[_account]:
- gajim.contacts.add_metacontact(account, c_dest.jid, _account,
- _jid)
+ gajim.contacts.add_metacontact(account_dest, c_dest.jid,
+ _account, _jid)
_c = gajim.contacts.get_first_contact_from_jid(_account, _jid)
self.remove_contact(_c, _account)
self.add_contact_to_roster(_jid, _account)
self.draw_contact(_jid, _account)
- self.add_contact_to_roster(c_source.jid, account)
- self.draw_contact(c_dest.jid, account)
+ self.add_contact_to_roster(c_source.jid, account_source)
+ self.draw_contact(c_dest.jid, account_dest)
context.finish(True, True, etime)
@@ -3104,10 +3108,10 @@
iter_dest = model.get_iter(path_dest)
type_dest = model[iter_dest][C_TYPE].decode('utf-8')
jid_dest = model[iter_dest][C_JID].decode('utf-8')
- account = model[iter_dest][C_ACCOUNT].decode('utf-8')
+ account_dest = model[iter_dest][C_ACCOUNT].decode('utf-8')
# if account is not connected, do nothing
- if gajim.connections[account].connected < 2:
+ if gajim.connections[account_dest].connected < 2:
return
if info == self.TARGET_TYPE_URI_LIST:
@@ -3116,15 +3120,15 @@
return
if type_dest != 'contact':
return
- c_dest = gajim.contacts.get_contact_with_highest_priority(account,
+ c_dest = gajim.contacts.get_contact_with_highest_priority(account_dest,
jid_dest)
uri = data.strip()
uri_splitted = uri.split() # we may have more than one file dropped
for uri in uri_splitted:
path = helpers.get_file_path_from_dnd_dropped_uri(uri)
if os.path.isfile(path): # is it file?
- gajim.interface.instances['file_transfers'].send_file(account,
- c_dest, path)
+ gajim.interface.instances['file_transfers'].send_file(
+ account_dest, c_dest, path)
return
if position == gtk.TREE_VIEW_DROP_BEFORE and len(path_dest) == 2:
@@ -3133,19 +3137,11 @@
iter_source = treeview.get_selection().get_selected()[1]
path_source = model.get_path(iter_source)
type_source = model[iter_source][C_TYPE]
- if type_dest == 'account': # dropped on an account
- return
+ account_source = model[iter_source][C_ACCOUNT].decode('utf-8')
if type_source != 'contact': # source is not a contact
return
- source_account = model[iter_source][C_ACCOUNT].decode('utf-8')
- disable_meta = False
- if account != source_account: # dropped in another account
- if self.regroup:
- # in merge mode it is ok to change group, but disable meta
- account = source_account
- disable_meta = True
- else:
- return
+ if type_dest == 'account' and account_source == account_dest:
+ return
it = iter_source
while model[it][C_TYPE] == 'contact':
it = model.iter_parent(it)
@@ -3154,36 +3150,47 @@
if grp_source in helpers.special_groups:
return
jid_source = data.decode('utf-8')
- c_source = gajim.contacts.get_contact_with_highest_priority(account,
- jid_source)
+ c_source = gajim.contacts.get_contact_with_highest_priority(
+ account_source, jid_source)
+
+ grp_dest = None
+ if type_dest == 'group':
+ grp_dest = model[iter_dest][C_JID].decode('utf-8')
+ elif type_dest in ('contact', 'agent'):
+ it = iter_dest
+ while model[it][C_TYPE] != 'group':
+ it = model.iter_parent(it)
+ grp_dest = model[it][C_JID].decode('utf-8')
+
+ if (type_dest == 'account' or not self.regroup) and \
+ account_source != account_dest:
+ # add contact to this account in that group
+ dialogs.AddNewContactWindow(account = account_dest, jid = jid_source,
+ user_nick = c_source.name, group = grp_dest)
+ return
+
# Get destination group
if type_dest == 'group':
- grp_dest = model[iter_dest][C_JID].decode('utf-8')
if grp_dest in helpers.special_groups:
return
if context.action == gtk.gdk.ACTION_COPY:
- self.on_drop_in_group(None, account, c_source, grp_dest, context,
- etime)
+ self.on_drop_in_group(None, account_source, c_source, grp_dest,
+ context, etime)
return
- self.on_drop_in_group(None, account, c_source, grp_dest, context,
- etime, grp_source)
+ self.on_drop_in_group(None, account_source, c_source, grp_dest,
+ context, etime, grp_source)
return
- else:
- it = iter_dest
- while model[it][C_TYPE] != 'group':
- it = model.iter_parent(it)
- grp_dest = model[it][C_JID].decode('utf-8')
if grp_dest in helpers.special_groups:
return
if jid_source == jid_dest:
- if grp_source == grp_dest:
+ if grp_source == grp_dest and account_source == account_dest:
return
if context.action == gtk.gdk.ACTION_COPY:
- self.on_drop_in_group(None, account, c_source, grp_dest, context,
- etime)
+ self.on_drop_in_group(None, account_source, c_source, grp_dest,
+ context, etime)
return
- self.on_drop_in_group(None, account, c_source, grp_dest, context,
- etime, grp_source)
+ self.on_drop_in_group(None, account_source, c_source, grp_dest,
+ context, etime, grp_source)
return
if grp_source == grp_dest:
# Add meta contact
@@ -3192,7 +3199,7 @@
# if context.action == gtk.gdk.ACTION_COPY:
# # Keep only MOVE
# return
- c_dest = gajim.contacts.get_contact_with_highest_priority(account,
+ c_dest = gajim.contacts.get_contact_with_highest_priority(account_dest,
jid_dest)
is_big_brother = False
if model.iter_has_child(iter_source):
@@ -3200,35 +3207,30 @@
if not c_dest:
# c_dest is None if jid_dest doesn't belong to account
return
- self.on_drop_in_contact(treeview, account, c_source, c_dest,
- is_big_brother, context, etime)
+ self.on_drop_in_contact(treeview, account_source, c_source,
+ account_dest, c_dest, is_big_brother, context, etime)
return
# We upgrade only the first user because user2.groups is a pointer to
# user1.groups
if context.action == gtk.gdk.ACTION_COPY:
- self.on_drop_in_group(None, account, c_source, grp_dest, context,
- etime)
+ self.on_drop_in_group(None, account_source, c_source, grp_dest,
+ context, etime)
else:
menu = gtk.Menu()
item = gtk.MenuItem(_('Drop %s in group %s') % (c_source.name,
grp_dest))
- item.connect('activate', self.on_drop_in_group, account, c_source,
+ item.connect('activate', self.on_drop_in_group, account_dest, c_source,
grp_dest, context, etime, grp_source)
menu.append(item)
- if not disable_meta:
- # source and dest account are the same, enable metacontacts
- c_dest = gajim.contacts.get_contact_with_highest_priority(account,
- jid_dest)
- item = gtk.MenuItem(_('Make %s and %s metacontacts') % (c_source.name,
- c_dest.name))
- is_big_brother = False
- if model.iter_has_child(iter_source):
- is_big_brother = True
- item.connect('activate', self.on_drop_in_contact, account, c_source,
- c_dest, is_big_brother, context, etime)
- else: #source and dest account are not the same, disable meta
- item = gtk.MenuItem(_('Can\'t create a metacontact with contacts from two different accounts'))
- item.set_sensitive(False)
+ c_dest = gajim.contacts.get_contact_with_highest_priority(
+ account_dest, jid_dest)
+ item = gtk.MenuItem(_('Make %s and %s metacontacts') % (c_source.name,
+ c_dest.name))
+ is_big_brother = False
+ if model.iter_has_child(iter_source):
+ is_big_brother = True
+ item.connect('activate', self.on_drop_in_contact, account_source,
+ c_source, account_dest, c_dest, is_big_brother, context, etime)
menu.append(item)