summaryrefslogtreecommitdiff
path: root/src/gtkext/graph/layout.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gtkext/graph/layout.c')
-rw-r--r--src/gtkext/graph/layout.c132
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);
}