from gi.repository import GObject, Gdk, Gtk, Xed
_MODS = Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK
_UP = (Gdk.KEY_Up, Gdk.KEY_KP_Up)
_DOWN = (Gdk.KEY_Down, Gdk.KEY_KP_Down)
class MoveLinesViewActivatable(GObject.Object, Xed.ViewActivatable):
__gtype_name__ = "MoveLinesViewActivatable"
view = GObject.Property(type=Xed.View)
def __init__(self):
GObject.Object.__init__(self)
self._handler = None
self._nparams = None
def do_activate(self):
# Signal arity
self._nparams = len(GObject.signal_query(
"move-lines", self.view.__gtype__).param_types)
self._handler = self.view.connect("key-press-event", self._on_key)
def do_deactivate(self):
if self._handler:
self.view.disconnect(self._handler)
self._handler = None
def _on_key(self, view, event):
mods = event.state & Gtk.accelerator_get_default_mod_mask()
if mods != _MODS:
return False
if event.keyval in _UP:
down = False
elif event.keyval in _DOWN:
down = True
else:
return False
if not view.get_editable():
return True
if self._nparams == 1:
# GtkSourceView 4
view.emit("move-lines", down)
else:
# GtkSourceView 3
view.emit("move-lines", False, 1 if down else -1)
return True