def __init__(self, app): Gtk.Window.__init__(self, title="Source.View Example", application=app) self.set_border_width(10) self.set_default_size(450, 450) bb = Gtk.ButtonBox() bb.set_orientation(Gtk.Orientation.HORIZONTAL) bb.set_spacing(2) swb = GtkSource.StyleSchemeChooserButton.new() bb.add(swb) bb.set_child_secondary(swb, True) box = Gtk.Box() box.set_orientation(Gtk.Orientation.VERTICAL) box.set_spacing(5) box.pack_start(bb, False, False, 0) scrolled_window = Gtk.ScrolledWindow() scrolled_window.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) box.pack_start(scrolled_window, True, True, 0) sourceview = GtkSource.View.new() buf = sourceview.get_buffer() lm = GtkSource.LanguageManager() buf.set_language(lm.get_language("python3")) scrolled_window.add(sourceview) sourcefile = GtkSource.File() sourcefile.set_location(Gio.File.new_for_path(python_file)) loader = GtkSource.FileLoader.new(buf, sourcefile) loader.load_async(0, None, None, None, None, None) wrap_mode = Gtk.WrapMode(2) sourceview.set_wrap_mode(wrap_mode) self.add(box)
def __init__(self, app): Gtk.Window.__init__(self, title="Source.View Example", application=app) self.set_border_width(10) self.set_default_size(450, 450) scrolled_window = Gtk.ScrolledWindow() scrolled_window.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) sourceview = GtkSource.View.new() buf = sourceview.get_buffer() scrolled_window.add(sourceview) sourcefile = GtkSource.File() sourcefile.set_location(Gio.File.new_for_path(python_file)) lang_manager = GtkSource.LanguageManager() buf.set_language(lang_manager.get_language("python3")) print("Using Scheme:", buf.get_style_scheme().get_id()) prev_scheme = buf.get_style_scheme().get_id() ssm = GtkSource.StyleSchemeManager.new() # print(ssm.get_search_path()) for path in ssm.get_search_path(): print(path) print(ssm.get_scheme_ids()) scheme = ssm.get_scheme(ssm.get_scheme_ids()[5]) if not scheme: scheme = ssm.get_scheme(prev_scheme) buf.set_style_scheme(scheme) print("Now using Scheme:", buf.get_style_scheme().get_id()) loader = GtkSource.FileLoader.new(buf, sourcefile) loader.load_async(0, None, None, None, None, None) wrap_mode = Gtk.WrapMode(2) # https://lazka.github.io/pgi-docs/#Gtk-3.0/enums.html#Gtk.WrapMode sourceview.set_wrap_mode(wrap_mode) self.add(scrolled_window)
def read_file_contents(filename, parent_names, buffer, load_file_cb, in_trash=False): parent_dir = sep.join(parent_names) fpath = join(BASE_TEXT_DIR, parent_dir, filename) if in_trash: fpath = join(TRASH_DIR, filename) def load_finish_cb(loader, res, user_data): gsf = user_data try: success = loader.load_finish(res) except Exception as e: # TODO: Warn file read error so overwriting path with blank file... write_to_file(gsf.get_location(), "") finally: load_file_cb(gsf, buffer) f = Gio.File.new_for_path(fpath) gsf = GtkSource.File(location=f) loader = GtkSource.FileLoader.new(buffer, gsf) loader.load_async(GLib.PRIORITY_HIGH, None, None, None, load_finish_cb, gsf)
def gfile(self, value): self.disconnect_monitor() self._gfile = value self._sourcefile = GtkSource.File() self._sourcefile.set_location(value) self._sourcefile.bind_property('encoding', self, 'encoding', GObject.BindingFlags.DEFAULT) self.update_mtime() self.connect_monitor()
def gfile(self, value): self._disconnect_monitor() self._gfile = value self._sourcefile = GtkSource.File() self._sourcefile.set_location(value) # This is aiming to maintain existing behaviour for filename. The # behaviour is however wrong and should be fixed. self.filename = value.get_path().decode('utf8') if value else None self.update_mtime() self._connect_monitor()
def gfile(self, value): self.disconnect_monitor() self._gfile = value self._sourcefile = GtkSource.File() self._sourcefile.set_location(value) # This is aiming to maintain existing behaviour for filename. The # behaviour is however wrong and should be fixed. # FIXME: maintaining previous comment above; this is now wrong in different awful ways self.filename = value.get_path() if value else None self.update_mtime() self.connect_monitor()
def __init__(self, app): Gtk.Window.__init__(self, title="Source.View Example", application=app) self.set_border_width(10) self.set_default_size(450, 450) self.old_style = None self.cur_style = None bb = Gtk.ButtonBox() bb.set_orientation(Gtk.Orientation.HORIZONTAL) bb.set_spacing(2) cb = Gtk.Button.new() ssw = GtkSource.StyleSchemeChooserWidget.new() dw = Gtk.Dialog.new() dw.add_button("_Set", Gtk.ResponseType.OK) dw.add_button("_Leave", Gtk.ResponseType.CANCEL) dw.set_transient_for(self) dw.set_title("Style Chooser") ca = dw.get_content_area() ca.pack_start(ssw, True, True, 0) cb.connect("clicked", self.cb_active, dw, ssw) bb.add(cb) bb.set_child_secondary(cb, True) box = Gtk.Box() box.set_orientation(Gtk.Orientation.VERTICAL) box.set_spacing(5) box.pack_start(bb, False, False, 0) scrolled_window = Gtk.ScrolledWindow() scrolled_window.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) box.pack_start(scrolled_window, True, True, 0) sourceview = GtkSource.View.new() buf = sourceview.get_buffer() ssw.connect("button-release-event", self.style_cb, buf, cb) dw.connect("response", self.dia_resp, buf, cb) dw.connect("delete-event", self.dia_close) self.old_style = buf.get_style_scheme() cb.set_label(self.old_style.get_id()) lm = GtkSource.LanguageManager() buf.set_language(lm.get_language("python3")) scrolled_window.add(sourceview) sourcefile = GtkSource.File() sourcefile.set_location(Gio.File.new_for_path(python_file)) loader = GtkSource.FileLoader.new(buf, sourcefile) loader.load_async(0, None, None, None, None, None) wrap_mode = Gtk.WrapMode(2) sourceview.set_wrap_mode(wrap_mode) self.add(box)
def gfile(self, value): self.disconnect_monitor() self._gfile = value self._sourcefile = GtkSource.File() self._sourcefile.set_location(value) self._sourcefile.bind_property('encoding', self, 'encoding', GObject.BindingFlags.DEFAULT) # TODO: Figure out how we use filename, and decide on how this # should actually work. This was previously wrong, but since # then we've moved to Python 3 with a different filename # encoding model, and also changed stuff to use Gio.File. self.filename = value.get_path() if value else None self.update_mtime() self.connect_monitor()
def __init__(self, file=None, **props): super().__init__(**dict( default_width=640, default_height=480, icon_name='eddy', **props)) self.__file = file self.__saved = True self.__close_after_save = False grid = Gtk.Grid(orientation=Gtk.Orientation.VERTICAL) self.add(grid) self.__menu_stack = MenuStack(self) grid.attach(self.__menu_stack, 0, self.__ROW_MENU, 1, 1) scroller = Gtk.ScrolledWindow(shadow_type=Gtk.ShadowType.IN, expand=True) self.__source_view = GtkSource.View(expand=True, monospace=True) scroller.add(self.__source_view) scroller.show_all() self.buffer.connect('mark-set', self.__on_mark_set) self.__on_cursor_position_changed(self.buffer.get_start_iter()) if file is None: grid.attach(scroller, 0, self.__ROW_TEXT_VIEW, 1, 1) self.buffer.connect('changed', self.__on_buffer_changed) else: hgrid = Gtk.Grid(orientation=Gtk.Orientation.HORIZONTAL) label = Gtk.Label(_('Loading…')) hgrid.add(label) cancel_button = Gtk.Button.new_from_stock(Gtk.STOCK_CANCEL) hgrid.add(cancel_button) grid.attach(hgrid, 0, self.__ROW_TEXT_VIEW, 1, 1) hgrid.show_all() cancellable = Gio.Cancellable() source_file = GtkSource.File(location=file) loader = GtkSource.FileLoader(buffer=self.buffer, file=source_file) # TODO: Show progress loader.load_async( GLib.PRIORITY_DEFAULT, cancellable, None, None, lambda loader, result: self.__finish_loading( loader, result, grid, hgrid, scroller)) cancel_button.connect('clicked', lambda b: cancellable.cancel()) grid.show_all()
def on_save(self): if self.__file is None: chooser = Gtk.FileChooserNative.new(_('Save As…'), self, Gtk.FileChooserAction.SAVE, None, None) response = chooser.run() if response != Gtk.ResponseType.ACCEPT: return filename = chooser.get_filename() self.__file = Gio.File.new_for_path(filename) assert self.__file is not None assert self.__file.get_path() is not None source_file = GtkSource.File(location=self.__file) cancellable = Gio.Cancellable() cancel_handler = self.__menu_stack.status_area.connect( 'save-cancel-clicked', lambda b: cancellable.cancel()) self.__menu_stack.status_area.show_save_status() saver = GtkSource.FileSaver(buffer=self.buffer, file=source_file) # TODO: Show progress saver.save_async(GLib.PRIORITY_DEFAULT, cancellable, None, None, self.__finish_saving, cancel_handler)
def on_app_activate(self, app): self.builder = Gtk.Builder() GObject.type_register(GtkSource.View) self.builder.add_from_file("22_editor_gtksv.glade") self.builder.connect_signals(Handler()) # setup SourceView self.view = self.builder.get_object("sv") self.buffer = self.view.get_buffer() self.sourcefile = GtkSource.File() self.lang_manager = GtkSource.LanguageManager() # setup settings for SourceView self.settings = GtkSource.SearchSettings() self.builder.get_object("search_entry").bind_property( "text", self.settings, "search-text") self.settings.set_search_text("initial highlight") self.settings.set_wrap_around(True) self.search_context = GtkSource.SearchContext.new( self.buffer, self.settings) window = self.builder.get_object("app_window") window.set_application(app) window.show_all()
def __init__(self, file): Gtk.Box.__init__(self) self.set_orientation(Gtk.Orientation.VERTICAL) self.get_style_context().add_class("background") logger.debug("Make Tab") self.scroll = Gtk.ScrolledWindow() lm = GtkSource.LanguageManager.new() language = lm.guess_language(file, None) buffer = GtkSource.Buffer() if language: buffer.set_highlight_syntax(True) buffer.set_language(language) buffer.set_style_scheme( GtkSource.StyleSchemeManager.get_default().get_scheme( 'cobalt')) else: logger.warning('No language found for file "%s"' % file) buffer.set_highlight_syntax(False) buffer.connect("changed", self.changed, self) source_file = GtkSource.File() source_file.set_location(Gio.File.new_for_path(file)) source_file_loader = GtkSource.FileLoader.new(buffer, source_file) source_file_loader.load_async(GLib.PRIORITY_DEFAULT, None, None, None, self.done_load, self) self.sourceview = GtkSource.View.new_with_buffer(buffer) self.sourceview.set_auto_indent(True) self.sourceview.set_indent_on_tab(True) self.sourceview.set_show_line_numbers(True) self.sourceview.set_highlight_current_line(True) self.sourceview.set_smart_home_end(True) self.sourceview.set_auto_indent(True) self.sourceview.set_show_right_margin(True) self.scroll.add(self.sourceview) self.pack_start(self.scroll, True, True, 0) self.actions = Gtk.ActionBar() box_unredo = Gtk.Box() box_unredo.get_style_context().add_class('linked') btn_undo = Gtk.Button('Undo') btn_undo.set_tooltip_text('Undo the last edit') btn_undo.connect('clicked', self.undo, self) btn_redo = Gtk.Button.new_from_icon_name('edit-redo-symbolic', Gtk.IconSize.SMALL_TOOLBAR) btn_redo.set_tooltip_text('Redo the undone edit') btn_redo.connect("clicked", self.redo, self) box_unredo.add(btn_undo) box_unredo.add(btn_redo) self.actions.pack_start(box_unredo) btn_info = Gtk.Button.new_from_icon_name( 'document-properties-symbolic', Gtk.IconSize.SMALL_TOOLBAR) btn_info.set_tooltip_text('File Information') btn_info.connect("clicked", self.info, self) self.actions.pack_end(btn_info) self.pack_end(self.actions, False, False, 0) self.bit_file = source_file self.bit_buffer = buffer self.show_all()