diff --git a/src/bin/e_module.c b/src/bin/e_module.c index 0d65d97e1..936d12cce 100644 --- a/src/bin/e_module.c +++ b/src/bin/e_module.c @@ -705,7 +705,7 @@ _e_module_whitelist_check(void) "wl_shell", "xkbswitch", "echievements", - + "music-control", NULL // end marker }; diff --git a/src/modules/Makefile_music_control.am b/src/modules/Makefile_music_control.am index fcdf86e26..38ba74c90 100644 --- a/src/modules/Makefile_music_control.am +++ b/src/modules/Makefile_music_control.am @@ -11,4 +11,6 @@ music_control_module_la_DEPENDENCIES = $(MDEPENDENCIES) music_control_module_la_CFLAGS = $(AM_CFLAGS) -Wno-unused-parameter music_control_module_la_LIBADD = @MUSIC_CONTROL_LIBS@ music_control_module_la_SOURCES = music-control/e_mod_main.h \ - music-control/e_mod_main.c + music-control/e_mod_main.c \ + music-control/private.h \ + music-control/ui.c diff --git a/src/modules/music-control/e-module-music-control.edc b/src/modules/music-control/e-module-music-control.edc index 2c4ad8ef5..c548107aa 100644 --- a/src/modules/music-control/e-module-music-control.edc +++ b/src/modules/music-control/e-module-music-control.edc @@ -1,5 +1,9 @@ images { image: "images/icon.png" COMP; + image: "images/previous.png" COMP; + image: "images/next.png" COMP; + image: "images/pause.png" COMP; + image: "images/play.png" COMP; } collections { @@ -22,54 +26,96 @@ collections { } group { name: "modules/music-control/main"; - min: 16 16; - max: 128 128; parts { part { name: "icon"; - mouse_events: 0; type: IMAGE; description { state: "default" 0.0; aspect: 1.0 1.0; aspect_preference: BOTH; - rel1.offset: 2 2; - rel2.offset: -3 -3; + rel1.relative: 0 0; + rel2.relative: 1 1; image.normal: "images/icon.png"; - } - description { - state: "bigger" 0.0; - inherit: "default" 0.0; - rel1.offset: -2 -2; - rel2.offset: 3 3; + } + } + } + } + group { + name: "modules/music-control/popup"; + min: 150 30; + parts { + part { + type: IMAGE; + name: "previous_btn"; + description { + state: "default" 0; + aspect: 1.0 1.0; + aspect_preference: BOTH; + rel1.relative: 0.0 0.0; + rel2.relative: 0.33 1.0; + image.normal: "images/previous.png"; } } part { - name: "event"; - mouse_events: 1; - type: RECT; - description { - state: "default" 0.0; - color: 255 255 255 0; - } + type: IMAGE; + name: "play_btn"; + description { + state: "default" 0; + aspect: 1.0 1.0; + aspect_preference: BOTH; + rel1.relative: 0.33 0.0; + rel2.relative: 0.66 1.0; + image.normal: "images/pause.png"; + } + description { + state: "play" 0.0; + inherit: "default" 0.0; + image.normal: "images/play.png"; + } + } + part { + type: IMAGE; + name: "next_btn"; + description { + state: "default" 0; + aspect: 1.0 1.0; + aspect_preference: BOTH; + rel1.relative: 0.66 0.0; + rel2.relative: 1.0 1.0; + image.normal: "images/next.png"; + } } } programs { program { - name: "mouse_in"; - signal: "mouse,in"; - source: "event"; - action: STATE_SET "bigger" 0.0; - transition: LINEAR 0.1; - target: "icon"; + signal: "mouse,clicked,*"; + source: "previous_btn"; + action: SIGNAL_EMIT "btn,clicked" "previous"; } program { - name: "mouse_out"; - signal: "mouse,out"; - source: "event"; + signal: "mouse,clicked,*"; + source: "play_btn"; + action: SIGNAL_EMIT "btn,clicked" "play"; + } + program { + signal: "mouse,clicked,*"; + source: "next_btn"; + action: SIGNAL_EMIT "btn,clicked" "next"; + } + program { + signal: "btn,state,image,play"; + source: "play"; + action: STATE_SET "play" 0.0; + transition: LINEAR 0.1; + target: "play_btn"; + } + program { + signal: "btn,state,image,pause"; + source: "play"; action: STATE_SET "default" 0.0; - transition: LINEAR 0.2; - target: "icon"; + transition: LINEAR 0.1; + target: "play_btn"; } } } diff --git a/src/modules/music-control/e-module-music-control.edj b/src/modules/music-control/e-module-music-control.edj index e858cdc07..3712858be 100644 Binary files a/src/modules/music-control/e-module-music-control.edj and b/src/modules/music-control/e-module-music-control.edj differ diff --git a/src/modules/music-control/e_mod_main.c b/src/modules/music-control/e_mod_main.c index 61137d6db..91b896b7f 100644 --- a/src/modules/music-control/e_mod_main.c +++ b/src/modules/music-control/e_mod_main.c @@ -1,5 +1,4 @@ -#include "e.h" -#include "e_mod_main.h" +#include "private.h" static E_Module *music_control_mod = NULL; @@ -7,17 +6,9 @@ static char tmpbuf[4096]; /* general purpose buffer, just use immediately */ static const char _e_music_control_Name[] = "Music controller"; -static void -_cb_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event) -{ - E_Music_Control_Instance *inst = data; - Evas_Event_Mouse_Down *ev = event; - printf("event mouse down button=%d\n", ev->button); -} - -static const char * -_edj_path_get(void) +const char * +music_control_edj_path_get(void) { #define TF "/e-module-music-control.edj" size_t dirlen; @@ -46,16 +37,18 @@ _gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style) inst = calloc(1, sizeof(E_Music_Control_Instance)); inst->ctxt = ctxt; inst->gadget = edje_object_add(gc->evas); - edje_object_file_set(inst->gadget, _edj_path_get(), + edje_object_file_set(inst->gadget, music_control_edj_path_get(), "modules/music-control/main"); /*e_theme_edje_object_set(inst->gadget, "base/theme/modules/music-control", - "e/modules/music-control/main");*/ + "e/modules/music-control/main"); + TODO append theme to data/themes/default.edc*/ inst->gcc = e_gadcon_client_new(gc, name, id, style, inst->gadget); inst->gcc->data = inst; + evas_object_event_callback_add(inst->gadget, EVAS_CALLBACK_MOUSE_DOWN, music_control_mouse_down_cb, inst); - evas_object_event_callback_add(inst->gadget, EVAS_CALLBACK_MOUSE_DOWN, _cb_mouse_down, inst); + ctxt->instances = eina_list_append(ctxt->instances, inst); return inst->gcc; } @@ -72,6 +65,7 @@ _gc_shutdown(E_Gadcon_Client *gcc) inst = gcc->data; evas_object_del(inst->gadget); + if (inst->popup) music_control_popup_del(inst); ctxt->instances = eina_list_remove(ctxt->instances, inst); free(inst); @@ -94,7 +88,7 @@ static Evas_Object * _gc_icon(const E_Gadcon_Client_Class *client_class, Evas *evas) { Evas_Object *o = edje_object_add(evas); - edje_object_file_set(o, _edj_path_get(), "icon"); + edje_object_file_set(o, music_control_edj_path_get(), "icon"); return o; } diff --git a/src/modules/music-control/e_mod_main.h b/src/modules/music-control/e_mod_main.h index f435352f3..07c1fd716 100644 --- a/src/modules/music-control/e_mod_main.h +++ b/src/modules/music-control/e_mod_main.h @@ -3,20 +3,6 @@ #include "config.h" #include -#include - -typedef struct _E_Music_Control_Module_Context -{ - Eina_List *instances; - EDBus_Connection *conn; -} E_Music_Control_Module_Context; - -typedef struct _E_Music_Control_Instance -{ - E_Music_Control_Module_Context *ctxt; - E_Gadcon_Client *gcc; - Evas_Object *gadget; -} E_Music_Control_Instance; EAPI extern E_Module_Api e_modapi; EAPI void *e_modapi_init(E_Module *m); diff --git a/src/modules/music-control/images/next.png b/src/modules/music-control/images/next.png new file mode 100644 index 000000000..86e313e50 Binary files /dev/null and b/src/modules/music-control/images/next.png differ diff --git a/src/modules/music-control/images/pause.png b/src/modules/music-control/images/pause.png new file mode 100644 index 000000000..c0a09bb82 Binary files /dev/null and b/src/modules/music-control/images/pause.png differ diff --git a/src/modules/music-control/images/play.png b/src/modules/music-control/images/play.png new file mode 100644 index 000000000..35f3a2348 Binary files /dev/null and b/src/modules/music-control/images/play.png differ diff --git a/src/modules/music-control/images/previous.png b/src/modules/music-control/images/previous.png new file mode 100644 index 000000000..c07da8ba0 Binary files /dev/null and b/src/modules/music-control/images/previous.png differ diff --git a/src/modules/music-control/private.h b/src/modules/music-control/private.h new file mode 100644 index 000000000..b67825cf0 --- /dev/null +++ b/src/modules/music-control/private.h @@ -0,0 +1,27 @@ +#ifndef MUSIC_CONTROL_PRIVATE_H +#define MUSIC_CONTROL_PRIVATE_H + +#include "e_mod_main.h" + +typedef struct _E_Music_Control_Module_Context +{ + Eina_List *instances; + EDBus_Connection *conn; + Eina_Bool playning:1; +} E_Music_Control_Module_Context; + +typedef struct _E_Music_Control_Instance +{ + E_Music_Control_Module_Context *ctxt; + E_Gadcon_Client *gcc; + Evas_Object *gadget; + E_Gadcon_Popup *popup; + Evas_Object *content_popup; +} E_Music_Control_Instance; + +void music_control_mouse_down_cb(void *data, Evas *evas, Evas_Object *obj, void *event); +const char *music_control_edj_path_get(void); +void music_control_popup_del(E_Music_Control_Instance *inst); +void music_control_state_update_all(E_Music_Control_Module_Context *ctxt); + +#endif diff --git a/src/modules/music-control/ui.c b/src/modules/music-control/ui.c new file mode 100644 index 000000000..a2b9cb34b --- /dev/null +++ b/src/modules/music-control/ui.c @@ -0,0 +1,73 @@ +#include "private.h" + +static void +_play_state_update(E_Music_Control_Instance *inst) +{ + if (!inst->popup) return; + if (inst->ctxt->playning) + edje_object_signal_emit(inst->content_popup, "btn,state,image,pause", "play"); + else + edje_object_signal_emit(inst->content_popup, "btn,state,image,play", "play"); +} + +void +music_control_state_update_all(E_Music_Control_Module_Context *ctxt) +{ + E_Music_Control_Instance *inst; + Eina_List *list; + + EINA_LIST_FOREACH(ctxt->instances, list, inst) + _play_state_update(inst); +} + +static void +_btn_clicked(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + E_Music_Control_Instance *inst = data; + + if (!strcmp(source, "play")) + { + inst->ctxt->playning = !inst->ctxt->playning; + music_control_state_update_all(inst->ctxt); + } +} + +static void +_popup_new(E_Music_Control_Instance *inst) +{ + Evas_Object *o; + inst->popup = e_gadcon_popup_new(inst->gcc); + + o = edje_object_add(inst->popup->win->evas); + edje_object_file_set(o, music_control_edj_path_get(), + "modules/music-control/popup"); + edje_object_signal_callback_add(o, "btn,clicked", "*", _btn_clicked, inst); + + e_gadcon_popup_content_set(inst->popup, o); + e_gadcon_popup_show(inst->popup); + inst->content_popup = o; + _play_state_update(inst); +} + +void +music_control_popup_del(E_Music_Control_Instance *inst) +{ + e_gadcon_popup_hide(inst->popup); + e_object_del(E_OBJECT(inst->popup)); + inst->popup = NULL; +} + +void +music_control_mouse_down_cb(void *data, Evas *evas, Evas_Object *obj, void *event) +{ + E_Music_Control_Instance *inst = data; + Evas_Event_Mouse_Down *ev = event; + + if (ev->button == 1) + { + if (!inst->popup) + _popup_new(inst); + else + music_control_popup_del(inst); + } +}