start work on filesystem browser:
[X] display [X] metadata [X] events [ ] usable
This commit is contained in:
parent
014d264d09
commit
2f3fac7fe4
|
@ -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;
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
296
src/bin/empc.c
296
src/bin/empc.c
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue