Rückgängig mit GTK Textview
-
09-06-2019 - |
Frage
Ich versuche, Abhängigkeiten für ein Programm auf ein Minimum zu halten, ich beitragen, es ist ein kleiner Texteditor.
GTK Textview scheint nicht mit einer eingebauten in Undo-Funktion zu kommen. Gibt es eine Referenz-Implementierung Ich habe bisher fehlt auf? Ist jeder seine eigene Undo-Funktion für ihre Textview-Widgets zu schreiben?
Ich werde über jeden Beispielcode glücklich sein -. Meist glücklich über Python Beispielcode, wie unser Projekt in Python ist
Lösung
Soweit ich weiß, GTK Textview enthält keine Undo-Funktion. So, während ich bin nicht vertraut mit Python GTK-Bibliothek, würde ich denke, es ist nicht ein hat.
Das Rubin-GNOME2 Projekt hat eine Beispieltexteditor das hat / Redo-Funktionalität rückgängig gemacht werden. Im Grunde sie den insert_text und delete_range Signale des Textview-Widget verbinden und die Aufzeichnung der Ereignisse und die zugehörigen Daten in einer Liste an.
Andere Tipps
als follwow-up: I gtksourceview der Undo-Mechanismus zu Python portiert: http: / /bitbucket.org/tiax/gtk-textbuffer-with-undo/
dient als Drop-in-Ersatz für gtksourceview des Undo
(OP hier, aber Launchpad Open-ID funktioniert nicht mehr)
Je nachdem, wie die Abhängigkeit scheuen Sie sind und welche Art von Texteditor Sie bauen, gtksourceview fügt unter vielen anderen Dingen Undo / Redo. Sehr einen Blick wert, wenn Sie einige der anderen Funktionen bietet.
Verwenden GtkSource
- https://wiki.gnome.org/Projects/GtkSourceView
- https://lazka.github.io/pgi-docs/GtkSource- 3.0 /
- https://lazka.github.io/pgi-docs /GtkSource-3.0/classes.html
.
- [Cmnd] + [Z] für Undo (Standard)
- [Cmnd] + [Shift] + [Z] für Redo (Standard)
- [Cmnd] + [Y] für Redo (manuell hinzugefügt)
Beispiel:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import Gdk
gi.require_version('GtkSource', '3.0')
from gi.repository import GtkSource
import os
class TreeviewWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="TreeviewWindow")
self.set_size_request(300, 300)
self.connect("key-press-event", self._key_press_event)
self.mainbox = Gtk.VBox(spacing=10)
self.add(self.mainbox)
self.textbuffer = GtkSource.Buffer()
textview = GtkSource.View(buffer=self.textbuffer)
textview.set_editable(True)
textview.set_cursor_visible(True)
textview.set_show_line_numbers(True)
self.mainbox.pack_start(textview, True, True, 0)
self.show_all()
def _key_press_event(self, widget, event):
keyval_name = Gdk.keyval_name(event.keyval)
ctrl = (event.state & Gdk.ModifierType.CONTROL_MASK)
if ctrl and keyval_name == 'y':
if self.textbuffer.can_redo():
self.textbuffer.do_redo(self.textbuffer)
def main(self):
Gtk.main()
if __name__ == "__main__":
base = TreeviewWindow()
base.main()