| 58 |
58 |
| 59 GtkWidget* ui_create_button( |
59 GtkWidget* ui_create_button( |
| 60 UiObject *obj, |
60 UiObject *obj, |
| 61 const char *label, |
61 const char *label, |
| 62 const char *icon, |
62 const char *icon, |
| |
63 const char *tooltip, |
| 63 ui_callback onclick, |
64 ui_callback onclick, |
| 64 void *userdata, |
65 void *userdata, |
| 65 int event_value, |
66 int event_value, |
| 66 bool activate_event) |
67 bool activate_event) |
| 67 { |
68 { |
| 68 GtkWidget *button = gtk_button_new_with_label(label); |
69 GtkWidget *button = gtk_button_new_with_label(label); |
| 69 ui_button_set_icon_name(button, icon); |
70 ui_button_set_icon_name(button, icon); |
| |
71 if(tooltip) { |
| |
72 gtk_widget_set_tooltip_text(button, tooltip); |
| |
73 } |
| 70 |
74 |
| 71 if(onclick) { |
75 if(onclick) { |
| 72 UiEventData *event = malloc(sizeof(UiEventData)); |
76 UiEventData *event = malloc(sizeof(UiEventData)); |
| 73 event->obj = obj; |
77 event->obj = obj; |
| 74 event->userdata = userdata; |
78 event->userdata = userdata; |
| 98 |
102 |
| 99 return button; |
103 return button; |
| 100 } |
104 } |
| 101 |
105 |
| 102 UIWIDGET ui_button_create(UiObject *obj, UiButtonArgs *args) { |
106 UIWIDGET ui_button_create(UiObject *obj, UiButtonArgs *args) { |
| 103 UiObject* current = uic_current_obj(obj); |
107 GtkWidget *button = ui_create_button(obj, args->label, args->icon, args->tooltip, args->onclick, args->onclickdata, 0, FALSE); |
| 104 GtkWidget *button = ui_create_button(obj, args->label, args->icon, args->onclick, args->onclickdata, 0, FALSE); |
|
| 105 ui_set_name_and_style(button, args->name, args->style_class); |
108 ui_set_name_and_style(button, args->name, args->style_class); |
| 106 ui_set_widget_groups(obj->ctx, button, args->groups); |
109 ui_set_widget_groups(obj->ctx, button, args->groups); |
| 107 UI_APPLY_LAYOUT2(current, args); |
110 UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; |
| 108 current->container->add(current->container, button); |
111 UiLayout layout = UI_ARGS2LAYOUT(args); |
| |
112 ct->add(ct, button, &layout); |
| 109 return button; |
113 return button; |
| 110 } |
114 } |
| 111 |
115 |
| 112 |
116 |
| 113 void ui_button_clicked(GtkWidget *widget, UiEventData *event) { |
117 void ui_button_clicked(GtkWidget *widget, UiEventData *event) { |
| 179 void ui_setup_togglebutton( |
183 void ui_setup_togglebutton( |
| 180 UiObject *obj, |
184 UiObject *obj, |
| 181 GtkWidget *togglebutton, |
185 GtkWidget *togglebutton, |
| 182 const char *label, |
186 const char *label, |
| 183 const char *icon, |
187 const char *icon, |
| |
188 const char *tooltip, |
| 184 const char *varname, |
189 const char *varname, |
| 185 UiInteger *value, |
190 UiInteger *value, |
| 186 ui_callback onchange, |
191 ui_callback onchange, |
| 187 void *onchangedata, |
192 void *onchangedata, |
| 188 int enable_state) |
193 int enable_state) |
| 189 { |
194 { |
| 190 if(label) { |
195 if(label) { |
| 191 gtk_button_set_label(GTK_BUTTON(togglebutton), label); |
196 gtk_button_set_label(GTK_BUTTON(togglebutton), label); |
| 192 } |
197 } |
| 193 ui_button_set_icon_name(togglebutton, icon); |
198 ui_button_set_icon_name(togglebutton, icon); |
| |
199 if(tooltip) { |
| |
200 gtk_widget_set_tooltip_text(togglebutton, tooltip); |
| |
201 } |
| 194 |
202 |
| 195 ui_bind_togglebutton( |
203 ui_bind_togglebutton( |
| 196 obj, |
204 obj, |
| 197 togglebutton, |
205 togglebutton, |
| 198 ui_toggle_button_get, |
206 ui_toggle_button_get, |
| 218 ui_callback onchange, |
226 ui_callback onchange, |
| 219 void *onchangedata, |
227 void *onchangedata, |
| 220 void (*enable_state_func)(void*, void*), |
228 void (*enable_state_func)(void*, void*), |
| 221 int enable_state) |
229 int enable_state) |
| 222 { |
230 { |
| 223 UiObject* current = uic_current_obj(obj); |
231 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, value, varname, UI_VAR_INTEGER); |
| 224 UiVar* var = uic_widget_var(obj->ctx, current->ctx, value, varname, UI_VAR_INTEGER); |
|
| 225 if (var) { |
232 if (var) { |
| 226 UiInteger* value = (UiInteger*)var->value; |
233 UiInteger* value = (UiInteger*)var->value; |
| 227 value->obj = widget; |
234 value->obj = widget; |
| 228 value->get = getfunc; |
235 value->get = getfunc; |
| 229 value->set = setfunc; |
236 value->set = setfunc; |
| 289 event); |
296 event); |
| 290 } |
297 } |
| 291 } |
298 } |
| 292 |
299 |
| 293 static UIWIDGET togglebutton_create(UiObject *obj, GtkWidget *widget, UiToggleArgs *args) { |
300 static UIWIDGET togglebutton_create(UiObject *obj, GtkWidget *widget, UiToggleArgs *args) { |
| 294 UiObject* current = uic_current_obj(obj); |
|
| 295 |
|
| 296 ui_setup_togglebutton( |
301 ui_setup_togglebutton( |
| 297 obj, |
302 obj, |
| 298 widget, |
303 widget, |
| 299 args->label, |
304 args->label, |
| 300 args->icon, |
305 args->icon, |
| |
306 args->tooltip, |
| 301 args->varname, |
307 args->varname, |
| 302 args->value, |
308 args->value, |
| 303 args->onchange, |
309 args->onchange, |
| 304 args->onchangedata, |
310 args->onchangedata, |
| 305 args->enable_group); |
311 args->enable_group); |
| 306 ui_set_name_and_style(widget, args->name, args->style_class); |
312 ui_set_name_and_style(widget, args->name, args->style_class); |
| 307 ui_set_widget_groups(obj->ctx, widget, args->groups); |
313 ui_set_widget_groups(obj->ctx, widget, args->groups); |
| 308 |
314 |
| 309 UI_APPLY_LAYOUT2(current, args); |
315 UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; |
| 310 current->container->add(current->container, widget); |
316 UiLayout layout = UI_ARGS2LAYOUT(args); |
| |
317 ct->add(ct, widget, &layout); |
| 311 |
318 |
| 312 return widget; |
319 return widget; |
| 313 } |
320 } |
| 314 |
321 |
| 315 UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs *args) { |
322 UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs *args) { |
| 348 } else { |
355 } else { |
| 349 ui_unset_group(event->obj->ctx, event->value); |
356 ui_unset_group(event->obj->ctx, event->value); |
| 350 } |
357 } |
| 351 } |
358 } |
| 352 |
359 |
| 353 UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs *args) { |
360 UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs *args) { |
| 354 UiObject* current = uic_current_obj(obj); |
|
| 355 |
|
| 356 GtkWidget *widget = gtk_check_button_new_with_label(args->label); |
361 GtkWidget *widget = gtk_check_button_new_with_label(args->label); |
| 357 ui_bind_togglebutton( |
362 ui_bind_togglebutton( |
| 358 obj, |
363 obj, |
| 359 widget, |
364 widget, |
| 360 ui_check_button_get, |
365 ui_check_button_get, |
| 368 args->enable_group); |
373 args->enable_group); |
| 369 |
374 |
| 370 ui_set_name_and_style(widget, args->name, args->style_class); |
375 ui_set_name_and_style(widget, args->name, args->style_class); |
| 371 ui_set_widget_groups(obj->ctx, widget, args->groups); |
376 ui_set_widget_groups(obj->ctx, widget, args->groups); |
| 372 |
377 |
| 373 UI_APPLY_LAYOUT2(current, args); |
378 UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; |
| 374 current->container->add(current->container, widget); |
379 UiLayout layout = UI_ARGS2LAYOUT(args); |
| |
380 ct->add(ct, widget, &layout); |
| 375 |
381 |
| 376 return widget; |
382 return widget; |
| 377 } |
383 } |
| 378 |
384 |
| 379 #else |
385 #else |
| 409 ui_notify_evt(i->observers, &e); |
415 ui_notify_evt(i->observers, &e); |
| 410 } |
416 } |
| 411 } |
417 } |
| 412 |
418 |
| 413 UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs *args) { |
419 UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs *args) { |
| 414 UiObject* current = uic_current_obj(obj); |
|
| 415 GtkWidget *widget = gtk_switch_new(); |
420 GtkWidget *widget = gtk_switch_new(); |
| 416 ui_set_name_and_style(widget, args->name, args->style_class); |
421 ui_set_name_and_style(widget, args->name, args->style_class); |
| 417 ui_set_widget_groups(obj->ctx, widget, args->groups); |
422 ui_set_widget_groups(obj->ctx, widget, args->groups); |
| 418 |
423 |
| 419 UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_INTEGER); |
424 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER); |
| 420 if(var) { |
425 if(var) { |
| 421 UiInteger *value = var->value; |
426 UiInteger *value = var->value; |
| 422 value->obj = widget; |
427 value->obj = widget; |
| 423 value->get = ui_switch_get; |
428 value->get = ui_switch_get; |
| 424 value->set = ui_switch_set; |
429 value->set = ui_switch_set; |
| 447 widget, |
452 widget, |
| 448 "destroy", |
453 "destroy", |
| 449 G_CALLBACK(ui_destroy_vardata), |
454 G_CALLBACK(ui_destroy_vardata), |
| 450 event); |
455 event); |
| 451 |
456 |
| 452 UI_APPLY_LAYOUT2(current, args); |
457 UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; |
| 453 current->container->add(current->container, widget); |
458 UiLayout layout = UI_ARGS2LAYOUT(args); |
| |
459 ct->add(ct, widget, &layout); |
| 454 |
460 |
| 455 return widget; |
461 return widget; |
| 456 } |
462 } |
| 457 |
463 |
| 458 int64_t ui_switch_get(UiInteger *value) { |
464 int64_t ui_switch_get(UiInteger *value) { |
| 517 } |
523 } |
| 518 free(data); |
524 free(data); |
| 519 } |
525 } |
| 520 |
526 |
| 521 UIWIDGET ui_radiobutton_create(UiObject *obj, UiToggleArgs *args) { |
527 UIWIDGET ui_radiobutton_create(UiObject *obj, UiToggleArgs *args) { |
| 522 UiObject* current = uic_current_obj(obj); |
|
| 523 |
|
| 524 GSList *rg = NULL; |
528 GSList *rg = NULL; |
| 525 UiInteger *rgroup; |
529 UiInteger *rgroup; |
| 526 |
530 |
| 527 UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_INTEGER); |
531 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER); |
| 528 |
532 |
| 529 UiBool first = FALSE; |
533 UiBool first = FALSE; |
| 530 if(var) { |
534 if(var) { |
| 531 rgroup = var->value; |
535 rgroup = var->value; |
| 532 rg = rgroup->obj; |
536 rg = rgroup->obj; |
| 598 "destroy", |
602 "destroy", |
| 599 G_CALLBACK(ui_destroy_userdata), |
603 G_CALLBACK(ui_destroy_userdata), |
| 600 event); |
604 event); |
| 601 } |
605 } |
| 602 |
606 |
| 603 UI_APPLY_LAYOUT2(current, args); |
607 UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; |
| 604 current->container->add(current->container, rbutton); |
608 UiLayout layout = UI_ARGS2LAYOUT(args); |
| |
609 ct->add(ct, rbutton, &layout); |
| 605 |
610 |
| 606 return rbutton; |
611 return rbutton; |
| 607 } |
612 } |
| 608 |
613 |
| 609 void ui_radio_obs(GtkToggleButton *widget, UiVarEventData *event) { |
614 void ui_radio_obs(GtkToggleButton *widget, UiVarEventData *event) { |
| 798 const char *uri = linkbutton_get_uri(link); |
803 const char *uri = linkbutton_get_uri(link); |
| 799 gboolean visited = linkbutton_get_visited(link); |
804 gboolean visited = linkbutton_get_visited(link); |
| 800 return create_linkbutton_jsonvalue(label, uri, TRUE, visited, TRUE); |
805 return create_linkbutton_jsonvalue(label, uri, TRUE, visited, TRUE); |
| 801 } |
806 } |
| 802 |
807 |
| 803 static void linkbutton_clicked(GtkWidget *widget, UiLinkButton *data) { |
808 static void linkbutton_callback(GtkWidget *widget, UiLinkButton *data) { |
| 804 if(data->onclick) { |
809 if(data->onclick) { |
| 805 UiEvent e; |
810 UiEvent e; |
| 806 e.obj = data->obj; |
811 e.obj = data->obj; |
| 807 e.document = e.obj->ctx->document; |
812 e.document = e.obj->ctx->document; |
| 808 e.window = e.obj->window; |
813 e.window = e.obj->window; |
| 812 e.set = ui_get_setop(); |
817 e.set = ui_get_setop(); |
| 813 data->onclick(&e, data->onclickdata); |
818 data->onclick(&e, data->onclickdata); |
| 814 } |
819 } |
| 815 } |
820 } |
| 816 |
821 |
| |
822 static void linkbutton_clicked(GtkWidget *widget, UiLinkButton *data) { |
| |
823 linkbutton_callback(widget, data); |
| |
824 if(data->link) { |
| |
825 #if GTK_CHECK_VERSION(4, 0, 0) |
| |
826 GtkUriLauncher *launcher = gtk_uri_launcher_new (data->link); |
| |
827 gtk_uri_launcher_launch (launcher, NULL, NULL, NULL, NULL); |
| |
828 g_object_unref (launcher); |
| |
829 #elif GTK_CHECK_VERSION(3, 22, 0) |
| |
830 GError *error = NULL; |
| |
831 gtk_show_uri_on_window(NULL, data->link, GDK_CURRENT_TIME, &error); |
| |
832 #elif |
| |
833 // TODO: call xdg-open |
| |
834 #endif |
| |
835 } |
| |
836 } |
| |
837 |
| 817 static gboolean linkbutton_activate_link(GtkLinkButton *self, UiLinkButton *data) { |
838 static gboolean linkbutton_activate_link(GtkLinkButton *self, UiLinkButton *data) { |
| 818 linkbutton_clicked(data->widget, data); |
839 linkbutton_callback(data->widget, data); |
| 819 return data->nofollow; |
840 return data->nofollow; |
| 820 } |
841 } |
| 821 |
842 |
| 822 UIWIDGET ui_linkbutton_create(UiObject *obj, UiLinkButtonArgs *args) { |
843 UIWIDGET ui_linkbutton_create(UiObject *obj, UiLinkButtonArgs *args) { |
| 823 UiLinkButton *data = malloc(sizeof(UiLinkButton)); |
844 UiLinkButton *data = malloc(sizeof(UiLinkButton)); |
| 858 G_CALLBACK(ui_destroy_linkbutton), |
879 G_CALLBACK(ui_destroy_linkbutton), |
| 859 data); |
880 data); |
| 860 |
881 |
| 861 data->widget = button; |
882 data->widget = button; |
| 862 |
883 |
| 863 UiObject* current = uic_current_obj(obj); |
884 UiVar *var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_STRING); |
| 864 UiVar *var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_STRING); |
|
| 865 if(var) { |
885 if(var) { |
| 866 UiString *str = var->value; |
886 UiString *str = var->value; |
| 867 char *current_value = ui_get(str); |
887 char *current_value = ui_get(str); |
| 868 if(current_value) { |
888 if(current_value) { |
| 869 linkbutton_apply_value(data, current_value); |
889 linkbutton_apply_value(data, current_value); |
| 874 str->set = ui_linkbutton_set; |
894 str->set = ui_linkbutton_set; |
| 875 } |
895 } |
| 876 |
896 |
| 877 ui_set_name_and_style(button, args->name, args->style_class); |
897 ui_set_name_and_style(button, args->name, args->style_class); |
| 878 ui_set_widget_groups(obj->ctx, button, args->groups); |
898 ui_set_widget_groups(obj->ctx, button, args->groups); |
| 879 UI_APPLY_LAYOUT2(current, args); |
899 UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; |
| 880 current->container->add(current->container, button); |
900 UiLayout layout = UI_ARGS2LAYOUT(args); |
| |
901 ct->add(ct, button, &layout); |
| 881 |
902 |
| 882 return button; |
903 return button; |
| 883 } |
904 } |
| 884 |
905 |
| 885 char* ui_linkbutton_get(UiString *s) { |
906 char* ui_linkbutton_get(UiString *s) { |