gcompris r3633 - in branches/gcomprixogoo: . src/canal_lock-activity src/canal_lock-activity/resources/canal_lock src/goocanvas/src



Author: bcoudoin
Date: Sun Nov 30 23:25:24 2008
New Revision: 3633
URL: http://svn.gnome.org/viewvc/gcompris?rev=3633&view=rev

Log:
	- Completed the canal lock rework based on the new graphism
	  by Stephane Cabaraux.



Modified:
   branches/gcomprixogoo/ChangeLog
   branches/gcomprixogoo/src/canal_lock-activity/canal_lock.c
   branches/gcomprixogoo/src/canal_lock-activity/resources/canal_lock/canal_lock.svgz
   branches/gcomprixogoo/src/goocanvas/src/goocanvassvg.c
   branches/gcomprixogoo/src/goocanvas/src/goocanvassvg.h

Modified: branches/gcomprixogoo/src/canal_lock-activity/canal_lock.c
==============================================================================
--- branches/gcomprixogoo/src/canal_lock-activity/canal_lock.c	(original)
+++ branches/gcomprixogoo/src/canal_lock-activity/canal_lock.c	Sun Nov 30 23:25:24 2008
@@ -22,25 +22,24 @@
 
 #define ANIMATE_SPEED 30
 
-#define CANAL_COLOR		0x0010FFFF
+#define CANAL_COLOR		0x0000B8FF
 #define LOCK_COLOR		0x8cc679FF
 #define LOCK_COLOR_H		0x71A65FFF
 #define CANALLOCK_COLOR		0xd1cd0cFF
 #define CANALLOCK_COLOR_H	0xf1ed1cFF
-#define GROUND_COLOR		0x9b5f5aFF
-#define BASE_LINE		400
-#define LEFT_CANAL_HEIGHT	100
-#define LEFT_CANAL_WIDTH	325
-#define RIGHT_CANAL_HEIGHT	200
+#define BASE_LINE		396
+#define LEFT_CANAL_HEIGHT	90
+#define LEFT_CANAL_WIDTH	329
+#define RIGHT_CANAL_HEIGHT	191
 #define RIGHT_CANAL_WIDTH	325
-#define MIDDLE_CANAL_WIDTH	(BOARDWIDTH - RIGHT_CANAL_WIDTH -  LEFT_CANAL_WIDTH)
+#define MIDDLE_CANAL_WIDTH	(BOARDWIDTH - RIGHT_CANAL_WIDTH - LEFT_CANAL_WIDTH)
 
 #define LOCK_WIDTH		20
 #define LOCK_HEIGHT_MAX		(RIGHT_CANAL_HEIGHT + 40)
 #define LOCK_HEIGHT_MIN		60
 #define LOCK_RHEIGHT_MIN	160
 
-#define SUBCANAL_BASE_LINE	(BASE_LINE + 80)
+#define SUBCANAL_BASE_LINE	(BASE_LINE + 84)
 #define SUBCANAL_HEIGHT		40
 
 #define CANALLOCK_WIDTH		30
@@ -69,13 +68,16 @@
 static GooCanvasItem	*canallock_left_item	= NULL;
 static GooCanvasItem	*canallock_right_item	= NULL;
 
-static GooCanvasItem	*canal_left_item	= NULL;
 static GooCanvasItem	*canal_middle_item	= NULL;
-static GooCanvasItem	*canal_right_item	= NULL;
 
 static GooCanvasItem	*tuxboat_item		= NULL;
 static double		 tuxboat_width;
 
+static GooCanvasItem    *left_red_on_item;
+static GooCanvasItem    *left_green_on_item;
+static GooCanvasItem    *right_red_on_item;
+static GooCanvasItem    *right_green_on_item;
+
 #define BOAT_POS_LEFT		1
 #define BOAT_POS_MIDDLE		2
 #define BOAT_POS_RIGHT		3
@@ -106,6 +108,7 @@
 static gboolean		 animate_step();
 static void		 update_water();
 static void		 toggle_lock(GooCanvasItem *item);
+static void		 update_lights();
 
 /* Description of this plugin */
 static BoardPlugin menu_bp =
@@ -165,6 +168,13 @@
       gcomprisBoard->sublevel=1;
       gcomprisBoard->number_of_sublevel=1; /* Go to next level after this number of 'play' */
 
+      boardRootItem =
+	goo_canvas_group_new (goo_canvas_get_root_item(gcomprisBoard->canvas),
+			      NULL);
+
+      /* Try the next level */
+      canal_lock_create_item(boardRootItem);
+
       canal_lock_next_level();
 
       gc_bar_set(0);
