From 8eaa1f45ad563cb0ce217de3695947a46b79b4cf Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Wed, 9 Nov 2005 07:00:46 +0000 Subject: [PATCH] add a 'merged account' row with a context menu --- src/common/helpers.py | 8 +++ src/roster_window.py | 116 ++++++++++++++++++++++++------------------ 2 files changed, 74 insertions(+), 50 deletions(-) diff --git a/src/common/helpers.py b/src/common/helpers.py index d980c0d40..781e3b964 100644 --- a/src/common/helpers.py +++ b/src/common/helpers.py @@ -524,3 +524,11 @@ def get_output_of_command(command): child_stdin.close() return output + +def get_global_show(): + maxi = 0 + for account in gajim.connections: + connected = gajim.connections[account].connected + if connected > maxi: + maxi = connected + return gajim.SHOW_LIST[maxi] diff --git a/src/roster_window.py b/src/roster_window.py index fdca533fd..e62af79f1 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -64,12 +64,12 @@ class RosterWindow: '''Class for main window of gtkgui interface''' def get_account_iter(self, name): - if self.regroup: - return model = self.tree.get_model() if model is None: return account_iter = model.get_iter_root() + if self.regroup: + return account_iter while account_iter: account_name = model[account_iter][C_NAME].decode('utf-8') if name == account_name: @@ -106,14 +106,19 @@ class RosterWindow: return found def add_account_to_roster(self, account): - if self.regroup: - return model = self.tree.get_model() if self.get_account_iter(account): return - statuss = ['offline', 'connecting', 'online', 'chat', + show_list = ['offline', 'connecting', 'online', 'chat', 'away', 'xa', 'dnd', 'invisible'] - status = statuss[gajim.connections[account].connected] + + if self.regroup: + show = helpers.get_global_show() + model.append(None, [self.jabber_state_images[show], + _('Merged accounts'), 'account', '', 'all', False, None]) + return + + show = show_list[gajim.connections[account].connected] tls_pixbuf = None if gajim.con_types.has_key(account) and \ @@ -123,7 +128,7 @@ class RosterWindow: our_jid = gajim.get_jid_from_account(account) - model.append(None, [self.jabber_state_images[status], account, + model.append(None, [self.jabber_state_images[show], account, 'account', our_jid, account, False, tls_pixbuf]) def remove_newly_added(self, jid, account): @@ -175,8 +180,7 @@ class RosterWindow: else: ishidden = True gajim.groups[account][g] = { 'expand': ishidden } - if not account in self.collapsed_rows and \ - not gajim.config.get('mergeaccounts'): + if not account in self.collapsed_rows: self.tree.expand_row((model.get_path(iterG)[0]), False) typestr = 'contact' @@ -736,7 +740,9 @@ class RosterWindow: self.show_tooltip, gajim.contacts[account][jid]) elif model[iter][C_TYPE] == 'account': # we're on an account entry in the roster - account = model[iter][C_NAME].decode('utf-8') + account = model[iter][C_ACCOUNT].decode('utf-8') + if account == 'all': + return jid = gajim.get_jid_from_account(account) contacts = [] connection = gajim.connections[account] @@ -1056,11 +1062,7 @@ class RosterWindow: if message is not None: # None is if user pressed Cancel self.send_status(account, show, message) - def mk_menu_account(self, event, iter): - '''Make account's popup menu''' - model = self.tree.get_model() - account = model[iter][C_ACCOUNT].decode('utf-8') - + def build_account_menu(self, account): #FIXME: make most menuitems of this menu insensitive if account is offline # we have to create our own set of icons for the menu @@ -1135,16 +1137,41 @@ class RosterWindow: self.on_join_gc_activate, account) new_message_menuitem.connect('activate', self.on_new_message_menuitem_activate, account) - + return account_context_menu + + def mk_menu_account(self, event, iter): + '''Make account's popup menu''' + model = self.tree.get_model() + account = model[iter][C_ACCOUNT].decode('utf-8') + + + if account != 'all': + menu = self.build_account_menu(account) + else: + menu = gtk.Menu() + iconset = gajim.config.get('iconset') + if not iconset: + iconset = 'sun' + path = os.path.join(gajim.DATA_DIR, 'iconsets/' + iconset + '/16x16/') + for account in gajim.connections: + state_images = self.load_iconset(path) + item = gtk.ImageMenuItem(account) + show = gajim.SHOW_LIST[gajim.connections[account].connected] + icon = state_images[show] + item.set_image(icon) + account_menu = self.build_account_menu(account) + item.set_submenu(account_menu) + menu.append(item) + event_button = self.get_possible_button_event(event) - - account_context_menu.popup(None, self.tree, None, event_button, + + menu.popup(None, self.tree, None, event_button, event.time) - account_context_menu.show_all() + menu.show_all() def on_add_to_roster(self, widget, user, account): dialogs.AddNewContactWindow(account, user.jid) - + def authorize(self, widget, jid, account): '''Authorize a user (by re-sending auth menuitem)''' gajim.connections[account].send_authorization(jid) @@ -1360,7 +1387,7 @@ _('If "%s" accepts this request you will know his status.') %jid) model[accountIter][0] = self.jabber_state_images['offline'] if gajim.interface.systray_enabled: gajim.interface.systray.change_status('offline') - self.update_status_comboxbox() + self.update_status_combobox() return gajim.connections[account].password = passphrase if save: @@ -1458,7 +1485,7 @@ _('If "%s" accepts this request you will know his status.') %jid) dialogs.ErrorDialog(_('No account available'), _('You must create an account before you can chat with other contacts.') ).get_response() - self.update_status_comboxbox() + self.update_status_combobox() return status = model[active][2].decode('utf-8') one_connected = helpers.one_account_connected() @@ -1501,7 +1528,7 @@ _('If "%s" accepts this request you will know his status.') %jid) return message = self.get_status_message(status) if message is None: # user pressed Cancel to change status message dialog - self.update_status_comboxbox() + self.update_status_combobox() return for acct in accounts: if not gajim.config.get_per('accounts', acct, 'sync_with_global_status'): @@ -1511,22 +1538,18 @@ _('If "%s" accepts this request you will know his status.') %jid) if not one_connected or gajim.connections[acct].connected > 1: self.send_status(acct, status, message) - def update_status_comboxbox(self): + def update_status_combobox(self): # table to change index in connection.connected to index in combobox - table = {0:9, 1:9, 2:0, 3:1, 4:2, 5:3, 6:4, 7:5} - maxi = 0 - for account in gajim.connections: - if gajim.connections[account].connected > maxi: - maxi = gajim.connections[account].connected + table = {'offline':9, 'connecting':9, 'online':0, 'chat':1, 'away':2, + 'xa':3, 'dnd':4, 'invisible':5} + show = helpers.get_global_show() # temporarily block signal in order not to send status that we show # in the combobox self.combobox_callback_active = False - self.status_combobox.set_active(table[maxi]) + self.status_combobox.set_active(table[show]) self.combobox_callback_active = True - statuss = ['offline', 'connecting', 'online', 'chat', 'away', - 'xa', 'dnd', 'invisible'] if gajim.interface.systray_enabled: - gajim.interface.systray.change_status(statuss[maxi]) + gajim.interface.systray.change_status(show) def on_status_changed(self, account, status): '''the core tells us that our status has changed''' @@ -1546,7 +1569,7 @@ _('If "%s" accepts this request you will know his status.') %jid) luser_copy.append(user) for user in luser_copy: self.chg_contact_status(user, 'offline', 'Disconnected', account) - self.update_status_comboxbox() + self.update_status_combobox() self.make_menu() def new_chat(self, contact, account): @@ -2104,7 +2127,7 @@ _('If "%s" accepts this request you will know his status.') %jid) for jid in gajim.interface.windows[account]['gc']: if jid != 'tabbed': gajim.interface.windows[account]['gc'][jid].update_state_images() - self.update_status_comboxbox() + self.update_status_combobox() def repaint_themed_widgets(self): '''Notify windows that contain themed widgets to repaint them''' @@ -2307,18 +2330,12 @@ _('If "%s" accepts this request you will know his status.') %jid) model, iter = treeselection.get_selected() path = model.get_path(iter) data = '' - merge = 0 - if gajim.config.get('mergeaccounts'): - merge = 1 - if len(path) == 3 - merge: + if len(path) == 3: data = model[iter][C_JID] selection.set(selection.target, 8, data) def drag_data_received_data(self, treeview, context, x, y, selection, info, etime): - merge = 0 - if gajim.config.get('mergeaccounts'): - merge = 1 model = treeview.get_model() if not selection.data: return @@ -2327,19 +2344,18 @@ _('If "%s" accepts this request you will know his status.') %jid) if not drop_info: return path_dest, position = drop_info - if position == gtk.TREE_VIEW_DROP_BEFORE and len(path_dest) == 2 - merge\ - and path_dest[1 - merge] == 0: #droped before the first group + if position == gtk.TREE_VIEW_DROP_BEFORE and len(path_dest) == 2 \ + and path_dest[1] == 0: # droped before the first group return - if position == gtk.TREE_VIEW_DROP_BEFORE and len(path_dest) == 2 - merge: - #droped before a group : we drop it in the previous group - path_dest = (path_dest[1 - merge], path_dest[1 - merge]-1) + if position == gtk.TREE_VIEW_DROP_BEFORE and len(path_dest) == 2: + # droped before a group : we drop it in the previous group + path_dest = (path_dest[1], path_dest[1]-1) iter_dest = model.get_iter(path_dest) iter_source = treeview.get_selection().get_selected()[1] path_source = model.get_path(iter_source) - if len(path_dest) == 1 and not merge: #droped on an account + if len(path_dest) == 1: # droped on an account return - if path_dest[0] != path_source[0] and not merge: - #droped in another account + if path_dest[0] != path_source[0]: # droped in another account return iter_group_source = model.iter_parent(iter_source) grp_source = model[iter_group_source][C_JID].decode('utf-8')