From a0e5ade2bcb82bc8581e48cf12b98be2414968f3 Mon Sep 17 00:00:00 2001 From: Andrea Zagli Date: Sat, 18 Dec 2010 13:45:51 +0100 Subject: [PATCH] Implementata la gui per l'esportazione in csv. --- data/libsolipa/gui/libsolipa.ui | 110 ++++++++++++----- src/solipa.c | 32 ++++- src/solipa.h | 6 + src/utils.c | 205 +++++++++++++++++++++++++++++++- src/utils.h | 2 + tests/utils.c | 7 ++ 6 files changed, 329 insertions(+), 33 deletions(-) diff --git a/data/libsolipa/gui/libsolipa.ui b/data/libsolipa/gui/libsolipa.ui index ae7ca86..ad6bd4f 100644 --- a/data/libsolipa/gui/libsolipa.ui +++ b/data/libsolipa/gui/libsolipa.ui @@ -151,14 +151,6 @@ - - - - - - - - 5 Esporta CSV @@ -185,39 +177,87 @@ 5 5 - + True - True - automatic - automatic - etched-in + vertical + 5 - + True True - lstore_treemodel_campi + automatic + automatic + etched-in - + + True + True + lstore_treemodel_campi + False + 0 + + + + + + 0 + + + + - - - 0 - + + Campo + + + + 2 + + + + + + 0 + + + + + True + 5 + end - - Campo - - - - 1 - - + + Deseleziona tutti + True + True + True + + False + False + 0 + + + + + Seleziona tutti + True + True + True + + + False + False + 1 + + + 1 + @@ -263,6 +303,7 @@ True True + " 1 @@ -316,6 +357,7 @@ True True + , 1 @@ -382,6 +424,8 @@ True vertical + False + False save False @@ -451,4 +495,14 @@ button2 + + + + + + + + + + diff --git a/src/solipa.c b/src/solipa.c index ced98c0..891c428 100644 --- a/src/solipa.c +++ b/src/solipa.c @@ -106,7 +106,7 @@ Solipa gchar *moddir; gchar *p; - moddir = g_win32_get_package_installation_directory_of_module (NULL); + moddir = g_win32_get_package_installation_directory_of_module (NULL); p = strrchr (moddir, G_DIR_SEPARATOR); if (p != NULL @@ -231,7 +231,31 @@ GdaEx priv = SOLIPA_GET_PRIVATE (solipa); - return priv->gdaex; + return priv->gdaex; +} + +const gchar +*solipa_get_guifile (Solipa *solipa) +{ + SolipaPrivate *priv; + + g_return_val_if_fail (IS_SOLIPA (solipa), NULL); + + priv = SOLIPA_GET_PRIVATE (solipa); + + return g_strdup (priv->guifile); +} + +GtkBuilder +*solipa_get_gtkbuilder (Solipa *solipa) +{ + SolipaPrivate *priv; + + g_return_val_if_fail (IS_SOLIPA (solipa), NULL); + + priv = SOLIPA_GET_PRIVATE (solipa); + + return priv->gtkbuilder; } /* PRIVATE */ @@ -250,7 +274,7 @@ solipa_set_property (GObject *object, default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; - } + } } static void @@ -268,5 +292,5 @@ solipa_get_property (GObject *object, default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; - } + } } diff --git a/src/solipa.h b/src/solipa.h index 312ee31..3b39886 100644 --- a/src/solipa.h +++ b/src/solipa.h @@ -22,6 +22,8 @@ #include #include +#include + #include #include @@ -63,6 +65,10 @@ CamelSession *solipa_get_camel_session (Solipa *solipa); void solipa_set_gdaex (Solipa *solipa, GdaEx *gdaex); GdaEx *solipa_get_gdaex (Solipa *solipa); +const gchar *solipa_get_guifile (Solipa *solipa); + +GtkBuilder *solipa_get_gtkbuilder (Solipa *solipa); + G_END_DECLS diff --git a/src/utils.c b/src/utils.c index 9926d1a..3b46acc 100644 --- a/src/utils.c +++ b/src/utils.c @@ -21,9 +21,30 @@ #endif #include +#include + +#include #include "utils.h" +static void solipa_fixed_toggled (GtkCellRendererToggle *cell, + gchar *path_str, + gpointer data); + +static void solipa_gtkliststore_select_unselect_all (GtkListStore *store, + gboolean select); + +static void solipa_on_btn_select_all_clicked (GtkButton *button, + gpointer user_data); +static void solipa_on_btn_unselect_all_clicked (GtkButton *button, + gpointer user_data); + +gboolean +solipa_file_exists (const gchar *filename) +{ + return (g_file_query_exists (g_file_new_for_path (filename), NULL)); +} + void solipa_gtktreemodel_to_csv (GtkTreeModel *model, const gchar *filename, gboolean overwrite, @@ -181,13 +202,195 @@ solipa_gtktreemodel_to_csv (GtkTreeModel *model, const gchar *filename, } } +static void +solipa_fixed_toggled (GtkCellRendererToggle *cell, + gchar *path_str, + gpointer data) +{ + GtkTreeModel *model = (GtkTreeModel *)data; + GtkTreeIter iter; + GtkTreePath *path = gtk_tree_path_new_from_string (path_str); + + gboolean choosen; + + /* get toggled iter */ + gtk_tree_model_get_iter (model, &iter, path); + gtk_tree_model_get (model, &iter, 0, &choosen, -1); + + choosen ^= 1; + + /* set new value */ + gtk_list_store_set (GTK_LIST_STORE (model), &iter, 0, choosen, -1); + + /* clean up */ + gtk_tree_path_free (path); +} + +static void +solipa_gtkliststore_select_unselect_all (GtkListStore *store, gboolean select) +{ + GtkTreeIter iter; + + if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter)) + { + do + { + gtk_list_store_set (store, &iter, 0, select, -1); + } while (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter)); + } +} + +static void +solipa_on_btn_select_all_clicked (GtkButton *button, + gpointer user_data) +{ + solipa_gtkliststore_select_unselect_all ((GtkListStore *)user_data, TRUE); +} + +static void +solipa_on_btn_unselect_all_clicked (GtkButton *button, + gpointer user_data) +{ + solipa_gtkliststore_select_unselect_all ((GtkListStore *)user_data, FALSE); +} + void solipa_gtktreemodel_to_csv_gui (Solipa *solipa, GtkTreeModel *model, gchar **columns_title, guint n_columns) { GtkWidget *diag; + GError *error; + GtkBuilder *builder; + + GtkListStore *store; + GtkTreeIter iter; - + gchar *filename; + + guint col; + gboolean sel; + + guint *columns; + guint _n_columns; + + builder = solipa_get_gtkbuilder (solipa); + + error = NULL; + gtk_builder_add_objects_from_file (builder, + solipa_get_guifile (solipa), + g_strsplit ("diag_gtktreemodel_to_csv" + "|lstore_treemodel_campi", + "|", -1), + &error); + if (error != NULL) + { + g_warning ("Error: %s.", + error->message != NULL ? error->message : "no details"); + return; + } + + diag = GTK_WIDGET (gtk_builder_get_object (builder, "diag_gtktreemodel_to_csv")); + if (GTK_IS_WIDGET (diag)) + { + /* carico i nomi campi per la selezione nel model */ + store = GTK_LIST_STORE (gtk_builder_get_object (builder, "lstore_treemodel_campi")); + + g_signal_connect (gtk_builder_get_object (builder, "cellrenderertoggle1"), + "toggled", G_CALLBACK (solipa_fixed_toggled), (gpointer)store); + + g_signal_connect (gtk_builder_get_object (builder, "button3"), + "clicked", G_CALLBACK (solipa_on_btn_unselect_all_clicked), (gpointer *)store); + g_signal_connect (gtk_builder_get_object (builder, "button4"), + "clicked", G_CALLBACK (solipa_on_btn_select_all_clicked), (gpointer *)store); + + gtk_list_store_clear (store); + + for (col = 0; col < n_columns; col++) + { + gtk_list_store_append (store, &iter); + gtk_list_store_set (store, &iter, + 0, FALSE, + 1, col, + 2, columns_title[col], + -1); + } + + do + { + if (gtk_dialog_run (GTK_DIALOG (diag)) == GTK_RESPONSE_OK) + { + filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (gtk_builder_get_object (builder, "filechooserwidget1"))); + if (filename == NULL + || g_strcmp0 (g_strstrip (filename), "") == 0) + { + GtkWidget *diag_req; + + diag_req = gtk_message_dialog_new (GTK_WINDOW (diag), + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_WARNING, + GTK_BUTTONS_OK, + "Immettere il nome del file nel quale esportare i dati."); + gtk_dialog_run (GTK_DIALOG (diag_req)); + gtk_widget_destroy (diag_req); + continue; + } + + if (solipa_file_exists (filename)) + { + GtkWidget *diag_req; + + diag_req = gtk_message_dialog_new (GTK_WINDOW (diag), + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_QUESTION, + GTK_BUTTONS_YES_NO, + "File esistente. Sovrascriverlo?"); + if (gtk_dialog_run (GTK_DIALOG (diag_req)) == GTK_RESPONSE_YES) + { + gtk_widget_destroy (diag_req); + break; + } + gtk_widget_destroy (diag_req); + } + break; + } + else + { + gtk_widget_destroy (diag); + return; + } + } while (TRUE); + + /* ricavo i campi selezionati che devono essere esportati */ + _n_columns = 0; + if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter)) + { + columns = g_malloc0 (sizeof (guint)); + do + { + gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, 0, &sel, 1, &col, -1); + if (sel) + { + _n_columns++; + columns = g_realloc_n (columns, _n_columns, sizeof (guint)); + columns[_n_columns - 1] = col; + } + } while (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter)); + } + + /* export */ + solipa_gtktreemodel_to_csv (model, + filename, + TRUE, + gtk_entry_get_text (GTK_ENTRY (gtk_builder_get_object (builder, "entry1"))), + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "checkbutton1"))), + gtk_entry_get_text (GTK_ENTRY (gtk_builder_get_object (builder, "entry2"))), + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "checkbutton3"))), + columns_title, + columns, + _n_columns); + + gtk_widget_destroy (diag); + } } diff --git a/src/utils.h b/src/utils.h index 91cf84f..7c53b06 100644 --- a/src/utils.h +++ b/src/utils.h @@ -27,6 +27,8 @@ G_BEGIN_DECLS +gboolean solipa_file_exists (const gchar *filename); + void solipa_gtktreemodel_to_csv (GtkTreeModel *model, const gchar *filename, gboolean overwrite, const gchar *quote, gboolean quote_all, diff --git a/tests/utils.c b/tests/utils.c index 9b433df..7e64d4d 100644 --- a/tests/utils.c +++ b/tests/utils.c @@ -22,6 +22,8 @@ int main (int argc, char *argv[]) { + Solipa *solipa; + GtkListStore *model; gchar **columns_title; @@ -34,6 +36,8 @@ main (int argc, char *argv[]) gtk_init (&argc, &argv); + solipa = solipa_new (); + columns_title = g_malloc0 (3 * sizeof (gchar)); columns_title[0] = g_strdup ("ID"); columns_title[1] = g_strdup ("Ragione Sociale"); @@ -68,5 +72,8 @@ main (int argc, char *argv[]) columns, 2); + solipa_gtktreemodel_to_csv_gui (solipa, GTK_TREE_MODEL (model), + columns_title, 3); + return 0; } -- 2.49.0