2015-06-11 18:07:06 -05:00
|
|
|
// 11 june 2015
|
|
|
|
#include "uipriv_unix.h"
|
|
|
|
|
2015-08-27 15:17:18 -05:00
|
|
|
struct uiCombobox {
|
|
|
|
uiUnixControl c;
|
2015-06-11 18:07:06 -05:00
|
|
|
GtkWidget *widget;
|
2015-06-27 18:57:10 -05:00
|
|
|
GtkComboBox *combobox;
|
|
|
|
GtkComboBoxText *comboboxText;
|
2015-10-08 13:55:18 -05:00
|
|
|
void (*onSelected)(uiCombobox *, void *);
|
|
|
|
void *onSelectedData;
|
2015-10-09 12:54:34 -05:00
|
|
|
gulong onSelectedSignal;
|
2015-06-11 18:07:06 -05:00
|
|
|
};
|
|
|
|
|
2015-08-27 15:17:18 -05:00
|
|
|
uiUnixDefineControl(
|
|
|
|
uiCombobox, // type name
|
|
|
|
uiComboboxType // type function
|
|
|
|
)
|
2015-06-11 18:07:06 -05:00
|
|
|
|
2015-10-08 13:55:18 -05:00
|
|
|
// TODO this is triggered when editing an editable combobox's text
|
|
|
|
static void onChanged(GtkComboBox *cbox, gpointer data)
|
|
|
|
{
|
|
|
|
uiCombobox *c = uiCombobox(data);
|
|
|
|
|
|
|
|
(*(c->onSelected))(c, c->onSelectedData);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void defaultOnSelected(uiCombobox *c, void *data)
|
|
|
|
{
|
|
|
|
// do nothing
|
|
|
|
}
|
|
|
|
|
2015-08-27 15:17:18 -05:00
|
|
|
void uiComboboxAppend(uiCombobox *c, const char *text)
|
2015-06-11 18:07:06 -05:00
|
|
|
{
|
2015-07-01 10:29:19 -05:00
|
|
|
gtk_combo_box_text_append(c->comboboxText, NULL, text);
|
2015-06-11 18:07:06 -05:00
|
|
|
}
|
|
|
|
|
2015-10-08 13:55:18 -05:00
|
|
|
intmax_t uiComboboxSelected(uiCombobox *c)
|
|
|
|
{
|
|
|
|
return gtk_combo_box_get_active(c->combobox);
|
|
|
|
}
|
|
|
|
|
2015-10-09 12:54:34 -05:00
|
|
|
void uiComboboxSetSelected(uiCombobox *c, intmax_t n)
|
|
|
|
{
|
|
|
|
// we need to inhibit sending of ::changed because this WILL send a ::changed otherwise
|
|
|
|
g_signal_handler_block(c->combobox, c->onSelectedSignal);
|
|
|
|
gtk_combo_box_set_active(c->combobox, n);
|
|
|
|
g_signal_handler_unblock(c->combobox, c->onSelectedSignal);
|
|
|
|
}
|
|
|
|
|
2015-10-08 13:55:18 -05:00
|
|
|
void uiComboboxOnSelected(uiCombobox *c, void (*f)(uiCombobox *c, void *data), void *data)
|
|
|
|
{
|
|
|
|
c->onSelected = f;
|
|
|
|
c->onSelectedData = data;
|
|
|
|
}
|
|
|
|
|
2015-06-27 18:57:10 -05:00
|
|
|
static uiCombobox *finishNewCombobox(GtkWidget *(*newfunc)(void))
|
2015-06-11 18:07:06 -05:00
|
|
|
{
|
2015-08-27 15:17:18 -05:00
|
|
|
uiCombobox *c;
|
2015-06-11 18:07:06 -05:00
|
|
|
|
2015-08-28 09:10:52 -05:00
|
|
|
c = (uiCombobox *) uiNewControl(uiComboboxType());
|
2015-06-11 18:07:06 -05:00
|
|
|
|
2015-06-27 18:57:10 -05:00
|
|
|
c->widget = (*newfunc)();
|
|
|
|
c->combobox = GTK_COMBO_BOX(c->widget);
|
|
|
|
c->comboboxText = GTK_COMBO_BOX_TEXT(c->widget);
|
2015-06-11 18:07:06 -05:00
|
|
|
|
2015-10-09 12:54:34 -05:00
|
|
|
c->onSelectedSignal = g_signal_connect(c->widget, "changed", G_CALLBACK(onChanged), c);
|
2015-10-08 13:55:18 -05:00
|
|
|
uiComboboxOnSelected(c, defaultOnSelected, NULL);
|
|
|
|
|
2015-08-27 15:17:18 -05:00
|
|
|
uiUnixFinishNewControl(c, uiCombobox);
|
2015-06-11 18:07:06 -05:00
|
|
|
|
2015-08-27 15:17:18 -05:00
|
|
|
return c;
|
2015-06-11 18:07:06 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
uiCombobox *uiNewCombobox(void)
|
|
|
|
{
|
2015-06-14 18:58:00 -05:00
|
|
|
return finishNewCombobox(gtk_combo_box_text_new);
|
2015-06-11 18:07:06 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
uiCombobox *uiNewEditableCombobox(void)
|
|
|
|
{
|
2015-06-14 18:58:00 -05:00
|
|
|
return finishNewCombobox(gtk_combo_box_text_new_with_entry);
|
2015-06-11 18:07:06 -05:00
|
|
|
}
|