diff --git a/src/disco.py b/src/disco.py index 65a9a37fe..ef84e432a 100644 --- a/src/disco.py +++ b/src/disco.py @@ -36,10 +36,10 @@ # - def update_actions(self) # - def default_action(self) # - def _find_item(self, jid, node) -# - def _add_item(self, model, jid, node, item, force) -# - def _update_item(self, model, iter, jid, node, item) -# - def _update_info(self, model, iter, jid, node, identities, features, data) -# - def _update_error(self, model, iter, jid, node) +# - def _add_item(self, jid, node, item, force) +# - def _update_item(self, iter, jid, node, item) +# - def _update_info(self, iter, jid, node, identities, features, data) +# - def _update_error(self, iter, jid, node) # # * Should call the super class for this method. # All others do not have to call back to the super class. (but can if they want @@ -422,6 +422,7 @@ _('Without a connection, you can not browse available services')) self.xml = gtkgui_helpers.get_glade('service_discovery_window.glade') self.window = self.xml.get_widget('service_discovery_window') self.services_treeview = self.xml.get_widget('services_treeview') + self.model = None # This is more reliable than the cursor-changed signal. selection = self.services_treeview.get_selection() selection.connect_after('changed', @@ -720,9 +721,9 @@ class AgentBrowser: note that the first two columns should ALWAYS be of type string and contain the JID and node of the item respectively.''' # JID, node, name, address - model = gtk.ListStore(str, str, str, str) - model.set_sort_column_id(3, gtk.SORT_ASCENDING) - self.window.services_treeview.set_model(model) + self.model = gtk.ListStore(str, str, str, str) + self.model.set_sort_column_id(3, gtk.SORT_ASCENDING) + self.window.services_treeview.set_model(self.model) # Name column col = gtk.TreeViewColumn(_('Name')) renderer = gtk.CellRendererText() @@ -740,7 +741,7 @@ class AgentBrowser: self.window.services_treeview.set_headers_visible(True) def _clean_treemodel(self): - self.window.services_treeview.get_model().clear() + self.model.clear() for col in self.window.services_treeview.get_columns(): self.window.services_treeview.remove_column(col) self.window.services_treeview.set_headers_visible(False) @@ -872,8 +873,7 @@ class AgentBrowser: def browse(self, force = False): '''Fill the treeview with agents, fetching the info if necessary.''' - model = self.window.services_treeview.get_model() - model.clear() + self.model.clear() self._total_items = self._progress = 0 self.window.progressbar.show() self._pulse_timeout = gobject.timeout_add(250, self._pulse_timeout_cb) @@ -890,22 +890,20 @@ class AgentBrowser: def _find_item(self, jid, node): '''Check if an item is already in the treeview. Return an iter to it if so, None otherwise.''' - model = self.window.services_treeview.get_model() - iter = model.get_iter_root() + iter = self.model.get_iter_root() while iter: - cjid = model.get_value(iter, 0).decode('utf-8') - cnode = model.get_value(iter, 1).decode('utf-8') + cjid = self.model.get_value(iter, 0).decode('utf-8') + cnode = self.model.get_value(iter, 1).decode('utf-8') if jid == cjid and node == cnode: break - iter = model.iter_next(iter) + iter = self.model.iter_next(iter) if iter: return iter return None def _agent_items(self, jid, node, items, force): '''Callback for when we receive a list of agent items.''' - model = self.window.services_treeview.get_model() - model.clear() + self.model.clear() self._total_items = 0 gobject.source_remove(self._pulse_timeout) self.window.progressbar.hide() @@ -923,44 +921,43 @@ _('This service does not contain any items to browse.')) jid = item['jid'] node = item.get('node', '') self._total_items += 1 - self._add_item(model, jid, node, item, force) - self.window.services_treeview.set_model(model) + self._add_item(jid, node, item, force) + self.window.services_treeview.set_model(self.model) def _agent_info(self, jid, node, identities, features, data): '''Callback for when we receive info about an agent's item.''' addr = get_agent_address(jid, node) - model = self.window.services_treeview.get_model() iter = self._find_item(jid, node) if not iter: # Not in the treeview, stop return if identities == 0: # The server returned an error - self._update_error(model, iter, jid, node) + self._update_error(iter, jid, node) else: # We got our info - self._update_info(model, iter, jid, node, + self._update_info(iter, jid, node, identities, features, data) self.update_actions() - def _add_item(self, model, jid, node, item, force): + def _add_item(self, jid, node, item, force): '''Called when an item should be added to the model. The result of a disco#items query.''' - model.append((jid, node, item.get('name', ''), + self.model.append((jid, node, item.get('name', ''), get_agent_address(jid, node))) - def _update_item(self, model, iter, jid, node, item): + def _update_item(self, iter, jid, node, item): '''Called when an item should be updated in the model. The result of a disco#items query. (seldom)''' if item.has_key('name'): - model[iter][2] = item['name'] + self.model[iter][2] = item['name'] - def _update_info(self, model, iter, jid, node, identities, features, data): + def _update_info(self, iter, jid, node, identities, features, data): '''Called when an item should be updated in the model with further info. The result of a disco#info query.''' - model[iter][2] = identities[0].get('name', '') + self.model[iter][2] = identities[0].get('name', '') - def _update_error(self, model, iter, jid, node): + def _update_error(self, iter, jid, node): '''Called when a disco#info query failed for an item.''' pass @@ -1044,14 +1041,12 @@ class ToplevelAgentBrowser(AgentBrowser): # These are all callbacks to make tooltips work def on_treeview_leave_notify_event(self, widget, event): - model = widget.get_model() props = widget.get_path_at_pos(int(event.x), int(event.y)) if self.tooltip.timeout > 0: if not props or self.tooltip.id == props[0]: self.tooltip.hide_tooltip() def on_treeview_motion_notify_event(self, widget, event): - model = widget.get_model() props = widget.get_path_at_pos(int(event.x), int(event.y)) if self.tooltip.timeout > 0: if not props or self.tooltip.id != props[0]: @@ -1060,12 +1055,12 @@ class ToplevelAgentBrowser(AgentBrowser): [row, col, x, y] = props iter = None try: - iter = model.get_iter(row) + iter = self.model.get_iter(row) except: self.tooltip.hide_tooltip() return - jid = model[iter][0] - state = model[iter][4] + jid = self.model[iter][0] + state = self.model[iter][4] # Not a category, and we have something to say about state if jid and state > 0 and \ (self.tooltip.timeout == 0 or self.tooltip.id != props[0]): @@ -1082,10 +1077,10 @@ class ToplevelAgentBrowser(AgentBrowser): # JID, node, icon, description, state # State means 2 when error, 1 when fetching, 0 when succes. view = self.window.services_treeview - model = gtk.TreeStore(str, str, gtk.gdk.Pixbuf, str, int) - model.set_sort_func(4, self._treemodel_sort_func) - model.set_sort_column_id(4, gtk.SORT_ASCENDING) - view.set_model(model) + self.model = gtk.TreeStore(str, str, gtk.gdk.Pixbuf, str, int) + self.model.set_sort_func(4, self._treemodel_sort_func) + self.model.set_sort_column_id(4, gtk.SORT_ASCENDING) + view.set_model(self.model) col = gtk.TreeViewColumn() # Icon Renderer @@ -1325,41 +1320,40 @@ class ToplevelAgentBrowser(AgentBrowser): cat, prio = _cat_to_descr['other'] return cat, prio - def _create_category(self, model, cat, type=None): + def _create_category(self, cat, type=None): '''Creates a category row.''' cat, prio = self._friendly_category(cat, type) - return model.append(None, ('', '', None, cat, prio)) + return self.model.append(None, ('', '', None, cat, prio)) - def _find_category(self, model, cat, type=None): + def _find_category(self, cat, type=None): '''Looks up a category row and returns the iterator to it, or None.''' cat, prio = self._friendly_category(cat, type) - iter = model.get_iter_root() + iter = self.model.get_iter_root() while iter: - if model.get_value(iter, 3).decode('utf-8') == cat: + if self.model.get_value(iter, 3).decode('utf-8') == cat: break - iter = model.iter_next(iter) + iter = self.model.iter_next(iter) if iter: return iter return None def _find_item(self, jid, node): - model = self.window.services_treeview.get_model() iter = None - cat_iter = model.get_iter_root() + cat_iter = self.model.get_iter_root() while cat_iter and not iter: - iter = model.iter_children(cat_iter) + iter = self.model.iter_children(cat_iter) while iter: - cjid = model.get_value(iter, 0).decode('utf-8') - cnode = model.get_value(iter, 1).decode('utf-8') + cjid = self.model.get_value(iter, 0).decode('utf-8') + cnode = self.model.get_value(iter, 1).decode('utf-8') if jid == cjid and node == cnode: break - iter = model.iter_next(iter) - cat_iter = model.iter_next(cat_iter) + iter = self.model.iter_next(iter) + cat_iter = self.model.iter_next(cat_iter) if iter: return iter return None - def _add_item(self, model, jid, node, item, force): + def _add_item(self, jid, node, item, force): # Row text addr = get_agent_address(jid, node) if item.has_key('name'): @@ -1380,24 +1374,24 @@ class ToplevelAgentBrowser(AgentBrowser): # Set the pixmap for the row pix = self.cache.get_icon(identities) # Put it in the right category - cat = self._find_category(model, *cat_args) + cat = self._find_category(*cat_args) if not cat: - cat = self._create_category(model, *cat_args) - model.append(cat, (item['jid'], item.get('node', ''), pix, descr, 1)) + cat = self._create_category(*cat_args) + self.model.append(cat, (item['jid'], item.get('node', ''), pix, descr, 1)) self._expand_all() # Grab info on the service self.cache.get_info(jid, node, self._agent_info, force = force) self._update_progressbar() - def _update_item(self, model, iter, jid, node, item): + def _update_item(self, iter, jid, node, item): addr = get_agent_address(jid, node) if item.has_key('name'): descr = "%s\n%s" % (item['name'], addr) else: descr = "%s" % addr - model[iter][3] = descr + self.model[iter][3] = descr - def _update_info(self, model, iter, jid, node, identities, features, data): + def _update_info(self, iter, jid, node, identities, features, data): addr = get_agent_address(jid, node) name = identities[0].get('name', '') if name: @@ -1419,32 +1413,32 @@ class ToplevelAgentBrowser(AgentBrowser): break # Check if we have to move categories - old_cat_iter = model.iter_parent(iter) - old_cat = model.get_value(old_cat_iter, 3).decode('utf-8') - if model.get_value(old_cat_iter, 3) == cat: + old_cat_iter = self.model.iter_parent(iter) + old_cat = self.model.get_value(old_cat_iter, 3).decode('utf-8') + if self.model.get_value(old_cat_iter, 3) == cat: # Already in the right category, just update - model[iter][2] = pix - model[iter][3] = descr - model[iter][4] = 0 + self.model[iter][2] = pix + self.model[iter][3] = descr + self.model[iter][4] = 0 return # Not in the right category, move it. - model.remove(iter) + self.model.remove(iter) # Check if the old category is empty - if not model.iter_is_valid(old_cat_iter): - old_cat_iter = self._find_category(model, old_cat) - if not model.iter_children(old_cat_iter): - model.remove(old_cat_iter) + if not self.model.iter_is_valid(old_cat_iter): + old_cat_iter = self._find_category(old_cat) + if not self.model.iter_children(old_cat_iter): + self.model.remove(old_cat_iter) - cat_iter = self._find_category(model, cat, type) + cat_iter = self._find_category(cat, type) if not cat_iter: - cat_iter = self._create_category(model, cat, type) - model.append(cat_iter, (jid, node, pix, descr, 0)) + cat_iter = self._create_category(cat, type) + self.model.append(cat_iter, (jid, node, pix, descr, 0)) self._expand_all() - def _update_error(self, model, iter, jid, node): + def _update_error(self, iter, jid, node): addr = get_agent_address(jid, node) - model[iter][4] = 2 + self.model[iter][4] = 2 self._progress += 1 self._update_progressbar() @@ -1454,13 +1448,18 @@ class MucBrowser(AgentBrowser): AgentBrowser.__init__(self, *args, **kwargs) self.join_button = None + def _agent_items(self, jid, node, items, force): + AgentBrowser._agent_items(self, jid, node, items, force) + print 'resize column' +# self.window.services_treeview.get + def _create_treemodel(self): # JID, node, name, users, description, fetched # This is rather long, I'd rather not use a data_func here though. # Users is a string, because want to be able to leave it empty. - model = gtk.ListStore(str, str, str, str, str, bool) - model.set_sort_column_id(2, gtk.SORT_ASCENDING) - self.window.services_treeview.set_model(model) + self.model = gtk.ListStore(str, str, str, str, str, bool) + self.model.set_sort_column_id(2, gtk.SORT_ASCENDING) + self.window.services_treeview.set_model(self.model) # Name column col = gtk.TreeViewColumn(_('Name')) renderer = gtk.CellRendererText() @@ -1571,7 +1570,6 @@ class MucBrowser(AgentBrowser): # Prevent a silly warning, try again in a bit. self._fetch_source = gobject.timeout_add(100, self._start_info_query) return - model = view.get_model() # We have to do this in a pygtk <2.8 compatible way :/ #start, end = self.window.services_treeview.get_visible_range() rect = view.get_visible_rect() @@ -1580,7 +1578,7 @@ class MucBrowser(AgentBrowser): try: sx, sy = view.tree_to_widget_coords(rect.x, rect.y) spath = view.get_path_at_pos(sx, sy)[0] - iter = model.get_iter(spath) + iter = self.model.get_iter(spath) except TypeError: self._fetch_source = None return @@ -1594,14 +1592,14 @@ class MucBrowser(AgentBrowser): except TypeError: # We're at the end of the model, we can leave end=None though. pass - while iter and model.get_path(iter) != end: - if not model.get_value(iter, 5): - jid = model.get_value(iter, 0).decode('utf-8') - node = model.get_value(iter, 1).decode('utf-8') + while iter and self.model.get_path(iter) != end: + if not self.model.get_value(iter, 5): + jid = self.model.get_value(iter, 0).decode('utf-8') + node = self.model.get_value(iter, 1).decode('utf-8') self.cache.get_info(jid, node, self._agent_info) self._fetch_source = True return - iter = model.iter_next(iter) + iter = self.model.iter_next(iter) self._fetch_source = None def _channel_altinfo(self, jid, node, items, name = None): @@ -1622,22 +1620,21 @@ class MucBrowser(AgentBrowser): self._fetch_source = None return else: - model = self.window.services_treeview.get_model() iter = self._find_item(jid, node) if iter: if name: - model[iter][2] = name - model[iter][3] = len(items) # The number of users - model[iter][5] = True + self.model[iter][2] = name + self.model[iter][3] = len(items) # The number of users + self.model[iter][5] = True self._fetch_source = None self._query_visible() - def _add_item(self, model, jid, node, item, force): - model.append((jid, node, item.get('name', ''), '', '', False)) + def _add_item(self, jid, node, item, force): + self.model.append((jid, node, item.get('name', ''), '', '', False)) if not self._fetch_source: self._fetch_source = gobject.idle_add(self._start_info_query) - def _update_info(self, model, iter, jid, node, identities, features, data): + def _update_info(self, iter, jid, node, identities, features, data): name = identities[0].get('name', '') for form in data: typefield = form.getField('FORM_TYPE') @@ -1647,14 +1644,14 @@ class MucBrowser(AgentBrowser): users = form.getField('muc#roominfo_occupants') descr = form.getField('muc#roominfo_description') if users: - model[iter][3] = users.getValue() + self.model[iter][3] = users.getValue() if descr: - model[iter][4] = descr.getValue() + self.model[iter][4] = descr.getValue() # Only set these when we find a form with additional info # Some servers don't support forms and put extra info in # the name attribute, so we preserve it in that case. - model[iter][2] = name - model[iter][5] = True + self.model[iter][2] = name + self.model[iter][5] = True break else: # We didn't find a form, switch to alternate query mode @@ -1664,7 +1661,7 @@ class MucBrowser(AgentBrowser): self._fetch_source = None self._query_visible() - def _update_error(self, model, iter, jid, node): + def _update_error(self, iter, jid, node): # switch to alternate query mode self.cache.get_items(jid, node, self._channel_altinfo)