Pergunta

Estou tentando manter as dependências ao mínimo para um programa com o qual contribuo, é um pequeno editor de texto.

GTK Textview não parece vir com uma função de desfazer integrada.Há alguma implementação de referência que me faltou até agora?Todos estão escrevendo suas próprias funções de desfazer para seus widgets TextView?

Ficarei feliz com qualquer código de exemplo - muito feliz com o código de exemplo python, já que nosso projeto está em python.

Foi útil?

Solução

Pelo que eu sei, o GTK TextView não inclui uma função de desfazer.Portanto, embora eu não esteja familiarizado com a biblioteca GTK do Python, acho que ela não possui uma.

O projeto Ruby-GNOME2 tem um editor de texto de exemplo que possui funcionalidade de desfazer/refazer.Basicamente eles estão se conectando aos sinais insert_text e delete_range do widget TextView e registrando os eventos e dados associados em uma lista.

Outras dicas

como acompanhamento:Eu portei o mecanismo de desfazer do gtksourceview para python: http://bitbucket.org/tiax/gtk-textbuffer-with-undo/

serve como um substituto imediato para desfazer do gtksourceview

(OP aqui, mas o open-id do launchpad não funciona mais)

Dependendo de quão avesso à dependência você é e do tipo de editor de texto que você está construindo, GtkSourceView adiciona desfazer/refazer entre muitas outras coisas.Vale muito a pena dar uma olhada se você quiser algum dos outros características oferece.

Usar GtkSource

.

  • [Cmnd] + [Z] para desfazer (padrão)
  • [Cmnd] + [Shift] + [Z] para refazer (padrão)
  • [Cmnd] + [Y] para refazer (adicionado manualmente)

exemplo:

#!/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()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top