#include "ephoto.h" typedef struct _Ephoto_Slideshow Ephoto_Slideshow; struct _Ephoto_Slideshow { Ephoto *ephoto; Evas_Object *slideshow; Evas_Object *notify; Evas_Object *bar; Evas_Object *event; Eina_List *entries; Elm_Object_Item *pause; Elm_Object_Item *pause_after; Elm_Object_Item *fullscreen; Elm_Object_Item *fullscreen_after; Ephoto_Entry *entry; int playing; }; static void _mouse_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Ephoto_Slideshow *ss = data; Elm_Object_Item *slideshow_item; Ephoto_Entry *entry; slideshow_item = elm_slideshow_item_current_get(ss->slideshow); if (slideshow_item) entry = elm_object_item_data_get(slideshow_item); else entry = ss->entry; if (ss->event) { evas_object_del(ss->event); ss->event = NULL; } evas_object_smart_callback_call(ss->slideshow, "back", entry); elm_slideshow_clear(ss->slideshow); evas_object_hide(ss->notify); ss->playing = 0; evas_object_freeze_events_set(ss->slideshow, EINA_TRUE); } static void _entry_free(void *data, const Ephoto_Entry *entry EINA_UNUSED) { Ephoto_Slideshow *ss = data; ss->entry = NULL; } static void _slideshow_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Ephoto_Slideshow *ss = data; if (ss->entry) ephoto_entry_free_listener_del(ss->entry, _entry_free, ss); free(ss); } static void _notify_show(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { evas_object_show(data); } static void _back(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Ephoto_Slideshow *ss = data; Elm_Object_Item *slideshow_item; Ephoto_Entry *entry; slideshow_item = elm_slideshow_item_current_get(ss->slideshow); if (slideshow_item) entry = elm_object_item_data_get(slideshow_item); else entry = ss->entry; if (ss->event) { evas_object_del(ss->event); ss->event = NULL; } evas_object_smart_callback_call(ss->slideshow, "back", entry); elm_slideshow_clear(ss->slideshow); evas_object_hide(ss->notify); ss->playing = 0; evas_object_freeze_events_set(ss->slideshow, EINA_TRUE); } static void _first(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { elm_slideshow_item_show(elm_slideshow_item_nth_get(data, 0)); } static void _next(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { elm_slideshow_next(data); } static void _pause(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Ephoto_Slideshow *ss = data; elm_object_item_del(ss->pause); if (ss->playing) { elm_slideshow_timeout_set(ss->slideshow, 0.0); ss->pause = elm_toolbar_item_insert_before(ss->bar, ss->pause_after, "media-playback-start", _("Play"), _pause, ss); ss->playing = 0; } else { elm_slideshow_timeout_set(ss->slideshow, ss->ephoto->config->slideshow_timeout); ss->pause = elm_toolbar_item_insert_before(ss->bar, ss->pause_after, "media-playback-pause", _("Pause"), _pause, ss); ss->playing = 1; } } static void _previous(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { elm_slideshow_previous(data); } static void _last(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { unsigned int count = elm_slideshow_count_get(data); elm_slideshow_item_show(elm_slideshow_item_nth_get(data, count - 1)); } static void _fullscreen(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Ephoto_Slideshow *ss = data; elm_object_item_del(ss->fullscreen); if (elm_win_fullscreen_get(ss->ephoto->win)) { ss->fullscreen = elm_toolbar_item_insert_before(ss->bar, ss->fullscreen_after, "view-fullscreen", _("Fullscreen"), _fullscreen, ss); elm_win_fullscreen_set(ss->ephoto->win, EINA_FALSE); } else { ss->fullscreen = elm_toolbar_item_insert_before(ss->bar, ss->fullscreen_after, "view-restore", _("Normal"), _fullscreen, ss); elm_win_fullscreen_set(ss->ephoto->win, EINA_TRUE); } } static void _general_settings(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *popup = data; Ephoto_Slideshow *ss = evas_object_data_get(popup, "slideshow"); ephoto_config_general(ss->ephoto); } static void _slideshow_settings(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *popup = data; Ephoto_Slideshow *ss = evas_object_data_get(popup, "slideshow"); ephoto_config_slideshow(ss->ephoto); } static void _about_settings(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *popup = data; Ephoto_Slideshow *ss = evas_object_data_get(popup, "slideshow"); ephoto_config_about(ss->ephoto); } static void _close_settings(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *popup = data; Ephoto_Slideshow *ss = evas_object_data_get(popup, "slideshow"); evas_object_del(popup); if (ss->event) { evas_object_freeze_events_set(ss->event, EINA_FALSE); elm_object_focus_set(ss->event, EINA_TRUE); } } static void _settings(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Ephoto_Slideshow *ss = data; Evas_Object *popup, *list, *button, *ic; if (ss->event) evas_object_freeze_events_set(ss->event, EINA_TRUE); popup = elm_popup_add(ss->ephoto->win); elm_popup_scrollable_set(popup, EINA_TRUE); elm_object_part_text_set(popup, "title,text", _("Settings Panel")); elm_popup_orient_set(popup, ELM_POPUP_ORIENT_CENTER); list = elm_list_add(popup); evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_list_mode_set(list, ELM_LIST_EXPAND); ic = elm_icon_add(list); elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); elm_icon_standard_set(ic, "preferences-system"); evas_object_show(ic); elm_list_item_append(list, _("General Settings"), ic, NULL, _general_settings, popup); ic = elm_icon_add(list); elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); elm_icon_standard_set(ic, "media-playback-start"); evas_object_show(ic); elm_list_item_append(list, _("Slideshow Settings"), ic, NULL, _slideshow_settings, popup); ic = elm_icon_add(list); elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); elm_icon_standard_set(ic, "help-about"); evas_object_show(ic); elm_list_item_append(list, _("About Ephoto"), ic, NULL, _about_settings, popup); ic = elm_icon_add(popup); elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME); evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); elm_icon_standard_set(ic, "window-close"); button = elm_button_add(popup); elm_object_text_set(button, _("Close")); elm_object_part_content_set(button, "icon", ic); evas_object_smart_callback_add(button, "clicked", _close_settings, popup); elm_object_part_content_set(popup, "button1", button); evas_object_show(button); elm_list_go(list); evas_object_show(list); evas_object_data_set(popup, "slideshow", ss); elm_object_content_set(popup, list); evas_object_show(popup); } static void _mouse_in(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { elm_notify_timeout_set(data, 0.0); evas_object_show(data); } static void _mouse_out(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { elm_notify_timeout_set(data, 3.0); } static void _key_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { Ephoto_Slideshow *ss = data; Evas_Event_Key_Down *ev = event_info; const char *k = ev->keyname; if (!strcmp(k, "Escape") || !strcmp(k, "F5")) { _back(ss, NULL, NULL); } else if (!strcmp(k, "F1")) { _settings(ss, NULL, NULL); } else if (!strcmp(k, "F11")) { Evas_Object *win = ss->ephoto->win; elm_win_fullscreen_set(win, !elm_win_fullscreen_get(win)); } else if (!strcmp(k, "space")) { _pause(ss, NULL, NULL); } else if (!strcmp(k, "Home")) { _first(ss->slideshow, NULL, NULL); } else if (!strcmp(k, "End")) { _last(ss->slideshow, NULL, NULL); } else if (!strcmp(k, "Left")) { _previous(ss->slideshow, NULL, NULL); } else if (!strcmp(k, "Right")) { _next(ss->slideshow, NULL, NULL); } } static void _main_focused(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_data EINA_UNUSED) { Ephoto_Slideshow *ss = data; if (ss->ephoto->state == EPHOTO_STATE_SLIDESHOW) { if (ss->event) elm_object_focus_set(ss->event, EINA_TRUE); } } Evas_Object * ephoto_slideshow_add(Ephoto *ephoto, Evas_Object *parent) { Evas_Object *slideshow = elm_slideshow_add(parent); Ephoto_Slideshow *ss; EINA_SAFETY_ON_NULL_RETURN_VAL(slideshow, NULL); ss = calloc(1, sizeof(Ephoto_Slideshow)); EINA_SAFETY_ON_NULL_GOTO(ss, error); ss->ephoto = ephoto; ss->slideshow = slideshow; ss->playing = 0; ss->event = NULL; evas_object_event_callback_add(slideshow, EVAS_CALLBACK_DEL, _slideshow_del, ss); evas_object_event_callback_add(slideshow, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down, ss); evas_object_event_callback_add(ss->ephoto->win, EVAS_CALLBACK_FOCUS_IN, _main_focused, ss); evas_object_data_set(slideshow, "slideshow", ss); elm_object_tree_focus_allow_set(slideshow, EINA_FALSE); elm_slideshow_loop_set(slideshow, EINA_TRUE); elm_slideshow_layout_set(slideshow, "fullscreen"); evas_object_size_hint_weight_set(slideshow, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(slideshow, EVAS_HINT_FILL, EVAS_HINT_FILL); ss->notify = elm_notify_add(ephoto->win); elm_notify_align_set(ss->notify, 0.5, 1.0); evas_object_size_hint_weight_set(ss->notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_notify_timeout_set(ss->notify, 3.0); evas_object_event_callback_add(slideshow, EVAS_CALLBACK_MOUSE_MOVE, _notify_show, ss->notify); elm_object_tree_focus_allow_set(ss->notify, EINA_FALSE); ss->bar = elm_toolbar_add(ss->notify); elm_toolbar_horizontal_set(ss->bar, EINA_TRUE); elm_toolbar_homogeneous_set(ss->bar, EINA_TRUE); elm_toolbar_shrink_mode_set(ss->bar, ELM_TOOLBAR_SHRINK_NONE); elm_toolbar_select_mode_set(ss->bar, ELM_OBJECT_SELECT_MODE_NONE); elm_toolbar_icon_order_lookup_set(ss->bar, ELM_ICON_LOOKUP_FDO_THEME); evas_object_size_hint_weight_set(ss->bar, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(ss->bar, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_object_content_set(ss->notify, ss->bar); elm_object_tree_focus_allow_set(ss->bar, EINA_FALSE); evas_object_event_callback_add(ss->bar, EVAS_CALLBACK_MOUSE_IN, _mouse_in, ss->notify); evas_object_event_callback_add(ss->bar, EVAS_CALLBACK_MOUSE_OUT, _mouse_out, ss->notify); elm_toolbar_item_append(ss->bar, "window-close", _("Back"), _back, ss); elm_toolbar_item_append(ss->bar, "go-first", _("First"), _first, ss->slideshow); elm_toolbar_item_append(ss->bar, "go-previous", _("Previous"), _previous, ss->slideshow); ss->pause = elm_toolbar_item_append(ss->bar, "media-playback-start", _("Play"), _pause, ss); ss->pause_after = elm_toolbar_item_append(ss->bar, "go-next", _("Next"), _next, ss->slideshow); elm_toolbar_item_append(ss->bar, "go-last", _("Last"), _last, ss->slideshow); ss->fullscreen = elm_toolbar_item_append(ss->bar, "view-fullscreen", _("Fullscreen"), _fullscreen, ss); ss->fullscreen_after = elm_toolbar_item_append(ss->bar, "preferences-system", _("Settings"), _settings, ss); evas_object_show(ss->bar); evas_object_freeze_events_set(ss->slideshow, EINA_TRUE); return ss->slideshow; error: evas_object_del(slideshow); return NULL; } static void _image_shown(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_data EINA_UNUSED) { Ephoto_Entry *entry = data; ephoto_title_set(entry->ephoto, entry->basename); } static Evas_Object * _slideshow_item_get(void *data, Evas_Object *obj) { Ephoto_Entry *entry = data; const char *group = NULL; const char *ext = strrchr(entry->path, '.'); if (ext) { ext++; if ((strcasecmp(ext, "edj") == 0)) { if (edje_file_group_exists(entry->path, "e/desktop/background")) group = "e/desktop/background"; else { Eina_List *g = edje_file_collection_list(entry->path); group = eina_list_data_get(g); edje_file_collection_list_free(g); } } } Evas_Object *image = elm_image_add(obj); elm_image_file_set(image, entry->path, group); elm_object_style_set(image, "shadow"); evas_object_event_callback_add(image, EVAS_CALLBACK_SHOW, _image_shown, entry); return image; } static const Elm_Slideshow_Item_Class _item_cls = { {_slideshow_item_get, NULL} }; void ephoto_slideshow_entries_set(Evas_Object *obj, Eina_List *entries) { Ephoto_Slideshow *ss = evas_object_data_get(obj, "slideshow"); if (entries) ss->entries = entries; } void ephoto_slideshow_entry_set(Evas_Object *obj, Ephoto_Entry *entry) { Ephoto_Slideshow *ss = evas_object_data_get(obj, "slideshow"); Ephoto_Entry *itr; const Eina_List *l; if (ss->entry) ephoto_entry_free_listener_del(ss->entry, _entry_free, ss); ss->entry = entry; if (entry) ephoto_entry_free_listener_add(entry, _entry_free, ss); elm_slideshow_loop_set(ss->slideshow, EINA_TRUE); elm_slideshow_transition_set(ss->slideshow, ss->ephoto->config->slideshow_transition); elm_slideshow_timeout_set(ss->slideshow, ss->ephoto->config->slideshow_timeout); elm_slideshow_clear(ss->slideshow); if (!entry) return; evas_object_freeze_events_set(ss->slideshow, EINA_FALSE); if (ss->pause) { elm_object_item_del(ss->pause); ss->pause = elm_toolbar_item_insert_before(ss->bar, ss->pause_after, "media-playback-pause", _("Pause"), _pause, ss); ss->playing = 1; } if (ss->fullscreen) { elm_object_item_del(ss->fullscreen); if (elm_win_fullscreen_get(ss->ephoto->win)) { ss->fullscreen = elm_toolbar_item_insert_before(ss->bar, ss->fullscreen_after, "view-restore", _("Normal"), _fullscreen, ss); } else { ss->fullscreen = elm_toolbar_item_insert_before(ss->bar, ss->fullscreen_after, "view-fullscreen", _("Fullscreen"), _fullscreen, ss); } } EINA_LIST_FOREACH(ss->entries, l, itr) { Elm_Object_Item *slideshow_item; slideshow_item = elm_slideshow_item_add(ss->slideshow, &_item_cls, itr); if (itr == entry) elm_slideshow_item_show(slideshow_item); } if (ss->event) { evas_object_del(ss->event); ss->event = NULL; } ss->event = evas_object_rectangle_add(ss->ephoto->win); evas_object_smart_member_add(ss->event, ss->ephoto->win); evas_object_color_set(ss->event, 0, 0, 0, 0); evas_object_repeat_events_set(ss->event, EINA_TRUE); evas_object_show(ss->event); evas_object_event_callback_add(ss->event, EVAS_CALLBACK_KEY_DOWN, _key_down, ss); evas_object_raise(ss->event); elm_object_focus_set(ss->event, EINA_TRUE); }