ephoto/src/bin/ephoto_slide.c

334 lines
8.0 KiB
C

#include "ephoto.h"
typedef struct _Smart_Data Smart_Data;
struct _Smart_Data
{
Evas_Object *obj;
Evas_Object *images;
int x;
int y;
int w;
int h;
int iw;
int ih;
Evas_Object *center_image_one;
Evas_Object *center_image_two;
Eina_List *current_node;
Eina_List *list;
Ecore_Timer *timer;
};
static Evas_Smart *_smart = NULL;
static void _slide_smart_reconfigure(Smart_Data *sd);
static void _slide_smart_init(void);
static void _slide_smart_add(Evas_Object *obj);
static void _slide_smart_del(Evas_Object *obj);
static void _slide_smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y);
static void _slide_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h);
static void _slide_smart_show(Evas_Object *obj);
static void _slide_smart_hide(Evas_Object *obj);
static void _slide_smart_color_set(Evas_Object *obj, int r, int g, int b, int a);
static void _slide_smart_clip_set(Evas_Object *obj, Evas_Object *clip);
static void _slide_smart_clip_unset(Evas_Object *obj);
static int change_image(void *data);
static void go_back(void *data, Evas_Object *obj, const char *emission, const char *source);
static void done(void *data, Evas_Object *obj, const char *emission, const char *source);
static int change_image(void *data)
{
char *center;
Smart_Data *sd;
sd = data;
done(sd, sd->obj, NULL, NULL);
if (sd->current_node->next)
sd->current_node = sd->current_node->next;
else
sd->current_node = sd->list;
center = sd->current_node->data;
edje_object_part_unswallow(sd->images, sd->center_image_two);
ephoto_image_fill_inside_set(sd->center_image_two, 1);
ephoto_image_file_set(sd->center_image_two, center, sd->iw, sd->ih);
edje_object_part_swallow(sd->images, "ephoto.swallow.content.two", sd->center_image_two);
edje_object_signal_emit(sd->images, "ephoto.change.image", "ephoto");
return 1;
}
static void go_back(void *data, Evas_Object *obj, const char *emission, const char *source)
{
Smart_Data *sd;
sd = data;
ephoto_slide_stop(obj);
hide_slideshow();
show_flow_view(sd->current_node, sd->list);
}
static void done(void *data, Evas_Object *obj, const char *emission, const char *source)
{
char *center;
Smart_Data *sd;
sd = data;
center = sd->current_node->data;
edje_object_part_unswallow(sd->images, sd->center_image_one);
ephoto_image_fill_inside_set(sd->center_image_one, 1);
ephoto_image_file_set(sd->center_image_one, center, sd->iw, sd->ih);
edje_object_part_swallow(sd->images, "ephoto.swallow.content.one", sd->center_image_one);
}
Evas_Object *ephoto_slide_add(Evas *e)
{
_slide_smart_init();
return evas_object_smart_add(e, _smart);
}
void ephoto_slide_current_node_set(Evas_Object *obj, Eina_List *node)
{
char *center;
Smart_Data *sd;
sd = evas_object_smart_data_get(obj);
sd->current_node = node;
center = sd->current_node->data;
edje_object_part_unswallow(sd->images, sd->center_image_one);
ephoto_image_fill_inside_set(sd->center_image_one, 1);
ephoto_image_file_set(sd->center_image_one, center, sd->iw, sd->ih);
edje_object_part_swallow(sd->images, "ephoto.swallow.content.one", sd->center_image_one);
return;
}
void ephoto_slide_item_list_set(Evas_Object *obj, Eina_List *list)
{
Smart_Data *sd;
sd = evas_object_smart_data_get(obj);
sd->list = list;
return;
}
void ephoto_slide_start(Evas_Object *obj)
{
Smart_Data *sd;
sd = evas_object_smart_data_get(obj);
sd->timer = ecore_timer_add(3, change_image, sd);
}
void ephoto_slide_stop(Evas_Object *obj)
{
Smart_Data *sd;
sd = evas_object_smart_data_get(obj);
ecore_timer_del(sd->timer);
}
static void _slide_smart_reconfigure(Smart_Data *sd)
{
int w, h, nw, nh;
evas_object_geometry_get(sd->obj, 0, 0, &w, &h);
nw = w/1.2;
nh = h/1.2;
sd->iw = nw;
sd->ih = nh;
edje_object_part_unswallow(sd->images, sd->center_image_one);
edje_object_part_unswallow(sd->images, sd->center_image_two);
edje_object_part_unswallow(sd->obj, sd->images);
evas_object_image_load_size_set(sd->center_image_one, nw, nh);
evas_object_image_load_size_set(sd->center_image_two, nw, nh);
evas_object_resize(sd->center_image_one, nw, nh);
evas_object_resize(sd->center_image_two, nw, nh);
evas_object_resize(sd->images, nw, nh);
evas_object_size_hint_min_set(sd->images, nw, nh);
evas_object_size_hint_max_set(sd->images, nw, nh);
edje_object_part_swallow(sd->obj, "ephoto.swallow.content", sd->images);
edje_object_part_swallow(sd->images, "ephoto.swallow.content.one", sd->center_image_one);
edje_object_part_swallow(sd->images, "ephoto.swallow.content.two", sd->center_image_two);
return;
}
static void _slide_smart_init(void)
{
if (_smart)
return;
{
static const Evas_Smart_Class sc =
{
"ephoto_slide",
EVAS_SMART_CLASS_VERSION,
_slide_smart_add,
_slide_smart_del,
_slide_smart_move,
_slide_smart_resize,
_slide_smart_show,
_slide_smart_hide,
_slide_smart_color_set,
_slide_smart_clip_set,
_slide_smart_clip_unset,
NULL,
NULL
};
_smart = evas_smart_class_new(&sc);
}
}
static void _slide_smart_add(Evas_Object *obj)
{
Smart_Data *sd;
sd = calloc(1, sizeof(Smart_Data));
if (!sd)
return;
sd->w = 0;
sd->h = 0;
sd->x = 0;
sd->y = 0;
sd->obj = edje_object_add(em->e);
edje_object_file_set(sd->obj, PACKAGE_DATA_DIR "/themes/default/ephoto.edj", "/ephoto/slide/view");
evas_object_smart_data_set(obj, sd);
sd->images = edje_object_add(em->e);
edje_object_file_set(sd->images, PACKAGE_DATA_DIR "/themes/default/ephoto.edj", "/ephoto/slide/images");
edje_object_part_swallow(sd->obj, "ephoto.swallow.content", sd->images);
sd->center_image_one = ephoto_image_add();
edje_object_part_swallow(sd->images, "ephoto.swallow.content.one", sd->center_image_one);
sd->center_image_two = ephoto_image_add();
edje_object_part_swallow(sd->images, "ephoto.swallow.content.two", sd->center_image_two);
edje_object_signal_callback_add(sd->obj, "mouse,up,1", "ephoto.move.back", go_back, sd);
edje_object_signal_callback_add(sd->images, "ephoto.transition.done", "ephoto", done, sd);
}
static void _slide_smart_del(Evas_Object *obj)
{
Smart_Data *sd;
sd = evas_object_smart_data_get(obj);
if (!sd)
return;
evas_object_del(sd->images);
evas_object_del(sd->obj);
evas_object_del(sd->center_image_one);
evas_object_del(sd->center_image_two);
free(sd);
}
static void _slide_smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
{
Smart_Data *sd;
sd = evas_object_smart_data_get(obj);
if (!sd)
return;
if ((x == sd->x) && (y == sd->y))
return;
sd->x = x;
sd->y = y;
evas_object_move(sd->obj, x, y);
_slide_smart_reconfigure(sd);
}
static void _slide_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
{
Smart_Data *sd;
sd = evas_object_smart_data_get(obj);
if (!sd)
return;
if ((w == sd->w) && (h == sd->h))
return;
sd->w = w;
sd->h = h;
evas_object_resize(sd->obj, w, h);
_slide_smart_reconfigure(sd);
}
static void _slide_smart_show(Evas_Object *obj)
{
Smart_Data *sd;
sd = evas_object_smart_data_get(obj);
if (!sd)
return;
evas_object_show(sd->obj);
evas_object_show(sd->images);
evas_object_show(sd->center_image_one);
evas_object_show(sd->center_image_two);
}
static void _slide_smart_hide(Evas_Object *obj)
{
Smart_Data *sd;
sd = evas_object_smart_data_get(obj);
if (!sd)
return;
evas_object_hide(sd->obj);
evas_object_hide(sd->images);
evas_object_hide(sd->center_image_one);
evas_object_hide(sd->center_image_two);
}
static void _slide_smart_color_set(Evas_Object *obj, int r, int g, int b, int a)
{
Smart_Data *sd;
sd = evas_object_smart_data_get(obj);
if (!sd)
return;
evas_object_color_set(sd->obj, r, g, b, a);
}
static void _slide_smart_clip_set(Evas_Object *obj, Evas_Object *clip)
{
Smart_Data *sd;
sd = evas_object_smart_data_get(obj);
if (!sd)
return;
evas_object_clip_set(sd->obj, clip);
return;
}
static void _slide_smart_clip_unset(Evas_Object *obj)
{
Smart_Data *sd;
sd = evas_object_smart_data_get(obj);
if (!sd)
return;
evas_object_clip_unset(sd->obj);
return;
}