As usual this process is solid. I made it about halfway through this process before getting lost. I will remember to reference this in the future. Hopefully will get time to make the change soon.
On Friday, September 25, 2015 at 8:01:05 AM UTC-4, Edward K. Ream wrote: > > On Thu, Sep 24, 2015 at 10:58 AM, john lunzer <lun...@gmail.com > <javascript:>> wrote: > > I'm finding myself stumped by the KeyHandler class. One thing that the >> autocomplete Qt popup doesn't handle right now is PgUp and PgDown, both of >> these keybinding exit the popup. I was trying to fix this but I'm having >> difficulty figuring out where to do this. >> >> Any guidance would be much appreciated. >> > > No doubt about it, key handling is complex. I never remember the > details. > > Here is how I found the interesting code. I recommend variations of this > technique to find relevant code. > > 1. I started with the gui *independent* code in leoPy.leo#Code-->Gui base > classes-->@file leoKeys.py-->class AutoCompleterClass > > 2. I knew there was an ivar that tells whether to use inline completion or > a Qt popup. I found the use_qcompleter ivar in the ctor. Searching for > usages of that ivar, I eventually found ac.show_completion_list, which has > this code: > > if self.use_qcompleter: > # Put the completions in the QListView. > if self.qw: > self.qw.show_completions(tabList) > > 3. The qw ivar is the Qt-related widget, so I searched for "def > show_completions". I found this class: > > leoPy.leo#re: qt completer-->class LeoQListWidget(QListWidget) > > Now we're getting somewhere :-) > > BTW, I could have found this class another way. I knew that this > Qt-related class existed somewhere in this tree: leoPy.leo#Code-->Qt gui, > but I had forgotten which file. So an alternate way of finding this class > would have been to look for all the classes in the Qt-related tree, that is > leoPy.leo#Code-->Qt gui > > Anyway, the relevant method of the LeoQListWidget class is: > > def keyPressEvent(self, event): > '''Handle a key event from QListWidget.''' > trace = False and not g.unitTesting > c = self.leo_c > w = c.frame.body.wrapper > qt = QtCore.Qt > key = event.key() > if event.modifiers() != qt.NoModifier and not event.text(): > # A modifier key on it's own. > pass > elif key in (qt.Key_Up, qt.Key_Down): > QtWidgets.QListWidget.keyPressEvent(self, event) > elif key == qt.Key_Tab: > if trace: g.trace('<tab>') > self.tab_callback() > elif key in (qt.Key_Enter, qt.Key_Return): > if trace: g.trace('<return>') > self.select_callback() > else: > # Pass all other keys to the autocompleter > # via the event filter. > w.ev_filter.eventFilter(obj=self, event=event) > > So this is where the change should be made. *Important*: the default > eventFilter method, that is, LeoQtEventFilter.eventFilter, is insanely > complicated. Don't change it! So you have to special case PageUp and > PageDown in lqlw.keyPressEvent. > > To repeat, I *never *try to remember implementation details. I had > forgotten that LeoQListWidget.keyPressEvent event existed. The only things > I knew at the start was: > > 1. The gui-independent autocompleter in @file leoKeys.py-->class > AutoCompleterClass > has one or more ivars that would tell when to use Qt popup completions > rather than inline completions. > > 2. There was a Qt-specific class that handles Qt popup completions. This > class is defined somewhere in the tree whose root is leoPy.leo#Code-->Qt > gui. > > 3. > Changing LeoQtEventFilter.eventFilter should be a last resort. > > HTH. Please feel free to ask more questions. > > Edward > -- You received this message because you are subscribed to the Google Groups "leo-editor" group. To unsubscribe from this group and stop receiving emails from it, send an email to leo-editor+unsubscr...@googlegroups.com. To post to this group, send email to leo-editor@googlegroups.com. Visit this group at http://groups.google.com/group/leo-editor. For more options, visit https://groups.google.com/d/optout.