Cleaned up the GTK+ menu checkbox code.

This commit is contained in:
Pietro Gagliardi 2015-04-23 19:11:43 -04:00
parent 250cda3cad
commit f416b32477
1 changed files with 6 additions and 27 deletions

View File

@ -42,32 +42,6 @@ static void onClicked(GtkMenuItem *menuitem, gpointer data)
(*(item->onClicked))(uiMenuItem(item), w, item->onClickedData); (*(item->onClicked))(uiMenuItem(item), w, item->onClickedData);
} }
static void setChecked(struct menuItem *item, gboolean checked)
{
GHashTableIter iter;
gpointer widget;
// sync it with our template
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item->baseItem), checked);
// then sync everything else
g_hash_table_iter_init(&iter, item->uiWindows);
while (g_hash_table_iter_next(&iter, &widget, NULL))
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widget), checked);
}
// TODO change to onNotifyActive
static void onToggled(GtkCheckMenuItem *menuitem, gpointer data)
{
struct menuItem *item = (struct menuItem *) data;
gboolean checked;
// get the checked state of /the item that triggered the signal/
checked = gtk_check_menu_item_get_active(menuitem);
setChecked(item, checked);
}
static void defaultOnClicked(uiMenuItem *item, uiWindow *w, void *data) static void defaultOnClicked(uiMenuItem *item, uiWindow *w, void *data)
{ {
// do nothing // do nothing
@ -122,7 +96,8 @@ static void menuItemSetChecked(uiMenuItem *ii, int checked)
c = FALSE; c = FALSE;
if (checked) if (checked)
c = TRUE; c = TRUE;
setChecked(item, c); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item->baseItem), c);
// the bindings will make this take effect on all instances
} }
static uiMenuItem *newItem(struct menu *m, int type, const char *name) static uiMenuItem *newItem(struct menu *m, int type, const char *name)
@ -285,6 +260,10 @@ static void appendMenuItem(GtkMenuShell *submenu, struct menuItem *item, uiWindo
gtk_menu_item_set_label(GTK_MENU_ITEM(menuitem), item->name); gtk_menu_item_set_label(GTK_MENU_ITEM(menuitem), item->name);
if (item->type != typeSeparator) { if (item->type != typeSeparator) {
g_signal_connect(menuitem, "activate", G_CALLBACK(onClicked), item); g_signal_connect(menuitem, "activate", G_CALLBACK(onClicked), item);
// this binding does two things:
// 1) makes it so that when one instance of the menu item is checked, the rest are too
// 2) makes it so that the implementation of uiMenuItemChecked() and uiMenuItemSetChecked() only needs to get/set the checked state from item->baseItem
if (item->type == typeCheckbox) if (item->type == typeCheckbox)
g_object_bind_property(item->baseItem, "active", g_object_bind_property(item->baseItem, "active",
menuitem, "active", menuitem, "active",