@@ -225,13 +235,8 @@
 /* set initial values for the next level */
 static void canal_lock_next_level()
 {
-
-  gc_set_background(goo_canvas_get_root_item(gcomprisBoard->canvas),
-			  "canal_lock/canal_lock_bg.png");
-
   gc_bar_set_level(gcomprisBoard);
 
-  canal_lock_destroy_all_items();
   gamewon = FALSE;
   from = 0;
 
@@ -244,8 +249,7 @@
   canallock_left_up = TRUE;
   canallock_right_up = TRUE;
 
-  /* Try the next level */
-  canal_lock_create_item(goo_canvas_get_root_item(gcomprisBoard->canvas));
+  update_lights();
 }
 /* ==================================== */
 /* Destroy all the items */
@@ -256,50 +260,99 @@
 
   boardRootItem = NULL;
 }
+
+static void
+set_lock_event(GooCanvasItem *item)
+{
+  g_signal_connect(item, "button-press-event",
+		   (GtkSignalFunc) item_event,
+		   NULL);
+  g_signal_connect(item, "enter_notify_event",
+		   (GtkSignalFunc) hightlight,
+		   GINT_TO_POINTER(TRUE));
+  g_signal_connect(item, "leave_notify_event",
+		   (GtkSignalFunc) hightlight,
+		   GINT_TO_POINTER(FALSE));
+}
+
 /* ==================================== */
