X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-dict.c;h=564257f46c8cdb74c6adef8ce6d4547f0bd70764;hb=ebda03f4d53b24d1af3de9fd7dcbbf448401d5a9;hp=e6f1373a54d969ed76de022e0135924ace674c8c;hpb=f404544337964f80bb2d1fee5acb147f7023bc08;p=pspp-builds.git diff --git a/src/ui/gui/psppire-dict.c b/src/ui/gui/psppire-dict.c index e6f1373a..564257f4 100644 --- a/src/ui/gui/psppire-dict.c +++ b/src/ui/gui/psppire-dict.c @@ -19,7 +19,7 @@ #include #include -#include +#include #include "psppire-dict.h" #include @@ -30,16 +30,6 @@ #include "helper.h" #include "message-dialog.h" -/* --- prototypes --- */ -static void psppire_dict_class_init (PsppireDictClass *class); -static void psppire_dict_init (PsppireDict *dict); -static void psppire_dict_finalize (GObject *object); - -static void dictionary_tree_model_init (GtkTreeModelIface *iface); - - -/* --- variables --- */ -static GObjectClass *parent_class = NULL; enum { BACKEND_CHANGED, @@ -48,6 +38,7 @@ enum { VARIABLE_RESIZED, VARIABLE_INSERTED, VARIABLE_DELETED, + VARIABLE_DISPLAY_WIDTH_CHANGED, WEIGHT_CHANGED, FILTER_CHANGED, @@ -55,6 +46,18 @@ enum { n_SIGNALS }; + +/* --- prototypes --- */ +static void psppire_dict_class_init (PsppireDictClass *class); +static void psppire_dict_init (PsppireDict *dict); +static void psppire_dict_finalize (GObject *object); + +static void dictionary_tree_model_init (GtkTreeModelIface *iface); + + +/* --- variables --- */ +static GObjectClass *parent_class = NULL; + static guint signals [n_SIGNALS]; /* --- functions --- */ @@ -93,8 +96,6 @@ psppire_dict_get_type (void) g_type_add_interface_static (object_type, GTK_TYPE_TREE_MODEL, &tree_model_info); - - } return object_type; @@ -152,7 +153,7 @@ psppire_dict_class_init (PsppireDictClass *class) G_SIGNAL_RUN_FIRST, 0, NULL, NULL, - marshaller_VOID__INT_INT_INT, + psppire_marshal_VOID__INT_INT_INT, G_TYPE_NONE, 3, G_TYPE_INT, @@ -166,12 +167,23 @@ psppire_dict_class_init (PsppireDictClass *class) G_SIGNAL_RUN_FIRST, 0, NULL, NULL, - gtkextra_VOID__INT_INT, + psppire_marshal_VOID__INT_INT, G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT); + signals [VARIABLE_DISPLAY_WIDTH_CHANGED] = + g_signal_new ("variable-display-width-changed", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_FIRST, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__INT, + G_TYPE_NONE, + 1, + G_TYPE_INT); + signals [WEIGHT_CHANGED] = g_signal_new ("weight-changed", @@ -223,7 +235,10 @@ psppire_dict_finalize (GObject *object) static void addcb (struct dictionary *d, int idx, void *pd) { - g_signal_emit (pd, signals [VARIABLE_INSERTED], 0, idx); + PsppireDict *dict = PSPPIRE_DICT (pd); + + if ( ! dict->disable_insert_signal) + g_signal_emit (dict, signals [VARIABLE_INSERTED], 0, idx); } static void @@ -264,6 +279,13 @@ split_changed_callback (struct dictionary *d, void *pd) g_signal_emit (pd, signals [SPLIT_CHANGED], 0); } +static void +variable_display_width_callback (struct dictionary *d, int idx, void *pd) +{ + g_signal_emit (pd, signals [VARIABLE_DISPLAY_WIDTH_CHANGED], 0, idx); +} + + static const struct dict_callbacks gui_callbacks = { @@ -273,13 +295,15 @@ static const struct dict_callbacks gui_callbacks = resize_cb, weight_changed_callback, filter_changed_callback, - split_changed_callback + split_changed_callback, + variable_display_width_callback }; static void psppire_dict_init (PsppireDict *psppire_dict) { psppire_dict->stamp = g_random_int (); + psppire_dict->disable_insert_signal = FALSE; } /** @@ -291,7 +315,7 @@ psppire_dict_init (PsppireDict *psppire_dict) PsppireDict* psppire_dict_new_from_dict (struct dictionary *d) { - PsppireDict *new_dict = g_object_new (G_TYPE_PSPPIRE_DICT, NULL); + PsppireDict *new_dict = g_object_new (PSPPIRE_TYPE_DICT, NULL); new_dict->dict = d; dict_set_callbacks (new_dict->dict, &gui_callbacks, new_dict); @@ -349,9 +373,15 @@ psppire_dict_insert_variable (PsppireDict *d, gint idx, const gchar *name) if ( ! name ) name = auto_generate_var_name (d); + d->disable_insert_signal = TRUE; + var = dict_create_var (d->dict, name, 0); dict_reorder_var (d->dict, var, idx); + + d->disable_insert_signal = FALSE; + + g_signal_emit (d, signals[VARIABLE_INSERTED], 0, idx); } /* Delete N variables beginning at FIRST */ @@ -404,7 +434,9 @@ psppire_dict_set_name (PsppireDict* d, gint idx, const gchar *name) -/* Return the IDXth variable */ +/* Return the IDXth variable. + Will return NULL if IDX exceeds the number of variables in the dictionary. + */ struct variable * psppire_dict_get_variable (const PsppireDict *d, gint idx) {