From bb6d0c758f8c720d8074bf74e6bd001e36d6a918 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Tue, 1 Jan 2013 15:45:46 +0000
Subject: Made sure the links have enough space to get fully drawn.

git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@315 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
---
 ChangeLog                    | 10 ++++++++++
 src/gtkext/gtkgraphview.c    | 30 ++++++++++++++++++++++++++----
 src/gtkext/gtklinkrenderer.c | 26 ++++++++++++++++++++++++++
 src/gtkext/gtklinkrenderer.h |  5 ++++-
 4 files changed, 66 insertions(+), 5 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 322b5f1..f2e81ac 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+13-01-01  Cyrille Bagard <nocbos@gmail.com>
+
+	* src/gtkext/gtkgraphview.c:
+	Make sure the links have enough space to get fully drawn, and resize
+	the support widget.
+
+	* src/gtkext/gtklinkrenderer.c:
+	* src/gtkext/gtklinkrenderer.h:
+	Update size requisition of the parent graph view.
+
 12-12-31  Cyrille Bagard <nocbos@gmail.com>
 
 	* src/arch/archbase.c:
diff --git a/src/gtkext/gtkgraphview.c b/src/gtkext/gtkgraphview.c
index 88210f5..543f2d7 100644
--- a/src/gtkext/gtkgraphview.c
+++ b/src/gtkext/gtkgraphview.c
@@ -192,9 +192,9 @@ static void gtk_graph_view_size_request(GtkWidget *widget, GtkRequisition *requi
 {
     gpointer fixed_class;                   /* Classe parente              */
     GtkGraphView *view;                     /* Autre vision du composant   */
+    size_t i;                               /* Boucle de parcours          */
     gint left_corner;                       /* Abscisse minimale           */
     gint top_corner;                        /* Ordonnée minimale           */
-    size_t i;                               /* Boucle de parcours          */
 
     fixed_class = g_type_class_peek_parent(GTK_GRAPH_VIEW_GET_CLASS(widget));
     fixed_class = g_type_class_peek_parent(fixed_class);
@@ -203,6 +203,21 @@ static void gtk_graph_view_size_request(GtkWidget *widget, GtkRequisition *requi
 
     view = GTK_GRAPH_VIEW(widget);
 
+    requisition->width += GTK_VIEW_PANEL(widget)->hadjustment->value;
+    requisition->height += GTK_VIEW_PANEL(widget)->vadjustment->value;
+
+    /**
+     * On s'assure de ne couper aucun lien.
+     */
+
+    for (i = 0; i < view->links_count; i++)
+        gtk_link_renderer_size_request(view->links[i], requisition);
+
+    /**
+     * Traitement purement cosmétique : on ajoute la même bordure aux bords
+     * droit et bas.
+     */
+
     left_corner = G_MAXINT;
     top_corner = G_MAXINT;
 
@@ -215,9 +230,6 @@ static void gtk_graph_view_size_request(GtkWidget *widget, GtkRequisition *requi
     if (left_corner != G_MAXINT) requisition->width += left_corner;
     if (top_corner != G_MAXINT) requisition->height += top_corner;
 
-    requisition->width += GTK_VIEW_PANEL(widget)->hadjustment->value;
-    requisition->height += GTK_VIEW_PANEL(widget)->vadjustment->value;
-
 }
 
 
@@ -240,6 +252,8 @@ static void gtk_graph_view_size_allocate(GtkWidget *widget, GtkAllocation *alloc
     GtkViewPanel *panel;                    /* Autre version du composant  */
     GtkAllocation valloc;                   /* Surface utilisable          */
     GtkRequisition req;                     /* Taille demandée             */
+    GtkGraphView *view;                     /* Autre vision du composant   */
+    GdkWindow *window;                      /* Fenêtre associée au support */
     gboolean changed;                       /* Changement de valeur ?      */
 
     /* Mise à jour GTK */
@@ -258,6 +272,14 @@ static void gtk_graph_view_size_allocate(GtkWidget *widget, GtkAllocation *alloc
 
     gtk_widget_size_request(widget, &req);
 
+    /* Correction de la taille du support */
+
+    view = GTK_GRAPH_VIEW(widget);
+    window = GTK_WIDGET(view->support)->window;
+
+    if (gdk_window_get_width(window) != req.width || gdk_window_get_height(window) != req.height)
+        gdk_window_resize(window, req.width, req.height);
+
     /* Défilement horizontal */
 
     panel->hadjustment->page_size = valloc.width;
diff --git a/src/gtkext/gtklinkrenderer.c b/src/gtkext/gtklinkrenderer.c
index 8b43fa8..e37a5f1 100644
--- a/src/gtkext/gtklinkrenderer.c
+++ b/src/gtkext/gtklinkrenderer.c
@@ -134,6 +134,32 @@ GtkObject *gtk_link_renderer_new(LinkColor color, GdkPoint *points, size_t count
 
 /******************************************************************************
 *                                                                             *
+*  Paramètres  : renderer    = moteur de rendu à manipuler.                   *
+*                requisition = dimensions adaptées validées. [OUT]            *
+*                                                                             *
+*  Description : S'assure qu'une zone sera assez grande pour tout contenir.   *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+void gtk_link_renderer_size_request(const GtkLinkRenderer *renderer, GtkRequisition *requisition)
+{
+    size_t i;                               /* Boucle de parcours          */
+
+    for (i = 0; i < renderer->count; i++)
+    {
+        requisition->width = MAX(requisition->width, renderer->points[i].x);
+        requisition->height = MAX(requisition->height, renderer->points[i].y);
+    }
+
+}
+
+
+/******************************************************************************
+*                                                                             *
 *  Paramètres  : renderer = moteur de rendu à manipuler.                      *
 *                drawable = surface de rendu à utiliser.                      *
 *                gc       = contexte graphique du dessin.                     *
diff --git a/src/gtkext/gtklinkrenderer.h b/src/gtkext/gtklinkrenderer.h
index 3f6442c..ed2699e 100644
--- a/src/gtkext/gtklinkrenderer.h
+++ b/src/gtkext/gtklinkrenderer.h
@@ -27,7 +27,7 @@
 
 #include <stdbool.h>
 #include <gdk/gdk.h>
-#include <gtk/gtkobject.h>
+#include <gtk/gtk.h>
 
 
 
@@ -65,6 +65,9 @@ GType gtk_link_renderer_get_type(void);
 /* Crée un nouveau moteur de rendu pour les liens graphiques. */
 GtkObject *gtk_link_renderer_new(LinkColor, GdkPoint *, size_t);
 
+/* S'assure qu'une zone sera assez grande pour tout contenir. */
+void gtk_link_renderer_size_request(const GtkLinkRenderer *, GtkRequisition *);
+
 /* Dessine les liens graphiques enregistrés dans le moteur. */
 void gtk_link_renderer_draw(const GtkLinkRenderer *, GdkDrawable *, GdkGC *);
 
-- 
cgit v0.11.2-87-g4458