/* Edje: delete a certain evas object from the model's cache */
static void
_edje_cache_remove(Etk_Tree_Model * model, const char *filename,
		   const char *key)
{
	Etk_Tree_Model_Edje *edje_model;

	if (!(edje_model = (Etk_Tree_Model_Edje *) model))
		return;

	etk_cache_remove(edje_model->cache,
			 etk_cache_find(edje_model->cache, filename, NULL));
}
/* Edje: render() */
static Etk_Bool
_edje_render(Etk_Tree_Model * model, Etk_Tree_Row * row, Etk_Geometry geometry,
	     void *cell_data,
	     Evas_Object * cell_objects[ETK_TREE_MAX_OBJECTS_PER_MODEL],
	     Evas * evas)
{
	//g_debug("render called");

	Etk_Tree_Model_Edje *edje_model;
	Etk_Tree_Model_Edje_Data *edje_data;

	if (!(edje_model = (Etk_Tree_Model_Edje *) model) ||
	    !(edje_data = cell_data) || !evas || !edje_data->parameters)
		return ETK_FALSE;

	if (!
	    (cell_objects[0] =
	     etk_cache_find(edje_model->cache, edje_data->parameters, NULL))) {
		//g_debug("Rendering");

		cell_objects[0] = edje_object_add(evas);
		if (!cell_objects[0])
			return ETK_FALSE;
	}
	if (!edje_file_group_exists(edje_model->file, edje_model->part)) {
		g_error("%s does not exist in %s", edje_model->part,
			edje_model->file);
	}
	edje_object_file_set(cell_objects[0], edje_model->file,
			     edje_model->part);
	edje_extern_object_min_size_set(cell_objects[0], geometry.w,
					geometry.h);
	g_hash_table_foreach(edje_data->parameters, _edje_set_text_cb,
			     cell_objects[0]);
	evas_object_move(cell_objects[0], geometry.x, geometry.y);

	evas_object_resize(cell_objects[0], geometry.w, geometry.h);
	evas_object_show(cell_objects[0]);

	return ETK_TRUE;
}
Exemple #3
0
/* Image: render() */
static Etk_Bool _image_render(Etk_Tree_Model *model, Etk_Tree_Row *row, Etk_Geometry geometry, void *cell_data, Evas_Object *cell_objects[ETK_TREE_MAX_OBJECTS_PER_MODEL], Evas *evas)
{
   Etk_Tree_Model_Image *image_model;
   Etk_Tree_Model_Image_Data *image_data;
   int image_width, image_height;
   Etk_Geometry image_geometry;
   Etk_Bool object_created = ETK_FALSE;
   float aspect;
   char *ext;

   if (!(image_model = (Etk_Tree_Model_Image *)model) || !(image_data = cell_data) || !evas)
      return ETK_FALSE;

   if (!image_data->filename || image_data->type == ETK_TREE_MODEL_NOT_FOUND)
      return ETK_FALSE;

   /* If we don't know yet what the image's type is, we "guess" it */
   if (image_data->type == ETK_TREE_MODEL_UNKNOWN_YET)
   {
      if (!image_data->key)
         image_data->type = ETK_TREE_MODEL_NORMAL;
      else if ((ext = strrchr(image_data->filename, '.')) && strcasecmp(ext + 1, "eet") == 0)
         image_data->type = ETK_TREE_MODEL_NORMAL;
      else
         image_data->type = ETK_TREE_MODEL_EDJE;
   }

   /* If the object is not already in the cache, we load it */
   if (!(cell_objects[0] = etk_cache_find(image_model->cache, image_data->filename, image_data->key)))
   {
      if (image_data->type == ETK_TREE_MODEL_NORMAL)
      {
         cell_objects[0] = evas_object_image_add(evas);
         evas_object_pass_events_set(cell_objects[0], 1);

         evas_object_image_file_set(cell_objects[0], image_data->filename, image_data->key);
         if (!evas_object_image_load_error_get(cell_objects[0]))
            object_created = ETK_TRUE;
         else
            image_data->type = ETK_TREE_MODEL_NOT_FOUND;
      }
      /* If it's not a normal image file, then it's an Edje file... */
      else
      {
         cell_objects[0] = edje_object_add(evas);
         evas_object_pass_events_set(cell_objects[0], 1);

         if (edje_object_file_set(cell_objects[0], image_data->filename, image_data->key))
            object_created = ETK_TRUE;
         else
            image_data->type = ETK_TREE_MODEL_NOT_FOUND;
      }
   }

   /* If loading the image has failed, we destroy the object and return */
   if (image_data->type == ETK_TREE_MODEL_NOT_FOUND)
   {
      if (cell_objects[0])
      {
         evas_object_del(cell_objects[0]);
         cell_objects[0] = NULL;
      }
      return ETK_FALSE;
   }

   /* The image is correctly loaded, we can now render it */
   if (image_data->type == ETK_TREE_MODEL_NORMAL)
      evas_object_image_size_get(cell_objects[0], &image_width, &image_height);
   else
      edje_object_size_min_get(cell_objects[0], &image_width, &image_height);

   if (image_width == 0 || image_height == 0)
   {
      image_width = geometry.h;
      image_height = geometry.h;
   }
   aspect = ((float)image_width / image_height);

   /* No limitation of width */
   if (image_model->width <= 0)
   {
      if (image_height <= geometry.h)
      {
         image_geometry.w = image_width;
         image_geometry.h = image_height;
      }
      else
      {
         image_geometry.w = geometry.h * aspect;
         image_geometry.h = geometry.h;
      }

      image_geometry.x = geometry.x;
      image_geometry.y = geometry.y + ((geometry.h - image_geometry.h) / 2);
   }
   /* The max width is limited */
   else
   {
      if ((image_width > image_model->width || image_height > geometry.h))
      {
         /* The image doesn't fit in, we need to resize it */

         if (geometry.h * aspect > image_model->width)
         {
            image_geometry.w = image_model->width;
            image_geometry.h = image_model->width / aspect;
         }
         else
         {
            image_geometry.w = geometry.h * aspect;
            image_geometry.h = geometry.h;
         }
      }
      else
      {
         image_geometry.w = image_width;
         image_geometry.h = image_height;
      }

      image_geometry.x = geometry.x + ((image_model->width - image_geometry.w) * image_model->halign);
      image_geometry.y = geometry.y + ((geometry.h - image_geometry.h) / 2);
   }

   if (image_data->type == ETK_TREE_MODEL_NORMAL)
      evas_object_image_fill_set(cell_objects[0], 0, 0, image_geometry.w, image_geometry.h);
   evas_object_move(cell_objects[0], image_geometry.x, image_geometry.y);
   evas_object_resize(cell_objects[0], image_geometry.w, image_geometry.h);
   evas_object_show(cell_objects[0]);

   return object_created;
}