-static GooCanvasItem *canal_lock_create_item(GooCanvasItem *parent)
+static GooCanvasItem *canal_lock_create_item(GooCanvasItem *boardRootItem)
 {
-  GdkPixbuf *pixmap = NULL;
+  RsvgHandle *svg_handle;
 
-  boardRootItem = goo_canvas_group_new (goo_canvas_get_root_item(gcomprisBoard->canvas),
-					NULL);
+  svg_handle = gc_rsvg_load("canal_lock/canal_lock.svgz");
 
+  /* The background */
+  goo_canvas_svg_new (boardRootItem, svg_handle,
+		      "svg-id", "#BACKGROUND",
+		      "pointer-events", GOO_CANVAS_EVENTS_NONE,
+		      NULL);
 
   /* The boat */
-  pixmap = gc_pixmap_load("canal_lock/tuxboat.png");
+  tuxboat_item = goo_canvas_svg_new (boardRootItem, svg_handle,
+				     "svg-id", "#BOAT_NO_SAIL", NULL);
 
-  tuxboat_item = \
-    goo_canvas_image_new (boardRootItem,
-			  pixmap,
-			  (LEFT_CANAL_WIDTH - gdk_pixbuf_get_width(pixmap)) / 2,
-			  BASE_LINE - LEFT_CANAL_HEIGHT - gdk_pixbuf_get_height(pixmap)*0.9,
-			  NULL);
   g_signal_connect(tuxboat_item, "button-press-event",
                    (GtkSignalFunc) item_event,
                    NULL);
   gc_item_focus_init(tuxboat_item, NULL);
 
-  tuxboat_width = gdk_pixbuf_get_width(pixmap);
-  gdk_pixbuf_unref(pixmap);
+  GooCanvasBounds bounds;
+  goo_canvas_item_get_bounds(tuxboat_item, &bounds);
+  tuxboat_width = bounds.x2 - bounds.x1 + 20;
 
-  /* This is the ground canal */
-  goo_canvas_rect_new (boardRootItem,
-		       0,
-		       BASE_LINE,
-		       BOARDWIDTH,
-		       BOARDHEIGHT - BASE_LINE,
-		       "fill_color_rgba", GROUND_COLOR,
-		       "line-width", (double) 0,
-		       NULL);
-
-  /* This is the left canal */
-  canal_left_item = goo_canvas_rect_new (boardRootItem,
-					 0,
-					 BASE_LINE - LEFT_CANAL_HEIGHT,
-					 LEFT_CANAL_WIDTH,
-					 LEFT_CANAL_HEIGHT,
-					 "fill_color_rgba", CANAL_COLOR,
-					 "line-width", (double) 0,
+  /* The left lights */
+  goo_canvas_svg_new (boardRootItem, svg_handle,
+		      "svg-id", "#LEFT_RED_OFF",
+		      "visibility", GOO_CANVAS_ITEM_VISIBLE,
+		      "pointer-events", GOO_CANVAS_EVENTS_NONE,
+		      NULL);
+  goo_canvas_svg_new (boardRootItem, svg_handle,
+		      "svg-id", "#LEFT_GREEN_OFF",
+		      "visibility", GOO_CANVAS_ITEM_VISIBLE,
+		      "pointer-events", GOO_CANVAS_EVENTS_NONE,
+		      NULL);
+  left_red_on_item =
+    goo_canvas_svg_new (boardRootItem, svg_handle,
+			"svg-id", "#LEFT_RED_ON",
+			"visibility", GOO_CANVAS_ITEM_INVISIBLE,
+			"pointer-events", GOO_CANVAS_EVENTS_NONE,
+			NULL);
+  left_green_on_item =
+    goo_canvas_svg_new (boardRootItem, svg_handle,
+			"svg-id", "#LEFT_GREEN_ON",
+			"visibility", GOO_CANVAS_ITEM_INVISIBLE,
+			"pointer-events", GOO_CANVAS_EVENTS_NONE,
+			NULL);
+  goo_canvas_svg_new (boardRootItem, svg_handle,
+		      "svg-id", "#LEFT_LIGHT_BASE",
+		      "pointer-events", GOO_CANVAS_EVENTS_NONE,
+		      NULL);
+
+  /* The right lights */
+  goo_canvas_svg_new (boardRootItem, svg_handle,
+		      "svg-id", "#RIGHT_RED_OFF",
+		      "visibility", GOO_CANVAS_ITEM_VISIBLE,
+		      "pointer-events", GOO_CANVAS_EVENTS_NONE,
+		      NULL);
+  goo_canvas_svg_new (boardRootItem, svg_handle,
+		      "svg-id", "#RIGHT_GREEN_OFF",
+		      "visibility", GOO_CANVAS_ITEM_VISIBLE,
+		      "pointer-events", GOO_CANVAS_EVENTS_NONE,
+		      NULL);
+  right_red_on_item = goo_canvas_svg_new (boardRootItem, svg_handle,
+					 "svg-id", "#RIGHT_RED_ON",
+					 "visibility", GOO_CANVAS_ITEM_INVISIBLE,
+					 "pointer-events", GOO_CANVAS_EVENTS_NONE,
+					 NULL);
+  right_green_on_item = goo_canvas_svg_new (boardRootItem, svg_handle,
+					 "svg-id", "#RIGHT_GREEN_ON",
+					 "visibility", GOO_CANVAS_ITEM_INVISIBLE,
+					 "pointer-events", GOO_CANVAS_EVENTS_NONE,
+					 NULL);
+  goo_canvas_svg_new (boardRootItem, svg_handle,
+					 "svg-id", "#RIGHT_LIGHT_BASE",
+					 "pointer-events", GOO_CANVAS_EVENTS_NONE,
 					 NULL);
 
   /* This is the middle canal */
@@ -311,16 +364,7 @@
 					   "fill_color_rgba", CANAL_COLOR,
 					   "line-width", (double) 0,
 					   NULL);
-
-  /* This is the right canal */
-  canal_right_item = goo_canvas_rect_new (boardRootItem,
-					  LEFT_CANAL_WIDTH + MIDDLE_CANAL_WIDTH,
-					  BASE_LINE - RIGHT_CANAL_HEIGHT,
-					  RIGHT_CANAL_WIDTH,
-					  RIGHT_CANAL_HEIGHT,
-					  "fill_color_rgba", CANAL_COLOR,
-					  "line-width", (double) 0,
-					  NULL);
+  goo_canvas_item_raise(tuxboat_item, canal_middle_item);
 
   /* This is the left lock */
   lock_left_item = goo_canvas_rect_new (boardRootItem,
@@ -331,15 +375,7 @@
 					"fill_color_rgba", LOCK_COLOR,
 					"line-width", (double) 0,
 					NULL);
-  g_signal_connect(lock_left_item, "button-press-event",
-		   (GtkSignalFunc) item_event,
-		   NULL);
-  g_signal_connect(lock_left_item, "enter_notify_event",
-		   (GtkSignalFunc) hightlight,
-		   GINT_TO_POINTER(TRUE));
-  g_signal_connect(lock_left_item, "leave_notify_event",
-		   (GtkSignalFunc) hightlight,
-		   GINT_TO_POINTER(FALSE));
+  set_lock_event(lock_left_item);
 
   /* This is the right lock */
   lock_right_item = goo_canvas_rect_new (boardRootItem,
@@ -350,55 +386,7 @@
 					 "fill_color_rgba", LOCK_COLOR,
 					 "line-width", (double) 0,
 					 NULL);
-  g_signal_connect(lock_right_item, "button-press-event",
-		   (GtkSignalFunc) item_event,
-		   NULL);
-  g_signal_connect(lock_right_item, "enter_notify_event",
-		   (GtkSignalFunc) hightlight,
-		   GINT_TO_POINTER(TRUE));
-  g_signal_connect(lock_right_item, "leave_notify_event",
-		   (GtkSignalFunc) hightlight,
-		   GINT_TO_POINTER(FALSE));
-
-  /* This is the water conduit under the canal */
-  goo_canvas_rect_new (boardRootItem,
-		       LEFT_CANAL_WIDTH/2,
-		       SUBCANAL_BASE_LINE - SUBCANAL_HEIGHT,
-		       LEFT_CANAL_WIDTH + MIDDLE_CANAL_WIDTH + RIGHT_CANAL_WIDTH/2 - LEFT_CANAL_WIDTH/2,
-		       SUBCANAL_HEIGHT,
-		       "fill_color_rgba", CANAL_COLOR,
-		       "line-width", (double) 0,
-		       NULL);
-
-  /* Left conduit */
-  goo_canvas_rect_new (boardRootItem,
-		       LEFT_CANAL_WIDTH/2,
-		       BASE_LINE,
-		       SUBCANAL_HEIGHT,
-		       SUBCANAL_BASE_LINE - BASE_LINE,
-		       "fill_color_rgba", CANAL_COLOR,
-		       "line-width", (double) 0,
-		       NULL);
-
-  /* Middle conduit */
-  goo_canvas_rect_new (boardRootItem,
-		       LEFT_CANAL_WIDTH + MIDDLE_CANAL_WIDTH/2 - SUBCANAL_HEIGHT/2,
-		       BASE_LINE,
-		       SUBCANAL_HEIGHT/2,
-		       SUBCANAL_BASE_LINE - BASE_LINE,
-		       "fill_color_rgba", CANAL_COLOR,
-		       "line-width", (double) 0,
-		       NULL);
-
-  /* Right conduit */
-  goo_canvas_rect_new (boardRootItem,
-		       LEFT_CANAL_WIDTH + MIDDLE_CANAL_WIDTH + RIGHT_CANAL_WIDTH/2,
-		       BASE_LINE,
-		       SUBCANAL_HEIGHT,
-		       SUBCANAL_BASE_LINE - BASE_LINE,
-		       "fill_color_rgba", CANAL_COLOR,
-		       "line-width", (double) 0,
-		       NULL);
+  set_lock_event(lock_right_item);
 
   /* And to finish, the 2 canal locks */
   canallock_left_item =
@@ -410,15 +398,7 @@
 			 "fill_color_rgba", CANALLOCK_COLOR,
 			 "line-width", (double) 0,
 			 NULL);
