ui/gtk/button.c

changeset 112
c3f2f16fa4b8
parent 110
c00e968d018b
equal deleted inserted replaced
111:81c4f73236a4 112:c3f2f16fa4b8
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) {

mercurial