InputHandler.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package giu
  2. // input menager is used to register a keyboard shortcuts in an app.
  3. // Shortcut represents a keyboard shortcut.
  4. type Shortcut struct {
  5. Key Key
  6. Modifier Modifier
  7. Callback func()
  8. IsGlobal ShortcutType
  9. }
  10. // WindowShortcut represents a window-level shortcut
  11. // could be used as an argument to (*Window).RegisterKeyboardShortcuts.
  12. type WindowShortcut struct {
  13. Key Key
  14. Modifier Modifier
  15. Callback func()
  16. }
  17. // ShortcutType represens a type of shortcut (global or local).
  18. type ShortcutType bool
  19. const (
  20. // GlobalShortcut is registered for all the app.
  21. GlobalShortcut ShortcutType = true
  22. // LocalShortcut is registered for current window only.
  23. LocalShortcut ShortcutType = false
  24. )
  25. // InputHandler is an interface which needs to be implemented
  26. // by user-definied input handlers.
  27. type InputHandler interface {
  28. // RegisterKeyboardShortcuts adds a specified shortcuts into input handler
  29. RegisterKeyboardShortcuts(...Shortcut)
  30. // UnregisterKeyboardShortcuts removes iwndow shourtcuts from input handler
  31. UnregisterWindowShortcuts()
  32. // Handle handles a shortcut
  33. Handle(Key, Modifier)
  34. }
  35. // --- Default implementation of giu input manager ---
  36. var _ InputHandler = &inputHandler{}
  37. func newInputHandler() *inputHandler {
  38. return &inputHandler{
  39. shortcuts: make(map[keyCombo]*callbacks),
  40. }
  41. }
  42. type inputHandler struct {
  43. shortcuts map[keyCombo]*callbacks
  44. }
  45. func (i *inputHandler) RegisterKeyboardShortcuts(s ...Shortcut) {
  46. for _, shortcut := range s {
  47. combo := keyCombo{shortcut.Key, shortcut.Modifier}
  48. cb, isRegistered := i.shortcuts[combo]
  49. if !isRegistered {
  50. cb = &callbacks{}
  51. }
  52. if shortcut.IsGlobal {
  53. cb.global = shortcut.Callback
  54. } else {
  55. cb.window = shortcut.Callback
  56. }
  57. i.shortcuts[combo] = cb
  58. }
  59. }
  60. func (i *inputHandler) UnregisterWindowShortcuts() {
  61. for _, s := range i.shortcuts {
  62. s.window = nil
  63. }
  64. }
  65. func (i *inputHandler) Handle(key Key, mod Modifier) {
  66. for combo, cb := range i.shortcuts {
  67. if combo.key != key || combo.modifier != mod {
  68. continue
  69. }
  70. if cb.window != nil {
  71. cb.window()
  72. } else if cb.global != nil {
  73. cb.global()
  74. }
  75. }
  76. }
  77. type keyCombo struct {
  78. key Key
  79. modifier Modifier
  80. }
  81. type callbacks struct {
  82. global func()
  83. window func()
  84. }