ui/cocoa/button.m

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

mercurial