class CreateToolbarBuilder(GObject.GObject): __gtype_name__ = 'CreateToolbar' __gsignals__ = { 'create_new_game': (GObject.SignalFlags.RUN_FIRST, None, []), 'create_equal_pairs': (GObject.SignalFlags.RUN_FIRST, None, [GObject.TYPE_PYOBJECT]), } def __init__(self, activity): GObject.GObject.__init__(self) self.activity = activity self.toolbar = self.activity.get_toolbar_box().toolbar self._equal_pairs = ToggleToolButton('pair-non-equals') self._equal_pairs.set_tooltip(_('Match different tiles')) self._equal_pairs.connect('toggled', self._emit_equal_pairs) self.toolbar.insert(self._equal_pairs, -1) self._grouped = ToggleToolButton('grouped_game1') self._grouped.set_tooltip(_('Mixed tiles game')) self._grouped.connect('toggled', self._grouped_cb) self.toolbar.insert(self._grouped, -1) self._clear_button = ToolButton('edit-clear') self._clear_button.set_tooltip(_('Clear all tiles')) self._clear_button.connect('clicked', self._clear_game_bt) self.toolbar.insert(self._clear_button, -1) self.toolbar.show_all() def _add_widget(self, widget, expand=False): tool_item = Gtk.ToolItem() tool_item.set_expand(expand) tool_item.add(widget) widget.show() self.toolbar.insert(tool_item, -1) tool_item.show() def _clear_game_bt(self, button): if self.activity.game.model.is_demo or \ len(self.activity.cardlist.pairs) == 0: self.clear_game() else: alert = Alert() alert.props.title = _('Clear all the tiles from the game?') icon = Icon(icon_name='dialog-ok') alert.add_button(1, _('Clear'), icon) icon = Icon(icon_name='dialog-cancel') alert.add_button(0, _('Do not clear'), icon) alert.connect('response', self._clear_game_alert_cb) self.activity.add_alert(alert) def _clear_game_alert_cb(self, alert, response_id): self.activity.remove_alert(alert) if response_id == 1: self.clear_game() def clear_game(self): self._equal_pairs.set_active(False) self._grouped.set_active(False) self.emit('create_new_game') def update_controls(self, active): self._equal_pairs.set_sensitive(active) self._grouped.set_sensitive(active) self._clear_button.set_sensitive(active) def _emit_equal_pairs(self, widget): if self._equal_pairs.get_active(): self._equal_pairs.set_icon_name('pair-equals') self._equal_pairs.set_tooltip(_('Match identical tiles')) equal_pairs = '1' else: self._equal_pairs.set_icon_name('pair-non-equals') self._equal_pairs.set_tooltip(_('Match different tiles')) equal_pairs = '0' self.emit('create_equal_pairs', self._equal_pairs.get_active()) logging.debug('createtoolbar._emit_equal_pairs') if self.activity.game.model.data['equal_pairs'] != equal_pairs: self.activity.game.model.data['equal_pairs'] = equal_pairs self.activity.game.model.mark_modified() def _grouped_cb(self, widget): if self._grouped.get_active(): self._grouped.set_icon_name('grouped_game2') self._grouped.set_tooltip(_('Grouped tiles game')) divided = '1' else: self._grouped.set_icon_name('grouped_game1') self._grouped.set_tooltip(_('Mixed tiles game')) divided = '0' logging.debug('createtoolbar._grouped_cb') if self.activity.game.model.data['divided'] != divided: self.activity.game.model.data['divided'] = divided self.activity.game.model.mark_modified() def update_create_toolbar(self, widget, game_name, equal_pairs, grouped): self._equal_pairs.set_active(equal_pairs == '1') self._grouped.set_active(grouped == '1')
class EvinceViewer(Gtk.VBox): """PDF viewer with a toolbar overlay for basic navigation and an option to save to Journal. """ __gsignals__ = { 'save-to-journal': (GObject.SignalFlags.RUN_FIRST, None, ([])), 'open-link': (GObject.SignalFlags.RUN_FIRST, None, ([str])), } def __init__(self, uri): GObject.GObject.__init__(self) self._uri = uri # delay Evince import until is needed to improve activity startup time gi.require_version('EvinceDocument', '3.0') gi.require_version('EvinceView', '3.0') from gi.repository import EvinceDocument from gi.repository import EvinceView # Create Evince objects to handle the PDF in the URI: EvinceDocument.init() self._doc = EvinceDocument.Document.factory_get_document(uri) self._view = EvinceView.View() self._model = EvinceView.DocumentModel() self._model.set_document(self._doc) self._view.set_model(self._model) self._EVINCE_MODE_FREE = EvinceView.SizingMode.FREE self._view.connect('external-link', self.__handle_link_cb) self._model.connect('page-changed', self.__page_changed_cb) self._back_page_button = None self._forward_page_button = None self._toolbar_box = self._create_toolbar() self._update_nav_buttons() self._toolbar_box.set_halign(Gtk.Align.FILL) self._toolbar_box.set_valign(Gtk.Align.END) self.pack_end(self._toolbar_box, False, True, 0) self._toolbar_box.show() scrolled_window = Gtk.ScrolledWindow() self.pack_start(scrolled_window, True, True, 0) scrolled_window.show() scrolled_window.add(self._view) self._view.show() def _create_toolbar(self): toolbar_box = ToolbarBox() zoom_out_button = ToolButton('zoom-out') zoom_out_button.set_tooltip(_('Zoom out')) zoom_out_button.connect('clicked', self.__zoom_out_cb) toolbar_box.toolbar.insert(zoom_out_button, -1) zoom_out_button.show() zoom_in_button = ToolButton('zoom-in') zoom_in_button.set_tooltip(_('Zoom in')) zoom_in_button.connect('clicked', self.__zoom_in_cb) toolbar_box.toolbar.insert(zoom_in_button, -1) zoom_in_button.show() zoom_original_button = ToolButton('zoom-original') zoom_original_button.set_tooltip(_('Actual size')) zoom_original_button.connect('clicked', self.__zoom_original_cb) toolbar_box.toolbar.insert(zoom_original_button, -1) zoom_original_button.show() separator = Gtk.SeparatorToolItem() separator.props.draw = True toolbar_box.toolbar.insert(separator, -1) separator.show() self._back_page_button = ToolButton('go-previous-paired') self._back_page_button.set_tooltip(_('Previous page')) self._back_page_button.props.sensitive = False self._back_page_button.connect('clicked', self.__go_back_page_cb) toolbar_box.toolbar.insert(self._back_page_button, -1) self._back_page_button.show() self._forward_page_button = ToolButton('go-next-paired') self._forward_page_button.set_tooltip(_('Next page')) self._forward_page_button.props.sensitive = False self._forward_page_button.connect('clicked', self.__go_forward_page_cb) toolbar_box.toolbar.insert(self._forward_page_button, -1) self._forward_page_button.show() separator = Gtk.SeparatorToolItem() separator.props.draw = True toolbar_box.toolbar.insert(separator, -1) separator.show() self._save_to_journal_button = ToolButton('save-to-journal') self._save_to_journal_button.set_tooltip(_('Save PDF to Journal')) self._save_to_journal_button.connect('clicked', self.__save_to_journal_button_cb) toolbar_box.toolbar.insert(self._save_to_journal_button, -1) self._save_to_journal_button.show() separator = Gtk.SeparatorToolItem() toolbar_box.toolbar.insert(separator, -1) separator.show() self._inverted_colors = ToggleToolButton(icon_name='dark-theme') self._inverted_colors.set_tooltip(_('Inverted Colors')) self._inverted_colors.set_accelerator('<Ctrl>i') self._inverted_colors.connect('toggled', self.__inverted_colors_toggled_cb) toolbar_box.toolbar.insert(self._inverted_colors, -1) self._inverted_colors.show() return toolbar_box def disable_journal_button(self): self._save_to_journal_button.props.sensitive = False def __handle_link_cb(self, widget, url): self.emit('open-link', url.get_uri()) def __page_changed_cb(self, model, page_from, page_to): self._update_nav_buttons() def __zoom_out_cb(self, widget): self.zoom_out() def __zoom_in_cb(self, widget): self.zoom_in() def __zoom_original_cb(self, widget): self.zoom_original() def __go_back_page_cb(self, widget): self._view.previous_page() def __go_forward_page_cb(self, widget): self._view.next_page() def __save_to_journal_button_cb(self, widget): self.emit('save-to-journal') self._save_to_journal_button.props.sensitive = False def __inverted_colors_toggled_cb(self, button): if hasattr(self._model, 'set_inverted_colors'): self._model.set_inverted_colors(button.props.active) if button.props.active: button.set_icon_name('light-theme') button.set_tooltip(_('Normal Colors')) else: button.set_icon_name('dark-theme') button.set_tooltip(_('Inverted Colors')) def show_inverted_colors_button(self): self._inverted_colors.show() def toggle_inverted_colors(self): self._inverted_colors.set_active( not self._inverted_colors.get_active()) def _update_nav_buttons(self): current_page = self._model.props.page self._back_page_button.props.sensitive = current_page > 0 self._forward_page_button.props.sensitive = \ current_page < self._doc.get_n_pages() - 1 def zoom_original(self): self._model.props.sizing_mode = self._EVINCE_MODE_FREE self._model.props.scale = 1.0 def zoom_in(self): self._model.props.sizing_mode = self._EVINCE_MODE_FREE self._view.zoom_in() def zoom_out(self): self._model.props.sizing_mode = self._EVINCE_MODE_FREE self._view.zoom_out() def get_pdf_title(self): return self._doc.get_title()