# HG changeset patch # User Olaf Wintermann # Date 1758222289 -7200 # Node ID 155f8722b927f2bde0a8f246b18078d196e37462 # Parent 521ecd0a0e7b8fde516bc46a20c6d462eccedadc implement switch (GTK) diff -r 521ecd0a0e7b -r 155f8722b927 application/main.c --- a/application/main.c Wed Sep 17 18:22:47 2025 +0200 +++ b/application/main.c Thu Sep 18 21:04:49 2025 +0200 @@ -609,6 +609,9 @@ ui_spinbox(obj, .step = 5); ui_newline(obj); + + ui_switch(obj, .varname = "switch"); + ui_newline(obj); ui_progressbar(obj, .colspan = 2, .varname = "progress"); ui_set(doc->progress, 0.75); diff -r 521ecd0a0e7b -r 155f8722b927 ui/gtk/button.c --- a/ui/gtk/button.c Wed Sep 17 18:22:47 2025 +0200 +++ b/ui/gtk/button.c Thu Sep 18 21:04:49 2025 +0200 @@ -382,13 +382,98 @@ } #endif + +#if GTK_MAJOR_VERSION >= 3 + +static void switch_changed( + GObject *gobject, + GParamSpec *pspec, + UiVarEventData *event) +{ + GtkSwitch *sw = GTK_SWITCH (gobject); + gboolean active = gtk_switch_get_active (sw); + + UiEvent e; + e.obj = event->obj; + e.document = e.obj->ctx->document; + e.window = e.obj->window; + e.eventdata = NULL; + e.eventdatatype = 0; + e.set = ui_get_setop(); + + if(event->callback) { + event->callback(&e, event->userdata); + } + if(event->var) { + UiInteger *i = event->var->value; + ui_notify_evt(i->observers, &e); + } +} + UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs *args) { -#ifdef UI_GTK3 - return NULL; // TODO + UiObject* current = uic_current_obj(obj); + GtkWidget *widget = gtk_switch_new(); + ui_set_name_and_style(widget, args->name, args->style_class); + ui_set_widget_groups(obj->ctx, widget, args->groups); + + UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_INTEGER); + if(var) { + UiInteger *value = var->value; + value->obj = widget; + value->get = ui_switch_get; + value->set = ui_switch_set; + + if(value->value) { + gtk_switch_set_active(GTK_SWITCH(widget), TRUE); + } + + + } + + UiVarEventData *event = malloc(sizeof(UiVarEventData)); + event->obj = obj; + event->callback = args->onchange; + event->userdata = args->onchangedata; + event->var = var; + event->observers = NULL; + + g_signal_connect( + widget, + "notify::active", + G_CALLBACK(switch_changed), + event); + + g_signal_connect( + widget, + "destroy", + G_CALLBACK(ui_destroy_vardata), + event); + + UI_APPLY_LAYOUT2(current, args); + current->container->add(current->container, widget); + + return widget; +} + +int64_t ui_switch_get(UiInteger *value) { + GtkSwitch *sw = GTK_SWITCH((GtkWidget*)value->obj); + value->value = gtk_switch_get_active(sw); + return value->value; +} + +void ui_switch_set(UiInteger *value, int64_t i) { + GtkSwitch *sw = GTK_SWITCH((GtkWidget*)value->obj); + value->value = i; + gtk_switch_set_active(sw, i); +} + #else + +UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs *args) { return ui_checkbox_create(obj, args); +} + #endif -} #if GTK_MAJOR_VERSION >= 4 #define RADIOBUTTON_NEW(group, label) gtk_check_button_new_with_label(label) diff -r 521ecd0a0e7b -r 155f8722b927 ui/gtk/button.h --- a/ui/gtk/button.h Wed Sep 17 18:22:47 2025 +0200 +++ b/ui/gtk/button.h Thu Sep 18 21:04:49 2025 +0200 @@ -96,6 +96,9 @@ void ui_radio_obs(GtkToggleButton *widget, UiVarEventData *event); +int64_t ui_switch_get(UiInteger *value); +void ui_switch_set(UiInteger *value, int64_t i); + int64_t ui_radiobutton_get(UiInteger *value); void ui_radiobutton_set(UiInteger *value, int64_t i);