summaryrefslogtreecommitdiff
path: root/src/gui
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/editor.c297
1 files changed, 141 insertions, 156 deletions
diff --git a/src/gui/editor.c b/src/gui/editor.c
index e5ec4d7..f29ffe7 100644
--- a/src/gui/editor.c
+++ b/src/gui/editor.c
@@ -100,6 +100,8 @@ typedef struct _panel_node
{
struct _panel_node *parent; /* Noeud parent */
+ char *path; /* Chemin du nom courant */
+
union
{
GtkWidget *widget; /* Accès généraliste */
@@ -111,10 +113,7 @@ typedef struct _panel_node
union
{
/* Version simple */
- struct
- {
- char *path; /* Chemin du nom courant */
- };
+ /* ... */
/* Version composée */
struct
@@ -152,8 +151,8 @@ static void switch_panel_node_into_paned(panel_node *, bool, bool);
/* Met en place un nouveau noeud dans une division. */
static void attach_panel_node_to_paned(panel_node *, panel_node *, bool);
-/* Obtient la désignation d'un élément hiérarchie des noeuds. */
-static char *get_panel_node_path(const panel_node *);
+/* Met à jour en cascade les chemins d'accès aux noeuds. */
+static void update_path_of_paned_nodes(panel_node *, const char *);
/* Détermine la plus grande longueur commune entre éléments. */
static size_t compute_path_common_length(const panel_node *, const char *);
@@ -164,6 +163,9 @@ static void insert_item_as_panel_node(GPanelItem *, panel_node *, const char *,
/* Tente de mettre la main sur une station d'accueil. */
static panel_node *find_node_for_station(panel_node *, GtkWidget *);
+/* Tente de mettre la main sur un panneau de division graphique. */
+static panel_node *find_node_for_paned(panel_node *, GtkWidget *);
+
/* Efface de l'organisation un noeud donné en place. */
static void delete_panel_node(panel_node *);
@@ -187,6 +189,8 @@ static void on_dock_menu_request(GtkDockStation *, GtkWidget *, GObject *);
/* Réagit à une demande de fermeture du panneau courant. */
static void on_dock_close_request(GtkDockStation *, GtkWidget *, GObject *);
+/* Réagit à une variation dans une séparation de panneaux. */
+static void notify_paned_handle_position_change(GObject *, GParamSpec *, gpointer);
@@ -436,11 +440,6 @@ static void on_destroy_editor(GtkWidget *widget, gpointer data)
project = get_current_project();
if (project != NULL) g_object_unref(G_OBJECT(project));
- //if (!result)
- save_panel_nodes();
-
-
-
/* Fermeture propre */
/* ... */
@@ -587,6 +586,8 @@ static void switch_panel_node_into_paned(panel_node *node, bool horiz, bool firs
memcpy(moved, node, sizeof(panel_node));
+ node->path = NULL;
+
if (!IS_SIMPLE_NODE(moved))
{
moved->first->parent = moved;
@@ -600,6 +601,8 @@ static void switch_panel_node_into_paned(panel_node *node, bool horiz, bool firs
else
node->paned = gtk_paned_new(GTK_ORIENTATION_VERTICAL);
+ g_signal_connect(node->paned, "notify::position", G_CALLBACK(notify_paned_handle_position_change), NULL);
+
gtk_widget_show(node->paned);
if (parent == NULL)
@@ -607,54 +610,6 @@ static void switch_panel_node_into_paned(panel_node *node, bool horiz, bool firs
else
attach_panel_node_to_paned(parent, node, parent->first == node);
-
-
-
- /* Premier ajustement */
-
- void split_paned_support(GtkWidget *support, GdkRectangle *alloc, gpointer data)
- {
- GtkOrientation orientation;
- gint position;
-
- orientation = gtk_orientable_get_orientation(GTK_ORIENTABLE(support));
-
- if (orientation == GTK_ORIENTATION_HORIZONTAL)
- position = alloc->width / 2;
- else
- position = alloc->height / 2;
-
- /*
- if (position < 50)
- position *= 2;
- */
-
- gtk_paned_set_position(GTK_PANED(support), position);
-
- fprintf(stderr, "widget size is currently %dx%d\n", alloc->width, alloc->height);
-
-
- fprintf(stderr, "position = %d\n", position);
-
- fprintf(stderr, "---\n");
-
-
- g_signal_handlers_disconnect_by_func(support, G_CALLBACK(split_paned_support), NULL);
-
- }
-
- //g_signal_connect(current->paned, "size-allocate", G_CALLBACK(split_paned_support), NULL);
-
- static int __counter = 0;
-
-
-
- if (++__counter == 4)
- gtk_paned_set_position(GTK_PANED(node->paned), 100);
-
-
-
-
/* Replace le composant d'origine */
attach_panel_node_to_paned(node, moved, first);
@@ -683,8 +638,13 @@ static void attach_panel_node_to_paned(panel_node *parent, panel_node *node, boo
/* On se trouve à la racine... */
if (parent == NULL)
+ {
gtk_container_add(GTK_CONTAINER(_support), node->widget);
+ update_path_of_paned_nodes(node, "");
+
+ }
+
else
{
/* Raccordement hiérarchique */
@@ -703,6 +663,10 @@ static void attach_panel_node_to_paned(panel_node *parent, panel_node *node, boo
else
gtk_paned_pack2(GTK_PANED(parent->paned), node->widget, TRUE, FALSE);
+ /* Mise à jour des chemins */
+
+ update_path_of_paned_nodes(node, parent->path);
+
}
}
@@ -710,40 +674,57 @@ static void attach_panel_node_to_paned(panel_node *parent, panel_node *node, boo
/******************************************************************************
* *
-* Paramètres : node = noeud dont la désignation est à obtenir. *
+* Paramètres : node = noeud dont le chemin est à mettre à jour. *
+* root = chemin menant au niveau précédent. *
* *
-* Description : Obtient la désignation d'un élément hiérarchie des noeuds. *
+* Description : Met à jour en cascade les chemins d'accès aux noeuds. *
* *
-* Retour : Chaîne construite à libérer de la mémoire après usage. *
+* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
-static char *get_panel_node_path(const panel_node *node)
+static void update_path_of_paned_nodes(panel_node *node, const char *root)
{
- char *result; /* Valeur à retourner */
- char *extra; /* Complément à ajouter */
-
- if (IS_SIMPLE_NODE(node))
- result = strdup(node->path);
+ GtkOrientation orientation; /* Orientation du support */
+ char *key; /* Clef d'accès à un paramètre */
+ gint position; /* Nouvelle position de barre */
- else
+ if (!IS_SIMPLE_NODE(node))
{
- result = get_panel_node_path(node->first);
+ /* Reconstruction locale */
- extra = get_panel_node_path(node->second);
- result = stradd(result, "-");
- result = stradd(result, extra);
- free(extra);
+ if (node->path != NULL)
+ free(node->path);
- result = strprep(result, "(");
- result = stradd(result, ")");
+ node->path = strdup(root);
+ orientation = gtk_orientable_get_orientation(GTK_ORIENTABLE(node->paned));
- }
+ if (orientation == GTK_ORIENTATION_HORIZONTAL)
+ node->path = stradd(node->path, "h");
+ else
+ node->path = stradd(node->path, "v");
- return result;
+ /* Rechargement de la position ? */
+
+ asprintf(&key, "gui.panels.positions.%s", node->path);
+
+ if (g_generic_config_get_value(get_main_configuration(), key, &position))
+ gtk_paned_set_position(GTK_PANED(node->paned), position);
+
+ free(key);
+
+ /* Propagation de la mise à jour */
+
+ if (node->first)
+ update_path_of_paned_nodes(node->first, node->path);
+
+ if (node->second != NULL)
+ update_path_of_paned_nodes(node->second, node->path);
+
+ }
}
@@ -865,8 +846,9 @@ static void insert_item_as_panel_node(GPanelItem *item, panel_node *node, const
common2 = compute_path_common_length(node->second, path);
- fprintf(stderr, " - L1 :: %zu <-> '%s'\n", common1, get_panel_node_path(node->first));
- fprintf(stderr, " - L2 :: %zu <-> '%s'\n", common2, get_panel_node_path(node->second));
+
+ fprintf(stderr, " - L1 :: %zu <-> '%s'\n", common1, node->first->path);
+ fprintf(stderr, " - L2 :: %zu <-> '%s'\n", common2, node->second->path);
/* Si une descente est possible... */
@@ -909,7 +891,8 @@ static void insert_item_as_panel_node(GPanelItem *item, panel_node *node, const
/******************************************************************************
* *
-* Paramètres : node = point de départ des recherches locales. *
+* Paramètres : node = point de départ des recherches locales. *
+* station = composant graphique à retrouver. *
* *
* Description : Tente de mettre la main sur une station d'accueil. *
* *
@@ -942,6 +925,47 @@ static panel_node *find_node_for_station(panel_node *node, GtkWidget *station)
/******************************************************************************
* *
+* Paramètres : node = point de départ des recherches locales. *
+* paned = composant graphique à retrouver. *
+* *
+* Description : Tente de mettre la main sur un panneau de division graphique.*
+* *
+* Retour : Eventuel noeud trouvé ou NULL. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static panel_node *find_node_for_paned(panel_node *node, GtkWidget *paned)
+{
+ panel_node *result; /* Bilan à remonter */
+
+ if (IS_SIMPLE_NODE(node))
+ result = NULL;
+
+ else
+ {
+ if (node->paned == paned)
+ result = node;
+
+ else
+ {
+ result = find_node_for_paned(node->first, paned);
+
+ if (result == NULL)
+ result = find_node_for_paned(node->second, paned);
+
+ }
+
+ }
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : node = noeud à supprimer de l'arbre des noeuds. *
* *
* Description : Efface de l'organisation un noeud donné en place. *
@@ -1014,81 +1038,6 @@ static void delete_panel_node(panel_node *node)
-
-
-
-
-
-
-
-
-
-
-
-#if 1
-
-
-#include "../core/params.h"
-
-
-
-/******************************************************************************
-* *
-* Paramètres : current = point de départ de la réorganisation graphique. *
-* *
-* Description : Met à jour l'affichage suite à un changement hiérarchique. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-void save_panel_nodes(void)
-{
-
-
- fprintf(stderr, "Passage avec %p\n", _nodes);
-
- return;
- void store_handle_position(panel_node *node, GGenConfig *config)
- {
-
- size_t i;
-
- for (i = 0; i < 0/*node->depth*/; i++)
- fprintf(stderr, " ");
-
-
- ///fprintf(stderr, "[%s] %s\n", node->path, node->simple ? "[+]" : ">>");
-
-
- if (0/*!node->simple*/)
- {
- store_handle_position(node->first, config);
- store_handle_position(node->second, config);
- }
-
-
- }
-
-
- //get_main_configuration()
-
-
- store_handle_position(_nodes, NULL);
-
- fflush(NULL);
-
-
-}
-
-#endif
-
-
-
-
-
/* ---------------------------------------------------------------------------------- */
/* INTERACTIONS GRAPHIQUES LIEES AUX PANNEAUX */
/* ---------------------------------------------------------------------------------- */
@@ -1340,3 +1289,39 @@ static void on_dock_close_request(GtkDockStation *station, GtkWidget *button, GO
g_panel_item_undock(panel);
}
+
+
+/******************************************************************************
+* *
+* Paramètres : obj = objet à l'origine de la procédure. *
+* pspec = spécification de l'attribut qui a varié. *
+* unused = adresse non utilisée ici. *
+* *
+* Description : Réagit à une variation dans une séparation de panneaux. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void notify_paned_handle_position_change(GObject *obj, GParamSpec *pspec, gpointer unused)
+{
+ GtkPaned *paned; /* Panneau concerné */
+ panel_node *node; /* Noeud hiérarchique associé */
+ gint position; /* Nouvelle position de barre */
+ char *key; /* Clef d'accès à un paramètre */
+
+ paned = GTK_PANED(obj);
+
+ node = find_node_for_paned(_nodes, GTK_WIDGET(paned));
+
+ position = gtk_paned_get_position(paned);
+
+ asprintf(&key, "gui.panels.positions.%s", node->path);
+
+ g_generic_config_create_or_udpdate_param(get_main_configuration(), key, CPT_INTEGER, position);
+
+ free(key);
+
+}