115 lines
2.7 KiB
C
115 lines
2.7 KiB
C
#include "private.h"
|
|
|
|
typedef struct _List
|
|
{
|
|
DB *db;
|
|
Evas_Object *pager;
|
|
struct {
|
|
Eina_List *list;
|
|
Evas_Object *current;
|
|
Evas_Object *songs;
|
|
} page;
|
|
} List;
|
|
|
|
static List _list;
|
|
|
|
#define LIST_GET_OR_RETURN(list, obj, ...) \
|
|
List *list = evas_object_data_get(obj, "_enjoy_list"); \
|
|
do { if (!list) return __VA_ARGS__; } while (0)
|
|
|
|
|
|
static void
|
|
_list_page_song(void *data, Evas_Object *o __UNUSED__, void *event_info)
|
|
{
|
|
List *list = data;
|
|
Song *song = event_info;
|
|
evas_object_smart_callback_call(list->pager, "selected", song);
|
|
}
|
|
|
|
static void
|
|
_list_del(void *data, Evas *e __UNUSED__, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
|
|
{
|
|
List *list = data;
|
|
eina_list_free(list->page.list);
|
|
}
|
|
|
|
Evas_Object *
|
|
list_add(Evas_Object *parent)
|
|
{
|
|
List *list = &_list;
|
|
|
|
memset(list, 0, sizeof(list));
|
|
|
|
list->pager = elm_pager_add(parent);
|
|
if (!list->pager) return NULL;
|
|
|
|
evas_object_data_set(list->pager, "_enjoy_list", list);
|
|
evas_object_event_callback_add
|
|
(list->pager, EVAS_CALLBACK_DEL, _list_del, list);
|
|
|
|
return list->pager;
|
|
}
|
|
|
|
Eina_Bool
|
|
list_populate(Evas_Object *obj, DB *db)
|
|
{
|
|
LIST_GET_OR_RETURN(list, obj, EINA_FALSE);
|
|
Evas_Object *page;
|
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(list, EINA_FALSE);
|
|
EINA_LIST_FREE(list->page.list, page) evas_object_del(page);
|
|
list->page.current = list->page.songs = NULL;
|
|
list->db = db;
|
|
if (!db) return EINA_TRUE;
|
|
|
|
// TODO: create fake root pages here
|
|
page = list->page.current = list->page.songs = page_songs_add
|
|
(obj, db_songs_get(db), "All Songs");
|
|
if (!page) return EINA_FALSE;
|
|
evas_object_smart_callback_add(page, "song", _list_page_song, list);
|
|
list->page.list = eina_list_append(list->page.list, page);
|
|
elm_pager_content_push(list->pager, page);
|
|
|
|
return EINA_TRUE;
|
|
}
|
|
|
|
Song *
|
|
list_selected_get(const Evas_Object *obj)
|
|
{
|
|
LIST_GET_OR_RETURN(list, obj, NULL);
|
|
if (list->page.songs) return page_songs_selected_get(list->page.songs);
|
|
return NULL;
|
|
}
|
|
|
|
Eina_Bool
|
|
list_next_exists(const Evas_Object *obj)
|
|
{
|
|
LIST_GET_OR_RETURN(list, obj, EINA_FALSE);
|
|
if (list->page.songs) return page_songs_next_exists(list->page.songs);
|
|
return EINA_FALSE;
|
|
}
|
|
|
|
Song *
|
|
list_next_go(Evas_Object *obj)
|
|
{
|
|
LIST_GET_OR_RETURN(list, obj, NULL);
|
|
if (list->page.songs) return page_songs_next_go(list->page.songs);
|
|
return NULL;
|
|
}
|
|
|
|
Eina_Bool
|
|
list_prev_exists(const Evas_Object *obj)
|
|
{
|
|
LIST_GET_OR_RETURN(list, obj, EINA_FALSE);
|
|
if (list->page.songs) return page_songs_prev_exists(list->page.songs);
|
|
return EINA_FALSE;
|
|
}
|
|
|
|
Song *
|
|
list_prev_go(Evas_Object *obj)
|
|
{
|
|
LIST_GET_OR_RETURN(list, obj, NULL);
|
|
if (list->page.songs) return page_songs_prev_go(list->page.songs);
|
|
return NULL;
|
|
}
|