mirror of
https://github.com/ksherlock/prez.git
synced 2025-02-20 08:29:03 +00:00
KeyEquivalent typed structure
This commit is contained in:
parent
3de5be69e4
commit
41ebc1ba0d
80
key_equivalent.py
Normal file
80
key_equivalent.py
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
# key equivalants
|
||||||
|
import enum
|
||||||
|
from utils import *
|
||||||
|
import struct
|
||||||
|
|
||||||
|
__all__ = ["KeyEquiv"]
|
||||||
|
|
||||||
|
def export_enum(cls):
|
||||||
|
global __all__
|
||||||
|
|
||||||
|
members = cls.__members__
|
||||||
|
globals().update(members)
|
||||||
|
if __all__ != None: __all__.extend(list(members))
|
||||||
|
return cls
|
||||||
|
|
||||||
|
@export_enum
|
||||||
|
class Keys(enum.Flag):
|
||||||
|
appleKey = 0x0100 # set if Apple key down
|
||||||
|
shiftKey = 0x0200 # set if shift key down
|
||||||
|
capsLock = 0x0400 # set if caps lock key down
|
||||||
|
optionKey = 0x0800 # set if option key down
|
||||||
|
controlKey = 0x1000 # set if Control key down
|
||||||
|
keyPad = 0x2000 # set if keypress from key pad
|
||||||
|
|
||||||
|
|
||||||
|
# See: TB Volume 3, 28-47
|
||||||
|
|
||||||
|
# def KeyEquivalent(keys, keyModifiers=None, keyCareBits=None):
|
||||||
|
|
||||||
|
#define KeyEquiv array[1]{ char; char; _mybase_ word; _mybase_ word; }
|
||||||
|
class KeyEquivalent:
|
||||||
|
|
||||||
|
"""
|
||||||
|
keys: ascii character(s) for the upper and lower-case keys.
|
||||||
|
keyModifiers: appleKey|shiftKey|capsLock|optionKey|controlKey|keyPad
|
||||||
|
keyCareBits: default = keyModifiers
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
__slots__ = ("keys", "keyModifiers", "keyCareBits")
|
||||||
|
|
||||||
|
def __init__(self, keys, keyModifiers=None, keyCareBits=None):
|
||||||
|
if keyModifiers == None: keyModifiers = 0
|
||||||
|
elif type(keyModifiers) == Keys: keyModifiers = keyModifiers.value
|
||||||
|
elif type(keyModifiers) == int: pass
|
||||||
|
else:
|
||||||
|
raise TypeError("KeyEquivalent: bad modifier type: {}".format(type(keyModifiers)))
|
||||||
|
|
||||||
|
if keyCareBits == None: keyCareBits = keyModifiers
|
||||||
|
elif type(keyCareBits) == Keys: keyCareBits = keyCareBits.value
|
||||||
|
elif type(keyCareBits) == int: pass
|
||||||
|
else:
|
||||||
|
raise TypeError("KeyEquivalent: bad modifier type: {}".format(type(keyCareBits)))
|
||||||
|
|
||||||
|
|
||||||
|
if type(keys) not in (bytes, str):
|
||||||
|
raise TypeError("KeyEquivalent: bad keys type: {}".format(type(keys)))
|
||||||
|
|
||||||
|
keys = str_to_bytes(keys)
|
||||||
|
if len(keys) == 1: keys *= 2
|
||||||
|
|
||||||
|
if len(keys) != 2:
|
||||||
|
raise ValueError("KeyEquivalent: bad keys: {}".format(keys))
|
||||||
|
|
||||||
|
self.keys = keys
|
||||||
|
self.keyModifiers = keyModifiers
|
||||||
|
self.keyCareBits = keyModifiers
|
||||||
|
|
||||||
|
# return (keys, keyModifiers, keyCareBits)
|
||||||
|
|
||||||
|
def __bytes__(self):
|
||||||
|
return struct.pack("<BBHH", *self.keys, self.keyCareBits, self.keyModifiers)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return "{{ {}, {}, 0x{:04x}, 0x{:04x} }}".format(
|
||||||
|
format_char(self.keys[0]),
|
||||||
|
format_char(self.keys[1]),
|
||||||
|
self.keyModifiers,
|
||||||
|
self.keyCareBits
|
||||||
|
)
|
4
utils.py
4
utils.py
@ -42,6 +42,10 @@ def format_string(bstring, quote=True):
|
|||||||
if quote: return '"' + s + '"'
|
if quote: return '"' + s + '"'
|
||||||
return s
|
return s
|
||||||
|
|
||||||
|
def format_char(x):
|
||||||
|
c = _map.get(x, chr(x))
|
||||||
|
return "'" + c + "'"
|
||||||
|
|
||||||
def multi_format_string(bstring, indent=""):
|
def multi_format_string(bstring, indent=""):
|
||||||
q = '"'
|
q = '"'
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user