elfe: Add a dock wich accepts applications icons

SVN revision: 58041
This commit is contained in:
Nicolas Aguirre 2011-03-23 19:51:53 +00:00
parent eaf580da77
commit ebe8223ad8
10 changed files with 550 additions and 394 deletions

View File

@ -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")
}

View File

@ -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 \

View File

@ -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);
}
}

View File

@ -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;
}

249
src/dock.c Normal file
View File

@ -0,0 +1,249 @@
#include <e.h>
#include <Elementary.h>
#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;
}

9
src/dock.h Normal file
View File

@ -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_ */

View File

@ -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);

View File

@ -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

View File

@ -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];

View File

@ -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;