ui/win32/button.c

changeset 895
f24d07479843
parent 880
9c99ff36513f
child 896
ae0ad20122cc
equal deleted inserted replaced
894:5e53ef72a5d3 895:f24d07479843
34 34
35 #include <commctrl.h> 35 #include <commctrl.h>
36 36
37 static W32WidgetClass button_widget_class = { 37 static W32WidgetClass button_widget_class = {
38 .eventproc = ui_button_eventproc, 38 .eventproc = ui_button_eventproc,
39 .enable = w32_widget_default_enable,
40 .show = w32_widget_default_show,
41 .get_preferred_size = ui_button_get_preferred_size,
42 .destroy = w32_widget_default_destroy
43 };
44
45 static W32WidgetClass togglebutton_widget_class = {
46 .eventproc = ui_togglebutton_eventproc,
39 .enable = w32_widget_default_enable, 47 .enable = w32_widget_default_enable,
40 .show = w32_widget_default_show, 48 .show = w32_widget_default_show,
41 .get_preferred_size = ui_button_get_preferred_size, 49 .get_preferred_size = ui_button_get_preferred_size,
42 .destroy = w32_widget_default_destroy 50 .destroy = w32_widget_default_destroy
43 }; 51 };
83 } 91 }
84 92
85 void ui_button_eventproc(W32Widget *widget, HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 93 void ui_button_eventproc(W32Widget *widget, HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
86 UiWidget *w = (UiWidget*)widget; 94 UiWidget *w = (UiWidget*)widget;
87 95
88 printf("button eventproc\n"); 96 if (uMsg != WM_COMMAND) {
89 fflush(stdout); 97 return;
98 }
90 99
91 UiEvent e; 100 UiEvent e;
92 e.obj = w->obj; 101 e.obj = w->obj;
93 e.document = e.obj->ctx->document; 102 e.document = e.obj->ctx->document;
94 e.window = e.obj->window; 103 e.window = e.obj->window;
99 108
100 if (w->callback) { 109 if (w->callback) {
101 w->callback(&e, w->callbackdata); 110 w->callback(&e, w->callbackdata);
102 } 111 }
103 } 112 }
113
114 static UIWIDGET create_togglebutton(UiObject *obj, UiToggleArgs *args, unsigned long type) {
115 HINSTANCE hInstance = GetModuleHandle(NULL);
116 UiContainerPrivate *container = ui_obj_container(obj);
117 HWND parent = ui_container_get_parent(container);
118 UiLayout layout = UI_ARGS2LAYOUT(args);
119
120 HWND hwnd = CreateWindow(
121 "BUTTON",
122 args->label,
123 WS_VISIBLE | WS_CHILD | type,
124 0, 0, 100, 30,
125 parent,
126 (HMENU)1,
127 hInstance,
128 NULL);
129 ui_win32_set_ui_font(hwnd);
130
131 W32Widget *widget = w32_widget_create(&togglebutton_widget_class, hwnd, sizeof(UiWidget));
132 ui_container_add(container, widget, &layout);
133
134 UiVar *var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER);
135 if (var) {
136 UiInteger *i = var->value;
137 i->obj = widget;
138 i->get = ui_togglebutton_get;
139 i->set = ui_togglebutton_set;
140 if (i->value != 0) {
141 SendMessage(hwnd, BM_SETCHECK, BST_CHECKED, 0);
142 }
143 }
144
145 UiWidget *btn = (UiWidget*)widget;
146 btn->obj = obj;
147 btn->var = var;
148 btn->callback = args->onchange;
149 btn->callbackdata = args->onchangedata;
150
151 return widget;
152 }
153
154 UIWIDGET ui_togglebutton_create(UiObject *obj, UiToggleArgs *args) {
155 return create_togglebutton(obj, args, BS_AUTOCHECKBOX | BS_PUSHLIKE);
156 }
157
158 UIWIDGET ui_checkbox_create(UiObject *obj, UiToggleArgs *args) {
159 return create_togglebutton(obj, args, BS_AUTOCHECKBOX);
160 }
161
162 UIWIDGET ui_switch_create(UiObject *obj, UiToggleArgs *args) {
163 return create_togglebutton(obj, args, BS_AUTOCHECKBOX);
164 }
165
166 int64_t ui_togglebutton_get(UiInteger *i) {
167 UiWidget *btn = (UiWidget*)i->obj;
168 LRESULT state = SendMessage(btn->widget.hwnd, BM_GETCHECK, 0, 0);
169 i->value = state;
170 return state;
171 }
172
173 void ui_togglebutton_set(UiInteger *i, int64_t v) {
174 UiWidget *btn = (UiWidget*)i->obj;
175 WPARAM state = v ? BST_CHECKED : BST_UNCHECKED;
176 SendMessage(btn->widget.hwnd, BM_SETCHECK, state, 0);
177 i->value = v;
178 }
179
180 void ui_togglebutton_eventproc(W32Widget *widget, HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
181 if (uMsg != WM_COMMAND) {
182 return;
183 }
184 UiWidget *w = (UiWidget*)widget;
185
186 UiEvent e;
187 e.obj = w->obj;
188 e.document = e.obj->ctx->document;
189 e.window = e.obj->window;
190 e.eventdata = NULL;
191 e.eventdatatype = 0;
192 e.intval = SendMessage(w->widget.hwnd, BM_GETCHECK, 0, 0);
193 e.set = ui_get_setop();
194
195 if (w->callback) {
196 w->callback(&e, w->callbackdata);
197 }
198 }

mercurial