| 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 } |