enlightenment/src/embed.c

446 lines
7.4 KiB
C

#include "debug.h"
#include "embed.h"
#include "util.h"
typedef struct _Embed Embed_Private;
struct _Embed
{
Ebits_Object o;
Evas * evas;
Evas_Object * image_obj;
Evas_Object * clip_obj;
int clip_x, clip_y;
E_Text *text_obj;
};
static void
e_embed_text_func_show(void *_data)
{
Embed_Private *em;
D_ENTER;
em = _data;
if (em->clip_obj)
evas_object_show(em->clip_obj);
e_text_show(em->text_obj);
D_RETURN;
}
static void
e_embed_text_func_hide(void *_data)
{
Embed_Private *em;
D_ENTER;
em = _data;
if (em->clip_obj)
evas_object_hide(em->clip_obj);
e_text_hide(em->text_obj);
D_RETURN;
}
static void
e_embed_text_func_move(void *_data, double x, double y)
{
Embed_Private *em;
D_ENTER;
em = _data;
if (em->clip_obj)
evas_object_move(em->clip_obj, x, y);
e_text_move(em->text_obj, x, y);
D_RETURN;
}
static void
e_embed_text_func_resize(void *_data, double w, double h)
{
Embed_Private *em;
D_ENTER;
em = _data;
if (em->clip_obj)
evas_object_resize(em->clip_obj, w, h);
e_text_resize(em->text_obj, w, h);
D_RETURN;
}
static void
e_embed_text_func_raise(void *_data)
{
Embed_Private *em;
D_ENTER;
em = _data;
if (em->clip_obj)
evas_object_raise(em->clip_obj);
e_text_raise(em->text_obj);
D_RETURN;
}
static void
e_embed_text_func_lower(void *_data)
{
Embed_Private *em;
D_ENTER;
em = _data;
if (em->clip_obj)
evas_object_lower(em->clip_obj);
e_text_lower(em->text_obj);
D_RETURN;
}
static void
e_embed_text_func_set_layer(void *_data, int l)
{
Embed_Private *em;
D_ENTER;
em = _data;
if (em->clip_obj)
evas_object_layer_set(em->clip_obj, l);
e_text_set_layer(em->text_obj, l);
D_RETURN;
}
static void
e_embed_text_func_set_clip(void *_data, Evas_Object * clip)
{
Embed_Private *em;
D_ENTER;
em = _data;
if (em->clip_obj)
{
if (clip)
e_text_set_clip(em->clip_obj, clip);
else
e_text_unset_clip(em->clip_obj);
}
else
{
if (clip)
e_text_set_clip(em->text_obj, clip);
else
e_text_unset_clip(em->text_obj);
}
D_RETURN;
}
static void
e_embed_text_func_set_color_class(void *_data, char *cc, int r, int g, int b,
int a)
{
D_ENTER;
D_RETURN;
UN(_data);
UN(cc);
UN(r);
UN(g);
UN(b);
UN(a);
}
static void
e_embed_text_func_get_min_size(void *_data, double *w, double *h)
{
Embed_Private *em;
D_ENTER;
em = _data;
e_text_get_min_size(em->text_obj, w, h);
if (em->clip_x)
*w = 0;
if (em->clip_y)
*h = 0;
D_RETURN;
}
static void
e_embed_text_func_get_max_size(void *_data, double *w, double *h)
{
Embed_Private *em;
D_ENTER;
em = _data;
e_text_get_max_size(em->text_obj, w, h);
if (em->clip_x)
*w = 999999999;
if (em->clip_y)
*h = 999999999;
D_RETURN;
}
/***/
Embed
e_embed_text(Ebits_Object o, char *bit_name, Evas * evas, E_Text * text_obj,
int clip_x, int clip_y)
{
Embed_Private *em;
D_ENTER;
em = NEW(Embed_Private, 1);
ZERO(em, Embed_Private, 1);
em->o = o;
em->evas = evas;
em->text_obj = text_obj;
em->clip_x = clip_x;
em->clip_y = clip_y;
if ((clip_x) || (clip_y))
{
em->clip_obj = evas_object_rectangle_add(em->evas);
evas_object_color_set(em->clip_obj, 255, 255, 255, 255);
e_text_set_clip(em->text_obj, em->clip_obj);
evas_object_show(em->clip_obj);
}
ebits_set_named_bit_replace(o, bit_name,
e_embed_text_func_show,
e_embed_text_func_hide,
e_embed_text_func_move,
e_embed_text_func_resize,
e_embed_text_func_raise,
e_embed_text_func_lower,
e_embed_text_func_set_layer,
e_embed_text_func_set_clip,
e_embed_text_func_set_color_class,
e_embed_text_func_get_min_size,
e_embed_text_func_get_max_size, em);
D_RETURN_(em);
}
/*****************************************************************************/
static void
e_embed_image_func_show(void *_data)
{
Embed_Private *em;
D_ENTER;
em = _data;
evas_object_show(em->image_obj);
D_RETURN;
}
static void
e_embed_image_func_hide(void *_data)
{
Embed_Private *em;
D_ENTER;
em = _data;
evas_object_hide(em->image_obj);
D_RETURN;
}
static void
e_embed_image_func_move(void *_data, double x, double y)
{
Embed_Private *em;
D_ENTER;
em = _data;
evas_object_move(em->image_obj, x, y);
D_RETURN;
}
static void
e_embed_image_func_resize(void *_data, double w, double h)
{
Embed_Private *em;
D_ENTER;
em = _data;
evas_object_resize(em->image_obj, w, h);
evas_object_image_fill_set(em->image_obj, 0, 0, w, h);
D_RETURN;
}
static void
e_embed_image_func_raise(void *_data)
{
Embed_Private *em;
D_ENTER;
em = _data;
evas_object_raise(em->image_obj);
D_RETURN;
}
static void
e_embed_image_func_lower(void *_data)
{
Embed_Private *em;
D_ENTER;
em = _data;
evas_object_lower(em->image_obj);
D_RETURN;
}
static void
e_embed_image_func_set_layer(void *_data, int l)
{
Embed_Private *em;
D_ENTER;
em = _data;
evas_object_layer_set(em->image_obj, l);
D_RETURN;
}
static void
e_embed_image_func_set_clip(void *_data, Evas_Object * clip)
{
Embed_Private *em;
D_ENTER;
em = _data;
if (clip)
evas_object_clip_set(em->image_obj, clip);
else
evas_object_clip_unset(em->image_obj);
D_RETURN;
}
static void
e_embed_image_func_set_color_class(void *_data, char *cc, int r, int g, int b,
int a)
{
Embed_Private *em;
D_ENTER;
em = _data;
if ((cc) && (!strcmp(cc, "icon")))
evas_object_color_set(em->image_obj, r, g, b, a);
D_RETURN;
}
static void
e_embed_image_func_get_min_size(void *_data, double *w, double *h)
{
Embed_Private *em;
int iw, ih;
D_ENTER;
em = _data;
iw = 0;
ih = 0;
evas_object_image_size_get(em->image_obj, &iw, &ih);
if (w)
*w = iw;
if (h)
*h = ih;
D_RETURN;
}
static void
e_embed_image_func_get_max_size(void *_data, double *w, double *h)
{
Embed_Private *em;
int iw, ih;
D_ENTER;
em = _data;
evas_object_image_size_get(em->image_obj, &iw, &ih);
if (w)
*w = iw;
if (h)
*h = ih;
D_RETURN;
}
/***/
Embed
e_embed_image_object(Ebits_Object o, char *bit_name, Evas * evas,
Evas_Object * image_obj)
{
Embed_Private *em;
D_ENTER;
em = NEW(Embed_Private, 1);
ZERO(em, Embed_Private, 1);
em->o = o;
em->evas = evas;
em->image_obj = image_obj;
ebits_set_named_bit_replace(o, bit_name,
e_embed_image_func_show,
e_embed_image_func_hide,
e_embed_image_func_move,
e_embed_image_func_resize,
e_embed_image_func_raise,
e_embed_image_func_lower,
e_embed_image_func_set_layer,
e_embed_image_func_set_clip,
e_embed_image_func_set_color_class,
e_embed_image_func_get_min_size,
e_embed_image_func_get_max_size, em);
D_RETURN_(em);
}
/*****/
void
e_embed_free(Embed emb)
{
Embed_Private *em;
D_ENTER;
em = emb;
if (em->clip_obj)
evas_object_del(em->clip_obj);
FREE(em);
D_RETURN;
}