| 29 #import "button.h" |
29 #import "button.h" |
| 30 #import "EventData.h" |
30 #import "EventData.h" |
| 31 #import "Container.h" |
31 #import "Container.h" |
| 32 #import <objc/runtime.h> |
32 #import <objc/runtime.h> |
| 33 |
33 |
| 34 UIWIDGET ui_button_create(UiObject* obj, UiButtonArgs args) { |
34 UIWIDGET ui_button_create(UiObject* obj, UiButtonArgs *args) { |
| 35 NSButton *button = [[NSButton alloc] init]; |
35 NSButton *button = [[NSButton alloc] init]; |
| 36 if(args.label) { |
36 if(args->label) { |
| 37 NSString *label = [[NSString alloc] initWithUTF8String:args.label]; |
37 NSString *label = [[NSString alloc] initWithUTF8String:args->label]; |
| 38 button.title = label; |
38 button.title = label; |
| 39 } |
39 } |
| 40 |
40 |
| 41 if(args.onclick) { |
41 if(args->onclick) { |
| 42 EventData *event = [[EventData alloc] init:args.onclick userdata:args.onclickdata]; |
42 EventData *event = [[EventData alloc] init:args->onclick userdata:args->onclickdata]; |
| 43 event.obj = obj; |
43 event.obj = obj; |
| 44 button.target = event; |
44 button.target = event; |
| 45 button.action = @selector(handleEvent:); |
45 button.action = @selector(handleEvent:); |
| 46 objc_setAssociatedObject(button, "eventdata", event, OBJC_ASSOCIATION_RETAIN); |
46 objc_setAssociatedObject(button, "eventdata", event, OBJC_ASSOCIATION_RETAIN); |
| 47 } |
47 } |
| 57 NSButton *btn = (NSButton*)button; |
57 NSButton *btn = (NSButton*)button; |
| 58 NSControlStateValue state = btn.state; |
58 NSControlStateValue state = btn.state; |
| 59 *value = (int)state; |
59 *value = (int)state; |
| 60 } |
60 } |
| 61 |
61 |
| 62 UIWIDGET togglebutton_create(UiObject* obj, UiToggleArgs args, enum NSButtonType type) { |
62 UIWIDGET togglebutton_create(UiObject* obj, UiToggleArgs *args, enum NSButtonType type) { |
| 63 NSButton *button = [[NSButton alloc] init]; |
63 NSButton *button = [[NSButton alloc] init]; |
| 64 [button setButtonType:type]; |
64 [button setButtonType:type]; |
| 65 //[button setAllowsMixedState:YES]; |
65 //[button setAllowsMixedState:YES]; |
| 66 |
66 |
| 67 if(args.label) { |
67 if(args->label) { |
| 68 NSString *label = [[NSString alloc] initWithUTF8String:args.label]; |
68 NSString *label = [[NSString alloc] initWithUTF8String:args->label]; |
| 69 button.title = label; |
69 button.title = label; |
| 70 } |
70 } |
| 71 |
71 |
| 72 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_INTEGER); |
72 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER); |
| 73 if(var) { |
73 if(var) { |
| 74 UiInteger *i = var->value; |
74 UiInteger *i = var->value; |
| 75 i->obj = (__bridge void*)button; |
75 i->obj = (__bridge void*)button; |
| 76 i->get = ui_togglebutton_get; |
76 i->get = ui_togglebutton_get; |
| 77 i->set = ui_togglebutton_set; |
77 i->set = ui_togglebutton_set; |
| 78 } |
78 } |
| 79 |
79 |
| 80 if(args.onchange) { |
80 if(args->onchange) { |
| 81 EventData *event = [[EventData alloc] init:args.onchange userdata:args.onchangedata]; |
81 EventData *event = [[EventData alloc] init:args->onchange userdata:args->onchangedata]; |
| 82 event.get_eventdata = togglebutton_eventdata; |
82 event.get_eventdata = togglebutton_eventdata; |
| 83 event.obj = obj; |
83 event.obj = obj; |
| 84 event.var = var; |
84 event.var = var; |
| 85 event.vartype = UI_VAR_INTEGER; |
85 event.vartype = UI_VAR_INTEGER; |
| 86 button.target = event; |
86 button.target = event; |
| 111 } |
111 } |
| 112 i->value = (int64_t)state; |
112 i->value = (int64_t)state; |
| 113 button.state = state; |
113 button.state = state; |
| 114 } |
114 } |
| 115 |
115 |
| 116 UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs args) { |
116 UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs *args) { |
| 117 return togglebutton_create(obj, args, NSButtonTypePushOnPushOff); |
117 return togglebutton_create(obj, args, NSButtonTypePushOnPushOff); |
| 118 } |
118 } |
| 119 |
119 |
| 120 UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs args) { |
120 UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs *args) { |
| 121 return togglebutton_create(obj, args, NSButtonTypeSwitch); |
121 return togglebutton_create(obj, args, NSButtonTypeSwitch); |
| 122 } |
122 } |
| 123 |
123 |
| 124 static void switch_eventdata(id button, UiVar *var, void **eventdata, int *value) { |
124 static void switch_eventdata(id button, UiVar *var, void **eventdata, int *value) { |
| 125 NSSwitch *btn = (NSSwitch*)button; |
125 NSSwitch *btn = (NSSwitch*)button; |
| 126 NSControlStateValue state = btn.state; |
126 NSControlStateValue state = btn.state; |
| 127 *value = (int)state; |
127 *value = (int)state; |
| 128 } |
128 } |
| 129 |
129 |
| 130 UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs args) { |
130 UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs *args) { |
| 131 NSSwitch *button = [[NSSwitch alloc] init]; |
131 NSSwitch *button = [[NSSwitch alloc] init]; |
| 132 |
132 |
| 133 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_INTEGER); |
133 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER); |
| 134 if(var) { |
134 if(var) { |
| 135 UiInteger *i = var->value; |
135 UiInteger *i = var->value; |
| 136 i->obj = (__bridge void*)button; |
136 i->obj = (__bridge void*)button; |
| 137 i->get = ui_switch_get; |
137 i->get = ui_switch_get; |
| 138 i->set = ui_switch_set; |
138 i->set = ui_switch_set; |
| 139 } |
139 } |
| 140 |
140 |
| 141 if(args.onchange) { |
141 if(args->onchange) { |
| 142 EventData *event = [[EventData alloc] init:args.onchange userdata:args.onchangedata]; |
142 EventData *event = [[EventData alloc] init:args->onchange userdata:args->onchangedata]; |
| 143 event.get_eventdata = switch_eventdata; |
143 event.get_eventdata = switch_eventdata; |
| 144 event.obj = obj; |
144 event.obj = obj; |
| 145 event.var = var; |
145 event.var = var; |
| 146 event.vartype = UI_VAR_INTEGER; |
146 event.vartype = UI_VAR_INTEGER; |
| 147 button.target = event; |
147 button.target = event; |
| 172 } |
172 } |
| 173 i->value = (int64_t)state; |
173 i->value = (int64_t)state; |
| 174 button.state = state; |
174 button.state = state; |
| 175 } |
175 } |
| 176 |
176 |
| |
177 |
| |
178 @implementation UiRadioButton |
| |
179 |
| |
180 - (UiRadioButton*)init { |
| |
181 self = [super init]; |
| |
182 _direct_state = NO; |
| |
183 [self setButtonType:NSButtonTypeRadio]; |
| |
184 return self; |
| |
185 } |
| |
186 |
| |
187 - (void)setState:(NSControlStateValue)state { |
| |
188 // NOOP |
| |
189 } |
| |
190 |
| |
191 @end |
| |
192 |
| 177 static void radiobutton_eventdata(id button, UiVar *var, void **eventdata, int *value) { |
193 static void radiobutton_eventdata(id button, UiVar *var, void **eventdata, int *value) { |
| 178 if(var) { |
194 if(var) { |
| 179 printf("switch radiobutton\n"); |
195 UiInteger *value = var->value; |
| 180 } |
196 NSMutableArray *buttons = (__bridge NSMutableArray*)value->obj; |
| 181 } |
197 for(UiRadioButton *b in buttons) { |
| 182 |
198 if(b != button) { |
| 183 UIWIDGET ui_radiobutton_create(UiObject* obj, UiToggleArgs args) { |
199 b.direct_state = YES; |
| 184 NSButton *button = [[NSButton alloc] init]; |
200 [[b cell] setState:0]; |
| 185 [button setButtonType:NSButtonTypeRadio]; |
201 b.direct_state = NO; |
| 186 |
202 } |
| 187 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_INTEGER); |
203 } |
| |
204 } |
| |
205 } |
| |
206 |
| |
207 UIWIDGET ui_radiobutton_create(UiObject* obj, UiToggleArgs *args) { |
| |
208 UiRadioButton *button = [[UiRadioButton alloc] init]; |
| |
209 |
| |
210 if(args->label) { |
| |
211 button.title = [[NSString alloc] initWithUTF8String:args->label]; |
| |
212 } |
| |
213 |
| |
214 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER); |
| |
215 button.var = var; |
| 188 NSMutableArray *buttons = nil; |
216 NSMutableArray *buttons = nil; |
| 189 if(var) { |
217 if(var) { |
| 190 UiInteger *i = var->value; |
218 UiInteger *i = var->value; |
| 191 buttons = (__bridge NSMutableArray*)i->obj; |
219 buttons = (__bridge NSMutableArray*)i->obj; |
| 192 if(!buttons) { |
220 if(!buttons) { |
| 197 } |
225 } |
| 198 [buttons addObject:button]; |
226 [buttons addObject:button]; |
| 199 objc_setAssociatedObject(button, "radiogroup", buttons, OBJC_ASSOCIATION_RETAIN); |
227 objc_setAssociatedObject(button, "radiogroup", buttons, OBJC_ASSOCIATION_RETAIN); |
| 200 } |
228 } |
| 201 |
229 |
| 202 if(args.onchange || var) { |
230 if(args->onchange || var) { |
| 203 EventData *event = [[EventData alloc] init:args.onchange userdata:args.onchangedata]; |
231 EventData *event = [[EventData alloc] init:args->onchange userdata:args->onchangedata]; |
| 204 event.get_eventdata = radiobutton_eventdata; |
232 event.get_eventdata = radiobutton_eventdata; |
| 205 event.obj = obj; |
233 event.obj = obj; |
| 206 event.var = var; |
234 event.var = var; |
| 207 event.vartype = UI_VAR_INTEGER; |
235 event.vartype = UI_VAR_INTEGER; |
| 208 button.target = event; |
236 button.target = event; |
| 218 |
246 |
| 219 return (__bridge void*)button; |
247 return (__bridge void*)button; |
| 220 } |
248 } |
| 221 |
249 |
| 222 int64_t ui_radiobuttons_get(UiInteger *i) { |
250 int64_t ui_radiobuttons_get(UiInteger *i) { |
| 223 return 0; |
251 NSMutableArray *buttons = (__bridge NSMutableArray*)i->obj; |
| |
252 int64_t index = 0; |
| |
253 for(UiRadioButton *b in buttons) { |
| |
254 if([b cell].state != 0) { |
| |
255 i->value = index + 1; |
| |
256 break; |
| |
257 } |
| |
258 index++; |
| |
259 } |
| |
260 return i->value; |
| 224 } |
261 } |
| 225 |
262 |
| 226 void ui_radiobuttons_set(UiInteger *i, int64_t value) { |
263 void ui_radiobuttons_set(UiInteger *i, int64_t value) { |
| 227 |
264 NSMutableArray *buttons = (__bridge NSMutableArray*)i->obj; |
| 228 } |
265 int64_t index = 1; |
| |
266 for(UiRadioButton *b in buttons) { |
| |
267 if(index == value) { |
| |
268 [b cell].state = NSControlStateValueOn; |
| |
269 } else { |
| |
270 [b cell].state = NSControlStateValueOff; |
| |
271 } |
| |
272 index++; |
| |
273 } |
| |
274 } |