Question

J'essaie de réduire au minimum les dépendances pour un programme auquel je contribue, c'est un petit éditeur de texte.

GTK Textview ne semble pas être doté d’une fonction d’annulation intégrée. Existe-t-il une implémentation de référence qui me manque jusqu'à présent? Chacun écrit-il sa propre fonction d'annulation pour ses widgets TextView?

Je serai heureux de tout exemple de code - plus particulièrement du code exemple python, car notre projet est en python.

Était-ce utile?

La solution

Autant que je sache, GTK TextView n’inclut pas une fonction d'annulation. Ainsi, bien que je ne connaisse pas la bibliothèque GTK de Python, je pense qu’elle n’en a pas.

Le projet Ruby-GNOME2 a un exemple d'éditeur de texte qui a la fonctionnalité annuler / rétablir. En gros, ils se connectent aux signaux insert_text et delete_range du widget TextView et enregistrent les événements et les données associées dans une liste.

Autres conseils

Par la suite: j'ai porté le mécanisme d'annulation de gtksourceview en python: http: / /bitbucket.org/tiax/gtk-textbuffer-with-undo/

sert de remplacement instantané à l'annulation de gtksourceview

(OP ici, mais le tableau de bord open-id ne fonctionne plus)

Selon votre degré d'aversion à la dépendance et le type d'éditeur de texte que vous construisez, GtkSourceView ajoute des fonctions d'annulation / de restauration parmi beaucoup d'autres choses. Cela vaut vraiment la peine de regarder si vous souhaitez utiliser certaines des fonctionnalités proposées.

Utiliser GtkSource

.

  • [Cmnd] + [Z] pour annuler (par défaut)
  • [Cmnd] + [Maj] + [Z] pour rétablir (par défaut)
  • [Cmnd] + [Y] pour refaire (ajouté manuellement)

exemple:

#!/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()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top