summaryrefslogtreecommitdiff
path: root/src/gtkext/gtklinkrenderer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gtkext/gtklinkrenderer.c')
-rw-r--r--src/gtkext/gtklinkrenderer.c100
1 files changed, 97 insertions, 3 deletions
diff --git a/src/gtkext/gtklinkrenderer.c b/src/gtkext/gtklinkrenderer.c
index 9332860..2913c19 100644
--- a/src/gtkext/gtklinkrenderer.c
+++ b/src/gtkext/gtklinkrenderer.c
@@ -24,12 +24,16 @@
#include "gtklinkrenderer.h"
+#include <math.h>
+
+
/* Lien entre morceaux de code (instance) */
struct _GtkLinkRenderer
{
GtkObject parent; /* A laisser en premier */
+ LinkColor color; /* Couleur d'impression */
GdkPoint *points; /* Points de la ligne dessinée */
size_t count; /* Quantité de ces points */
@@ -44,12 +48,18 @@ struct _GtkLinkRendererClass
};
+#define ARROW_LENGHT 10
+#define ARROW_DEGREES 10
+
+
/* Initialise la classe générique des liens graphiques. */
static void gtk_link_renderer_class_init(GtkLinkRendererClass *);
/* Initialise une instance de lien graphique entre codes. */
static void gtk_link_renderer_init(GtkLinkRenderer *);
+/* Dessine une flèche au bout du lien représenté. */
+static void draw_link_arrow(cairo_t *, gint, gint, gint, gint);
@@ -95,7 +105,8 @@ static void gtk_link_renderer_init(GtkLinkRenderer *view)
/******************************************************************************
* *
-* Paramètres : points = points consituant la ligne à représenter. *
+* Paramètres : color = couleur d'impression. *
+ù points = points consituant la ligne à représenter. *
* count = nombre de ces points. *
* *
* Description : Crée un nouveau moteur de rendu pour les liens graphiques. *
@@ -106,12 +117,13 @@ static void gtk_link_renderer_init(GtkLinkRenderer *view)
* *
******************************************************************************/
-GtkObject *gtk_link_renderer_new(GdkPoint *points, size_t count)
+GtkObject *gtk_link_renderer_new(LinkColor color, GdkPoint *points, size_t count)
{
GtkLinkRenderer *result; /* Moteur de rendu à retourner */
result = g_object_new(GTK_TYPE_LINK_RENDERER, NULL);
+ result->color = color;
result->points = points;
result->count = count;
@@ -136,6 +148,88 @@ GtkObject *gtk_link_renderer_new(GdkPoint *points, size_t count)
void gtk_link_renderer_draw(const GtkLinkRenderer *renderer, GdkDrawable *drawable, GdkGC *gc)
{
- gdk_draw_lines(drawable, gc, renderer->points, renderer->count);
+ cairo_t *cairo; /* Gestionnaire de rendu */
+ size_t i; /* Boucle de parcours */
+
+ cairo = gdk_cairo_create(drawable);
+
+ switch (renderer->color)
+ {
+ default:
+ case LKC_DEFAULT:
+ cairo_set_source_rgb(cairo, 0, 0, 0);
+ break;
+ case LKC_GREEN:
+ cairo_set_source_rgb(cairo, 0, 0.6, 0);
+ break;
+ case LKC_RED:
+ cairo_set_source_rgb(cairo, 0.8, 0, 0);
+ break;
+ }
+
+ cairo_set_line_width(cairo, 1);
+
+ cairo_move_to(cairo, renderer->points[0].x, renderer->points[0].y);
+
+ for (i = 1; i < renderer->count; i++)
+ cairo_line_to(cairo, renderer->points[i].x, renderer->points[i].y);
+
+ cairo_stroke(cairo);
+
+ draw_link_arrow(cairo,
+ renderer->points[renderer->count - 2].x,
+ renderer->points[renderer->count - 2].y,
+ renderer->points[renderer->count - 1].x,
+ renderer->points[renderer->count - 1].y);
+
+ cairo_destroy(cairo);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : cairo = gestionnaire de rendu graphique. *
+* start_x = abscisse du début du segment final. *
+* start_y = ordonnée du début du segment final. *
+* end_x = abscisse de fin de segment et pointe de flèche. *
+* end_y = ordonnée de fin de segment et pointe de flèche. *
+* *
+* Description : Dessine une flèche au bout du lien représenté. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void draw_link_arrow(cairo_t *cairo, gint start_x, gint start_y, gint end_x, gint end_y)
+{
+ double angle; /* Angle du triangle à remplir */
+ double factor_x; /* Direction de la flèche #1 */
+ double factor_y; /* Direction de la flèche #2 */
+ double x1; /* Abscisse du point n°1 */
+ double y1; /* Ordonnée du point n°1 */
+ double x2; /* Abscisse du point n°2 */
+ double y2; /* Ordonnée du point n°2 */
+
+ angle = atan2(end_y - start_y, end_x - start_x) + M_PI;
+
+ factor_x = -1;
+ factor_y = -1;
+
+ x1 = end_x + factor_x * ARROW_LENGHT * cos(angle - ARROW_DEGREES);
+ y1 = end_y + factor_y * ARROW_LENGHT * sin(angle - ARROW_DEGREES);
+ x2 = end_x + factor_x * ARROW_LENGHT * cos(angle + ARROW_DEGREES);
+ y2 = end_y + factor_y * ARROW_LENGHT * sin(angle + ARROW_DEGREES);
+
+ cairo_move_to(cairo, end_x, end_y);
+
+ cairo_line_to(cairo, x1, y1);
+ cairo_line_to(cairo, x2, y2);
+
+ cairo_move_to(cairo, end_x, end_y);
+
+ cairo_fill(cairo);
}