diff options
Diffstat (limited to 'src/gtkext/graph/layout.c')
-rw-r--r-- | src/gtkext/graph/layout.c | 132 |
1 files changed, 98 insertions, 34 deletions
diff --git a/src/gtkext/graph/layout.c b/src/gtkext/graph/layout.c index 377ad52..0a14854 100644 --- a/src/gtkext/graph/layout.c +++ b/src/gtkext/graph/layout.c @@ -569,51 +569,27 @@ static void g_graph_layout_finalize(GGraphLayout *layout) GGraphLayout *g_graph_layout_new(GInstrBlock *blocks, GtkBufferView **views, size_t count) { GGraphLayout *result; /* Structure à retourner */ - size_t i; /* Boucle de parcours */ result = g_object_new(G_TYPE_GRAPH_LAYOUT, NULL); result->nodes = convert_blocks_into_nodes(blocks, views, count); - /* Traitement des positions horizontales */ - - g_graph_node_set_position(result->nodes, (gint []) { 0 }, NULL); - g_virtual_node_organize_x_line(G_VIRTUAL_NODE(result->nodes)); - - /* Traitement des positions verticales */ - result->ranks = g_graph_ranks_new(count); - bool _register_cb(GFlowNode *node, GGraphRanks *ranks) - { - g_flow_node_register_rank(node, ranks); - return true; - } - - g_graph_node_visit_flow_nodes(result->nodes, (graph_node_visitor_cb)_register_cb, result->ranks); + /* Situations verticales grossières */ - g_graph_ranks_compute_y_line(result->ranks); - - bool _apply_cb(GFlowNode *node, GGraphRanks *ranks) + bool _register_cb(GFlowNode *node, GNodeVisitState state, GGraphLayout *layout) { - g_flow_node_apply_rank(node, ranks); + if (state == GVS_NODE) + g_flow_node_link(node, layout, layout->nodes); return true; } - g_graph_node_visit_flow_nodes(result->nodes, (graph_node_visitor_cb)_apply_cb, result->ranks); - - /* Mise en place des liens */ - - bool _do_links_cb(GFlowNode *node, GGraphLayout *layout) - { - g_flow_node_link(node, layout, layout->nodes); - return true; - } + g_graph_node_visit_nodes(result->nodes, (graph_node_visitor_cb)_register_cb, result); - g_graph_node_visit_flow_nodes(result->nodes, (graph_node_visitor_cb)_do_links_cb, result); + /* Actualisation... */ - for (i = 0; i < result->edges_count; i++) - g_graph_edge_compute(result->edges[i]); + g_graph_layout_refresh(result); return result; @@ -645,6 +621,68 @@ void g_graph_layout_add_edge(GGraphLayout *layout, GGraphEdge *edge) /****************************************************************************** * * +* Paramètres : layout = graphique à mettre à jour. * +* * +* Description : Met à jour les positions des différents noeuds. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_graph_layout_refresh(GGraphLayout *layout) +{ + size_t i; /* Boucle de parcours */ + + g_graph_ranks_reset_reservations(layout->ranks); + + bool _reset_cb(GGraphNode *node, GNodeVisitState state, void *unused) + { + g_graph_node_reset_position(node); + if (state == GVS_NODE) + g_flow_node_register_rank(G_FLOW_NODE(node), layout->ranks); + return true; + } + + g_graph_node_visit_nodes(layout->nodes, (graph_node_visitor_cb)_reset_cb, NULL); + + /* Traitement des positions horizontales */ + + for (i = 0; i < layout->edges_count; i++) + g_graph_edge_reserve_vertical_space(layout->edges[i], layout->nodes, layout->ranks); + + /* Traitement des positions horizontales */ + + g_graph_node_set_position(layout->nodes, (gint []) { 0 }, NULL); + g_virtual_node_organize_x_line(G_VIRTUAL_NODE(layout->nodes)); + + for (i = 0; i < layout->edges_count; i++) + g_graph_edge_reserve_horizontal_space(layout->edges[i], layout->ranks); + + /* Traitement des positions verticales */ + + g_graph_ranks_compute_y_line(layout->ranks); + + bool _apply_cb(GFlowNode *node, GNodeVisitState state, GGraphRanks *ranks) + { + if (state == GVS_NODE) + g_flow_node_apply_rank(node, ranks); + return true; + } + + g_graph_node_visit_nodes(layout->nodes, (graph_node_visitor_cb)_apply_cb, layout->ranks); + + /* Mise en place des liens */ + + for (i = 0; i < layout->edges_count; i++) + g_graph_edge_compute(layout->edges[i], layout->ranks); + +} + + +/****************************************************************************** +* * * Paramètres : layout = disposition en graphique prête. * * view = support de destination finale. * * * @@ -658,13 +696,39 @@ void g_graph_layout_add_edge(GGraphLayout *layout, GGraphEdge *edge) void g_graph_layout_place(GGraphLayout *layout, GtkGraphView *view) { - bool _place_cb(GFlowNode *node, GtkGraphView *view) + bool _place_cb(GFlowNode *node, GNodeVisitState state, GtkGraphView *view) { - g_flow_node_place(node, view); + if (state == GVS_NODE) + g_flow_node_place(node, view); return true; } - g_graph_node_visit_flow_nodes(layout->nodes, (graph_node_visitor_cb)_place_cb, view); + g_graph_node_visit_nodes(layout->nodes, (graph_node_visitor_cb)_place_cb, view); + +} + + +/****************************************************************************** +* * +* Paramètres : layout = graphique constitué à consulter. * +* requisition = dimensions souhaitées. [OUT] * +* * +* Description : Fournit la taille requise pour un plein rendu du graphique. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_graph_layout_size_request(const GGraphLayout *layout, GtkRequisition *requisition) +{ + GtkAllocation alloc; /* Largeur totale requise */ + + alloc = g_graph_node_get_allocation(layout->nodes); + requisition->width = alloc.width + 2 * GRAPH_HORIZONTAL_MARGIN; + + requisition->height = g_graph_ranks_get_height(layout->ranks); } |