[libchamplain] Make the view draw many lines
- From: Pierre-Luc Beaudoin <plbeaudoin src gnome org>
- To: svn-commits-list gnome org
- Subject: [libchamplain] Make the view draw many lines
- Date: Fri, 12 Jun 2009 00:57:32 -0400 (EDT)
commit bbc090e433995f4befe38a9b1aaf4148b050e7c3
Author: Pierre-Luc Beaudoin <pierre-luc pierlux com>
Date: Sun May 24 23:41:01 2009 -0400
Make the view draw many lines
champlain/champlain-view.c | 106 ++++++++++++++++++++++++++++++++------------
champlain/champlain-view.h | 3 +
demos/lines.c | 4 ++
3 files changed, 85 insertions(+), 28 deletions(-)
---
diff --git a/champlain/champlain-view.c b/champlain/champlain-view.c
index 5c95b69..0cad84a 100644
--- a/champlain/champlain-view.c
+++ b/champlain/champlain-view.c
@@ -142,7 +142,6 @@ struct _ChamplainViewPrivate
ChamplainRectangle viewport_size;
ClutterActor *user_layers; /* Contains the markers */
- ClutterActor *line_layer; /* Contains the lines */
gboolean keep_center_on_resize;
@@ -156,7 +155,10 @@ struct _ChamplainViewPrivate
/* champlain_view_go_to's context, kept for stop_go_to */
GoToContext *goto_context;
- ChamplainLine *line;
+ /* Lines and shapes */
+ GList *lines;
+ ClutterActor *line_layer; /* Contains the lines */
+
};
G_DEFINE_TYPE (ChamplainView, champlain_view, CLUTTER_TYPE_GROUP);
@@ -855,6 +857,8 @@ champlain_view_init (ChamplainView *view)
priv->user_layers);
clutter_actor_raise (priv->user_layers, priv->map_layer);
+ priv->lines = NULL;
+
/* Setup line layer */
priv->line_layer = g_object_ref (clutter_cairo_new (800, 600));
clutter_actor_show (priv->line_layer);
@@ -2173,35 +2177,13 @@ champlain_view_get_zoom_on_double_click (ChamplainView *view)
return priv->zoom_on_double_click;
}
-void
-champlain_view_add_line (ChamplainView *view,
- ChamplainLine *line)
-{
- g_return_if_fail (CHAMPLAIN_IS_VIEW (view));
- g_return_if_fail (CHAMPLAIN_IS_LINE (line));
-
- view->priv->line = g_object_ref (line);
-}
-
static void
-view_update_lines (ChamplainView *view)
+draw_line (ChamplainView *view, cairo_t *cr, ChamplainLine *line)
{
ChamplainViewPrivate *priv = view->priv;
- if (priv->line == NULL)
- return;
-
- cairo_t *cr;
- cr = clutter_cairo_create (CLUTTER_CAIRO (priv->line_layer));
-
- /* Clear the drawing area */
- cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
- cairo_rectangle (cr, 0, 0, 800, 600);
- cairo_fill (cr);
-
- /* Draw the line */
cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
- GList *list = g_list_first (priv->line->priv->points);
+ GList *list = g_list_first (line->priv->points);
while (list != NULL)
{
ChamplainPoint *point = (ChamplainPoint*) list->data;
@@ -2218,13 +2200,81 @@ view_update_lines (ChamplainView *view)
cairo_line_to (cr, x, y);
list = list->next;
}
- gint x, y;
+ cairo_stroke (cr);
+}
+
+static void
+view_update_lines (ChamplainView *view)
+{
+ ChamplainViewPrivate *priv = view->priv;
+ GList * lines;
+ cairo_t *cr;
+ gint x, y;
+
+ if (priv->lines == NULL)
+ return;
+
+ cr = clutter_cairo_create (CLUTTER_CAIRO (priv->line_layer));
+
+ /* Clear the drawing area */
+ cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
+ cairo_rectangle (cr, 0, 0, 800, 600);
+ cairo_fill (cr);
+
+ lines = priv->lines;
+ while (lines != NULL)
+ {
+ ChamplainLine *line;
+ line = CHAMPLAIN_LINE (lines->data);
+ draw_line (view, cr, line);
+ lines = lines->next;
+ }
+
+ /* Position the layer in the viewport */
x = priv->viewport_size.x;
y = priv->viewport_size.y;
- cairo_stroke (cr);
cairo_destroy (cr);
clutter_actor_set_position (priv->line_layer, x, y);
}
+
+/**
+ * champlain_view_add_line:
+ * @view: a #ChamplainView
+ * @line: a #ChamplainLine
+ *
+ * Adds a #ChamplainLine to the #ChamplainView
+ *
+ * Since: 0.4
+ */
+void
+champlain_view_add_line (ChamplainView *view,
+ ChamplainLine *line)
+{
+ g_return_if_fail (CHAMPLAIN_IS_VIEW (view));
+ g_return_if_fail (CHAMPLAIN_IS_LINE (line));
+
+ view->priv->lines = g_list_append (view->priv->lines, g_object_ref (line));
+}
+
+/**
+ * champlain_view_remove_line:
+ * @view: a #ChamplainView
+ * @line: a #ChamplainLine
+ *
+ * Removes a #ChamplainLine to the #ChamplainView
+ *
+ * Since: 0.4
+ */
+void
+champlain_view_remove_line (ChamplainView *view,
+ ChamplainLine *line)
+{
+ g_return_if_fail (CHAMPLAIN_IS_VIEW (view));
+ g_return_if_fail (CHAMPLAIN_IS_LINE (line));
+
+ view->priv->lines = g_list_remove (view->priv->lines, line);
+ g_object_unref (line);
+}
diff --git a/champlain/champlain-view.h b/champlain/champlain-view.h
index 1645cdc..1a11f1b 100644
--- a/champlain/champlain-view.h
+++ b/champlain/champlain-view.h
@@ -142,6 +142,9 @@ gboolean champlain_view_get_zoom_on_double_click (ChamplainView *view);
void champlain_view_add_line (ChamplainView *view,
ChamplainLine *line);
+void champlain_view_remove_line (ChamplainView *view,
+ ChamplainLine *line);
+
G_END_DECLS
diff --git a/demos/lines.c b/demos/lines.c
index 2bbfd98..e566c7b 100644
--- a/demos/lines.c
+++ b/demos/lines.c
@@ -113,6 +113,10 @@ main (int argc,
champlain_line_add_point (line, 45, -75);
champlain_view_add_line (CHAMPLAIN_VIEW (actor), line);
+ line = champlain_line_new ();
+ champlain_line_add_point (line, 44, -75);
+ champlain_line_add_point (line, 45, -74);
+ champlain_view_add_line (CHAMPLAIN_VIEW (actor), line);
/* Finish initialising the map view */
g_object_set (G_OBJECT (actor), "zoom-level", 12,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]