ui/cocoa/menu.m

changeset 109
c3dfcb8f0be7
parent 108
77254bd6dccb
equal deleted inserted replaced
108:77254bd6dccb 109:c3dfcb8f0be7
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
130 175
131 objc_setAssociatedObject(menuItem, "menuitem", mItem, OBJC_ASSOCIATION_RETAIN); 176 objc_setAssociatedObject(menuItem, "menuitem", mItem, OBJC_ASSOCIATION_RETAIN);
132 [bindingItems addObject:mItem]; 177 [bindingItems addObject:mItem];
133 } 178 }
134 179
135 void add_checkitemnv_widget(NSMenu *parent, int i, UiMenuItemI *item) { 180 void add_checkitemnv_widget(UiObject *obj, NSMenu *parent, int i, UiMenuItemI *item) {
136 181
137 } 182 }
138 183
139 void add_menuitem_list_widget(NSMenu *parent, int i, UiMenuItemI *item) { 184 void add_menuitem_list_widget(UiObject *obj, NSMenu *parent, int i, UiMenuItemI *item) {
140 185
141 } 186 }
142 187
143 188
144 void ui_menu_init(void) { 189 void ui_menu_init(void) {
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 }

mercurial