-  g_signal_connect(canallock_left_item, "button-press-event",
-		     (GtkSignalFunc) item_event,
-		     NULL);
-  g_signal_connect(canallock_left_item, "enter_notify_event",
-		   (GtkSignalFunc) hightlight,
-		   GINT_TO_POINTER(TRUE));
-  g_signal_connect(canallock_left_item, "leave_notify_event",
-		   (GtkSignalFunc) hightlight,
-		   GINT_TO_POINTER(FALSE));
+  set_lock_event(canallock_left_item);
 
   canallock_right_item =
     goo_canvas_rect_new (boardRootItem,
@@ -429,17 +409,9 @@
 			 "fill_color_rgba", CANALLOCK_COLOR,
 			 "line-width", (double) 0,
 			 NULL);
-  g_signal_connect(canallock_right_item, "button-press-event",
-                   (GtkSignalFunc) item_event,
-                   NULL);
-  g_signal_connect(canallock_right_item, "enter_notify_event",
-		   (GtkSignalFunc) hightlight,
-		   GINT_TO_POINTER(TRUE));
-  g_signal_connect(canallock_right_item, "leave_notify_event",
-		   (GtkSignalFunc) hightlight,
-		   GINT_TO_POINTER(FALSE));
-
+  set_lock_event(canallock_right_item);
 
+  g_object_unref (svg_handle);
 
   return NULL;
 }
