def _add_menu(self, font_name, activate_cb): label = '<span font="%s">%s</span>' % (font_name, font_name) menu_item = PaletteMenuItem() menu_item.set_label(label) menu_item.connect('activate', activate_cb, font_name) self._menu_box.append_item(menu_item) menu_item.show()
def _add_menu(self, font_name, activate_cb): label = '<span font="%s">%s</span>' % (font_name, font_name) menu_item = PaletteMenuItem() menu_item.set_label(label) menu_item.connect("activate", activate_cb, font_name) self._menu_box.append_item(menu_item) menu_item.show()
def set_palette_list(self, options): _menu_item = PaletteMenuItem( text_label=options[list(options.keys())[0]]) req2 = _menu_item.get_preferred_size()[1] menuitem_width = req2.width menuitem_height = req2.height palette_width = Gdk.Screen.width() - style.GRID_CELL_SIZE palette_height = Gdk.Screen.height() - style.GRID_CELL_SIZE * 3 nx = min(self._MAXIMUM_PALETTE_COLUMNS, int(palette_width / menuitem_width)) ny = min(int(palette_height / menuitem_height), len(options) + 1) if ny >= len(options): nx = 1 ny = len(options) grid = Gtk.Grid() grid.set_row_spacing(style.DEFAULT_PADDING) grid.set_column_spacing(0) grid.set_border_width(0) grid.show() x = 0 y = 0 for key in sorted(options): menu_item = PaletteMenuItem() menu_item.set_label(options[key]) menu_item.set_size_request(style.GRID_CELL_SIZE * 3, -1) menu_item.connect('button-release-event', self._option_selected, key) grid.attach(menu_item, x, y, 1, 1) x += 1 if x == nx: x = 0 y += 1 menu_item.show() if palette_height < (y * menuitem_height + style.GRID_CELL_SIZE): # if the grid is bigger than the palette, put in a scrolledwindow scrolled_window = Gtk.ScrolledWindow() scrolled_window.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) scrolled_window.set_size_request(nx * menuitem_width, (ny + 1) * menuitem_height) scrolled_window.add_with_viewport(grid) return scrolled_window else: return grid
def _add_menu(self, option, icon=None, activate_cb=None): if icon is not None: menu_item = PaletteMenuItem(icon_name=icon) if activate_cb is not None: menu_item.connect('activate', activate_cb, [option, icon]) else: menu_item = PaletteMenuItem() if activate_cb is not None: menu_item.connect('activate', activate_cb, option) menu_item.set_label(option) self._menu_box.append_item(menu_item) menu_item.show()
def _add_menu(self, option, icon=None, activate_cb=None): if icon is not None: menu_item = PaletteMenuItem(icon_name=icon) if activate_cb is not None: menu_item.connect('activate', activate_cb, [option, icon]) else: menu_item = PaletteMenuItem() if activate_cb is not None: menu_item.connect('activate', activate_cb, option) menu_item.set_label(option) self._menu_box.append_item(menu_item) menu_item.show()
def set_palette_list(self, options): _menu_item = PaletteMenuItem(text_label=options[options.keys()[0]]) req2 = _menu_item.get_preferred_size()[1] menuitem_width = req2.width menuitem_height = req2.height palette_width = Gdk.Screen.width() - style.GRID_CELL_SIZE palette_height = Gdk.Screen.height() - style.GRID_CELL_SIZE * 3 nx = min(self._MAXIMUM_PALETTE_COLUMNS, int(palette_width / menuitem_width)) ny = min(int(palette_height / menuitem_height), len(options) + 1) if ny >= len(options): nx = 1 ny = len(options) grid = Gtk.Grid() grid.set_row_spacing(style.DEFAULT_PADDING) grid.set_column_spacing(0) grid.set_border_width(0) grid.show() x = 0 y = 0 for key in options.keys(): menu_item = PaletteMenuItem() menu_item.set_label(options[key]) menu_item.set_size_request(style.GRID_CELL_SIZE * 3, -1) menu_item.connect('button-release-event', self._option_selected, key) grid.attach(menu_item, x, y, 1, 1) x += 1 if x == nx: x = 0 y += 1 menu_item.show() if palette_height < (y * menuitem_height + style.GRID_CELL_SIZE): # if the grid is bigger than the palette, put in a scrolledwindow scrolled_window = Gtk.ScrolledWindow() scrolled_window.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) scrolled_window.set_size_request(nx * menuitem_width, (ny + 1) * menuitem_height) scrolled_window.add_with_viewport(grid) return scrolled_window else: return grid
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 _show_menu(self): logging.error('Show menu ') if self._palette_invoker is not None: self._palette = Palette(_('Select tag')) menu_box = PaletteMenuBox() self._palette.set_content(menu_box) menu_box.show() for tag in TAG_LIST: menu_item = PaletteMenuItem() menu_item.set_label(tag) menu_item.connect('activate', self._add_tag, tag) menu_box.append_item(menu_item) menu_item.show() self._palette_invoker.set_palette(self._palette) self._palette.popup(immediate=True)
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
class PrimaryToolbar(ToolbarBase): __gtype_name__ = 'PrimaryToolbar' __gsignals__ = { 'add-link': (GObject.SignalFlags.RUN_FIRST, None, ([])), 'remove-link': (GObject.SignalFlags.RUN_FIRST, None, ([])), 'go-home': (GObject.SignalFlags.RUN_FIRST, None, ([])), 'set-home': (GObject.SignalFlags.RUN_FIRST, None, ([])), 'reset-home': (GObject.SignalFlags.RUN_FIRST, None, ([])), 'go-library': (GObject.SignalFlags.RUN_FIRST, None, ([])), } def __init__(self, tabbed_view, act): ToolbarBase.__init__(self) self._url_toolbar = UrlToolbar() self._activity = act self.model = act.model self.model.link_removed_signal.connect(self.__link_removed_cb) self._tabbed_view = self._canvas = tabbed_view self._loading = False self._download_running_hid = None toolbar = self.toolbar activity_button = ActivityToolbarButton(self._activity) toolbar.insert(activity_button, 0) separator = Gtk.SeparatorToolItem() ''' Disabled since the python gi bindings don't expose the critical WebKit2.PrintOperation.print function save_as_pdf = ToolButton('save-as-pdf') save_as_pdf.set_tooltip(_('Save page as pdf')) save_as_pdf.connect('clicked', self.save_as_pdf) activity_button.props.page.insert(separator, -1) activity_button.props.page.insert(save_as_pdf, -1) separator.show() save_as_pdf.show() ''' inspect_view = ToolButton('emblem-view-source') inspect_view.set_tooltip(_('Show Web Inspector')) inspect_view.connect('clicked', self.inspect_view) activity_button.props.page.insert(separator, -1) activity_button.props.page.insert(inspect_view, -1) separator.show() inspect_view.show() self._go_home = ToolButton('go-home') self._go_home.set_tooltip(_('Home page')) self._go_home.connect('clicked', self._go_home_cb) # add a menu to save the home page menu_box = PaletteMenuBox() self._go_home.props.palette.set_content(menu_box) menu_item = PaletteMenuItem() menu_item.set_label(_('Select as initial page')) menu_item.connect('activate', self._set_home_cb) menu_box.append_item(menu_item) self._reset_home_menu = PaletteMenuItem() self._reset_home_menu.set_label(_('Reset initial page')) self._reset_home_menu.connect('activate', self._reset_home_cb) menu_box.append_item(self._reset_home_menu) if os.path.isfile(LIBRARY_PATH): library_menu = PaletteMenuItem() library_menu.set_label(_('Library')) library_menu.connect('activate', self._go_library_cb) menu_box.append_item(library_menu) menu_box.show_all() # verify if the home page is configured client = GConf.Client.get_default() self._reset_home_menu.set_visible( client.get_string(HOME_PAGE_GCONF_KEY) is not None) toolbar.insert(self._go_home, -1) self._go_home.show() self.entry = WebEntry() self.entry.set_icon_from_name(iconentry.ICON_ENTRY_SECONDARY, 'entry-stop') self.entry.connect('icon-press', self._stop_and_reload_cb) self.entry.connect('activate', self._entry_activate_cb) self.entry.connect('focus-in-event', self.__focus_in_event_cb) self.entry.connect('focus-out-event', self.__focus_out_event_cb) self.entry.connect('key-press-event', self.__key_press_event_cb) self.entry.connect('changed', self.__changed_cb) # In an event box so that it can render the background entry_box = Gtk.EventBox() entry_box.add(self.entry) entry_box.show() self._entry_item = Gtk.ToolItem() self._entry_item.set_expand(True) self._entry_item.add(entry_box) self.entry.show() toolbar.insert(self._entry_item, -1) self._entry_item.show() self._back = ToolButton('go-previous-paired', accelerator='<ctrl>Left') self._back.set_tooltip(_('Back')) self._back.props.sensitive = False self._back.connect('clicked', self._go_back_cb) toolbar.insert(self._back, -1) self._back.show() palette = self._back.get_palette() self._back_box_menu = Gtk.VBox() self._back_box_menu.show() palette.set_content(self._back_box_menu) # FIXME, this is a hack, should be done in the theme: palette._content.set_border_width(1) self._forward = ToolButton('go-next-paired', accelerator='<ctrl>Right') self._forward.set_tooltip(_('Forward')) self._forward.props.sensitive = False self._forward.connect('clicked', self._go_forward_cb) toolbar.insert(self._forward, -1) self._forward.show() palette = self._forward.get_palette() self._forward_box_menu = Gtk.VBox() self._forward_box_menu.show() palette.set_content(self._forward_box_menu) # FIXME, this is a hack, should be done in the theme: palette._content.set_border_width(1) self._download_icon = ProgressToolButton( icon_name='emblem-downloads', tooltip=_('No Downloads Running')) toolbar.insert(self._download_icon, -1) self._download_icon.show() downloadmanager.connect_donwload_started(self.__download_started_cb) self._link_add = ToggleToolButton('emblem-favorite') self._link_add.set_accelerator('<ctrl>d') self._link_add.set_tooltip(_('Bookmark')) self._link_add_toggled_hid = \ self._link_add.connect('toggled', self.__link_add_toggled_cb) toolbar.insert(self._link_add, -1) self._link_add.show() self._toolbar_separator = Gtk.SeparatorToolItem() self._toolbar_separator.props.draw = False self._toolbar_separator.set_expand(True) self._stop_button = StopButton(self._activity) toolbar.insert(self._stop_button, -1) self._progress_listener = None self._browser = None self._loading_changed_hid = None self._progress_changed_hid = None self._session_history_changed_hid = None self._uri_changed_hid = None self._load_changed_hid = None self._security_status_changed_hid = None if tabbed_view.get_n_pages(): self._connect_to_browser(tabbed_view.props.current_browser) tabbed_view.connect_after('switch-page', self.__switch_page_cb) tabbed_view.connect_after('page-added', self.__page_added_cb) Gdk.Screen.get_default().connect('size-changed', self.__screen_size_changed_cb) self._configure_toolbar() def __download_started_cb(self): if self._download_running_hid is None: self._download_running_hid = GLib.timeout_add( 80, self.__download_running_cb) def __download_running_cb(self): print('__DLR') progress = downloadmanager.overall_downloads_progress() self._download_icon.update(progress) if downloadmanager.num_downloads() > 0: self._download_icon.props.tooltip = \ _('{}% Downloaded').format(int(progress*100)) self._download_icon.props.xo_color = XoColor(None) return True else: GLib.source_remove(self._download_running_hid) self._download_running_hid = None self._download_icon.props.tooltip = _('No Downloads Running') self._download_icon.props.xo_color = XoColor('insensitive') return False def __key_press_event_cb(self, entry, event): self._tabbed_view.current_browser.loading_uri = entry.props.text def __switch_page_cb(self, tabbed_view, page, page_num): if tabbed_view.get_n_pages(): self._connect_to_browser(tabbed_view.props.current_browser) def __page_added_cb(self, notebook, child, pagenum): self.entry._search_popdown() def _configure_toolbar(self, screen=None): # Adapt the toolbars for portrait or landscape mode. if screen is None: screen = Gdk.Screen.get_default() if screen.get_width() < screen.get_height(): if self._entry_item in self._url_toolbar.toolbar.get_children(): return self.toolbar.remove(self._entry_item) self._url_toolbar.toolbar.insert(self._entry_item, -1) separator_pos = len(self.toolbar.get_children()) - 1 self.toolbar.insert(self._toolbar_separator, separator_pos) self._toolbar_separator.show() self.pack_end(self._url_toolbar, True, True, 0) self._url_toolbar.show() else: if self._entry_item in self.toolbar.get_children(): return self.toolbar.remove(self._toolbar_separator) position = len(self.toolbar.get_children()) - 4 self._url_toolbar.toolbar.remove(self._entry_item) self.toolbar.insert(self._entry_item, position) self._toolbar_separator.hide() self.remove(self._url_toolbar) def __screen_size_changed_cb(self, screen): self._configure_toolbar(screen) def _connect_to_browser(self, browser): if self._browser is not None: self._browser.disconnect(self._uri_changed_hid) self._browser.disconnect(self._load_changed_hid) self._browser.disconnect(self._progress_changed_hid) self._browser.disconnect(self._security_status_changed_hid) self._browser = browser if not isinstance(self._browser, DummyBrowser): address = self._browser.props.uri or self._browser.loading_uri else: address = self._browser.props.uri self._set_address(address) self._set_progress(self._browser.props.estimated_load_progress) self._set_loading(self._browser.props.estimated_load_progress < 1.0) self._set_security_status(self._browser.security_status) is_webkit_browser = isinstance(self._browser, Browser) self.entry.props.editable = is_webkit_browser self._uri_changed_hid = self._browser.connect('notify::uri', self.__uri_changed_cb) self._load_changed_hid = self._browser.connect('load-changed', self.__load_changed_cb) self._progress_changed_hid = self._browser.connect( 'notify::estimated-load-progress', self.__progress_changed_cb) self._security_status_changed_hid = self._browser.connect( 'security-status-changed', self.__security_status_changed_cb) self._update_navigation_buttons() def __security_status_changed_cb(self, widget): self._set_security_status(widget.security_status) def __progress_changed_cb(self, widget, param): self._set_progress(widget.props.estimated_load_progress) self._set_loading(widget.props.estimated_load_progress < 1.0) def _set_security_status(self, security_status): # Display security status as a lock icon in the left side of # the URL entry. if security_status is None: self.entry.set_icon_from_pixbuf(iconentry.ICON_ENTRY_PRIMARY, None) elif security_status == Browser.SECURITY_STATUS_SECURE: self.entry.set_icon_from_name(iconentry.ICON_ENTRY_PRIMARY, 'channel-secure-symbolic') elif security_status == Browser.SECURITY_STATUS_INSECURE: self.entry.set_icon_from_name(iconentry.ICON_ENTRY_PRIMARY, 'channel-insecure-symbolic') def _set_progress(self, progress): if progress == 1.0: self.entry.set_progress_fraction(0.0) else: self.entry.set_progress_fraction(progress) def _set_address(self, uri): if uri is None: self.entry.props.address = '' else: self.entry.props.address = uri def __changed_cb(self, iconentry): # The WebEntry can be changed when we click on a link, then we # have to show the clear icon only if is the user who has # changed the entry if self.entry.has_focus(): if not self.entry.props.text: self._show_no_icon() else: self._show_clear_icon() def __focus_in_event_cb(self, entry, event): if not self._tabbed_view.is_current_page_pdf(): if not self.entry.props.text: self._show_no_icon() else: self._show_clear_icon() def __focus_out_event_cb(self, entry, event): if self._loading: self._show_stop_icon() else: if not self._tabbed_view.is_current_page_pdf(): self._show_reload_icon() def _show_no_icon(self): self.entry.remove_icon(iconentry.ICON_ENTRY_SECONDARY) def _show_stop_icon(self): self.entry.set_icon_from_name(iconentry.ICON_ENTRY_SECONDARY, 'entry-stop') def _show_reload_icon(self): self.entry.set_icon_from_name(iconentry.ICON_ENTRY_SECONDARY, 'entry-refresh') def _show_clear_icon(self): self.entry.set_icon_from_name(iconentry.ICON_ENTRY_SECONDARY, 'entry-cancel') def _update_navigation_buttons(self): can_go_back = self._browser.can_go_back() self._back.props.sensitive = can_go_back can_go_forward = self._browser.can_go_forward() self._forward.props.sensitive = can_go_forward is_webkit_browser = isinstance(self._browser, Browser) self._go_home.props.sensitive = is_webkit_browser if is_webkit_browser: self._reload_session_history() with self._link_add.handler_block(self._link_add_toggled_hid): uri = self._browser.get_uri() print(self.model.has_link(uri), uri) self._link_add.props.active = self.model.has_link(uri) def __link_removed_cb(self, model): self._update_navigation_buttons() def _entry_activate_cb(self, entry): url = entry.props.text effective_url = self._tabbed_view.normalize_or_autosearch_url(url) self._browser.load_uri(effective_url) self._browser.loading_uri = effective_url self.entry.props.address = effective_url self._browser.grab_focus() def _go_home_cb(self, button): self.emit('go-home') def _go_library_cb(self, button): self.emit('go-library') def _set_home_cb(self, button): self._reset_home_menu.set_visible(True) self.emit('set-home') def _reset_home_cb(self, button): self._reset_home_menu.set_visible(False) self.emit('reset-home') def _go_back_cb(self, button): self._browser.go_back() def _go_forward_cb(self, button): self._browser.go_forward() def __uri_changed_cb(self, widget, param): self._set_address(widget.get_uri()) self._update_navigation_buttons() filepicker.cleanup_temp_files() def __load_changed_cb(self, widget, event): self._update_navigation_buttons() def _stop_and_reload_cb(self, entry, icon_pos, button): if entry.has_focus() and \ not self._tabbed_view.is_current_page_pdf(): entry.set_text('') else: if self._loading: self._browser.stop_loading() else: self._browser.reload() def _set_loading(self, loading): self._loading = loading if self._loading: self._show_stop_icon() else: if not self._tabbed_view.is_current_page_pdf(): self._set_sensitive(True) self._show_reload_icon() else: self._set_sensitive(False) self._show_no_icon() def _set_sensitive(self, value): for widget in self.toolbar: if widget not in (self._stop_button, self._link_add): widget.set_sensitive(value) def _reload_session_history(self): back_forward_list = self._browser.get_back_forward_list() item_index = 0 # The index of the history item # Clear menus in palettes: for box_menu in (self._back_box_menu, self._forward_box_menu): for menu_item in box_menu.get_children(): box_menu.remove(menu_item) def create_menu_item(history_item): """Create a MenuItem for the back or forward palettes.""" title = history_item.get_title() or _('No Title') if not isinstance(title, unicode): title = unicode(title, 'utf-8') # This is a fix until the Sugar MenuItem is fixed: menu_item = PaletteMenuItem(text_label=title) menu_item.connect('activate', self._history_item_activated_cb, history_item) return menu_item back_list = back_forward_list.get_back_list_with_limit( _MAX_HISTORY_ENTRIES) back_list.reverse() for item in back_list: menu_item = create_menu_item(item) self._back_box_menu.pack_end(menu_item, False, False, 0) menu_item.show() item_index += 1 # Increment the item index to count the current page: item_index += 1 forward_list = back_forward_list.get_forward_list_with_limit( _MAX_HISTORY_ENTRIES) forward_list.reverse() for item in forward_list: menu_item = create_menu_item(item) self._forward_box_menu.pack_start(menu_item, False, False, 0) menu_item.show() item_index += 1 def _history_item_activated_cb(self, menu_item, history_item): self._back.get_palette().popdown(immediate=True) self._forward.get_palette().popdown(immediate=True) # self._browser.set_history_index(index) self._browser.go_to_back_forward_list_item(history_item) def __link_add_toggled_cb(self, button): if button.props.active: self.emit('add-link') else: self.emit('remove-link') def inspect_view(self, button): page = self._canvas.get_current_page() webview = self._canvas.get_children()[page].props.browser # If get_inspector returns None, it is not a real WebView inspector = webview.get_inspector() if inspector is not None: # Inspector window will be blank if disabled web_settings = webview.get_settings() web_settings.props.enable_developer_extras = True inspector.show() inspector.attach() '''
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 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 PrimaryToolbar(ToolbarBase): __gtype_name__ = 'PrimaryToolbar' __gsignals__ = { 'add-link': (GObject.SignalFlags.RUN_FIRST, None, ([])), 'go-home': (GObject.SignalFlags.RUN_FIRST, None, ([])), 'set-home': (GObject.SignalFlags.RUN_FIRST, None, ([])), 'reset-home': (GObject.SignalFlags.RUN_FIRST, None, ([])), 'go-library': (GObject.SignalFlags.RUN_FIRST, None, ([])), } def __init__(self, tabbed_view, act): ToolbarBase.__init__(self) self._url_toolbar = UrlToolbar() self._activity = act self._tabbed_view = self._canvas = tabbed_view self._loading = False toolbar = self.toolbar activity_button = ActivityToolbarButton(self._activity) toolbar.insert(activity_button, 0) separator = Gtk.SeparatorToolItem() save_as_pdf = ToolButton('save-as-pdf') save_as_pdf.set_tooltip(_('Save page as pdf')) save_as_pdf.connect('clicked', self.save_as_pdf) activity_button.props.page.insert(separator, -1) activity_button.props.page.insert(save_as_pdf, -1) separator.show() save_as_pdf.show() self._go_home = ToolButton('go-home') self._go_home.set_tooltip(_('Home page')) self._go_home.connect('clicked', self._go_home_cb) # add a menu to save the home page menu_box = PaletteMenuBox() self._go_home.props.palette.set_content(menu_box) menu_item = PaletteMenuItem() menu_item.set_label(_('Select as initial page')) menu_item.connect('activate', self._set_home_cb) menu_box.append_item(menu_item) self._reset_home_menu = PaletteMenuItem() self._reset_home_menu.set_label(_('Reset initial page')) self._reset_home_menu.connect('activate', self._reset_home_cb) menu_box.append_item(self._reset_home_menu) if os.path.isfile(LIBRARY_PATH): library_menu = PaletteMenuItem() library_menu.set_label(_('Library')) library_menu.connect('activate', self._go_library_cb) menu_box.append_item(library_menu) menu_box.show_all() # verify if the home page is configured client = GConf.Client.get_default() self._reset_home_menu.set_visible( client.get_string(HOME_PAGE_GCONF_KEY) is not None) toolbar.insert(self._go_home, -1) self._go_home.show() self.entry = WebEntry() self.entry.set_icon_from_name(iconentry.ICON_ENTRY_SECONDARY, 'entry-stop') self.entry.connect('icon-press', self._stop_and_reload_cb) self.entry.connect('activate', self._entry_activate_cb) self.entry.connect('focus-in-event', self.__focus_in_event_cb) self.entry.connect('focus-out-event', self.__focus_out_event_cb) self.entry.connect('key-press-event', self.__key_press_event_cb) self.entry.connect('changed', self.__changed_cb) self._entry_item = Gtk.ToolItem() self._entry_item.set_expand(True) self._entry_item.add(self.entry) self.entry.show() toolbar.insert(self._entry_item, -1) self._entry_item.show() self._back = ToolButton('go-previous-paired') self._back.set_tooltip(_('Back')) self._back.props.sensitive = False self._back.connect('clicked', self._go_back_cb) toolbar.insert(self._back, -1) self._back.show() palette = self._back.get_palette() self._back_box_menu = Gtk.VBox() self._back_box_menu.show() palette.set_content(self._back_box_menu) # FIXME, this is a hack, should be done in the theme: palette._content.set_border_width(1) self._forward = ToolButton('go-next-paired') self._forward.set_tooltip(_('Forward')) self._forward.props.sensitive = False self._forward.connect('clicked', self._go_forward_cb) toolbar.insert(self._forward, -1) self._forward.show() palette = self._forward.get_palette() self._forward_box_menu = Gtk.VBox() self._forward_box_menu.show() palette.set_content(self._forward_box_menu) # FIXME, this is a hack, should be done in the theme: palette._content.set_border_width(1) # Downloads ProgressIcon self._download_icon = ProgressToolButton('emblem-downloads', style.STANDARD_ICON_SIZE, 'vertical') self._download_icon.set_tooltip(_('Downloads')) self._download_icon.props.sensitive = False down_id = GObject.timeout_add(500, self.__download_running_cb) toolbar.insert(self._download_icon, -1) self._download_icon.show() self._link_add = ToolButton('emblem-favorite') self._link_add.set_tooltip(_('Bookmark')) self._link_add.connect('clicked', self._link_add_clicked_cb) toolbar.insert(self._link_add, -1) self._link_add.show() self._toolbar_separator = Gtk.SeparatorToolItem() self._toolbar_separator.props.draw = False self._toolbar_separator.set_expand(True) # Adds an options-toolbar button to the main-toolbar self._options_toolbar = OptionsToolbar(self._activity) self._options_toolbar_button = ToolbarButton( page=self._options_toolbar, icon_name='options') toolbar.insert(self._options_toolbar_button, -1) stop_button = StopButton(self._activity) toolbar.insert(stop_button, -1) self._progress_listener = None self._browser = None self._loading_changed_hid = None self._progress_changed_hid = None self._session_history_changed_hid = None self._uri_changed_hid = None self._security_status_changed_hid = None if tabbed_view.get_n_pages(): self._connect_to_browser(tabbed_view.props.current_browser) tabbed_view.connect_after('switch-page', self.__switch_page_cb) tabbed_view.connect_after('page-added', self.__page_added_cb) Gdk.Screen.get_default().connect('size-changed', self.__screen_size_changed_cb) self._configure_toolbar() def __download_running_cb(self): ''' Updates the downloadIcon tooltip message and progress value. ''' progress = downloadmanager.overall_downloads_progress() self._download_icon.update(progress) if progress > 0.0: self._download_icon.set_tooltip( _("Downloading.. {}%".format(int(progress * 100)))) else: self._download_icon.set_tooltip(_("No active downloads")) return True def __key_press_event_cb(self, entry, event): self._tabbed_view.current_browser.loading_uri = entry.props.text def __switch_page_cb(self, tabbed_view, page, page_num): if tabbed_view.get_n_pages(): self._connect_to_browser(tabbed_view.props.current_browser) def __page_added_cb(self, notebook, child, pagenum): self.entry._search_popdown() def _configure_toolbar(self, screen=None): # Adapt the toolbars for portrait or landscape mode. if screen is None: screen = Gdk.Screen.get_default() if screen.get_width() < screen.get_height(): if self._entry_item in self._url_toolbar.toolbar.get_children(): return self.toolbar.remove(self._entry_item) self._url_toolbar.toolbar.insert(self._entry_item, -1) separator_pos = len(self.toolbar.get_children()) - 1 self.toolbar.insert(self._toolbar_separator, separator_pos) self._toolbar_separator.show() self.pack_end(self._url_toolbar, True, True, 0) self._url_toolbar.show() else: if self._entry_item in self.toolbar.get_children(): return self.toolbar.remove(self._toolbar_separator) position = len(self.toolbar.get_children()) - 4 self._url_toolbar.toolbar.remove(self._entry_item) self.toolbar.insert(self._entry_item, position) self._toolbar_separator.hide() self.remove(self._url_toolbar) def __screen_size_changed_cb(self, screen): self._configure_toolbar(screen) def _connect_to_browser(self, browser): if self._browser is not None: self._browser.disconnect(self._uri_changed_hid) self._browser.disconnect(self._progress_changed_hid) self._browser.disconnect(self._loading_changed_hid) self._browser.disconnect(self._security_status_changed_hid) self._browser = browser if not isinstance(self._browser, DummyBrowser): address = self._browser.props.uri or self._browser.loading_uri else: address = self._browser.props.uri self._set_address(address) self._set_progress(self._browser.props.progress) self._set_status(self._browser.props.load_status) self._set_security_status(self._browser.security_status) is_webkit_browser = isinstance(self._browser, Browser) self.entry.props.editable = is_webkit_browser self._uri_changed_hid = self._browser.connect('notify::uri', self.__uri_changed_cb) self._progress_changed_hid = self._browser.connect( 'notify::progress', self.__progress_changed_cb) self._loading_changed_hid = self._browser.connect( 'notify::load-status', self.__loading_changed_cb) self._security_status_changed_hid = self._browser.connect( 'security-status-changed', self.__security_status_changed_cb) self._update_navigation_buttons() def __loading_changed_cb(self, widget, param): self._set_status(widget.get_load_status()) def __security_status_changed_cb(self, widget): self._set_security_status(widget.security_status) def __progress_changed_cb(self, widget, param): self._set_progress(widget.get_progress()) def _set_status(self, status): self._set_loading(status < WebKit.LoadStatus.FINISHED) def _set_security_status(self, security_status): # Display security status as a lock icon in the left side of # the URL entry. if security_status is None: self.entry.set_icon_from_pixbuf(iconentry.ICON_ENTRY_PRIMARY, None) elif security_status == Browser.SECURITY_STATUS_SECURE: self.entry.set_icon_from_name(iconentry.ICON_ENTRY_PRIMARY, 'channel-secure-symbolic') elif security_status == Browser.SECURITY_STATUS_INSECURE: self.entry.set_icon_from_name(iconentry.ICON_ENTRY_PRIMARY, 'channel-insecure-symbolic') def _set_progress(self, progress): if progress == 1.0: self.entry.set_progress_fraction(0.0) else: self.entry.set_progress_fraction(progress) def _set_address(self, uri): if uri is None: self.entry.props.address = '' else: self.entry.props.address = uri def __changed_cb(self, iconentry): # The WebEntry can be changed when we click on a link, then we # have to show the clear icon only if is the user who has # changed the entry if self.entry.has_focus(): if not self.entry.props.text: self._show_no_icon() else: self._show_clear_icon() def __focus_in_event_cb(self, entry, event): if not self._tabbed_view.is_current_page_pdf(): if not self.entry.props.text: self._show_no_icon() else: self._show_clear_icon() def __focus_out_event_cb(self, entry, event): if self._loading: self._show_stop_icon() else: if not self._tabbed_view.is_current_page_pdf(): self._show_reload_icon() def _show_no_icon(self): self.entry.remove_icon(iconentry.ICON_ENTRY_SECONDARY) def _show_stop_icon(self): self.entry.set_icon_from_name(iconentry.ICON_ENTRY_SECONDARY, 'entry-stop') def _show_reload_icon(self): self.entry.set_icon_from_name(iconentry.ICON_ENTRY_SECONDARY, 'entry-refresh') def _show_clear_icon(self): self.entry.set_icon_from_name(iconentry.ICON_ENTRY_SECONDARY, 'entry-cancel') def _update_navigation_buttons(self): can_go_back = self._browser.can_go_back() self._back.props.sensitive = can_go_back can_go_forward = self._browser.can_go_forward() self._forward.props.sensitive = can_go_forward is_webkit_browser = isinstance(self._browser, Browser) self._link_add.props.sensitive = is_webkit_browser self._go_home.props.sensitive = is_webkit_browser if is_webkit_browser: self._reload_session_history() def _entry_activate_cb(self, entry): url = entry.props.text effective_url = self._tabbed_view.normalize_or_autosearch_url(url) self._browser.load_uri(effective_url) self._browser.loading_uri = effective_url self.entry.props.address = effective_url self._browser.grab_focus() def _go_home_cb(self, button): self.emit('go-home') def _go_library_cb(self, button): self.emit('go-library') def _set_home_cb(self, button): self._reset_home_menu.set_visible(True) self.emit('set-home') def _reset_home_cb(self, button): self._reset_home_menu.set_visible(False) self.emit('reset-home') def _go_back_cb(self, button): self._browser.go_back() def _go_forward_cb(self, button): self._browser.go_forward() def __uri_changed_cb(self, widget, param): self._set_address(widget.get_uri()) self._update_navigation_buttons() filepicker.cleanup_temp_files() def _stop_and_reload_cb(self, entry, icon_pos, button): if entry.has_focus() and \ not self._tabbed_view.is_current_page_pdf(): entry.set_text('') else: if self._loading: self._browser.stop_loading() else: self._browser.reload() def _set_loading(self, loading): self._loading = loading if self._loading: self._show_stop_icon() else: if not self._tabbed_view.is_current_page_pdf(): self.set_sensitive(True) self._show_reload_icon() else: self.set_sensitive(False) self._show_no_icon() def _reload_session_history(self): back_forward_list = self._browser.get_back_forward_list() item_index = 0 # The index of the history item # Clear menus in palettes: for box_menu in (self._back_box_menu, self._forward_box_menu): for menu_item in box_menu.get_children(): box_menu.remove(menu_item) def create_menu_item(history_item, item_index): """Create a MenuItem for the back or forward palettes.""" title = history_item.get_title() if not isinstance(title, unicode): title = unicode(title, 'utf-8') # This is a fix until the Sugar MenuItem is fixed: menu_item = PaletteMenuItem(text_label=title) menu_item.connect('activate', self._history_item_activated_cb, item_index) return menu_item back_list = back_forward_list.get_back_list_with_limit( _MAX_HISTORY_ENTRIES) back_list.reverse() for item in back_list: menu_item = create_menu_item(item, item_index) self._back_box_menu.pack_end(menu_item, False, False, 0) menu_item.show() item_index += 1 # Increment the item index to count the current page: item_index += 1 forward_list = back_forward_list.get_forward_list_with_limit( _MAX_HISTORY_ENTRIES) forward_list.reverse() for item in forward_list: menu_item = create_menu_item(item, item_index) self._forward_box_menu.pack_start(menu_item, False, False, 0) menu_item.show() item_index += 1 def _history_item_activated_cb(self, menu_item, index): self._back.get_palette().popdown(immediate=True) self._forward.get_palette().popdown(immediate=True) self._browser.set_history_index(index) def _link_add_clicked_cb(self, button): self.emit('add-link') def save_as_pdf(self, widget): tmp_dir = os.path.join(self._activity.get_activity_root(), 'tmp') fd, file_path = tempfile.mkstemp(dir=tmp_dir) os.close(fd) page = self._canvas.get_current_page() webview = self._canvas.get_children()[page].get_children()[0] operation = Gtk.PrintOperation.new() operation.set_export_filename(file_path) webview.get_main_frame().print_full(operation, Gtk.PrintOperationAction.EXPORT) client = GConf.Client.get_default() jobject = datastore.create() color = client.get_string('/desktop/sugar/user/color') try: jobject.metadata['title'] = _('Browse activity as PDF') jobject.metadata['icon-color'] = color jobject.metadata['mime_type'] = 'application/pdf' jobject.file_path = file_path datastore.write(jobject) finally: self.__pdf_alert(jobject.object_id) jobject.destroy() del jobject def __pdf_alert(self, object_id): alert = Alert() alert.props.title = _('Page saved') alert.props.msg = _('The page has been saved as PDF to journal') alert.add_button(Gtk.ResponseType.APPLY, _('Show in Journal'), Icon(icon_name='zoom-activity')) alert.add_button(Gtk.ResponseType.OK, _('Ok'), Icon(icon_name='dialog-ok')) # Remove other alerts for alert in self._activity._alerts: self._activity.remove_alert(alert) self._activity.add_alert(alert) alert.connect('response', self.__pdf_response_alert, object_id) alert.show_all() def __pdf_response_alert(self, alert, response_id, object_id): if response_id is Gtk.ResponseType.APPLY: activity.show_object_in_journal(object_id) self._activity.remove_alert(alert)
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 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 PrimaryToolbar(ToolbarBase): __gtype_name__ = 'PrimaryToolbar' __gsignals__ = { 'go-home': (GObject.SignalFlags.RUN_FIRST, None, ([])), 'set-home': (GObject.SignalFlags.RUN_FIRST, None, ([])), 'reset-home': (GObject.SignalFlags.RUN_FIRST, None, ([])), 'go-library': (GObject.SignalFlags.RUN_FIRST, None, ([])), } def __init__(self, tabbed_view, act): ToolbarBase.__init__(self) self._url_toolbar = UrlToolbar() self._activity = act self._tabbed_view = tabbed_view self._loading = False toolbar = self.toolbar activity_button = ActivityToolbarButton(self._activity) toolbar.insert(activity_button, 0) self._go_home = ToolButton('go-home') self._go_home.set_tooltip(_('Home page')) self._go_home.connect('clicked', self._go_home_cb) # add a menu to save the home page menu_box = PaletteMenuBox() self._go_home.props.palette.set_content(menu_box) menu_item = PaletteMenuItem() menu_item.set_label(_('Select as initial page')) menu_item.connect('activate', self._set_home_cb) menu_box.append_item(menu_item) self._reset_home_menu = PaletteMenuItem() self._reset_home_menu.set_label(_('Reset initial page')) self._reset_home_menu.connect('activate', self._reset_home_cb) menu_box.append_item(self._reset_home_menu) if os.path.isfile(LIBRARY_PATH): library_menu = PaletteMenuItem() library_menu.set_label(_('Library')) library_menu.connect('activate', self._go_library_cb) menu_box.append_item(library_menu) menu_box.show_all() # verify if the home page is configured client = GConf.Client.get_default() self._reset_home_menu.set_visible( client.get_string(HOME_PAGE_GCONF_KEY) is not None) toolbar.insert(self._go_home, -1) self._go_home.show() self.entry = WebEntry() self.entry.set_icon_from_name(iconentry.ICON_ENTRY_SECONDARY, 'entry-stop') self.entry.connect('icon-press', self._stop_and_reload_cb) self.entry.connect('activate', self._entry_activate_cb) self.entry.connect('focus-in-event', self.__focus_in_event_cb) self.entry.connect('focus-out-event', self.__focus_out_event_cb) self.entry.connect('key-press-event', self.__key_press_event_cb) self.entry.connect('changed', self.__changed_cb) self._entry_item = Gtk.ToolItem() self._entry_item.set_expand(True) self._entry_item.add(self.entry) self.entry.show() toolbar.insert(self._entry_item, -1) self._entry_item.show() self._back = ToolButton('go-previous-paired') self._back.set_tooltip(_('Back')) self._back.props.sensitive = False self._back.connect('clicked', self._go_back_cb) toolbar.insert(self._back, -1) self._back.show() palette = self._back.get_palette() self._back_box_menu = Gtk.VBox() self._back_box_menu.show() palette.set_content(self._back_box_menu) # FIXME, this is a hack, should be done in the theme: palette._content.set_border_width(1) self._forward = ToolButton('go-next-paired') self._forward.set_tooltip(_('Forward')) self._forward.props.sensitive = False self._forward.connect('clicked', self._go_forward_cb) toolbar.insert(self._forward, -1) self._forward.show() palette = self._forward.get_palette() self._forward_box_menu = Gtk.VBox() self._forward_box_menu.show() palette.set_content(self._forward_box_menu) # FIXME, this is a hack, should be done in the theme: palette._content.set_border_width(1) self._toolbar_separator = Gtk.SeparatorToolItem() self._toolbar_separator.props.draw = False self._toolbar_separator.set_expand(True) stop_button = StopButton(self._activity) toolbar.insert(stop_button, -1) self._progress_listener = None self._browser = None self._loading_changed_hid = None self._progress_changed_hid = None self._session_history_changed_hid = None self._uri_changed_hid = None self._security_status_changed_hid = None if tabbed_view.get_n_pages(): self._connect_to_browser(tabbed_view.props.current_browser) tabbed_view.connect_after('switch-page', self.__switch_page_cb) tabbed_view.connect_after('page-added', self.__page_added_cb) Gdk.Screen.get_default().connect('size-changed', self.__screen_size_changed_cb) self._configure_toolbar() def __key_press_event_cb(self, entry, event): self._tabbed_view.current_browser.loading_uri = entry.props.text def __switch_page_cb(self, tabbed_view, page, page_num): if tabbed_view.get_n_pages(): self._connect_to_browser(tabbed_view.props.current_browser) def __page_added_cb(self, notebook, child, pagenum): self.entry._search_popdown() def _configure_toolbar(self, screen=None): # Adapt the toolbars for portrait or landscape mode. if screen is None: screen = Gdk.Screen.get_default() if screen.get_width() < screen.get_height(): if self._entry_item in self._url_toolbar.toolbar.get_children(): return self.toolbar.remove(self._entry_item) self._url_toolbar.toolbar.insert(self._entry_item, -1) separator_pos = len(self.toolbar.get_children()) - 1 self.toolbar.insert(self._toolbar_separator, separator_pos) self._toolbar_separator.show() self.pack_end(self._url_toolbar, True, True, 0) self._url_toolbar.show() else: if self._entry_item in self.toolbar.get_children(): return self.toolbar.remove(self._toolbar_separator) position = len(self.toolbar.get_children()) - 4 self._url_toolbar.toolbar.remove(self._entry_item) self.toolbar.insert(self._entry_item, position) self._toolbar_separator.hide() self.remove(self._url_toolbar) def __screen_size_changed_cb(self, screen): self._configure_toolbar(screen) def _connect_to_browser(self, browser): if self._browser is not None: self._browser.disconnect(self._uri_changed_hid) self._browser.disconnect(self._progress_changed_hid) self._browser.disconnect(self._loading_changed_hid) self._browser.disconnect(self._security_status_changed_hid) self._browser = browser if not isinstance(self._browser, DummyBrowser): address = self._browser.props.uri or self._browser.loading_uri else: address = self._browser.props.uri self._set_address(address) self._set_progress(self._browser.props.progress) self._set_status(self._browser.props.load_status) self._set_security_status(self._browser.security_status) is_webkit_browser = isinstance(self._browser, Browser) self.entry.props.editable = is_webkit_browser self._uri_changed_hid = self._browser.connect( 'notify::uri', self.__uri_changed_cb) self._progress_changed_hid = self._browser.connect( 'notify::progress', self.__progress_changed_cb) self._loading_changed_hid = self._browser.connect( 'notify::load-status', self.__loading_changed_cb) self._security_status_changed_hid = self._browser.connect( 'security-status-changed', self.__security_status_changed_cb) self._update_navigation_buttons() def __loading_changed_cb(self, widget, param): self._set_status(widget.get_load_status()) def __security_status_changed_cb(self, widget): self._set_security_status(widget.security_status) def __progress_changed_cb(self, widget, param): self._set_progress(widget.get_progress()) def _set_status(self, status): self._set_loading(status < WebKit.LoadStatus.FINISHED) def _set_security_status(self, security_status): # Display security status as a lock icon in the left side of # the URL entry. if security_status is None: self.entry.set_icon_from_pixbuf( iconentry.ICON_ENTRY_PRIMARY, None) elif security_status == Browser.SECURITY_STATUS_SECURE: self.entry.set_icon_from_name( iconentry.ICON_ENTRY_PRIMARY, 'channel-secure-symbolic') elif security_status == Browser.SECURITY_STATUS_INSECURE: self.entry.set_icon_from_name( iconentry.ICON_ENTRY_PRIMARY, 'channel-insecure-symbolic') def _set_progress(self, progress): if progress == 1.0: self.entry.set_progress_fraction(0.0) else: self.entry.set_progress_fraction(progress) def _set_address(self, uri): if uri is None: self.entry.props.address = '' else: self.entry.props.address = uri def __changed_cb(self, iconentry): # The WebEntry can be changed when we click on a link, then we # have to show the clear icon only if is the user who has # changed the entry if self.entry.has_focus(): if not self.entry.props.text: self._show_no_icon() else: self._show_clear_icon() def __focus_in_event_cb(self, entry, event): if not self._tabbed_view.is_current_page_pdf(): if not self.entry.props.text: self._show_no_icon() else: self._show_clear_icon() def __focus_out_event_cb(self, entry, event): if self._loading: self._show_stop_icon() else: if not self._tabbed_view.is_current_page_pdf(): self._show_reload_icon() def _show_no_icon(self): self.entry.remove_icon(iconentry.ICON_ENTRY_SECONDARY) def _show_stop_icon(self): self.entry.set_icon_from_name(iconentry.ICON_ENTRY_SECONDARY, 'entry-stop') def _show_reload_icon(self): self.entry.set_icon_from_name(iconentry.ICON_ENTRY_SECONDARY, 'entry-refresh') def _show_clear_icon(self): self.entry.set_icon_from_name(iconentry.ICON_ENTRY_SECONDARY, 'entry-cancel') def _update_navigation_buttons(self): can_go_back = self._browser.can_go_back() self._back.props.sensitive = can_go_back can_go_forward = self._browser.can_go_forward() self._forward.props.sensitive = can_go_forward is_webkit_browser = isinstance(self._browser, Browser) self._go_home.props.sensitive = is_webkit_browser if is_webkit_browser: self._reload_session_history() def _entry_activate_cb(self, entry): url = entry.props.text effective_url = self._tabbed_view.normalize_or_autosearch_url(url) self._browser.load_uri(effective_url) self._browser.loading_uri = effective_url self.entry.props.address = effective_url self._browser.grab_focus() def _go_home_cb(self, button): self.emit('go-home') def _go_library_cb(self, button): self.emit('go-library') def _set_home_cb(self, button): self._reset_home_menu.set_visible(True) self.emit('set-home') def _reset_home_cb(self, button): self._reset_home_menu.set_visible(False) self.emit('reset-home') def _go_back_cb(self, button): self._browser.go_back() def _go_forward_cb(self, button): self._browser.go_forward() def __uri_changed_cb(self, widget, param): self._set_address(widget.get_uri()) self._update_navigation_buttons() filepicker.cleanup_temp_files() def _stop_and_reload_cb(self, entry, icon_pos, button): if entry.has_focus() and \ not self._tabbed_view.is_current_page_pdf(): entry.set_text('') else: if self._loading: self._browser.stop_loading() else: self._browser.reload() def _set_loading(self, loading): self._loading = loading if self._loading: self._show_stop_icon() else: if not self._tabbed_view.is_current_page_pdf(): self.set_sensitive(True) self._show_reload_icon() else: self.set_sensitive(False) self._show_no_icon() def _reload_session_history(self): back_forward_list = self._browser.get_back_forward_list() item_index = 0 # The index of the history item # Clear menus in palettes: for box_menu in (self._back_box_menu, self._forward_box_menu): for menu_item in box_menu.get_children(): box_menu.remove(menu_item) def create_menu_item(history_item, item_index): """Create a MenuItem for the back or forward palettes.""" title = history_item.get_title() if not isinstance(title, unicode): title = unicode(title, 'utf-8') # This is a fix until the Sugar MenuItem is fixed: menu_item = PaletteMenuItem(text_label=title) menu_item.connect('activate', self._history_item_activated_cb, item_index) return menu_item back_list = back_forward_list.get_back_list_with_limit( _MAX_HISTORY_ENTRIES) back_list.reverse() for item in back_list: menu_item = create_menu_item(item, item_index) self._back_box_menu.pack_end(menu_item, False, False, 0) menu_item.show() item_index += 1 # Increment the item index to count the current page: item_index += 1 forward_list = back_forward_list.get_forward_list_with_limit( _MAX_HISTORY_ENTRIES) forward_list.reverse() for item in forward_list: menu_item = create_menu_item(item, item_index) self._forward_box_menu.pack_start(menu_item, False, False, 0) menu_item.show() item_index += 1 def _history_item_activated_cb(self, menu_item, index): self._back.get_palette().popdown(immediate=True) self._forward.get_palette().popdown(immediate=True) self._browser.set_history_index(index)
def __init__(self, pc, toolbar_box): GObject.GObject.__init__(self) self._abiword_canvas = pc.abiword_canvas copy = CopyButton() copy.props.accelerator = '<Ctrl>C' copy.connect('clicked', lambda button: pc.abiword_canvas.copy()) self.insert(copy, -1) copy.show() paste = PasteButton() paste.props.accelerator = '<Ctrl>V' paste.connect('clicked', self.__paste_button_cb) self.insert(paste, -1) paste.show() menu_box = PaletteMenuBox() paste.props.palette.set_content(menu_box) menu_box.show() menu_item = PaletteMenuItem() menu_item.set_label(_('Paste unformatted')) menu_item.connect('activate', self.__paste_special_button_cb) menu_box.append_item(menu_item) separator = Gtk.SeparatorToolItem() self.insert(separator, -1) separator.show() undo = UndoButton(sensitive=True) undo.connect('clicked', lambda button: pc.abiword_canvas.undo()) pc.abiword_canvas.connect("can-undo", lambda abi, can_undo: undo.set_sensitive(can_undo)) self.insert(undo, -1) undo.show() redo = RedoButton(sensitive=True) redo.connect('clicked', lambda button: pc.abiword_canvas.redo()) pc.abiword_canvas.connect("can-redo", lambda abi, can_redo: redo.set_sensitive(can_redo)) self.insert(redo, -1) redo.show() pc.abiword_canvas.connect('text-selected', lambda abi, b: copy.set_sensitive(True)) pc.abiword_canvas.connect('image-selected', lambda abi, b: copy.set_sensitive(True)) pc.abiword_canvas.connect('selection-cleared', lambda abi, b: copy.set_sensitive(False)) separator = Gtk.SeparatorToolItem() self.insert(separator, -1) separator.show() search_label = Gtk.Label(label=_("Search") + ": ") search_label.show() search_item_page_label = Gtk.ToolItem() search_item_page_label.add(search_label) self.insert(search_item_page_label, -1) search_item_page_label.show() # setup the search options self._search_entry = iconentry.IconEntry() self._search_entry.set_icon_from_name(iconentry.ICON_ENTRY_PRIMARY, 'system-search') self._search_entry.connect('activate', self._search_entry_activated_cb) self._search_entry.connect('changed', self._search_entry_changed_cb) self._search_entry.add_clear_button() self._add_widget(self._search_entry, expand=True) self._findprev = ToolButton('go-previous-paired') self._findprev.set_tooltip(_('Find previous')) self.insert(self._findprev, -1) self._findprev.show() self._findprev.connect('clicked', self._findprev_cb) self._findnext = ToolButton('go-next-paired') self._findnext.set_tooltip(_('Find next')) self.insert(self._findnext, -1) self._findnext.show() self._findnext.connect('clicked', self._findnext_cb) # set the initial state of the search controls # note: we won't simple call self._search_entry_changed_cb # here, as that will call into the abiword_canvas, which # is not mapped on screen here, causing the set_find_string # call to fail self._findprev.set_sensitive(False) self._findnext.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): 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:
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()
def __init__(self, tabbed_view, act): ToolbarBase.__init__(self) self._url_toolbar = UrlToolbar() self._activity = act self.model = act.model self.model.link_removed_signal.connect(self.__link_removed_cb) self._tabbed_view = self._canvas = tabbed_view self._loading = False self._download_running_hid = None toolbar = self.toolbar activity_button = ActivityToolbarButton(self._activity) toolbar.insert(activity_button, 0) separator = Gtk.SeparatorToolItem() ''' Disabled since the python gi bindings don't expose the critical WebKit2.PrintOperation.print function save_as_pdf = ToolButton('save-as-pdf') save_as_pdf.set_tooltip(_('Save page as pdf')) save_as_pdf.connect('clicked', self.save_as_pdf) activity_button.props.page.insert(separator, -1) activity_button.props.page.insert(save_as_pdf, -1) separator.show() save_as_pdf.show() ''' inspect_view = ToolButton('emblem-view-source') inspect_view.set_tooltip(_('Show Web Inspector')) inspect_view.connect('clicked', self.inspect_view) activity_button.props.page.insert(separator, -1) activity_button.props.page.insert(inspect_view, -1) separator.show() inspect_view.show() self._go_home = ToolButton('go-home') self._go_home.set_tooltip(_('Home page')) self._go_home.connect('clicked', self._go_home_cb) # add a menu to save the home page menu_box = PaletteMenuBox() self._go_home.props.palette.set_content(menu_box) menu_item = PaletteMenuItem() menu_item.set_label(_('Select as initial page')) menu_item.connect('activate', self._set_home_cb) menu_box.append_item(menu_item) self._reset_home_menu = PaletteMenuItem() self._reset_home_menu.set_label(_('Reset initial page')) self._reset_home_menu.connect('activate', self._reset_home_cb) menu_box.append_item(self._reset_home_menu) if os.path.isfile(LIBRARY_PATH): library_menu = PaletteMenuItem() library_menu.set_label(_('Library')) library_menu.connect('activate', self._go_library_cb) menu_box.append_item(library_menu) menu_box.show_all() # verify if the home page is configured client = GConf.Client.get_default() self._reset_home_menu.set_visible( client.get_string(HOME_PAGE_GCONF_KEY) is not None) toolbar.insert(self._go_home, -1) self._go_home.show() self.entry = WebEntry() self.entry.set_icon_from_name(iconentry.ICON_ENTRY_SECONDARY, 'entry-stop') self.entry.connect('icon-press', self._stop_and_reload_cb) self.entry.connect('activate', self._entry_activate_cb) self.entry.connect('focus-in-event', self.__focus_in_event_cb) self.entry.connect('focus-out-event', self.__focus_out_event_cb) self.entry.connect('key-press-event', self.__key_press_event_cb) self.entry.connect('changed', self.__changed_cb) # In an event box so that it can render the background entry_box = Gtk.EventBox() entry_box.add(self.entry) entry_box.show() self._entry_item = Gtk.ToolItem() self._entry_item.set_expand(True) self._entry_item.add(entry_box) self.entry.show() toolbar.insert(self._entry_item, -1) self._entry_item.show() self._back = ToolButton('go-previous-paired', accelerator='<ctrl>Left') self._back.set_tooltip(_('Back')) self._back.props.sensitive = False self._back.connect('clicked', self._go_back_cb) toolbar.insert(self._back, -1) self._back.show() palette = self._back.get_palette() self._back_box_menu = Gtk.VBox() self._back_box_menu.show() palette.set_content(self._back_box_menu) # FIXME, this is a hack, should be done in the theme: palette._content.set_border_width(1) self._forward = ToolButton('go-next-paired', accelerator='<ctrl>Right') self._forward.set_tooltip(_('Forward')) self._forward.props.sensitive = False self._forward.connect('clicked', self._go_forward_cb) toolbar.insert(self._forward, -1) self._forward.show() palette = self._forward.get_palette() self._forward_box_menu = Gtk.VBox() self._forward_box_menu.show() palette.set_content(self._forward_box_menu) # FIXME, this is a hack, should be done in the theme: palette._content.set_border_width(1) self._download_icon = ProgressToolButton( icon_name='emblem-downloads', tooltip=_('No Downloads Running')) toolbar.insert(self._download_icon, -1) self._download_icon.show() downloadmanager.connect_donwload_started(self.__download_started_cb) self._link_add = ToggleToolButton('emblem-favorite') self._link_add.set_accelerator('<ctrl>d') self._link_add.set_tooltip(_('Bookmark')) self._link_add_toggled_hid = \ self._link_add.connect('toggled', self.__link_add_toggled_cb) toolbar.insert(self._link_add, -1) self._link_add.show() self._toolbar_separator = Gtk.SeparatorToolItem() self._toolbar_separator.props.draw = False self._toolbar_separator.set_expand(True) self._stop_button = StopButton(self._activity) toolbar.insert(self._stop_button, -1) self._progress_listener = None self._browser = None self._loading_changed_hid = None self._progress_changed_hid = None self._session_history_changed_hid = None self._uri_changed_hid = None self._load_changed_hid = None self._security_status_changed_hid = None if tabbed_view.get_n_pages(): self._connect_to_browser(tabbed_view.props.current_browser) tabbed_view.connect_after('switch-page', self.__switch_page_cb) tabbed_view.connect_after('page-added', self.__page_added_cb) Gdk.Screen.get_default().connect('size-changed', self.__screen_size_changed_cb) self._configure_toolbar()
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 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')) 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 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 PrimaryToolbar(ToolbarBase): __gtype_name__ = "PrimaryToolbar" __gsignals__ = { "add-link": (GObject.SignalFlags.RUN_FIRST, None, ([])), "go-home": (GObject.SignalFlags.RUN_FIRST, None, ([])), "set-home": (GObject.SignalFlags.RUN_FIRST, None, ([])), "reset-home": (GObject.SignalFlags.RUN_FIRST, None, ([])), "go-library": (GObject.SignalFlags.RUN_FIRST, None, ([])), "go-to-JSshell": (GObject.SignalFlags.RUN_FIRST, None, ([])), "get-shell-input": (GObject.SignalFlags.RUN_FIRST, None, ([])), } def __init__(self, tabbed_view, act): ToolbarBase.__init__(self) self._url_toolbar = UrlToolbar() self._activity = act self._tabbed_view = self._canvas = tabbed_view self._loading = False toolbar = self.toolbar activity_button = ActivityToolbarButton(self._activity) toolbar.insert(activity_button, 0) separator = Gtk.SeparatorToolItem() save_as_pdf = ToolButton("save-as-pdf") save_as_pdf.set_tooltip(_("Save page as pdf")) save_as_pdf.connect("clicked", self.save_as_pdf) activity_button.props.page.insert(separator, -1) activity_button.props.page.insert(save_as_pdf, -1) separator.show() save_as_pdf.show() self._go_home = ToolButton("go-home") self._go_home.set_tooltip(_("Home page")) self._go_home.connect("clicked", self._go_home_cb) # add a menu to save the home page menu_box = PaletteMenuBox() self._go_home.props.palette.set_content(menu_box) menu_item = PaletteMenuItem() menu_item.set_label(_("Select as initial page")) menu_item.connect("activate", self._set_home_cb) menu_box.append_item(menu_item) self._reset_home_menu = PaletteMenuItem() self._reset_home_menu.set_label(_("Reset initial page")) self._reset_home_menu.connect("activate", self._reset_home_cb) menu_box.append_item(self._reset_home_menu) if os.path.isfile(LIBRARY_PATH): library_menu = PaletteMenuItem() library_menu.set_label(_("Library")) library_menu.connect("activate", self._go_library_cb) menu_box.append_item(library_menu) menu_box.show_all() # verify if the home page is configured client = GConf.Client.get_default() self._reset_home_menu.set_visible(client.get_string(HOME_PAGE_GCONF_KEY) is not None) toolbar.insert(self._go_home, -1) self._go_home.show() self.entry = WebEntry() self.entry.set_icon_from_name(iconentry.ICON_ENTRY_SECONDARY, "entry-stop") self.entry.connect("icon-press", self._stop_and_reload_cb) self.entry.connect("activate", self._entry_activate_cb) self.entry.connect("focus-in-event", self.__focus_in_event_cb) self.entry.connect("focus-out-event", self.__focus_out_event_cb) self.entry.connect("key-press-event", self.__key_press_event_cb) self.entry.connect("changed", self.__changed_cb) self._entry_item = Gtk.ToolItem() self._entry_item.set_expand(True) self._entry_item.add(self.entry) self.entry.show() toolbar.insert(self._entry_item, -1) self._entry_item.show() self._back = ToolButton("go-previous-paired") self._back.set_tooltip(_("Back")) self._back.props.sensitive = False self._back.connect("clicked", self._go_back_cb) toolbar.insert(self._back, -1) self._back.show() palette = self._back.get_palette() self._back_box_menu = Gtk.VBox() self._back_box_menu.show() palette.set_content(self._back_box_menu) # FIXME, this is a hack, should be done in the theme: palette._content.set_border_width(1) self._forward = ToolButton("go-next-paired") self._forward.set_tooltip(_("Forward")) self._forward.props.sensitive = False self._forward.connect("clicked", self._go_forward_cb) toolbar.insert(self._forward, -1) self._forward.show() palette = self._forward.get_palette() self._forward_box_menu = Gtk.VBox() self._forward_box_menu.show() palette.set_content(self._forward_box_menu) # FIXME, this is a hack, should be done in the theme: palette._content.set_border_width(1) self._link_add = ToolButton("emblem-favorite") self._link_add.set_tooltip(_("Bookmark")) self._link_add.connect("clicked", self._link_add_clicked_cb) toolbar.insert(self._link_add, -1) self._link_add.show() self._toolbar_separator = Gtk.SeparatorToolItem() self._toolbar_separator.props.draw = False self._toolbar_separator.set_expand(True) self._go_to_JSshell = ToolButton("go-to-JSshell") self._go_to_JSshell.set_tooltip(_("Go to Interactive Javascript Shell")) self._go_to_JSshell.connect("clicked", self._go_to_JSshell_cb) # adding a button for the Interactive Javascript shell toolbar.insert(self._go_to_JSshell, -1) self._go_to_JSshell.show() self._get_shell_input = ToolButton("get-shell-input") self._get_shell_input.set_tooltip(_("Get Interactive Javascript Shell Input")) self._get_shell_input.connect("clicked", self._get_shell_input_cb) # adding a button for the Interactive Javascript shell toolbar.insert(self._get_shell_input, -1) self._get_shell_input.show() stop_button = StopButton(self._activity) toolbar.insert(stop_button, -1) self._progress_listener = None self._browser = None self._loading_changed_hid = None self._progress_changed_hid = None self._session_history_changed_hid = None self._uri_changed_hid = None self._security_status_changed_hid = None if tabbed_view.get_n_pages(): self._connect_to_browser(tabbed_view.props.current_browser) tabbed_view.connect_after("switch-page", self.__switch_page_cb) tabbed_view.connect_after("page-added", self.__page_added_cb) Gdk.Screen.get_default().connect("size-changed", self.__screen_size_changed_cb) self._configure_toolbar() def __key_press_event_cb(self, entry, event): self._tabbed_view.current_browser.loading_uri = entry.props.text def __switch_page_cb(self, tabbed_view, page, page_num): if tabbed_view.get_n_pages(): self._connect_to_browser(tabbed_view.props.current_browser) def __page_added_cb(self, notebook, child, pagenum): self.entry._search_popdown() def _configure_toolbar(self, screen=None): # Adapt the toolbars for portrait or landscape mode. if screen is None: screen = Gdk.Screen.get_default() if screen.get_width() < screen.get_height(): if self._entry_item in self._url_toolbar.toolbar.get_children(): return self.toolbar.remove(self._entry_item) self._url_toolbar.toolbar.insert(self._entry_item, -1) separator_pos = len(self.toolbar.get_children()) - 1 self.toolbar.insert(self._toolbar_separator, separator_pos) self._toolbar_separator.show() self.pack_end(self._url_toolbar, True, True, 0) self._url_toolbar.show() else: if self._entry_item in self.toolbar.get_children(): return self.toolbar.remove(self._toolbar_separator) position = len(self.toolbar.get_children()) - 4 self._url_toolbar.toolbar.remove(self._entry_item) self.toolbar.insert(self._entry_item, position) self._toolbar_separator.hide() self.remove(self._url_toolbar) def __screen_size_changed_cb(self, screen): self._configure_toolbar(screen) def _connect_to_browser(self, browser): if self._browser is not None: self._browser.disconnect(self._uri_changed_hid) self._browser.disconnect(self._progress_changed_hid) self._browser.disconnect(self._loading_changed_hid) self._browser.disconnect(self._security_status_changed_hid) self._browser = browser if not isinstance(self._browser, DummyBrowser): address = self._browser.props.uri or self._browser.loading_uri else: address = self._browser.props.uri self._set_address(address) self._set_progress(self._browser.props.progress) self._set_status(self._browser.props.load_status) self._set_security_status(self._browser.security_status) is_webkit_browser = isinstance(self._browser, Browser) self.entry.props.editable = is_webkit_browser self._uri_changed_hid = self._browser.connect("notify::uri", self.__uri_changed_cb) self._progress_changed_hid = self._browser.connect("notify::progress", self.__progress_changed_cb) self._loading_changed_hid = self._browser.connect("notify::load-status", self.__loading_changed_cb) self._security_status_changed_hid = self._browser.connect( "security-status-changed", self.__security_status_changed_cb ) self._update_navigation_buttons() def __loading_changed_cb(self, widget, param): self._set_status(widget.get_load_status()) def __security_status_changed_cb(self, widget): self._set_security_status(widget.security_status) def __progress_changed_cb(self, widget, param): self._set_progress(widget.get_progress()) def _set_status(self, status): self._set_loading(status < WebKit.LoadStatus.FINISHED) def _set_security_status(self, security_status): # Display security status as a lock icon in the left side of # the URL entry. if security_status is None: self.entry.set_icon_from_pixbuf(iconentry.ICON_ENTRY_PRIMARY, None) elif security_status == Browser.SECURITY_STATUS_SECURE: self.entry.set_icon_from_name(iconentry.ICON_ENTRY_PRIMARY, "channel-secure-symbolic") elif security_status == Browser.SECURITY_STATUS_INSECURE: self.entry.set_icon_from_name(iconentry.ICON_ENTRY_PRIMARY, "channel-insecure-symbolic") def _set_progress(self, progress): if progress == 1.0: self.entry.set_progress_fraction(0.0) else: self.entry.set_progress_fraction(progress) def _set_address(self, uri): if uri is None: self.entry.props.address = "" else: self.entry.props.address = uri def __changed_cb(self, iconentry): # The WebEntry can be changed when we click on a link, then we # have to show the clear icon only if is the user who has # changed the entry if self.entry.has_focus(): if not self.entry.props.text: self._show_no_icon() else: self._show_clear_icon() def __focus_in_event_cb(self, entry, event): if not self._tabbed_view.is_current_page_pdf(): if not self.entry.props.text: self._show_no_icon() else: self._show_clear_icon() def __focus_out_event_cb(self, entry, event): if self._loading: self._show_stop_icon() else: if not self._tabbed_view.is_current_page_pdf(): self._show_reload_icon() def _show_no_icon(self): self.entry.remove_icon(iconentry.ICON_ENTRY_SECONDARY) def _show_stop_icon(self): self.entry.set_icon_from_name(iconentry.ICON_ENTRY_SECONDARY, "entry-stop") def _show_reload_icon(self): self.entry.set_icon_from_name(iconentry.ICON_ENTRY_SECONDARY, "entry-refresh") def _show_clear_icon(self): self.entry.set_icon_from_name(iconentry.ICON_ENTRY_SECONDARY, "entry-cancel") def _update_navigation_buttons(self): can_go_back = self._browser.can_go_back() self._back.props.sensitive = can_go_back can_go_forward = self._browser.can_go_forward() self._forward.props.sensitive = can_go_forward is_webkit_browser = isinstance(self._browser, Browser) self._link_add.props.sensitive = is_webkit_browser self._go_home.props.sensitive = is_webkit_browser if is_webkit_browser: self._reload_session_history() def _entry_activate_cb(self, entry): url = entry.props.text effective_url = self._tabbed_view.normalize_or_autosearch_url(url) self._browser.load_uri(effective_url) self._browser.loading_uri = effective_url self.entry.props.address = effective_url self._browser.grab_focus() def _go_home_cb(self, button): self.emit("go-home") def _go_library_cb(self, button): self.emit("go-library") def _set_home_cb(self, button): self._reset_home_menu.set_visible(True) self.emit("set-home") def _reset_home_cb(self, button): self._reset_home_menu.set_visible(False) self.emit("reset-home") def _go_to_JSshell_cb(self, button): self.emit("go-to-JSshell") def _get_shell_input_cb(self, button): self.emit("get-shell-input") def _go_back_cb(self, button): self._browser.go_back() def _go_forward_cb(self, button): self._browser.go_forward() def __uri_changed_cb(self, widget, param): self._set_address(widget.get_uri()) self._update_navigation_buttons() filepicker.cleanup_temp_files() def _stop_and_reload_cb(self, entry, icon_pos, button): if entry.has_focus() and not self._tabbed_view.is_current_page_pdf(): entry.set_text("") else: if self._loading: self._browser.stop_loading() else: self._browser.reload() def _set_loading(self, loading): self._loading = loading if self._loading: self._show_stop_icon() else: if not self._tabbed_view.is_current_page_pdf(): self.set_sensitive(True) self._show_reload_icon() else: self.set_sensitive(False) self._show_no_icon() def _reload_session_history(self): back_forward_list = self._browser.get_back_forward_list() item_index = 0 # The index of the history item # Clear menus in palettes: for box_menu in (self._back_box_menu, self._forward_box_menu): for menu_item in box_menu.get_children(): box_menu.remove(menu_item) def create_menu_item(history_item, item_index): """Create a MenuItem for the back or forward palettes.""" title = history_item.get_title() if not isinstance(title, unicode): title = unicode(title, "utf-8") # This is a fix until the Sugar MenuItem is fixed: menu_item = PaletteMenuItem(text_label=title) menu_item.connect("activate", self._history_item_activated_cb, item_index) return menu_item back_list = back_forward_list.get_back_list_with_limit(_MAX_HISTORY_ENTRIES) back_list.reverse() for item in back_list: menu_item = create_menu_item(item, item_index) self._back_box_menu.pack_end(menu_item, False, False, 0) menu_item.show() item_index += 1 # Increment the item index to count the current page: item_index += 1 forward_list = back_forward_list.get_forward_list_with_limit(_MAX_HISTORY_ENTRIES) forward_list.reverse() for item in forward_list: menu_item = create_menu_item(item, item_index) self._forward_box_menu.pack_start(menu_item, False, False, 0) menu_item.show() item_index += 1 def _history_item_activated_cb(self, menu_item, index): self._back.get_palette().popdown(immediate=True) self._forward.get_palette().popdown(immediate=True) self._browser.set_history_index(index) def _link_add_clicked_cb(self, button): self.emit("add-link") def save_as_pdf(self, widget): tmp_dir = os.path.join(self._activity.get_activity_root(), "tmp") fd, file_path = tempfile.mkstemp(dir=tmp_dir) os.close(fd) page = self._canvas.get_current_page() webview = self._canvas.get_children()[page].get_children()[0] operation = Gtk.PrintOperation.new() operation.set_export_filename(file_path) webview.get_main_frame().print_full(operation, Gtk.PrintOperationAction.EXPORT) client = GConf.Client.get_default() jobject = datastore.create() color = client.get_string("/desktop/sugar/user/color") try: jobject.metadata["title"] = _("Browse activity as PDF") jobject.metadata["icon-color"] = color jobject.metadata["mime_type"] = "application/pdf" jobject.file_path = file_path datastore.write(jobject) finally: self.__pdf_alert(jobject.object_id) jobject.destroy() del jobject def __pdf_alert(self, object_id): alert = Alert() alert.props.title = _("Page saved") alert.props.msg = _("The page has been saved as PDF to journal") alert.add_button(Gtk.ResponseType.APPLY, _("Show in Journal"), Icon(icon_name="zoom-activity")) alert.add_button(Gtk.ResponseType.OK, _("Ok"), Icon(icon_name="dialog-ok")) # Remove other alerts for alert in self._activity._alerts: self._activity.remove_alert(alert) self._activity.add_alert(alert) alert.connect("response", self.__pdf_response_alert, object_id) alert.show_all() def __pdf_response_alert(self, alert, response_id, object_id): if response_id is Gtk.ResponseType.APPLY: activity.show_object_in_journal(object_id) self._activity.remove_alert(alert)
def __init__(self, tabbed_view, act): ToolbarBase.__init__(self) self._url_toolbar = UrlToolbar() self._activity = act self.model = act.model self.model.link_removed_signal.connect(self.__link_removed_cb) self._tabbed_view = self._canvas = tabbed_view self._loading = False self._download_running_hid = None toolbar = self.toolbar activity_button = ActivityToolbarButton(self._activity) toolbar.insert(activity_button, 0) separator = Gtk.SeparatorToolItem() ''' Disabled since the python gi bindings don't expose the critical WebKit2.PrintOperation.print function save_as_pdf = ToolButton('save-as-pdf') save_as_pdf.set_tooltip(_('Save page as pdf')) save_as_pdf.connect('clicked', self.save_as_pdf) activity_button.props.page.insert(separator, -1) activity_button.props.page.insert(save_as_pdf, -1) separator.show() save_as_pdf.show() ''' inspect_view = ToolButton('emblem-view-source') inspect_view.set_tooltip(_('Show Web Inspector')) inspect_view.connect('clicked', self.inspect_view) activity_button.props.page.insert(separator, -1) activity_button.props.page.insert(inspect_view, -1) separator.show() inspect_view.show() self._go_home = ToolButton('go-home') self._go_home.set_tooltip(_('Home page')) self._go_home.connect('clicked', self._go_home_cb) # add a menu to save the home page menu_box = PaletteMenuBox() self._go_home.props.palette.set_content(menu_box) menu_item = PaletteMenuItem() menu_item.set_label(_('Select as initial page')) menu_item.connect('activate', self._set_home_cb) menu_box.append_item(menu_item) self._reset_home_menu = PaletteMenuItem() self._reset_home_menu.set_label(_('Reset initial page')) self._reset_home_menu.connect('activate', self._reset_home_cb) menu_box.append_item(self._reset_home_menu) if os.path.isfile(LIBRARY_PATH): library_menu = PaletteMenuItem() library_menu.set_label(_('Library')) library_menu.connect('activate', self._go_library_cb) menu_box.append_item(library_menu) menu_box.show_all() # verify if the home page is configured client = GConf.Client.get_default() self._reset_home_menu.set_visible( client.get_string(HOME_PAGE_GCONF_KEY) is not None) toolbar.insert(self._go_home, -1) self._go_home.show() self.entry = WebEntry() self.entry.set_icon_from_name(iconentry.ICON_ENTRY_SECONDARY, 'entry-stop') self.entry.connect('icon-press', self._stop_and_reload_cb) self.entry.connect('activate', self._entry_activate_cb) self.entry.connect('focus-in-event', self.__focus_in_event_cb) self.entry.connect('focus-out-event', self.__focus_out_event_cb) self.entry.connect('key-press-event', self.__key_press_event_cb) self.entry.connect('changed', self.__changed_cb) # In an event box so that it can render the background entry_box = Gtk.EventBox() entry_box.add(self.entry) entry_box.show() self._entry_item = Gtk.ToolItem() self._entry_item.set_expand(True) self._entry_item.add(entry_box) self.entry.show() toolbar.insert(self._entry_item, -1) self._entry_item.show() self._back = ToolButton('go-previous-paired', accelerator='<ctrl>Left') self._back.set_tooltip(_('Back')) self._back.props.sensitive = False self._back.connect('clicked', self._go_back_cb) toolbar.insert(self._back, -1) self._back.show() palette = self._back.get_palette() self._back_box_menu = Gtk.VBox() self._back_box_menu.show() palette.set_content(self._back_box_menu) # FIXME, this is a hack, should be done in the theme: palette._content.set_border_width(1) self._forward = ToolButton('go-next-paired', accelerator='<ctrl>Right') self._forward.set_tooltip(_('Forward')) self._forward.props.sensitive = False self._forward.connect('clicked', self._go_forward_cb) toolbar.insert(self._forward, -1) self._forward.show() palette = self._forward.get_palette() self._forward_box_menu = Gtk.VBox() self._forward_box_menu.show() palette.set_content(self._forward_box_menu) # FIXME, this is a hack, should be done in the theme: palette._content.set_border_width(1) self._download_icon = ProgressToolButton( icon_name='emblem-downloads', tooltip=_('No Downloads Running')) toolbar.insert(self._download_icon, -1) self._download_icon.show() downloadmanager.connect_download_started(self.__download_started_cb) self._link_add = ToggleToolButton('emblem-favorite') self._link_add.set_accelerator('<ctrl>d') self._link_add.set_tooltip(_('Bookmark')) self._link_add_toggled_hid = \ self._link_add.connect('toggled', self.__link_add_toggled_cb) toolbar.insert(self._link_add, -1) self._link_add.show() self._toolbar_separator = Gtk.SeparatorToolItem() self._toolbar_separator.props.draw = False self._toolbar_separator.set_expand(True) self._stop_button = StopButton(self._activity) toolbar.insert(self._stop_button, -1) self._progress_listener = None self._browser = None self._loading_changed_hid = None self._progress_changed_hid = None self._session_history_changed_hid = None self._uri_changed_hid = None self._load_changed_hid = None self._security_status_changed_hid = None if tabbed_view.get_n_pages(): self._connect_to_browser(tabbed_view.props.current_browser) tabbed_view.connect_after('switch-page', self.__switch_page_cb) tabbed_view.connect_after('page-added', self.__page_added_cb) Gdk.Screen.get_default().connect('size-changed', self.__screen_size_changed_cb) self._configure_toolbar()
def __init__(self, tabbed_view, act): ToolbarBase.__init__(self) self._url_toolbar = UrlToolbar() self._activity = act self._tabbed_view = self._canvas = tabbed_view self._loading = False toolbar = self.toolbar activity_button = ActivityToolbarButton(self._activity) toolbar.insert(activity_button, 0) separator = Gtk.SeparatorToolItem() save_as_pdf = ToolButton("save-as-pdf") save_as_pdf.set_tooltip(_("Save page as pdf")) save_as_pdf.connect("clicked", self.save_as_pdf) activity_button.props.page.insert(separator, -1) activity_button.props.page.insert(save_as_pdf, -1) separator.show() save_as_pdf.show() self._go_home = ToolButton("go-home") self._go_home.set_tooltip(_("Home page")) self._go_home.connect("clicked", self._go_home_cb) # add a menu to save the home page menu_box = PaletteMenuBox() self._go_home.props.palette.set_content(menu_box) menu_item = PaletteMenuItem() menu_item.set_label(_("Select as initial page")) menu_item.connect("activate", self._set_home_cb) menu_box.append_item(menu_item) self._reset_home_menu = PaletteMenuItem() self._reset_home_menu.set_label(_("Reset initial page")) self._reset_home_menu.connect("activate", self._reset_home_cb) menu_box.append_item(self._reset_home_menu) if os.path.isfile(LIBRARY_PATH): library_menu = PaletteMenuItem() library_menu.set_label(_("Library")) library_menu.connect("activate", self._go_library_cb) menu_box.append_item(library_menu) menu_box.show_all() # verify if the home page is configured client = GConf.Client.get_default() self._reset_home_menu.set_visible(client.get_string(HOME_PAGE_GCONF_KEY) is not None) toolbar.insert(self._go_home, -1) self._go_home.show() self.entry = WebEntry() self.entry.set_icon_from_name(iconentry.ICON_ENTRY_SECONDARY, "entry-stop") self.entry.connect("icon-press", self._stop_and_reload_cb) self.entry.connect("activate", self._entry_activate_cb) self.entry.connect("focus-in-event", self.__focus_in_event_cb) self.entry.connect("focus-out-event", self.__focus_out_event_cb) self.entry.connect("key-press-event", self.__key_press_event_cb) self.entry.connect("changed", self.__changed_cb) self._entry_item = Gtk.ToolItem() self._entry_item.set_expand(True) self._entry_item.add(self.entry) self.entry.show() toolbar.insert(self._entry_item, -1) self._entry_item.show() self._back = ToolButton("go-previous-paired") self._back.set_tooltip(_("Back")) self._back.props.sensitive = False self._back.connect("clicked", self._go_back_cb) toolbar.insert(self._back, -1) self._back.show() palette = self._back.get_palette() self._back_box_menu = Gtk.VBox() self._back_box_menu.show() palette.set_content(self._back_box_menu) # FIXME, this is a hack, should be done in the theme: palette._content.set_border_width(1) self._forward = ToolButton("go-next-paired") self._forward.set_tooltip(_("Forward")) self._forward.props.sensitive = False self._forward.connect("clicked", self._go_forward_cb) toolbar.insert(self._forward, -1) self._forward.show() palette = self._forward.get_palette() self._forward_box_menu = Gtk.VBox() self._forward_box_menu.show() palette.set_content(self._forward_box_menu) # FIXME, this is a hack, should be done in the theme: palette._content.set_border_width(1) self._link_add = ToolButton("emblem-favorite") self._link_add.set_tooltip(_("Bookmark")) self._link_add.connect("clicked", self._link_add_clicked_cb) toolbar.insert(self._link_add, -1) self._link_add.show() self._toolbar_separator = Gtk.SeparatorToolItem() self._toolbar_separator.props.draw = False self._toolbar_separator.set_expand(True) self._go_to_JSshell = ToolButton("go-to-JSshell") self._go_to_JSshell.set_tooltip(_("Go to Interactive Javascript Shell")) self._go_to_JSshell.connect("clicked", self._go_to_JSshell_cb) # adding a button for the Interactive Javascript shell toolbar.insert(self._go_to_JSshell, -1) self._go_to_JSshell.show() self._get_shell_input = ToolButton("get-shell-input") self._get_shell_input.set_tooltip(_("Get Interactive Javascript Shell Input")) self._get_shell_input.connect("clicked", self._get_shell_input_cb) # adding a button for the Interactive Javascript shell toolbar.insert(self._get_shell_input, -1) self._get_shell_input.show() stop_button = StopButton(self._activity) toolbar.insert(stop_button, -1) self._progress_listener = None self._browser = None self._loading_changed_hid = None self._progress_changed_hid = None self._session_history_changed_hid = None self._uri_changed_hid = None self._security_status_changed_hid = None if tabbed_view.get_n_pages(): self._connect_to_browser(tabbed_view.props.current_browser) tabbed_view.connect_after("switch-page", self.__switch_page_cb) tabbed_view.connect_after("page-added", self.__page_added_cb) Gdk.Screen.get_default().connect("size-changed", self.__screen_size_changed_cb) self._configure_toolbar()
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
def __init__(self, pc, toolbar_box): GObject.GObject.__init__(self) self._abiword_canvas = pc.abiword_canvas copy = CopyButton() copy.props.accelerator = '<Ctrl>C' copy.connect('clicked', lambda button: pc.abiword_canvas.copy()) self.insert(copy, -1) copy.show() paste = PasteButton() paste.props.accelerator = '<Ctrl>V' paste.connect('clicked', self.__paste_button_cb) self.insert(paste, -1) paste.show() menu_box = PaletteMenuBox() paste.props.palette.set_content(menu_box) menu_box.show() menu_item = PaletteMenuItem() menu_item.set_label(_('Paste unformatted')) menu_item.connect('activate', self.__paste_special_button_cb) menu_box.append_item(menu_item) separator = Gtk.SeparatorToolItem() self.insert(separator, -1) separator.show() undo = UndoButton(sensitive=True) undo.connect('clicked', lambda button: pc.abiword_canvas.undo()) pc.abiword_canvas.connect( "can-undo", lambda abi, can_undo: undo.set_sensitive(can_undo)) self.insert(undo, -1) undo.show() redo = RedoButton(sensitive=True) redo.connect('clicked', lambda button: pc.abiword_canvas.redo()) pc.abiword_canvas.connect( "can-redo", lambda abi, can_redo: redo.set_sensitive(can_redo)) self.insert(redo, -1) redo.show() pc.abiword_canvas.connect('text-selected', lambda abi, b: copy.set_sensitive(True)) pc.abiword_canvas.connect('image-selected', lambda abi, b: copy.set_sensitive(True)) pc.abiword_canvas.connect('selection-cleared', lambda abi, b: copy.set_sensitive(False)) separator = Gtk.SeparatorToolItem() self.insert(separator, -1) separator.show() search_label = Gtk.Label(label=_("Search") + ": ") search_label.show() search_item_page_label = Gtk.ToolItem() search_item_page_label.add(search_label) self.insert(search_item_page_label, -1) search_item_page_label.show() # setup the search options self._search_entry = iconentry.IconEntry() self._search_entry.set_icon_from_name(iconentry.ICON_ENTRY_PRIMARY, 'system-search') self._search_entry.connect('activate', self._search_entry_activated_cb) self._search_entry.connect('changed', self._search_entry_changed_cb) self._search_entry.add_clear_button() self._add_widget(self._search_entry, expand=True) self._findprev = ToolButton('go-previous-paired') self._findprev.set_tooltip(_('Find previous')) self.insert(self._findprev, -1) self._findprev.show() self._findprev.connect('clicked', self._findprev_cb) self._findnext = ToolButton('go-next-paired') self._findnext.set_tooltip(_('Find next')) self.insert(self._findnext, -1) self._findnext.show() self._findnext.connect('clicked', self._findnext_cb) # set the initial state of the search controls # note: we won't simple call self._search_entry_changed_cb # here, as that will call into the abiword_canvas, which # is not mapped on screen here, causing the set_find_string # call to fail self._findprev.set_sensitive(False) self._findnext.set_sensitive(False)
class PrimaryToolbar(ToolbarBase): __gtype_name__ = 'PrimaryToolbar' __gsignals__ = { 'add-link': (GObject.SignalFlags.RUN_FIRST, None, ([])), 'remove-link': (GObject.SignalFlags.RUN_FIRST, None, ([])), 'go-home': (GObject.SignalFlags.RUN_FIRST, None, ([])), 'set-home': (GObject.SignalFlags.RUN_FIRST, None, ([])), 'reset-home': (GObject.SignalFlags.RUN_FIRST, None, ([])), 'go-library': (GObject.SignalFlags.RUN_FIRST, None, ([])), } def __init__(self, tabbed_view, act): ToolbarBase.__init__(self) self._url_toolbar = UrlToolbar() self._activity = act self.model = act.model self.model.link_removed_signal.connect(self.__link_removed_cb) self._tabbed_view = self._canvas = tabbed_view self._loading = False self._download_running_hid = None toolbar = self.toolbar activity_button = ActivityToolbarButton(self._activity) toolbar.insert(activity_button, 0) separator = Gtk.SeparatorToolItem() ''' Disabled since the python gi bindings don't expose the critical WebKit2.PrintOperation.print function save_as_pdf = ToolButton('save-as-pdf') save_as_pdf.set_tooltip(_('Save page as pdf')) save_as_pdf.connect('clicked', self.save_as_pdf) activity_button.props.page.insert(separator, -1) activity_button.props.page.insert(save_as_pdf, -1) separator.show() save_as_pdf.show() ''' inspect_view = ToolButton('emblem-view-source') inspect_view.set_tooltip(_('Show Web Inspector')) inspect_view.connect('clicked', self.inspect_view) activity_button.props.page.insert(separator, -1) activity_button.props.page.insert(inspect_view, -1) separator.show() inspect_view.show() self._go_home = ToolButton('go-home') self._go_home.set_tooltip(_('Home page')) self._go_home.connect('clicked', self._go_home_cb) # add a menu to save the home page menu_box = PaletteMenuBox() self._go_home.props.palette.set_content(menu_box) menu_item = PaletteMenuItem() menu_item.set_label(_('Select as initial page')) menu_item.connect('activate', self._set_home_cb) menu_box.append_item(menu_item) self._reset_home_menu = PaletteMenuItem() self._reset_home_menu.set_label(_('Reset initial page')) self._reset_home_menu.connect('activate', self._reset_home_cb) menu_box.append_item(self._reset_home_menu) if os.path.isfile(LIBRARY_PATH): library_menu = PaletteMenuItem() library_menu.set_label(_('Library')) library_menu.connect('activate', self._go_library_cb) menu_box.append_item(library_menu) menu_box.show_all() # verify if the home page is configured client = GConf.Client.get_default() self._reset_home_menu.set_visible( client.get_string(HOME_PAGE_GCONF_KEY) is not None) toolbar.insert(self._go_home, -1) self._go_home.show() self.entry = WebEntry() self.entry.set_icon_from_name(iconentry.ICON_ENTRY_SECONDARY, 'entry-stop') self.entry.connect('icon-press', self._stop_and_reload_cb) self.entry.connect('activate', self._entry_activate_cb) self.entry.connect('focus-in-event', self.__focus_in_event_cb) self.entry.connect('focus-out-event', self.__focus_out_event_cb) self.entry.connect('key-press-event', self.__key_press_event_cb) self.entry.connect('changed', self.__changed_cb) # In an event box so that it can render the background entry_box = Gtk.EventBox() entry_box.add(self.entry) entry_box.show() self._entry_item = Gtk.ToolItem() self._entry_item.set_expand(True) self._entry_item.add(entry_box) self.entry.show() toolbar.insert(self._entry_item, -1) self._entry_item.show() self._back = ToolButton('go-previous-paired', accelerator='<ctrl>Left') self._back.set_tooltip(_('Back')) self._back.props.sensitive = False self._back.connect('clicked', self._go_back_cb) toolbar.insert(self._back, -1) self._back.show() palette = self._back.get_palette() self._back_box_menu = Gtk.VBox() self._back_box_menu.show() palette.set_content(self._back_box_menu) # FIXME, this is a hack, should be done in the theme: palette._content.set_border_width(1) self._forward = ToolButton('go-next-paired', accelerator='<ctrl>Right') self._forward.set_tooltip(_('Forward')) self._forward.props.sensitive = False self._forward.connect('clicked', self._go_forward_cb) toolbar.insert(self._forward, -1) self._forward.show() palette = self._forward.get_palette() self._forward_box_menu = Gtk.VBox() self._forward_box_menu.show() palette.set_content(self._forward_box_menu) # FIXME, this is a hack, should be done in the theme: palette._content.set_border_width(1) self._download_icon = ProgressToolButton( icon_name='emblem-downloads', tooltip=_('No Downloads Running')) toolbar.insert(self._download_icon, -1) self._download_icon.show() downloadmanager.connect_download_started(self.__download_started_cb) self._link_add = ToggleToolButton('emblem-favorite') self._link_add.set_accelerator('<ctrl>d') self._link_add.set_tooltip(_('Bookmark')) self._link_add_toggled_hid = \ self._link_add.connect('toggled', self.__link_add_toggled_cb) toolbar.insert(self._link_add, -1) self._link_add.show() self._toolbar_separator = Gtk.SeparatorToolItem() self._toolbar_separator.props.draw = False self._toolbar_separator.set_expand(True) self._stop_button = StopButton(self._activity) toolbar.insert(self._stop_button, -1) self._progress_listener = None self._browser = None self._loading_changed_hid = None self._progress_changed_hid = None self._session_history_changed_hid = None self._uri_changed_hid = None self._load_changed_hid = None self._security_status_changed_hid = None if tabbed_view.get_n_pages(): self._connect_to_browser(tabbed_view.props.current_browser) tabbed_view.connect_after('switch-page', self.__switch_page_cb) tabbed_view.connect_after('page-added', self.__page_added_cb) Gdk.Screen.get_default().connect('size-changed', self.__screen_size_changed_cb) self._configure_toolbar() def __download_started_cb(self): if self._download_running_hid is None: self._download_running_hid = GLib.timeout_add( 80, self.__download_running_cb) def __download_running_cb(self): progress = downloadmanager.overall_downloads_progress() self._download_icon.update(progress) if downloadmanager.num_downloads() > 0: self._download_icon.props.tooltip = \ _('{}% Downloaded').format(int(progress*100)) return True else: self._download_running_hid = None self._download_icon.props.tooltip = _('No Downloads Running') return False def __key_press_event_cb(self, entry, event): self._tabbed_view.current_browser.loading_uri = entry.props.text def __switch_page_cb(self, tabbed_view, page, page_num): if tabbed_view.get_n_pages(): self._connect_to_browser(tabbed_view.props.current_browser) def __page_added_cb(self, notebook, child, pagenum): self.entry._search_popdown() def _configure_toolbar(self, screen=None): # Adapt the toolbars for portrait or landscape mode. if screen is None: screen = Gdk.Screen.get_default() if screen.get_width() < screen.get_height(): if self._entry_item in self._url_toolbar.toolbar.get_children(): return self.toolbar.remove(self._entry_item) self._url_toolbar.toolbar.insert(self._entry_item, -1) separator_pos = len(self.toolbar.get_children()) - 1 self.toolbar.insert(self._toolbar_separator, separator_pos) self._toolbar_separator.show() self.pack_end(self._url_toolbar, True, True, 0) self._url_toolbar.show() else: if self._entry_item in self.toolbar.get_children(): return self.toolbar.remove(self._toolbar_separator) position = len(self.toolbar.get_children()) - 4 self._url_toolbar.toolbar.remove(self._entry_item) self.toolbar.insert(self._entry_item, position) self._toolbar_separator.hide() self.remove(self._url_toolbar) def __screen_size_changed_cb(self, screen): self._configure_toolbar(screen) def _connect_to_browser(self, browser): if self._browser is not None: self._browser.disconnect(self._uri_changed_hid) self._browser.disconnect(self._load_changed_hid) self._browser.disconnect(self._progress_changed_hid) self._browser.disconnect(self._security_status_changed_hid) self._browser = browser if not isinstance(self._browser, DummyBrowser): address = self._browser.props.uri or self._browser.loading_uri else: address = self._browser.props.uri self._set_address(address) self._set_progress(self._browser.props.estimated_load_progress) self._set_loading(self._browser.props.estimated_load_progress < 1.0) self._set_security_status(self._browser.security_status) is_webkit_browser = isinstance(self._browser, Browser) self.entry.props.editable = is_webkit_browser self._uri_changed_hid = self._browser.connect( 'notify::uri', self.__uri_changed_cb) self._load_changed_hid = self._browser.connect( 'load-changed', self.__load_changed_cb) self._progress_changed_hid = self._browser.connect( 'notify::estimated-load-progress', self.__progress_changed_cb) self._security_status_changed_hid = self._browser.connect( 'security-status-changed', self.__security_status_changed_cb) self._update_navigation_buttons() def __security_status_changed_cb(self, widget): self._set_security_status(widget.security_status) def __progress_changed_cb(self, widget, param): self._set_progress(widget.props.estimated_load_progress) self._set_loading(widget.props.estimated_load_progress < 1.0) def _set_security_status(self, security_status): # Display security status as a lock icon in the left side of # the URL entry. if security_status is None: self.entry.set_icon_from_pixbuf( iconentry.ICON_ENTRY_PRIMARY, None) elif security_status == Browser.SECURITY_STATUS_SECURE: self.entry.set_icon_from_name( iconentry.ICON_ENTRY_PRIMARY, 'channel-secure-symbolic') elif security_status == Browser.SECURITY_STATUS_INSECURE: self.entry.set_icon_from_name( iconentry.ICON_ENTRY_PRIMARY, 'channel-insecure-symbolic') def _set_progress(self, progress): if progress == 1.0: self.entry.set_progress_fraction(0.0) else: self.entry.set_progress_fraction(progress) def _set_address(self, uri): if uri is None: self.entry.props.address = '' else: self.entry.props.address = uri def __changed_cb(self, iconentry): # The WebEntry can be changed when we click on a link, then we # have to show the clear icon only if is the user who has # changed the entry if self.entry.has_focus(): if not self.entry.props.text: self._show_no_icon() else: self._show_clear_icon() def __focus_in_event_cb(self, entry, event): if not self._tabbed_view.is_current_page_pdf(): if not self.entry.props.text: self._show_no_icon() else: self._show_clear_icon() def __focus_out_event_cb(self, entry, event): if self._loading: self._show_stop_icon() else: if not self._tabbed_view.is_current_page_pdf(): self._show_reload_icon() def _show_no_icon(self): self.entry.remove_icon(iconentry.ICON_ENTRY_SECONDARY) def _show_stop_icon(self): self.entry.set_icon_from_name(iconentry.ICON_ENTRY_SECONDARY, 'entry-stop') def _show_reload_icon(self): self.entry.set_icon_from_name(iconentry.ICON_ENTRY_SECONDARY, 'entry-refresh') def _show_clear_icon(self): self.entry.set_icon_from_name(iconentry.ICON_ENTRY_SECONDARY, 'entry-cancel') def _update_navigation_buttons(self): can_go_back = self._browser.can_go_back() self._back.props.sensitive = can_go_back can_go_forward = self._browser.can_go_forward() self._forward.props.sensitive = can_go_forward is_webkit_browser = isinstance(self._browser, Browser) self._go_home.props.sensitive = is_webkit_browser if is_webkit_browser: self._reload_session_history() with self._link_add.handler_block(self._link_add_toggled_hid): uri = self._browser.get_uri() self._link_add.props.active = self.model.has_link(uri) def __link_removed_cb(self, model): self._update_navigation_buttons() def _entry_activate_cb(self, entry): url = entry.props.text effective_url = self._tabbed_view.normalize_or_autosearch_url(url) self._browser.load_uri(effective_url) self._browser.loading_uri = effective_url self.entry.props.address = effective_url self._browser.grab_focus() def _go_home_cb(self, button): self.emit('go-home') def _go_library_cb(self, button): self.emit('go-library') def _set_home_cb(self, button): self._reset_home_menu.set_visible(True) self.emit('set-home') def _reset_home_cb(self, button): self._reset_home_menu.set_visible(False) self.emit('reset-home') def _go_back_cb(self, button): self._browser.go_back() def _go_forward_cb(self, button): self._browser.go_forward() def __uri_changed_cb(self, widget, param): self._set_address(widget.get_uri()) self._update_navigation_buttons() filepicker.cleanup_temp_files() def __load_changed_cb(self, widget, event): self._update_navigation_buttons() def _stop_and_reload_cb(self, entry, icon_pos, button): if entry.has_focus() and \ not self._tabbed_view.is_current_page_pdf(): entry.set_text('') else: if self._loading: self._browser.stop_loading() else: self._browser.reload() def _set_loading(self, loading): self._loading = loading if self._loading: self._show_stop_icon() else: if not self._tabbed_view.is_current_page_pdf(): self._set_sensitive(True) self._show_reload_icon() else: self._set_sensitive(False) self._show_no_icon() def _set_sensitive(self, value): for widget in self.toolbar: if widget not in (self._stop_button, self._link_add): widget.set_sensitive(value) def _reload_session_history(self): back_forward_list = self._browser.get_back_forward_list() item_index = 0 # The index of the history item # Clear menus in palettes: for box_menu in (self._back_box_menu, self._forward_box_menu): for menu_item in box_menu.get_children(): box_menu.remove(menu_item) def create_menu_item(history_item): """Create a MenuItem for the back or forward palettes.""" title = history_item.get_title() or _('No Title') if not isinstance(title, unicode): title = unicode(title, 'utf-8') # This is a fix until the Sugar MenuItem is fixed: menu_item = PaletteMenuItem(text_label=title) menu_item.connect('activate', self._history_item_activated_cb, history_item) return menu_item back_list = back_forward_list.get_back_list_with_limit( _MAX_HISTORY_ENTRIES) back_list.reverse() for item in back_list: menu_item = create_menu_item(item) self._back_box_menu.pack_end(menu_item, False, False, 0) menu_item.show() item_index += 1 # Increment the item index to count the current page: item_index += 1 forward_list = back_forward_list.get_forward_list_with_limit( _MAX_HISTORY_ENTRIES) forward_list.reverse() for item in forward_list: menu_item = create_menu_item(item) self._forward_box_menu.pack_start(menu_item, False, False, 0) menu_item.show() item_index += 1 def _history_item_activated_cb(self, menu_item, history_item): self._back.get_palette().popdown(immediate=True) self._forward.get_palette().popdown(immediate=True) # self._browser.set_history_index(index) self._browser.go_to_back_forward_list_item(history_item) def __link_add_toggled_cb(self, button): if button.props.active: self.emit('add-link') else: self.emit('remove-link') def inspect_view(self, button): page = self._canvas.get_current_page() webview = self._canvas.get_children()[page].props.browser # If get_inspector returns None, it is not a real WebView inspector = webview.get_inspector() if inspector is not None: # Inspector window will be blank if disabled web_settings = webview.get_settings() web_settings.props.enable_developer_extras = True inspector.show() inspector.attach() '''
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()
def __init__(self, tabbed_view, act): ToolbarBase.__init__(self) self._url_toolbar = UrlToolbar() self._activity = act self._tabbed_view = self._canvas = tabbed_view self._loading = False toolbar = self.toolbar activity_button = ActivityToolbarButton(self._activity) toolbar.insert(activity_button, 0) separator = Gtk.SeparatorToolItem() save_as_pdf = ToolButton('save-as-pdf') save_as_pdf.set_tooltip(_('Save page as pdf')) save_as_pdf.connect('clicked', self.save_as_pdf) activity_button.props.page.insert(separator, -1) activity_button.props.page.insert(save_as_pdf, -1) separator.show() save_as_pdf.show() self._go_home = ToolButton('go-home') self._go_home.set_tooltip(_('Home page')) self._go_home.connect('clicked', self._go_home_cb) # add a menu to save the home page menu_box = PaletteMenuBox() self._go_home.props.palette.set_content(menu_box) menu_item = PaletteMenuItem() menu_item.set_label(_('Select as initial page')) menu_item.connect('activate', self._set_home_cb) menu_box.append_item(menu_item) self._reset_home_menu = PaletteMenuItem() self._reset_home_menu.set_label(_('Reset initial page')) self._reset_home_menu.connect('activate', self._reset_home_cb) menu_box.append_item(self._reset_home_menu) if os.path.isfile(LIBRARY_PATH): library_menu = PaletteMenuItem() library_menu.set_label(_('Library')) library_menu.connect('activate', self._go_library_cb) menu_box.append_item(library_menu) menu_box.show_all() # verify if the home page is configured client = GConf.Client.get_default() self._reset_home_menu.set_visible( client.get_string(HOME_PAGE_GCONF_KEY) is not None) toolbar.insert(self._go_home, -1) self._go_home.show() self.entry = WebEntry() self.entry.set_icon_from_name(iconentry.ICON_ENTRY_SECONDARY, 'entry-stop') self.entry.connect('icon-press', self._stop_and_reload_cb) self.entry.connect('activate', self._entry_activate_cb) self.entry.connect('focus-in-event', self.__focus_in_event_cb) self.entry.connect('focus-out-event', self.__focus_out_event_cb) self.entry.connect('key-press-event', self.__key_press_event_cb) self.entry.connect('changed', self.__changed_cb) self._entry_item = Gtk.ToolItem() self._entry_item.set_expand(True) self._entry_item.add(self.entry) self.entry.show() toolbar.insert(self._entry_item, -1) self._entry_item.show() self._back = ToolButton('go-previous-paired') self._back.set_tooltip(_('Back')) self._back.props.sensitive = False self._back.connect('clicked', self._go_back_cb) toolbar.insert(self._back, -1) self._back.show() palette = self._back.get_palette() self._back_box_menu = Gtk.VBox() self._back_box_menu.show() palette.set_content(self._back_box_menu) # FIXME, this is a hack, should be done in the theme: palette._content.set_border_width(1) self._forward = ToolButton('go-next-paired') self._forward.set_tooltip(_('Forward')) self._forward.props.sensitive = False self._forward.connect('clicked', self._go_forward_cb) toolbar.insert(self._forward, -1) self._forward.show() palette = self._forward.get_palette() self._forward_box_menu = Gtk.VBox() self._forward_box_menu.show() palette.set_content(self._forward_box_menu) # FIXME, this is a hack, should be done in the theme: palette._content.set_border_width(1) # Downloads ProgressIcon self._download_icon = ProgressToolButton('emblem-downloads', style.STANDARD_ICON_SIZE, 'vertical') self._download_icon.set_tooltip(_('Downloads')) self._download_icon.props.sensitive = False down_id = GObject.timeout_add(500, self.__download_running_cb) toolbar.insert(self._download_icon, -1) self._download_icon.show() self._link_add = ToolButton('emblem-favorite') self._link_add.set_tooltip(_('Bookmark')) self._link_add.connect('clicked', self._link_add_clicked_cb) toolbar.insert(self._link_add, -1) self._link_add.show() self._toolbar_separator = Gtk.SeparatorToolItem() self._toolbar_separator.props.draw = False self._toolbar_separator.set_expand(True) # Adds an options-toolbar button to the main-toolbar self._options_toolbar = OptionsToolbar(self._activity) self._options_toolbar_button = ToolbarButton( page=self._options_toolbar, icon_name='options') toolbar.insert(self._options_toolbar_button, -1) stop_button = StopButton(self._activity) toolbar.insert(stop_button, -1) self._progress_listener = None self._browser = None self._loading_changed_hid = None self._progress_changed_hid = None self._session_history_changed_hid = None self._uri_changed_hid = None self._security_status_changed_hid = None if tabbed_view.get_n_pages(): self._connect_to_browser(tabbed_view.props.current_browser) tabbed_view.connect_after('switch-page', self.__switch_page_cb) tabbed_view.connect_after('page-added', self.__page_added_cb) Gdk.Screen.get_default().connect('size-changed', self.__screen_size_changed_cb) self._configure_toolbar()
def __init__(self, tabbed_view, act): ToolbarBase.__init__(self) self._url_toolbar = UrlToolbar() self._activity = act self._tabbed_view = self._canvas = tabbed_view self._loading = False toolbar = self.toolbar activity_button = ActivityToolbarButton(self._activity) toolbar.insert(activity_button, 0) separator = Gtk.SeparatorToolItem() save_as_pdf = ToolButton('save-as-pdf') save_as_pdf.set_tooltip(_('Save page as pdf')) save_as_pdf.connect('clicked', self.save_as_pdf) activity_button.props.page.insert(separator, -1) activity_button.props.page.insert(save_as_pdf, -1) separator.show() save_as_pdf.show() self._go_home = ToolButton('go-home') self._go_home.set_tooltip(_('Home page')) self._go_home.connect('clicked', self._go_home_cb) # add a menu to save the home page menu_box = PaletteMenuBox() self._go_home.props.palette.set_content(menu_box) self._reset_home_menu = PaletteMenuItem() self._reset_home_menu.set_label(_('Reset initial page')) self._reset_home_menu.connect('activate', self._reset_home_cb) menu_box.append_item(self._reset_home_menu) if os.path.isfile(LIBRARY_PATH): library_menu = PaletteMenuItem() library_menu.set_label(_('Library')) library_menu.connect('activate', self._go_library_cb) menu_box.append_item(library_menu) menu_box.show_all() # verify if the home page is configured self._reset_home_menu.set_visible(False) toolbar.insert(self._go_home, -1) self._go_home.show() self.entry = WebEntry() self.entry.set_icon_from_name(iconentry.ICON_ENTRY_SECONDARY, 'entry-stop') self.entry.connect('icon-press', self._stop_and_reload_cb) self.entry.connect('activate', self._entry_activate_cb) self.entry.connect('focus-in-event', self.__focus_in_event_cb) self.entry.connect('focus-out-event', self.__focus_out_event_cb) self.entry.connect('key-press-event', self.__key_press_event_cb) self.entry.connect('changed', self.__changed_cb) self._entry_item = Gtk.ToolItem() self._entry_item.set_expand(True) self._entry_item.add(self.entry) self.entry.show() toolbar.insert(self._entry_item, -1) self._entry_item.show() self._back = ToolButton('go-previous-paired') self._back.set_tooltip(_('Back')) self._back.props.sensitive = False self._back.connect('clicked', self._go_back_cb) toolbar.insert(self._back, -1) self._back.show() palette = self._back.get_palette() self._back_box_menu = Gtk.VBox() self._back_box_menu.show() palette.set_content(self._back_box_menu) # FIXME, this is a hack, should be done in the theme: palette._content.set_border_width(1) self._forward = ToolButton('go-next-paired') self._forward.set_tooltip(_('Forward')) self._forward.props.sensitive = False self._forward.connect('clicked', self._go_forward_cb) toolbar.insert(self._forward, -1) self._forward.show() palette = self._forward.get_palette() self._forward_box_menu = Gtk.VBox() self._forward_box_menu.show() palette.set_content(self._forward_box_menu) # FIXME, this is a hack, should be done in the theme: palette._content.set_border_width(1) self._link_add = ToolButton('emblem-favorite') self._link_add.set_tooltip(_('Bookmark')) self._link_add.connect('clicked', self._link_add_clicked_cb) toolbar.insert(self._link_add, -1) self._link_add.show() self._toolbar_separator = Gtk.SeparatorToolItem() self._toolbar_separator.props.draw = False self._toolbar_separator.set_expand(True) stop_button = StopButton(self._activity) toolbar.insert(stop_button, -1) self._progress_listener = None self._browser = None self._loading_changed_hid = None self._progress_changed_hid = None self._session_history_changed_hid = None self._uri_changed_hid = None self._security_status_changed_hid = None if tabbed_view.get_n_pages(): self._connect_to_browser(tabbed_view.props.current_browser) tabbed_view.connect_after('switch-page', self.__switch_page_cb) tabbed_view.connect_after('page-added', self.__page_added_cb) Gdk.Screen.get_default().connect('size-changed', self.__screen_size_changed_cb) self._configure_toolbar()