97 lines
2.7 KiB
Python
97 lines
2.7 KiB
Python
|
|
# Python imports
|
||
|
|
|
||
|
|
# Lib imports
|
||
|
|
import gi
|
||
|
|
gi.require_version('Gtk', '3.0')
|
||
|
|
from gi.repository import Gdk
|
||
|
|
from gi.repository import Gtk
|
||
|
|
from gi.repository import GLib
|
||
|
|
|
||
|
|
# Application imports
|
||
|
|
from .list_box import ListBox
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
class TelescopeSearchEntryException(Exception):
|
||
|
|
...
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
class SearchEntry(Gtk.SearchEntry):
|
||
|
|
def __init__(self):
|
||
|
|
super(SearchEntry, self).__init__()
|
||
|
|
|
||
|
|
|
||
|
|
self._setup_styling()
|
||
|
|
self._setup_signals()
|
||
|
|
self._subscribe_to_events()
|
||
|
|
self._load_widgets()
|
||
|
|
|
||
|
|
|
||
|
|
def _setup_styling(self):
|
||
|
|
...
|
||
|
|
|
||
|
|
def _setup_signals(self):
|
||
|
|
self.connect("search-changed", self._search_changed)
|
||
|
|
self.connect("key-press-event", self._key_press_event)
|
||
|
|
self.connect("key-release-event", self._key_release_event)
|
||
|
|
|
||
|
|
def _subscribe_to_events(self):
|
||
|
|
...
|
||
|
|
|
||
|
|
def _load_widgets(self):
|
||
|
|
...
|
||
|
|
|
||
|
|
def _key_press_event(self, widget, eve):
|
||
|
|
modifiers = Gdk.ModifierType(eve.get_state() & ~Gdk.ModifierType.LOCK_MASK)
|
||
|
|
is_control = modifiers & Gdk.ModifierType.CONTROL_MASK
|
||
|
|
is_shift = modifiers & Gdk.ModifierType.SHIFT_MASK
|
||
|
|
keyname = Gdk.keyval_name(eve.keyval).lower()
|
||
|
|
char_str = chr( Gdk.keyval_to_unicode(eve.keyval) )
|
||
|
|
|
||
|
|
if keyname == "up":
|
||
|
|
self.move_row_selection_up()
|
||
|
|
return True
|
||
|
|
elif keyname == "down":
|
||
|
|
self.move_row_selection_down()
|
||
|
|
return True
|
||
|
|
|
||
|
|
|
||
|
|
def _key_release_event(self, widget, eve):
|
||
|
|
modifiers = Gdk.ModifierType(eve.get_state() & ~Gdk.ModifierType.LOCK_MASK)
|
||
|
|
is_control = modifiers & Gdk.ModifierType.CONTROL_MASK
|
||
|
|
is_shift = modifiers & Gdk.ModifierType.SHIFT_MASK
|
||
|
|
keyname = Gdk.keyval_name(eve.keyval).lower()
|
||
|
|
char_str = chr( Gdk.keyval_to_unicode(eve.keyval) )
|
||
|
|
|
||
|
|
if is_control:
|
||
|
|
if char_str == "b":
|
||
|
|
self.hide()
|
||
|
|
|
||
|
|
return True
|
||
|
|
|
||
|
|
if keyname in ["enter", "return"]:
|
||
|
|
self.activate_row()
|
||
|
|
self.hide()
|
||
|
|
|
||
|
|
return True
|
||
|
|
|
||
|
|
def _search_changed(self, widget):
|
||
|
|
self.search_changed(widget)
|
||
|
|
|
||
|
|
def hide(self):
|
||
|
|
raise TelescopeSearchEntryException("SearchEntry must have 'hide' monkey patched...")
|
||
|
|
|
||
|
|
def search_changed(self, widget):
|
||
|
|
raise TelescopeSearchEntryException("SearchEntry must have 'search_changed' monkey patched...")
|
||
|
|
|
||
|
|
def activate_row(self):
|
||
|
|
raise TelescopeSearchEntryException("SearchEntry must have 'activate_row' monkey patched...")
|
||
|
|
|
||
|
|
def move_row_selection_up(self):
|
||
|
|
raise TelescopeSearchEntryException("SearchEntry must have 'move_row_selection_up' monkey patched...")
|
||
|
|
|
||
|
|
def move_row_selection_down(self):
|
||
|
|
raise TelescopeSearchEntryException("SearchEntry must have 'move_row_selection_down' monkey patched...")
|
||
|
|
|