@@ -449,7 +421,9 @@
 move_boat()
 {
 
-  /* If there is already an animation do nothing else set animation to avoid deadlock */
+  /* If there is already an animation do nothing
+   * else set animation to avoid deadlock
+   */
   if(animation)
     return;
   animation = TRUE;
@@ -459,6 +433,8 @@
       boat_position = BOAT_POS_MIDDLE;
       timer_item_limit_x = LEFT_CANAL_WIDTH + (MIDDLE_CANAL_WIDTH - tuxboat_width)/2;
       timer_step_x1 = 2;
+      g_object_set (tuxboat_item,
+		    "svg-id", "#BOAT", NULL);
     }
   else if(boat_position == BOAT_POS_MIDDLE && !lock_left_up)
     {
@@ -470,6 +446,8 @@
           gamewon = TRUE;
           from = 0;
         }
+      g_object_set (tuxboat_item,
+		    "svg-id", "#BOAT", NULL);
     }
   else if(boat_position == BOAT_POS_MIDDLE && !lock_right_up)
     {
@@ -481,12 +459,16 @@
           gamewon = TRUE;
           from = 1;
         }
+      g_object_set (tuxboat_item,
+		    "svg-id", "#BOAT", NULL);
     }
   else if(boat_position == BOAT_POS_RIGHT && !lock_right_up)
     {
       boat_position = BOAT_POS_MIDDLE;
       timer_item_limit_x = LEFT_CANAL_WIDTH + (MIDDLE_CANAL_WIDTH - tuxboat_width)/2;
       timer_step_x1 = -2;
+      g_object_set (tuxboat_item,
+		    "svg-id", "#BOAT", NULL);
     }
   else
     {
@@ -540,6 +522,8 @@
   timer_step_y1 = (status ? 2 : -2);
   timer_step_x1 = 0;
 
+  gc_item_focus_remove(tuxboat_item, NULL);
+
   timer_id = gtk_timeout_add (ANIMATE_SPEED, (GtkFunction) animate_step, NULL);
 }
 
@@ -599,6 +583,8 @@
   timer_step_y1 = (status ? 2 : -2);
   timer_step_x1 = 0;
 
+  gc_item_focus_remove(tuxboat_item, NULL);
+
   timer_id = gtk_timeout_add (animate_speed, (GtkFunction) animate_step,
 			      NULL);
 
@@ -616,11 +602,8 @@
   GooCanvasBounds bounds;
   goo_canvas_item_get_bounds(timer_item, &bounds);
 
-  if(GOO_IS_CANVAS_IMAGE(timer_item))
-    g_object_set(timer_item,
-		 "x", bounds.x1 + timer_step_x1,
-		 "y", bounds.y1 + timer_step_y1,
-		 NULL);
+  if(GOO_IS_CANVAS_SVG(timer_item))
+    goo_canvas_item_translate(timer_item, timer_step_x1, timer_step_y1);
   else if(GOO_IS_CANVAS_RECT(timer_item))
     g_object_set(timer_item,
 		 "x", bounds.x1 + timer_step_x1,
@@ -631,13 +614,8 @@
   /* Special case for raising/lowering the boat */
   if(boat_position==BOAT_POS_MIDDLE && timer_item==canal_middle_item)
     {
-      GooCanvasBounds bounds;
-
-      goo_canvas_item_get_bounds(tuxboat_item, &bounds);
-
-      g_object_set(tuxboat_item,
-			    "y", bounds.y1 + timer_step_y1,
-			    NULL);
+      goo_canvas_item_translate(tuxboat_item, 0, timer_step_y1);
+      gc_item_focus_remove(tuxboat_item, NULL);
     }
 
   if((bounds.y1 >= timer_item_limit_y && timer_step_y1 > 0) ||
@@ -647,8 +625,9 @@
       timer_id = 0;
       animation = FALSE;
       update_water();
-      if (timer_item == tuxboat_item)
-        gc_item_focus_init(tuxboat_item, NULL);
+      gc_item_focus_init(tuxboat_item, NULL);
+      g_object_set (tuxboat_item,
+		    "svg-id", "#BOAT_NO_SAIL", NULL);
     }
   else if((bounds.x1 >= timer_item_limit_x && timer_step_x1 > 0) ||
      (bounds.x1 <= timer_item_limit_x && timer_step_x1 < 0))
@@ -662,8 +641,9 @@
           gc_bonus_display(TRUE, GC_BONUS_FLOWER);
           gamewon = FALSE;
         }
-      if (timer_item == tuxboat_item)
-        gc_item_focus_init(tuxboat_item, NULL);
+      gc_item_focus_init(tuxboat_item, NULL);
+      g_object_set (tuxboat_item,
+		    "svg-id", "#BOAT_NO_SAIL", NULL);
     }
 
   return TRUE;
