282 lines
6.7 KiB
C
282 lines
6.7 KiB
C
#include "Photo.h"
|
|
|
|
static void _cb_menu_populate(void *data, E_Menu *m, E_Menu_Item *mi);
|
|
static void _cb_menu_activate(void *data, E_Menu *m, E_Menu_Item *mi);
|
|
static void _cb_menu_select(void *data, E_Menu *m, E_Menu_Item *mi);
|
|
static void _cb_menu_pre_select(void *data, Evas *evas, Evas_Object *obj, void *event_info);
|
|
static void _cb_menu_post_select(void *data, Evas *evas, Evas_Object *obj, void *event_info);
|
|
static void _cb_menu_deactivate_post(void *data, E_Menu *m);
|
|
static void _cb_popi_close(void *data);
|
|
|
|
/*
|
|
* Public functions
|
|
*/
|
|
|
|
int photo_picture_histo_init(Photo_Item *pi)
|
|
{
|
|
pi->histo.list = NULL;
|
|
pi->histo.pos = 0;
|
|
|
|
return 1;
|
|
}
|
|
|
|
void photo_picture_histo_shutdown(Photo_Item *pi)
|
|
{
|
|
Eina_List *l;
|
|
Picture *p;
|
|
Photo_Item *pi2;
|
|
int cur;
|
|
|
|
if (pi->histo.list)
|
|
{
|
|
for (l=pi->histo.list; l; l=eina_list_next(l))
|
|
{
|
|
p = eina_list_data_get(l);
|
|
cur = 0;
|
|
while ( (pi2 = eina_list_nth(p->items_histo, cur)) )
|
|
{
|
|
if (pi == pi2)
|
|
p->items_histo = eina_list_remove(p->items_histo, pi);
|
|
else
|
|
cur++;
|
|
}
|
|
}
|
|
eina_list_free(pi->histo.list);
|
|
pi->histo.list = NULL;
|
|
}
|
|
|
|
pi->histo.pos = 0;
|
|
|
|
if (pi->histo.popi)
|
|
{
|
|
photo_popup_info_del(pi->histo.popi);
|
|
pi->histo.popi = NULL;
|
|
}
|
|
}
|
|
|
|
void photo_picture_histo_attach(Photo_Item *pi, Picture *picture)
|
|
{
|
|
pi->histo.list = eina_list_prepend(pi->histo.list, picture);
|
|
|
|
/* if full and we are not on the last histo item, remove last */
|
|
if (eina_list_count(pi->histo.list) > PICTURE_HISTO_SIZE_MAX)
|
|
{
|
|
Eina_List *l, *l2;
|
|
l = eina_list_last(pi->histo.list);
|
|
l2 = eina_list_nth_list(pi->histo.list, pi->histo.pos);
|
|
if (l != l2)
|
|
pi->histo.list = eina_list_remove_list(pi->histo.list, l);
|
|
}
|
|
|
|
/* add the pi to the picture's items histo list if not already here */
|
|
if (!eina_list_data_find(picture->items_histo, pi))
|
|
picture->items_histo = eina_list_append(picture->items_histo, pi);
|
|
}
|
|
|
|
Picture *photo_picture_histo_change(Photo_Item *pi, int offset)
|
|
{
|
|
Picture *picture;
|
|
int new_pos;
|
|
|
|
new_pos = pi->histo.pos + offset;
|
|
|
|
DPIC(("HISTO change from %d to %d (off %d)", pi->histo.pos, new_pos, offset));
|
|
|
|
picture = eina_list_nth(pi->histo.list, new_pos);
|
|
if (picture)
|
|
{
|
|
if (!picture->pi && !picture->delete_me)
|
|
pi->histo.pos = new_pos;
|
|
else
|
|
picture = NULL;
|
|
}
|
|
|
|
if (!picture)
|
|
DPIC(("HISTO change FAILED !!"));
|
|
|
|
return picture;
|
|
}
|
|
|
|
void photo_picture_histo_picture_del(Picture *picture)
|
|
{
|
|
Photo_Item *pi;
|
|
Eina_List *l;
|
|
|
|
if (!picture) return;
|
|
for (l=picture->items_histo; l; l=eina_list_next(l))
|
|
{
|
|
pi = eina_list_data_get(l);
|
|
while(eina_list_data_find(pi->histo.list, picture))
|
|
pi->histo.list = eina_list_remove(pi->histo.list, picture);
|
|
}
|
|
|
|
eina_list_free(picture->items_histo);
|
|
}
|
|
|
|
void photo_picture_histo_menu_append(Photo_Item *pi, E_Menu *mn_main)
|
|
{
|
|
E_Menu_Item *mi;
|
|
|
|
mi = e_menu_item_new(mn_main);
|
|
e_menu_item_label_set(mi, D_("Historic"));
|
|
e_menu_item_submenu_pre_callback_set(mi,
|
|
_cb_menu_populate, pi);
|
|
e_menu_item_submenu_post_callback_set(mi,
|
|
_cb_menu_activate, pi);
|
|
}
|
|
|
|
|
|
/*
|
|
* Private functions
|
|
*
|
|
*/
|
|
|
|
static void
|
|
_cb_menu_populate(void *data, E_Menu *m, E_Menu_Item *mi)
|
|
{
|
|
Photo_Item *pi;
|
|
E_Menu *mn;
|
|
Picture *p;
|
|
int pos;
|
|
|
|
pi = data;
|
|
|
|
mn = e_menu_new();
|
|
pi->menu_histo = mn;
|
|
e_menu_post_deactivate_callback_set(mn, _cb_menu_deactivate_post, pi);
|
|
e_menu_item_submenu_set(mi, mn);
|
|
|
|
pos = eina_list_count(pi->histo.list) - 1;
|
|
while ( (p=eina_list_nth(pi->histo.list, pos)) )
|
|
{
|
|
mi = e_menu_item_new(mn);
|
|
e_menu_item_label_set(mi, p->infos.name);
|
|
e_menu_item_radio_group_set(mi, 1);
|
|
e_menu_item_radio_set(mi, 1);
|
|
if (pi->histo.pos == pos)
|
|
e_menu_item_toggle_set(mi, 1);
|
|
|
|
e_menu_item_callback_set(mi, _cb_menu_select, pi);
|
|
evas_object_event_callback_add(mi->event_object, EVAS_CALLBACK_MOUSE_IN,
|
|
_cb_menu_pre_select, mi);
|
|
evas_object_event_callback_add(mi->event_object, EVAS_CALLBACK_MOUSE_OUT,
|
|
_cb_menu_post_select, mi);
|
|
|
|
pos--;
|
|
}
|
|
}
|
|
|
|
static void
|
|
_cb_menu_activate(void *data, E_Menu *m, E_Menu_Item *mi)
|
|
{
|
|
Photo_Item *pi;
|
|
E_Menu *mn;
|
|
Eina_List *l;
|
|
|
|
pi = data;
|
|
mn = pi->menu_histo;
|
|
|
|
if (!mn) return;
|
|
|
|
for (l=mn->items; l; l=eina_list_next(l))
|
|
{
|
|
E_Menu_Item *mi;
|
|
|
|
mi = eina_list_data_get(l);
|
|
if (!mi || mi->separator) continue;
|
|
evas_object_event_callback_add(mi->event_object, EVAS_CALLBACK_MOUSE_IN,
|
|
_cb_menu_pre_select, mi);
|
|
evas_object_event_callback_add(mi->event_object, EVAS_CALLBACK_MOUSE_OUT,
|
|
_cb_menu_post_select, mi);
|
|
}
|
|
}
|
|
|
|
static void
|
|
_cb_menu_select(void *data, E_Menu *m, E_Menu_Item *mi)
|
|
{
|
|
Photo_Item *pi;
|
|
int no;
|
|
|
|
pi = data;
|
|
|
|
no = e_menu_item_num_get(mi);
|
|
photo_item_action_change(pi,
|
|
pi->histo.pos -
|
|
(eina_list_count(pi->histo.list) - (no+1)));
|
|
photo_item_timer_set(pi, pi->config->timer_active, 0);
|
|
}
|
|
|
|
static void
|
|
_cb_menu_pre_select(void *data, Evas *evas, Evas_Object *obj, void *event_info)
|
|
{
|
|
E_Menu_Item *mi;
|
|
Photo_Item *pi;
|
|
Picture *p;
|
|
char *text;
|
|
int number;
|
|
|
|
mi = data;
|
|
if (!mi) return;
|
|
pi = mi->cb.data;
|
|
if (!pi) return;
|
|
|
|
number = (eina_list_count(pi->histo.list) - (e_menu_item_num_get(mi)+1));
|
|
|
|
DPIC(("Histo menu : Select %d in histo list", number));
|
|
|
|
p = eina_list_nth(pi->histo.list, number);
|
|
if (!p) return;
|
|
|
|
text = photo_picture_infos_get(p);
|
|
|
|
if (pi->histo.popi)
|
|
photo_popup_info_del(pi->histo.popi);
|
|
|
|
pi->histo.popi = photo_popup_info_add(pi, p->infos.name, text, p,
|
|
PICTURE_HISTO_POPUP_TIMER,
|
|
POPUP_INFO_PLACEMENT_CENTERED,
|
|
_cb_popi_close, NULL);
|
|
|
|
free(text);
|
|
}
|
|
|
|
static void
|
|
_cb_menu_post_select(void *data, Evas *evas, Evas_Object *obj, void *event_info)
|
|
{
|
|
E_Menu_Item *mi;
|
|
Photo_Item *pi;
|
|
|
|
mi = data;
|
|
if (!mi) return;
|
|
pi = mi->cb.data;
|
|
if (!pi) return;
|
|
|
|
DPIC(("Histo menu : Post select callback"));
|
|
|
|
if (pi->histo.popi)
|
|
photo_popup_info_del(pi->histo.popi);
|
|
pi->histo.popi = NULL;
|
|
}
|
|
|
|
static void
|
|
_cb_menu_deactivate_post(void *data, E_Menu *m)
|
|
{
|
|
Photo_Item *pi;
|
|
|
|
pi = data;
|
|
pi->menu_histo = NULL;
|
|
|
|
DD(("deactivate cb post"));
|
|
|
|
e_object_del(E_OBJECT(m));
|
|
}
|
|
|
|
static void
|
|
_cb_popi_close(void *data)
|
|
{
|
|
Photo_Item *pi;
|
|
|
|
pi = data;
|
|
pi->histo.popi = NULL;
|
|
}
|