2008-09-16 13 views
9

Estoy tratando de mantener las dependencias al mínimo para un programa al que contribuyo, es un pequeño editor de texto.Deshacer con GTK TextView

GTK Textview no parece venir con una función de deshacer integrada. ¿Hay alguna implementación de referencia que me haya perdido hasta ahora? ¿Están todos escribiendo su propia función de deshacer para sus widgets TextView?

Estaré encantado con cualquier código de muestra, más feliz con el código de muestra de Python, ya que nuestro proyecto está en python.

Respuesta

3

Por lo que sé, GTK TextView no incluye una función de deshacer. Entonces, aunque no estoy familiarizado con la biblioteca GTK de Python, creo que no tiene una.

El proyecto Ruby-GNOME2 tiene un sample text editor que tiene funcionalidad de deshacer/rehacer. Básicamente se conectan a las señales insert_text y delete_range del widget TextView y registran los eventos y los datos asociados en una lista.

4

Dependiendo de qué tan reacio a la dependencia se encuentre, y qué tipo de editor de texto está construyendo, GtkSourceView agrega deshacer/rehacer entre muchas otras cosas. Merece la pena ver si quiere alguno de los otros features que ofrece.

5

como follwow-up: Me portado mecanismo de deshacer de gtksourceview a Python: http://bitbucket.org/tiax/gtk-textbuffer-with-undo/

sirve como un reemplazo directo para gtksourceview de deshacer

(OP aquí, pero plataforma de lanzamiento abierto-id no funciona más)

0

uso GtkSource

.

  • [Cmnd] + [Z] para deshacer (predeterminado)
  • [Cmnd] + [Shift] + [Z] para rehacer (por defecto)
  • [Cmnd] + [Y] para rehacer (añadido manualmente)

ejemplo:

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