/* * util.c * * Copyright 2003-2004 Richard Drummond */ #include #include #include #include #include #include #include "util.h" #include "chooserwidget.h" /* * Some utility functions to make building a GTK+ GUI easier * and more compact, to hide differences between GTK1.x and GTK2.x * and to help maintain consistency */ /* * Create a list of signals and add them to a GTK+ class */ void gtkutil_add_signals_to_class (GtkObjectClass *class, guint func_offset, guint *signals, ...) { va_list signames; const char *name; unsigned int count = 0; va_start (signames, signals); name = va_arg (signames, const char *); while (name) { #if GTK_MAJOR_VERSION >= 2 signals[count] = g_signal_new (name, G_TYPE_FROM_CLASS (class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, func_offset, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); #else signals[count] = gtk_signal_new (name, GTK_RUN_FIRST, class->type, func_offset, gtk_signal_default_marshaller, GTK_TYPE_NONE, 0); #endif count++; name = va_arg (signames, const char *); }; #if GTK_MAJOR_VERSION < 2 gtk_object_class_add_signals (class, signals, count); #endif } /* * Make a simple chooser from a combo widget * is the number of choices, and the choices * themselves are supplied as a list of strings. */ GtkWidget *make_chooser (int count, ...) { GtkWidget *chooser; GList *list = 0; va_list choices; int i; chooser = chooserwidget_new (); va_start (choices, count); for (i=0; ichild), "_Okay"); gtk_widget_add_accelerator (button, "clicked", accel_group,key, GDK_MOD1_MASK, (GtkAccelFlags) 0); } #endif GtkWidget *make_panel (const char *name) { GtkWidget *panel; panel = gtk_frame_new (name); gtk_widget_show (panel); gtk_container_set_border_width (GTK_CONTAINER (panel), PANEL_BORDER_WIDTH); gtk_frame_set_label_align (GTK_FRAME (panel), 0.01, 0.5); return panel; } GtkWidget *make_xtable( int width, int height ) { GtkWidget *table; table = gtk_table_new (height,width, FALSE); gtk_widget_show (table); gtk_container_set_border_width (GTK_CONTAINER (table), TABLE_BORDER_WIDTH); gtk_table_set_row_spacings (GTK_TABLE (table), TABLE_ROW_SPACING); gtk_table_set_col_spacings (GTK_TABLE (table), TABLE_COL_SPACING); return table; } /* * Add some padding to a vbox or hbox which will consume * space when the box is resized to larger than default size */ void add_box_padding (GtkWidget *box) { GtkWidget *vbox; vbox = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox); gtk_box_pack_start (GTK_BOX (box), vbox, TRUE, TRUE, 0); } /* * Add some padding to a table which will consime space when * when the table is resized to larger than default size */ void add_table_padding (GtkWidget *table, int x, int y) { GtkWidget *vbox; vbox = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox); gtk_table_attach (GTK_TABLE (table), vbox, x, x+1, y, y+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); } /* * Add a widget to a table with some sensible defaults * * is the table position to insert the widget * is the the number of columns the widget will take up * are the attachment flags that will apply horizontally */ void add_to_table(GtkWidget *table, GtkWidget *widget, int x, int y, int width, int xflags) { gtk_table_attach (GTK_TABLE (table), widget, x, x+width, y, y+1, (GtkAttachOptions) (xflags), (GtkAttachOptions) (0), 0, 0); } /* * Super-duper, handy table creation tool! * * Creates a table and add a list of widgets to it. */ GtkWidget *gtkutil_add_table (GtkWidget *container, ...) { va_list contents; GtkWidget *widget; GtkWidget *table; int row, max_col; int col, width; int flags; table = gtk_table_new (3, 3, FALSE); gtk_container_set_border_width (GTK_CONTAINER (table), TABLE_BORDER_WIDTH); gtk_table_set_row_spacings (GTK_TABLE (table), TABLE_ROW_SPACING); gtk_table_set_col_spacings (GTK_TABLE (table), TABLE_COL_SPACING); gtk_container_add (GTK_CONTAINER (container), table); va_start (contents, container); widget = va_arg (contents, GtkWidget *); row = 1; max_col = 1; while (widget != GTKUTIL_TABLE_END) { if (widget == GTKUTIL_ROW_END) { row += 2; } else { col = va_arg (contents, gint); if (col > max_col) max_col = col; width = va_arg (contents, gint); flags = va_arg (contents, gint); gtk_table_attach (GTK_TABLE (table), widget, col, col+width, row, row+1, (GtkAttachOptions) (flags), (GtkAttachOptions) (0), 0, 0); } widget = va_arg (contents, GtkWidget *); } gtk_table_resize (GTK_TABLE (table), row, max_col + 2); add_table_padding (table, 0, 0); add_table_padding (table, max_col + 1, row - 1); gtk_widget_show_all (table); return table; } GtkWidget *gtkutil_make_radio_group (GSList *group, GtkWidget **buttons, ...) { GtkWidget *hbox; va_list labels; const char *label; int i = 0; hbox = gtk_hbox_new (TRUE, 0); va_start (labels, buttons); label = va_arg (labels, const char *); while (label != NULL) { GtkWidget *radiobutton = gtk_radio_button_new_with_label (group, label); group = gtk_radio_button_group (GTK_RADIO_BUTTON (radiobutton)); gtk_box_pack_start (GTK_BOX (hbox), radiobutton, FALSE, FALSE, 0); *buttons++ = radiobutton; label = va_arg (labels, const char *); } gtk_widget_show (hbox); return hbox; }