diff options
Diffstat (limited to 'src/gui/editor.c')
-rw-r--r-- | src/gui/editor.c | 297 |
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); + +} |