Index: work/gtk/layersel/layersel.c =================================================================== --- work/gtk/layersel/layersel.c (revision 8517) +++ work/gtk/layersel/layersel.c (revision 8518) @@ -63,6 +63,23 @@ return image; } +/*** Sync ***/ +static void group_vis_sync(layersel_grp_t *lsg) +{ + if (lsg->on) { + pcb_gtk_widget_hide_all(lsg->grp_closed); + gtk_widget_set_no_show_all(lsg->grp_open, 0); + gtk_widget_show_all(lsg->grp_open); + gtk_widget_set_no_show_all(lsg->grp_open, 1); + } + else { + gtk_widget_set_no_show_all(lsg->grp_closed, 0); + gtk_widget_show_all(lsg->grp_closed); + gtk_widget_set_no_show_all(lsg->grp_closed, 1); + pcb_gtk_widget_hide_all(lsg->grp_open); + } +} + /*** Event handling ***/ static gboolean layer_vis_press_cb(GtkWidget *widget, GdkEvent *event, gpointer user_data) @@ -72,6 +89,22 @@ return TRUE; } +static gboolean group_close_press_cb(GtkWidget *widget, GdkEvent *event, layersel_grp_t *lsg) +{ + lsg->on = 0; + group_vis_sync(lsg); + printf("close!\n"); + return TRUE; +} + +static gboolean group_open_press_cb(GtkWidget *widget, GdkEvent *event, layersel_grp_t *lsg) +{ + lsg->on = 1; + group_vis_sync(lsg); + printf("open!\n"); + return TRUE; +} + /** Wrap w so that clicks on it are triggering a callback */ static GtkWidget *wrap_bind_click(GtkWidget *w, GCallback cb, void *cb_data) { @@ -85,7 +118,7 @@ static GtkWidget *build_grp(pcb_gtk_layersel_t *ls, layersel_grp_t *lsg, const char *gname) { - GtkWidget *gn_vert, *grp_layers, *vlabel, *spring, *vis_box, *vis_ebox; + GtkWidget *gn_vert, *grp_layers, *vlabel, *spring, *vis_box, *vis_ebox, *opn, *cld; int n; char tmp[32]; @@ -101,6 +134,7 @@ |+-----------------------+ | +--------------------------+ */ + lsg->ls = ls; lsg->grp_row = gtkc_vbox_new(0, 0); lsg->grp_closed = gtkc_hbox_new(0, 0); lsg->grp_open = gtkc_hbox_new(0, 0); @@ -109,7 +143,8 @@ gn_vert = gtkc_vbox_new(0, 0); grp_layers = gtkc_vbox_new(0, 0); - gtk_box_pack_start(GTK_BOX(lsg->grp_open), gn_vert, FALSE, FALSE, 0); + opn = wrap_bind_click(gn_vert, G_CALLBACK(group_close_press_cb), lsg); + gtk_box_pack_start(GTK_BOX(lsg->grp_open), opn, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(lsg->grp_open), grp_layers, FALSE, FALSE, 0); @@ -120,7 +155,8 @@ gtk_misc_set_alignment(GTK_MISC(vlabel), 0, 1); gtk_widget_set_size_request(vlabel, 32, 1); - gtk_box_pack_start(GTK_BOX(lsg->grp_closed), gtk_label_new(gname), FALSE, FALSE, 0); + cld = wrap_bind_click(gtk_label_new(gname), G_CALLBACK(group_open_press_cb), lsg); + gtk_box_pack_start(GTK_BOX(lsg->grp_closed), cld, FALSE, FALSE, 0); /* install layers */ for(n = 0; n < 4; n++) { @@ -146,12 +182,10 @@ } /* Make sure gtk_show_all() won't mess with our hardwired hide/show */ - gtk_widget_show_all(lsg->grp_closed); - gtk_widget_show_all(lsg->grp_open); + group_vis_sync(lsg); gtk_widget_set_no_show_all(lsg->grp_closed, 1); gtk_widget_set_no_show_all(lsg->grp_open, 1); - lsg->ls = ls; return lsg->grp_row; } Index: work/gtk/layersel/layersel.h =================================================================== --- work/gtk/layersel/layersel.h (revision 8517) +++ work/gtk/layersel/layersel.h (revision 8518) @@ -19,6 +19,8 @@ layersel_layer_t layer[4]; + unsigned on:1; + /* for callbacks */ pcb_gtk_layersel_t *ls; /* points to parent */ }; Index: work/gtk/layersel/layersel_demo.c =================================================================== --- work/gtk/layersel/layersel_demo.c (revision 8517) +++ work/gtk/layersel/layersel_demo.c (revision 8518) @@ -1,4 +1,5 @@ #include +#include #include "layersel.h" #include "lib_gtk_common/compat.h" @@ -9,6 +10,8 @@ GtkWidget *layer_selector; pcb_gtk_layersel_t ls; + memset(&ls, 0, sizeof(ls)); + /* Initialize the widget set */ gtk_init(&argc, &argv); /* Create the main window */