2008-09-16 26 views
9

私が貢献しているプログラムの依存関係を最小限に抑えようとしていますが、これは小さなテキストエディタです。GTK TextViewで元に戻す

GTK Textviewには、組み込みの元に戻す機能が付属していないようです。これまでに欠けていたリファレンス実装はありますか?誰もがTextViewウィジェット用に独自の元に戻す機能を書いていますか?

私たちのプロジェクトがPythonで書かれているので、私はサンプルコードについては満足しています。

答えて

3

私が知る限り、GTK TextViewには元に戻す機能はありません。だから私はPythonのGTKライブラリに慣れていないが、私はそれがないと思うだろう。

Ruby-GNOME2プロジェクトには、元に戻す/やり直し機能を持つsample text editorがあります。基本的にTextViewウィジェットのinsert_textとdelete_range信号に接続し、イベントと関連データをリストに記録しています。

4

依存関係をどのようにしているのか、作成しているテキストエディタの種類によっては、GtkSourceViewは他の多くのものにアンドゥ/リドゥを追加します。あなたが他のもののいくつかをしたい場合は、非常に価値があるfeaturesがあります。 follwowアップとして

5

:私は、Pythonにgtksourceviewのアンドゥ・メカニズムを移植:ドロップイン置換gtksourceview年代については、こちら(OPを

を元に戻すが、オープン-idが動作しませんランチパッドとしてhttp://bitbucket.org/tiax/gtk-textbuffer-with-undo/

がありますもう)

0

使用GtkSource

  • https://lazka.github.io/pgi-docs/GtkSource-3.0/classes.html
    • 元に戻すための[Cmndの] + [Z](デフォルト)
    • [Cmndの] +やり直しのために再実行のために[SHIFT] + [Z](デフォルト)
    • [Cmndの] + [Y]( )手動で追加

    例:

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