class GroupBox(hippo.Canvas): __gtype_name__ = 'SugarGroupBox' def __init__(self): logging.debug('STARTUP: Loading the group view') gobject.GObject.__init__(self) self._box = hippo.CanvasBox() self._box.props.background_color = style.COLOR_WHITE.get_int() self.set_root(self._box) self._friends = {} self._layout = SpreadLayout() self._box.set_layout(self._layout) client = gconf.client_get_default() color = XoColor(client.get_string('/desktop/sugar/user/color')) self._owner_icon = CanvasIcon(icon_name='computer-xo', cache=True, xo_color=color) self._owner_icon.props.size = style.LARGE_ICON_SIZE self._owner_icon.set_palette(BuddyMenu(get_owner_instance())) self._layout.add(self._owner_icon) friends_model = friends.get_model() for friend in friends_model: self.add_friend(friend) friends_model.connect('friend-added', self._friend_added_cb) friends_model.connect('friend-removed', self._friend_removed_cb) def add_friend(self, buddy_info): icon = FriendView(buddy_info) self._layout.add(icon) self._friends[buddy_info.get_key()] = icon def _friend_added_cb(self, data_model, buddy_info): self.add_friend(buddy_info) def _friend_removed_cb(self, data_model, key): icon = self._friends[key] self._layout.remove(icon) del self._friends[key] icon.destroy() def do_size_allocate(self, allocation): width = allocation.width height = allocation.height min_w_, icon_width = self._owner_icon.get_width_request() min_h_, icon_height = self._owner_icon.get_height_request(icon_width) x = (width - icon_width) / 2 y = (height - icon_height) / 2 self._layout.move(self._owner_icon, x, y) hippo.Canvas.do_size_allocate(self, allocation)
class MeshBox(gtk.VBox): __gtype_name__ = 'SugarMeshBox' def __init__(self): logging.debug('STARTUP: Loading the mesh view') gobject.GObject.__init__(self) self.wireless_networks = {} self._adhoc_manager = None self._adhoc_networks = [] self._model = neighborhood.get_model() self._buddies = {} self._activities = {} self._mesh = [] self._buddy_to_activity = {} self._suspended = True self._query = '' self._owner_icon = None self._toolbar = MeshToolbar() self._toolbar.connect('query-changed', self._toolbar_query_changed_cb) self.pack_start(self._toolbar, expand=False) self._toolbar.show() canvas = hippo.Canvas() self.add(canvas) canvas.show() self._layout_box = hippo.CanvasBox( \ background_color=style.COLOR_WHITE.get_int()) canvas.set_root(self._layout_box) self._layout = SpreadLayout() self._layout_box.set_layout(self._layout) for buddy_model in self._model.get_buddies(): self._add_buddy(buddy_model) self._model.connect('buddy-added', self._buddy_added_cb) self._model.connect('buddy-removed', self._buddy_removed_cb) for activity_model in self._model.get_activities(): self._add_activity(activity_model) self._model.connect('activity-added', self._activity_added_cb) self._model.connect('activity-removed', self._activity_removed_cb) netmgr_observer = NetworkManagerObserver(self) netmgr_observer.listen() def do_size_allocate(self, allocation): width = allocation.width height = allocation.height min_w_, icon_width = self._owner_icon.get_width_request() min_h_, icon_height = self._owner_icon.get_height_request(icon_width) x = (width - icon_width) / 2 y = (height - icon_height) / 2 - style.GRID_CELL_SIZE self._layout.move(self._owner_icon, x, y) gtk.VBox.do_size_allocate(self, allocation) def _buddy_added_cb(self, model, buddy_model): self._add_buddy(buddy_model) def _buddy_removed_cb(self, model, buddy_model): self._remove_buddy(buddy_model) def _activity_added_cb(self, model, activity_model): self._add_activity(activity_model) def _activity_removed_cb(self, model, activity_model): self._remove_activity(activity_model) def _add_buddy(self, buddy_model): buddy_model.connect('notify::current-activity', self.__buddy_notify_current_activity_cb) if buddy_model.props.current_activity is not None: return icon = BuddyIcon(buddy_model) if buddy_model.is_owner(): self._owner_icon = icon self._layout.add(icon) if hasattr(icon, 'set_filter'): icon.set_filter(self._query) self._buddies[buddy_model.props.key] = icon def _remove_buddy(self, buddy_model): logging.debug('MeshBox._remove_buddy') icon = self._buddies[buddy_model.props.key] self._layout.remove(icon) del self._buddies[buddy_model.props.key] icon.destroy() def __buddy_notify_current_activity_cb(self, buddy_model, pspec): logging.debug('MeshBox.__buddy_notify_current_activity_cb %s', buddy_model.props.current_activity) if buddy_model.props.current_activity is None: if not buddy_model.props.key in self._buddies: self._add_buddy(buddy_model) elif buddy_model.props.key in self._buddies: self._remove_buddy(buddy_model) def _add_activity(self, activity_model): icon = ActivityView(activity_model) self._layout.add(icon) if hasattr(icon, 'set_filter'): icon.set_filter(self._query) self._activities[activity_model.activity_id] = icon def _remove_activity(self, activity_model): icon = self._activities[activity_model.activity_id] self._layout.remove(icon) del self._activities[activity_model.activity_id] icon.destroy() # add AP to its corresponding network icon on the desktop, # creating one if it doesn't already exist def _add_ap_to_network(self, ap): hash_value = ap.network_hash() if hash_value in self.wireless_networks: self.wireless_networks[hash_value].add_ap(ap) else: # this is a new network icon = WirelessNetworkView(ap) self.wireless_networks[hash_value] = icon self._layout.add(icon) if hasattr(icon, 'set_filter'): icon.set_filter(self._query) def _remove_net_if_empty(self, net, hash_value): # remove a network if it has no APs left if net.num_aps() == 0: net.disconnect() self._layout.remove(net) del self.wireless_networks[hash_value] def _ap_props_changed_cb(self, ap, old_hash_value): # if we have mesh hardware, ignore OLPC mesh networks that appear as # normal wifi networks if len(self._mesh) > 0 and ap.mode == network.NM_802_11_MODE_ADHOC \ and ap.ssid == 'olpc-mesh': logging.debug('ignoring OLPC mesh IBSS') ap.disconnect() return if self._adhoc_manager is not None and \ network.is_sugar_adhoc_network(ap.ssid) and \ ap.mode == network.NM_802_11_MODE_ADHOC: if old_hash_value is None: # new Ad-hoc network finished initializing self._adhoc_manager.add_access_point(ap) # we are called as well in other cases but we do not need to # act here as we don't display signal strength for Ad-hoc networks return if old_hash_value is None: # new AP finished initializing self._add_ap_to_network(ap) return hash_value = ap.network_hash() if old_hash_value == hash_value: # no change in network identity, so just update signal strengths self.wireless_networks[hash_value].update_strength() return # properties change includes a change of the identity of the network # that it is on. so create this as a new network. self.wireless_networks[old_hash_value].remove_ap(ap) self._remove_net_if_empty(self.wireless_networks[old_hash_value], old_hash_value) self._add_ap_to_network(ap) def add_access_point(self, device, ap_o): ap = AccessPoint(device, ap_o) ap.connect('props-changed', self._ap_props_changed_cb) ap.initialize() def remove_access_point(self, ap_o): if self._adhoc_manager is not None: if self._adhoc_manager.is_sugar_adhoc_access_point(ap_o): self._adhoc_manager.remove_access_point(ap_o) return # we don't keep an index of ap object path to network, but since # we'll only ever have a handful of networks, just try them all... for net in self.wireless_networks.values(): ap = net.find_ap(ap_o) if not ap: continue ap.disconnect() net.remove_ap(ap) self._remove_net_if_empty(net, ap.network_hash()) return # it's not an error if the AP isn't found, since we might have ignored # it (e.g. olpc-mesh adhoc network) logging.debug('Can not remove access point %s', ap_o) def add_adhoc_networks(self, device): if self._adhoc_manager is None: self._adhoc_manager = get_adhoc_manager_instance() self._adhoc_manager.start_listening(device) self._add_adhoc_network_icon(1) self._add_adhoc_network_icon(6) self._add_adhoc_network_icon(11) self._adhoc_manager.autoconnect() def remove_adhoc_networks(self): for icon in self._adhoc_networks: self._layout.remove(icon) self._adhoc_networks = [] self._adhoc_manager.stop_listening() def _add_adhoc_network_icon(self, channel): icon = SugarAdhocView(channel) self._layout.add(icon) self._adhoc_networks.append(icon) def _add_olpc_mesh_icon(self, mesh_mgr, channel): icon = OlpcMeshView(mesh_mgr, channel) self._layout.add(icon) self._mesh.append(icon) def enable_olpc_mesh(self, mesh_device): mesh_mgr = OlpcMeshManager(mesh_device) self._add_olpc_mesh_icon(mesh_mgr, 1) self._add_olpc_mesh_icon(mesh_mgr, 6) self._add_olpc_mesh_icon(mesh_mgr, 11) # the OLPC mesh can be recognised as a "normal" wifi network. remove # any such normal networks if they have been created for hash_value, net in self.wireless_networks.iteritems(): if not net.is_olpc_mesh(): continue logging.debug('removing OLPC mesh IBSS') net.remove_all_aps() net.disconnect() self._layout.remove(net) del self.wireless_networks[hash_value] def disable_olpc_mesh(self, mesh_device): for icon in self._mesh: icon.disconnect() self._layout.remove(icon) self._mesh = [] def suspend(self): if not self._suspended: self._suspended = True for net in self.wireless_networks.values() + self._mesh: net.props.paused = True def resume(self): if self._suspended: self._suspended = False for net in self.wireless_networks.values() + self._mesh: net.props.paused = False def _toolbar_query_changed_cb(self, toolbar, query): self._query = query.lower() for icon in self._layout_box.get_children(): if hasattr(icon, 'set_filter'): icon.set_filter(self._query) def focus_search_entry(self): self._toolbar.search_entry.grab_focus()