elm_image: add new method elm_image_icon_set to replace elm_icon_standard_set

we will remove elm_icon in the future.(only remain it in legacy)
for this, I added elm_image_icon_set API to the elm_image.
it is same as elm_icon_standard_set.
This commit is contained in:
Ji-Youn Park 2016-04-27 22:05:23 +08:30
parent fa344ea0be
commit 3f82fd1658
3 changed files with 220 additions and 0 deletions

View File

@ -17,6 +17,9 @@
#define MY_CLASS_NAME "Elm_Image"
#define MY_CLASS_NAME_LEGACY "elm_image"
#define NON_EXISTING (void *)-1
static const char *icon_theme = NULL;
static const char SIG_DND[] = "drop";
static const char SIG_CLICKED[] = "clicked";
static const char SIG_DOWNLOAD_START[] = "download,start";
@ -731,6 +734,10 @@ EOLIAN static Eina_Bool
_elm_image_elm_widget_theme_apply(Eo *obj, Elm_Image_Data *sd EINA_UNUSED)
{
Eina_Bool int_ret = EINA_FALSE;
if (sd->stdicon)
_elm_theme_object_icon_set(obj, sd->stdicon, elm_widget_style_get(obj));
int_ret = elm_obj_widget_theme_apply(eo_super(obj, MY_CLASS));
if (!int_ret) return EINA_FALSE;
@ -1468,6 +1475,178 @@ _elm_image_elm_interface_atspi_widget_action_elm_actions_get(Eo *obj EINA_UNUSED
return &atspi_actions[0];
}
static Eina_Bool
_icon_standard_set(Evas_Object *obj, const char *name)
{
ELM_IMAGE_DATA_GET(obj, sd);
if (_elm_theme_object_icon_set(obj, name, "default"))
{
/* TODO: elm_unneed_efreet() */
sd->freedesktop.use = EINA_FALSE;
return EINA_TRUE;
}
return EINA_FALSE;
}
static Eina_Bool
_icon_freedesktop_set(Evas_Object *obj, const char *name, int size)
{
const char *path;
ELM_IMAGE_DATA_GET(obj, sd);
elm_need_efreet();
if (icon_theme == NON_EXISTING) return EINA_FALSE;
if (!icon_theme)
{
Efreet_Icon_Theme *theme;
/* TODO: Listen for EFREET_EVENT_ICON_CACHE_UPDATE */
theme = efreet_icon_theme_find(elm_config_icon_theme_get());
if (!theme)
{
const char **itr;
static const char *themes[] = {
"gnome", "Human", "oxygen", "hicolor", NULL
};
for (itr = themes; *itr; itr++)
{
theme = efreet_icon_theme_find(*itr);
if (theme) break;
}
}
if (!theme)
{
icon_theme = NON_EXISTING;
return EINA_FALSE;
}
else
icon_theme = eina_stringshare_add(theme->name.internal);
}
path = efreet_icon_path_find(icon_theme, name, size);
sd->freedesktop.use = !!path;
if (sd->freedesktop.use)
{
sd->freedesktop.requested_size = size;
efl_file_set(obj, path, NULL);
return EINA_TRUE;
}
return EINA_FALSE;
}
static inline int
_icon_size_min_get(Evas_Object *image)
{
int w, h;
evas_object_geometry_get(image, NULL, NULL, &w, &h);
return MAX(16, MIN(w, h));
}
/* FIXME: move this code to ecore */
#ifdef _WIN32
static Eina_Bool
_path_is_absolute(const char *path)
{
//TODO: Check if this works with all absolute paths in windows
return (isalpha(*path)) && (*(path + 1) == ':') &&
((*(path + 2) == '\\') || (*(path + 2) == '/'));
}
#else
static Eina_Bool
_path_is_absolute(const char *path)
{
return *path == '/';
}
#endif
static Eina_Bool
_internal_elm_image_icon_set(Evas_Object *obj, const char *name, Eina_Bool *fdo)
{
char *tmp;
Eina_Bool ret = EINA_FALSE;
ELM_IMAGE_DATA_GET(obj, sd);
/* try locating the icon using the specified theme */
if (!strcmp(ELM_CONFIG_ICON_THEME_ELEMENTARY, elm_config_icon_theme_get()))
{
ret = _icon_standard_set(obj, name);
if (ret && fdo) *fdo = EINA_FALSE;
}
else
{
ret = _icon_freedesktop_set(obj, name, _icon_size_min_get(obj));
if (ret && fdo) *fdo = EINA_TRUE;
}
if (ret)
{
eina_stringshare_replace(&sd->stdicon, name);
_elm_image_sizing_eval(obj);
return EINA_TRUE;
}
if (_path_is_absolute(name))
{
if (fdo)
*fdo = EINA_FALSE;
return efl_file_set(obj, name, NULL);
}
/* if that fails, see if icon name is in the format size/name. if so,
try locating a fallback without the size specification */
if (!(tmp = strchr(name, '/'))) return EINA_FALSE;
++tmp;
if (*tmp) return _internal_elm_image_icon_set(obj, tmp, fdo);
/* give up */
return EINA_FALSE;
}
static void
_elm_image_icon_resize_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
{
ELM_IMAGE_DATA_GET(data, sd);
const char *refup = eina_stringshare_ref(sd->stdicon);
Eina_Bool fdo = EINA_FALSE;
if (!_internal_elm_image_icon_set(obj, sd->stdicon, &fdo) || (!fdo))
evas_object_event_callback_del_full
(obj, EVAS_CALLBACK_RESIZE, _elm_image_icon_resize_cb, data);
eina_stringshare_del(refup);
}
EOLIAN static Eina_Bool
_elm_image_icon_set(Eo *obj, Elm_Image_Data *_pd EINA_UNUSED, const char *name)
{
Eina_Bool fdo = EINA_FALSE;
if (!name) return EINA_FALSE;
evas_object_event_callback_del_full
(obj, EVAS_CALLBACK_RESIZE, _elm_image_icon_resize_cb, obj);
Eina_Bool int_ret = _internal_elm_image_icon_set(obj, name, &fdo);
if (fdo)
evas_object_event_callback_add
(obj, EVAS_CALLBACK_RESIZE, _elm_image_icon_resize_cb, obj);
return int_ret;
}
EOLIAN static const char*
_elm_image_icon_get(Eo *obj EINA_UNUSED, Elm_Image_Data *sd)
{
return sd->stdicon;
}
EAPI void
elm_image_smooth_set(Evas_Object *obj, Eina_Bool smooth)
{

View File

@ -62,6 +62,39 @@ class Elm.Image (Elm.Widget, Evas.Clickable_Interface, Evas.Draggable_Interface,
}
values {
fixed: bool; [[$true if the image should retain the aspect, $false otherwise.]]
}
}
@property icon {
set {
[[Set the image by icon standards names.
For example, freedesktop.org defines standard icon names such
as "home", "network", etc. There can be different icon sets to
match those icon keys. The "name" given as parameter is one of
these "keys", and will be used to look in the freedesktop.org
paths and elementary theme.
If name is not found in any of the expected locations and it is
the absolute path of an image file, this image will be used.
Note: The image set by this function can be changed by
@Efl.File.file.set.
Note: This function does not accept relative icon path.
See also @.icon.get.
]]
return: bool; [[true on success, false on error]]
}
get {
[[Get the icon name of image set by icon standard names.
If the image was set using elm_image_file_set() instead of
@.icon.set, then this function will return null.
]]
}
values {
name: const(char)*; [[The icon name]]
}
}
}

View File

@ -74,6 +74,14 @@ struct _Elm_Image_Data
Elm_Image_Preload_Status preload_status;
const char *stdicon;
struct {
int requested_size;
Eina_Bool use : 1;
} freedesktop;
Eina_Bool aspect_fixed : 1;
Eina_Bool fill_inside : 1;
Eina_Bool resize_down : 1;