#include <stdio.h>
#include <stdlib.h>
#include "button.h"
#include "container.h"
#include <ucx/mempool.h>
#include "../common/context.h"
#include "../common/object.h"
UIWIDGET ui_button(UiObject *obj,
char *label, ui_callback f,
void *data) {
GtkWidget *button = gtk_button_new_with_label(label);
if(f) {
UiEventData *event = malloc(
sizeof(UiEventData));
event->obj = obj;
event->userdata = data;
event->callback = f;
event->value =
0;
g_signal_connect(
button,
"clicked",
G_CALLBACK(ui_button_clicked),
event);
g_signal_connect(
button,
"destroy",
G_CALLBACK(ui_destroy_userdata),
event);
}
UiContainer *ct = uic_get_current_container(obj);
ct->add(ct, button,
FALSE);
return button;
}
void ui_button_clicked(GtkWidget *widget, UiEventData *event) {
UiEvent e;
e.obj = event->obj;
e.window = event->obj->window;
e.document = event->obj->ctx->document;
e.eventdata =
NULL;
e.intval = event->value;
event->callback(&e, event->userdata);
}
int64_t ui_toggle_button_get(UiInteger *integer) {
GtkToggleButton *button = integer->obj;
integer->value = (
int)gtk_toggle_button_get_active(button);
return integer->value;
}
void ui_toggle_button_set(UiInteger *integer,
int64_t value) {
GtkToggleButton *button = integer->obj;
integer->value = value;
gtk_toggle_button_set_active(button, value !=
0 ?
TRUE :
FALSE);
}
void ui_toggled_obs(GtkToggleToolButton *widget, UiVarEventData *event) {
UiEvent e;
e.obj = event->obj;
e.window = event->obj->window;
e.document = event->obj->ctx->document;
e.eventdata = event->var->value;
e.intval = gtk_toggle_tool_button_get_active(widget);
UiInteger *i = event->var->value;
ui_notify_evt(i->observers, &e);
}
UIWIDGET ui_checkbox_var(UiObject *obj,
char *label, UiVar *var) {
GtkWidget *button = gtk_check_button_new_with_label(label);
if(var) {
UiInteger *value = var->value;
value->obj =
GTK_TOGGLE_BUTTON(button);
value->get = ui_toggle_button_get;
value->set = ui_toggle_button_set;
gtk_toggle_button_set_active(value->obj, value->value);
UiVarEventData *event = malloc(
sizeof(UiVarEventData));
event->obj = obj;
event->var = var;
event->observers =
NULL;
g_signal_connect(
button,
"clicked",
G_CALLBACK(ui_toggled_obs),
event);
g_signal_connect(
button,
"destroy",
G_CALLBACK(ui_destroy_vardata),
event);
}
UiContainer *ct = uic_get_current_container(obj);
ct->add(ct, button,
FALSE);
return button;
}
UIWIDGET ui_checkbox(UiObject *obj,
char *label, UiInteger *value) {
UiVar *var =
NULL;
if(value) {
var = malloc(
sizeof(UiVar));
var->value = value;
var->type =
UI_VAR_SPECIAL;
}
return ui_checkbox_var(obj, label, var);
}
UIWIDGET ui_checkbox_nv(UiObject *obj,
char *label,
char *varname) {
UiVar *var = uic_create_var(obj->ctx, varname,
UI_VAR_INTEGER);
return ui_checkbox_var(obj, label, var);
}
UIWIDGET ui_radiobutton_var(UiObject *obj,
char *label, UiVar *var) {
GSList *rg =
NULL;
UiInteger *rgroup;
if(var) {
rgroup = var->value;
rg = rgroup->obj;
}
GtkWidget *rbutton = gtk_radio_button_new_with_label(rg, label);
rg = gtk_radio_button_get_group(
GTK_RADIO_BUTTON(rbutton));
if(rgroup) {
rgroup->obj = rg;
rgroup->get = ui_radiobutton_get;
rgroup->set = ui_radiobutton_set;
ui_radiobutton_set(rgroup, rgroup->value);
UiVarEventData *event = malloc(
sizeof(UiVarEventData));
event->obj = obj;
event->var = var;
event->observers =
NULL;
g_signal_connect(
rbutton,
"clicked",
G_CALLBACK(ui_radio_obs),
event);
g_signal_connect(
rbutton,
"destroy",
G_CALLBACK(ui_destroy_vardata),
event);
}
UiContainer *ct = uic_get_current_container(obj);
ct->add(ct, rbutton,
FALSE);
return rbutton;
}
UIWIDGET ui_radiobutton(UiObject *obj,
char *label, UiInteger *rgroup) {
UiVar *var =
NULL;
if(rgroup) {
var = malloc(
sizeof(UiVar));
var->value = rgroup;
var->type =
UI_VAR_SPECIAL;
}
return ui_radiobutton_var(obj, label, var);
}
UIWIDGET ui_radiobutton_nv(UiObject *obj,
char *label,
char *varname) {
UiVar *var = uic_create_var(obj->ctx, varname,
UI_VAR_INTEGER);
return ui_radiobutton_var(obj, label, var);
}
void ui_radio_obs(GtkToggleToolButton *widget, UiVarEventData *event) {
UiInteger *i = event->var->value;
UiEvent e;
e.obj = event->obj;
e.window = event->obj->window;
e.document = event->obj->ctx->document;
e.eventdata =
NULL;
e.intval = i->get(i);
ui_notify_evt(i->observers, &e);
}
int64_t ui_radiobutton_get(UiInteger *value) {
int selection =
0;
GSList *ls = value->obj;
int i =
0;
guint len = g_slist_length(ls);
while(ls) {
if(gtk_toggle_button_get_active(
GTK_TOGGLE_BUTTON(ls->data))) {
selection = len - i -
1;
break;
}
ls = ls->next;
i++;
}
value->value = selection;
return selection;
}
void ui_radiobutton_set(UiInteger *value,
int64_t i) {
GSList *ls = value->obj;
int s = g_slist_length(ls) -
1 - i;
int j =
0;
while(ls) {
if(j == s) {
gtk_toggle_button_set_active(
GTK_TOGGLE_BUTTON(ls->data),
TRUE);
break;
}
ls = ls->next;
j++;
}
value->value = i;
}