X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=inline;f=src%2Fui%2Fgui%2Fpsppire-data-store.c;h=27f5502d3be6ad71e94d109e6b6da40b48bc07a1;hb=debddb2afee6725855f1b44e3bebbb67769def55;hp=1441afa56a1cee57b645aa2c233d3c37ea77525b;hpb=aa6f8e301fab021ba2fea720a162e506612ba29f;p=pspp diff --git a/src/ui/gui/psppire-data-store.c b/src/ui/gui/psppire-data-store.c index 1441afa56a..27f5502d3b 100644 --- a/src/ui/gui/psppire-data-store.c +++ b/src/ui/gui/psppire-data-store.c @@ -67,7 +67,7 @@ static GObjectClass *parent_class = NULL; enum { - BACKEND_CHANGED, + ITEMS_CHANGED, CASES_DELETED, CASE_INSERTED, CASE_CHANGED, @@ -87,6 +87,13 @@ __tree_model_iter_n_children (GtkTreeModel *tree_model, return n; } +static GtkTreeModelFlags +__tree_model_get_flags (GtkTreeModel *model) +{ + g_return_val_if_fail (PSPPIRE_IS_DATA_STORE (model), (GtkTreeModelFlags) 0); + + return GTK_TREE_MODEL_LIST_ONLY; +} static gint __tree_model_get_n_columns (GtkTreeModel *tree_model) @@ -131,23 +138,53 @@ __get_value (GtkTreeModel *tree_model, { PsppireDataStore *store = PSPPIRE_DATA_STORE (tree_model); - g_value_init (value, G_TYPE_DOUBLE); + const struct variable *variable = psppire_dict_get_variable (store->dict, column); + if (NULL == variable) + return; + + if (var_is_numeric (variable)) + g_value_init (value, G_TYPE_DOUBLE); + else + g_value_init (value, G_TYPE_STRING); gint row = GPOINTER_TO_INT (iter->user_data); struct ccase *cc = datasheet_get_row (store->datasheet, row); - g_value_set_double (value, case_data_idx (cc, column)->f); + if (var_is_numeric (variable)) + g_value_set_double (value, case_data_idx (cc, column)->f); + else + { + const gchar *ss = value_str (case_data_idx (cc, column), + var_get_width (variable)); + g_value_set_string (value, ss); + } case_unref (cc); } +static GType +__get_type (GtkTreeModel *tree_model, gint idx) +{ + PsppireDataStore *store = PSPPIRE_DATA_STORE (tree_model); + + const struct variable *variable = psppire_dict_get_variable (store->dict, idx); + + if (NULL == variable) + return 0; + + if (var_is_numeric (variable)) + return G_TYPE_DOUBLE; + + return G_TYPE_STRING; +} + static void __tree_model_init (GtkTreeModelIface *iface) { - iface->get_flags = NULL; + iface->get_flags = __tree_model_get_flags; iface->get_n_columns = __tree_model_get_n_columns ; - iface->get_column_type = NULL; + iface->get_column_type = __get_type; iface->get_iter = NULL; iface->iter_next = NULL; iface->get_path = NULL; @@ -210,15 +247,18 @@ psppire_data_store_class_init (PsppireDataStoreClass *class) object_class->finalize = psppire_data_store_finalize; object_class->dispose = psppire_data_store_dispose; - signals [BACKEND_CHANGED] = - g_signal_new ("backend-changed", + signals [ITEMS_CHANGED] = + g_signal_new ("changed", G_TYPE_FROM_CLASS (class), G_SIGNAL_RUN_FIRST, 0, NULL, NULL, - g_cclosure_marshal_VOID__VOID, + psppire_marshal_VOID__UINT_UINT_UINT, G_TYPE_NONE, - 0); + 3, + G_TYPE_UINT, + G_TYPE_UINT, + G_TYPE_UINT); signals [CASE_INSERTED] = g_signal_new ("case-inserted", @@ -385,15 +425,17 @@ psppire_data_store_set_reader (PsppireDataStore *ds, struct casereader *reader) { gint i; - + gint old_n = 0; if ( ds->datasheet) - datasheet_destroy (ds->datasheet); + { + old_n = datasheet_get_n_rows (ds->datasheet); + datasheet_destroy (ds->datasheet); + } ds->datasheet = datasheet_create (reader); - g_signal_emit_by_name (ds, "notify", 0, 0); - g_print ("Datasheet row count %d\n", datasheet_get_n_rows (ds->datasheet)); - + gint new_n = datasheet_get_n_rows (ds->datasheet); + if ( ds->dict ) for (i = 0 ; i < n_dict_signals; ++i ) { @@ -404,7 +446,7 @@ psppire_data_store_set_reader (PsppireDataStore *ds, } } - g_signal_emit (ds, signals[BACKEND_CHANGED], 0); + g_signal_emit (ds, signals[ITEMS_CHANGED], 0, 0, old_n, new_n); }