/* 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; }
/* 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; }