2008-09-16 10 views
9

Ich versuche, die Abhängigkeiten für ein Programm, zu dem ich einen Beitrag leiste, auf ein Minimum zu beschränken, es ist ein kleiner Texteditor.Mit GTK TextView rückgängig machen

GTK Textview scheint nicht mit einer integrierten Undo-Funktion zu kommen. Gibt es irgendeine Referenzimplementierung, die mir bisher gefehlt hat? Schreiben alle ihre eigene Undo-Funktion für ihre TextView-Widgets?

Ich werde mich über jeden Beispielcode freuen - am glücklichsten über Python-Beispielcode, da unser Projekt in Python ist.

Antwort

3

Soweit ich weiß, enthält GTK TextView keine Rückgängig-Funktion. Obwohl ich mit Pythons GTK-Bibliothek nicht vertraut bin, würde ich denken, dass es keine hat.

Das Ruby-GNOME2-Projekt verfügt über eine sample text editor, die Rückgängig/Wiederherstellen-Funktion hat. Im Wesentlichen verbinden sie sich mit den Signalen insert_text und delete_range des TextView-Widgets und zeichnen die Ereignisse und zugehörigen Daten in einer Liste auf.

4

Abhängig davon, wie abneigungsfeindlich Sie sind und welche Art von Texteditor Sie erstellen, fügt GtkSourceView Undo/Redo unter vielen anderen Dingen hinzu. Sehr sehenswert, wenn Sie einige der anderen features es bietet.

0

Verwenden GtkSource

.

  • [Cmnd] + [Z] für Rückgängig (default)
  • [Cmnd] + [Umschalt] + [Z] für Redo (default)
  • [Cmnd] + [Y] für Redo (manuell)

Beispiel hinzugefügt:

#!/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()