| 48 - (MenuItem*)init:(int)itId { |
48 - (MenuItem*)init:(int)itId { |
| 49 self.itemId = [[NSString alloc] initWithFormat:@"item%d", itId]; |
49 self.itemId = [[NSString alloc] initWithFormat:@"item%d", itId]; |
| 50 return self; |
50 return self; |
| 51 } |
51 } |
| 52 |
52 |
| |
53 - (void)handleToggleEvent:(id)sender { |
| |
54 NSMenuItem *item = (NSMenuItem*)sender; |
| |
55 if(!_state) { |
| |
56 item.state = NSControlStateValueOn; |
| |
57 } else { |
| |
58 item.state = NSControlStateValueOff; |
| |
59 } |
| |
60 _state = !_state; |
| |
61 |
| |
62 if(_callback) { |
| |
63 UiEvent event; |
| |
64 event.obj = _obj; |
| |
65 event.window = event.obj->window; |
| |
66 event.document = event.obj->ctx->document; |
| |
67 event.eventdata = NULL; |
| |
68 event.eventdatatype = 0; |
| |
69 event.intval = _state; |
| |
70 event.set = ui_get_setop(); |
| |
71 _callback(&event, _userdata); |
| |
72 } |
| |
73 } |
| |
74 |
| 53 @end |
75 @end |
| 54 |
76 |
| 55 static ui_menu_add_f createMenuItem[] = { |
77 static ui_menu_add_f createMenuItem[] = { |
| 56 /* UI_MENU */ add_menu_widget, |
78 /* UI_MENU */ add_menu_widget, |
| 57 /* UI_MENU_ITEM */ add_menuitem_widget, |
79 /* UI_MENU_ITEM */ add_menuitem_widget, |
| 61 /* UI_MENU_CHECKITEM_LIST */ add_menuitem_list_widget, |
83 /* UI_MENU_CHECKITEM_LIST */ add_menuitem_list_widget, |
| 62 /* UI_MENU_RADIOITEM_LIST */ add_menuitem_list_widget, |
84 /* UI_MENU_RADIOITEM_LIST */ add_menuitem_list_widget, |
| 63 /* UI_MENU_SEPARATOR */ add_menuseparator_widget |
85 /* UI_MENU_SEPARATOR */ add_menuseparator_widget |
| 64 }; |
86 }; |
| 65 |
87 |
| 66 static void add_menu_items(NSMenu *parent, int i, UiMenu *menu) { |
88 void ui_add_menu_items(UiObject *obj, NSMenu *parent, int i, UiMenu *menu) { |
| 67 UiMenuItemI *it = menu->items_begin; |
89 UiMenuItemI *it = menu->items_begin; |
| 68 int index = 0; |
90 int index = 0; |
| 69 while(it) { |
91 while(it) { |
| 70 createMenuItem[it->type](parent, index, it); |
92 createMenuItem[it->type](obj, parent, index, it); |
| 71 it = it->next; |
93 it = it->next; |
| 72 index++; |
94 index++; |
| 73 } |
95 } |
| 74 } |
96 } |
| 75 |
97 |
| 76 void add_menu_widget(NSMenu *parent, int i, UiMenuItemI *item) { |
98 void add_menu_widget(UiObject *obj, NSMenu *parent, int i, UiMenuItemI *item) { |
| 77 UiMenu *it = (UiMenu*)item; |
99 UiMenu *it = (UiMenu*)item; |
| 78 NSString *str = [[NSString alloc] initWithUTF8String:it->label]; |
100 NSString *str = [[NSString alloc] initWithUTF8String:it->label]; |
| 79 NSMenu *menu = [[NSMenu alloc] initWithTitle: str]; |
101 NSMenu *menu = [[NSMenu alloc] initWithTitle: str]; |
| 80 NSMenuItem *menuItem = [parent addItemWithTitle:str action:nil keyEquivalent:@""]; |
102 NSMenuItem *menuItem = [parent addItemWithTitle:str action:nil keyEquivalent:@""]; |
| 81 [parent setSubmenu:menu forItem:menuItem]; |
103 [parent setSubmenu:menu forItem:menuItem]; |
| 82 |
104 |
| 83 add_menu_items(menu, i, it); |
105 ui_add_menu_items(obj, menu, i, it); |
| 84 } |
106 } |
| 85 |
107 |
| 86 void add_menuitem_widget(NSMenu *parent, int i, UiMenuItemI *item) { |
108 void add_menuitem_widget(UiObject *obj, NSMenu *parent, int i, UiMenuItemI *item) { |
| 87 UiMenuItem *it = (UiMenuItem*)item; |
109 UiMenuItem *it = (UiMenuItem*)item; |
| 88 |
110 |
| 89 NSString *str = [[NSString alloc] initWithUTF8String:it->label]; |
111 NSString *str = [[NSString alloc] initWithUTF8String:it->label]; |
| 90 NSMenuItem *menuItem = [parent addItemWithTitle:str action:@selector(menuItemAction:) keyEquivalent:@""]; |
112 NSMenuItem *menuItem = [parent addItemWithTitle:str action:@selector(menuItemAction) keyEquivalent:@""]; |
| 91 |
113 |
| 92 if(it->callback) { |
114 if(it->callback) { |
| 93 EventData *event = [[EventData alloc] init:it->callback userdata:it->userdata]; |
115 EventData *event = [[EventData alloc] init:it->callback userdata:it->userdata]; |
| |
116 if(obj) { |
| |
117 event.obj = obj; |
| |
118 menuItem.target = event; |
| |
119 menuItem.action = @selector(handleEvent:); |
| |
120 } |
| 94 objc_setAssociatedObject(menuItem, "eventdata", event, OBJC_ASSOCIATION_RETAIN); |
121 objc_setAssociatedObject(menuItem, "eventdata", event, OBJC_ASSOCIATION_RETAIN); |
| 95 } |
122 } |
| 96 } |
123 } |
| 97 |
124 |
| 98 void add_menuseparator_widget(NSMenu *parent, int i, UiMenuItemI *item) { |
125 void add_menuseparator_widget(UiObject *obj, NSMenu *parent, int i, UiMenuItemI *item) { |
| 99 NSMenuItem *menuItem = [NSMenuItem separatorItem]; |
126 NSMenuItem *menuItem = [NSMenuItem separatorItem]; |
| 100 [parent addItem:menuItem]; |
127 [parent addItem:menuItem]; |
| 101 } |
128 } |
| 102 |
129 |
| 103 static int nItem = 0; |
130 static int nItem = 0; |
| 104 |
131 |
| 105 void add_checkitem_widget(NSMenu *parent, int i, UiMenuItemI *item) { |
132 void add_checkitem_widget(UiObject *obj, NSMenu *parent, int i, UiMenuItemI *item) { |
| 106 UiMenuCheckItem *it = (UiMenuCheckItem*)item; |
133 UiMenuCheckItem *it = (UiMenuCheckItem*)item; |
| 107 |
134 |
| 108 NSString *str = [[NSString alloc] initWithUTF8String:it->label]; |
135 NSString *str = [[NSString alloc] initWithUTF8String:it->label]; |
| 109 NSMenuItem *menuItem = [parent addItemWithTitle:str action:@selector(menuCheckItemAction:) keyEquivalent:@""]; |
136 NSMenuItem *menuItem = [parent addItemWithTitle:str action:@selector(menuCheckItemAction:) keyEquivalent:@""]; |
| 110 |
137 |
| 111 MenuItem *mItem = [[MenuItem alloc] init:nItem++]; |
138 MenuItem *mItem = [[MenuItem alloc] init:nItem++]; |
| |
139 mItem.menuItem = menuItem; |
| |
140 mItem.obj = obj; |
| 112 mItem.callback = it->callback; |
141 mItem.callback = it->callback; |
| 113 mItem.userdata = it->userdata; |
142 mItem.userdata = it->userdata; |
| 114 mItem.checkItem = it; |
143 mItem.checkItem = it; |
| |
144 if(it->varname) { |
| |
145 mItem.varname = [[NSString alloc] initWithUTF8String:it->varname]; |
| |
146 } |
| 115 |
147 |
| 116 objc_setAssociatedObject(menuItem, "menuitem", mItem, OBJC_ASSOCIATION_RETAIN); |
148 objc_setAssociatedObject(menuItem, "menuitem", mItem, OBJC_ASSOCIATION_RETAIN); |
| 117 [bindingItems addObject:mItem]; |
149 |
| 118 } |
150 if(!obj) { |
| 119 |
151 [bindingItems addObject:mItem]; |
| 120 void add_radioitem_widget(NSMenu *parent, int index, UiMenuItemI *item) { |
152 } else { |
| |
153 mItem.var = uic_widget_var(obj->ctx, obj->ctx, NULL, it->varname, UI_VAR_INTEGER); |
| |
154 if(mItem.var) { |
| |
155 UiInteger *i = mItem.var->value; |
| |
156 i->obj = (__bridge void*)mItem; |
| |
157 i->get = ui_menu_toggleitem_get; |
| |
158 i->set = ui_menu_toggleitem_set; |
| |
159 } |
| |
160 menuItem.target = mItem; |
| |
161 menuItem.action = @selector(handleToggleEvent:); |
| |
162 } |
| |
163 } |
| |
164 |
| |
165 void add_radioitem_widget(UiObject *obj, NSMenu *parent, int index, UiMenuItemI *item) { |
| 121 UiMenuRadioItem *it = (UiMenuRadioItem*)item; |
166 UiMenuRadioItem *it = (UiMenuRadioItem*)item; |
| 122 |
167 |
| 123 NSString *str = [[NSString alloc] initWithUTF8String:it->label]; |
168 NSString *str = [[NSString alloc] initWithUTF8String:it->label]; |
| 124 NSMenuItem *menuItem = [parent addItemWithTitle:str action:@selector(menuRadioItemAction:) keyEquivalent:@""]; |
169 NSMenuItem *menuItem = [parent addItemWithTitle:str action:@selector(menuRadioItemAction:) keyEquivalent:@""]; |
| 125 |
170 |
| 152 NSString *str = [[NSString alloc] initWithUTF8String:ls->label]; |
197 NSString *str = [[NSString alloc] initWithUTF8String:ls->label]; |
| 153 NSMenu *menu = [[NSMenu alloc] initWithTitle: str]; |
198 NSMenu *menu = [[NSMenu alloc] initWithTitle: str]; |
| 154 NSMenuItem *menuItem = [[NSApp mainMenu] insertItemWithTitle:str action:nil keyEquivalent:@"" atIndex:index]; |
199 NSMenuItem *menuItem = [[NSApp mainMenu] insertItemWithTitle:str action:nil keyEquivalent:@"" atIndex:index]; |
| 155 [[NSApp mainMenu] setSubmenu:menu forItem:menuItem]; |
200 [[NSApp mainMenu] setSubmenu:menu forItem:menuItem]; |
| 156 |
201 |
| 157 add_menu_items(menu, 0, ls); |
202 ui_add_menu_items(NULL, menu, 0, ls); |
| 158 } |
203 } |
| 159 ls = (UiMenu*)ls->item.next; |
204 ls = (UiMenu*)ls->item.next; |
| 160 index++; |
205 index++; |
| 161 } |
206 } |
| 162 } |
207 } |
| 163 |
208 |
| 164 NSArray* ui_get_binding_items(void) { |
209 NSArray* ui_get_binding_items(void) { |
| 165 return bindingItems; |
210 return bindingItems; |
| 166 } |
211 } |
| |
212 |
| |
213 |
| |
214 int64_t ui_menu_toggleitem_get(UiInteger *i) { |
| |
215 MenuItem *item = (__bridge MenuItem*)i->obj; |
| |
216 i->value = item.state; |
| |
217 return i->value; |
| |
218 } |
| |
219 |
| |
220 void ui_menu_toggleitem_set(UiInteger *i, int64_t value) { |
| |
221 MenuItem *item = (__bridge MenuItem*)i->obj; |
| |
222 i->value = value; |
| |
223 if(value != 0) { |
| |
224 item.menuItem.state = NSControlStateValueOn; |
| |
225 } else { |
| |
226 item.menuItem.state = NSControlStateValueOff; |
| |
227 } |
| |
228 } |