ui/cocoa/button.m

changeset 112
c3f2f16fa4b8
parent 109
c3dfcb8f0be7
child 113
dde28a806552
equal deleted inserted replaced
111:81c4f73236a4 112:c3f2f16fa4b8
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 #import <cx/buffer.h>
35 #import <cx/json.h>
36
34 UIWIDGET ui_button_create(UiObject* obj, UiButtonArgs *args) { 37 UIWIDGET ui_button_create(UiObject* obj, UiButtonArgs *args) {
35 NSButton *button = [[NSButton alloc] init]; 38 NSButton *button = [[NSButton alloc] init];
39 button.translatesAutoresizingMaskIntoConstraints = NO;
36 if(args->label) { 40 if(args->label) {
37 NSString *label = [[NSString alloc] initWithUTF8String:args->label]; 41 NSString *label = [[NSString alloc] initWithUTF8String:args->label];
38 button.title = label; 42 button.title = label;
39 } 43 }
40 44
270 [b cell].state = NSControlStateValueOff; 274 [b cell].state = NSControlStateValueOff;
271 } 275 }
272 index++; 276 index++;
273 } 277 }
274 } 278 }
279
280
281 /* --------------------------- Link Button --------------------------- */
282
283 @implementation UiLinkButtonData
284
285 - (id)init:(UiObject*)obj textfield:(NSTextField*)textfield {
286 _obj = obj;
287 _textfield = textfield;
288 return self;
289 }
290
291 - (void)setLinkDataFromJson:(const char*)jsonStr {
292 CxJson json;
293 cxJsonInit(&json, NULL);
294 cxJsonFill(&json, jsonStr);
295
296 CxJsonValue *value;
297 if(cxJsonNext(&json, &value) == CX_JSON_NO_ERROR) {
298 if(cxJsonIsObject(value)) {
299 CxJsonValue *label = cxJsonObjGet(value, "label");
300 CxJsonValue *uri = cxJsonObjGet(value, "uri");
301 CxJsonValue *visited = cxJsonObjGet(value, "visited");
302 if(label) {
303 char *str = cxJsonIsString(label) ? cxJsonAsString(label) : NULL;
304 if(str) {
305 _label = [[NSString alloc]initWithUTF8String:str];
306 } else {
307 _label = nil;
308 }
309 }
310 if(uri) {
311 char *str = cxJsonIsString(uri) ? cxJsonAsString(uri) : NULL;
312 if(str) {
313 _uri = [[NSString alloc]initWithUTF8String:str];
314 } else {
315 _uri = nil;
316 }
317 }
318 if(visited) {
319 _visited = cxJsonIsBool(visited) ? cxJsonAsBool(visited) : FALSE;
320 }
321 }
322 cxJsonValueFree(value);
323 }
324 cxJsonDestroy(&json);
325
326 [self buildLink];
327 }
328
329 - (void)buildLink {
330 NSString *label = _label ? _label : @"";
331
332 NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:label];
333 [attrString beginEditing];
334 if(_uri) {
335 [attrString addAttribute:NSLinkAttributeName value:_uri range:NSMakeRange(0, attrString.length)];
336 }
337 [attrString addAttribute:NSForegroundColorAttributeName value:[NSColor systemBlueColor] range:NSMakeRange(0, attrString.length)];
338 [attrString addAttribute:NSUnderlineStyleAttributeName value:@(NSUnderlineStyleSingle) range:NSMakeRange(0, attrString.length)];
339 [attrString endEditing];
340
341 [_textfield setAttributedStringValue:attrString];
342 }
343
344 @end
345
346 static char* create_linkbutton_jsonvalue(const char *label, const char *uri, UiBool include_null, UiBool visited, UiBool set_visited) {
347 CxJsonValue *obj = cxJsonCreateObj(NULL);
348 if(label) {
349 cxJsonObjPutString(obj, CX_STR("label"), label);
350 } else if(include_null) {
351 cxJsonObjPutLiteral(obj, CX_STR("label"), CX_JSON_NULL);
352 }
353
354 if(uri) {
355 cxJsonObjPutString(obj, CX_STR("uri"), uri);
356 } else if(include_null) {
357 cxJsonObjPutLiteral(obj, CX_STR("uri"), CX_JSON_NULL);
358 }
359
360 if(set_visited) {
361 cxJsonObjPutLiteral(obj, CX_STR("visited"), visited ? CX_JSON_TRUE : CX_JSON_FALSE);
362 }
363
364 CxJsonWriter writer = cxJsonWriterCompact();
365 CxBuffer buf;
366 cxBufferInit(&buf, NULL, 128, NULL, CX_BUFFER_AUTO_EXTEND);
367 cxJsonWrite(&buf, obj, (cx_write_func)cxBufferWrite, &writer);
368 cxJsonValueFree(obj);
369 cxBufferTerminate(&buf);
370
371 return buf.space;
372 }
373
374 UIWIDGET ui_linkbutton_create(UiObject *obj, UiLinkButtonArgs *args) {
375 NSTextField *label = [[NSTextField alloc] init];
376 label.editable = NO;
377 label.bezeled = NO;
378 label.drawsBackground = NO;
379 label.allowsEditingTextAttributes = YES;
380 label.selectable = YES;
381
382 UiLayout layout = UI_ARGS2LAYOUT(args);
383 ui_container_add(obj, label, &layout);
384
385 UiLinkButtonData *data = [[UiLinkButtonData alloc]init:obj textfield:label];
386 objc_setAssociatedObject(label, "linkdata", data, OBJC_ASSOCIATION_RETAIN);
387
388 UiVar *var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_STRING);
389 if(var) {
390 UiString *s = var->value;
391 s->obj = (__bridge void*)data;
392 s->get = ui_linkbutton_get;
393 s->set = ui_linkbutton_set;
394
395 if(s->value.ptr) {
396 [data setLinkDataFromJson:s->value.ptr];
397 }
398 }
399
400 return (__bridge void*)label;
401 }
402
403 char* ui_linkbutton_get(UiString *s) {
404 return NULL; // TODO
405 }
406
407 void ui_linkbutton_set(UiString *s, const char *str) {
408 UiLinkButtonData *data = (__bridge UiLinkButtonData*)s->obj;
409 [data setLinkDataFromJson:str];
410 }
411
412
413
414 void ui_linkbutton_value_set(UiString *str, const char *label, const char *uri) {
415 char *value = create_linkbutton_jsonvalue(label, uri, TRUE, FALSE, TRUE);
416 ui_set(str, value);
417 free(value);
418 }
419
420 void ui_linkbutton_value_set_label(UiString *str, const char *label) {
421 char *value = create_linkbutton_jsonvalue(label, NULL, FALSE, FALSE, TRUE);
422 ui_set(str, value);
423 free(value);
424 }
425
426 void ui_linkbutton_value_set_uri(UiString *str, const char *uri) {
427 char *value = create_linkbutton_jsonvalue(NULL, uri, FALSE, FALSE, TRUE);
428 ui_set(str, value);
429 free(value);
430 }
431
432 void ui_linkbutton_value_set_visited(UiString *str, UiBool visited) {
433 char *value = create_linkbutton_jsonvalue(NULL, NULL, FALSE, visited, TRUE);
434 ui_set(str, value);
435 free(value);
436 }
437
438 // TODO
439
440 void ui_linkbutton_set_label(UIWIDGET button, const char *label) {
441
442 }
443
444 void ui_linkbutton_set_uri(UIWIDGET button, const char *label) {
445
446 }
447
448 void ui_linkbutton_set_visited(UIWIDGET button, UiBool visited) {
449
450 }
451
452 char* ui_linkbutton_get_label(UIWIDGET button) {
453 return NULL;
454 }
455
456 char* ui_linkbutton_get_uri(UIWIDGET button) {
457 return NULL;
458 }
459
460 UiBool ui_linkbutton_get_visited(UIWIDGET button) {
461 return FALSE;
462 }

mercurial