NSMenu.odin 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package objc_Foundation
  2. import "base:builtin"
  3. import "base:intrinsics"
  4. KeyEquivalentModifierFlag :: enum UInteger {
  5. CapsLock = 16, // Set if Caps Lock key is pressed.
  6. Shift = 17, // Set if Shift key is pressed.
  7. Control = 18, // Set if Control key is pressed.
  8. Option = 19, // Set if Option or Alternate key is pressed.
  9. Command = 20, // Set if Command key is pressed.
  10. NumericPad = 21, // Set if any key in the numeric keypad is pressed.
  11. Help = 22, // Set if the Help key is pressed.
  12. Function = 23, // Set if any function key is pressed.
  13. }
  14. KeyEquivalentModifierMask :: distinct bit_set[KeyEquivalentModifierFlag; UInteger]
  15. // Used to retrieve only the device-independent modifier flags, allowing applications to mask off the device-dependent modifier flags, including event coalescing information.
  16. KeyEventModifierFlagDeviceIndependentFlagsMask := transmute(KeyEquivalentModifierMask)_KeyEventModifierFlagDeviceIndependentFlagsMask
  17. @(private) _KeyEventModifierFlagDeviceIndependentFlagsMask := UInteger(0xffff0000)
  18. MenuItemCallback :: proc "c" (unused: rawptr, name: SEL, sender: ^Object)
  19. @(objc_class="NSMenuItem")
  20. MenuItem :: struct {using _: Object}
  21. @(objc_type=MenuItem, objc_name="alloc", objc_is_class_method=true)
  22. MenuItem_alloc :: proc "c" () -> ^MenuItem {
  23. return msgSend(^MenuItem, MenuItem, "alloc")
  24. }
  25. @(objc_type=MenuItem, objc_name="registerActionCallback", objc_is_class_method=true)
  26. MenuItem_registerActionCallback :: proc "c" (name: cstring, callback: MenuItemCallback) -> SEL {
  27. s := string(name)
  28. n := len(s)
  29. sel: SEL
  30. if n > 0 && s[n-1] != ':' {
  31. col_name := intrinsics.alloca(n+2, 1)
  32. builtin.copy(col_name[:n], s)
  33. col_name[n] = ':'
  34. col_name[n+1] = 0
  35. sel = sel_registerName(cstring(col_name))
  36. } else {
  37. sel = sel_registerName(name)
  38. }
  39. if callback != nil {
  40. class_addMethod(intrinsics.objc_find_class("NSObject"), sel, auto_cast callback, "v@:@")
  41. }
  42. return sel
  43. }
  44. @(objc_type=MenuItem, objc_name="init")
  45. MenuItem_init :: proc "c" (self: ^MenuItem) -> ^MenuItem {
  46. return msgSend(^MenuItem, self, "init")
  47. }
  48. @(objc_type=MenuItem, objc_name="setKeyEquivalentModifierMask")
  49. MenuItem_setKeyEquivalentModifierMask :: proc "c" (self: ^MenuItem, modifierMask: KeyEquivalentModifierMask) {
  50. msgSend(nil, self, "setKeyEquivalentModifierMask:", modifierMask)
  51. }
  52. @(objc_type=MenuItem, objc_name="keyEquivalentModifierMask")
  53. MenuItem_keyEquivalentModifierMask :: proc "c" (self: ^MenuItem) -> KeyEquivalentModifierMask {
  54. return msgSend(KeyEquivalentModifierMask, self, "keyEquivalentModifierMask")
  55. }
  56. @(objc_type=MenuItem, objc_name="setSubmenu")
  57. MenuItem_setSubmenu :: proc "c" (self: ^MenuItem, submenu: ^Menu) {
  58. msgSend(nil, self, "setSubmenu:", submenu)
  59. }
  60. @(objc_class="NSMenu")
  61. Menu :: struct {using _: Object}
  62. @(objc_type=Menu, objc_name="alloc", objc_is_class_method=true)
  63. Menu_alloc :: proc "c" () -> ^Menu {
  64. return msgSend(^Menu, Menu, "alloc")
  65. }
  66. @(objc_type=Menu, objc_name="init")
  67. Menu_init :: proc "c" (self: ^Menu) -> ^Menu {
  68. return msgSend(^Menu, self, "init")
  69. }
  70. @(objc_type=Menu, objc_name="initWithTitle")
  71. Menu_initWithTitle :: proc "c" (self: ^Menu, title: ^String) -> ^Menu {
  72. return msgSend(^Menu, self, "initWithTitle:", title)
  73. }
  74. @(objc_type=Menu, objc_name="addItem")
  75. Menu_addItem :: proc "c" (self: ^Menu, item: ^MenuItem) {
  76. msgSend(nil, self, "addItem:", item)
  77. }
  78. @(objc_type=Menu, objc_name="addItemWithTitle")
  79. Menu_addItemWithTitle :: proc "c" (self: ^Menu, title: ^String, selector: SEL, keyEquivalent: ^String) -> ^MenuItem {
  80. return msgSend(^MenuItem, self, "addItemWithTitle:action:keyEquivalent:", title, selector, keyEquivalent)
  81. }