@@ -754,6 +734,48 @@
     {
       gc_sound_play_ogg ("sounds/crash.ogg", NULL);
     }
+
+  update_lights();
   return FALSE;
 }
 
+static void update_lights()
+{
+  if(lock_water_low && !lock_left_up)
+    {
+      g_object_set (left_red_on_item,
+		    "visibility", GOO_CANVAS_ITEM_INVISIBLE,
+		    NULL);
+      g_object_set (left_green_on_item,
+		    "visibility", GOO_CANVAS_ITEM_VISIBLE,
+		    NULL);
+    }
+  else
+    {
+      g_object_set (left_red_on_item,
+		    "visibility", GOO_CANVAS_ITEM_VISIBLE,
+		    NULL);
+      g_object_set (left_green_on_item,
+		    "visibility", GOO_CANVAS_ITEM_INVISIBLE,
+		    NULL);
+    }
+
+  if(!lock_water_low && !lock_right_up)
+    {
+      g_object_set (right_red_on_item,
+		    "visibility", GOO_CANVAS_ITEM_INVISIBLE,
+		    NULL);
+      g_object_set (right_green_on_item,
+		    "visibility", GOO_CANVAS_ITEM_VISIBLE,
+		    NULL);
+    }
+  else
+    {
+      g_object_set (right_red_on_item,
+		    "visibility", GOO_CANVAS_ITEM_VISIBLE,
+		    NULL);
+      g_object_set (right_green_on_item,
+		    "visibility", GOO_CANVAS_ITEM_INVISIBLE,
+		    NULL);
+    }
+}

Modified: branches/gcomprixogoo/src/canal_lock-activity/resources/canal_lock/canal_lock.svgz
==============================================================================
Binary files. No diff available.

Modified: branches/gcomprixogoo/src/goocanvas/src/goocanvassvg.c
==============================================================================
--- branches/gcomprixogoo/src/goocanvas/src/goocanvassvg.c	(original)
+++ branches/gcomprixogoo/src/goocanvas/src/goocanvassvg.c	Sun Nov 30 23:25:24 2008
@@ -49,10 +49,13 @@
 static void _init_surface(GooCanvasSvg *canvas_svg,
 			  RsvgHandle *svg_handle)
 {
+  g_assert(svg_handle);
   RsvgDimensionData dimension_data;
   rsvg_handle_get_dimensions (svg_handle, &dimension_data);
   canvas_svg->width = dimension_data.width;
   canvas_svg->height = dimension_data.height;
+  canvas_svg->svg_handle = svg_handle;
+  g_object_ref(svg_handle);
 
   if (canvas_svg->pattern)
       cairo_pattern_destroy(canvas_svg->pattern);
@@ -200,6 +203,9 @@
     cairo_destroy(canvas_svg->cr);
   canvas_svg->cr = NULL;
 
+  if (canvas_svg->svg_handle)
+    g_object_unref (canvas_svg->svg_handle);
+  canvas_svg->svg_handle = NULL;
 
   G_OBJECT_CLASS (goo_canvas_svg_parent_class)->finalize (object);
 }
@@ -218,13 +224,19 @@
     {
     case PROP_SVGHANDLE:
       svg_handle = g_value_get_object (value);
+      if(canvas_svg->svg_handle)
+      g_object_unref (canvas_svg->svg_handle);
       _init_surface(canvas_svg, svg_handle);
       break;
     case PROP_SVG_ID:
+      if(canvas_svg->id)
+	g_free(canvas_svg->id);
       if (!g_value_get_string (value))
-        canvas_svg->id = NULL;
+	canvas_svg->id = NULL;
       else
         canvas_svg->id = g_value_dup_string(value);
+      if (canvas_svg->svg_handle)
+	_init_surface(canvas_svg, canvas_svg->svg_handle);
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);

Modified: branches/gcomprixogoo/src/goocanvas/src/goocanvassvg.h
==============================================================================
--- branches/gcomprixogoo/src/goocanvas/src/goocanvassvg.h	(original)
+++ branches/gcomprixogoo/src/goocanvas/src/goocanvassvg.h	Sun Nov 30 23:25:24 2008
@@ -30,6 +30,7 @@
 {
   GooCanvasItemSimple parent_object;
 
+  RsvgHandle *svg_handle;
   gdouble width, height;
   gchar *id;
   cairo_t *cr;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]