ui/cocoa/menu.m

changeset 108
77254bd6dccb
parent 103
6606616eca9f
child 109
c3dfcb8f0be7
equal deleted inserted replaced
107:b34bd1557c6c 108:77254bd6dccb
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 }

mercurial