From 8ab71fae1adc983599398bc00f5cede262f445a7 Mon Sep 17 00:00:00 2001 From: Andrea Zagli Date: Sun, 3 Nov 2013 10:07:11 +0100 Subject: [PATCH] Added ability to rightly sort numeric and date columns (closes #739). --- .anjuta/session/anjuta.session | 3 +- .anjuta/session/dock-layout.xml | 2 +- .anjuta_sym_db.db | Bin 1081344 -> 1081344 bytes src/grid.c | 166 +++++++++++++++++++++++++------- 4 files changed, 134 insertions(+), 37 deletions(-) diff --git a/.anjuta/session/anjuta.session b/.anjuta/session/anjuta.session index df1b1e2..6527328 100644 --- a/.anjuta/session/anjuta.session +++ b/.anjuta/session/anjuta.session @@ -3,12 +3,13 @@ Maximized=1 Geometry=1680x998+0+27 [File Loader] -Files=../../src/grid.c#289 +Files=../../src/grid.c#809%%%../../tests/grid.c#88 [Document Manager] bookmarks=\n\n [Project Manager] +Shortcut=libgdaex//tests//fill_liststore%%%libgdaex//tests//getsql%%%libgdaex//tests//grid%%%libgdaex//tests//query_editor%%%libgdaex//tests//select%%%libgdaex//tests//test_prefix Expand=libgdaex%%%libgdaex//src%%%libgdaex//src//libgdaex.la [Execution] diff --git a/.anjuta/session/dock-layout.xml b/.anjuta/session/dock-layout.xml index d3a3dbf..98616c6 100644 --- a/.anjuta/session/dock-layout.xml +++ b/.anjuta/session/dock-layout.xml @@ -1,2 +1,2 @@ - + diff --git a/.anjuta_sym_db.db b/.anjuta_sym_db.db index 6d7c67ca5afb6f946a22cd99041d37b784af121c..8c42f428fbeabcaf3e2d6124dfb70b9e3d804fef 100644 GIT binary patch delta 16188 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 (v@JQbUvAMqe@)1furrm$F+H^ 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 Q6FiX!DQqHDf`@|t1JQ~|(*OVf delta 15441 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 cols = gtk_tree_model_get_n_columns (priv->model); - - columns = g_malloc0 (cols * sizeof (gint)); - values = g_malloc0 (cols * sizeof (GValue)); + columns = g_new0 (gint, cols); + values = g_new0 (GValue, cols); while (gda_data_model_iter_move_next (dm_iter)) { gtk_list_store_append (GTK_LIST_STORE (priv->model), &iter); - for (col = 0; col < cols; col++) + cols_sorted = priv->columns->len; + for (col = 0; col < priv->columns->len; col++) { columns[col] = col; col_gtype = gtk_tree_model_get_column_type (priv->model, col); + gdaex_col = (GdaExGridColumn *)g_ptr_array_index (priv->columns, col); + field_name = gdaex_grid_column_get_field_name (gdaex_col); + GValue gval = {0}; g_value_init (&gval, col_gtype); switch (col_gtype) { case G_TYPE_STRING: - gcol = gda_data_model_describe_column (dm, col); - gcol_gtype = gda_column_get_g_type (gcol); + gda_col = gda_data_model_describe_column (dm, col); + gda_col_gtype = gda_column_get_g_type (gda_col); - switch (gcol_gtype) + switch (gda_col_gtype) { case G_TYPE_STRING: - g_value_set_string (&gval, gdaex_data_model_iter_get_value_stringify_at (dm_iter, col)); + g_value_set_string (&gval, gdaex_data_model_iter_get_field_value_stringify_at (dm_iter, field_name)); break; case G_TYPE_BOOLEAN: - g_value_set_string (&gval, gdaex_data_model_iter_get_value_boolean_at (dm_iter, col) ? "X" : ""); + g_value_set_string (&gval, gdaex_data_model_iter_get_field_value_boolean_at (dm_iter, field_name) ? "X" : ""); break; case G_TYPE_INT: case G_TYPE_FLOAT: case G_TYPE_DOUBLE: - dval = gdaex_data_model_iter_get_value_double_at (dm_iter, col); + dval = gdaex_data_model_iter_get_field_value_double_at (dm_iter, field_name); g_value_set_string (&gval, gdaex_format_money (dval, gdaex_grid_column_get_decimals ((GdaExGridColumn *)g_ptr_array_index (priv->columns, col)), FALSE)); break; default: - if (gcol_gtype == G_TYPE_DATE - || gcol_gtype == G_TYPE_DATE_TIME - || gcol_gtype == GDA_TYPE_TIMESTAMP) + if (gda_col_gtype == G_TYPE_DATE + || gda_col_gtype == G_TYPE_DATE_TIME + || gda_col_gtype == GDA_TYPE_TIMESTAMP) { - gdatetime = gdaex_data_model_iter_get_value_gdatetime_at (dm_iter, col); + gdatetime = gdaex_data_model_iter_get_field_value_gdatetime_at (dm_iter, field_name); /* TODO find default format from locale */ - g_value_set_string (&gval, g_date_time_format (gdatetime, gcol_gtype == G_TYPE_DATE ? "%d/%m/%Y" : "%d/%m/%Y %H.%M.%S")); + g_value_set_string (&gval, g_date_time_format (gdatetime, gda_col_gtype == G_TYPE_DATE ? "%d/%m/%Y" : "%d/%m/%Y %H.%M.%S")); + g_date_time_unref (gdatetime); } else { - g_value_set_string (&gval, gda_value_stringify (gda_data_model_iter_get_value_at (dm_iter, col))); + g_value_set_string (&gval, gdaex_data_model_iter_get_field_value_stringify_at (dm_iter, field_name)); } break; } - values[col] = gval; break; case G_TYPE_INT: - g_value_set_int (&gval, gdaex_data_model_iter_get_value_integer_at (dm_iter, col)); - values[col] = gval; + g_value_set_int (&gval, gdaex_data_model_iter_get_field_value_integer_at (dm_iter, field_name)); break; case G_TYPE_FLOAT: - g_value_set_float (&gval, gdaex_data_model_iter_get_value_float_at (dm_iter, col)); - values[col] = gval; + g_value_set_float (&gval, gdaex_data_model_iter_get_field_value_float_at (dm_iter, field_name)); break; case G_TYPE_DOUBLE: - g_value_set_double (&gval, gdaex_data_model_iter_get_value_double_at (dm_iter, col)); - values[col] = gval; + g_value_set_double (&gval, gdaex_data_model_iter_get_field_value_double_at (dm_iter, field_name)); break; case G_TYPE_BOOLEAN: - g_value_set_boolean (&gval, gdaex_data_model_iter_get_value_boolean_at (dm_iter, col)); - values[col] = gval; + g_value_set_boolean (&gval, gdaex_data_model_iter_get_field_value_boolean_at (dm_iter, field_name)); break; default: - values[col] = *gda_value_new_from_string (gdaex_data_model_iter_get_value_stringify_at (dm_iter, col), col_gtype); + gval = *gda_value_new_from_string (gdaex_data_model_iter_get_field_value_stringify_at (dm_iter, field_name), col_gtype); break; } + values[col] = gval; + + gdaex_col_gtype = gdaex_grid_column_get_gtype (gdaex_col); + + if ((gdaex_col_gtype == G_TYPE_DATE + || gdaex_col_gtype == G_TYPE_DATE_TIME + || gdaex_col_gtype == GDA_TYPE_TIMESTAMP + || ((gdaex_col_gtype == G_TYPE_INT + || gdaex_col_gtype == G_TYPE_FLOAT + || gdaex_col_gtype == G_TYPE_DOUBLE) + && gdaex_grid_column_get_decimals (gdaex_col) > -1)) + && gdaex_grid_column_get_reorderable (gdaex_col)) + { + columns[cols_sorted] = cols_sorted; + + GValue gval = {0}; + if (gdaex_col_gtype == G_TYPE_DATE + || gdaex_col_gtype == G_TYPE_DATE_TIME + || gdaex_col_gtype == GDA_TYPE_TIMESTAMP) + { + g_value_init (&gval, G_TYPE_STRING); + gdatetime = gdaex_data_model_iter_get_field_value_gdatetime_at (dm_iter, field_name); + g_value_set_string (&gval, gdatetime != NULL ? g_date_time_format (gdatetime, gdaex_col_gtype == G_TYPE_DATE ? "%Y%m%d" : "%Y%m%d%H%M%S") : ""); + g_date_time_unref (gdatetime); + } + else if (gdaex_col_gtype == G_TYPE_INT) + { + g_value_init (&gval, G_TYPE_INT); + g_value_set_int (&gval, gdaex_data_model_iter_get_field_value_integer_at (dm_iter, field_name)); + } + else if (gdaex_col_gtype == G_TYPE_FLOAT) + { + g_value_init (&gval, G_TYPE_FLOAT); + g_value_set_float (&gval, gdaex_data_model_iter_get_field_value_float_at (dm_iter, field_name)); + } + else if (gdaex_col_gtype == G_TYPE_DOUBLE) + { + g_value_init (&gval, G_TYPE_DOUBLE); + g_value_set_double (&gval, gdaex_data_model_iter_get_field_value_double_at (dm_iter, field_name)); + } + values[cols_sorted] = gval; + cols_sorted++; + } } gtk_list_store_set_valuesv (GTK_LIST_STORE (priv->model), &iter, columns, values, cols); @@ -438,7 +486,11 @@ static GtkTreeModel /* TODO for now it returns always a GtkListStore */ GdaExGridPrivate *priv; + guint cols; guint col; + + GdaExGridColumn *gcolumn; + GType *gtype; GType col_gtype; @@ -446,20 +498,39 @@ static GtkTreeModel priv = GDAEX_GRID_GET_PRIVATE (grid); - gtype = g_new0 (GType, priv->columns->len); + cols = priv->columns->len; + gtype = g_new0 (GType, cols); for (col = 0; col < priv->columns->len; col++) { - col_gtype = gdaex_grid_column_get_gtype ((GdaExGridColumn *)g_ptr_array_index (priv->columns, col)); + gcolumn = (GdaExGridColumn *)g_ptr_array_index (priv->columns, col); + + col_gtype = gdaex_grid_column_get_gtype (gcolumn); if (col_gtype == G_TYPE_DATE || col_gtype == G_TYPE_DATE_TIME || col_gtype == GDA_TYPE_TIMESTAMP || ((col_gtype == G_TYPE_INT || col_gtype == G_TYPE_FLOAT || col_gtype == G_TYPE_DOUBLE) - && gdaex_grid_column_get_decimals ((GdaExGridColumn *)g_ptr_array_index (priv->columns, col)) > -1)) + && gdaex_grid_column_get_decimals (gcolumn) > -1)) { gtype[col] = G_TYPE_STRING; + + if (gdaex_grid_column_get_reorderable (gcolumn)) + { + /* add one column for sorting */ + gtype = g_renew (GType, gtype, ++cols); + if (col_gtype == G_TYPE_DATE + || col_gtype == G_TYPE_DATE_TIME + || col_gtype == GDA_TYPE_TIMESTAMP) + { + gtype[cols - 1] = G_TYPE_STRING; + } + else + { + gtype[cols - 1] = col_gtype; + } + } } else { @@ -471,7 +542,7 @@ static GtkTreeModel { g_object_unref (priv->model); } - priv->model = GTK_TREE_MODEL (gtk_list_store_newv (priv->columns->len, gtype)); + priv->model = GTK_TREE_MODEL (gtk_list_store_newv (cols, gtype)); return priv->model; } @@ -489,7 +560,10 @@ static GtkTreeView GList *cells; + GType col_gtype; + guint col; + guint cols_sorted; GtkWidget *mitem; GtkWidget *submitem; @@ -524,6 +598,7 @@ static GtkTreeView gtk_menu_item_set_submenu (GTK_MENU_ITEM (mitem), submitem); gtk_widget_show (submitem); + cols_sorted = 0; for (col = 0; col < priv->columns->len; col++) { gcolumn = (GdaExGridColumn *)g_ptr_array_index (priv->columns, col); @@ -533,7 +608,8 @@ static GtkTreeView cells = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (vcolumn)); cells = g_list_first (cells); - if (gdaex_grid_column_get_gtype (gcolumn) == G_TYPE_BOOLEAN) + col_gtype = gdaex_grid_column_get_gtype (gcolumn); + if (col_gtype == G_TYPE_BOOLEAN) { gtk_tree_view_column_add_attribute (vcolumn, (GtkCellRenderer *)cells->data, "active", col); } @@ -544,7 +620,20 @@ static GtkTreeView if (gdaex_grid_column_get_reorderable (gcolumn)) { - gtk_tree_view_column_set_sort_column_id (vcolumn, col); + if (col_gtype == G_TYPE_DATE + || col_gtype == G_TYPE_DATE_TIME + || col_gtype == GDA_TYPE_TIMESTAMP + || ((col_gtype == G_TYPE_INT + || col_gtype == G_TYPE_FLOAT + || col_gtype == G_TYPE_DOUBLE) + && gdaex_grid_column_get_decimals ((GdaExGridColumn *)g_ptr_array_index (priv->columns, col)) > -1)) + { + gtk_tree_view_column_set_sort_column_id (vcolumn, priv->columns->len + cols_sorted++); + } + else + { + gtk_tree_view_column_set_sort_column_id (vcolumn, col); + } } gtk_tree_view_append_column (GTK_TREE_VIEW (view), vcolumn); @@ -711,7 +800,14 @@ gdaex_grid_on_export_menu_activate (GtkMenuItem *menuitem, for (col = 0; col < priv->columns->len; col++) { gcolumn = (GdaExGridColumn *)g_ptr_array_index (priv->columns, col); - g_string_append_printf (gstr, "|%s", gdaex_grid_column_get_title (gcolumn)); + if (gdaex_grid_column_get_visible (gcolumn)) + { + g_string_append_printf (gstr, "|%s", gdaex_grid_column_get_title (gcolumn)); + } + else + { + g_string_append (gstr, "|{SKIP}"); + } } gchar **columns_title = g_strsplit (gstr->str + 1, "|", -1); -- 2.49.0