def __init__(self, timer, size_group): super(TimerSetupScreen, self).__init__() self.timer = timer self.set_halign(Gtk.Align.CENTER) self.set_valign(Gtk.Align.CENTER) self.set_row_spacing(48) self.hours = Spinner(0, 24) self.minutes = Spinner(0, 59) self.seconds = Spinner(0, 59) self.hours.connect("value-changed", self._on_spinner_changed) self.minutes.connect("value-changed", self._on_spinner_changed) self.seconds.connect("value-changed", self._on_spinner_changed) spinner = Gtk.Box() spinner.pack_start(self.hours, False, False, 0) colon = Gtk.Label() colon.set_markup('<span font_desc=\"64.0\">:</span>') spinner.pack_start(colon, False, False, 0) spinner.pack_start(self.minutes, False, False, 0) colon = Gtk.Label() colon.set_markup('<span font_desc=\"64.0\">:</span>') spinner.pack_start(colon, False, False, 0) spinner.pack_start(self.seconds, False, False, 0) size_group.add_widget(spinner) self.attach(spinner, 0, 0, 1, 1) self.start_button = Gtk.Button() self.start_button.set_size_request(200, -1) label = Gtk.Label() label.set_markup(Timer.BUTTON_MARKUP % (_("Start"))) self.start_button.set_sensitive(False) self.start_button.add(label) self.attach(self.start_button, 0, 1, 1, 1) self.start_button.connect('clicked', self._on_start_clicked)
class CEdit(activity.Activity): def __init__(self, handle): activity.Activity.__init__(self, handle) self.get_conf() self.reopen = True self.vbox = Gtk.VBox() self.infobar = InfoBar() self.make_toolbar() self.make_notebook() self.infobar.connect('language-changed', self.set_language) self.vbox.pack_end(self.infobar, False, False, 0) self.set_canvas(self.vbox) self.show_all() def get_conf(self): if 'saved' in self.metadata: self.conf = {} self.conf['font'] = str(self.metadata['font']) self.conf['font-size'] = int(self.metadata['font-size']) self.conf['show-line-numbers'] = bool( int(self.metadata['show-line-numbers'])) self.conf['tab-width'] = int(self.metadata['tab-width']) self.conf['use-spaces'] = bool(int(self.metadata['use-spaces'])) self.conf['theme'] = str(self.metadata['theme']) self.conf['right-line-pos'] = int(self.metadata['right-line-pos']) self.conf['show-right-line'] = bool( int(self.metadata['show-right-line'])) self.conf['wrap-mode'] = str(self.metadata['wrap-mode']) else: self.conf = { 'font': 'Monospace', 'font-size': 14, 'show-line-numbers': True, 'tab-width': 4, 'use-spaces': True, 'theme': 'classic', 'right-line-pos': 80, 'show-right-line': False, 'wrap-mode': 'none' } def make_toolbar(self): def make_separator(toolbar, expand=True): separator = Gtk.SeparatorToolItem() separator.props.draw = not expand separator.set_expand(expand) toolbar.insert(separator, -1) toolbar_box = ToolbarBox() toolbar = toolbar_box.toolbar activity_button = ToolButton() activity_button.set_icon_widget(ActivityIcon(None)) toolbar.insert(activity_button, -1) toolbar.insert(Gtk.SeparatorToolItem(), -1) toolbar_file = Gtk.Toolbar() boton_toolbar_file = ToolbarButton(page=toolbar_file, icon_name='txt') toolbar.add(boton_toolbar_file) toolbar_edit = EditToolbar() button_toolbar_edit = ToolbarButton(page=toolbar_edit, icon_name='toolbar-edit') toolbar.insert(button_toolbar_edit, -1) toolbar_view = Gtk.Toolbar() boton_toolbar_view = ToolbarButton(page=toolbar_view, icon_name='toolbar-view') toolbar.insert(boton_toolbar_view, -1) self.button_undo = toolbar_edit.undo self.button_undo.props.accelerator = '<Ctrl>Z' self.button_undo.set_sensitive(False) toolbar_edit.undo.connect('clicked', self.undo) self.button_redo = toolbar_edit.redo self.button_redo.props.accelerator = '<Ctrl><Mayus>Z' self.button_redo.set_sensitive(False) self.button_redo.connect('clicked', self.redo) self.entry_search = IconEntry() item_entry = Gtk.ToolItem() self.entry_search.set_size_request(250, -1) self.entry_search.set_placeholder_text('Search...') self.entry_search.set_icon_from_name(Gtk.EntryIconPosition.SECONDARY, 'search') self.entry_search.connect('changed', self.search_text) self.entry_search.connect('activate', self.search_text, True) item_entry.add(self.entry_search) toolbar_edit.insert(item_entry, -1) self.entry_replace = IconEntry() item_entry = Gtk.ToolItem() self.entry_replace.set_size_request(250, -1) self.entry_replace.set_placeholder_text('Replace...') self.entry_replace.connect('activate', self.replace_text) item_entry.add(self.entry_replace) toolbar_edit.insert(item_entry, -1) button_new = ToolButton('new-file') button_new.props.accelerator = '<Ctrl>N' button_new.connect('clicked', lambda w: self.new_page()) button_new.set_tooltip(_('New file')) toolbar_file.insert(button_new, -1) button_open = ToolButton('fileopen') button_open.props.accelerator = '<Ctrl>O' button_open.set_tooltip(_('Open file from file system')) button_open.connect('clicked', self.file_chooser_open) toolbar_file.insert(button_open, -1) self.button_save = ToolButton('filesave') self.button_save.props.accelerator = '<Ctrl>S' self.button_save.set_tooltip(_('Save file to the file system')) self.button_save.connect('clicked', self.file_chooser_save) toolbar_file.insert(self.button_save, -1) button_save_as = ToolButton('save-as') button_save_as.props.accelerator = '<Ctrl><Mayus>S' button_save_as.set_tooltip(_('Save as file to the file system')) button_save_as.connect('clicked', self.file_chooser_save, True) toolbar_file.insert(button_save_as, -1) make_separator(toolbar_file, False) button_print = ToolButton('printer') button_print.props.accelerator = '<Ctrl>I' button_print.set_tooltip(_('Print file')) button_print.connect('clicked', self.print_file) toolbar_file.insert(button_print, -1) make_separator(toolbar_edit, False) button_clock = ToolButton('clock') button_clock.props.accelerator = '<Ctrl>T' button_clock.set_tooltip(_('Insert date and time')) button_clock.connect('clicked', self.insert_date_and_time) toolbar_edit.insert(button_clock, -1) button_wrap_none = Gtk.RadioToolButton() button_wrap_none.set_icon_name('wrap-none') button_wrap_none.connect("toggled", self.wrap_mode_changed, 'none') toolbar_view.insert(button_wrap_none, -1) button_wrap_char = Gtk.RadioToolButton.new_from_widget( button_wrap_none) button_wrap_char.set_icon_name('format-justify-fill') button_wrap_char.connect("toggled", self.wrap_mode_changed, 'char') toolbar_view.insert(button_wrap_char, -1) button_wrap_word = Gtk.RadioToolButton.new_from_widget( button_wrap_none) button_wrap_word.set_icon_name('format-justify-left') button_wrap_word.connect("toggled", self.wrap_mode_changed, 'word') toolbar_view.insert(button_wrap_word, -1) if self.conf['wrap-mode'] == 'none': button_wrap_none.set_active(True) elif self.conf['wrap-mode'] == 'char': button_wrap_none.set_active(True) elif self.conf['wrap-mode'] == 'word': button_wrap_none.set_active(True) make_separator(toolbar_view, False) item_font_size = FontSize() item_font_size.set_font_size(self.conf['font-size']) item_font_size.connect('changed', self.font_size_changed) toolbar_view.insert(item_font_size, -1) combo_font = FontComboBox(self.conf['font']) combo_font.connect('changed', self.font_changed) toolbar_view.insert(combo_font, -1) make_separator(toolbar_view, False) button_numbers = ToggleToolButton('show-numbers') button_numbers.props.accelerator = '<Ctrl><Mayus>N' button_numbers.set_tooltip(_('Show line numbers')) button_numbers.set_active(self.conf['show-line-numbers']) button_numbers.connect('toggled', self.show_numbers_changed) toolbar_view.insert(button_numbers, -1) button_right_line = ToggleToolButton('show-right-line') button_right_line.props.accelerator = '<Ctrl>L' button_right_line.set_tooltip(_('Show a line in a specific position')) button_right_line.set_active(self.conf['show-right-line']) button_right_line.connect('toggled', self.show_right_line_changed) toolbar_view.insert(button_right_line, -1) self.spinner_right_line = Spinner(self.conf['right-line-pos'], 1, 150) self.spinner_right_line.set_sensitive(self.conf['show-right-line']) self.spinner_right_line.connect('value-changed', self.right_line_pos_changed) toolbar_view.insert(self.spinner_right_line, -1) make_separator(toolbar_view, False) combo_styles = ComboStyles(self.conf['theme']) combo_styles.connect('theme-changed', self.theme_changed) toolbar_view.insert(combo_styles, -1) make_separator(toolbar, True) button_stop = ToolButton('activity-stop') button_stop.props.accelerator = '<Ctrl>Q' button_stop.connect('clicked', self._exit) toolbar.insert(button_stop, -1) toolbar_file.show_all() toolbar_edit.show_all() toolbar_view.show_all() toolbar_edit.copy.hide() toolbar_edit.paste.hide() self.set_toolbar_box(toolbar_box) def make_notebook(self): self.notebook = Gtk.Notebook() button_add = Gtk.ToolButton.new_from_stock(Gtk.STOCK_ADD) button_add.connect('clicked', lambda w: self.new_page()) self.notebook.set_scrollable(True) self.notebook.set_show_tabs(True) self.notebook.set_action_widget(button_add, Gtk.PackType.END) self.notebook.add_events(Gdk.EventMask.SCROLL_MASK | Gdk.EventMask.SMOOTH_SCROLL_MASK) self.notebook.connect('switch-page', self.update_buttons) self.notebook.connect('scroll-event', self.notebook_scrolled) self.notebook.connect('page-removed', self.page_removed) self.vbox.pack_start(self.notebook, True, True, 2) self.new_page() button_add.show() self.show_all() def page_removed(self, notebook, scroll, page): if not self.reopen: return if len(self.notebook.get_children()) == 0: self.new_page() def set_language(self, infobar, language): buffer = self.get_view().buffer buffer.set_language_from_string(language) def set_language_from_buffer(self, buffer, language): self.infobar.set_language(language) def notebook_scrolled(self, widget, event): if event.get_scroll_direction()[1] == Gdk.ScrollDirection.UP: self.notebook.prev_page() elif event.get_scroll_direction()[1] == Gdk.ScrollDirection.DOWN: self.notebook.next_page() def update_buttons(self, notebook=None, scrolled=None, *args): if not isinstance(scrolled, Gtk.ScrolledWindow): view = self.get_view() else: view = scrolled.get_children()[0] buffer = view.get_buffer() self.button_undo.set_sensitive(buffer.can_undo()) self.button_redo.set_sensitive(buffer.can_redo()) self.button_save.set_sensitive(buffer.get_modified()) self.entry_search.set_sensitive(bool(buffer.get_all_text())) self.entry_replace.set_sensitive(bool(buffer.get_all_text())) self.spinner_right_line.set_sensitive(self.conf['show-right-line']) self.infobar.set_language(buffer.get_language_str()) self.update_cursor_position(buffer) def new_page(self, view=None, label=None): if not view: view = View(self.conf) view.buffer.connect('changed', self.update_buttons) view.buffer.connect('mark-set', self.update_cursor_position) view.buffer.connect('language-changed', self.set_language_from_buffer) if not label: label = view.get_file_name() if type(label) == str: label = Gtk.Label(label) label.modify_font(Pango.FontDescription('15 bold')) view.connect('title-changed', self.change_title_from_view) scrolled = Gtk.ScrolledWindow() scrolled.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) scrolled.set_shadow_type(Gtk.ShadowType.ETCHED_IN) scrolled.add(view) hbox = Gtk.HBox() hbox.set_size_request(-1, 20) hbox.pack_start(label, False, False, 0) button = Gtk.Button() button.set_relief(Gtk.ReliefStyle.NONE) button.set_size_request(12, 12) button.set_image( Gtk.Image.new_from_stock(Gtk.STOCK_CLOSE, Gtk.IconSize.MENU)) button.connect('clicked', self.remove_page_from_widget, scrolled) hbox.pack_start(button, False, False, 0) self.notebook.append_page(scrolled, hbox) self.notebook.set_tab_reorderable(scrolled, True) view.grab_focus() hbox.show_all() self.show_all() self.notebook.set_current_page(self.notebook.get_n_pages() - 1) return view def update_cursor_position(self, buffer, *args): iter = buffer.get_iter_at_mark(buffer.get_insert()) line = iter.get_line() + 1 column = iter.get_line_offset() + 1 self.infobar.set_pos(line, column) def file_chooser_open(self, widget): path = self.get_view().get_file() file_chooser = FileChooserOpen(self, path) file_chooser.connect('open-file', self._open_file_from_chooser) file_chooser.show_all() def file_chooser_save(self, widget, force=False, close=False): # Force is for "save as" idx = self.notebook.get_current_page() view = self.get_view() if view.get_file() and not force: self.save_file(idx=idx, path=view.get_file()) return file_chooser = FileChooserSave() file_chooser.connect('save-file', self._save_file_from_chooser, close) file_chooser.show_all() def begin_print(self, operation, context, compositor): while not compositor.paginate(context): pass n_pages = compositor.get_n_pages() operation.set_n_pages(n_pages) def draw_page(self, operation, context, page_nr, compositor): compositor.draw_page(context, page_nr) def print_file(self, widget): def _alert_response(alert, response): self.vbox.remove(alert) view = self.get_view() buffer = view.get_buffer() path = view.get_file() if not path: alert = TimeoutAlert(10) alert.props.title = _('This file has not saved.') alert.props.msg = _('You must save this file to print.') hbox = alert.get_children()[0] buttonbox = hbox.get_children()[1] button = buttonbox.get_children()[0] buttonbox.remove(button) alert.connect('response', _alert_response) self.vbox.pack_start(alert, False, False, 0) self.vbox.reorder_child(alert, 0) return compositor = GtkSource.PrintCompositor.new_from_view(view) compositor.set_wrap_mode(view.get_wrap_mode()) compositor.set_highlight_syntax(buffer.get_highlight_syntax()) compositor.set_print_line_numbers(self.conf['show-line-numbers']) if view.buffer.language: compositor.set_header_format( False, '%s - %s' % (view.buffer.get_language_str(), view.get_file()), None, None) compositor.set_footer_format(True, '%T', path, 'Page %N/%Q') compositor.set_print_header(True) compositor.set_print_footer(True) operation = Gtk.PrintOperation() operation.set_job_name(path) operation.connect('begin-print', self.begin_print, compositor) operation.connect('draw-page', self.draw_page, compositor) res = operation.run(Gtk.PrintOperationAction.PRINT_DIALOG, None) if res == Gtk.PrintOperationResult.ERROR: dialog = Gtk.MessageDialog(self, Gtk.DialogFlags.DESTROY_WITH_PARENT, Gtk.MessageType.ERROR, Gtk.ButtonsType.OK, 'Error to print the file: %s' % path) dialog.run() dialog.destroy() def _open_file_from_chooser(self, widget, path): children = self.notebook.get_children() for scrolled in children: view = scrolled.get_children()[0] if view.get_file() == path: idx = children.index(scrolled) self.notebook.set_current_page(idx) return view = self.get_view() if view.get_file(): self.new_page(label=view.get_file_name()) view = self.get_view(idx=-1) view.set_file(path) def _save_file_from_chooser(self, widget, path, close=False): view = self.get_view() view.save_file(path) if close: view = self.get_view() scrolled = view.get_parent() idx = self.notebook.get_children().index(scrolled) self.notebook.remove_page(idx) def save_file(self, widget=None, idx=None, path=None): if idx is not None: idx = self.notebook.get_current_page() scrolled = self.notebook.get_children()[idx] view = scrolled.get_children()[0] view.save_file(view.get_file()) def remove_page_from_widget(self, widget, scrolled, force=False): view = scrolled.get_children()[0] buffer = view.get_buffer() idx = self.notebook.get_children().index(scrolled) if not buffer.get_modified() or force: self.notebook.remove_page(idx) else: name = view.get_file_name() title = _('Save changes to document "%s" before closing?' % name) msg = _('If you do not save, changes will be lost forever.') cancel = Gtk.Image.new_from_icon_name('dialog-cancel', Gtk.IconSize.MENU) no = Gtk.Image.new_from_icon_name('activity-stop', Gtk.IconSize.MENU) save = Gtk.Image.new_from_icon_name('filesave', Gtk.IconSize.MENU) self.alert = Alert() self.alert.props.title = title self.alert.props.msg = msg button1 = self.alert.add_button(Gtk.ResponseType.CANCEL, _('Cancel'), icon=cancel) button2 = self.alert.add_button(Gtk.ResponseType.NO, _('No save'), icon=no) button3 = self.alert.add_button(Gtk.ResponseType.YES, _('Save'), icon=save) self.alert.connect('response', self._alert_response, scrolled) self.vbox.pack_start(self.alert, False, False, 0) self.vbox.reorder_child(self.alert, 0) self.vbox.show_all() def change_title_from_view(self, view=None, label=None): if not view: view = self.get_view() if not label: label = view.get_file_name() scrolled = view.get_parent() hbox = self.notebook.get_tab_label(scrolled) widget = hbox.get_children()[0] changed = view.get_buffer().get_modified() widget.set_label(label) color = '#FF0000' if changed else '#FFFFFF' widget.modify_fg(Gtk.StateType.NORMAL, Gdk.color_parse(color)) self.update_buttons() def get_view(self, idx=None): if idx is None: idx = self.notebook.get_current_page() scrolled = self.notebook.get_children()[idx] return scrolled.get_children()[0] def undo(self, widget): self.get_view().undo() self.change_title_from_view() def redo(self, widget): self.get_view().redo() self.change_title_from_view() def search_text(self, entry, enter=False): text = entry.get_text() self.get_view().search(text, enter) def replace_text(self, entry): text_search = self.entry_search.get_text() text_replace = entry.get_text() self.get_view().replace(text_search, text_replace) def wrap_mode_changed(self, widget, mode): self.conf['wrap-mode'] = mode self.set_conf_to_views() def font_size_changed(self, widget, font_size): self.conf['font-size'] = font_size self.set_conf_to_views() def font_changed(self, widget, font): self.conf['font'] = font self.set_conf_to_views() def show_numbers_changed(self, widget): self.conf['show-line-numbers'] = widget.get_active() self.set_conf_to_views() def show_right_line_changed(self, widget): self.conf['show-right-line'] = widget.get_active() self.update_buttons() self.set_conf_to_views() def right_line_pos_changed(self, widget, value): self.conf['right-line-pos'] = value self.set_conf_to_views() def theme_changed(self, widget, theme): self.conf['theme'] = theme self.set_conf_to_views() def tab_width_changed(self, widget, tab_width): self.conf['tab-width'] = tab_width self.set_conf_to_views() def set_conf_to_views(self): for scrolled in self.notebook.get_children(): view = scrolled.get_children()[0] view.set_conf(self.conf) def insert_date_and_time(self, widget): view = self.get_view() day = datetime.date.today() date = day.strftime('%d/%m/%y') hour = time.strftime('%H:%M:%S') text = date + ' ' + hour view.buffer.insert_interactive_at_cursor(text, -1, True) def _alert_response(self, widget, response, scrolled): if response == Gtk.ResponseType.NO: self.remove_page_from_widget(None, scrolled, force=True) elif response == Gtk.ResponseType.YES: self.file_chooser_save(None, False, True) self.vbox.remove(self.alert) def write_file(self, file_path): files = [] for scrolled in self.notebook.get_children(): view = scrolled.get_children()[0] if view.get_file(): files.append(view.get_file) self.metadata['saved'] = True self.metadata['font'] = self.conf['font'] self.metadata['font-size'] = self.conf['font-size'] self.metadata['show-line-numbers'] = self.conf['show-line-numbers'] self.metadata['tab-width'] = self.conf['tab-width'] self.metadata['use-spaces'] = self.conf['use-spaces'] self.metadata['theme'] = self.conf['theme'] self.metadata['right-line-pos'] = self.conf['right-line-pos'] self.metadata['show-right-line'] = self.conf['show-right-line'] self.metadata['wrap-mode'] = self.conf['wrap-mode'] def _exit(self, *args): def _remove_page(widget, scrolled): if scrolled in self.notebook.get_children(): idx = self.notebook.get_children().index(scrolled) self.notebook.remove_page(idx) check_modified() def _alert_response(alert, response, scrolled): self.vbox.remove(alert) if response == Gtk.ResponseType.YES: view = scrolled.get_children()[0] if view.get_file(): idx = self.notebook.get_children() self.save_file(idx=idx, path=view.get_file()) self.remove_page_from_widget(None, scrolled, force=True) return file_chooser = FileChooserSave() file_chooser.connect('save-file', self._save_file_from_chooser, True) file_chooser.connect('destroy', _remove_page, scrolled) file_chooser.show_all() else: self.remove_page_from_widget(None, scrolled, force=True) check_modified() def _create_alert(name, scrolled): title = _('Save changes to document "%s" before closing?' % name) msg = _('If you do not save, changes will be lost forever.') no = Gtk.Image.new_from_icon_name('activity-stop', Gtk.IconSize.MENU) save = Gtk.Image.new_from_icon_name('filesave', Gtk.IconSize.MENU) alert = Alert() alert.props.title = title alert.props.msg = msg button1 = alert.add_button(Gtk.ResponseType.NO, _('No save'), icon=no) button2 = alert.add_button(Gtk.ResponseType.YES, _('Save'), icon=save) alert.connect('response', _alert_response, scrolled) self.vbox.pack_start(alert, False, False, 0) self.vbox.reorder_child(alert, 0) self.vbox.show_all() def check_modified(): if not self.notebook.get_children(): _close() return self.notebook.set_current_page(self.notebook.get_n_pages() - 1) scrolled = self.notebook.get_children()[-1] view = scrolled.get_children()[0] buffer = view.get_buffer() if buffer.get_modified(): name = view.get_file_name() _create_alert(name, scrolled) else: self.remove_page_from_widget(None, scrolled, force=True) check_modified() def _close(): self.close() self.reopen = False check_modified()
def make_toolbar(self): def make_separator(toolbar, expand=True): separator = Gtk.SeparatorToolItem() separator.props.draw = not expand separator.set_expand(expand) toolbar.insert(separator, -1) toolbar_box = ToolbarBox() toolbar = toolbar_box.toolbar activity_button = ToolButton() activity_button.set_icon_widget(ActivityIcon(None)) toolbar.insert(activity_button, -1) toolbar.insert(Gtk.SeparatorToolItem(), -1) toolbar_file = Gtk.Toolbar() boton_toolbar_file = ToolbarButton(page=toolbar_file, icon_name='txt') toolbar.add(boton_toolbar_file) toolbar_edit = EditToolbar() button_toolbar_edit = ToolbarButton(page=toolbar_edit, icon_name='toolbar-edit') toolbar.insert(button_toolbar_edit, -1) toolbar_view = Gtk.Toolbar() boton_toolbar_view = ToolbarButton(page=toolbar_view, icon_name='toolbar-view') toolbar.insert(boton_toolbar_view, -1) self.button_undo = toolbar_edit.undo self.button_undo.props.accelerator = '<Ctrl>Z' self.button_undo.set_sensitive(False) toolbar_edit.undo.connect('clicked', self.undo) self.button_redo = toolbar_edit.redo self.button_redo.props.accelerator = '<Ctrl><Mayus>Z' self.button_redo.set_sensitive(False) self.button_redo.connect('clicked', self.redo) self.entry_search = IconEntry() item_entry = Gtk.ToolItem() self.entry_search.set_size_request(250, -1) self.entry_search.set_placeholder_text('Search...') self.entry_search.set_icon_from_name(Gtk.EntryIconPosition.SECONDARY, 'search') self.entry_search.connect('changed', self.search_text) self.entry_search.connect('activate', self.search_text, True) item_entry.add(self.entry_search) toolbar_edit.insert(item_entry, -1) self.entry_replace = IconEntry() item_entry = Gtk.ToolItem() self.entry_replace.set_size_request(250, -1) self.entry_replace.set_placeholder_text('Replace...') self.entry_replace.connect('activate', self.replace_text) item_entry.add(self.entry_replace) toolbar_edit.insert(item_entry, -1) button_new = ToolButton('new-file') button_new.props.accelerator = '<Ctrl>N' button_new.connect('clicked', lambda w: self.new_page()) button_new.set_tooltip(_('New file')) toolbar_file.insert(button_new, -1) button_open = ToolButton('fileopen') button_open.props.accelerator = '<Ctrl>O' button_open.set_tooltip(_('Open file from file system')) button_open.connect('clicked', self.file_chooser_open) toolbar_file.insert(button_open, -1) self.button_save = ToolButton('filesave') self.button_save.props.accelerator = '<Ctrl>S' self.button_save.set_tooltip(_('Save file to the file system')) self.button_save.connect('clicked', self.file_chooser_save) toolbar_file.insert(self.button_save, -1) button_save_as = ToolButton('save-as') button_save_as.props.accelerator = '<Ctrl><Mayus>S' button_save_as.set_tooltip(_('Save as file to the file system')) button_save_as.connect('clicked', self.file_chooser_save, True) toolbar_file.insert(button_save_as, -1) make_separator(toolbar_file, False) button_print = ToolButton('printer') button_print.props.accelerator = '<Ctrl>I' button_print.set_tooltip(_('Print file')) button_print.connect('clicked', self.print_file) toolbar_file.insert(button_print, -1) make_separator(toolbar_edit, False) button_clock = ToolButton('clock') button_clock.props.accelerator = '<Ctrl>T' button_clock.set_tooltip(_('Insert date and time')) button_clock.connect('clicked', self.insert_date_and_time) toolbar_edit.insert(button_clock, -1) button_wrap_none = Gtk.RadioToolButton() button_wrap_none.set_icon_name('wrap-none') button_wrap_none.connect("toggled", self.wrap_mode_changed, 'none') toolbar_view.insert(button_wrap_none, -1) button_wrap_char = Gtk.RadioToolButton.new_from_widget( button_wrap_none) button_wrap_char.set_icon_name('format-justify-fill') button_wrap_char.connect("toggled", self.wrap_mode_changed, 'char') toolbar_view.insert(button_wrap_char, -1) button_wrap_word = Gtk.RadioToolButton.new_from_widget( button_wrap_none) button_wrap_word.set_icon_name('format-justify-left') button_wrap_word.connect("toggled", self.wrap_mode_changed, 'word') toolbar_view.insert(button_wrap_word, -1) if self.conf['wrap-mode'] == 'none': button_wrap_none.set_active(True) elif self.conf['wrap-mode'] == 'char': button_wrap_none.set_active(True) elif self.conf['wrap-mode'] == 'word': button_wrap_none.set_active(True) make_separator(toolbar_view, False) item_font_size = FontSize() item_font_size.set_font_size(self.conf['font-size']) item_font_size.connect('changed', self.font_size_changed) toolbar_view.insert(item_font_size, -1) combo_font = FontComboBox(self.conf['font']) combo_font.connect('changed', self.font_changed) toolbar_view.insert(combo_font, -1) make_separator(toolbar_view, False) button_numbers = ToggleToolButton('show-numbers') button_numbers.props.accelerator = '<Ctrl><Mayus>N' button_numbers.set_tooltip(_('Show line numbers')) button_numbers.set_active(self.conf['show-line-numbers']) button_numbers.connect('toggled', self.show_numbers_changed) toolbar_view.insert(button_numbers, -1) button_right_line = ToggleToolButton('show-right-line') button_right_line.props.accelerator = '<Ctrl>L' button_right_line.set_tooltip(_('Show a line in a specific position')) button_right_line.set_active(self.conf['show-right-line']) button_right_line.connect('toggled', self.show_right_line_changed) toolbar_view.insert(button_right_line, -1) self.spinner_right_line = Spinner(self.conf['right-line-pos'], 1, 150) self.spinner_right_line.set_sensitive(self.conf['show-right-line']) self.spinner_right_line.connect('value-changed', self.right_line_pos_changed) toolbar_view.insert(self.spinner_right_line, -1) make_separator(toolbar_view, False) combo_styles = ComboStyles(self.conf['theme']) combo_styles.connect('theme-changed', self.theme_changed) toolbar_view.insert(combo_styles, -1) make_separator(toolbar, True) button_stop = ToolButton('activity-stop') button_stop.props.accelerator = '<Ctrl>Q' button_stop.connect('clicked', self._exit) toolbar.insert(button_stop, -1) toolbar_file.show_all() toolbar_edit.show_all() toolbar_view.show_all() toolbar_edit.copy.hide() toolbar_edit.paste.hide() self.set_toolbar_box(toolbar_box)
class TimerSetupScreen(Gtk.Grid): def __init__(self, timer, size_group): super(TimerSetupScreen, self).__init__() self.timer = timer self.set_halign(Gtk.Align.CENTER) self.set_valign(Gtk.Align.CENTER) self.set_row_spacing(48) self.hours = Spinner(0, 24) self.minutes = Spinner(0, 59) self.seconds = Spinner(0, 59) self.hours.connect("value-changed", self._on_spinner_changed) self.minutes.connect("value-changed", self._on_spinner_changed) self.seconds.connect("value-changed", self._on_spinner_changed) spinner = Gtk.Box() spinner.pack_start(self.hours, False, False, 0) colon = Gtk.Label() colon.set_markup('<span font_desc=\"64.0\">:</span>') spinner.pack_start(colon, False, False, 0) spinner.pack_start(self.minutes, False, False, 0) colon = Gtk.Label() colon.set_markup('<span font_desc=\"64.0\">:</span>') spinner.pack_start(colon, False, False, 0) spinner.pack_start(self.seconds, False, False, 0) size_group.add_widget(spinner) self.attach(spinner, 0, 0, 1, 1) self.start_button = Gtk.Button() self.start_button.set_size_request(200, -1) label = Gtk.Label() label.set_markup(Timer.BUTTON_MARKUP % (_("Start"))) self.start_button.set_sensitive(False) self.start_button.add(label) self.attach(self.start_button, 0, 1, 1, 1) self.start_button.connect('clicked', self._on_start_clicked) def get_values(self): h = self.hours.get_value() m = self.minutes.get_value() s = self.seconds.get_value() return (h, m, s) def set_values(self, h, m, s): self.hours.set_value(h) self.minutes.set_value(m) self.seconds.set_value(s) self.update_start_button_status() def update_start_button_status(self): h, m, s = self.get_values() if h == 0 and m == 0 and s == 0: self.start_button.set_sensitive(False) self.start_button.get_style_context().remove_class("clocks-go") else: self.start_button.set_sensitive(True) self.start_button.get_style_context().add_class("clocks-go") def _on_spinner_changed(self, spinner): self.update_start_button_status() def _on_start_clicked(self, data): self.timer.start()