Отменить с помощью GTK TextView
-
09-06-2019 - |
Вопрос
Я пытаюсь свести зависимости к минимуму для программы, в которую я вношу свой вклад, это небольшой текстовый редактор.
GTK Textview, похоже, не имеет встроенной функции отмены.Есть ли какая-нибудь эталонная реализация, которой мне до сих пор не хватало?Все ли пишут свою собственную функцию отмены для своих виджетов TextView?
Я буду рад любому образцу кода - больше всего рад образцу кода на python, так как наш проект написан на python.
Решение
Насколько я знаю, GTK TextView не включает функцию отмены.Поэтому, хотя я не знаком с библиотекой GTK Python, я бы подумал, что в ней ее нет.
Проект Ruby-GNOME2 имеет пример текстового редактора это имеет функцию отмены / повтора.В основном они подключаются к сигналам insert_text и delete_range виджета TextView и записывают события и связанные с ними данные в список.
Другие советы
в качестве продолжения:Я портировал механизм отмены gtksourceview на python: http://bitbucket.org/tiax/gtk-textbuffer-with-undo/
служит заменой для отмены gtksourceview
(OP здесь, но launchpad open-id больше не работает)
В зависимости от того, насколько вы не склонны к зависимостям и какой текстовый редактор вы создаете, GtkSourceView (просмотр GtkSourceView) добавляет отмену / повтор среди многих других вещей.Очень стоит посмотреть, если вы хотите что-то другое возможности он предлагает.
Используйте GtkSource
- https://wiki.gnome.org/Projects/GtkSourceView
- https://lazka.github.io/pgi-docs/GtkSource-3.0/
- 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()