summaryrefslogtreecommitdiff
path: root/src/gui/dialogs/storage.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2018-12-03 13:16:32 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2018-12-03 13:16:32 (GMT)
commit7b9727379e1c3f2aefc4ac0db0e91d0cfb0a481f (patch)
tree7f9f7d53b93c188b57848cdc4b337808594a0723 /src/gui/dialogs/storage.c
parentd1df89e49a2e8723337570debcf36907b1eded62 (diff)
Built a dialog box to change storage options.
Diffstat (limited to 'src/gui/dialogs/storage.c')
-rw-r--r--src/gui/dialogs/storage.c195
1 files changed, 169 insertions, 26 deletions
diff --git a/src/gui/dialogs/storage.c b/src/gui/dialogs/storage.c
index 46ef675..4aed524 100644
--- a/src/gui/dialogs/storage.c
+++ b/src/gui/dialogs/storage.c
@@ -25,11 +25,26 @@
+/* Colonnes de la liste des collections */
+typedef enum _CollecFeatureColumn
+{
+ CFC_COLLECTION, /* Instance GLib */
+
+ CFC_NAME, /* Désignation humaine */
+ CFC_LOCAL, /* Sauvegarde locale ? */
+ CFC_REMOTE, /* Sauvegarde distante ? */
+
+} CollecFeatureColumn;
+
+
/* Réagit à un changement dans le choix du type de serveur. */
static void on_server_use_toggled(GtkToggleButton *, GtkBuilder *);
-/* Applique les paramètres d'enregistrement pour un binaire. */
-static void update_binary_storage(GtkButton *, GtkBuilder *);
+/* Bascule le lieu d'enregistrement d'un type de collection. */
+static void on_local_feature_toggled(GtkCellRendererToggle *, gchar *, GtkBuilder *);
+
+/* Bascule le lieu d'enregistrement d'un type de collection. */
+static void on_remote_feature_toggled(GtkCellRendererToggle *, gchar *, GtkBuilder *);
@@ -51,30 +66,32 @@ GtkWidget *create_storage_dialog(GLoadedBinary *binary, GtkWindow *parent, GtkBu
{
GtkWidget *result; /* Fenêtre à renvoyer */
GtkBuilder *builder; /* Constructeur utilisé */
- GtkToggleButton *local_button; /* Choix du serveur local */
- GtkToggleButton *remote_button; /* Choix du serveur distant */
+ GtkToggleButton *use_remote; /* Choix du serveur distant */
const char *host; /* Serveur distant à contacter */
unsigned short port; /* Port d'écoute du serveur */
GObject *widget; /* Composant à mettre à jour */
-
- builder = gtk_builder_new_from_resource("/org/chrysalide/gui/dialogs/binadmin.ui");
+ GtkListStore *store; /* Modèle de gestion */
+ GDbCollection **collections; /* Ensemble de collections */
+ size_t count; /* Taille de cet ensemble */
+ size_t i; /* Boucle de parcours */
+ uint32_t feature; /* Type d'éléments gérés */
+ GtkTreeIter iter; /* Point d'insertion */
+
+ builder = gtk_builder_new_from_resource("/org/chrysalide/gui/dialogs/storage.ui");
*outb = builder;
- g_object_set_data(G_OBJECT(builder), "binary", binary);
-
result = GTK_WIDGET(gtk_builder_get_object(builder, "window"));
gtk_window_set_transient_for(GTK_WINDOW(result), parent);
/* Mise à jour de l'interface */
- local_button = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "local_storage"));
- remote_button = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "remote_storage"));
+ use_remote = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "use_remote"));
- if (g_loaded_binary_get_local_storage(binary))
- gtk_toggle_button_set_active(local_button, TRUE);
+ if (g_loaded_binary_use_remote_storage(binary))
+ gtk_toggle_button_set_active(use_remote, TRUE);
else
- gtk_toggle_button_set_active(remote_button, TRUE);
+ gtk_toggle_button_set_active(use_remote, FALSE);
g_loaded_binary_get_remote_server(binary, &host, &port);
@@ -84,13 +101,39 @@ GtkWidget *create_storage_dialog(GLoadedBinary *binary, GtkWindow *parent, GtkBu
widget = gtk_builder_get_object(builder, "port");
gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), port);
- on_server_use_toggled(remote_button, builder);
+ on_server_use_toggled(use_remote, builder);
+
+ /* Intégration des différentes collections */
+
+ store = GTK_LIST_STORE(gtk_builder_get_object(builder, "store"));
+
+ collections = g_loaded_binary_get_all_collections(binary, &count);
+
+ for (i = 0; i < count; i++)
+ {
+ feature = g_db_collection_get_feature(collections[i]);
+
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set(store, &iter,
+ CFC_COLLECTION, collections[i],
+ CFC_NAME, g_db_collection_get_name(collections[i]),
+ CFC_LOCAL, g_loaded_binary_get_storage(binary, feature) == DBS_ALL_LOCAL,
+ CFC_REMOTE, g_loaded_binary_get_storage(binary, feature) != DBS_ALL_LOCAL,
+ -1);
+
+ g_object_unref(G_OBJECT(collections[i]));
+
+ }
+
+ if (collections != NULL)
+ free(collections);
/* Connexion des signaux */
gtk_builder_add_callback_symbols(builder,
"on_server_use_toggled", G_CALLBACK(on_server_use_toggled),
- "update_binary_storage", G_CALLBACK(update_binary_storage),
+ "on_local_feature_toggled", G_CALLBACK(on_local_feature_toggled),
+ "on_remote_feature_toggled", G_CALLBACK(on_remote_feature_toggled),
NULL);
gtk_builder_connect_signals(builder, builder);
@@ -137,8 +180,84 @@ static void on_server_use_toggled(GtkToggleButton *button, GtkBuilder *builder)
/******************************************************************************
* *
-* Paramètres : button = bouton à l'origine de la procédure. *
-* builder = espace de référencement global. *
+* Paramètres : renderer = rendu de cellule à l'origine de la procédure. *
+* path = chemin d'accès à la ligne éditée. *
+* builder = espace de référencement global. *
+* *
+* Description : Bascule le lieu d'enregistrement d'un type de collection. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void on_local_feature_toggled(GtkCellRendererToggle *renderer, gchar *path, GtkBuilder *builder)
+{
+ GtkTreePath *access; /* Véritable chemin d'accès */
+ GtkTreeModel *model; /* Modèle de gestion utilisé */
+ GtkTreeIter iter; /* Point d'actualisation */
+
+ access = gtk_tree_path_new_from_string(path);
+
+ model = GTK_TREE_MODEL(gtk_builder_get_object(builder, "store"));
+
+ if (gtk_tree_model_get_iter(model, &iter, access))
+ {
+ gtk_list_store_set(GTK_LIST_STORE(model), &iter,
+ CFC_LOCAL, true,
+ CFC_REMOTE, false,
+ -1);
+
+ }
+
+ gtk_tree_path_free(access);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : renderer = rendu de cellule à l'origine de la procédure. *
+* path = chemin d'accès à la ligne éditée. *
+* builder = espace de référencement global. *
+* *
+* Description : Bascule le lieu d'enregistrement d'un type de collection. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void on_remote_feature_toggled(GtkCellRendererToggle *renderer, gchar *path, GtkBuilder *builder)
+{
+ GtkTreePath *access; /* Véritable chemin d'accès */
+ GtkTreeModel *model; /* Modèle de gestion utilisé */
+ GtkTreeIter iter; /* Point d'actualisation */
+
+ access = gtk_tree_path_new_from_string(path);
+
+ model = GTK_TREE_MODEL(gtk_builder_get_object(builder, "store"));
+
+ if (gtk_tree_model_get_iter(model, &iter, access))
+ {
+ gtk_list_store_set(GTK_LIST_STORE(model), &iter,
+ CFC_LOCAL, false,
+ CFC_REMOTE, true,
+ -1);
+
+ }
+
+ gtk_tree_path_free(access);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : builder = espace de référencement global. *
+* binary = binaire chargé en mémoire à traiter. *
* *
* Description : Applique les paramètres d'enregistrement pour un binaire. *
* *
@@ -148,16 +267,19 @@ static void on_server_use_toggled(GtkToggleButton *button, GtkBuilder *builder)
* *
******************************************************************************/
-static void update_binary_storage(GtkButton *button, GtkBuilder *builder)
+void update_binary_storage(GtkBuilder *builder, GLoadedBinary *binary)
{
- GLoadedBinary *binary; /* Binaire à mettre à jour */
GObject *widget; /* Composant à mettre à jour */
const gchar *host; /* Serveur distant à contacter */
gint port; /* Port d'écoute du serveur */
- GtkToggleButton *local_button; /* Choix du serveur local */
- gboolean active; /* Etat du choix du local */
-
- binary = G_LOADED_BINARY(g_object_get_data(G_OBJECT(builder), "binary"));
+ GtkToggleButton *use_remote; /* Choix du serveur distant */
+ gboolean active; /* Etat du choix du distant */
+ GtkTreeModel *model; /* Modèle de gestion utilisé */
+ GtkTreeIter iter; /* Itérateur de consultation */
+ gboolean valid; /* Validité de l'itérateur */
+ GDbCollection *collec; /* Collection à traiter */
+ gboolean local; /* Conservation locale ? */
+ uint32_t feature; /* Type d'éléments gérés */
/* Infos de connexions à distance */
@@ -171,10 +293,31 @@ static void update_binary_storage(GtkButton *button, GtkBuilder *builder)
/* Choix final du serveur */
- local_button = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "local_storage"));
+ use_remote = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "use_remote"));
+
+ active = gtk_toggle_button_get_active(use_remote);
+
+ g_loaded_binary_set_remote_storage_usage(binary, active);
+
+ /* Type de conservation des éléments */
+
+ model = GTK_TREE_MODEL(gtk_builder_get_object(builder, "store"));
+
+ for (valid = gtk_tree_model_get_iter_first(model, &iter);
+ valid;
+ valid = gtk_tree_model_iter_next(model, &iter))
+ {
+ gtk_tree_model_get(model, &iter,
+ CFC_COLLECTION, &collec,
+ CFC_LOCAL, &local,
+ -1);
+
+ feature = g_db_collection_get_feature(collec);
+
+ g_loaded_binary_set_storage(binary, feature, local ? DBS_ALL_LOCAL : DBS_ALL_REMOTE);
- active = gtk_toggle_button_get_active(local_button);
+ g_object_unref(G_OBJECT(collec));
- g_loaded_binary_set_local_storage(binary, active);
+ }
}