diff --git a/data/themes/default/default.edc b/data/themes/default/default.edc index c07e49f..8bbf0c2 100644 --- a/data/themes/default/default.edc +++ b/data/themes/default/default.edc @@ -1,105 +1,3 @@ -#define TOOLBAR_ITEM_SIZE 72 -#define TOOLBAR_ICON_SIZE 48 -#define TOOLBAR_MIDDLE_ITEM 2 - -#define TOOLBAR_POSITION(_item_number) (((_item_number)*(TOOLBAR_ITEM_SIZE))-((TOOLBAR_ITEM_SIZE)*(TOOLBAR_MIDDLE_ITEM))) -#define TOOLBAR_BUTTON(_button_name,_button_title,_xpos, clip) \ - part { name: "button-"_button_name"-selected"; \ - type: IMAGE; \ - mouse_events: 0; \ - clip_to: clip; \ - description { state: "default" 0.0; \ - visible: 0; \ - min: TOOLBAR_ITEM_SIZE TOOLBAR_ITEM_SIZE; \ - max: TOOLBAR_ITEM_SIZE TOOLBAR_ITEM_SIZE; \ - fixed: 1 1; \ - rel1 { \ - to_y: "menu.background.bottom"; \ - relative: 0 0; \ - offset: (_xpos+2) 2; \ - } \ - rel2 { \ - offset: (_xpos-2) -2; \ - to_y: "menu.background.bottom"; \ - } \ - image.normal: "sel_bg.png"; \ - image.border: 12 12 12 12; \ - color: 255 255 255 0; \ - } \ - description { state: "visible" 0.0; \ - inherit: "default" 0.0; \ - visible: 1; \ - color: 255 255 255 255; \ - } \ - } \ - part { name: "button-"_button_name"-normal"; \ - type: IMAGE; \ - clip_to: clip; \ - description { state: "default" 0.0; \ - min: TOOLBAR_ICON_SIZE TOOLBAR_ICON_SIZE; \ - max: TOOLBAR_ICON_SIZE TOOLBAR_ICON_SIZE; \ - fixed: 1 1; \ - align: 0.5 0.5; \ - rel1 { \ - to_y: "menu.background.bottom"; \ - relative: 0 0; \ - offset: (_xpos) 0; \ - } \ - rel2 { \ - to_y: "menu.background.bottom"; \ - offset: (_xpos) 0); \ - } \ - image.normal: _button_name".png"; \ - } \ - } \ - part { name: "button-"_button_name"-disable-mask"; \ - type: RECT; \ - mouse_events: 1; \ - clip_to: clip; \ - description { state: "default" 0.0; \ - fixed: 1 1; \ - visible: 0; \ - } \ - description { state: "masking" 0.0; \ - rel1.to: "button-"_button_name"-normal"; \ - rel1.offset: 0 7; \ - rel2.to: "button-"_button_name"-normal"; \ - color: 0 0 0 128; \ - } \ - } \ - programs { \ - program { name: _button_name"-pressed"; \ - signal: "mouse,down,*"; \ - source: "button-"_button_name"-normal"; \ - action: STATE_SET "visible" 0.0; \ - target: "button-"_button_name"-selected"; \ - transition: ACCELERATE 0.3; \ - } \ - program { name: _button_name"-released"; \ - signal: "mouse,up,*"; \ - source: "button-"_button_name"-normal"; \ - action: STATE_SET "default" 0.0; \ - target: "button-"_button_name"-selected"; \ - transition: DECELERATE 0.6; \ - } \ - program { name: _button_name"-clicked"; \ - signal: "mouse,clicked,*"; \ - source: "button-"_button_name"-normal"; \ - action: SIGNAL_EMIT "action,"_button_name _button_name; \ - } \ - program { name: _button_name"-disable"; \ - signal: "button,"_button_name",disable"; \ - action: STATE_SET "masking" 0.0; \ - target: "button-"_button_name"-disable-mask"; \ - } \ - program { name: _button_name"-enable"; \ - signal: "button,"_button_name",enable"; \ - action: STATE_SET "default" 0.0; \ - target: "button-"_button_name"-disable-mask"; \ - } \ - } - - #define ICON(icon_file, icon_name) \ images { \ image: icon_file COMP; \ @@ -115,46 +13,46 @@ } \ } \ -#define ICON_SET(icon_file, icon_name) \ - images { \ - set { \ - name: icon_file; \ - image { \ - image: icon_file"-128.png" COMP; \ - size: 97 97 512 512; \ - } \ - image { \ - image: icon_file"-96.png" COMP; \ - size: 65 65 96 96; \ - } \ - image { \ - image: icon_file"-64.png" COMP; \ - size: 49 49 64 64; \ - } \ - image { \ - image: icon_file"-48.png" COMP; \ - size: 25 25 48 48; \ - } \ - image { \ - image: icon_file"-24.png" COMP; \ - size: 17 17 24 24; \ - } \ - image { \ - image: icon_file"-16.png" COMP; \ - size: 0 0 16 16; \ - } \ - } \ - } \ - group { \ - name: icon_name; \ - parts { \ - part { name: "icon"; \ - description { state: "default" 0.0; \ - image.normal: icon_file; \ - } \ - } \ - } \ - } \ +#define ICON_SET(icon_file, icon_name) \ + images { \ + set { \ + name: icon_file; \ + image { \ + image: icon_file"-128.png" COMP; \ + size: 97 97 512 512; \ + } \ + image { \ + image: icon_file"-96.png" COMP; \ + size: 65 65 96 96; \ + } \ + image { \ + image: icon_file"-64.png" COMP; \ + size: 49 49 64 64; \ + } \ + image { \ + image: icon_file"-48.png" COMP; \ + size: 25 25 48 48; \ + } \ + image { \ + image: icon_file"-24.png" COMP; \ + size: 17 17 24 24; \ + } \ + image { \ + image: icon_file"-16.png" COMP; \ + size: 0 0 16 16; \ + } \ + } \ + } \ + group { \ + name: icon_name; \ + parts { \ + part { name: "icon"; \ + description { state: "default" 0.0; \ + image.normal: icon_file; \ + } \ + } \ + } \ + } \ images @@ -209,18 +107,12 @@ collections public progress_bar_visible; public apps_list_hide() { - run_program(PROGRAM:"hide-apps-list"); - set_state(PART:"button-apps-selected", "default", 0.0); + set_state(PART:"apps-list", "default", 0.0); set_int(apps_list_visible, 0); - run_program(PROGRAM:"hide-view-mask"); - emit("more,hide", ""); } public apps_list_show() { set_int(apps_list_visible, 1); - run_program(PROGRAM:"show-apps-list"); - set_state(PART:"button-apps-selected", "visible", 0.0); - run_program(PROGRAM:"show-black-view-mask"); - emit("more,show", ""); + set_state(PART:"apps-list", "visible", 0.0); } public apps_list_toggle() { if (get_int(apps_list_visible) == 1) apps_list_hide(); @@ -242,121 +134,6 @@ collections } } } - part { - type: RECT; - name: "top_bar"; - description { - state: "default" 0.0; - color: 0 0 0 0; - rel2.relative: 1 0; - rel2.offset: 0 32; - } - } - - - - part { name: "view-mask"; - type: RECT; - mouse_events: 0; - description { state: "default" 0.0; - rel1 { - relative: 0.0 0.0; - } - rel2 { - relative: 1.0 1.0; - } - color: 0 0 0 0; - } - description { state: "hidden" 0.0; - inherit: "default" 0.0; - color: 0 0 0 0; - visible: 0; - } - description { state: "masking-black" 0.0; - inherit: "default" 0.0; - color: 0 0 0 230; - } - } - - part { - name: "menu.background.bottom"; - mouse_events: 0; - description { - visible: 1; - state: "default" 0.0; - image.normal: "mainmenu_bg_bottom.png"; - image.border: 0 0 2 0; - rel1.relative: 0.0 0.9; - } - } - - - part { - name: "edit.mode.clip"; - type: RECT; - mouse_events: 0; - description { - state: "default" 0.0; - color: 255 255 255 0; - visible: 0; - } - description { - state: "show" 0.0; - color: 255 255 255 255; - visible: 1; - } - } - - part { - name: "edit.mode.dock.clip"; - type: RECT; - mouse_events: 0; - description { - state: "default" 0.0; - color: 255 255 255 255; - visible: 1; - } - description { - state: "show" 0.0; - color: 255 255 255 0; - visible: 0; - } - } - - part { - name: "fake.clip"; - clip_to: "edit.mode.dock.clip"; - type: RECT; - mouse_events: 0; - description { - color: 255 255 255 255; - } - } - - part { - name: "icons.clip"; - type: RECT; - mouse_events: 1; - clip_to: "edit.mode.dock.clip"; - description { - state: "hidden" 0.0; - visible: 1; - color: 255 255 255 255; - } - description { - state: "masking-black" 0.0; - visible: 0; - color: 255 255 255 0; - } - } - - TOOLBAR_BUTTON("windows", "Wins", TOOLBAR_POSITION(1), "icons.clip"); - TOOLBAR_BUTTON("apps", "Apps", TOOLBAR_POSITION(2), "fake.clip"); - TOOLBAR_BUTTON("badge_delete", "EditMode", TOOLBAR_POSITION(2), "edit.mode.clip"); - TOOLBAR_BUTTON("settings", "Settings", TOOLBAR_POSITION(3), "icons.clip"); - - - part { name: "elfe.swallow.desktop"; type: SWALLOW; @@ -365,9 +142,7 @@ collections state: "default" 0.0; rel1 { relative: 0.0 0.0; } - rel2 { relative: 1.0 0.0; - to: "menu.background.bottom"; - offset: -1 0; + rel2 { relative: 1.0 1.0; } } } @@ -416,24 +191,8 @@ collections fixed: 1 1; visible: 0; color: 255 255 255 0; - - rel1 { - relative: 0.0 0.0; - - } - rel2 { - relative: 1.0 0.0; - to: "menu.background.bottom"; - } } description { state: "visible" 0.0; - rel1 { - relative: 0.0 0; - } - rel2 { - relative: 1.0 0.0; - to: "menu.background.bottom"; - } } } @@ -441,67 +200,9 @@ collections } programs { - program { name: "theme-load"; + program { name: "load,hide,appslist"; signal: "load"; - script { - set_int(apps_list_visible, 0); - set_state(PART:"view-mask", "hidden", 0.0); - } - } - program { name: "press-view-mask"; - signal: "mouse,down,*"; - source: "view-mask"; - script { - if (get_int(apps_list_visible) == 1) { - apps_list_hide(); - } else { - run_program(PROGRAM:"hide-view-mask"); - } - } - } - program { - name: "load,editmode"; - signal: "load"; - action: STATE_SET "default" 0.0; - target: "edit.mode.clip"; - target: "edit.mode.dock.clip"; - } - program { - name: "show,editmode"; - signal: "editmode,show"; - source: "elfe"; - action: STATE_SET "show" 0.0; - target: "edit.mode.clip"; - target: "edit.mode.dock.clip"; - } - - program { - name: "hide,editmode"; - signal: "editmode,hide"; - source: "elfe"; - action: STATE_SET "default" 0.0; - target: "edit.mode.clip"; - target: "edit.mode.dock.clip"; - } - - program { name: "hide-view-mask"; - action: STATE_SET "hidden" 0.0; - target: "view-mask"; - target: "icons.clip"; - transition: ACCELERATE 0.2; - } - program { name: "show-white-view-mask"; - action: STATE_SET "hidden" 0.0; - target: "view-mask"; - target: "icons.clip"; - transition: DECELERATE 0.2; - } - program { name: "show-black-view-mask"; - action: SIGNAL_EMIT "view,mask,show" ""; - action: STATE_SET "masking-black" 0.0; - target: "view-mask"; - target: "icons.clip"; - transition: DECELERATE 0.2; + script { apps_list_hide(); } } program { name: "show-apps-list"; action: STATE_SET "visible" 0.0; @@ -516,19 +217,10 @@ collections } program { name: "appslist,toggle"; - action: STATE_SET "visible" 0.0; signal: "appslist,toggle"; source: "elfe"; script { apps_list_toggle(); } - after: "apps-released"; } - program { name: "toggle-apps-list"; - signal: "mouse,clicked,*"; - source: "button-apps-normal"; - script { apps_list_toggle(); } - after: "apps-released"; - } - } } group { @@ -613,12 +305,6 @@ collections } } programs { - /* program { */ - /* name: "load"; */ - /* signal: "load"; */ - /* after: "vib1"; */ - /* } */ - program { name: "edit,on"; signal: "action,edit,on"; @@ -703,9 +389,9 @@ collections scale: 1; description { state: "default" 0.0; - align: 0.5 1; rel1.relative: 0 1; - rel1.offset: 4 -2; + rel1.offset: 4 2; + rel1.to_y: "elfe.swallow.content"; rel2.relative: 1 1; rel2.offset: -4 -2; color3: 0 0 0 0; @@ -715,14 +401,14 @@ collections font: "Sans"; size: 10; min: 0 1; - max: 1 0; + max: 1 1; } } description { state: "normal" 0.0; - align: 0.5 1; rel1.relative: 0 1; - rel1.offset: 4 -2; + rel1.offset: 4 2; + rel1.to_y: "elfe.swallow.content"; rel2.relative: 1 1; rel2.offset: -4 -2; color3: 0 0 0 200; @@ -731,7 +417,7 @@ collections font: "Sans"; size: 10; min: 0 1; - max: 1 0; + max: 1 1; } } } @@ -742,13 +428,106 @@ collections clip_to: "clip"; description { state: "default" 0.0; - align: 0.5 0.8; + rel1.offset: 32 32; + rel2.offset: -32 -32; + } + description { + state: "normal" 0.0; + align: 0.5 0.5; + aspect: 1 1; + aspect_preference: BOTH; + } + description { + state: "big" 0.0; + rel1.offset: -16 -16; + rel2.offset: 16 16; + } + program { + name: "bt_click"; + signal: "mouse,clicked,1"; + source: "elfe.swallow.content"; + action: SIGNAL_EMIT "elfe,action,click" ""; + } + program { + name: "bt_down"; + signal: "mouse,down,1"; + source: "elfe.swallow.content"; + action: STATE_SET "active" 0.0; + transition: ACCELERATE 0.5; + target: "clip"; + } + program { + name: "bt_up"; + signal: "mouse,up,1"; + source: "elfe.swallow.content"; + action: STATE_SET "default" 0.0; + transition: ACCELERATE 0.5; + target: "clip"; + } + } + + + } + programs { + program { + name: "load,text"; + signal: "load"; + action: STATE_SET "normal" 0.0; + target: "elfe.text.label"; + transition: ACCELERATE 0.2; + } + program { + name: "load"; + signal: "load"; + action: STATE_SET "default" 0.0; + target: "elfe.swallow.content"; + transition: ACCELERATE 0.1; + after: "big"; + } + program { + name: "big"; + action: STATE_SET "big" 0.0; + target: "elfe.swallow.content"; + transition: ACCELERATE 0.1; + after: "normal"; + } + program { + name: "normal"; + action: STATE_SET "normal" 0.0; + target: "elfe.swallow.content"; + transition: ACCELERATE 0.1; + } + } + } + + group { + name: "elfe/dock/icon/frame"; + parts { + part { + name: "clip"; + type: RECT; + description { + state: "default" 0.0; + color: 255 255 255 255; + } + description { + state: "active" 0.0; + color: 255 255 255 128; + } + } + + part { + name: "elfe.swallow.content"; + type: SWALLOW; + clip_to: "clip"; + description { + state: "default" 0.0; + align: 0.5 0.5; aspect: 1 1; aspect_preference: BOTH; rel1.offset: 32 32; - rel2.relative: 1 0; + rel2.relative: 1 1; rel2.offset: -32 -32-4; - rel2.to_y: "elfe.text.label"; } description { state: "normal" 0.0; @@ -789,13 +568,6 @@ collections } programs { - program { - name: "load,text"; - signal: "load"; - action: STATE_SET "normal" 0.0; - target: "elfe.text.label"; - transition: ACCELERATE 0.2; - } program { name: "load"; signal: "load"; @@ -919,7 +691,7 @@ collections type: SWALLOW; description { state: "default" 0.0; - rel2.offset: 0 -16; + rel2.to_y: "elfe.swallow.selector"; } @@ -930,11 +702,24 @@ collections description { state: "default" 0.0; rel1.offset: 0 -16; - rel1.relative: 0 1; + rel1.to: "elfe.swallow.dock"; + rel2.relative: 1 0; + rel2.to: "elfe.swallow.dock"; fixed: 1 1; } } + part { + name: "elfe.swallow.dock"; + type: SWALLOW; + description { + state: "default" 0.0; + align: 0.5 1; + fixed: 1 1; + rel1.relative: 0 1; + rel2.relative: 1 1; + } + } } } @@ -989,10 +774,41 @@ collections } } + + group { + name: "elfe/dock/layout"; + parts { + + part { + name: "menu.background.bottom"; + mouse_events: 1; + description { + visible: 1; + state: "default" 0.0; + image.normal: "mainmenu_bg_bottom.png"; + image.border: 0 0 2 0; + } + } + + part { + name: "elfe.swallow.content"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1.offset: 4 4; + rel2.offset: -3 -3; + + } + } + } + } + ICON_SET("application-default-icon", "icon/application-default"); ICON("icon_application.png", "icon/applications"); ICON("icon_widgets.png", "icon/widgets"); ICON("icon_configuration.png", "icon/configuration"); + ICON("badge_delete.png", "icon/delete") + } diff --git a/src/Makefile.am b/src/Makefile.am index 6a1fb74..c194b12 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -19,6 +19,8 @@ module_la_SOURCES = main.h \ desktop_page.h \ desktop_item.c \ desktop_item.h \ + dock.c \ + dock.h \ gadget_list.c \ gadget_list.h \ utils.c \ diff --git a/src/desktop.c b/src/desktop.c index b7e36bd..d4909b1 100644 --- a/src/desktop.c +++ b/src/desktop.c @@ -4,6 +4,7 @@ #include "desktop_page.h" #include "elfe_config.h" #include "utils.h" +#include "dock.h" #define ELFE_DESKTOP_NUM 5 #define ELFE_DESKTOP_PADDING_W 10 @@ -15,6 +16,7 @@ struct _Elfe_Desktop { Evas_Object *layout; Evas_Object *sc; + Evas_Object *dock; Eina_List *pads; Eina_List *gadgets; Evas_Object *selector; @@ -108,6 +110,7 @@ _longpress_timer_cb(void *data) { desk->edit_mode = EINA_TRUE; elfe_desktop_page_edit_mode_set(gad, EINA_TRUE); + elfe_dock_edit_mode_set(desk->dock, EINA_TRUE); desk->longpress_timer = NULL; evas_object_smart_callback_call(desk->layout, "editmode,on", NULL); } @@ -195,8 +198,15 @@ elfe_desktop_app_add(Evas_Object *obj, Efreet_Menu *menu, Evas_Coord x, Evas_Coo { Elfe_Desktop *desk = evas_object_data_get(obj, "elfe_desktop"); Evas_Object *gad; + Evas_Coord ox, oy, ow, oh; + gad = eina_list_nth(desk->gadgets, desk->current_desktop); - elfe_desktop_page_item_app_add(gad, menu, x, y); + + evas_object_geometry_get(desk->dock, &ox, &oy, &ow, &oh); + if (ELM_RECTS_INTERSECT(ox, oy, ow, oh, x, y, 1, 1)) + elfe_dock_item_app_add(desk->dock, menu, x, y); + else + elfe_desktop_page_item_app_add(gad, menu, x, y); } void @@ -313,6 +323,10 @@ elfe_desktop_add(Evas_Object *parent, E_Zone *zone) elm_scroller_content_set(desk->sc, bx); evas_object_show(bx); + desk->dock = elfe_dock_add(bx); + /* evas_object_size_hint_min_set(desk->dock, 0, 80); */ + /* evas_object_size_hint_max_set(desk->dock, 9999, 80); */ + evas_object_smart_callback_add(desk->sc, "edge,left", _scroller_edge_left_cb, desk); evas_object_smart_callback_add(desk->sc, "edge,right", _scroller_edge_right_cb, desk); evas_object_smart_callback_add(desk->sc, "scroll", _scroller_scroll_cb, desk); @@ -333,6 +347,7 @@ elfe_desktop_add(Evas_Object *parent, E_Zone *zone) elm_layout_content_set(desk->layout, "elfe.swallow.content", desk->sc); elm_layout_content_set(desk->layout, "elfe.swallow.selector", desk->selector); + elm_layout_content_set(desk->layout, "elfe.swallow.dock", desk->dock); return desk->layout; @@ -352,6 +367,8 @@ elfe_desktop_edit_mode_set(Evas_Object *obj, Eina_Bool mode) if (desk->edit_mode == mode) return; + printf("Elfe desktop edit mode\n"); + desk->edit_mode = mode; snprintf(buf, sizeof(buf), "%s/default.edj", @@ -399,5 +416,6 @@ elfe_desktop_edit_mode_set(Evas_Object *obj, Eina_Bool mode) elfe_desktop_page_edit_mode_set(gad, EINA_FALSE); evas_object_smart_callback_call(desk->layout, "editmode,off", desk); } + elfe_dock_edit_mode_set(desk->dock, EINA_FALSE); } } diff --git a/src/desktop_item.c b/src/desktop_item.c index 8c9d609..899e7a6 100644 --- a/src/desktop_item.c +++ b/src/desktop_item.c @@ -74,6 +74,8 @@ _clicked_signal_cb(void *data, Evas_Object *obj, const char *emission, const cha if (dit->desktop && !dit->edit_mode) efreet_desktop_command_get(dit->desktop, NULL, _app_exec_cb, NULL); + else if (!dit->desktop) + evas_object_smart_callback_call(dit->frame, "clicked", NULL); } static void @@ -110,6 +112,31 @@ _app_add(Elfe_Desktop_Item *dit, const char *name) return item; } +static Evas_Object * +_icon_add(Elfe_Desktop_Item *dit, const char *name) +{ + Evas_Object *item; + Evas_Object *icon; + + item = edje_object_add(evas_object_evas_get(dit->frame)); + edje_object_file_set(item, elfe_home_cfg->theme, "elfe/dock/icon/frame"); + + if (dit->desktop) + icon = elfe_utils_fdo_icon_add(dit->frame, dit->desktop->icon, elfe_home_cfg->icon_size); + else + icon = elfe_utils_fdo_icon_add(dit->frame, name, elfe_home_cfg->icon_size); + evas_object_size_hint_min_set(icon, elfe_home_cfg->icon_size, elfe_home_cfg->icon_size); + evas_object_size_hint_max_set(icon, elfe_home_cfg->icon_size, elfe_home_cfg->icon_size); + + edje_object_part_swallow(item, "elfe.swallow.content", icon); + dit->icon = icon; + + //edje_object_part_text_set(item, "elfe.text.label", name); + edje_object_signal_callback_add(item, "mouse,clicked,1", "*", _clicked_signal_cb, dit); + + return item; +} + void elfe_desktop_item_pos_get(Evas_Object *obj, int *row, int *col) { @@ -181,12 +208,13 @@ elfe_desktop_item_add(Evas_Object *parent, edje_object_file_set(layout, elfe_home_cfg->theme, "elfe/desktop/frame"); dit->frame = layout; - + printf("ITEM ADD %s\n", name); switch (type) { case ELFE_DESKTOP_ITEM_APP: dit->desktop = efreet_desktop_get(name); + if (!dit->desktop) { printf("ERROR unable to get efreet desktop from %s\n", name); @@ -207,6 +235,17 @@ elfe_desktop_item_add(Evas_Object *parent, return NULL; } break; + case ELFE_DESKTOP_ITEM_ICON: + dit->desktop = efreet_desktop_get(name); + item = _icon_add(dit, name); + if (!item) + { + printf("ERROR unable to create icon %s\n", name); + evas_object_del(layout); + free(dit); + return NULL; + } + break; default: break; } diff --git a/src/dock.c b/src/dock.c new file mode 100644 index 0000000..0cfed07 --- /dev/null +++ b/src/dock.c @@ -0,0 +1,249 @@ +#include +#include + +#include "dock.h" +#include "elfe_config.h" +#include "desktop_item.h" +#include "utils.h" + +typedef struct _Elfe_Dock Elfe_Dock; + +struct _Elfe_Dock +{ + Evas_Object *edje; + Evas_Object *table; + Eina_Matrixsparse *items; + Evas_Object *allapps_icon; + Eina_Bool edit_mode; +}; + +static void _allapps_icon_add(Elfe_Dock *dock, const char *name); + +static void +_pos_to_geom(Elfe_Dock *dock, + int row, int col, + Evas_Coord *x, Evas_Coord *y, + Evas_Coord *w, Evas_Coord *h) +{ + Evas_Coord ox, oy, ow, oh; + + if(!dock) + return; + + evas_object_geometry_get(dock->edje, &ox, &oy, &ow, &oh); + + if (elfe_home_cfg->cols && w) + *w = ow / elfe_home_cfg->cols; + if (h) + *h = oh; + + if (x && w) + *x = col * *w; + if (y && h) + *y = 0; +} + +static void +_xy_to_pos(Elfe_Dock *dock, Evas_Coord x, Evas_Coord y, + int *col) +{ + Evas_Coord ow, oh; + Evas_Coord w = 0, h = 0; + + if(!dock) + return; + + evas_object_geometry_get(dock->table, NULL, NULL, &ow, &oh); + + if (elfe_home_cfg->cols && col) + { + w = ow / elfe_home_cfg->cols; + if (w) + *col = (x/w) % elfe_home_cfg->cols; + } + +} + + +static void +_item_delete_cb(void *data , Evas_Object *obj, void *event_info) +{ + Evas_Object *item = event_info; + Elfe_Dock *dock = data; + int row, col; + + elfe_desktop_item_pos_get(item, &row, &col); + eina_matrixsparse_cell_idx_clear(dock->items, row, col); + evas_object_del(item); + // elfe_home_config_dock_item_del(dock->desktop, + // row, col); + +} + + +static void +_app_icon_clicked_cb(void *data , Evas_Object *obj, void *event_info ) +{ + Elfe_Dock *dock = data; + printf("Icon clicked\n"); + if (!dock->edit_mode) + elfe_home_win_allapps_togle(); + else + { + elfe_home_win_editmode_off(); + dock->edit_mode = EINA_FALSE; + printf("Clicked cb and edit mode %s\n", dock->edit_mode ? "True": "False"); + _allapps_icon_add(dock, "icon/widgets"); + } +} + +static void +_allapps_icon_add(Elfe_Dock *dock, const char *name) +{ + Evas_Object *ic; + + if (dock->allapps_icon) + { + printf("delete icon\n"); + evas_object_del(dock->allapps_icon); + } + + printf("Add icon %s\n", name); + + ic = elfe_desktop_item_add(dock->table, 0, elfe_home_cfg->cols - 1, + name, ELFE_DESKTOP_ITEM_ICON, NULL); + evas_object_smart_callback_add(ic, "clicked", _app_icon_clicked_cb, dock); + evas_object_show(ic); + evas_object_size_hint_min_set(ic, elfe_home_cfg->icon_size, elfe_home_cfg->icon_size); + evas_object_size_hint_max_set(ic, elfe_home_cfg->icon_size, elfe_home_cfg->icon_size); + evas_object_size_hint_align_set(ic, 0.5, 0.5); + + elm_table_pack(dock->table, ic, elfe_home_cfg->cols - 1, 0, 1, 1); + evas_object_show(ic); + eina_matrixsparse_data_idx_set(dock->items, 0, elfe_home_cfg->cols - 1, ic); + + dock->allapps_icon = ic; +} + +static void +_populate_dock(Elfe_Dock *dock) +{ + Elfe_Desktop_Item_Config *dic; + Evas_Object *item; + Eina_List *l; + + Evas_Coord x = 0, y = 0, w = 0, h = 0; + + EINA_LIST_FOREACH(elfe_home_cfg->dock_items, l, dic) + { + + /* This position is already in use, this is a conf issue! */ + /* FIXME: delete item from config ? */ + if (eina_matrixsparse_data_idx_get(dock->items, 0, dic->col)) + continue; + + item = elfe_desktop_item_add(dock->table, 0, dic->col, + dic->name, dic->type, NULL); + if (!item) + continue; + + evas_object_smart_callback_add(item, "item,delete", _item_delete_cb, dock); + elm_table_pack(dock->table, item, dic->col, 0, 1, 1); + evas_object_show(item); + eina_matrixsparse_data_idx_set(dock->items, 0, dic->col, item); + } + + _allapps_icon_add(dock, "icon/widgets"); +} + +void +elfe_dock_edit_mode_set(Evas_Object *obj, Eina_Bool mode) +{ + Elfe_Dock *dock = evas_object_data_get(obj, "dock");; + Evas_Object *item; + Eina_List *l; + Eina_Iterator *iter; + Eina_Matrixsparse_Cell *cell; + + dock->edit_mode = mode; + + printf("Dock edit mode\n"); + + iter = eina_matrixsparse_iterator_new(dock->items); + EINA_ITERATOR_FOREACH(iter, cell) + { + item = eina_matrixsparse_cell_data_get(cell); + elfe_desktop_item_edit_mode_set(item, mode); + } + eina_iterator_free(iter); + + if (mode) + _allapps_icon_add(dock, "icon/delete"); + else + _allapps_icon_add(dock, "icon/widgets"); +} + +void +elfe_dock_item_app_add(Evas_Object *obj, Efreet_Menu *menu, + Evas_Coord x, Evas_Coord y) +{ + Elfe_Dock *dock = evas_object_data_get(obj, "dock"); + Evas_Object *item; + Evas_Coord ox = 0, oy = 0, ow = 0, oh = 0; + int col = 0; + + _xy_to_pos(dock, x, y, &col); + + printf("COLONE : %d\n", col); + + /* This position is already used by another item! */ + if (eina_matrixsparse_data_idx_get(dock->items, 0, col)) return; + + item = elfe_desktop_item_add(dock->table, 0, col, + menu->desktop->orig_path, + ELFE_DESKTOP_ITEM_ICON, NULL); + evas_object_show(item); + evas_object_size_hint_min_set(item, elfe_home_cfg->icon_size, elfe_home_cfg->icon_size); + evas_object_size_hint_max_set(item, elfe_home_cfg->icon_size, elfe_home_cfg->icon_size); + evas_object_size_hint_align_set(item, 0.5, 0.5); + + elm_table_pack(dock->table, item, col, 0, 1, 1); + + eina_matrixsparse_data_idx_set(dock->items, 0, col, item); + /* elfe_home_config_desktop_item_add(page->desktop, */ + /* ELFE_DESKTOP_ITEM_APP, */ + /* row, col, */ + /* 0, 0, 0, 0, */ + /* menu->desktop->orig_path); */ + evas_object_smart_callback_add(item, "item,delete", _item_delete_cb, dock); +} + +Evas_Object * +elfe_dock_add(Evas_Object *parent) +{ + Elfe_Dock *dock; + Evas_Object *bx; + Evas_Object *ic; + int i; + + dock = calloc(1, sizeof(Elfe_Dock)); + if (!dock) + return NULL; + + dock->items = eina_matrixsparse_new(1, elfe_home_cfg->cols, + NULL, NULL); + + dock->table = elm_table_add(parent); + elm_table_homogenous_set(dock->table, EINA_TRUE); + + _populate_dock(dock); + + dock->edje = elm_layout_add(parent); + elm_layout_file_set(dock->edje, elfe_home_cfg->theme, "elfe/dock/layout"); + evas_object_show(dock->edje); + evas_object_data_set(dock->edje, "dock", dock); + + elm_layout_content_set(dock->edje, "elfe.swallow.content", dock->table); + + return dock->edje; +} diff --git a/src/dock.h b/src/dock.h new file mode 100644 index 0000000..b6ede65 --- /dev/null +++ b/src/dock.h @@ -0,0 +1,9 @@ +#ifndef _DOCK_H_ +#define _DOCK_H_ + + +Evas_Object *elfe_dock_add(Evas_Object *parent); +void elfe_dock_item_app_add(Evas_Object *obj, Efreet_Menu *menu, Evas_Coord x, Evas_Coord y); +void elfe_dock_edit_mode_set(Evas_Object *obj, Eina_Bool mode); + +#endif /* _DOCK_H_ */ diff --git a/src/elfe_config.c b/src/elfe_config.c index b67d486..ef379d8 100644 --- a/src/elfe_config.c +++ b/src/elfe_config.c @@ -59,6 +59,7 @@ elfe_home_config_init(E_Module *m) E_CONFIG_VAL(D, T, cols, INT); E_CONFIG_VAL(D, T, rows, INT); E_CONFIG_VAL(D, T, icon_size, INT); + E_CONFIG_LIST(D, T, dock_items, conf_desktop_item_edd); elfe_home_cfg = e_config_domain_load("module.elfe", conf_edd); diff --git a/src/elfe_config.h b/src/elfe_config.h index 463bf91..b4ab775 100644 --- a/src/elfe_config.h +++ b/src/elfe_config.h @@ -12,7 +12,8 @@ typedef enum _Elfe_Desktop_Item_Type Elfe_Desktop_Item_Type; enum _Elfe_Desktop_Item_Type { ELFE_DESKTOP_ITEM_APP, - ELFE_DESKTOP_ITEM_GADGET + ELFE_DESKTOP_ITEM_GADGET, + ELFE_DESKTOP_ITEM_ICON, }; struct _Elfe_Home_Config @@ -23,6 +24,7 @@ struct _Elfe_Home_Config int cols; int rows; int icon_size; + Eina_List *dock_items; }; struct _Elfe_Desktop_Config diff --git a/src/main.c b/src/main.c index 8d8ccbe..0ed99ad 100644 --- a/src/main.c +++ b/src/main.c @@ -42,6 +42,7 @@ typedef enum #define DEFAULT_SIZE_H 0.07 static E_Gadcon *gc = NULL; +static Elfe_Home_Win *hwin; /* local function prototypes */ static void _elfe_home_win_new(E_Zone *zone); @@ -201,11 +202,11 @@ _app_longpressed_cb(void *data , Evas_Object *obj, void *event_info) Evas_Coord x, y; Evas_Object *o_edje; Evas_Coord ow, oh; - Evas_Coord size = 0; + Evas_Coord size = elfe_home_cfg->icon_size; evas_object_geometry_get(hwin->desktop, NULL, NULL, &ow, &oh); - size = MIN(ow, oh) / 5; + elfe_desktop_edit_mode_set(hwin->desktop, EINA_TRUE); @@ -321,15 +322,7 @@ static void _edje_signal_cb(void *data, Evas_Object *obj, const char *emission, } else if (!strcmp(emission, "action,apps")) { - if (!hwin->allapps) - { - hwin->allapps = elfe_allapps_add(hwin->layout); - evas_object_smart_callback_add(hwin->allapps, "entry,longpressed", _app_longpressed_cb, hwin); - evas_object_smart_callback_add(hwin->allapps, "gadget,longpressed", _gadget_longpressed_cb, hwin); - evas_object_smart_callback_add(hwin->allapps, "item,selected", _allapps_item_selected_cb, hwin); - evas_object_show(hwin->allapps); - elm_layout_content_set(hwin->layout, "elfe.swallow.allapps", hwin->allapps); - } + } else if (!strcmp(emission, "action,badge_delete")) { @@ -337,14 +330,41 @@ static void _edje_signal_cb(void *data, Evas_Object *obj, const char *emission, elfe_desktop_edit_mode_set(hwin->desktop, EINA_FALSE); o_edje = elm_layout_edje_get(hwin->layout); - edje_object_signal_emit(o_edje, "editmode,hide", "elfe"); + edje_object_signal_emit(o_edje, "appslist,toggle", "elfe"); } } +void elfe_home_win_allapps_togle(void) +{ + Evas_Object *o_edje; + + if (!hwin->allapps) + { + printf("Create allapps\n"); + hwin->allapps = elfe_allapps_add(hwin->layout); + evas_object_smart_callback_add(hwin->allapps, "entry,longpressed", _app_longpressed_cb, hwin); + evas_object_smart_callback_add(hwin->allapps, "gadget,longpressed", _gadget_longpressed_cb, hwin); + evas_object_smart_callback_add(hwin->allapps, "item,selected", _allapps_item_selected_cb, hwin); + evas_object_show(hwin->allapps); + elm_layout_content_set(hwin->layout, "elfe.swallow.allapps", hwin->allapps); + o_edje = elm_layout_edje_get(hwin->layout); + edje_object_signal_emit(o_edje, "appslist,toggle", "elfe"); + } +} + +void elfe_home_win_editmode_off() +{ + Evas_Object *o_edje; + + elfe_desktop_edit_mode_set(hwin->desktop, EINA_FALSE); + o_edje = elm_layout_edje_get(hwin->layout); + edje_object_signal_emit(o_edje, "editmode,hide", "elfe"); +} + static void _elfe_home_win_new(E_Zone *zone) { - Elfe_Home_Win *hwin; + Evas *evas; E_Desk *desk; char buf[PATH_MAX]; diff --git a/src/utils.c b/src/utils.c index eb4ebaa..6bd823d 100644 --- a/src/utils.c +++ b/src/utils.c @@ -45,7 +45,7 @@ elfe_utils_fdo_icon_add(Evas_Object *parent, const char *icon, int size) if (path) elm_icon_file_set(ic, path, NULL); - else + else if (!elm_icon_file_set(ic, elfe_home_cfg->theme, icon)) elm_icon_file_set(ic, elfe_home_cfg->theme, "icon/application-default"); return ic;