classKeyCombination(serializemixin.SerializeMixin,QtCore.QKeyCombination):"""Stores a combination of a key with optional modifiers."""def__init__(self,*args,**kwargs):matchargs:case(str(),)ifargs[0]inMODIFIERS.inverse.values():mods=args[0].split("+")qtmod=functools.reduce(or_,[MODIFIERS[m]forminmods])super().__init__(qtmod,Keys.No)returncase(str(),):*mods,btn=args[0].split("+")# get modifilerqtmod=(functools.reduce(or_,[MODIFIERS[m]forminmods])ifmodselseMod.NoModifier)# get buttonifbtnin_SYMBOLS:btn=_SYMBOLS[btn]ifbtn.isalnum():btn=btn.upper()qtkey=getattr(Key,f"Key_{btn}")ifbtn!="{}"elseKeys.Anysuper().__init__(qtmod,qtkey)case(QtCore.QEvent(),):modifier=args[0].modifiers()modifier^=Mod.KeypadModifierkey=args[0].key()ifkeyinMODIFIER_KEYS:# modifier onlykey=Keys.Nosuper().__init__(key,modifier)case_:super().__init__(*args,**kwargs)def__eq__(self,other):ifisinstance(other,str|Key):other=KeyCombination(other)returnsuper().__eq__(other)def__add__(self,other):fromprettyqtimportguireturngui.KeySequence(self,other)def__repr__(self):returnget_repr(self,self.key(),self.keyboardModifiers())defis_typing(self)->bool:"""True if key is a letter or number."""mod_ok=self.keyboardModifiers()in(Mod.NoModifier,Mod.ShiftModifier)key=self.key()key_ok=(Key.Key_Exclam<=key<=Key.Key_ydiaeresisorKeys.ALPHA<=key<=Keys.OMEGAorKeys.CYR_A<=key<=Keys.CYR_YA)returnmod_okandkey_okdefis_moving(self)->bool:"""True if arrows are pushed."""returnself.key()inARROW_KEYSdefis_moving_func(self)->bool:"""True if function arrows are pushed."""returnself.key()inFUNC_ARROW_KEYSdefhas_modifier(self,modifier:constants.KeyboardModifierStr)->bool:"""True if keycombo contains modifier."""returnbool(self.keyboardModifiers()&constants.KEYBOARD_MODIFIERS[modifier])defhas_key(self)->bool:"""True if non-modifier key is pressed."""returnself.key()!=Keys.Nodefget_key(self)->constants.KeyStr:returnconstants.KEY.inverse[self.key()]defget_modifiers(self)->list[constants.KeyboardModifierStr]:returnconstants.KEYBOARD_MODIFIERS.get_list(self.keyboardModifiers())
defhas_modifier(self,modifier:constants.KeyboardModifierStr)->bool:"""True if keycombo contains modifier."""returnbool(self.keyboardModifiers()&constants.KEYBOARD_MODIFIERS[modifier])
defis_typing(self)->bool:"""True if key is a letter or number."""mod_ok=self.keyboardModifiers()in(Mod.NoModifier,Mod.ShiftModifier)key=self.key()key_ok=(Key.Key_Exclam<=key<=Key.Key_ydiaeresisorKeys.ALPHA<=key<=Keys.OMEGAorKeys.CYR_A<=key<=Keys.CYR_YA)returnmod_okandkey_ok