2008-09-16 5 views
9

Я пытаюсь сохранить зависимости до минимума для программы, в которую я вношу свой вклад, это небольшой текстовый редактор.Отменить с GTK TextView

GTK Textview, похоже, не имеет встроенной функции отмены. Есть ли какая-то эталонная реализация, которой я до сих пор не встречался? Все ли записи своей собственной функции отмены для своих виджетов TextView?

Я буду рад любому образцу кода - наиболее счастлив от кода примера python, так как наш проект находится в python.

ответ

3

Насколько я знаю, GTK TextView не включает функцию отмены. Поэтому, хотя я не знаком с библиотекой GTK Python, я бы подумал, что у нее ее нет.

Проект Ruby-GNOME2 имеет sample text editor, который имеет функциональные возможности отмены/повтора. В основном они подключаются к сигналам insert_text и delete_range виджета TextView и записывают события и связанные данные в список.

4

В зависимости от того, насколько вы зависимы от зависимостей и какой текстовый редактор вы строите, GtkSourceView добавляет отмену/повторение среди многих других вещей. Очень стоит посмотреть, хотите ли вы некоторые из других features, которые он предлагает.

5

как follwow вверх: я портировал механизм отката gtksourceview на Python: http://bitbucket.org/tiax/gtk-textbuffer-with-undo/

служит заменой для gtksourceview-х отменить

(ОП здесь, но Launchpad открытым идентификатор не работает больше)

0

Использование GtkSource

.

  • [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() 
Смежные вопросы