def __init__(self): ToolButton.__init__(self) self._property = 'timestamp' self._order = Gtk.SortType.ASCENDING self.props.tooltip = _('Sort view') self.props.icon_name = 'view-lastedit' self.props.hide_tooltip_on_click = False self.palette_invoker.props.toggle_palette = True menu_box = PaletteMenuBox() self.props.palette.set_content(menu_box) menu_box.show() sort_options = [ ('timestamp', 'view-lastedit', _('Sort by date modified')), ('creation_time', 'view-created', _('Sort by date created')), ('filesize', 'view-size', _('Sort by size')), ] for property_, icon, label in sort_options: button = PaletteMenuItem(label) button_icon = Icon(pixel_size=style.SMALL_ICON_SIZE, icon_name=icon) button.set_image(button_icon) button_icon.show() button.connect('activate', self.__sort_type_changed_cb, property_, icon) button.show() menu_box.append_item(button)
def __init__(self): ToolButton.__init__(self) self._property = 'timestamp' self._order = Gtk.SortType.ASCENDING self.props.tooltip = _('Sort view') self.props.icon_name = 'view-lastedit' self.props.hide_tooltip_on_click = False self.palette_invoker.props.toggle_palette = True menu_box = PaletteMenuBox() self.props.palette.set_content(menu_box) menu_box.show() for property_, icon, label in self._SORT_OPTIONS: button = PaletteMenuItem(label) button_icon = Icon(icon_size=Gtk.IconSize.MENU, icon_name=icon) button.set_image(button_icon) button_icon.show() button.connect('activate', self.__sort_type_changed_cb, property_, icon) button.show() menu_box.append_item(button)
def __init__(self): ToolButton.__init__(self) self._property = 'timestamp' self._order = Gtk.SortType.ASCENDING self.props.tooltip = _('Sort view') self.props.icon_name = 'view-lastedit' self.props.hide_tooltip_on_click = False self.palette_invoker.props.toggle_palette = True menu_box = PaletteMenuBox() self.props.palette.set_content(menu_box) menu_box.show() for property_, icon, label in self._SORT_OPTIONS: button = PaletteMenuItem(label) button_icon = Icon(icon_size=Gtk.IconSize.MENU, icon_name=icon) button.set_image(button_icon) button_icon.show() button.connect('activate', self.__sort_type_changed_cb, property_, icon) button.show() menu_box.append_item(button)
def create_palette(self): primary_text = GLib.markup_escape_text(self._model.bundle.get_name()) secondary_text = GLib.markup_escape_text(self._model.get_name()) palette_icon = Icon(file=self._model.bundle.get_icon(), xo_color=self._model.get_color()) palette_icon.props.icon_size = Gtk.IconSize.LARGE_TOOLBAR palette = Palette(None, primary_text=primary_text, secondary_text=secondary_text, icon=palette_icon) private = self._model.props.private joined = get_owner_instance() in self._model.props.buddies menu_box = PaletteMenuBox() if joined: item = PaletteMenuItem(_('Resume')) icon = Icon(icon_size=Gtk.IconSize.MENU, icon_name='activity-start') item.set_image(icon) item.connect('activate', self.__palette_item_clicked_cb) menu_box.append_item(item) elif not private: item = PaletteMenuItem(_('Join')) icon = Icon(icon_size=Gtk.IconSize.MENU, icon_name='activity-start') item.set_image(icon) item.connect('activate', self.__palette_item_clicked_cb) menu_box.append_item(item) palette.set_content(menu_box) menu_box.show_all() self.connect_to_palette_pop_events(palette) return palette
def __init__(self): ToolButton.__init__(self) self._property = 'timestamp' self._order = Gtk.SortType.ASCENDING self.props.tooltip = _('Sort view') self.props.icon_name = 'view-lastedit' self.props.hide_tooltip_on_click = False self.palette_invoker.props.toggle_palette = True menu_box = PaletteMenuBox() self.props.palette.set_content(menu_box) menu_box.show() sort_options = [ ('timestamp', 'view-lastedit', _('Sort by date modified')), ('creation_time', 'view-created', _('Sort by date created')), ('filesize', 'view-size', _('Sort by size')), ] for property_, icon, label in sort_options: button = PaletteMenuItem(label) button_icon = Icon(pixel_size=style.SMALL_ICON_SIZE, icon_name=icon) button.set_image(button_icon) button_icon.show() button.connect('activate', self.__sort_type_changed_cb, property_, icon) button.show() menu_box.append_item(button)
class DisplayPalette(Palette): def __init__(self): Palette.__init__(self, label=_('My Display')) self._screenshot = PaletteMenuItem(_('Take a screenshot')) icon = Icon(icon_name='camera-external', pixel_size=style.SMALL_ICON_SIZE) self._screenshot.set_image(icon) icon.show() self._screenshot.connect('activate', self.__screenshot_cb) self._screenshot.show() self._box = PaletteMenuBox() self._brightness_manager = None # only add this widget if device available if brightness.get_instance().get_path(): self._add_brightness_manager() self._box.append_item(self._screenshot, 0, 0) self._box.show() self.set_content(self._box) self.connect('popup', self.__popup_cb) def _add_brightness_manager(self): self._brightness_manager = BrightnessManagerWidget(_('Brightness'), 'brightness-100') self._brightness_manager.show() separator = PaletteMenuItemSeparator() separator.show() self._box.append_item(self._brightness_manager, 0, 0) self._box.append_item(separator, 0, 0) def __popup_cb(self, palette): if self._brightness_manager is not None: self._brightness_manager.update() def __screenshot_cb(self, palette): frame_ = frame.get_view() frame_.hide() GLib.idle_add(self.__take_screenshot_cb, frame_) @staticmethod def __take_screenshot_cb(frame_): if frame_.is_visible(): return True take_screenshot() frame_.show() return False
class DisplayPalette(Palette): def __init__(self): Palette.__init__(self, label=_('My Display')) self._screenshot = PaletteMenuItem(_('Take a screenshot')) icon = Icon(icon_name='camera-external', pixel_size=style.SMALL_ICON_SIZE) self._screenshot.set_image(icon) icon.show() self._screenshot.connect('activate', self.__screenshot_cb) self._screenshot.show() self._box = PaletteMenuBox() self._brightness_manager = None # only add this widget if device available if brightness.get_instance().get_path(): self._add_brightness_manager() self._box.append_item(self._screenshot, 0, 0) self._box.show() self.set_content(self._box) self.connect('popup', self.__popup_cb) def _add_brightness_manager(self): self._brightness_manager = BrightnessManagerWidget(_('Brightness'), 'brightness-100') self._brightness_manager.show() separator = PaletteMenuItemSeparator() separator.show() self._box.append_item(self._brightness_manager, 0, 0) self._box.append_item(separator, 0, 0) def __popup_cb(self, palette): if self._brightness_manager is not None: self._brightness_manager.update() def __screenshot_cb(self, palette): frame_ = frame.get_view() frame_.hide() GObject.idle_add(self.__take_screenshot_cb, frame_) def __take_screenshot_cb(self, frame_): if frame_.is_visible(): return True take_screenshot() frame_.show() return False
def set_palette_list(palette_list, nx, ny, item_height, return_dict=False): palette_dict = {} item_width = style.GRID_CELL_SIZE * 3 grid = Gtk.Grid() grid.set_row_spacing(style.DEFAULT_PADDING) grid.set_column_spacing(0) grid.set_border_width(0) scrolled_window = Gtk.ScrolledWindow() scrolled_window.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) scrolled_window.set_size_request(nx * item_width, ny * item_height) scrolled_window.set_shadow_type(Gtk.ShadowType.ETCHED_IN) scrolled_window.add_with_viewport(grid) grid.show() x = 0 y = 0 for item in palette_list: menu_item = PaletteMenuItem() menu_item.set_label(item['label']) menu_item.set_image(item['icon']) item['icon'].show() if return_dict: menu_item.set_image(item['selected']) item['selected'].hide() if return_dict: palette_dict[item['label']] = { 'menu': menu_item, 'icon': item['icon'], 'selected': item['selected'] } menu_item.connect('button-release-event', item['callback'], item['label']) grid.attach(menu_item, x, y, 1, 1) x += 1 if x == nx: x = 0 y += 1 menu_item.show() if return_dict: return scrolled_window, palette_dict else: return scrolled_window
def set_palette_list(palette_list, nx, ny, item_height, return_dict=False): palette_dict = {} item_width = style.GRID_CELL_SIZE * 3 grid = Gtk.Grid() grid.set_row_spacing(style.DEFAULT_PADDING) grid.set_column_spacing(0) grid.set_border_width(0) scrolled_window = Gtk.ScrolledWindow() scrolled_window.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) scrolled_window.set_size_request(nx * item_width, ny * item_height) scrolled_window.set_shadow_type(Gtk.ShadowType.ETCHED_IN) scrolled_window.add_with_viewport(grid) grid.show() x = 0 y = 0 for item in palette_list: menu_item = PaletteMenuItem() menu_item.set_label(item['label']) menu_item.set_image(item['icon']) item['icon'].show() if return_dict: menu_item.set_image(item['selected']) item['selected'].hide() if return_dict: palette_dict[item['label']] = {'menu': menu_item, 'icon': item['icon'], 'selected': item['selected']} menu_item.connect('button-release-event', item['callback'], item['label']) grid.attach(menu_item, x, y, 1, 1) x += 1 if x == nx: x = 0 y += 1 menu_item.show() if return_dict: return scrolled_window, palette_dict else: return scrolled_window
def create_palette(self): palette = VolumePalette(self._mount) palette.set_group_id('frame') menu_item = PaletteMenuItem(_('Show contents')) color = profile.get_color() icon = Icon(icon_name=self._icon_name, icon_size=Gtk.IconSize.MENU, xo_color=color) menu_item.set_image(icon) icon.show() menu_item.connect('activate', self.__show_contents_cb) palette.content_box.pack_start(menu_item, True, True, 0) palette.content_box.reorder_child(menu_item, 0) menu_item.show() return palette
def create_palette(self): palette = VolumePalette(self._mount) palette.set_group_id('frame') menu_item = PaletteMenuItem(_('Show contents')) client = GConf.Client.get_default() color = XoColor(client.get_string('/desktop/sugar/user/color')) icon = Icon(icon_name=self._icon_name, icon_size=Gtk.IconSize.MENU, xo_color=color) menu_item.set_image(icon) icon.show() menu_item.connect('activate', self.__show_contents_cb) palette.content_box.pack_start(menu_item, True, True, 0) palette.content_box.reorder_child(menu_item, 0) menu_item.show() return palette
def create_palette(self): palette = VolumePalette(self._mount) palette.set_group_id('frame') menu_item = PaletteMenuItem(_('Show contents')) color = profile.get_color() icon = Icon(icon_name=self._icon_name, pixel_size=style.SMALL_ICON_SIZE, xo_color=color) menu_item.set_image(icon) icon.show() menu_item.connect('activate', self.__show_contents_cb) palette.content_box.pack_start(menu_item, True, True, 0) palette.content_box.reorder_child(menu_item, 0) menu_item.show() return palette
def create_palette(self): palette = VolumePalette(self._mount) palette.set_group_id('frame') menu_item = PaletteMenuItem(_('Show contents')) color = get_mount_color(self._mount) icon = Icon(icon_name=self._icon_name, pixel_size=style.SMALL_ICON_SIZE, xo_color=color) menu_item.set_image(icon) icon.show() menu_item.connect('activate', self.__show_contents_cb) palette.content_box.pack_start(menu_item, True, True, 0) palette.content_box.reorder_child(menu_item, 0) menu_item.show() return palette
def create_palette(self): palette = VolumePalette(self._mount) palette.set_group_id('frame') menu_item = PaletteMenuItem(_('Show contents')) client = GConf.Client.get_default() color = XoColor(client.get_string('/desktop/sugar/user/color')) icon = Icon(icon_name=self._icon_name, icon_size=Gtk.IconSize.MENU, xo_color=color) menu_item.set_image(icon) icon.show() menu_item.connect('activate', self.__show_contents_cb) palette.content_box.pack_start(menu_item, True, True, 0) palette.content_box.reorder_child(menu_item, 0) menu_item.show() return palette
def __init__(self, mount): Palette.__init__(self, label=mount.get_name()) self._mount = mount path = mount.get_root().get_path() self.props.secondary_text = GLib.markup_escape_text(path) self.content_box = PaletteMenuBox() self.set_content(self.content_box) self.content_box.show() menu_item = PaletteMenuItem(pgettext('Volume', 'Remove')) icon = Icon(icon_name='media-eject', pixel_size=style.SMALL_ICON_SIZE) menu_item.set_image(icon) icon.show() menu_item.connect('activate', self.__unmount_activate_cb) self.content_box.append_item(menu_item) menu_item.show() separator = PaletteMenuItemSeparator() self.content_box.append_item(separator) separator.show() free_space_box = Gtk.VBox() free_space_box.set_spacing(style.DEFAULT_PADDING) self.content_box.append_item(free_space_box, vertical_padding=0) free_space_box.show() self._progress_bar = Gtk.ProgressBar() free_space_box.pack_start(self._progress_bar, True, True, 0) self._progress_bar.show() self._free_space_label = Gtk.Label() self._free_space_label.set_alignment(0.5, 0.5) free_space_box.pack_start(self._free_space_label, True, True, 0) self._free_space_label.show() self.connect('popup', self.__popup_cb)
def setup_palette(self): title = self._home_activity.get_title() self.set_primary_text(GLib.markup_escape_text(title)) box = PaletteMenuBox() self.set_content(box) box.show() menu_item = PaletteMenuItem(_("Show contents")) icon = Icon( file=self._home_activity.get_icon_path(), pixel_size=style.SMALL_ICON_SIZE, xo_color=self._home_activity.get_icon_color(), ) menu_item.set_image(icon) icon.show() menu_item.connect("activate", self.__open_activate_cb) box.append_item(menu_item) menu_item.show() separator = PaletteMenuItemSeparator() box.append_item(separator) separator.show() inner_box = Gtk.VBox() inner_box.set_spacing(style.DEFAULT_PADDING) box.append_item(inner_box, vertical_padding=0) inner_box.show() self._progress_bar = Gtk.ProgressBar() inner_box.add(self._progress_bar) self._progress_bar.show() self._free_space_label = Gtk.Label() self._free_space_label.set_alignment(0.5, 0.5) inner_box.add(self._free_space_label) self._free_space_label.show() self.connect("popup", self.__popup_cb)
def __init__(self, mount): Palette.__init__(self, label=mount.get_name()) self._mount = mount path = mount.get_root().get_path() self.props.secondary_text = glib.markup_escape_text(path) self.content_box = PaletteMenuBox() self.set_content(self.content_box) self.content_box.show() menu_item = PaletteMenuItem(pgettext('Volume', 'Remove')) icon = Icon(icon_name='media-eject', icon_size=Gtk.IconSize.MENU) menu_item.set_image(icon) icon.show() menu_item.connect('activate', self.__unmount_activate_cb) self.content_box.append_item(menu_item) menu_item.show() separator = PaletteMenuItemSeparator() self.content_box.append_item(separator) separator.show() free_space_box = Gtk.VBox() free_space_box.set_spacing(style.DEFAULT_PADDING) self.content_box.append_item(free_space_box, vertical_padding=0) free_space_box.show() self._progress_bar = Gtk.ProgressBar() free_space_box.pack_start(self._progress_bar, True, True, 0) self._progress_bar.show() self._free_space_label = Gtk.Label() self._free_space_label.set_alignment(0.5, 0.5) free_space_box.pack_start(self._free_space_label, True, True, 0) self._free_space_label.show() self.connect('popup', self.__popup_cb)
def setup_palette(self): title = self._home_activity.get_title() self.set_primary_text(GLib.markup_escape_text(title)) box = PaletteMenuBox() self.set_content(box) box.show() menu_item = PaletteMenuItem(_('Show contents')) icon = Icon(file=self._home_activity.get_icon_path(), pixel_size=style.SMALL_ICON_SIZE, xo_color=self._home_activity.get_icon_color()) menu_item.set_image(icon) icon.show() menu_item.connect('activate', self.__open_activate_cb) box.append_item(menu_item) menu_item.show() separator = PaletteMenuItemSeparator() box.append_item(separator) separator.show() inner_box = Gtk.VBox() inner_box.set_spacing(style.DEFAULT_PADDING) box.append_item(inner_box, vertical_padding=0) inner_box.show() self._progress_bar = Gtk.ProgressBar() inner_box.add(self._progress_bar) self._progress_bar.show() self._free_space_label = Gtk.Label() self._free_space_label.set_alignment(0.5, 0.5) inner_box.add(self._free_space_label) self._free_space_label.show() self.connect('popup', self.__popup_cb)
def create_palette(self): primary_text = self._model.bundle.get_name() secondary_text = self._model.get_name() palette_icon = Icon(file=self._model.bundle.get_icon(), pixel_size=style.STANDARD_ICON_SIZE, xo_color=self._model.get_color()) palette = Palette(None, primary_text=primary_text, secondary_text=secondary_text, icon=palette_icon) private = self._model.props.private joined = get_owner_instance() in self._model.props.buddies is_joinable = self._is_joinable is None or self._is_joinable() menu_box = PaletteMenuBox() if joined: item = PaletteMenuItem(_('Resume')) icon = Icon( pixel_size=style.SMALL_ICON_SIZE, icon_name='activity-start') item.set_image(icon) item.connect('activate', self.__palette_item_clicked_cb) menu_box.append_item(item) elif not private and is_joinable: item = PaletteMenuItem(_('Join')) icon = Icon( pixel_size=style.SMALL_ICON_SIZE, icon_name='activity-start') item.set_image(icon) item.connect('activate', self.__palette_item_clicked_cb) menu_box.append_item(item) palette.set_content(menu_box) menu_box.show_all() self.connect_to_palette_pop_events(palette) return palette
def create_palette(self): primary_text = GLib.markup_escape_text(self._model.bundle.get_name()) secondary_text = GLib.markup_escape_text(self._model.get_name()) palette_icon = Icon(file=self._model.bundle.get_icon(), xo_color=self._model.get_color()) palette_icon.props.icon_size = Gtk.IconSize.LARGE_TOOLBAR palette = Palette(None, primary_text=primary_text, secondary_text=secondary_text, icon=palette_icon) private = self._model.props.private joined = get_owner_instance() in self._model.props.buddies menu_box = PaletteMenuBox() if joined: item = PaletteMenuItem(_('Resume')) icon = Icon(icon_size=Gtk.IconSize.MENU, icon_name='activity-start') item.set_image(icon) item.connect('activate', self.__palette_item_clicked_cb) menu_box.append_item(item) elif not private: item = PaletteMenuItem(_('Join')) icon = Icon(icon_size=Gtk.IconSize.MENU, icon_name='activity-start') item.set_image(icon) item.connect('activate', self.__palette_item_clicked_cb) menu_box.append_item(item) palette.set_content(menu_box) menu_box.show_all() self.connect_to_palette_pop_events(palette) return palette
class GsmPalette(Palette): __gtype_name__ = 'SugarGsmPalette' __gsignals__ = { 'gsm-connect': (GObject.SignalFlags.RUN_FIRST, None, ([])), 'gsm-disconnect': (GObject.SignalFlags.RUN_FIRST, None, ([])), } def __init__(self): label = GLib.markup_escape_text(_('Wireless modem')) Palette.__init__(self, primary_text=label) self._current_state = None self._failed_connection = False self.info_box = Gtk.VBox() self._toggle_state_item = PaletteMenuItem('') self._toggle_state_item.connect('activate', self.__toggle_state_cb) self.info_box.pack_start(self._toggle_state_item, True, True, 0) self._toggle_state_item.show() self.error_title_label = Gtk.Label(label="") self.error_title_label.set_alignment(0, 0.5) self.error_title_label.set_line_wrap(True) self.info_box.pack_start(self.error_title_label, True, True, 0) self.error_description_label = Gtk.Label(label="") self.error_description_label.set_alignment(0, 0.5) self.error_description_label.set_line_wrap(True) self.info_box.pack_start(self.error_description_label, True, True, 0) self.connection_info_box = Gtk.HBox() icon = Icon(icon_name='data-upload', pixel_size=style.SMALL_ICON_SIZE) self.connection_info_box.pack_start(icon, True, True, 0) icon.show() self._data_label_up = Gtk.Label() self._data_label_up.props.xalign = 0.0 label_alignment = self._add_widget_with_padding(self._data_label_up) self.connection_info_box.pack_start(label_alignment, True, True, 0) self._data_label_up.show() label_alignment.show() icon = Icon(icon_name='data-download', pixel_size=style.SMALL_ICON_SIZE) self.connection_info_box.pack_start(icon, True, True, 0) icon.show() self._data_label_down = Gtk.Label() self._data_label_down.props.xalign = 0.0 label_alignment = self._add_widget_with_padding(self._data_label_down) self.connection_info_box.pack_start(label_alignment, True, True, 0) self._data_label_down.show() label_alignment.show() self.info_box.pack_start(self.connection_info_box, True, True, 0) self.info_box.show() self.set_content(self.info_box) self.update_state(_GSM_STATE_NOT_READY) def _add_widget_with_padding(self, child, xalign=0, yalign=0.5): alignment = Gtk.Alignment.new(xalign=xalign, yalign=yalign, xscale=1, yscale=0.33) alignment.set_padding(style.DEFAULT_SPACING, style.DEFAULT_SPACING, style.DEFAULT_SPACING, style.DEFAULT_SPACING) alignment.add(child) return alignment def update_state(self, state, reason=0): self._current_state = state self._update_label_and_text(reason) def _update_label_and_text(self, reason=0): if self._current_state == _GSM_STATE_NOT_READY: self._toggle_state_item.set_label('...') label = GLib.markup_escape_text(_('Please wait...')) self.props.secondary_text = label elif self._current_state == _GSM_STATE_DISCONNECTED: if not self._failed_connection: self._toggle_state_item.set_label(_('Connect')) label = GLib.markup_escape_text(_('Disconnected')) self.props.secondary_text = label icon = Icon(icon_name='dialog-ok', pixel_size=style.SMALL_ICON_SIZE) self._toggle_state_item.set_image(icon) elif self._current_state == _GSM_STATE_CONNECTING: self._toggle_state_item.set_label(_('Cancel')) label = GLib.markup_escape_text(_('Connecting...')) self.props.secondary_text = label icon = Icon(icon_name='dialog-cancel', pixel_size=style.SMALL_ICON_SIZE) self._toggle_state_item.set_image(icon) elif self._current_state == _GSM_STATE_CONNECTED: self._failed_connection = False self._toggle_state_item.set_label(_('Disconnect')) self.update_connection_time() icon = Icon(icon_name='media-eject', pixel_size=style.SMALL_ICON_SIZE) self._toggle_state_item.set_image(icon) elif self._current_state == _GSM_STATE_FAILED: message_error = self._get_error_by_nm_reason(reason) self.add_alert(message_error[0], message_error[1]) else: raise ValueError('Invalid GSM state while updating label and ' 'text, %s' % str(self._current_state)) def __toggle_state_cb(self, menuitem): if self._current_state == _GSM_STATE_NOT_READY: pass elif self._current_state == _GSM_STATE_DISCONNECTED: self.error_title_label.hide() self.error_description_label.hide() self.emit('gsm-connect') elif self._current_state == _GSM_STATE_CONNECTING: self.emit('gsm-disconnect') elif self._current_state == _GSM_STATE_CONNECTED: self.emit('gsm-disconnect') else: raise ValueError('Invalid GSM state while emitting signal, %s' % str(self._current_state)) def add_alert(self, error, suggestion): self._failed_connection = True action = _('Try connection again') self._toggle_state_item.set_label(action) title = _('Error: %s') % error self.error_title_label.set_markup('<b>%s</b>' % title) self.error_title_label.show() message = _('Suggestion: %s') % suggestion self.error_description_label.set_text(message) self.error_description_label.show() def update_connection_time(self, connection_time=None): if connection_time is not None: formatted_time = connection_time.strftime('%H:%M:%S') else: formatted_time = '00:00:00' text = _('Connected for %s') % (formatted_time, ) self.props.secondary_text = GLib.markup_escape_text(text) def update_stats(self, in_bytes, out_bytes): in_KBytes = in_bytes / 1024 out_KBytes = out_bytes / 1024 self._data_label_up.set_text(_('%d KB') % (out_KBytes)) self._data_label_down.set_text(_('%d KB') % (in_KBytes)) def _get_error_by_nm_reason(self, reason): if reason in [ network.NM_DEVICE_STATE_REASON_NO_SECRETS, network.NM_DEVICE_STATE_REASON_GSM_PIN_CHECK_FAILED ]: message = _('Check your PIN/PUK configuration.') elif reason in [ network.NM_DEVICE_STATE_REASON_PPP_DISCONNECT, network.NM_DEVICE_STATE_REASON_PPP_FAILED ]: message = _('Check your Access Point Name ' '(APN) configuration') elif reason in [ network.NM_DEVICE_STATE_REASON_MODEM_NO_CARRIER, network.NM_DEVICE_STATE_REASON_MODEM_DIAL_TIMEOUT ]: message = _('Check the Number configuration.') elif reason == network.NM_DEVICE_STATE_REASON_CONFIG_FAILED: message = _('Check your configuration.') else: message = '' message_tuple = (network.get_error_by_reason(reason), message) return message_tuple
class BuddyMenu(Palette): def __init__(self, buddy): self._buddy = buddy buddy_icon = Icon(icon_name='computer-xo', xo_color=buddy.get_color(), pixel_size=style.STANDARD_ICON_SIZE) nick = buddy.get_nick() Palette.__init__(self, None, primary_text=GLib.markup_escape_text(nick), icon=buddy_icon) self.menu_box = Gtk.VBox() self.set_content(self.menu_box) self.menu_box.show_all() self._invite_menu = None self._active_activity_changed_hid = None # Fixme: we need to make the widget accessible through the Palette API self._widget.connect('destroy', self.__destroy_cb) self._buddy.connect('notify::nick', self.__buddy_notify_nick_cb) if buddy.is_owner(): self._add_my_items() else: self._add_buddy_items() def __destroy_cb(self, menu): if self._active_activity_changed_hid is not None: home_model = shell.get_model() home_model.disconnect(self._active_activity_changed_hid) self._buddy.disconnect_by_func(self.__buddy_notify_nick_cb) def _add_buddy_items(self): menu_item = None if friends.get_model().has_buddy(self._buddy): menu_item = PaletteMenuItem(_('Remove friend'), 'list-remove') menu_item.connect('activate', self._remove_friend_cb) else: menu_item = PaletteMenuItem(_('Make friend'), 'list-add') menu_item.connect('activate', self._make_friend_cb) self.menu_box.pack_start(menu_item, True, True, 0) self._invite_menu = PaletteMenuItem('') self._invite_menu.connect('activate', self._invite_friend_cb) self.menu_box.pack_start(self._invite_menu, True, True, 0) home_model = shell.get_model() self._active_activity_changed_hid = home_model.connect( 'active-activity-changed', self._cur_activity_changed_cb) activity = home_model.get_active_activity() self._update_invite_menu(activity) def _add_my_items(self): settings = Gio.Settings('org.sugarlabs') show_shutdown = settings.get_boolean('show-shutdown') show_restart = settings.get_boolean('show-restart') show_logout = settings.get_boolean('show-logout') if "SUGAR_SHOW_SHUTDOWN" in os.environ: show_shutdown = os.environ["SUGAR_SHOW_SHUTDOWN"] == "yes" if "SUGAR_SHOW_RESTART" in os.environ: show_restart = os.environ["SUGAR_SHOW_RESTART"] == "yes" if "SUGAR_SHOW_LOGOUT" in os.environ: show_logout = os.environ["SUGAR_SHOW_LOGOUT"] == "yes" if show_shutdown: item = PaletteMenuItem(_('Shutdown'), 'system-shutdown') item.connect('activate', self.__shutdown_activate_cb) self.menu_box.pack_start(item, True, True, 0) if show_restart: item = PaletteMenuItem(_('Restart'), 'system-restart') item.connect('activate', self.__reboot_activate_cb) self.menu_box.pack_start(item, True, True, 0) item.show() if show_logout: item = PaletteMenuItem(_('Logout'), 'system-logout') item.connect('activate', self.__logout_activate_cb) self.menu_box.pack_start(item, True, True, 0) item.show() item = PaletteMenuItem(_('My Settings'), 'preferences-system') item.connect('activate', self.__controlpanel_activate_cb) self.menu_box.pack_start(item, True, True, 0) item.show() def _quit(self, action): home_window = jarabe.desktop.homewindow.get_instance() home_window.busy_during_delayed_action(action) def __logout_activate_cb(self, menu_item): self._quit(get_session_manager().logout) def __reboot_activate_cb(self, menu_item): self._quit(get_session_manager().reboot) def __shutdown_activate_cb(self, menu_item): self._quit(get_session_manager().shutdown) def __controlpanel_activate_cb(self, menu_item): # hide the frame when control panel is shown import jarabe.frame frame = jarabe.frame.get_view() frame.hide() # show the control panel panel = ControlPanel() panel.show() def _update_invite_menu(self, activity): buddy_activity = self._buddy.props.current_activity if buddy_activity is not None: buddy_activity_id = buddy_activity.activity_id else: buddy_activity_id = None if activity is None or activity.is_journal() or \ activity.get_activity_id() == buddy_activity_id: self._invite_menu.hide() else: title = activity.get_title() self._invite_menu.set_label(_('Invite to %s') % title) icon = Icon(file=activity.get_icon_path(), pixel_size=style.SMALL_ICON_SIZE) icon.props.xo_color = activity.get_icon_color() self._invite_menu.set_image(icon) icon.show() self._invite_menu.show() def _cur_activity_changed_cb(self, home_model, activity_model): self._update_invite_menu(activity_model) def __buddy_notify_nick_cb(self, buddy, pspec): self.set_primary_text(GLib.markup_escape_text(buddy.props.nick)) def _make_friend_cb(self, menuitem): friends.get_model().make_friend(self._buddy) def _remove_friend_cb(self, menuitem): friends.get_model().remove(self._buddy) def _invite_friend_cb(self, menuitem): activity = shell.get_model().get_active_activity() service = activity.get_service() if service: try: service.InviteContact(self._buddy.props.account, self._buddy.props.contact_id) except dbus.DBusException, e: expected_exceptions = [ 'org.freedesktop.DBus.Error.UnknownMethod', 'org.freedesktop.DBus.Python.NotImplementedError' ] if e.get_dbus_name() in expected_exceptions: logging.warning('Trying deprecated Activity.Invite') service.Invite(self._buddy.props.key) else: raise else:
class SpeakerPalette(Palette): def __init__(self, primary_text, model): Palette.__init__(self, label=primary_text) self._model = model box = PaletteMenuBox() self.set_content(box) box.show() self._mute_item = PaletteMenuItem('') self._mute_icon = Icon(pixel_size=style.SMALL_ICON_SIZE) self._mute_item.set_image(self._mute_icon) box.append_item(self._mute_item) self._mute_item.show() self._mute_item.connect('activate', self.__mute_activate_cb) separator = PaletteMenuItemSeparator() box.append_item(separator) separator.show() vol_step = sound.VOLUME_STEP self._adjustment = Gtk.Adjustment(value=self._model.props.level, lower=0, upper=100 + vol_step, step_incr=vol_step, page_incr=vol_step, page_size=vol_step) hscale = Gtk.HScale() hscale.props.draw_value = False hscale.set_adjustment(self._adjustment) hscale.set_digits(0) box.append_item(hscale, vertical_padding=0) hscale.show() self._adjustment_handler_id = \ self._adjustment.connect('value_changed', self.__adjustment_changed_cb) self._model_notify_level_handler_id = \ self._model.connect('notify::level', self.__level_changed_cb) self._model.connect('notify::muted', self.__muted_changed_cb) self.connect('popup', self.__popup_cb) def _update_muted(self): if self._model.props.muted: mute_item_text = _('Unmute') mute_item_icon_name = 'dialog-ok' else: mute_item_text = _('Mute') mute_item_icon_name = 'dialog-cancel' self._mute_item.set_label(mute_item_text) self._mute_icon.props.icon_name = mute_item_icon_name self._mute_icon.show() def _update_level(self): if self._adjustment.props.value != self._model.props.level: self._adjustment.handler_block(self._adjustment_handler_id) try: self._adjustment.props.value = self._model.props.level finally: self._adjustment.handler_unblock(self._adjustment_handler_id) def __adjustment_changed_cb(self, adj_): self._model.handler_block(self._model_notify_level_handler_id) try: self._model.props.level = self._adjustment.props.value finally: self._model.handler_unblock(self._model_notify_level_handler_id) self._model.props.muted = self._adjustment.props.value == 0 def __level_changed_cb(self, pspec_, param_): self._update_level() def __mute_activate_cb(self, menuitem_): self._model.props.muted = not self._model.props.muted def __muted_changed_cb(self, pspec_, param_): self._update_muted() def __popup_cb(self, palette_): self._update_level() self._update_muted()
class WirelessNetworkView(EventPulsingIcon): def __init__(self, initial_ap): EventPulsingIcon.__init__(self, pixel_size=style.STANDARD_ICON_SIZE, cache=True) self._bus = dbus.SystemBus() self._access_points = {initial_ap.model.object_path: initial_ap} self._active_ap = None self._device = initial_ap.device self._palette_icon = None self._disconnect_item = None self._connect_item = None self._filtered = False self._ssid = initial_ap.ssid self._display_name = network.ssid_to_display_name(self._ssid) self._mode = initial_ap.mode self._strength = initial_ap.strength self._flags = initial_ap.flags self._wpa_flags = initial_ap.wpa_flags self._rsn_flags = initial_ap.rsn_flags self._device_caps = 0 self._device_state = None self._color = None self._removed_hid = None if self._mode == network.NM_802_11_MODE_ADHOC and \ network.is_sugar_adhoc_network(self._ssid): self._color = profile.get_color() else: sha_hash = hashlib.sha1() data = self._ssid + hex(self._flags) sha_hash.update(data) digest = hash(sha_hash.digest()) index = digest % len(xocolor.colors) self._color = xocolor.XoColor('%s,%s' % (xocolor.colors[index][0], xocolor.colors[index][1])) pulse_color = XoColor('%s,%s' % (style.COLOR_BUTTON_GREY.get_svg(), style.COLOR_TRANSPARENT.get_svg())) self.props.pulse_color = pulse_color self.props.palette_invoker.props.toggle_palette = True self._palette = self._create_palette() self.set_palette(self._palette) self._palette_icon.props.xo_color = self._color self._update_badge() interface_props = dbus.Interface(self._device, dbus.PROPERTIES_IFACE) interface_props.Get(network.NM_WIRELESS_IFACE, 'WirelessCapabilities', reply_handler=self.__get_device_caps_reply_cb, error_handler=self.__get_device_caps_error_cb) interface_props.Get(network.NM_WIRELESS_IFACE, 'ActiveAccessPoint', reply_handler=self.__get_active_ap_reply_cb, error_handler=self.__get_active_ap_error_cb) self._bus.add_signal_receiver(self.__device_state_changed_cb, signal_name='StateChanged', path=self._device.object_path, dbus_interface=network.NM_DEVICE_IFACE) self._bus.add_signal_receiver(self.__wireless_properties_changed_cb, signal_name='PropertiesChanged', path=self._device.object_path, dbus_interface=network.NM_WIRELESS_IFACE) def _create_palette(self): icon_name = get_icon_state(_AP_ICON_NAME, self._strength) self._palette_icon = Icon(icon_name=icon_name, pixel_size=style.STANDARD_ICON_SIZE, badge_name=self.props.badge_name) p = palette.Palette(primary_text=self._display_name, icon=self._palette_icon) self.menu_box = Gtk.VBox() self._connect_item = PaletteMenuItem(_('Connect')) icon = Icon(pixel_size=style.SMALL_ICON_SIZE, icon_name='dialog-ok') self._connect_item.set_image(icon) self._connect_item.connect('activate', self.__connect_activate_cb) self.menu_box.add(self._connect_item) self._disconnect_item = PaletteMenuItem(_('Disconnect')) icon = Icon(pixel_size=style.SMALL_ICON_SIZE, icon_name='media-eject') self._disconnect_item.set_image(icon) self._disconnect_item.connect( 'activate', self.__disconnect_activate_cb) self.menu_box.add(self._disconnect_item) self._forget_item = PaletteMenuItem(_('Forget')) icon = Icon(pixel_size=style.SMALL_ICON_SIZE, icon_name='list-remove') self._forget_item.set_image(icon) self._forget_item.connect('activate', self.__forget_activate_cb) self.menu_box.add(self._forget_item) p.set_content(self.menu_box) self.menu_box.show_all() self.connect_to_palette_pop_events(p) return p def __device_state_changed_cb(self, new_state, old_state, reason): self._device_state = new_state self._update_state() self._update_icon() self._update_badge() self._update_color() def __update_active_ap(self, ap_path): if ap_path in self._access_points: # save reference to active AP, so that we always display the # strength of that one self._active_ap = self._access_points[ap_path] self.update_strength() elif self._active_ap is not None: # revert to showing state of strongest AP again self._active_ap = None self.update_strength() def __wireless_properties_changed_cb(self, properties): if 'ActiveAccessPoint' in properties: self.__update_active_ap(properties['ActiveAccessPoint']) def __get_active_ap_reply_cb(self, ap_path): self.__update_active_ap(ap_path) interface_props = dbus.Interface(self._device, dbus.PROPERTIES_IFACE) interface_props.Get(network.NM_DEVICE_IFACE, 'State', reply_handler=self.__get_device_state_reply_cb, error_handler=self.__get_device_state_error_cb) def __get_active_ap_error_cb(self, err): logging.error('Error getting the active access point: %s', err) def __get_device_caps_reply_cb(self, caps): self._device_caps = caps def __get_device_caps_error_cb(self, err): logging.error('Error getting the wireless device properties: %s', err) def __get_device_state_reply_cb(self, state): self._device_state = state self._update_state() self._update_color() self._update_icon() self._update_badge() def __get_device_state_error_cb(self, err): logging.error('Error getting the device state: %s', err) def _update_icon(self): if self._mode == network.NM_802_11_MODE_ADHOC and \ network.is_sugar_adhoc_network(self._ssid): channel = max([1] + [ap.channel for ap in self._access_points.values()]) if self._device_state == network.NM_DEVICE_STATE_ACTIVATED and \ self._active_ap is not None: icon_name = 'network-adhoc-%s-connected' % channel else: icon_name = 'network-adhoc-%s' % channel self.props.icon_name = icon_name icon = self._palette.props.icon icon.props.icon_name = icon_name else: if self._device_state == network.NM_DEVICE_STATE_ACTIVATED and \ self._active_ap is not None: icon_name = '%s-connected' % _AP_ICON_NAME else: icon_name = _AP_ICON_NAME icon_name = get_icon_state(icon_name, self._strength) if icon_name: self.props.icon_name = icon_name icon = self._palette.props.icon icon.props.icon_name = icon_name def _update_badge(self): badge = None favorite = False if self._mode != network.NM_802_11_MODE_ADHOC: locked = (self._flags == network.NM_802_11_AP_FLAGS_PRIVACY) connection = network.find_connection_by_ssid(self._ssid) if connection is not None: favorite = True self._connect_removed(connection) if locked: badge = 'emblem-favorite-locked' else: badge = 'emblem-favorite' elif locked: badge = 'emblem-locked' self.props.badge_name = self._palette_icon.props.badge_name = badge self._forget_item.set_visible(favorite) def _connect_removed(self, connection): if self._removed_hid is not None: return self._removed_hid = connection.connect('removed', self._connection_removed_cb) def _disconnect_removed(self, connection): connection.disconnect(self._removed_hid) self._removed_hid = None def _connection_removed_cb(self, connection): self._update_badge() self._disconnect_removed(connection) def _update_state(self): if self._active_ap is not None: state = self._device_state else: state = network.NM_DEVICE_STATE_UNKNOWN if state == network.NM_DEVICE_STATE_PREPARE or \ state == network.NM_DEVICE_STATE_CONFIG or \ state == network.NM_DEVICE_STATE_NEED_AUTH or \ state == network.NM_DEVICE_STATE_IP_CONFIG: if self._disconnect_item: self._disconnect_item.show() self._connect_item.hide() self._palette.props.secondary_text = _('Connecting...') self.props.pulsing = True elif state == network.NM_DEVICE_STATE_ACTIVATED: network.set_connected() if self._disconnect_item: self._disconnect_item.show() self._connect_item.hide() self._palette.props.secondary_text = _('Connected') self.props.pulsing = False else: if self._disconnect_item: self._disconnect_item.hide() self._connect_item.show() self._palette.props.secondary_text = None self.props.pulsing = False def _update_color(self): self.props.base_color = self._color if self._filtered: self.props.pulsing = False self.props.alpha = _FILTERED_ALPHA else: self.props.alpha = 1.0 def __disconnect_activate_cb(self, item): ap_paths = self._access_points.keys() network.disconnect_access_points(ap_paths) def __forget_activate_cb(self, item): network.forget_wireless_network(self._ssid) def _add_ciphers_from_flags(self, flags, pairwise): ciphers = [] if pairwise: if flags & network.NM_802_11_AP_SEC_PAIR_TKIP: ciphers.append('tkip') if flags & network.NM_802_11_AP_SEC_PAIR_CCMP: ciphers.append('ccmp') else: if flags & network.NM_802_11_AP_SEC_GROUP_WEP40: ciphers.append('wep40') if flags & network.NM_802_11_AP_SEC_GROUP_WEP104: ciphers.append('wep104') if flags & network.NM_802_11_AP_SEC_GROUP_TKIP: ciphers.append('tkip') if flags & network.NM_802_11_AP_SEC_GROUP_CCMP: ciphers.append('ccmp') return ciphers def _get_security(self): if not (self._flags & network.NM_802_11_AP_FLAGS_PRIVACY) and \ (self._wpa_flags == network.NM_802_11_AP_SEC_NONE) and \ (self._rsn_flags == network.NM_802_11_AP_SEC_NONE): # No security return None if (self._flags & network.NM_802_11_AP_FLAGS_PRIVACY) and \ (self._wpa_flags == network.NM_802_11_AP_SEC_NONE) and \ (self._rsn_flags == network.NM_802_11_AP_SEC_NONE): # Static WEP, Dynamic WEP, or LEAP wireless_security = WirelessSecurity() wireless_security.key_mgmt = 'none' return wireless_security if (self._mode != network.NM_802_11_MODE_INFRA): # Stuff after this point requires infrastructure logging.error('The infrastructure mode is not supoorted' ' by your wireless device.') return None if (self._rsn_flags & network.NM_802_11_AP_SEC_KEY_MGMT_PSK) and \ (self._device_caps & network.NM_WIFI_DEVICE_CAP_RSN): # WPA2 PSK first pairwise = self._add_ciphers_from_flags(self._rsn_flags, True) group = self._add_ciphers_from_flags(self._rsn_flags, False) wireless_security = WirelessSecurity() wireless_security.key_mgmt = 'wpa-psk' wireless_security.proto = 'rsn' wireless_security.pairwise = pairwise wireless_security.group = group return wireless_security if (self._wpa_flags & network.NM_802_11_AP_SEC_KEY_MGMT_PSK) and \ (self._device_caps & network.NM_WIFI_DEVICE_CAP_WPA): # WPA PSK pairwise = self._add_ciphers_from_flags(self._wpa_flags, True) group = self._add_ciphers_from_flags(self._wpa_flags, False) wireless_security = WirelessSecurity() wireless_security.key_mgmt = 'wpa-psk' wireless_security.proto = 'wpa' wireless_security.pairwise = pairwise wireless_security.group = group return wireless_security def __connect_activate_cb(self, icon): self._connect() def _connect(self): # Activate existing connection, if there is one connection = network.find_connection_by_ssid(self._ssid) if connection: logging.debug('Activating existing connection for SSID %r', self._ssid) connection.activate(self._device) return # Otherwise, create new connection and activate it logging.debug('Creating new connection for SSID %r', self._ssid) settings = Settings() settings.connection.id = self._display_name settings.connection.uuid = str(uuid.uuid4()) settings.connection.type = '802-11-wireless' settings.wireless.ssid = self._ssid if self._mode == network.NM_802_11_MODE_INFRA: settings.wireless.mode = 'infrastructure' settings.connection.autoconnect = True elif self._mode == network.NM_802_11_MODE_ADHOC: settings.wireless.mode = 'adhoc' settings.wireless.band = 'bg' settings.ip4_config = IP4Config() settings.ip4_config.method = 'link-local' wireless_security = self._get_security() settings.wireless_security = wireless_security if wireless_security is not None: settings.wireless.security = '802-11-wireless-security' network.add_and_activate_connection(self._device, settings, self.get_first_ap().model) def set_filter(self, query): normalized_name = normalize_string(self._display_name.decode('utf-8')) self._filtered = normalized_name.find(query) == -1 self._update_icon() self._update_color() def create_keydialog(self, response): keydialog.create(self._ssid, self._flags, self._wpa_flags, self._rsn_flags, self._device_caps, response) def update_strength(self): if self._active_ap is not None: # display strength of AP that we are connected to new_strength = self._active_ap.strength else: # display the strength of the strongest AP that makes up this # network, also considering that there may be no APs new_strength = max([0] + [ap.strength for ap in self._access_points.values()]) if new_strength != self._strength: self._strength = new_strength self._update_icon() def add_ap(self, ap): self._access_points[ap.model.object_path] = ap self.update_strength() def remove_ap(self, ap): path = ap.model.object_path if path not in self._access_points: return del self._access_points[path] if self._active_ap == ap: self._active_ap = None self.update_strength() def num_aps(self): return len(self._access_points) def find_ap(self, ap_path): if ap_path not in self._access_points: return None return self._access_points[ap_path] def get_first_ap(self): return self._access_points.values()[0] def is_olpc_mesh(self): return self._mode == network.NM_802_11_MODE_ADHOC \ and self._ssid == 'olpc-mesh' def remove_all_aps(self): for ap in self._access_points.values(): ap.disconnect() self._access_points = {} self._active_ap = None self.update_strength() def disconnect(self): self._bus.remove_signal_receiver( self.__device_state_changed_cb, signal_name='StateChanged', path=self._device.object_path, dbus_interface=network.NM_DEVICE_IFACE) self._bus.remove_signal_receiver( self.__wireless_properties_changed_cb, signal_name='PropertiesChanged', path=self._device.object_path, dbus_interface=network.NM_WIRELESS_IFACE) def get_positioning_data(self): return str(self.get_first_ap().network_hash())
class OlpcMeshView(EventPulsingIcon): def __init__(self, mesh_mgr, channel): EventPulsingIcon.__init__(self, icon_name=_OLPC_MESH_ICON_NAME, pixel_size=style.STANDARD_ICON_SIZE, cache=True) self._bus = dbus.SystemBus() self._channel = channel self._mesh_mgr = mesh_mgr self._disconnect_item = None self._connect_item = None self._filtered = False self._device_state = None self._active = False device = mesh_mgr.mesh_device interface_props = dbus.Interface(device, dbus.PROPERTIES_IFACE) interface_props.Get(network.NM_DEVICE_IFACE, 'State', reply_handler=self.__get_device_state_reply_cb, error_handler=self.__get_device_state_error_cb) interface_props.Get(network.NM_OLPC_MESH_IFACE, 'ActiveChannel', reply_handler=self.__get_active_channel_reply_cb, error_handler=self.__get_active_channel_error_cb) self._bus.add_signal_receiver(self.__device_state_changed_cb, signal_name='StateChanged', path=device.object_path, dbus_interface=network.NM_DEVICE_IFACE) self._bus.add_signal_receiver( self.__wireless_properties_changed_cb, signal_name='PropertiesChanged', path=device.object_path, dbus_interface=network.NM_OLPC_MESH_IFACE) pulse_color = XoColor('%s,%s' % (style.COLOR_BUTTON_GREY.get_svg(), style.COLOR_TRANSPARENT.get_svg())) self.props.pulse_color = pulse_color self.props.base_color = profile.get_color() self.palette_invoker.props.toggle_palette = True self._palette = self._create_palette() self.set_palette(self._palette) def _create_palette(self): _palette = palette.Palette(_('Mesh Network %d') % (self._channel, )) self.menu_box = Gtk.VBox() self._connect_item = PaletteMenuItem(_('Connect')) icon = Icon(pixel_size=style.SMALL_ICON_SIZE, icon_name='dialog-ok') self._connect_item.set_image(icon) self._connect_item.connect('activate', self.__connect_activate_cb) self.menu_box.add(self._connect_item) _palette.set_content(self.menu_box) self.menu_box.show_all() return _palette def __get_device_state_reply_cb(self, state): self._device_state = state self._update() def __get_device_state_error_cb(self, err): logging.error('Error getting the device state: %s', err) def __device_state_changed_cb(self, new_state, old_state, reason): self._device_state = new_state self._update() self._update_color() def __get_active_channel_reply_cb(self, channel): self._active = (channel == self._channel) self._update() def __get_active_channel_error_cb(self, err): logging.error('Error getting the active channel: %s', err) def __wireless_properties_changed_cb(self, properties): if 'ActiveChannel' in properties: channel = properties['ActiveChannel'] self._active = (channel == self._channel) self._update() def _update(self): if self._active: state = self._device_state else: state = network.NM_DEVICE_STATE_UNKNOWN if state in [network.NM_DEVICE_STATE_PREPARE, network.NM_DEVICE_STATE_CONFIG, network.NM_DEVICE_STATE_NEED_AUTH, network.NM_DEVICE_STATE_IP_CONFIG]: if self._disconnect_item: self._disconnect_item.show() self._connect_item.hide() self._palette.props.secondary_text = _('Connecting...') self.props.pulsing = True elif state == network.NM_DEVICE_STATE_ACTIVATED: if self._disconnect_item: self._disconnect_item.show() self._connect_item.hide() self._palette.props.secondary_text = _('Connected') self.props.pulsing = False else: if self._disconnect_item: self._disconnect_item.hide() self._connect_item.show() self._palette.props.secondary_text = None self.props.pulsing = False def _update_color(self): self.props.base_color = profile.get_color() if self._filtered: self.alpha = _FILTERED_ALPHA else: self.alpha = 1.0 def __connect_activate_cb(self, icon): self._connect() def _connect(self): self._mesh_mgr.user_activate_channel(self._channel) def set_filter(self, query): self._filtered = (query != '') self._update_color() def disconnect(self): device_object_path = self._mesh_mgr.mesh_device.object_path self._bus.remove_signal_receiver( self.__device_state_changed_cb, signal_name='StateChanged', path=device_object_path, dbus_interface=network.NM_DEVICE_IFACE) self._bus.remove_signal_receiver( self.__wireless_properties_changed_cb, signal_name='PropertiesChanged', path=device_object_path, dbus_interface=network.NM_OLPC_MESH_IFACE) def get_positioning_data(self): return str(type(self)) + str(self._channel)
def _update(self): new_state = self.file_transfer.props.state logging.debug('_update state: %r', new_state) box = PaletteMenuBox() self.set_content(box) box.show() if new_state == filetransfer.FT_STATE_PENDING: menu_item = PaletteMenuItem(_('Cancel')) icon = Icon(icon_name='dialog-cancel', pixel_size=style.SMALL_ICON_SIZE) menu_item.set_image(icon) icon.show() menu_item.connect('activate', self.__cancel_activate_cb) box.append_item(menu_item) menu_item.show() separator = PaletteMenuItemSeparator() box.append_item(separator) separator.show() inner_box = Gtk.VBox() inner_box.set_spacing(style.DEFAULT_PADDING) box.append_item(inner_box, vertical_padding=0) inner_box.show() if self.file_transfer.description: label = Gtk.Label(label=self.file_transfer.description) inner_box.add(label) label.show() mime_type = self.file_transfer.mime_type type_description = mime.get_mime_description(mime_type) size = self._format_size(self.file_transfer.file_size) label = Gtk.Label(label='%s (%s)' % (size, type_description)) inner_box.add(label) label.show() elif new_state in [filetransfer.FT_STATE_ACCEPTED, filetransfer.FT_STATE_OPEN]: menu_item = PaletteMenuItem(_('Cancel')) icon = Icon(icon_name='dialog-cancel', pixel_size=style.SMALL_ICON_SIZE) menu_item.set_image(icon) icon.show() menu_item.connect('activate', self.__cancel_activate_cb) box.append_item(menu_item) menu_item.show() separator = PaletteMenuItemSeparator() box.append_item(separator) separator.show() inner_box = Gtk.VBox() inner_box.set_spacing(style.DEFAULT_PADDING) box.append_item(inner_box, vertical_padding=0) inner_box.show() self.progress_bar = Gtk.ProgressBar() inner_box.add(self.progress_bar) self.progress_bar.show() self.progress_label = Gtk.Label(label='') inner_box.add(self.progress_label) self.progress_label.show() self.update_progress() elif new_state in [filetransfer.FT_STATE_COMPLETED, filetransfer.FT_STATE_CANCELLED]: menu_item = PaletteMenuItem(_('Dismiss')) icon = Icon(icon_name='dialog-cancel', pixel_size=style.SMALL_ICON_SIZE) menu_item.set_image(icon) icon.show() menu_item.connect('activate', self.__dismiss_activate_cb) box.append_item(menu_item) menu_item.show() self.update_progress()
class SugarAdhocView(EventPulsingIcon): """To mimic the mesh behavior on devices where mesh hardware is not available we support the creation of an Ad-hoc network on three channels 1, 6, 11. This is the class for an icon representing a channel in the neighborhood view. """ _ICON_NAME = 'network-adhoc-' _NAME = 'Ad-hoc Network ' def __init__(self, channel): EventPulsingIcon.__init__(self, icon_name=self._ICON_NAME + str(channel), pixel_size=style.STANDARD_ICON_SIZE, cache=True) self._bus = dbus.SystemBus() self._channel = channel self._disconnect_item = None self._connect_item = None self._palette_icon = None self._filtered = False get_adhoc_manager_instance().connect('members-changed', self.__members_changed_cb) get_adhoc_manager_instance().connect('state-changed', self.__state_changed_cb) pulse_color = XoColor('%s,%s' % (style.COLOR_BUTTON_GREY.get_svg(), style.COLOR_TRANSPARENT.get_svg())) self.props.pulse_color = pulse_color self._state_color = XoColor('%s,%s' % (profile.get_color().get_stroke_color(), style.COLOR_TRANSPARENT.get_svg())) self.props.base_color = self._state_color self.palette_invoker.props.toggle_palette = True self._palette = self._create_palette() self.set_palette(self._palette) self._palette_icon.props.xo_color = self._state_color def _create_palette(self): self._palette_icon = Icon( icon_name=self._ICON_NAME + str(self._channel), pixel_size=style.STANDARD_ICON_SIZE) palette_ = palette.Palette(_('Ad-hoc Network %d') % (self._channel, ), icon=self._palette_icon) self.menu_box = Gtk.VBox() self._connect_item = PaletteMenuItem(_('Connect')) icon = Icon(pixel_size=style.SMALL_ICON_SIZE, icon_name='dialog-ok') self._connect_item.set_image(icon) self._connect_item.connect('activate', self.__connect_activate_cb) self.menu_box.add(self._connect_item) self._disconnect_item = PaletteMenuItem(_('Disconnect')) icon = Icon(pixel_size=style.SMALL_ICON_SIZE, icon_name='media-eject') self._disconnect_item.set_image(icon) self._disconnect_item.connect( 'activate', self.__disconnect_activate_cb) self.menu_box.add(self._disconnect_item) palette_.set_content(self.menu_box) self.menu_box.show_all() self._disconnect_item.hide() self.connect_to_palette_pop_events(palette_) return palette_ def __connect_activate_cb(self, icon): get_adhoc_manager_instance().activate_channel(self._channel) def __disconnect_activate_cb(self, icon): get_adhoc_manager_instance().deactivate_active_channel() def __state_changed_cb(self, adhoc_manager, channel, device_state): if self._channel == channel: state = device_state else: state = network.NM_DEVICE_STATE_UNKNOWN if state == network.NM_DEVICE_STATE_ACTIVATED: icon_name = '%s-connected' % (self._ICON_NAME + str(self._channel)) else: icon_name = self._ICON_NAME + str(self._channel) if icon_name is not None: self.props.icon_name = icon_name icon = self._palette.props.icon icon.props.icon_name = icon_name if (state >= network.NM_DEVICE_STATE_PREPARE) and \ (state <= network.NM_DEVICE_STATE_IP_CONFIG): if self._disconnect_item: self._disconnect_item.show() self._connect_item.hide() self._palette.props.secondary_text = _('Connecting...') self.props.pulsing = True elif state == network.NM_DEVICE_STATE_ACTIVATED: if self._disconnect_item: self._disconnect_item.show() self._connect_item.hide() self._palette.props.secondary_text = _('Connected') self.props.pulsing = False else: if self._disconnect_item: self._disconnect_item.hide() self._connect_item.show() self._palette.props.secondary_text = None self.props.pulsing = False self._update_color() def _update_color(self): self.props.base_color = self._state_color if self._filtered: self.props.pulsing = False self.alpha = _FILTERED_ALPHA else: self.alpha = 1.0 def __members_changed_cb(self, adhoc_manager, channel, has_members): if channel == self._channel: if has_members is True: self._state_color = profile.get_color() else: color = '%s,%s' % (profile.get_color().get_stroke_color(), style.COLOR_TRANSPARENT.get_svg()) self._state_color = XoColor(color) if not self._filtered: self.props.base_color = self._state_color self._palette_icon.props.xo_color = self._state_color self.alpha = 1.0 else: self.alpha = _FILTERED_ALPHA def set_filter(self, query): name = self._NAME + str(self._channel) self._filtered = name.lower().find(query) == -1 self._update_color() def get_positioning_data(self): return str(type(self)) + str(self._channel)
class GsmPalette(Palette): __gtype_name__ = 'SugarGsmPalette' __gsignals__ = { 'gsm-connect': (GObject.SignalFlags.RUN_FIRST, None, ([])), 'gsm-disconnect': (GObject.SignalFlags.RUN_FIRST, None, ([])), } def __init__(self): Palette.__init__(self, primary_text=_('Wireless modem')) self._current_state = None self._failed_connection = False self.info_box = Gtk.VBox() self._toggle_state_item = PaletteMenuItem('') self._toggle_state_item.connect('activate', self.__toggle_state_cb) self.info_box.pack_start(self._toggle_state_item, True, True, 0) self._toggle_state_item.show() self.error_title_label = Gtk.Label(label="") self.error_title_label.set_alignment(0, 0.5) self.error_title_label.set_line_wrap(True) self.info_box.pack_start(self.error_title_label, True, True, 0) self.error_description_label = Gtk.Label(label="") self.error_description_label.set_alignment(0, 0.5) self.error_description_label.set_line_wrap(True) self.info_box.pack_start(self.error_description_label, True, True, 0) self.connection_info_box = Gtk.HBox() icon = Icon(icon_name='data-upload', pixel_size=style.SMALL_ICON_SIZE) self.connection_info_box.pack_start(icon, True, True, 0) icon.show() self._data_label_up = Gtk.Label() self._data_label_up.props.xalign = 0.0 label_alignment = self._add_widget_with_padding(self._data_label_up) self.connection_info_box.pack_start(label_alignment, True, True, 0) self._data_label_up.show() label_alignment.show() icon = Icon(icon_name='data-download', pixel_size=style.SMALL_ICON_SIZE) self.connection_info_box.pack_start(icon, True, True, 0) icon.show() self._data_label_down = Gtk.Label() self._data_label_down.props.xalign = 0.0 label_alignment = self._add_widget_with_padding(self._data_label_down) self.connection_info_box.pack_start(label_alignment, True, True, 0) self._data_label_down.show() label_alignment.show() self.info_box.pack_start(self.connection_info_box, True, True, 0) self.info_box.show() self.set_content(self.info_box) self.update_state(_GSM_STATE_NOT_READY) def _add_widget_with_padding(self, child, xalign=0, yalign=0.5): alignment = Gtk.Alignment.new(xalign=xalign, yalign=yalign, xscale=1, yscale=0.33) alignment.set_padding(style.DEFAULT_SPACING, style.DEFAULT_SPACING, style.DEFAULT_SPACING, style.DEFAULT_SPACING) alignment.add(child) return alignment def update_state(self, state, reason=0): self._current_state = state self._update_label_and_text(reason) def _update_label_and_text(self, reason=0): if self._current_state == _GSM_STATE_NOT_READY: self._toggle_state_item.set_label('...') self.props.secondary_text = _('Please wait...') elif self._current_state == _GSM_STATE_DISCONNECTED: if not self._failed_connection: self._toggle_state_item.set_label(_('Connect')) self.props.secondary_text = _('Disconnected') icon = Icon(icon_name='dialog-ok', pixel_size=style.SMALL_ICON_SIZE) self._toggle_state_item.set_image(icon) elif self._current_state == _GSM_STATE_CONNECTING: self._toggle_state_item.set_label(_('Cancel')) self.props.secondary_text = _('Connecting...') icon = Icon(icon_name='dialog-cancel', pixel_size=style.SMALL_ICON_SIZE) self._toggle_state_item.set_image(icon) elif self._current_state == _GSM_STATE_CONNECTED: self._failed_connection = False self._toggle_state_item.set_label(_('Disconnect')) self.update_connection_time() icon = Icon(icon_name='media-eject', pixel_size=style.SMALL_ICON_SIZE) self._toggle_state_item.set_image(icon) elif self._current_state == _GSM_STATE_FAILED: message_error = self._get_error_by_nm_reason(reason) self.add_alert(message_error[0], message_error[1]) else: raise ValueError('Invalid GSM state while updating label and ' 'text, %s' % str(self._current_state)) def __toggle_state_cb(self, menuitem): if self._current_state == _GSM_STATE_NOT_READY: pass elif self._current_state == _GSM_STATE_DISCONNECTED: self.error_title_label.hide() self.error_description_label.hide() self.emit('gsm-connect') elif self._current_state == _GSM_STATE_CONNECTING: self.emit('gsm-disconnect') elif self._current_state == _GSM_STATE_CONNECTED: self.emit('gsm-disconnect') else: raise ValueError('Invalid GSM state while emitting signal, %s' % str(self._current_state)) def add_alert(self, error, suggestion): self._failed_connection = True action = _('Try connection again') self._toggle_state_item.set_label(action) title = _('Error: %s') % error self.error_title_label.set_markup('<b>%s</b>' % title) self.error_title_label.show() message = _('Suggestion: %s') % suggestion self.error_description_label.set_text(message) self.error_description_label.show() def update_connection_time(self, connection_time=None): if connection_time is not None: formatted_time = connection_time.strftime('%H:%M:%S') else: formatted_time = '00:00:00' self.props.secondary_text = _('Connected for %s') % (formatted_time, ) def update_stats(self, in_bytes, out_bytes): self._data_label_up.set_text(_('%d KiB') % (out_bytes / 1024)) self._data_label_down.set_text(_('%d KiB') % (in_bytes / 1024)) def _get_error_by_nm_reason(self, reason): if reason in [network.NM_DEVICE_STATE_REASON_NO_SECRETS, network.NM_DEVICE_STATE_REASON_GSM_PIN_CHECK_FAILED]: message = _('Check your PIN/PUK configuration.') elif reason in [network.NM_DEVICE_STATE_REASON_PPP_DISCONNECT, network.NM_DEVICE_STATE_REASON_PPP_FAILED]: message = _('Check your Access Point Name ' '(APN) configuration') elif reason in [network.NM_DEVICE_STATE_REASON_MODEM_NO_CARRIER, network.NM_DEVICE_STATE_REASON_MODEM_DIAL_TIMEOUT]: message = _('Check the Number configuration.') elif reason == network.NM_DEVICE_STATE_REASON_CONFIG_FAILED: message = _('Check your configuration.') else: message = '' message_tuple = (network.get_error_by_reason(reason), message) return message_tuple
class SpeakerPalette(Palette): def __init__(self, primary_text, model): Palette.__init__(self, label=primary_text) self._model = model box = PaletteMenuBox() self.set_content(box) box.show() self._mute_item = PaletteMenuItem("") self._mute_icon = Icon(icon_size=Gtk.IconSize.MENU) self._mute_item.set_image(self._mute_icon) box.append_item(self._mute_item) self._mute_item.show() self._mute_item.connect("activate", self.__mute_activate_cb) separator = PaletteMenuItemSeparator() box.append_item(separator) separator.show() vol_step = sound.VOLUME_STEP self._adjustment = Gtk.Adjustment( value=self._model.props.level, lower=0, upper=100 + vol_step, step_incr=vol_step, page_incr=vol_step, page_size=vol_step, ) hscale = Gtk.HScale() hscale.props.draw_value = False hscale.set_adjustment(self._adjustment) hscale.set_digits(0) box.append_item(hscale, vertical_padding=0) hscale.show() self._adjustment_handler_id = self._adjustment.connect("value_changed", self.__adjustment_changed_cb) self._model_notify_level_handler_id = self._model.connect("notify::level", self.__level_changed_cb) self._model.connect("notify::muted", self.__muted_changed_cb) self.connect("popup", self.__popup_cb) def _update_muted(self): if self._model.props.muted: mute_item_text = _("Unmute") mute_item_icon_name = "dialog-ok" else: mute_item_text = _("Mute") mute_item_icon_name = "dialog-cancel" self._mute_item.set_label(mute_item_text) self._mute_icon.props.icon_name = mute_item_icon_name self._mute_icon.show() def _update_level(self): if self._adjustment.props.value != self._model.props.level: self._adjustment.handler_block(self._adjustment_handler_id) try: self._adjustment.props.value = self._model.props.level finally: self._adjustment.handler_unblock(self._adjustment_handler_id) def __adjustment_changed_cb(self, adj_): self._model.handler_block(self._model_notify_level_handler_id) try: self._model.props.level = self._adjustment.props.value finally: self._model.handler_unblock(self._model_notify_level_handler_id) self._model.props.muted = self._adjustment.props.value == 0 def __level_changed_cb(self, pspec_, param_): self._update_level() def __mute_activate_cb(self, menuitem_): self._model.props.muted = not self._model.props.muted def __muted_changed_cb(self, pspec_, param_): self._update_muted() def __popup_cb(self, palette_): self._update_level() self._update_muted()
class WirelessPalette(Palette): __gtype_name__ = 'SugarWirelessPalette' __gsignals__ = { 'deactivate-connection': (GObject.SignalFlags.RUN_FIRST, None, ([])), } def __init__(self, primary_text): Palette.__init__(self, label=primary_text) self._disconnect_item = None self._channel_label = Gtk.Label() self._channel_label.props.xalign = 0.0 self._channel_label.show() self._ip_address_label = Gtk.Label() self._ip_address_label.props.xalign = 0.0 self._ip_address_label.show() self._info = Gtk.VBox() self._disconnect_item = PaletteMenuItem(_('Disconnect')) icon = Icon(pixel_size=style.SMALL_ICON_SIZE, icon_name='media-eject') self._disconnect_item.set_image(icon) self._disconnect_item.connect('activate', self.__disconnect_activate_cb) self._info.add(self._disconnect_item) separator = PaletteMenuItemSeparator() self._info.pack_start(separator, True, True, 0) def _padded(child, xalign=0, yalign=0.5): padder = Gtk.Alignment.new(xalign=xalign, yalign=yalign, xscale=1, yscale=0.33) padder.set_padding(style.DEFAULT_SPACING, style.DEFAULT_SPACING, style.DEFAULT_SPACING, style.DEFAULT_SPACING) padder.add(child) return padder self._info.pack_start(_padded(self._channel_label), True, True, 0) self._info.pack_start(_padded(self._ip_address_label), True, True, 0) self._info.show_all() def set_connecting(self): label = GLib.markup_escape_text(_('Connecting...')) self.props.secondary_text = label def _set_connected(self, iaddress): self.set_content(self._info) self.props.secondary_text = GLib.markup_escape_text(_('Connected')) self._set_ip_address(iaddress) self._disconnect_item.show() def set_connected_with_frequency(self, frequency, iaddress): self._set_connected(iaddress) self._set_frequency(frequency) def set_connected_with_channel(self, channel, iaddress): self._set_connected(iaddress) self._set_channel(channel) def set_disconnected(self): label = GLib.markup_escape_text(_('No wireless connection')) self.props.primary_text = label self.props.secondary_text = '' self._disconnect_item.hide() self.set_content(None) def __disconnect_activate_cb(self, menuitem): self.emit('deactivate-connection') def _set_frequency(self, frequency): channel = network.frequency_to_channel(frequency) self._set_channel(channel) def _set_channel(self, channel): if channel == 0: self._channel_label.set_text('%s: %s' % (_('Channel'), _('Unknown'))) else: self._channel_label.set_text('%s: %d' % (_('Channel'), channel)) def _set_ip_address(self, ip_address): if ip_address is not None: ip_address_text = IP_ADDRESS_TEXT_TEMPLATE % \ socket.inet_ntoa(struct.pack('I', ip_address)) else: ip_address_text = "" self._ip_address_label.set_text(ip_address_text)
class WirelessNetworkView(EventPulsingIcon): def __init__(self, initial_ap): EventPulsingIcon.__init__(self, pixel_size=style.STANDARD_ICON_SIZE, cache=True) self._bus = dbus.SystemBus() self._access_points = {initial_ap.model.object_path: initial_ap} self._active_ap = None self._device = initial_ap.device self._palette_icon = None self._disconnect_item = None self._connect_item = None self._filtered = False self._ssid = initial_ap.ssid self._display_name = network.ssid_to_display_name(self._ssid) self._mode = initial_ap.mode self._strength = initial_ap.strength self._flags = initial_ap.flags self._wpa_flags = initial_ap.wpa_flags self._rsn_flags = initial_ap.rsn_flags self._device_caps = 0 self._device_state = None self._color = None if self._mode == network.NM_802_11_MODE_ADHOC and \ network.is_sugar_adhoc_network(self._ssid): self._color = profile.get_color() else: sha_hash = hashlib.sha1() data = self._ssid + hex(self._flags) sha_hash.update(data) digest = hash(sha_hash.digest()) index = digest % len(xocolor.colors) self._color = xocolor.XoColor( '%s,%s' % (xocolor.colors[index][0], xocolor.colors[index][1])) pulse_color = XoColor('%s,%s' % (style.COLOR_BUTTON_GREY.get_svg(), style.COLOR_TRANSPARENT.get_svg())) self.props.pulse_color = pulse_color self.props.palette_invoker.props.toggle_palette = True self._palette = self._create_palette() self.set_palette(self._palette) self._palette_icon.props.xo_color = self._color self._update_badge() interface_props = dbus.Interface(self._device, dbus.PROPERTIES_IFACE) interface_props.Get(network.NM_WIRELESS_IFACE, 'WirelessCapabilities', reply_handler=self.__get_device_caps_reply_cb, error_handler=self.__get_device_caps_error_cb) interface_props.Get(network.NM_WIRELESS_IFACE, 'ActiveAccessPoint', reply_handler=self.__get_active_ap_reply_cb, error_handler=self.__get_active_ap_error_cb) self._bus.add_signal_receiver(self.__device_state_changed_cb, signal_name='StateChanged', path=self._device.object_path, dbus_interface=network.NM_DEVICE_IFACE) self._bus.add_signal_receiver(self.__wireless_properties_changed_cb, signal_name='PropertiesChanged', path=self._device.object_path, dbus_interface=network.NM_WIRELESS_IFACE) def _create_palette(self): icon_name = get_icon_state(_AP_ICON_NAME, self._strength) self._palette_icon = Icon(icon_name=icon_name, icon_size=style.STANDARD_ICON_SIZE, badge_name=self.props.badge_name) label = glib.markup_escape_text(self._display_name) p = palette.Palette(primary_text=label, icon=self._palette_icon) self.menu_box = Gtk.VBox() self._connect_item = PaletteMenuItem(_('Connect')) icon = Icon(icon_size=Gtk.IconSize.MENU, icon_name='dialog-ok') self._connect_item.set_image(icon) self._connect_item.connect('activate', self.__connect_activate_cb) self.menu_box.add(self._connect_item) self._disconnect_item = PaletteMenuItem(_('Disconnect')) icon = Icon(icon_size=Gtk.IconSize.MENU, icon_name='media-eject') self._disconnect_item.set_image(icon) self._disconnect_item.connect('activate', self.__disconnect_activate_cb) self.menu_box.add(self._disconnect_item) p.set_content(self.menu_box) self.menu_box.show_all() self.connect_to_palette_pop_events(p) return p def __device_state_changed_cb(self, new_state, old_state, reason): self._device_state = new_state self._update_state() self._update_icon() self._update_badge() self._update_color() def __update_active_ap(self, ap_path): if ap_path in self._access_points: # save reference to active AP, so that we always display the # strength of that one self._active_ap = self._access_points[ap_path] self.update_strength() elif self._active_ap is not None: # revert to showing state of strongest AP again self._active_ap = None self.update_strength() def __wireless_properties_changed_cb(self, properties): if 'ActiveAccessPoint' in properties: self.__update_active_ap(properties['ActiveAccessPoint']) def __get_active_ap_reply_cb(self, ap_path): self.__update_active_ap(ap_path) interface_props = dbus.Interface(self._device, dbus.PROPERTIES_IFACE) interface_props.Get(network.NM_DEVICE_IFACE, 'State', reply_handler=self.__get_device_state_reply_cb, error_handler=self.__get_device_state_error_cb) def __get_active_ap_error_cb(self, err): logging.error('Error getting the active access point: %s', err) def __get_device_caps_reply_cb(self, caps): self._device_caps = caps def __get_device_caps_error_cb(self, err): logging.error('Error getting the wireless device properties: %s', err) def __get_device_state_reply_cb(self, state): self._device_state = state self._update_state() self._update_color() self._update_icon() self._update_badge() def __get_device_state_error_cb(self, err): logging.error('Error getting the device state: %s', err) def _update_icon(self): if self._mode == network.NM_802_11_MODE_ADHOC and \ network.is_sugar_adhoc_network(self._ssid): channel = max([1] + [ap.channel for ap in self._access_points.values()]) if self._device_state == network.NM_DEVICE_STATE_ACTIVATED and \ self._active_ap is not None: icon_name = 'network-adhoc-%s-connected' % channel else: icon_name = 'network-adhoc-%s' % channel self.props.icon_name = icon_name icon = self._palette.props.icon icon.props.icon_name = icon_name else: if self._device_state == network.NM_DEVICE_STATE_ACTIVATED and \ self._active_ap is not None: icon_name = '%s-connected' % _AP_ICON_NAME else: icon_name = _AP_ICON_NAME icon_name = get_icon_state(icon_name, self._strength) if icon_name: self.props.icon_name = icon_name icon = self._palette.props.icon icon.props.icon_name = icon_name def _update_badge(self): if self._mode != network.NM_802_11_MODE_ADHOC: if network.find_connection_by_ssid(self._ssid) is not None: self.props.badge_name = 'emblem-favorite' self._palette_icon.props.badge_name = 'emblem-favorite' elif self._flags == network.NM_802_11_AP_FLAGS_PRIVACY: self.props.badge_name = 'emblem-locked' self._palette_icon.props.badge_name = 'emblem-locked' else: self.props.badge_name = None self._palette_icon.props.badge_name = None else: self.props.badge_name = None self._palette_icon.props.badge_name = None def _update_state(self): if self._active_ap is not None: state = self._device_state else: state = network.NM_DEVICE_STATE_UNKNOWN if state == network.NM_DEVICE_STATE_PREPARE or \ state == network.NM_DEVICE_STATE_CONFIG or \ state == network.NM_DEVICE_STATE_NEED_AUTH or \ state == network.NM_DEVICE_STATE_IP_CONFIG: if self._disconnect_item: self._disconnect_item.show() self._connect_item.hide() self._palette.props.secondary_text = _('Connecting...') self.props.pulsing = True elif state == network.NM_DEVICE_STATE_ACTIVATED: network.set_connected() if self._disconnect_item: self._disconnect_item.show() self._connect_item.hide() self._palette.props.secondary_text = _('Connected') self.props.pulsing = False else: if self._disconnect_item: self._disconnect_item.hide() self._connect_item.show() self._palette.props.secondary_text = None self.props.pulsing = False def _update_color(self): self.props.base_color = self._color if self._filtered: self.props.pulsing = False self.props.alpha = _FILTERED_ALPHA else: self.props.alpha = 1.0 def __disconnect_activate_cb(self, item): ap_paths = self._access_points.keys() network.disconnect_access_points(ap_paths) def _add_ciphers_from_flags(self, flags, pairwise): ciphers = [] if pairwise: if flags & network.NM_802_11_AP_SEC_PAIR_TKIP: ciphers.append('tkip') if flags & network.NM_802_11_AP_SEC_PAIR_CCMP: ciphers.append('ccmp') else: if flags & network.NM_802_11_AP_SEC_GROUP_WEP40: ciphers.append('wep40') if flags & network.NM_802_11_AP_SEC_GROUP_WEP104: ciphers.append('wep104') if flags & network.NM_802_11_AP_SEC_GROUP_TKIP: ciphers.append('tkip') if flags & network.NM_802_11_AP_SEC_GROUP_CCMP: ciphers.append('ccmp') return ciphers def _get_security(self): if not (self._flags & network.NM_802_11_AP_FLAGS_PRIVACY) and \ (self._wpa_flags == network.NM_802_11_AP_SEC_NONE) and \ (self._rsn_flags == network.NM_802_11_AP_SEC_NONE): # No security return None if (self._flags & network.NM_802_11_AP_FLAGS_PRIVACY) and \ (self._wpa_flags == network.NM_802_11_AP_SEC_NONE) and \ (self._rsn_flags == network.NM_802_11_AP_SEC_NONE): # Static WEP, Dynamic WEP, or LEAP wireless_security = WirelessSecurity() wireless_security.key_mgmt = 'none' return wireless_security if (self._mode != network.NM_802_11_MODE_INFRA): # Stuff after this point requires infrastructure logging.error('The infrastructure mode is not supoorted' ' by your wireless device.') return None if (self._rsn_flags & network.NM_802_11_AP_SEC_KEY_MGMT_PSK) and \ (self._device_caps & network.NM_WIFI_DEVICE_CAP_RSN): # WPA2 PSK first pairwise = self._add_ciphers_from_flags(self._rsn_flags, True) group = self._add_ciphers_from_flags(self._rsn_flags, False) wireless_security = WirelessSecurity() wireless_security.key_mgmt = 'wpa-psk' wireless_security.proto = 'rsn' wireless_security.pairwise = pairwise wireless_security.group = group return wireless_security if (self._wpa_flags & network.NM_802_11_AP_SEC_KEY_MGMT_PSK) and \ (self._device_caps & network.NM_WIFI_DEVICE_CAP_WPA): # WPA PSK pairwise = self._add_ciphers_from_flags(self._wpa_flags, True) group = self._add_ciphers_from_flags(self._wpa_flags, False) wireless_security = WirelessSecurity() wireless_security.key_mgmt = 'wpa-psk' wireless_security.proto = 'wpa' wireless_security.pairwise = pairwise wireless_security.group = group return wireless_security def __connect_activate_cb(self, icon): self._connect() def _connect(self): # Activate existing connection, if there is one connection = network.find_connection_by_ssid(self._ssid) if connection: logging.debug('Activating existing connection for SSID %r', self._ssid) connection.activate(self._device) return # Otherwise, create new connection and activate it logging.debug('Creating new connection for SSID %r', self._ssid) settings = Settings() settings.connection.id = self._display_name settings.connection.uuid = str(uuid.uuid4()) settings.connection.type = '802-11-wireless' settings.wireless.ssid = self._ssid if self._mode == network.NM_802_11_MODE_INFRA: settings.wireless.mode = 'infrastructure' settings.connection.autoconnect = True elif self._mode == network.NM_802_11_MODE_ADHOC: settings.wireless.mode = 'adhoc' settings.wireless.band = 'bg' settings.ip4_config = IP4Config() settings.ip4_config.method = 'link-local' wireless_security = self._get_security() settings.wireless_security = wireless_security if wireless_security is not None: settings.wireless.security = '802-11-wireless-security' network.add_and_activate_connection(self._device, settings, self.get_first_ap().model) def set_filter(self, query): normalized_name = normalize_string(self._display_name.decode('utf-8')) self._filtered = normalized_name.find(query) == -1 self._update_icon() self._update_color() def create_keydialog(self, response): keydialog.create(self._ssid, self._flags, self._wpa_flags, self._rsn_flags, self._device_caps, response) def update_strength(self): if self._active_ap is not None: # display strength of AP that we are connected to new_strength = self._active_ap.strength else: # display the strength of the strongest AP that makes up this # network, also considering that there may be no APs new_strength = max( [0] + [ap.strength for ap in self._access_points.values()]) if new_strength != self._strength: self._strength = new_strength self._update_icon() def add_ap(self, ap): self._access_points[ap.model.object_path] = ap self.update_strength() def remove_ap(self, ap): path = ap.model.object_path if path not in self._access_points: return del self._access_points[path] if self._active_ap == ap: self._active_ap = None self.update_strength() def num_aps(self): return len(self._access_points) def find_ap(self, ap_path): if ap_path not in self._access_points: return None return self._access_points[ap_path] def get_first_ap(self): return self._access_points.values()[0] def is_olpc_mesh(self): return self._mode == network.NM_802_11_MODE_ADHOC \ and self._ssid == 'olpc-mesh' def remove_all_aps(self): for ap in self._access_points.values(): ap.disconnect() self._access_points = {} self._active_ap = None self.update_strength() def disconnect(self): self._bus.remove_signal_receiver( self.__device_state_changed_cb, signal_name='StateChanged', path=self._device.object_path, dbus_interface=network.NM_DEVICE_IFACE) self._bus.remove_signal_receiver( self.__wireless_properties_changed_cb, signal_name='PropertiesChanged', path=self._device.object_path, dbus_interface=network.NM_WIRELESS_IFACE)
class BuddyMenu(Palette): def __init__(self, buddy): self._buddy = buddy buddy_icon = Icon(icon_name='computer-xo', xo_color=buddy.get_color(), icon_size=Gtk.IconSize.LARGE_TOOLBAR) nick = buddy.get_nick() Palette.__init__(self, None, primary_text=glib.markup_escape_text(nick), icon=buddy_icon) self.menu_box = Gtk.VBox() self.set_content(self.menu_box) self.menu_box.show_all() self._invite_menu = None self._active_activity_changed_hid = None # Fixme: we need to make the widget accessible through the Palette API self._widget.connect('destroy', self.__destroy_cb) self._buddy.connect('notify::nick', self.__buddy_notify_nick_cb) if buddy.is_owner(): self._add_my_items() else: self._add_buddy_items() def __destroy_cb(self, menu): if self._active_activity_changed_hid is not None: home_model = shell.get_model() home_model.disconnect(self._active_activity_changed_hid) self._buddy.disconnect_by_func(self.__buddy_notify_nick_cb) def _add_buddy_items(self): menu_item = None if friends.get_model().has_buddy(self._buddy): menu_item = PaletteMenuItem(_('Remove friend'), 'list-remove') menu_item.connect('activate', self._remove_friend_cb) else: menu_item = PaletteMenuItem(_('Make friend'), 'list-add') menu_item.connect('activate', self._make_friend_cb) self.menu_box.pack_start(menu_item, True, True, 0) self._invite_menu = PaletteMenuItem('') self._invite_menu.connect('activate', self._invite_friend_cb) self.menu_box.pack_start(self._invite_menu, True, True, 0) home_model = shell.get_model() self._active_activity_changed_hid = home_model.connect( 'active-activity-changed', self._cur_activity_changed_cb) activity = home_model.get_active_activity() self._update_invite_menu(activity) def _add_my_items(self): item = PaletteMenuItem(_('Shutdown'), 'system-shutdown') item.connect('activate', self.__shutdown_activate_cb) self.menu_box.pack_start(item, True, True, 0) client = GConf.Client.get_default() if client.get_bool('/desktop/sugar/show_restart'): item = PaletteMenuItem(_('Restart'), 'system-restart') item.connect('activate', self.__reboot_activate_cb) self.menu_box.pack_start(item, True, True, 0) item.show() if client.get_bool('/desktop/sugar/show_logout'): item = PaletteMenuItem(_('Logout'), 'system-logout') item.connect('activate', self.__logout_activate_cb) self.menu_box.pack_start(item, True, True, 0) item.show() item = PaletteMenuItem(_('My Settings'), 'preferences-system') item.connect('activate', self.__controlpanel_activate_cb) self.menu_box.pack_start(item, True, True, 0) item.show() def _quit(self, action): home_window = jarabe.desktop.homewindow.get_instance() home_window.busy_during_delayed_action(action) def __logout_activate_cb(self, menu_item): self._quit(get_session_manager().logout) def __reboot_activate_cb(self, menu_item): self._quit(get_session_manager().reboot) def __shutdown_activate_cb(self, menu_item): self._quit(get_session_manager().shutdown) def __controlpanel_activate_cb(self, menu_item): panel = ControlPanel() panel.set_transient_for(self._widget.get_toplevel()) panel.show() def _update_invite_menu(self, activity): buddy_activity = self._buddy.props.current_activity if buddy_activity is not None: buddy_activity_id = buddy_activity.activity_id else: buddy_activity_id = None if activity is None or activity.is_journal() or \ activity.get_activity_id() == buddy_activity_id: self._invite_menu.hide() else: title = activity.get_title() self._invite_menu.set_label(_('Invite to %s') % title) icon = Icon(file=activity.get_icon_path(), icon_size=Gtk.IconSize.SMALL_TOOLBAR) icon.props.xo_color = activity.get_icon_color() self._invite_menu.set_image(icon) icon.show() self._invite_menu.show() def _cur_activity_changed_cb(self, home_model, activity_model): self._update_invite_menu(activity_model) def __buddy_notify_nick_cb(self, buddy, pspec): self.set_primary_text(glib.markup_escape_text(buddy.props.nick)) def _make_friend_cb(self, menuitem): friends.get_model().make_friend(self._buddy) def _remove_friend_cb(self, menuitem): friends.get_model().remove(self._buddy) def _invite_friend_cb(self, menuitem): activity = shell.get_model().get_active_activity() service = activity.get_service() if service: try: service.InviteContact(self._buddy.props.account, self._buddy.props.contact_id) except dbus.DBusException, e: expected_exceptions = [ 'org.freedesktop.DBus.Error.UnknownMethod', 'org.freedesktop.DBus.Python.NotImplementedError'] if e.get_dbus_name() in expected_exceptions: logging.warning('Trying deprecated Activity.Invite') service.Invite(self._buddy.props.key) else: raise else:
class ActivityListPalette(ActivityPalette): __gtype_name__ = 'SugarActivityListPalette' __gsignals__ = { 'erase-activated': (GObject.SignalFlags.RUN_FIRST, None, ([str])), } def __init__(self, activity_info): ActivityPalette.__init__(self, activity_info) self._bundle_id = activity_info.get_bundle_id() self._version = activity_info.get_activity_version() registry = bundleregistry.get_registry() self._favorite = registry.is_bundle_favorite(self._bundle_id, self._version) self._favorite_item = PaletteMenuItem() self._favorite_icon = Icon(icon_name='emblem-favorite', icon_size=Gtk.IconSize.MENU) self._favorite_item.set_image(self._favorite_icon) self._favorite_icon.show() self._favorite_item.connect('activate', self.__change_favorite_activate_cb) self.menu_box.append_item(self._favorite_item) self._favorite_item.show() if activity_info.is_user_activity(): self._add_erase_option(registry, activity_info) registry = bundleregistry.get_registry() self._activity_changed_sid = \ registry.connect('bundle_changed', self.__activity_changed_cb) self._update_favorite_item() self.menu_box.connect('destroy', self.__destroy_cb) def _add_erase_option(self, registry, activity_info): menu_item = PaletteMenuItem(_('Erase'), 'list-remove') menu_item.connect('activate', self.__erase_activate_cb) self.menu_box.append_item(menu_item) menu_item.show() if not os.access(activity_info.get_path(), os.W_OK) or \ registry.is_activity_protected(self._bundle_id): menu_item.props.sensitive = False def __destroy_cb(self, palette): registry = bundleregistry.get_registry() registry.disconnect(self._activity_changed_sid) def _update_favorite_item(self): if self._favorite: self._favorite_item.set_label(_('Remove favorite')) xo_color = XoColor('%s,%s' % (style.COLOR_WHITE.get_svg(), style.COLOR_TRANSPARENT.get_svg())) else: self._favorite_item.set_label(_('Make favorite')) client = GConf.Client.get_default() xo_color = XoColor(client.get_string('/desktop/sugar/user/color')) self._favorite_icon.props.xo_color = xo_color def __change_favorite_activate_cb(self, menu_item): registry = bundleregistry.get_registry() registry.set_bundle_favorite(self._bundle_id, self._version, not self._favorite) def __activity_changed_cb(self, activity_registry, activity_info): if activity_info.get_bundle_id() == self._bundle_id and \ activity_info.get_activity_version() == self._version: registry = bundleregistry.get_registry() self._favorite = registry.is_bundle_favorite(self._bundle_id, self._version) self._update_favorite_item() def __erase_activate_cb(self, menu_item): self.emit('erase-activated', self._bundle_id)
class SpeechPalette(Palette): def __init__(self, primary_text, manager): Palette.__init__(self, label=primary_text) self._manager = manager self._manager.connect('play', self._set_menu_state, 'play') self._manager.connect('stop', self._set_menu_state, 'stop') self._manager.connect('pause', self._set_menu_state, 'pause') box = PaletteMenuBox() self.set_content(box) box.show() self._play_icon = Icon(icon_name='player_play') self._pause_icon = Icon(icon_name='player_pause') self._play_pause_menu = PaletteMenuItem( icon_name='player_play', text_label=_('Say selected text'), accelerator='Shift+Alt+S') self._play_pause_menu.set_image(self._play_icon) self._play_pause_menu.connect('activate', self.__play_activated_cb) box.append_item(self._play_pause_menu) self._play_pause_menu.show() self._stop_menu = PaletteMenuItem(icon_name='player_stop', text_label=_('Stop playback')) self._stop_menu.connect('activate', self.__stop_activated_cb) self._stop_menu.set_sensitive(False) box.append_item(self._stop_menu) separator = PaletteMenuItemSeparator() box.append_item(separator) separator.show() pitch_label = Gtk.Label(_('Pitch')) box.append_item(pitch_label, vertical_padding=0) pitch_label.show() self._adj_pitch = Gtk.Adjustment(value=self._manager.get_pitch(), lower=self._manager.MIN_PITCH, upper=self._manager.MAX_PITCH) hscale_pitch = Gtk.HScale() hscale_pitch.set_adjustment(self._adj_pitch) hscale_pitch.set_draw_value(False) box.append_item(hscale_pitch, vertical_padding=0) hscale_pitch.show() rate_label = Gtk.Label(_('Rate')) box.append_item(rate_label, vertical_padding=0) rate_label.show() self._adj_rate = Gtk.Adjustment(value=self._manager.get_rate(), lower=self._manager.MIN_RATE, upper=self._manager.MAX_RATE) hscale_rate = Gtk.HScale() hscale_rate.set_adjustment(self._adj_rate) hscale_rate.set_draw_value(False) box.append_item(hscale_rate, vertical_padding=0) hscale_rate.show() self._adj_pitch.connect('value_changed', self.__adj_pitch_changed_cb) self._adj_rate.connect('value_changed', self.__adj_rate_changed_cb) def __adj_pitch_changed_cb(self, adjustment): self._manager.set_pitch(int(adjustment.get_value())) def __adj_rate_changed_cb(self, adjustment): self._manager.set_rate(int(adjustment.get_value())) def __play_activated_cb(self, widget): if self._manager.is_paused: self._manager.restart() elif not self._manager.is_playing: self._manager.say_selected_text() else: self._manager.pause() def __stop_activated_cb(self, widget): self._manager.stop() def _set_menu_state(self, manager, signal): if signal == 'play': self._play_pause_menu.set_image(self._pause_icon) self._play_pause_menu.set_label(_('Pause playback')) self._stop_menu.set_sensitive(True) elif signal == 'pause': self._play_pause_menu.set_image(self._play_icon) self._play_pause_menu.set_label(_('Say selected text')) self._stop_menu.set_sensitive(True) elif signal == 'stop': self._play_pause_menu.set_image(self._play_icon) self._play_pause_menu.set_label(_('Say selected text')) self._stop_menu.set_sensitive(False)
class BuddyMenu(Palette): def __init__(self, buddy): self._buddy = buddy buddy_icon = Icon(icon_name="computer-xo", xo_color=buddy.get_color(), pixel_size=style.STANDARD_ICON_SIZE) nick = buddy.get_nick() Palette.__init__(self, None, primary_text=nick, icon=buddy_icon) self.menu_box = Gtk.VBox() self.set_content(self.menu_box) self.menu_box.show_all() self._invite_menu = None self._active_activity_changed_hid = None # Fixme: we need to make the widget accessible through the Palette API self._widget.connect("destroy", self.__destroy_cb) self._buddy.connect("notify::nick", self.__buddy_notify_nick_cb) if buddy.is_owner(): self._add_my_items() else: self._add_buddy_items() def __destroy_cb(self, menu): if self._active_activity_changed_hid is not None: home_model = shell.get_model() home_model.disconnect(self._active_activity_changed_hid) self._buddy.disconnect_by_func(self.__buddy_notify_nick_cb) def _add_buddy_items(self): menu_item = None if friends.get_model().has_buddy(self._buddy): menu_item = PaletteMenuItem(_("Remove friend"), "list-remove") menu_item.connect("activate", self._remove_friend_cb) else: menu_item = PaletteMenuItem(_("Make friend"), "list-add") menu_item.connect("activate", self._make_friend_cb) self.menu_box.pack_start(menu_item, True, True, 0) self._invite_menu = PaletteMenuItem("") self._invite_menu.connect("activate", self._invite_friend_cb) self.menu_box.pack_start(self._invite_menu, True, True, 0) home_model = shell.get_model() self._active_activity_changed_hid = home_model.connect("active-activity-changed", self._cur_activity_changed_cb) activity = home_model.get_active_activity() self._update_invite_menu(activity) def _add_my_items(self): settings = Gio.Settings("org.sugarlabs") show_shutdown = settings.get_boolean("show-shutdown") show_restart = settings.get_boolean("show-restart") show_logout = settings.get_boolean("show-logout") if "SUGAR_SHOW_SHUTDOWN" in os.environ: show_shutdown = os.environ["SUGAR_SHOW_SHUTDOWN"] == "yes" if "SUGAR_SHOW_RESTART" in os.environ: show_restart = os.environ["SUGAR_SHOW_RESTART"] == "yes" if "SUGAR_SHOW_LOGOUT" in os.environ: show_logout = os.environ["SUGAR_SHOW_LOGOUT"] == "yes" if show_shutdown: item = PaletteMenuItem(_("Shutdown"), "system-shutdown") item.connect("activate", self.__shutdown_activate_cb) self.menu_box.pack_start(item, True, True, 0) if show_restart: item = PaletteMenuItem(_("Restart"), "system-restart") item.connect("activate", self.__reboot_activate_cb) self.menu_box.pack_start(item, True, True, 0) item.show() if show_logout: item = PaletteMenuItem(_("Logout"), "system-logout") item.connect("activate", self.__logout_activate_cb) self.menu_box.pack_start(item, True, True, 0) item.show() item = PaletteMenuItem(_("My Settings"), "preferences-system") item.connect("activate", self.__controlpanel_activate_cb) self.menu_box.pack_start(item, True, True, 0) item.show() def _quit(self, action): jarabe.desktop.homewindow.get_instance().busy() action() GObject.timeout_add_seconds(3, self.__quit_timeout_cb) def __quit_timeout_cb(self): jarabe.desktop.homewindow.get_instance().unbusy() alert = TimeoutAlert(30) alert.props.title = _("An activity is not responding.") alert.props.msg = _("You may lose unsaved work if you continue.") alert.connect("response", self.__quit_accept_cb) jarabe.desktop.homewindow.get_instance().add_alert(alert) alert.show() def __quit_accept_cb(self, alert, response_id): jarabe.desktop.homewindow.get_instance().remove_alert(alert) if response_id is Gtk.ResponseType.CANCEL: get_session_manager().cancel_shutdown() else: jarabe.desktop.homewindow.get_instance().busy() get_session_manager().shutdown_completed() def __logout_activate_cb(self, menu_item): self._quit(get_session_manager().logout) def __reboot_activate_cb(self, menu_item): self._quit(get_session_manager().reboot) def __shutdown_activate_cb(self, menu_item): self._quit(get_session_manager().shutdown) def __controlpanel_activate_cb(self, menu_item): # hide the frame when control panel is shown import jarabe.frame frame = jarabe.frame.get_view() frame.hide() # show the control panel panel = ControlPanel() panel.show() def _update_invite_menu(self, activity): buddy_activity = self._buddy.props.current_activity if buddy_activity is not None: buddy_activity_id = buddy_activity.activity_id else: buddy_activity_id = None if activity is None or activity.is_journal() or activity.get_activity_id() == buddy_activity_id: self._invite_menu.hide() else: title = activity.get_title() self._invite_menu.set_label(_("Invite to %s") % title) icon = Icon(file=activity.get_icon_path(), pixel_size=style.SMALL_ICON_SIZE) icon.props.xo_color = activity.get_icon_color() self._invite_menu.set_image(icon) icon.show() self._invite_menu.show() def _cur_activity_changed_cb(self, home_model, activity_model): self._update_invite_menu(activity_model) def __buddy_notify_nick_cb(self, buddy, pspec): self.set_primary_text(buddy.props.nick) def _make_friend_cb(self, menuitem): friends.get_model().make_friend(self._buddy) def _remove_friend_cb(self, menuitem): friends.get_model().remove(self._buddy) def _invite_friend_cb(self, menuitem): activity = shell.get_model().get_active_activity() service = activity.get_service() if service: try: service.InviteContact(self._buddy.props.account, self._buddy.props.contact_id) except dbus.DBusException, e: expected_exceptions = [ "org.freedesktop.DBus.Error.UnknownMethod", "org.freedesktop.DBus.Python.NotImplementedError", ] if e.get_dbus_name() in expected_exceptions: logging.warning("Trying deprecated Activity.Invite") service.Invite(self._buddy.props.key) else: raise else:
class SpeechPalette(Palette): def __init__(self, primary_text, manager): Palette.__init__(self, label=primary_text) self._manager = manager self._manager.connect('play', self._set_menu_state, 'play') self._manager.connect('stop', self._set_menu_state, 'stop') self._manager.connect('pause', self._set_menu_state, 'pause') box = PaletteMenuBox() self.set_content(box) box.show() self._play_icon = Icon(icon_name='player_play') self._pause_icon = Icon(icon_name='player_pause') self._play_pause_menu = PaletteMenuItem( icon_name='player_play', text_label=_('Say selected text')) self._play_pause_menu.set_image(self._play_icon) self._play_pause_menu.connect('activate', self.__play_activated_cb) box.append_item(self._play_pause_menu) self._play_pause_menu.show() self._stop_menu = PaletteMenuItem(icon_name='player_stop', text_label=_('Stop playback')) self._stop_menu.connect('activate', self.__stop_activated_cb) self._stop_menu.set_sensitive(False) box.append_item(self._stop_menu) separator = PaletteMenuItemSeparator() box.append_item(separator) separator.show() pitch_label = Gtk.Label(_('Pitch')) box.append_item(pitch_label, vertical_padding=0) pitch_label.show() self._adj_pitch = Gtk.Adjustment(value=self._manager.get_pitch(), lower=self._manager.MIN_PITCH, upper=self._manager.MAX_PITCH) hscale_pitch = Gtk.HScale() hscale_pitch.set_adjustment(self._adj_pitch) hscale_pitch.set_draw_value(False) box.append_item(hscale_pitch, vertical_padding=0) hscale_pitch.show() rate_label = Gtk.Label(_('Rate')) box.append_item(rate_label, vertical_padding=0) rate_label.show() self._adj_rate = Gtk.Adjustment(value=self._manager.get_rate(), lower=self._manager.MIN_RATE, upper=self._manager.MAX_RATE) hscale_rate = Gtk.HScale() hscale_rate.set_adjustment(self._adj_rate) hscale_rate.set_draw_value(False) box.append_item(hscale_rate, vertical_padding=0) hscale_rate.show() self._adj_pitch.connect('value_changed', self.__adj_pitch_changed_cb) self._adj_rate.connect('value_changed', self.__adj_rate_changed_cb) def __adj_pitch_changed_cb(self, adjustment): self._manager.set_pitch(int(adjustment.get_value())) def __adj_rate_changed_cb(self, adjustment): self._manager.set_rate(int(adjustment.get_value())) def __play_activated_cb(self, widget): if self._manager.is_paused: self._manager.restart() elif not self._manager.is_playing: self._manager.say_selected_text() else: self._manager.pause() def __stop_activated_cb(self, widget): self._manager.stop() def _set_menu_state(self, manager, signal): if signal == 'play': self._play_pause_menu.set_image(self._pause_icon) self._play_pause_menu.set_label(_('Pause playback')) self._stop_menu.set_sensitive(True) elif signal == 'pause': self._play_pause_menu.set_image(self._play_icon) self._play_pause_menu.set_label(_('Say selected text')) self._stop_menu.set_sensitive(True) elif signal == 'stop': self._play_pause_menu.set_image(self._play_icon) self._play_pause_menu.set_label(_('Say selected text')) self._stop_menu.set_sensitive(False)
class SugarAdhocView(EventPulsingIcon): """To mimic the mesh behavior on devices where mesh hardware is not available we support the creation of an Ad-hoc network on three channels 1, 6, 11. This is the class for an icon representing a channel in the neighborhood view. """ _ICON_NAME = 'network-adhoc-' _NAME = 'Ad-hoc Network ' def __init__(self, channel): EventPulsingIcon.__init__(self, icon_name=self._ICON_NAME + str(channel), pixel_size=style.STANDARD_ICON_SIZE, cache=True) self._bus = dbus.SystemBus() self._channel = channel self._disconnect_item = None self._connect_item = None self._palette_icon = None self._filtered = False get_adhoc_manager_instance().connect('members-changed', self.__members_changed_cb) get_adhoc_manager_instance().connect('state-changed', self.__state_changed_cb) pulse_color = XoColor('%s,%s' % (style.COLOR_BUTTON_GREY.get_svg(), style.COLOR_TRANSPARENT.get_svg())) self.props.pulse_color = pulse_color self._state_color = XoColor('%s,%s' % \ (profile.get_color().get_stroke_color(), style.COLOR_TRANSPARENT.get_svg())) self.props.base_color = self._state_color self.palette_invoker.props.toggle_palette = True self._palette = self._create_palette() self.set_palette(self._palette) self._palette_icon.props.xo_color = self._state_color def _create_palette(self): self._palette_icon = Icon( \ icon_name=self._ICON_NAME + str(self._channel), icon_size=style.STANDARD_ICON_SIZE) text = _('Ad-hoc Network %d') % (self._channel, ) palette_ = palette.Palette(glib.markup_escape_text(text), icon=self._palette_icon) self.menu_box = Gtk.VBox() self._connect_item = PaletteMenuItem(_('Connect')) icon = Icon(icon_size=Gtk.IconSize.MENU, icon_name='dialog-ok') self._connect_item.set_image(icon) self._connect_item.connect('activate', self.__connect_activate_cb) self.menu_box.add(self._connect_item) self._disconnect_item = PaletteMenuItem(_('Disconnect')) icon = Icon(icon_size=Gtk.IconSize.MENU, icon_name='media-eject') self._disconnect_item.set_image(icon) self._disconnect_item.connect('activate', self.__disconnect_activate_cb) self.menu_box.add(self._disconnect_item) palette_.set_content(self.menu_box) self.menu_box.show_all() self._disconnect_item.hide() self.connect_to_palette_pop_events(palette_) return palette_ def __connect_activate_cb(self, icon): get_adhoc_manager_instance().activate_channel(self._channel) def __disconnect_activate_cb(self, icon): get_adhoc_manager_instance().deactivate_active_channel() def __state_changed_cb(self, adhoc_manager, channel, device_state): if self._channel == channel: state = device_state else: state = network.NM_DEVICE_STATE_UNKNOWN if state == network.NM_DEVICE_STATE_ACTIVATED: icon_name = '%s-connected' % (self._ICON_NAME + str(self._channel)) else: icon_name = self._ICON_NAME + str(self._channel) if icon_name is not None: self.props.icon_name = icon_name icon = self._palette.props.icon icon.props.icon_name = icon_name if (state >= network.NM_DEVICE_STATE_PREPARE) and \ (state <= network.NM_DEVICE_STATE_IP_CONFIG): if self._disconnect_item: self._disconnect_item.show() self._connect_item.hide() self._palette.props.secondary_text = _('Connecting...') self.props.pulsing = True elif state == network.NM_DEVICE_STATE_ACTIVATED: if self._disconnect_item: self._disconnect_item.show() self._connect_item.hide() self._palette.props.secondary_text = _('Connected') self.props.pulsing = False else: if self._disconnect_item: self._disconnect_item.hide() self._connect_item.show() self._palette.props.secondary_text = None self.props.pulsing = False self._update_color() def _update_color(self): self.props.base_color = self._state_color if self._filtered: self.props.pulsing = False self.alpha = _FILTERED_ALPHA else: self.alpha = 1.0 def __members_changed_cb(self, adhoc_manager, channel, has_members): if channel == self._channel: if has_members == True: self._state_color = profile.get_color() else: color = '%s,%s' % (profile.get_color().get_stroke_color(), style.COLOR_TRANSPARENT.get_svg()) self._state_color = XoColor(color) if not self._filtered: self.props.base_color = self._state_color self._palette_icon.props.xo_color = self._state_color self.alpha = 1.0 else: self.alpha = _FILTERED_ALPHA def set_filter(self, query): name = self._NAME + str(self._channel) self._filtered = name.lower().find(query) == -1 self._update_color()
class ActivityListPalette(ActivityPalette): __gtype_name__ = 'SugarActivityListPalette' __gsignals__ = { 'erase-activated': (GObject.SignalFlags.RUN_FIRST, None, ([str])), } def __init__(self, activity_info): ActivityPalette.__init__(self, activity_info) self._bundle_id = activity_info.get_bundle_id() self._version = activity_info.get_activity_version() registry = bundleregistry.get_registry() self._favorite = registry.is_bundle_favorite(self._bundle_id, self._version) self._favorite_item = PaletteMenuItem() self._favorite_icon = Icon(icon_name='emblem-favorite', icon_size=Gtk.IconSize.MENU) self._favorite_item.set_image(self._favorite_icon) self._favorite_icon.show() self._favorite_item.connect('activate', self.__change_favorite_activate_cb) self.menu_box.append_item(self._favorite_item) self._favorite_item.show() if activity_info.is_user_activity(): self._add_erase_option(registry, activity_info) registry = bundleregistry.get_registry() self._activity_changed_sid = registry.connect( 'bundle_changed', self.__activity_changed_cb) self._update_favorite_item() self.menu_box.connect('destroy', self.__destroy_cb) def _add_erase_option(self, registry, activity_info): menu_item = PaletteMenuItem(_('Erase'), 'list-remove') menu_item.connect('activate', self.__erase_activate_cb) self.menu_box.append_item(menu_item) menu_item.show() if not os.access(activity_info.get_path(), os.W_OK) or \ registry.is_activity_protected(self._bundle_id): menu_item.props.sensitive = False def __destroy_cb(self, palette): registry = bundleregistry.get_registry() registry.disconnect(self._activity_changed_sid) def _update_favorite_item(self): if self._favorite: self._favorite_item.set_label(_('Remove favorite')) xo_color = XoColor('%s,%s' % (style.COLOR_WHITE.get_svg(), style.COLOR_TRANSPARENT.get_svg())) else: self._favorite_item.set_label(_('Make favorite')) client = GConf.Client.get_default() xo_color = XoColor(client.get_string('/desktop/sugar/user/color')) self._favorite_icon.props.xo_color = xo_color def __change_favorite_activate_cb(self, menu_item): registry = bundleregistry.get_registry() registry.set_bundle_favorite(self._bundle_id, self._version, not self._favorite) def __activity_changed_cb(self, activity_registry, activity_info): if activity_info.get_bundle_id() == self._bundle_id and \ activity_info.get_activity_version() == self._version: registry = bundleregistry.get_registry() self._favorite = registry.is_bundle_favorite( self._bundle_id, self._version) self._update_favorite_item() def __erase_activate_cb(self, menu_item): self.emit('erase-activated', self._bundle_id)
class OlpcMeshView(EventPulsingIcon): def __init__(self, mesh_mgr, channel): EventPulsingIcon.__init__(self, icon_name=_OLPC_MESH_ICON_NAME, pixel_size=style.STANDARD_ICON_SIZE, cache=True) self._bus = dbus.SystemBus() self._channel = channel self._mesh_mgr = mesh_mgr self._disconnect_item = None self._connect_item = None self._filtered = False self._device_state = None self._active = False device = mesh_mgr.mesh_device interface_props = dbus.Interface(device, dbus.PROPERTIES_IFACE) interface_props.Get(network.NM_DEVICE_IFACE, 'State', reply_handler=self.__get_device_state_reply_cb, error_handler=self.__get_device_state_error_cb) interface_props.Get(network.NM_OLPC_MESH_IFACE, 'ActiveChannel', reply_handler=self.__get_active_channel_reply_cb, error_handler=self.__get_active_channel_error_cb) self._bus.add_signal_receiver(self.__device_state_changed_cb, signal_name='StateChanged', path=device.object_path, dbus_interface=network.NM_DEVICE_IFACE) self._bus.add_signal_receiver( self.__wireless_properties_changed_cb, signal_name='PropertiesChanged', path=device.object_path, dbus_interface=network.NM_OLPC_MESH_IFACE) pulse_color = XoColor('%s,%s' % (style.COLOR_BUTTON_GREY.get_svg(), style.COLOR_TRANSPARENT.get_svg())) self.props.pulse_color = pulse_color self.props.base_color = profile.get_color() self.palette_invoker.props.toggle_palette = True self._palette = self._create_palette() self.set_palette(self._palette) def _create_palette(self): text = _('Mesh Network %d') % (self._channel, ) _palette = palette.Palette(glib.markup_escape_text(text)) self.menu_box = Gtk.VBox() self._connect_item = PaletteMenuItem(_('Connect')) icon = Icon(icon_size=Gtk.IconSize.MENU, icon_name='dialog-ok') self._connect_item.set_image(icon) self._connect_item.connect('activate', self.__connect_activate_cb) self.menu_box.add(self._connect_item) _palette.set_content(self.menu_box) self.menu_box.show_all() return _palette def __get_device_state_reply_cb(self, state): self._device_state = state self._update() def __get_device_state_error_cb(self, err): logging.error('Error getting the device state: %s', err) def __device_state_changed_cb(self, new_state, old_state, reason): self._device_state = new_state self._update() self._update_color() def __get_active_channel_reply_cb(self, channel): self._active = (channel == self._channel) self._update() def __get_active_channel_error_cb(self, err): logging.error('Error getting the active channel: %s', err) def __wireless_properties_changed_cb(self, properties): if 'ActiveChannel' in properties: channel = properties['ActiveChannel'] self._active = (channel == self._channel) self._update() def _update(self): if self._active: state = self._device_state else: state = network.NM_DEVICE_STATE_UNKNOWN if state in [ network.NM_DEVICE_STATE_PREPARE, network.NM_DEVICE_STATE_CONFIG, network.NM_DEVICE_STATE_NEED_AUTH, network.NM_DEVICE_STATE_IP_CONFIG ]: if self._disconnect_item: self._disconnect_item.show() self._connect_item.hide() self._palette.props.secondary_text = _('Connecting...') self.props.pulsing = True elif state == network.NM_DEVICE_STATE_ACTIVATED: if self._disconnect_item: self._disconnect_item.show() self._connect_item.hide() self._palette.props.secondary_text = _('Connected') self.props.pulsing = False else: if self._disconnect_item: self._disconnect_item.hide() self._connect_item.show() self._palette.props.secondary_text = None self.props.pulsing = False def _update_color(self): self.props.base_color = profile.get_color() if self._filtered: self.alpha = _FILTERED_ALPHA else: self.alpha = 1.0 def __connect_activate_cb(self, icon): self._connect() def _connect(self): self._mesh_mgr.user_activate_channel(self._channel) def set_filter(self, query): self._filtered = (query != '') self._update_color() def disconnect(self): device_object_path = self._mesh_mgr.mesh_device.object_path self._bus.remove_signal_receiver( self.__device_state_changed_cb, signal_name='StateChanged', path=device_object_path, dbus_interface=network.NM_DEVICE_IFACE) self._bus.remove_signal_receiver( self.__wireless_properties_changed_cb, signal_name='PropertiesChanged', path=device_object_path, dbus_interface=network.NM_OLPC_MESH_IFACE)
def _update(self): box = PaletteMenuBox() self.set_content(box) box.show() logging.debug('_update state: %r', self.file_transfer.props.state) if self.file_transfer.props.state == filetransfer.FT_STATE_PENDING: menu_item = PaletteMenuItem(_('Accept')) icon = Icon(icon_name='dialog-ok', pixel_size=style.SMALL_ICON_SIZE) menu_item.set_image(icon) icon.show() menu_item.connect('activate', self.__accept_activate_cb) box.append_item(menu_item) menu_item.show() menu_item = PaletteMenuItem(_('Decline')) icon = Icon(icon_name='dialog-cancel', pixel_size=style.SMALL_ICON_SIZE) menu_item.set_image(icon) icon.show() menu_item.connect('activate', self.__decline_activate_cb) box.append_item(menu_item) menu_item.show() separator = PaletteMenuItemSeparator() box.append_item(separator) separator.show() inner_box = Gtk.VBox() inner_box.set_spacing(style.DEFAULT_PADDING) box.append_item(inner_box, vertical_padding=0) inner_box.show() if self.file_transfer.description: text = self.file_transfer.description.replace('\n', ' ') label = Gtk.Label(label=text) label.set_max_width_chars(style.MENU_WIDTH_CHARS) label.set_ellipsize(style.ELLIPSIZE_MODE_DEFAULT) inner_box.add(label) label.show() mime_type = self.file_transfer.mime_type type_description = mime.get_mime_description(mime_type) size = self._format_size(self.file_transfer.file_size) label = Gtk.Label(label='%s (%s)' % (size, type_description)) inner_box.add(label) label.show() elif self.file_transfer.props.state in \ [filetransfer.FT_STATE_ACCEPTED, filetransfer.FT_STATE_OPEN]: menu_item = PaletteMenuItem(_('Cancel')) icon = Icon(icon_name='dialog-cancel', pixel_size=style.SMALL_ICON_SIZE) menu_item.set_image(icon) icon.show() menu_item.connect('activate', self.__cancel_activate_cb) box.append_item(menu_item) menu_item.show() separator = PaletteMenuItemSeparator() box.append_item(separator) separator.show() inner_box = Gtk.VBox() inner_box.set_spacing(style.DEFAULT_PADDING) box.append_item(inner_box, vertical_padding=0) inner_box.show() self.progress_bar = Gtk.ProgressBar() inner_box.add(self.progress_bar) self.progress_bar.show() self.progress_label = Gtk.Label(label='') inner_box.add(self.progress_label) self.progress_label.show() self.update_progress() elif self.file_transfer.props.state == filetransfer.FT_STATE_COMPLETED: menu_item = PaletteMenuItem(_('Dismiss')) icon = Icon(icon_name='dialog-cancel', pixel_size=style.SMALL_ICON_SIZE) menu_item.set_image(icon) icon.show() menu_item.connect('activate', self.__dismiss_activate_cb) box.append_item(menu_item) menu_item.show() self.update_progress() elif self.file_transfer.props.state == filetransfer.FT_STATE_CANCELLED: if self.file_transfer.reason_last_change == \ filetransfer.FT_REASON_REMOTE_STOPPED: menu_item = PaletteMenuItem(_('Dismiss')) icon = Icon(icon_name='dialog-cancel', pixel_size=style.SMALL_ICON_SIZE) menu_item.set_image(icon) icon.show() menu_item.connect('activate', self.__dismiss_activate_cb) box.append_item(menu_item) menu_item.show() inner_box = Gtk.VBox() inner_box.set_spacing(style.DEFAULT_PADDING) box.append_item(inner_box, vertical_padding=0) inner_box.show() text = _('The other participant canceled the file transfer') label = Gtk.Label(label=text) inner_box.add(label) label.show()
class WirelessPalette(Palette): __gtype_name__ = 'SugarWirelessPalette' __gsignals__ = { 'deactivate-connection': (GObject.SignalFlags.RUN_FIRST, None, ([])), } def __init__(self, primary_text): Palette.__init__(self, label=primary_text) self._disconnect_item = None self._channel_label = Gtk.Label() self._channel_label.props.xalign = 0.0 self._channel_label.show() self._ip_address_label = Gtk.Label() self._ip_address_label.props.xalign = 0.0 self._ip_address_label.show() self._info = Gtk.VBox() self._disconnect_item = PaletteMenuItem(_('Disconnect')) icon = Icon(pixel_size=style.SMALL_ICON_SIZE, icon_name='media-eject') self._disconnect_item.set_image(icon) self._disconnect_item.connect('activate', self.__disconnect_activate_cb) self._info.add(self._disconnect_item) separator = PaletteMenuItemSeparator() self._info.pack_start(separator, True, True, 0) def _padded(child, xalign=0, yalign=0.5): padder = Gtk.Alignment.new(xalign=xalign, yalign=yalign, xscale=1, yscale=0.33) padder.set_padding(style.DEFAULT_SPACING, style.DEFAULT_SPACING, style.DEFAULT_SPACING, style.DEFAULT_SPACING) padder.add(child) return padder self._info.pack_start(_padded(self._channel_label), True, True, 0) self._info.pack_start(_padded(self._ip_address_label), True, True, 0) self._info.show_all() def set_connecting(self): self.props.secondary_text = _('Connecting...') def _set_connected(self, iaddress): self.set_content(self._info) self.props.secondary_text = _('Connected') self._set_ip_address(iaddress) self._disconnect_item.show() def set_connected_with_frequency(self, frequency, iaddress): self._set_connected(iaddress) self._set_frequency(frequency) def set_connected_with_channel(self, channel, iaddress): self._set_connected(iaddress) self._set_channel(channel) def set_disconnected(self): self.props.primary_text = _('No wireless connection') self.props.secondary_text = '' self._disconnect_item.hide() self.set_content(None) def __disconnect_activate_cb(self, menuitem): self.emit('deactivate-connection') def _set_frequency(self, frequency): channel = network.frequency_to_channel(frequency) self._set_channel(channel) def _set_channel(self, channel): if channel == 0: self._channel_label.set_text('%s: %s' % (_('Channel'), _('Unknown'))) else: self._channel_label.set_text('%s: %d' % (_('Channel'), channel)) def _set_ip_address(self, ip_address): if ip_address is not None: ip_address_text = IP_ADDRESS_TEXT_TEMPLATE % ip_address else: ip_address_text = "" self._ip_address_label.set_text(ip_address_text)
class BuddyMenu(Palette): def __init__(self, buddy): self._buddy = buddy buddy_icon = Icon(icon_name='computer-xo', xo_color=buddy.get_color(), pixel_size=style.STANDARD_ICON_SIZE) nick = buddy.get_nick() Palette.__init__(self, None, primary_text=nick, icon=buddy_icon) self.menu_box = Gtk.VBox() self.set_content(self.menu_box) self.menu_box.show_all() self._invite_menu = None self._active_activity_changed_hid = None # Fixme: we need to make the widget accessible through the Palette API self._widget.connect('destroy', self.__destroy_cb) self._buddy.connect('notify::nick', self.__buddy_notify_nick_cb) if buddy.is_owner(): self._add_my_items() else: self._add_buddy_items() def __destroy_cb(self, menu): if self._active_activity_changed_hid is not None: home_model = shell.get_model() home_model.disconnect(self._active_activity_changed_hid) self._buddy.disconnect_by_func(self.__buddy_notify_nick_cb) def _add_buddy_items(self): menu_item = None if friends.get_model().has_buddy(self._buddy): menu_item = PaletteMenuItem(_('Remove friend'), 'list-remove') menu_item.connect('activate', self._remove_friend_cb) else: menu_item = PaletteMenuItem(_('Make friend'), 'list-add') menu_item.connect('activate', self._make_friend_cb) self.menu_box.pack_start(menu_item, True, True, 0) self._invite_menu = PaletteMenuItem('') self._invite_menu.connect('activate', self._invite_friend_cb) self.menu_box.pack_start(self._invite_menu, True, True, 0) home_model = shell.get_model() self._active_activity_changed_hid = home_model.connect( 'active-activity-changed', self._cur_activity_changed_cb) activity = home_model.get_active_activity() self._update_invite_menu(activity) def _add_my_items(self): settings = Gio.Settings('org.sugarlabs') show_shutdown = settings.get_boolean('show-shutdown') show_restart = settings.get_boolean('show-restart') show_logout = settings.get_boolean('show-logout') if "SUGAR_SHOW_SHUTDOWN" in os.environ: show_shutdown = os.environ["SUGAR_SHOW_SHUTDOWN"] == "yes" if "SUGAR_SHOW_RESTART" in os.environ: show_restart = os.environ["SUGAR_SHOW_RESTART"] == "yes" if "SUGAR_SHOW_LOGOUT" in os.environ: show_logout = os.environ["SUGAR_SHOW_LOGOUT"] == "yes" if show_shutdown: item = PaletteMenuItem(_('Shutdown'), 'system-shutdown') item.connect('activate', self.__shutdown_activate_cb) self.menu_box.pack_start(item, True, True, 0) if show_restart: item = PaletteMenuItem(_('Restart'), 'system-restart') item.connect('activate', self.__reboot_activate_cb) self.menu_box.pack_start(item, True, True, 0) item.show() if show_logout: item = PaletteMenuItem(_('Logout'), 'system-logout') item.connect('activate', self.__logout_activate_cb) self.menu_box.pack_start(item, True, True, 0) item.show() item = PaletteMenuItem(_('My Settings'), 'preferences-system') item.connect('activate', self.__controlpanel_activate_cb) self.menu_box.pack_start(item, True, True, 0) item.show() def _quit(self, action): import jarabe.desktop.homewindow home_window = jarabe.desktop.homewindow.get_instance() home_window.busy_during_delayed_action(action) def __logout_activate_cb(self, menu_item): self._quit(get_session_manager().logout) def __reboot_activate_cb(self, menu_item): self._quit(get_session_manager().reboot) def __shutdown_activate_cb(self, menu_item): self._quit(get_session_manager().shutdown) def __controlpanel_activate_cb(self, menu_item): # hide the frame when control panel is shown import jarabe.frame frame = jarabe.frame.get_view() frame.hide() # show the control panel panel = ControlPanel() panel.show() def _update_invite_menu(self, activity): buddy_activity = self._buddy.props.current_activity if buddy_activity is not None: buddy_activity_id = buddy_activity.activity_id else: buddy_activity_id = None if activity is None or activity.is_journal() or \ activity.get_activity_id() == buddy_activity_id: self._invite_menu.hide() else: title = activity.get_title() self._invite_menu.set_label(_('Invite to %s') % title) icon = Icon(file=activity.get_icon_path(), pixel_size=style.SMALL_ICON_SIZE) icon.props.xo_color = activity.get_icon_color() self._invite_menu.set_image(icon) icon.show() self._invite_menu.show() def _cur_activity_changed_cb(self, home_model, activity_model): self._update_invite_menu(activity_model) def __buddy_notify_nick_cb(self, buddy, pspec): self.set_primary_text(buddy.props.nick) def _make_friend_cb(self, menuitem): friends.get_model().make_friend(self._buddy) def _remove_friend_cb(self, menuitem): friends.get_model().remove(self._buddy) def _invite_friend_cb(self, menuitem): activity = shell.get_model().get_active_activity() service = activity.get_service() if service: try: service.InviteContact(self._buddy.props.account, self._buddy.props.contact_id) except dbus.DBusException, e: expected_exceptions = [ 'org.freedesktop.DBus.Error.UnknownMethod', 'org.freedesktop.DBus.Python.NotImplementedError'] if e.get_dbus_name() in expected_exceptions: logging.warning('Trying deprecated Activity.Invite') service.Invite(self._buddy.props.key) else: raise else: