start work on filesystem browser:

[X] display
[X] metadata
[X] events
[ ] usable
This commit is contained in:
zmike 2014-02-22 23:30:39 -05:00
parent 014d264d09
commit 2f3fac7fe4
7 changed files with 522 additions and 35 deletions

View File

@ -440,6 +440,89 @@
}
}
}
group { name: "elm/gengrid/item/filesystem/default";
data.item: "selectraise" "on";
data.item: "texts" "elm.text";
data.item: "contents" "elm.swallow.icon";
parts {
part { name: "selection"; type: RECT; mouse_events: 0;
scale: 1;
description { state: "default";
color: 222 222 222 0;
visible: 0;
}
description { state: "selected";
inherit: "default";
color: 222 222 222 160;
visible: 1;
}
}
program {
signal: "elm,state,selected"; source: "elm";
action: STATE_SET "selected" 0.0;
target: "selection";
transition: LINEAR 0.15;
}
program {
signal: "elm,state,unselected"; source: "elm";
action: STATE_SET "default" 0.0;
target: "selection";
transition: LINEAR 0.15;
}
part { name: "mouse_indicator"; type: RECT; mouse_events: 0;
scale: 1;
description { state: "default";
color: 52 153 255 0;
visible: 0;
}
description { state: "active";
inherit: "default";
color: 52 153 255 160;
visible: 1;
}
}
program {
signal: "mouse,in"; source: "events";
action: STATE_SET "active" 0.0;
target: "mouse_indicator";
transition: LINEAR 0.15;
}
program {
signal: "mouse,out"; source: "events";
action: STATE_SET "default" 0.0;
target: "mouse_indicator";
transition: LINEAR 0.15;
}
part { name: "elm.swallow.icon"; type: SWALLOW; mouse_events: 0;
description { state: "default";
rel1.offset: 3 3;
rel2.to_y: "elm.text";
rel2.relative: 1 0;
rel2.offset: -4 -1;
}
}
part { name: "elm.text"; type: TEXT; mouse_events: 0;
effect: GLOW;
scale: 1;
description { state: "default";
fixed: 0 1;
align: 0.5 1.0;
rel1.relative: 0 1;
rel2.offset: -4 -4;
color: 255 255 255 255;
color3: 0 0 0 128;
text { font: "Sans"; size: 11;
min: 0 1;
}
}
}
part { name: "events"; type: RECT;
description { state: "default";
color: 0 0 0 0;
}
}
}
}
group { name: "elm/button/base/controls";
parts {
part { name: "base"; type: RECT; mouse_events: 0;

View File

@ -7,10 +7,12 @@ collections {
images.image: "e-logo-blue-glow.png" COMP;
script {
public overlay_locked;
public timer_filesystem;
public timer_controls;
public timer_playlist;
public bg_chooser;
public lyrics_visible;
public filesystem_visible;
public playlist_visible;
public controls_visible;
public info_visible;
@ -38,6 +40,15 @@ collections {
CONTROLS_HIDE
}
public hide_filesystem() {
#define FILESYSTEM_HIDE \
stop_program(get_program_id("filesystem_show_start")); \
set_int(timer_filesystem, 0); \
set_int(filesystem_visible, 0); \
run_program(get_program_id("filesystem_hide_start"));
FILESYSTEM_HIDE
}
}
parts {
part { name: "base"; type: RECT; mouse_events: 0;
@ -526,6 +537,7 @@ collections {
part { name: EMPC_BASE_SWALLOW_PLAYLIST; type: SWALLOW;
description { state: "default";
fixed: 1 1;
visible: 0;
rel1.relative: 1 0;
rel1.to_x: "base";
rel2.relative: 2 0;
@ -535,12 +547,14 @@ collections {
inherit: "default";
rel1.relative: 0 0;
rel2.relative: 1 0;
visible: 1;
}
}
part { name: EMPC_BASE_SWALLOW_CONTROLS; type: SWALLOW;
description { state: "default";
fixed: 1 1;
align: 0.5 1;
visible: 0;
rel1.relative: 0 1;
rel2.relative: 1 2;
}
@ -550,6 +564,19 @@ collections {
rel1.relative: 0 1;
}
}
part { name: EMPC_BASE_SWALLOW_FILESYSTEM; type: SWALLOW;
description { state: "default";
fixed: 1 1;
visible: 0;
rel1.relative: 0 -1;
rel1.to: "base";
rel2.relative: 1 0;
rel2.to: "base";
}
description { state: "visible";
fixed: 1 1;
}
}
part { name: "right_events"; type: RECT; repeat_events: 1;
clip_to: "bgchooser_active_clip";
description { state: "default";
@ -566,6 +593,14 @@ collections {
rel1.relative: 0 0.9;
}
}
part { name: "top_events"; type: RECT; repeat_events: 1;
clip_to: "bgchooser_active_clip";
description { state: "default";
min: 16 16;
color: 0 0 0 0;
rel2.relative: 1 0.1;
}
}
program { name: "playlist_overlay_signal";
signal: "empc,overlay,toggle"; source: "empc";
script {
@ -595,12 +630,14 @@ collections {
script {
reset_timer(get_int(timer_playlist));
reset_timer(get_int(timer_controls));
reset_timer(get_int(timer_filesystem));
}
}
program { signal: "mouse,move"; source: "*";
script {
reset_timer(get_int(timer_playlist));
reset_timer(get_int(timer_controls));
reset_timer(get_int(timer_filesystem));
}
}
program { signal: "load";
@ -675,7 +712,7 @@ collections {
/* CONTROLS */
program { signal: "mouse,in"; source: "bottom_events";
script {
if (!get_int(overlay_locked)) {
if ((!get_int(overlay_locked)) && (!get_int(filesystem_visible))) {
cancel_timer(get_int(timer_controls));
set_int(timer_controls, 0);
run_program(get_program_id("controls_show"));
@ -727,6 +764,60 @@ collections {
program { name: "controls_hide_done";
action: SIGNAL_EMIT "empc,controls,hidden" "empc";
}
/* FILESYSTEM */
program { signal: "mouse,in"; source: "top_events";
script {
if (get_int(playlist_visible)) {
cancel_timer(get_int(timer_filesystem));
set_int(timer_filesystem, 0);
run_program(get_program_id("filesystem_show"));
}
}
}
program { signal: "mouse,out"; source: "top_events";
script {
if (get_int(filesystem_visible)) {
set_int(timer_filesystem, timer(HIDE_TIMEOUT, "hide_filesystem", 0));
}
}
}
program { name: "filesystem_show";
filter: EMPC_BASE_SWALLOW_FILESYSTEM "default";
signal: "empc,filesystem,show"; source: "empc";
script {
if ((!get_int(filesystem_visible)) && (!get_int(bg_chooser))) {
set_int(filesystem_visible, 1);
stop_program(get_program_id("filesystem_hide_start"));
run_program(get_program_id("filesystem_show_start"));
}
}
}
program { name: "filesystem_show_start";
action: STATE_SET "visible" 0.0;
target: EMPC_BASE_SWALLOW_FILESYSTEM;
transition: LINEAR 0.2 CURRENT;
after: "filesystem_show_done";
}
program { name: "filesystem_show_done";
action: SIGNAL_EMIT "empc,filesystem,visible" "empc";
}
program { name: "filesystem_hide";
filter: EMPC_BASE_SWALLOW_FILESYSTEM "visible";
signal: "empc,filesystem,hide"; source: "empc";
script {
FILESYSTEM_HIDE
}
}
program { name: "filesystem_hide_start";
action: STATE_SET "default" 0.0;
target: EMPC_BASE_SWALLOW_FILESYSTEM;
transition: LINEAR 0.2 CURRENT;
after: "filesystem_hide_done";
}
program { name: "filesystem_hide_done";
action: SIGNAL_EMIT "empc,filesystem,hidden" "empc";
}
}
}
group { name: "elm/layout/empc/dummy";
@ -742,6 +833,55 @@ collections {
}
}
}
group { name: "elm/layout/empc/filesystem";
parts {
part { name: "base"; type: RECT;
description { state: "default";
color: 0 0 0 255;
}
}
part { name: "empc.swallow.back"; type: SWALLOW;
description { state: "default";
fixed: 0 1;
min: 16 16;
align: 0.5 0;
rel2.relative: 1 0;
}
description { state: "hidden";
minmul: 1 0;
align: 0.5 0;
rel2.relative: 1 0;
visible: 0;
}
}
program { signal: "empc,back,hidden"; source: "empc";
action: STATE_SET "hidden" 0.0;
target: "empc.swallow.back";
transition: LINEAR 0.2;
}
program { signal: "empc,back,visible"; source: "empc";
action: STATE_SET "default" 0.0;
target: "empc.swallow.back";
transition: LINEAR 0.2;
}
part { name: EMPC_BASE_SWALLOW_FILESYSTEM; type: SWALLOW;
description { state: "default";
rel1.to_y: "empc.swallow.back";
rel1.relative: 0 1;
rel2.to_y: "empc.swallow.add";
rel2.relative: 1 0;
}
}
part { name: "empc.swallow.add"; type: SWALLOW;
description { state: "default";
min: 16 16;
fixed: 0 1;
align: 0.5 1;
rel1.relative: 0 1;
}
}
}
}
#include "bgselector.edc"
#include "elm.edc"

View File

@ -8,6 +8,7 @@
#define EMPC_BASE_SWALLOW_POSITION "empc.swallow.position"
#define EMPC_BASE_SWALLOW_PLAYLIST "empc.swallow.playlist"
#define EMPC_BASE_SWALLOW_CONTROLS "empc.swallow.controls"
#define EMPC_BASE_SWALLOW_FILESYSTEM "empc.swallow.filesystem"
#define EMPC_BASE_SWALLOW_REPEAT "empc.swallow.repeat"
#define EMPC_BASE_SWALLOW_SHUFFLE "empc.swallow.shuffle"

View File

@ -13,6 +13,20 @@ enum
MPD_STATE_PAUSE = 3,
};
enum
{
MPD_ENTITY_TYPE_UNKNOWN,
MPD_ENTITY_TYPE_DIRECTORY,
MPD_ENTITY_TYPE_SONG,
MPD_ENTITY_TYPE_PLAYLIST,
};
typedef struct Empc_Entity
{
int type;
void *value;
} Empc_Entity;
static int empd_state = 0;
static Evas_Object *win = NULL;
static Evas_Object *bg[2] = {NULL};
@ -25,6 +39,7 @@ static Empc_Fetch_Request *bgfetch = NULL;
static Eina_Bool queue_list_state = EINA_FALSE;
static Evas_Object *queue_list = NULL;
static Evas_Object *filesystem = NULL;
static Evas_Object *controls = NULL;
static Evas_Object *repeat = NULL;
static Evas_Object *shuffle = NULL;
@ -61,8 +76,8 @@ static size_t empc_module_size[EMPC_MODULE_TYPE_LAST] =
[EMPC_MODULE_TYPE_METADATA_SAVER] = sizeof(Empc_Module_Metadata_Save),
};
static void queue_list_header_image(void *data, Empc_Fetch_Request *req, Evas_Object *obj);
static void filesystem_item_image(void *data, Empc_Fetch_Request *req, Evas_Object *obj);
static void queue_list_handler(Eina_Value *value, Eina_Bool cached);
@ -120,12 +135,6 @@ lyrics_set(void *data EINA_UNUSED, Empc_Fetch_Request *req, Evas_Object *obj)
save_text(obj, req->artist, req->song);
}
static void
bg_downloaded(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
{
save_image(obj, bgselector_artist_get(data), bgselector_album_get(data));
}
void
bg_add(void *data EINA_UNUSED, Empc_Fetch_Request *req, Evas_Object *obj)
{
@ -135,10 +144,7 @@ bg_add(void *data EINA_UNUSED, Empc_Fetch_Request *req, Evas_Object *obj)
parent = elm_object_parent_widget_get(obj);
bgselector_image_add(parent, obj);
if (!bgchooser)
{
evas_object_smart_callback_add(obj, "download,done", bg_downloaded, parent);
save_image(obj, req->artist, req->album);
}
save_image(obj, req->artist, req->album);
}
static void
@ -304,9 +310,179 @@ songid_update(int songid)
}
static void
queue_list_cached(Eldbus_Proxy *proxy EINA_UNUSED, void *data EINA_UNUSED, Eldbus_Pending *pending EINA_UNUSED, Eldbus_Error_Info *error EINA_UNUSED, Eina_Value *value)
filesystem_item_del(Empc_Entity *ent, Evas_Object *obj EINA_UNUSED)
{
switch (ent->type)
{
case MPD_ENTITY_TYPE_DIRECTORY:
Empd_Empc_Directory_free(ent->value);
break;
case MPD_ENTITY_TYPE_PLAYLIST:
Empd_Empc_Playlist_free(ent->value);
break;
case MPD_ENTITY_TYPE_SONG:
Empd_Empc_Song_free(ent->value);
break;
}
free(ent);
}
static char *
filesystem_item_text_get(Empc_Entity *ent, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
{
Empd_Empc_File *file;
const char *str;
if (ent->type != MPD_ENTITY_TYPE_SONG)
{
/* playlist and directory structs are identical */
Empd_Empc_Directory *dir = ent->value;
str = ecore_file_file_get(dir->uri);
return strdup(str ?: dir->uri);
}
file = ent->value;
return strdup(file->title);
}
static void
filesystem_item_content_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
{
metadata_fetch_cancel(data, elm_object_parent_widget_get(obj), filesystem_item_image, obj);
}
static void
filesystem_item_image(void *data, Empc_Fetch_Request *req, Evas_Object *obj)
{
evas_object_event_callback_del_full(data, EVAS_CALLBACK_DEL, filesystem_item_content_del, req);
if (!obj) return;
EXPAND(obj);
FILL(obj);
evas_object_show(obj);
elm_box_pack_end(data, obj);
}
static Evas_Object *
filesystem_item_content_get(Empc_Entity *ent, Evas_Object *obj, const char *part EINA_UNUSED)
{
Empc_Fetch_Request *req;
Evas_Object *cur;
switch (ent->type)
{
case MPD_ENTITY_TYPE_DIRECTORY:
{
/* assumes directory structure:
*
* $artist/$album/songs
*/
const char *p;
Empd_Empc_Directory *dir = ent->value;
cur = elm_box_add(obj);
EXPAND(cur);
FILL(cur);
p = strchr(dir->uri, '/');
if (p)
{
char artist[PATH_MAX];
const char *pp;
memcpy(&artist, dir->uri, p - dir->uri);
artist[p - dir->uri] = 0;
p += 1;
pp = strchr(p, '/');
if (p)
{
char album[PATH_MAX];
memcpy(&album, p, pp - p);
album[pp - p] = 0;
req = metadata_fetch_begin(EMPC_METADATA_TYPE_IMAGE, obj, artist, album, EINA_FALSE, filesystem_item_image, cur);
}
else
req = metadata_fetch_begin(EMPC_METADATA_TYPE_IMAGE, obj, artist, p, EINA_FALSE, filesystem_item_image, cur);
}
else
req = metadata_fetch_begin(EMPC_METADATA_TYPE_IMAGE, obj, dir->uri, NULL, EINA_FALSE, filesystem_item_image, cur);
evas_object_event_callback_add(cur, EVAS_CALLBACK_DEL, filesystem_item_content_del, req);
break;
}
case MPD_ENTITY_TYPE_PLAYLIST:
cur = elm_icon_add(obj);
//elm_icon_standard_set(cur, ic
break;
case MPD_ENTITY_TYPE_SONG:
cur = elm_icon_add(obj);
elm_icon_standard_set(cur, "audio-x-generic");
break;
}
return cur;
}
static void
filesystem_item_add(Evas_Object *base, Empc_Entity *ent)
{
static Elm_Gengrid_Item_Class itc =
{
.item_style = "filesystem",
.func = {
.content_get = (Elm_Gengrid_Item_Content_Get_Cb)filesystem_item_content_get,
.text_get = (Elm_Gengrid_Item_Text_Get_Cb)filesystem_item_text_get,
.del = (Elm_Gengrid_Item_Del_Cb)filesystem_item_del
},
.version = ELM_GENGRID_ITEM_CLASS_VERSION
};
elm_gengrid_item_append(base, &itc, ent, NULL, NULL);
}
static void
filesystem_base(Eldbus_Proxy *proxy EINA_UNUSED, void *data EINA_UNUSED, Eldbus_Pending *pending EINA_UNUSED, Eldbus_Error_Info *error EINA_UNUSED, Eina_Value *args)
{
Eina_Value array;
unsigned int i;
if (!args) return; //canceled
elm_gengrid_clear(filesystem);
eina_value_struct_value_get(args, "arg0", &array);
for (i = 0; i < eina_value_array_count(&array); i++)
{
Eina_Value struc, val, realval;
int type;
Empc_Entity *ent;
eina_value_array_value_get(&array, i, &struc);
eina_value_struct_get(&struc, "arg0", &type);
eina_value_struct_value_get(&struc, "arg1", &val);
eina_value_struct_value_get(&val, "arg0", &realval);
ent = malloc(sizeof(Empc_Entity));
ent->type = type;
ent->value = NULL;
switch (type)
{
case MPD_ENTITY_TYPE_DIRECTORY:
azy_value_to_Empd_Empc_Directory(&realval, (Empd_Empc_Directory**)&ent->value);
break;
case MPD_ENTITY_TYPE_PLAYLIST:
azy_value_to_Empd_Empc_Playlist(&realval, (Empd_Empc_Playlist**)&ent->value);
break;
case MPD_ENTITY_TYPE_SONG:
azy_value_to_Empd_Empc_File(&realval, (Empd_Empc_File**)&ent->value);
break;
}
filesystem_item_add(filesystem, ent);
}
INF("FS DONE");
}
static void
queue_list_cached(Eldbus_Proxy *proxy EINA_UNUSED, void *data, Eldbus_Pending *pending EINA_UNUSED, Eldbus_Error_Info *error EINA_UNUSED, Eina_Value *value)
{
queue_list_handler(value, EINA_TRUE);
if (data)
empd_empc_list_info_call(empd_proxy, filesystem_base, NULL, "/");
}
static Eina_Bool
@ -370,7 +546,7 @@ empc_status(void *d EINA_UNUSED, int t EINA_UNUSED, Empd_Empc_Status_Data *ev)
empd_song_length = ev->song_length;
empd_song_elapsed = ev->song_elapsed;
elm_slider_value_set(o, (double)ev->song_elapsed / (double)ev->song_length);
if (empd_song_length - empd_song_elapsed == 5) //try to fetch metadata at 5 seconds remaining
if (empd_song_item && (empd_song_length - empd_song_elapsed == 5)) //try to fetch metadata at 5 seconds remaining
{
Elm_Object_Item *it;
Empd_Empc_Song *so;
@ -408,8 +584,14 @@ empc_status(void *d EINA_UNUSED, int t EINA_UNUSED, Empd_Empc_Status_Data *ev)
*/
unsigned int i, step = (ev->queue_length / 4) % 31;
for (i = 0; i < ev->queue_length; i += step)
empd_empc_queue_list_cached_range_call(empd_proxy, queue_list_cached, NULL, i, i + step);
elm_genlist_clear(queue_list);
{
long num = i + step;
if (num >= ev->queue_length)
num = -1;
empd_empc_queue_list_cached_range_call(empd_proxy, queue_list_cached, (void*)(long)((num == -1) ? 1 : 0), i, num);
}
}
empd_queue_length = ev->queue_length;
return ECORE_CALLBACK_RENEW;
@ -523,16 +705,18 @@ queue_list_header_text_get(Empd_Empc_Song *so, Evas_Object *obj EINA_UNUSED, con
static void
queue_list_header_content_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
{
metadata_fetch_cancel(data, queue_list_header_image, obj);
metadata_fetch_cancel(data, elm_object_parent_widget_get(obj), queue_list_header_image, obj);
}
static void
queue_list_header_image(void *data, Empc_Fetch_Request *req, Evas_Object *obj)
{
if (obj)
evas_object_show(obj);
elm_object_part_content_set(data, "empc.swallow.content", obj);
evas_object_event_callback_del_full(data, EVAS_CALLBACK_DEL, queue_list_header_content_del, req);
if (!obj) return;
EXPAND(obj);
FILL(obj);
evas_object_show(obj);
elm_box_pack_end(data, obj);
}
static Evas_Object *
@ -545,8 +729,9 @@ queue_list_header_content_get(Empd_Empc_Song *so, Evas_Object *obj, const char *
{
Empc_Fetch_Request *req;
cur = elm_layout_add(obj);
elm_layout_theme_set(cur, "layout", "empc", "dummy");
cur = elm_box_add(obj);
EXPAND(cur);
FILL(cur);
req = metadata_fetch_begin(EMPC_METADATA_TYPE_IMAGE, obj, so->artist, so->album, EINA_FALSE, queue_list_header_image, cur);
evas_object_event_callback_add(cur, EVAS_CALLBACK_DEL, queue_list_header_content_del, req);
return cur;
@ -559,12 +744,15 @@ queue_list_header_content_get(Empd_Empc_Song *so, Evas_Object *obj, const char *
{
Evas_Object *img;
o = elm_layout_add(obj);
elm_layout_theme_set(o, "layout", "empc", "dummy");
o = elm_box_add(obj);
EXPAND(o);
FILL(o);
img = evas_object_image_filled_add(evas_object_evas_get(obj));
EXPAND(img);
FILL(img);
evas_object_size_hint_aspect_set(img, EVAS_ASPECT_CONTROL_BOTH, 1, 1);
evas_object_image_source_set(img, elm_image_object_get(cur));
elm_object_part_content_set(o, "empc.swallow.content", img);
elm_box_pack_end(o, img);
return o;
}
o = elm_image_add(obj);
@ -1019,7 +1207,7 @@ bg_chooser_hide(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char
img = bgselector_get(bgs);
artist = bgselector_artist_get(bgs);
album = bgselector_album_get(bgs);
metadata_fetch_cancel(bgfetch, bg_add, NULL);
metadata_fetch_cancel(bgfetch, bgs, bg_add, NULL);
save_image(img, artist, album);
bgchooser = EINA_FALSE;
@ -1067,6 +1255,7 @@ main(int argc, char *argv[])
[EMPC_METADATA_TYPE_TEXT] = (Eina_Free_Cb)fetch_req_free,
};
eina_init();
eldbus_init();
efreet_init();
elm_init(argc, argv);
@ -1228,12 +1417,61 @@ main(int argc, char *argv[])
elm_object_part_content_set(layout, EMPC_BASE_SWALLOW_PLAYLIST, o);
evas_object_show(o);
evas_object_focus_set(o, EINA_TRUE);
{
Evas_Object *ly, *img;
ly = elm_layout_add(win);
elm_layout_theme_set(ly, "layout", "empc", "filesystem");
elm_layout_signal_emit(ly, "empc,back,hidden", "empc");
elm_object_part_content_set(layout, EMPC_BASE_SWALLOW_FILESYSTEM, ly);
o = elm_button_add(win);
WEIGHT(o, EVAS_HINT_EXPAND, 0);
FILL(o);
img = elm_icon_add(win);
elm_icon_order_lookup_set(img, ELM_ICON_LOOKUP_THEME);
elm_icon_standard_set(img, "arrow_left");
elm_object_content_set(o, img);
elm_object_text_set(o, "Go back");
elm_object_part_content_set(ly, "empc.swallow.back", o);
filesystem = o = elm_gengrid_add(win);
elm_gengrid_item_size_set(filesystem,
elm_config_scale_get() * 100,
elm_config_scale_get() * 125);
//evas_object_smart_callback_add(o, "realized", queue_list_item_realize, NULL);
//evas_object_smart_callback_add(o, "clicked,double", queue_list_double_click, NULL);
//evas_object_event_callback_add(o, EVAS_CALLBACK_KEY_DOWN, queue_list_key_down, NULL);
elm_gengrid_multi_select_mode_set(o, ELM_OBJECT_MULTI_SELECT_MODE_WITH_CONTROL);
elm_gengrid_multi_select_set(o, 1);
elm_scroller_bounce_set(o, 0, 0);
elm_scroller_policy_set(o, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
EXPAND(o);
FILL(o);
elm_object_part_content_set(ly, EMPC_BASE_SWALLOW_FILESYSTEM, o);
evas_object_show(o);
o = elm_button_add(win);
WEIGHT(o, EVAS_HINT_EXPAND, 0);
FILL(o);
img = elm_icon_add(win);
elm_icon_order_lookup_set(img, ELM_ICON_LOOKUP_FDO);
elm_icon_standard_set(img, "list-add");
elm_object_content_set(o, img);
elm_object_text_set(o, "Add to playlist");
elm_object_part_content_set(ly, "empc.swallow.add", o);
}
evas_object_show(win);
evas_object_resize(win, 357, 362);
elm_run();
empd_empc_proxy_unref(empd_proxy);
eldbus_shutdown();
efreet_shutdown();
elm_shutdown();
{
Empc_Module_Type t;
@ -1247,9 +1485,7 @@ main(int argc, char *argv[])
free(mod);
}
}
empd_empc_proxy_unref(empd_proxy);
eldbus_shutdown();
efreet_shutdown();
elm_shutdown();
eina_shutdown();
return 0;
}

View File

@ -20,6 +20,7 @@ metadata_image_done(Metadata_Image *m)
Evas_Object *o;
m->ireq->urls = eina_inlist_remove(m->ireq->urls, EINA_INLIST_GET(m));
INF("REMOTE COVER DONE(%s:%s)", m->ireq->req.artist, m->ireq->req.album);
f = eina_file_virtualize(ecore_con_url_url_get(m->url),
eina_binbuf_string_steal(m->buf), eina_binbuf_length_get(m->buf),
EINA_FALSE);
@ -138,7 +139,7 @@ metadata_fetch_begin(Empc_Metadata_Type type, Evas_Object *obj, const char *attr
if (ireq->req.type != type) return NULL; //wtf
EINA_LIST_FOREACH(ireq->results, l, res)
{
if ((res->cb == cb) && (res->data == data)) return NULL;
if ((res->cb == cb) && (res->data == data) && (res->obj == obj)) return NULL;
}
res = malloc(sizeof(Empc_Metadata_Result_Cb));
res->cb = cb;
@ -174,7 +175,7 @@ metadata_fetch_begin(Empc_Metadata_Type type, Evas_Object *obj, const char *attr
}
void
metadata_fetch_cancel(Empc_Fetch_Request *req, Empc_Module_Metadata_Fetch_Result_Cb cb, const void *data)
metadata_fetch_cancel(Empc_Fetch_Request *req, Evas_Object *obj, Empc_Module_Metadata_Fetch_Result_Cb cb, const void *data)
{
Empc_Module_Metadata_Fetch *em;
Empc_Fetch_Request_Internal *ireq = (Empc_Fetch_Request_Internal*)req;
@ -186,7 +187,7 @@ metadata_fetch_cancel(Empc_Fetch_Request *req, Empc_Module_Metadata_Fetch_Result
em = (Empc_Module_Metadata_Fetch*)ireq->module;
EINA_LIST_FOREACH_SAFE(ireq->results, l, ll, res)
{
if ((res->cb == cb) && (res->data == data))
if ((res->cb == cb) && (res->data == data) && (res->obj == obj))
ireq->results = eina_list_remove_list(ireq->results, l);
}
if (ireq->results) return;

View File

@ -63,7 +63,7 @@ extern Eina_Inlist *empc_modules[];
extern Eina_Hash *empc_metadata_fetch_reqs[];
Empc_Fetch_Request *metadata_fetch_begin(Empc_Metadata_Type type, Evas_Object *obj, const char *attr1, const char *attr2, Eina_Bool force, Empc_Module_Metadata_Fetch_Result_Cb cb, const void *data);
void metadata_fetch_cancel(Empc_Fetch_Request *req, Empc_Module_Metadata_Fetch_Result_Cb cb, const void *data);
void metadata_fetch_cancel(Empc_Fetch_Request *req, Evas_Object *obj, Empc_Module_Metadata_Fetch_Result_Cb cb, const void *data);
Evas_Object *bgselector_add(Evas_Object *parent);

View File

@ -20,3 +20,29 @@ struct Array_Songs
{
array<Empc_Song> songs;
};
struct Empc_File
{
string uri;
time last_modified;
time duration;
string artist;
string title;
string album;
int track;
string name;
string date;
string disc;
};
struct Empc_Directory
{
string uri;
time last_modified;
};
struct Empc_Playlist
{
string uri;
time last_modified;
};