API Advice needed: Mouse Shortcuts Database

Rick Stockton rickstockton at reno-computerhelp.com
Sat Jan 7 22:18:05 GMT 2012

Before I begin- I am extremely interested in any upcoming re-factor 
scheme, which could 'share' as much code as possible (between QtGui and 
Widget-based shortcuts) at a 'higher" level.

With that said, however, my "little" project won't be sharing very much 
of the current code, because nearly all existing code is INTIMATELY tied 
into the fact that KeySequences (and their overrides, when necessary) 
are tied to the keyboard. I'll 'friend' those classes, when necessary, 
to get at things which can be shared immediately. The header file 
'qkeysequence.h', will be included frequently to define 'standard keys' 
-- or should I split out that enumeration into another file, without all 
of the Method definitions ???

Anyway, her is my tentative DB design.
Mouse Shortcuts will be organized into an 2D array of 
MouseShortcutButtonSets. The first index is for the type of mouse event:
    0 == single-click
    1 == double-click

The second index of the Table is the shift index of the responsible 
'Button Number'. (i.e., the amount by which the Qt::MouseButton value 
which was responsible for the event gets shifted to the right, in order 
to result in value 'x1'== 0x00000001. This is, basically, the original 
(int) value of the 'raw button number' which we received, and translated 
_into_ a Qt::MouseButton value, within one of our platform plugins. In 
Qt 5.0, the size in this Dimension includes integers from 0 
(Qt::LeftButton) to 27 (Qt::MaxMouseButton).

Each Array Cell shall be the entry point of a QMultiHash() hashmap, or 
maybe just a list. The thing which we need to find quickly in the set of 
shortcuts for a given mouse click/doubleclick is the entries which 
correspond to a particular shortcut 'owner' -- and this is PROBABLY best 
done by using a QMultiHash().

*** question *** : Or, is the number of alternative 'owners' for a given 
mouse click, or double-click, likely to be so small that I should simply 
make it a linked list, inspected from start-to-finish?

Anyway, once we have the owner, we have a byte of bit flags (mostly unused):
   value in the lowest bit: whether the shortcut is currently Disabled 
(0 == Enabled, 1 == Disabled)
   value next bit: whether Qt::LeftButton is being held down, concurrent 
with the click (or double-click) of another button. 0 == No, 1 == Yes)
   bit 2: whether Qt::RightButton is beng held down concurrently (0 == 
No, 1 == Yes)
   Upper bits 3-7 are available for future use.

This ability to use Qt::LeftButton, Qt::RightButton as 'Modifier 
BUTTONS' _for other buttons_ increases the number of possible mouse 
shortcuts by quite a lot. For example, using just Qt::BackButton, you 
can have:
   Shortcut A == single-click of Qt::BackButton; (And THIS ONE will 
often already be in use, as a default 'Back'  action which you want to 
keep unchanged.)
But all these others are new, and they're not difficult for people with 
fully-functional hands to Press:
   Shortcut B == double-click of Qt::BackButton;
   Shortcut C == single-click of Qt::BackButton with Qt::LeftButton held 
   Shortcut D == double-click of Qt::BackButton with Qt::RightButton 
held down;
   Shortcut E == single-click of Qt::BackButton with Qt::LeftButton held 
   Shortcut F == double-click of Qt::BackButton with Qt::MouseButton2 
held down;
   Shortcut G == single-click of Qt::BackButton with BOTH Qt::LeftButton 
and Qt::RightButton held down;
   Shortcut H == double-click of Qt::BackButton with BOTH Qt::LeftButton 
and Qt::RightButton held down.

I DO NOT see any need for shortcut 'invocation sequences' with keyboard 
and mouse combined. The requests are for one-handed Shortcuts, done ONLY 
with the mouse. (Not needing a second hand). There will be, however, the 
need for a Mouse Shortcut 'OverRideKey'. I will make this user-settable, 
but I plan to insist that the permissible values be ONLY one of the 
modifier keys. That's because modifier key status is given to us with 
the button Event, right in the plugin.

I will probably have to duplicate the 'owner' value in each shortcut 
entry. I might also need to keep track of the current Window on which 
I'm trying to execute the shortcut, if they're supposed to 'escalate' 
into parent widdgets and parent GUI elements auto-magically. This leads 
to *** questions ***

I really don't understand the concept of 'shortcut owner', especially 
with regard to Application-Wide shortcuts. If a shortcut is NOT 
'Application-Wide', will it try to run it's action on each of a Widget's 
parents? Or does the shortcut need to have a duplicate created into each 
viable parent, differing only in the 'Widget'? And how SHOULD I handle 
escalation from a GUI MouseArea?

My last question: I'm also unclear whether each shortcut in the 'map' 
should be associated ONLY with the result of sending a Signal or whether 
they should also have the option of linking to an Action directly.
- - - -

Thanks in advance. Yes, I can 'learn' by reading code, but my results 
will be faster, BETTER with help to go from Concept to Design to Code 
... rather than reading the code, trying to extract a Design, and 
GUESSING at the concepts behind it. So, please tell me how shortcuts 
'want' to work, in a few sentences.

More information about the kde-core-devel mailing list