package ui

type Key int

const (
	KeyNone Key = iota
	Key0
	Key1
	Key2
	Key3
	Key4
	Key5
	Key6
	Key7
	Key8
	Key9
	KeyA
	KeyAlt
	KeyAltGr
	KeyAt
	KeyB
	KeyBack
	KeyBackslash //x2
	KeyBackspace
	KeyBacktick
	KeyButtonA
	KeyButtonB
	KeyButtonL1
	KeyButtonL2
	KeyButtonR1
	KeyButtonR2
	KeyButtonX
	KeyButtonY
	KeyC
	KeyCapsLock
	KeyCircumflex
	KeyCloseBrace
	KeyColon2
	KeyComma
	KeyCommand
	KeyD
	KeyDelete
	KeyDown
	KeyDPadCenter
	KeyDPadDown
	KeyDPadLeft
	KeyDPadRight
	KeyDPadUp
	KeyE
	KeyEnd
	KeyEnter
	KeyEquals
	KeyEscape
	KeyF
	KeyF1
	KeyF2
	KeyF3
	KeyF4
	KeyF5
	KeyF6
	KeyF7
	KeyF8
	KeyF9
	KeyF10
	KeyF11
	KeyF12
	KeyFullstop
	KeyG
	KeyH
	KeyHome
	KeyI
	KeyInsert
	KeyJ
	KeyK
	KeyL
	KeyLeft
	KeyLeftControl
	KeyLeftShift
	KeyLeftWin
	KeyM
	KeyMenu
	KeyMinus
	KeyN
	KeyNumLock
	KeyO
	KeyOpenBrace
	KeyP
	KeyPad0
	KeyPad1
	KeyPad2
	KeyPad3
	KeyPad4
	KeyPad5
	KeyPad6
	KeyPad7
	KeyPad8
	KeyPad9
	KeyPadAsterisk
	KeyPadDelete
	KeyPadEnter
	KeyPadEquals
	KeyPadMinus
	KeyPadPlus
	KeyPadSlash
	KeyPageDown
	KeyPageUp
	KeyPause
	KeyPrintScreen
	KeyQ
	KeyQuote
	KeyR
	KeyRight
	KeyRightControl
	KeyRightShift
	KeyRightWin
	KeyS
	KeyScrollLock
	KeySearch
	KeySelect
	KeySemicolon
	KeySlash
	KeySpace
	KeyStart
	KeyT
	KeyTab
	KeyThumbL
	KeyThumbR
	KeyTilde
	KeyU
	KeyUp
	KeyV
	KeyVolumeDown
	KeyVolumeUp
	KeyW
	KeyX
	KeyY
	KeyZ
)

type KeyState map[Key]bool

func (s KeyState) Modifiers() KeyModifier {
	var mods KeyModifier
	if s[KeyAlt] || s[KeyAltGr] {
		mods |= KeyModifierAlt
	}
	if s[KeyLeftControl] || s[KeyRightControl] {
		mods |= KeyModifierControl
	}
	if s[KeyLeftShift] || s[KeyRightShift] {
		mods |= KeyModifierShift
	}
	if s[KeyLeftWin] || s[KeyRightWin] || s[KeyCommand] {
		mods |= KeyModifierOSCommand
	}
	return mods
}