| 28 |
28 |
| 29 #import <stdio.h> |
29 #import <stdio.h> |
| 30 #import <stdlib.h> |
30 #import <stdlib.h> |
| 31 #import <string.h> |
31 #import <string.h> |
| 32 #import <stdarg.h> |
32 #import <stdarg.h> |
| |
33 #import <objc/runtime.h> |
| 33 |
34 |
| 34 #import "menu.h" |
35 #import "menu.h" |
| 35 #import "window.h" |
36 #import "window.h" |
| |
37 #import "EventData.h" |
| |
38 |
| |
39 #pragma GCC diagnostic ignored "-Wundeclared-selector" |
| |
40 #pragma clang diagnostic ignored "-Wundeclared-selector" |
| |
41 |
| |
42 // holds all items that need bindings |
| |
43 // value type: MenuItem* |
| |
44 static NSMutableArray *bindingItems; |
| |
45 |
| |
46 @implementation MenuItem |
| |
47 |
| |
48 - (MenuItem*)init:(int)itId { |
| |
49 self.itemId = [[NSString alloc] initWithFormat:@"item%d", itId]; |
| |
50 return self; |
| |
51 } |
| |
52 |
| |
53 @end |
| 36 |
54 |
| 37 static ui_menu_add_f createMenuItem[] = { |
55 static ui_menu_add_f createMenuItem[] = { |
| 38 /* UI_MENU */ add_menu_widget, |
56 /* UI_MENU */ add_menu_widget, |
| 39 /* UI_MENU_ITEM */ add_menuitem_widget, |
57 /* UI_MENU_ITEM */ add_menuitem_widget, |
| 40 /* UI_MENU_CHECK_ITEM */ add_checkitem_widget, |
58 /* UI_MENU_CHECK_ITEM */ add_checkitem_widget, |
| 65 add_menu_items(menu, i, it); |
83 add_menu_items(menu, i, it); |
| 66 } |
84 } |
| 67 |
85 |
| 68 void add_menuitem_widget(NSMenu *parent, int i, UiMenuItemI *item) { |
86 void add_menuitem_widget(NSMenu *parent, int i, UiMenuItemI *item) { |
| 69 UiMenuItem *it = (UiMenuItem*)item; |
87 UiMenuItem *it = (UiMenuItem*)item; |
| |
88 |
| 70 NSString *str = [[NSString alloc] initWithUTF8String:it->label]; |
89 NSString *str = [[NSString alloc] initWithUTF8String:it->label]; |
| 71 NSMenuItem *menuItem = [parent addItemWithTitle:str action:nil keyEquivalent:@""]; |
90 NSMenuItem *menuItem = [parent addItemWithTitle:str action:@selector(menuItemAction:) keyEquivalent:@""]; |
| |
91 |
| |
92 if(it->callback) { |
| |
93 EventData *event = [[EventData alloc] init:it->callback userdata:it->userdata]; |
| |
94 objc_setAssociatedObject(menuItem, "eventdata", event, OBJC_ASSOCIATION_RETAIN); |
| |
95 } |
| 72 } |
96 } |
| 73 |
97 |
| 74 void add_menuseparator_widget(NSMenu *parent, int i, UiMenuItemI *item) { |
98 void add_menuseparator_widget(NSMenu *parent, int i, UiMenuItemI *item) { |
| 75 |
99 NSMenuItem *menuItem = [NSMenuItem separatorItem]; |
| |
100 [parent addItem:menuItem]; |
| 76 } |
101 } |
| 77 |
102 |
| |
103 static int nItem = 0; |
| |
104 |
| 78 void add_checkitem_widget(NSMenu *parent, int i, UiMenuItemI *item) { |
105 void add_checkitem_widget(NSMenu *parent, int i, UiMenuItemI *item) { |
| |
106 UiMenuCheckItem *it = (UiMenuCheckItem*)item; |
| 79 |
107 |
| |
108 NSString *str = [[NSString alloc] initWithUTF8String:it->label]; |
| |
109 NSMenuItem *menuItem = [parent addItemWithTitle:str action:@selector(menuCheckItemAction:) keyEquivalent:@""]; |
| |
110 |
| |
111 MenuItem *mItem = [[MenuItem alloc] init:nItem++]; |
| |
112 mItem.callback = it->callback; |
| |
113 mItem.userdata = it->userdata; |
| |
114 mItem.checkItem = it; |
| |
115 |
| |
116 objc_setAssociatedObject(menuItem, "menuitem", mItem, OBJC_ASSOCIATION_RETAIN); |
| |
117 [bindingItems addObject:mItem]; |
| 80 } |
118 } |
| 81 |
119 |
| 82 void add_radioitem_widget(NSMenu *parent, int index, UiMenuItemI *item) { |
120 void add_radioitem_widget(NSMenu *parent, int index, UiMenuItemI *item) { |
| |
121 UiMenuRadioItem *it = (UiMenuRadioItem*)item; |
| 83 |
122 |
| |
123 NSString *str = [[NSString alloc] initWithUTF8String:it->label]; |
| |
124 NSMenuItem *menuItem = [parent addItemWithTitle:str action:@selector(menuRadioItemAction:) keyEquivalent:@""]; |
| |
125 |
| |
126 MenuItem *mItem = [[MenuItem alloc] init:nItem++]; |
| |
127 mItem.callback = it->callback; |
| |
128 mItem.userdata = it->userdata; |
| |
129 mItem.radioItem = it; |
| |
130 |
| |
131 objc_setAssociatedObject(menuItem, "menuitem", mItem, OBJC_ASSOCIATION_RETAIN); |
| |
132 [bindingItems addObject:mItem]; |
| 84 } |
133 } |
| 85 |
134 |
| 86 void add_checkitemnv_widget(NSMenu *parent, int i, UiMenuItemI *item) { |
135 void add_checkitemnv_widget(NSMenu *parent, int i, UiMenuItemI *item) { |
| 87 |
136 |
| 88 } |
137 } |
| 91 |
140 |
| 92 } |
141 } |
| 93 |
142 |
| 94 |
143 |
| 95 void ui_menu_init(void) { |
144 void ui_menu_init(void) { |
| |
145 bindingItems = [[NSMutableArray alloc] init]; |
| |
146 |
| 96 UiMenu *menus_begin = uic_get_menu_list(); |
147 UiMenu *menus_begin = uic_get_menu_list(); |
| 97 UiMenu *ls = menus_begin; |
148 UiMenu *ls = menus_begin; |
| |
149 int index = 1; |
| 98 while(ls) { |
150 while(ls) { |
| 99 if(ls->item.type == UI_MENU) { |
151 if(ls->item.type == UI_MENU) { |
| 100 NSString *str = [[NSString alloc] initWithUTF8String:ls->label]; |
152 NSString *str = [[NSString alloc] initWithUTF8String:ls->label]; |
| 101 NSMenu *menu = [[NSMenu alloc] initWithTitle: str]; |
153 NSMenu *menu = [[NSMenu alloc] initWithTitle: str]; |
| 102 NSMenuItem *menuItem = [[NSApp mainMenu] addItemWithTitle:str action:nil keyEquivalent:@""]; |
154 NSMenuItem *menuItem = [[NSApp mainMenu] insertItemWithTitle:str action:nil keyEquivalent:@"" atIndex:index]; |
| 103 [[NSApp mainMenu] setSubmenu:menu forItem:menuItem]; |
155 [[NSApp mainMenu] setSubmenu:menu forItem:menuItem]; |
| 104 |
156 |
| 105 add_menu_items(menu, 0, ls); |
157 add_menu_items(menu, 0, ls); |
| 106 } |
158 } |
| 107 ls = (UiMenu*)ls->item.next; |
159 ls = (UiMenu*)ls->item.next; |
| |
160 index++; |
| 108 } |
161 } |
| 109 } |
162 } |
| |
163 |
| |
164 NSArray* ui_get_binding_items(void) { |
| |
165 return bindingItems; |
| |
166 } |