Sun, 19 Oct 2025 21:20:08 +0200
update toolkit
| 100 | 1 | /* |
| 2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. | |
| 3 | * | |
| 4 | * Copyright 2024 Olaf Wintermann. All rights reserved. | |
| 5 | * | |
| 6 | * Redistribution and use in source and binary forms, with or without | |
| 7 | * modification, are permitted provided that the following conditions are met: | |
| 8 | * | |
| 9 | * 1. Redistributions of source code must retain the above copyright | |
| 10 | * notice, this list of conditions and the following disclaimer. | |
| 11 | * | |
| 12 | * 2. Redistributions in binary form must reproduce the above copyright | |
| 13 | * notice, this list of conditions and the following disclaimer in the | |
| 14 | * documentation and/or other materials provided with the distribution. | |
| 15 | * | |
| 16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
| 17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
| 18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
| 19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | |
| 20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
| 21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
| 22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
| 23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |
| 24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
| 25 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
| 26 | * POSSIBILITY OF SUCH DAMAGE. | |
| 27 | */ | |
| 28 | ||
| 29 | #import "button.h" | |
| 30 | #import "EventData.h" | |
| 31 | #import "Container.h" | |
| 32 | #import <objc/runtime.h> | |
| 33 | ||
| 112 | 34 | #import <cx/buffer.h> |
| 35 | #import <cx/json.h> | |
| 36 | ||
|
108
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
37 | UIWIDGET ui_button_create(UiObject* obj, UiButtonArgs *args) { |
| 100 | 38 | NSButton *button = [[NSButton alloc] init]; |
| 112 | 39 | button.translatesAutoresizingMaskIntoConstraints = NO; |
|
108
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
40 | if(args->label) { |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
41 | NSString *label = [[NSString alloc] initWithUTF8String:args->label]; |
| 100 | 42 | button.title = label; |
| 43 | } | |
| 44 | ||
|
108
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
45 | if(args->onclick) { |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
46 | EventData *event = [[EventData alloc] init:args->onclick userdata:args->onclickdata]; |
| 100 | 47 | event.obj = obj; |
| 48 | button.target = event; | |
| 49 | button.action = @selector(handleEvent:); | |
| 50 | objc_setAssociatedObject(button, "eventdata", event, OBJC_ASSOCIATION_RETAIN); | |
| 51 | } | |
| 52 | ||
| 53 | UiLayout layout = UI_INIT_LAYOUT(args); | |
|
109
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
108
diff
changeset
|
54 | ui_container_add(obj, button, &layout); |
| 100 | 55 | |
| 56 | return (__bridge void*)button; | |
| 57 | } | |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
58 | |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
59 | |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
60 | static void togglebutton_eventdata(id button, UiVar *var, void **eventdata, int *value) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
61 | NSButton *btn = (NSButton*)button; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
62 | NSControlStateValue state = btn.state; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
63 | *value = (int)state; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
64 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
65 | |
|
108
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
66 | UIWIDGET togglebutton_create(UiObject* obj, UiToggleArgs *args, enum NSButtonType type) { |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
67 | NSButton *button = [[NSButton alloc] init]; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
68 | [button setButtonType:type]; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
69 | //[button setAllowsMixedState:YES]; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
70 | |
|
108
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
71 | if(args->label) { |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
72 | NSString *label = [[NSString alloc] initWithUTF8String:args->label]; |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
73 | button.title = label; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
74 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
75 | |
|
108
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
76 | UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER); |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
77 | if(var) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
78 | UiInteger *i = var->value; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
79 | i->obj = (__bridge void*)button; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
80 | i->get = ui_togglebutton_get; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
81 | i->set = ui_togglebutton_set; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
82 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
83 | |
|
108
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
84 | if(args->onchange) { |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
85 | EventData *event = [[EventData alloc] init:args->onchange userdata:args->onchangedata]; |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
86 | event.get_eventdata = togglebutton_eventdata; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
87 | event.obj = obj; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
88 | event.var = var; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
89 | event.vartype = UI_VAR_INTEGER; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
90 | button.target = event; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
91 | button.action = @selector(handleEventWithEventData:); |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
92 | objc_setAssociatedObject(button, "eventdata", event, OBJC_ASSOCIATION_RETAIN); |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
93 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
94 | |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
95 | UiLayout layout = UI_INIT_LAYOUT(args); |
|
109
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
108
diff
changeset
|
96 | ui_container_add(obj, button, &layout); |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
97 | |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
98 | return (__bridge void*)button; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
99 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
100 | |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
101 | int64_t ui_togglebutton_get(UiInteger *i) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
102 | NSButton *button = (__bridge NSButton*)i->obj; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
103 | NSControlStateValue state = button.state; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
104 | i->value = (int64_t)state; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
105 | return (int64_t)state; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
106 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
107 | |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
108 | void ui_togglebutton_set(UiInteger *i, int64_t value) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
109 | NSButton *button = (__bridge NSButton*)i->obj; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
110 | NSControlStateValue state; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
111 | switch(value) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
112 | case 0: state = NSControlStateValueOff; break; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
113 | case 1: state = NSControlStateValueOff; break; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
114 | default: state = NSControlStateValueMixed; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
115 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
116 | i->value = (int64_t)state; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
117 | button.state = state; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
118 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
119 | |
|
108
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
120 | UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs *args) { |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
121 | return togglebutton_create(obj, args, NSButtonTypePushOnPushOff); |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
122 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
123 | |
|
108
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
124 | UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs *args) { |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
125 | return togglebutton_create(obj, args, NSButtonTypeSwitch); |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
126 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
127 | |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
128 | static void switch_eventdata(id button, UiVar *var, void **eventdata, int *value) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
129 | NSSwitch *btn = (NSSwitch*)button; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
130 | NSControlStateValue state = btn.state; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
131 | *value = (int)state; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
132 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
133 | |
|
108
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
134 | UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs *args) { |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
135 | NSSwitch *button = [[NSSwitch alloc] init]; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
136 | |
|
108
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
137 | UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER); |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
138 | if(var) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
139 | UiInteger *i = var->value; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
140 | i->obj = (__bridge void*)button; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
141 | i->get = ui_switch_get; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
142 | i->set = ui_switch_set; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
143 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
144 | |
|
108
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
145 | if(args->onchange) { |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
146 | EventData *event = [[EventData alloc] init:args->onchange userdata:args->onchangedata]; |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
147 | event.get_eventdata = switch_eventdata; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
148 | event.obj = obj; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
149 | event.var = var; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
150 | event.vartype = UI_VAR_INTEGER; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
151 | button.target = event; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
152 | button.action = @selector(handleEventWithEventData:); |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
153 | objc_setAssociatedObject(button, "eventdata", event, OBJC_ASSOCIATION_RETAIN); |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
154 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
155 | |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
156 | UiLayout layout = UI_INIT_LAYOUT(args); |
|
109
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
108
diff
changeset
|
157 | ui_container_add(obj, button, &layout); |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
158 | |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
159 | return (__bridge void*)button; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
160 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
161 | |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
162 | int64_t ui_switch_get(UiInteger *i) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
163 | NSSwitch *button = (__bridge NSSwitch*)i->obj; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
164 | NSControlStateValue state = button.state; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
165 | i->value = (int64_t)state; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
166 | return (int64_t)state; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
167 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
168 | |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
169 | void ui_switch_set(UiInteger *i, int64_t value) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
170 | NSSwitch *button = (__bridge NSSwitch*)i->obj; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
171 | NSControlStateValue state; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
172 | switch(value) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
173 | case 0: state = NSControlStateValueOff; break; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
174 | case 1: state = NSControlStateValueOff; break; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
175 | default: state = NSControlStateValueMixed; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
176 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
177 | i->value = (int64_t)state; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
178 | button.state = state; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
179 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
180 | |
|
108
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
181 | |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
182 | @implementation UiRadioButton |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
183 | |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
184 | - (UiRadioButton*)init { |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
185 | self = [super init]; |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
186 | _direct_state = NO; |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
187 | [self setButtonType:NSButtonTypeRadio]; |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
188 | return self; |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
189 | } |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
190 | |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
191 | - (void)setState:(NSControlStateValue)state { |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
192 | // NOOP |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
193 | } |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
194 | |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
195 | @end |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
196 | |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
197 | static void radiobutton_eventdata(id button, UiVar *var, void **eventdata, int *value) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
198 | if(var) { |
|
108
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
199 | UiInteger *value = var->value; |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
200 | NSMutableArray *buttons = (__bridge NSMutableArray*)value->obj; |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
201 | for(UiRadioButton *b in buttons) { |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
202 | if(b != button) { |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
203 | b.direct_state = YES; |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
204 | [[b cell] setState:0]; |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
205 | b.direct_state = NO; |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
206 | } |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
207 | } |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
208 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
209 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
210 | |
|
108
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
211 | UIWIDGET ui_radiobutton_create(UiObject* obj, UiToggleArgs *args) { |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
212 | UiRadioButton *button = [[UiRadioButton alloc] init]; |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
213 | |
|
108
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
214 | if(args->label) { |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
215 | button.title = [[NSString alloc] initWithUTF8String:args->label]; |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
216 | } |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
217 | |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
218 | UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER); |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
219 | button.var = var; |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
220 | NSMutableArray *buttons = nil; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
221 | if(var) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
222 | UiInteger *i = var->value; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
223 | buttons = (__bridge NSMutableArray*)i->obj; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
224 | if(!buttons) { |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
225 | buttons = [[NSMutableArray alloc] init]; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
226 | i->obj = (__bridge void*)buttons; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
227 | i->get = ui_radiobuttons_get; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
228 | i->set = ui_radiobuttons_set; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
229 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
230 | [buttons addObject:button]; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
231 | objc_setAssociatedObject(button, "radiogroup", buttons, OBJC_ASSOCIATION_RETAIN); |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
232 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
233 | |
|
108
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
234 | if(args->onchange || var) { |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
235 | EventData *event = [[EventData alloc] init:args->onchange userdata:args->onchangedata]; |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
236 | event.get_eventdata = radiobutton_eventdata; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
237 | event.obj = obj; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
238 | event.var = var; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
239 | event.vartype = UI_VAR_INTEGER; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
240 | button.target = event; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
241 | |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
242 | |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
243 | button.action = @selector(handleEventWithEventData:); |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
244 | |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
245 | objc_setAssociatedObject(button, "eventdata", event, OBJC_ASSOCIATION_RETAIN); |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
246 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
247 | |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
248 | UiLayout layout = UI_INIT_LAYOUT(args); |
|
109
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
108
diff
changeset
|
249 | ui_container_add(obj, button, &layout); |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
250 | |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
251 | return (__bridge void*)button; |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
252 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
253 | |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
254 | int64_t ui_radiobuttons_get(UiInteger *i) { |
|
108
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
255 | NSMutableArray *buttons = (__bridge NSMutableArray*)i->obj; |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
256 | int64_t index = 0; |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
257 | for(UiRadioButton *b in buttons) { |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
258 | if([b cell].state != 0) { |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
259 | i->value = index + 1; |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
260 | break; |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
261 | } |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
262 | index++; |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
263 | } |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
264 | return i->value; |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
265 | } |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
266 | |
|
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
267 | void ui_radiobuttons_set(UiInteger *i, int64_t value) { |
|
108
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
268 | NSMutableArray *buttons = (__bridge NSMutableArray*)i->obj; |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
269 | int64_t index = 1; |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
270 | for(UiRadioButton *b in buttons) { |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
271 | if(index == value) { |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
272 | [b cell].state = NSControlStateValueOn; |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
273 | } else { |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
274 | [b cell].state = NSControlStateValueOff; |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
275 | } |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
276 | index++; |
|
77254bd6dccb
update toolkit, adjust UI code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
102
diff
changeset
|
277 | } |
|
102
64ded9f6a6c6
update libs (ucx, toolkit, libidav)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
100
diff
changeset
|
278 | } |
| 112 | 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 | } |