Files
dzgui/dzgui/views/mixins/cursor_mixin.py
T

70 lines
2.1 KiB
Python

from dzgui.const.enum import CursorPosition
from dzgui.const.constants import SEPARATOR
from dzgui.util.keys import is_ctrl_mask
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, GLib, Gdk, GObject, Pango # noqa E402
class CursorMixin:
def _vim_nav(self, event: Gdk.EventKey) -> bool:
match event.keyval:
case Gdk.KEY_g:
self._move_cursor(CursorPosition.TOP)
return True
case Gdk.KEY_G:
self._move_cursor(CursorPosition.BOTTOM)
return True
case Gdk.KEY_j:
self._move_cursor(CursorPosition.DOWN)
return True
case Gdk.KEY_k:
self._move_cursor(CursorPosition.UP)
return True
case Gdk.KEY_l | Gdk.KEY_Right:
if is_ctrl_mask(event):
return False
self.emitter.emit("request_button_box_focus") # type: ignore
return True
case _:
return False
def _move_cursor(self, position: CursorPosition) -> bool:
model = self.get_model() # type: ignore
if len(model) > 0:
end = len(model) - 1
else:
return False
try:
cur_row = self.get_focused_row_index() # type: ignore
except Exception:
return False
if position == CursorPosition.DOWN:
if cur_row == end:
return True
dest = cur_row + 1
if model[dest][0] == SEPARATOR:
dest += 1
if position == CursorPosition.UP:
if cur_row == 0:
return True
dest = cur_row - 1
if model[dest][0] == "SEPARATOR":
dest -= 1
if position == CursorPosition.TOP:
if cur_row == 0:
return True
dest = 0
if position == CursorPosition.BOTTOM:
if cur_row == end:
return True
dest = end
path = Gtk.TreePath.new_from_indices([dest])
self.set_cursor(path) # type: ignore
return True