add bryces

This commit is contained in:
Mike Blumenkrantz 2016-01-11 13:02:44 -05:00
parent b413a619e9
commit 52abf2ce1b
8 changed files with 400 additions and 46 deletions

View File

@ -26,8 +26,8 @@ glow_top.png
include src/Makefile.mk
include src/gadgets/Makefile.mk
e-module-desksanity.edj: e-module-desksanity.edc
$(EDJE_CC) -id $(top_srcdir) $< $@
e-module-desksanity.edj: e-module-desksanity.edc edc/*edc
$(EDJE_CC) -id $(top_srcdir) -id $(top_srcdir)/edc $< $@
clean-local:
rm -rf *.edj module.desktop e_modules-desksanity.spec *~

View File

@ -665,4 +665,5 @@ collections {
}
}
}
#include "edc/all.edc"
}

View File

@ -2,6 +2,8 @@ AM_CPPFLAGS += \
-Isrc/gadgets
module_la_SOURCES += \
src/gadgets/bryce.c \
src/gadgets/bryce.h \
src/gadgets/core.c \
src/gadgets/demo.c \
src/gadgets/gadget.h \

368
src/gadgets/bryce.c Normal file
View File

@ -0,0 +1,368 @@
#include "e_mod_main.h"
#include "gadget.h"
typedef struct Bryce
{
Evas_Object *bryce;
Evas_Object *layout;
Evas_Object *site;
Evas_Object *scroller;
Evas_Object *autohide_event;
Evas_Object *parent; //comp_object is not an elm widget
char *style;
int size;
int x, y;
int autohide_size;
E_Layer layer;
Ecore_Job *calc_job;
Ecore_Timer *autohide_timer;
Eina_Bool autosize : 1;
Eina_Bool autohide : 1;
Eina_Bool hidden : 1;
Eina_Bool animating : 1;
} Bryce;
#define BRYCE_GET(obj) \
Bryce *b; \
b = evas_object_data_get((obj), "__bryce"); \
if (!b) abort()
static void
_bryce_autohide_end(void *data, Efx_Map_Data *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED)
{
Bryce *b = data;
b->animating = 0;
}
static void
_bryce_autohide_coords(Bryce *b, int *x, int *y)
{
int ox, oy, ow, oh;
Z_Gadget_Site_Anchor an;
if (b->parent == e_comp->elm)
{
E_Zone *zone;
zone = e_comp_object_util_zone_get(b->bryce);
ox = zone->w, oy = zone->y, ow = zone->w, oh = zone->h;
}
else
evas_object_geometry_get(b->parent, &ox, &oy, &ow, &oh);
an = z_gadget_site_anchor_get(b->site);
if (z_gadget_site_orient_get(b->site) == Z_GADGET_SITE_ORIENT_HORIZONTAL)
{
*x = b->x;
if (an & Z_GADGET_SITE_ANCHOR_TOP)
*y = oy - b->size + b->autohide_size;
if (an & Z_GADGET_SITE_ANCHOR_BOTTOM)
*y = oy + oh + b->size - b->autohide_size;
}
else if (z_gadget_site_orient_get(b->site) == Z_GADGET_SITE_ORIENT_VERTICAL)
{
*y = b->y;
if (an & Z_GADGET_SITE_ANCHOR_LEFT)
*x = ox - b->size + b->autohide_size;
if (an & Z_GADGET_SITE_ANCHOR_RIGHT)
*x = ox + ow + b->size - b->autohide_size;
}
}
static void
_bryce_position(Bryce *b, int w, int h)
{
int ox, oy, ow, oh;
int x, y;
Z_Gadget_Site_Anchor an;
if (b->parent == e_comp->elm)
{
E_Zone *zone;
zone = e_comp_object_util_zone_get(b->bryce);
ox = zone->x, oy = zone->y, ow = zone->w, oh = zone->h;
e_comp_object_util_center_pos_get(b->bryce, &x, &y);
}
else
{
evas_object_geometry_get(b->parent, &ox, &oy, &ow, &oh);
x = ox + (ow - w) / 2;
y = oy + (oh - h) / 2;
}
an = z_gadget_site_anchor_get(b->site);
if (an & Z_GADGET_SITE_ANCHOR_LEFT)
x = ox;
if (an & Z_GADGET_SITE_ANCHOR_TOP)
y = oy;
if (z_gadget_site_orient_get(b->site) == Z_GADGET_SITE_ORIENT_HORIZONTAL)
{
if (an & Z_GADGET_SITE_ANCHOR_RIGHT)
x = ox + ow - w;
if (an & Z_GADGET_SITE_ANCHOR_BOTTOM)
y = oy + oh - b->size;
}
else if (z_gadget_site_orient_get(b->site) == Z_GADGET_SITE_ORIENT_VERTICAL)
{
if (an & Z_GADGET_SITE_ANCHOR_RIGHT)
x = ox + ow - b->size;
if (an & Z_GADGET_SITE_ANCHOR_BOTTOM)
y = oy + oh - h;
}
b->x = x, b->y = y;
if (b->animating)
{
if (b->hidden)
{
_bryce_autohide_coords(b, &x, &y);
efx_move(b->bryce, EFX_EFFECT_SPEED_LINEAR, EFX_POINT(x, y), 0.5, _bryce_autohide_end, b);
}
else
efx_move(b->bryce, EFX_EFFECT_SPEED_LINEAR, EFX_POINT(x, y), 0.5, _bryce_autohide_end, b);
return;
}
else if (b->hidden)
_bryce_autohide_coords(b, &x, &y);
evas_object_move(b->bryce, x, y);
}
static void
_bryce_autosize(Bryce *b)
{
int lw, lh, sw, sh, maxw, maxh;
b->calc_job = NULL;
if (b->parent == e_comp->elm) //screen-based bryce
{
E_Zone *zone;
zone = e_comp_object_util_zone_get(b->bryce);
maxw = zone->w, maxh = zone->h;
}
else
evas_object_geometry_get(b->parent, NULL, NULL, &maxw, &maxh);
evas_object_size_hint_min_get(b->layout, &lw, &lh);
evas_object_size_hint_min_get(b->site, &sw, &sh);
if (z_gadget_site_orient_get(b->site) == Z_GADGET_SITE_ORIENT_HORIZONTAL)
evas_object_resize(b->bryce, MIN(lw + sw, maxw), b->size);
else if (z_gadget_site_orient_get(b->site) == Z_GADGET_SITE_ORIENT_VERTICAL)
evas_object_resize(b->bryce, b->size, MIN(lh + sh, maxh));
if (b->parent == e_comp->elm) //screen-based bryce
_bryce_position(b, lw + sw, lh + sh);
}
static Eina_Bool
_bryce_autohide_timeout(Bryce *b)
{
int x, y;
b->autohide_timer = NULL;
b->hidden = b->animating = 1;
_bryce_autohide_coords(b, &x, &y);
efx_move(b->bryce, EFX_EFFECT_SPEED_LINEAR, EFX_POINT(x, y), 0.5, _bryce_autohide_end, b);
return EINA_FALSE;
}
static void
_bryce_autohide_moveresize(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
{
Bryce *b = data;
int x, y, w, h;
evas_object_geometry_get(obj, &x, &y, &w, &h);
evas_object_geometry_set(b->autohide_event, x, y, w, h);
}
static void
_bryce_autohide_mouse_out(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Bryce *b = data;
b->autohide_timer = ecore_timer_add(1.0, (Ecore_Task_Cb)_bryce_autohide_timeout, b);
}
static void
_bryce_autohide_mouse_in(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Bryce *b = data;
if (b->animating && (!b->hidden)) return;
E_FREE_FUNC(b->autohide_timer, ecore_timer_del);
efx_move(b->bryce, EFX_EFFECT_SPEED_LINEAR, EFX_POINT(b->x, b->y), 0.5, _bryce_autohide_end, b);
b->animating = 1;
b->hidden = 0;
}
static void
_bryce_style(Evas_Object *bryce, Eina_Stringshare *name, Evas_Object *g)
{
Evas_Object *ly;
static int n;
char buf[1024];
BRYCE_GET(bryce);
ly = elm_layout_add(b->site);
if (n++ % 2)
snprintf(buf, sizeof(buf), "z/bryce/%s/inset", b->style ?: "default");
else
snprintf(buf, sizeof(buf), "z/bryce/%s/plain", b->style ?: "default");
e_theme_edje_object_set(ly, NULL, buf);
z_gadget_util_layout_style_init(g, ly);
elm_object_part_content_set(ly, "e.swallow.content", g);
}
static void
_bryce_site_hints(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Bryce *b = data;
if (b->autosize && (!b->calc_job))
b->calc_job = ecore_job_add((Ecore_Cb)_bryce_autosize, b);
}
static void
_bryce_restack(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
{
Bryce *b = data;
E_Layer layer;
layer = evas_object_layer_get(obj);
if (layer == b->layer) return;
if (layer == E_LAYER_DESKTOP)
e_comp_object_util_type_set(b->bryce, E_COMP_OBJECT_TYPE_NONE);
else
e_comp_object_util_type_set(b->bryce, E_COMP_OBJECT_TYPE_POPUP);
b->layer = layer;
}
static void
_bryce_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Bryce *b = data;
free(b->style);
free(data);
}
Z_API Evas_Object *
z_bryce_add(Evas_Object *parent)
{
Evas_Object *ly, *bryce, *scr, *site;
Bryce *b;
ly = elm_layout_add(parent);
e_theme_edje_object_set(ly, NULL, "z/bryce/default/base");
scr = elm_scroller_add(ly);
elm_object_style_set(scr, "bryce");
site = z_gadget_site_add(scr, Z_GADGET_SITE_ORIENT_HORIZONTAL);
z_gadget_site_owner_setup(site, Z_GADGET_SITE_ANCHOR_TOP, _bryce_style);
elm_object_content_set(scr, site);
elm_object_part_content_set(ly, "e.swallow.content", scr);
elm_layout_signal_emit(ly, "e,state,orient,top", "e");
//evas_object_geometry_set(ly, 0, 0, 48, e_comp->h);
evas_object_show(ly);
bryce = e_comp_object_util_add(ly, E_COMP_OBJECT_TYPE_POPUP);
evas_object_data_set(bryce, "comp_skip", (void*)1);
evas_object_layer_set(bryce, E_LAYER_POPUP);
evas_object_lower(bryce);
b = E_NEW(Bryce, 1);
b->bryce = bryce;
b->layout = ly;
b->site = site;
b->scroller = scr;
b->parent = parent;
b->size = 48;
{
const char *str;
str = elm_layout_data_get(ly, "hidden_state_size");
if (str && str[0])
b->autohide_size = strtol(str, NULL, 10);
}
evas_object_data_set(bryce, "__bryce", b);
evas_object_data_set(scr, "__bryce", b);
evas_object_event_callback_add(bryce, EVAS_CALLBACK_DEL, _bryce_del, b);
evas_object_event_callback_add(bryce, EVAS_CALLBACK_RESTACK, _bryce_restack, b);
evas_object_event_callback_add(site, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _bryce_site_hints, b);
evas_object_clip_set(bryce, e_comp_zone_xy_get(0, 0)->bg_clip_object);
return bryce;
}
Z_API Evas_Object *
z_bryce_site_get(Evas_Object *bryce)
{
BRYCE_GET(bryce);
return b->site;
}
Z_API void
z_bryce_autosize_set(Evas_Object *bryce, Eina_Bool set)
{
int w, h;
BRYCE_GET(bryce);
set = !!set;
if (b->autosize == set) return;
b->autosize = set;
if (set)
{
_bryce_autosize(b);
return;
}
evas_object_geometry_get(b->parent, NULL, NULL, &w, &h);
_bryce_position(b, w, h);
}
Z_API void
z_bryce_autohide_set(Evas_Object *bryce, Eina_Bool set)
{
BRYCE_GET(bryce);
set = !!set;
if (b->autohide == set) return;
b->autohide = set;
if (set)
{
int x, y, w, h;
b->autohide_event = evas_object_rectangle_add(evas_object_evas_get(bryce));
evas_object_geometry_get(bryce, &x, &y, &w, &h);
evas_object_geometry_set(b->autohide_event, x, y, w, h);
evas_object_color_set(b->autohide_event, 0, 0, 0, 0);
evas_object_repeat_events_set(b->autohide_event, 1);
evas_object_layer_set(b->autohide_event, E_LAYER_POPUP);
evas_object_show(b->autohide_event);
evas_object_event_callback_add(b->autohide_event, EVAS_CALLBACK_MOUSE_IN, _bryce_autohide_mouse_in, b);
evas_object_event_callback_add(b->autohide_event, EVAS_CALLBACK_MOUSE_OUT, _bryce_autohide_mouse_out, b);
evas_object_event_callback_add(bryce, EVAS_CALLBACK_MOVE, _bryce_autohide_moveresize, b);
evas_object_event_callback_add(bryce, EVAS_CALLBACK_RESIZE, _bryce_autohide_moveresize, b);
ecore_evas_pointer_xy_get(e_comp->ee, &x, &y);
if (!E_INSIDE(x, y, b->x, b->y, w, h))
b->autohide_timer = ecore_timer_add(1.0, (Ecore_Task_Cb)_bryce_autohide_timeout, b);
}
else
{
E_FREE_FUNC(b->autohide_event, evas_object_del);
evas_object_event_callback_del_full(bryce, EVAS_CALLBACK_MOVE, _bryce_autohide_moveresize, b);
evas_object_event_callback_del_full(bryce, EVAS_CALLBACK_RESIZE, _bryce_autohide_moveresize, b);
if (!b->hidden) return;
efx_move(b->bryce, EFX_EFFECT_SPEED_LINEAR, EFX_POINT(b->x, b->y), 0.5, _bryce_autohide_end, b);
b->animating = 1;
b->hidden = 0;
}
}

9
src/gadgets/bryce.h Normal file
View File

@ -0,0 +1,9 @@
#ifndef BRYCE_H
# define BRYCE_H
Z_API Evas_Object *z_bryce_add(Evas_Object *parent);
Z_API Evas_Object *z_bryce_site_get(Evas_Object *bryce);
Z_API void z_bryce_autosize_set(Evas_Object *bryce, Eina_Bool set);
Z_API void z_bryce_autohide_set(Evas_Object *bryce, Eina_Bool set);
#endif

View File

@ -256,7 +256,7 @@ _site_layout(Evas_Object *o, Evas_Object_Box_Data *priv EINA_UNUSED, void *data)
Evas_Coord gx = xx, gy = yy;
int ww, hh, ow, oh;
_site_gadget_resize(zgc->gadget, w - (xx - x), h - (yy - y), &ww, &hh, &ow, &oh);
_site_gadget_resize(zgc->gadget, w, h, &ww, &hh, &ow, &oh);
if (IS_HORIZ(zgs->orient))
gx += (Evas_Coord)(((double)(ww - ow)) * 0.5),
gy += (h / 2) - (oh / 2);
@ -293,7 +293,7 @@ _site_layout(Evas_Object *o, Evas_Object_Box_Data *priv EINA_UNUSED, void *data)
Evas_Coord gx = xx, gy = yy;
int ww, hh, ow, oh;
_site_gadget_resize(zgc->gadget, w - (xx - x), h - (yy - y), &ww, &hh, &ow, &oh);
_site_gadget_resize(zgc->gadget, w, h, &ww, &hh, &ow, &oh);
if (IS_HORIZ(zgs->orient))
gx -= (Evas_Coord)(((double)(ww - ow)) * 0.5) + ow,
gy += (h / 2) - (oh / 2);
@ -312,9 +312,14 @@ _site_layout(Evas_Object *o, Evas_Object_Box_Data *priv EINA_UNUSED, void *data)
if (IS_HORIZ(zgs->orient))
zgs->cur_size = abs((ax * w) - px) - x;
else
else if (IS_VERT(zgs->orient))
zgs->cur_size = abs((ay * h) - py) - y;
fprintf(stderr, "SITE: %dx%d\n", IS_HORIZ(zgs->orient) ? zgs->cur_size : w,
IS_VERT(zgs->orient) ? zgs->cur_size : h);
evas_object_size_hint_min_set(zgs->layout,
IS_HORIZ(zgs->orient) ? zgs->cur_size : w,
IS_VERT(zgs->orient) ? zgs->cur_size : h);
/* do layout for fixed position gadgets after */
EINA_LIST_REVERSE_FOREACH(zgs->fixed_gadgets, l, zgc)
{
@ -803,7 +808,7 @@ z_gadget_site_anchor_get(Evas_Object *obj)
}
Z_API void
z_gadget_site_owner_set(Evas_Object *obj, Z_Gadget_Site_Anchor an, Z_Gadget_Style_Cb cb)
z_gadget_site_owner_setup(Evas_Object *obj, Z_Gadget_Site_Anchor an, Z_Gadget_Style_Cb cb)
{
ZGS_GET(obj);
@ -860,7 +865,7 @@ z_gadget_site_gadget_add(Evas_Object *obj, const char *type)
zgc->site = zgs;
evas_object_data_set(g, "__z_gadget", zgc);
if (zgs->style_cb)
zgs->style_cb(g, NULL);
zgs->style_cb(elm_object_parent_widget_get(zgs->layout), NULL, g);
evas_object_event_callback_add(g, EVAS_CALLBACK_DEL, _gadget_del, zgc);
zgs->gadgets = eina_list_append(zgs->gadgets, zgc);

View File

@ -1,4 +1,5 @@
#include "gadget.h"
#include "bryce.h"
EINTERN Evas_Object *start_create(Evas_Object *parent, int *id EINA_UNUSED, Z_Gadget_Site_Orient orient);;
@ -6,28 +7,10 @@ EINTERN void clock_init(void);
EINTERN void clock_shutdown(void);
EINTERN void ibar_init(void);
static Evas_Object *shelf;
static Evas_Object *site;
static void
_demo_style(Evas_Object *g, Eina_Stringshare *name)
{
Evas_Object *ly;
static int n;
ly = elm_layout_add(site);
if (n++ % 2)
e_theme_edje_object_set(ly, NULL, "e/shelf/default/inset");
else
e_theme_edje_object_set(ly, NULL, "e/shelf/default/plain");
z_gadget_util_layout_style_init(g, ly);
elm_object_part_content_set(ly, "e.swallow.content", g);
}
EINTERN void
gadget_demo(void)
{
Evas_Object *ly;
Evas_Object *b, *site;
if (!eina_streq(getenv("USER"), "zmike")) return;
@ -36,26 +19,12 @@ gadget_demo(void)
clock_init();
ibar_init();
ly = elm_layout_add(e_comp->elm);
e_theme_edje_object_set(ly, NULL, "e/shelf/default/base");
site = z_gadget_site_add(ly, Z_GADGET_SITE_ORIENT_HORIZONTAL);
z_gadget_site_owner_set(site, Z_GADGET_SITE_ANCHOR_TOP, _demo_style);
elm_object_part_content_set(ly, "e.swallow.content", site);
elm_layout_signal_emit(ly, "e,state,orientation,top", "e");
evas_object_geometry_set(ly, 0, 0, e_comp->w, 48);
//evas_object_geometry_set(ly, 0, 0, 48, e_comp->h);
evas_object_show(ly);
shelf = e_comp_object_util_add(ly, E_COMP_OBJECT_TYPE_NONE);
evas_object_data_set(shelf, "comp_skip", (void*)1);
evas_object_layer_set(shelf, E_LAYER_POPUP);
evas_object_lower(shelf);
evas_object_clip_set(shelf, e_comp_zone_xy_get(0, 0)->bg_clip_object);
b = z_bryce_add(e_comp->elm);
site = z_bryce_site_get(b);
z_gadget_site_gadget_add(site, "Start");
z_gadget_site_gadget_add(site, "Clock");
z_gadget_site_gadget_add(site, "IBar");
z_gadget_site_gadget_add(site, "Clock");
z_gadget_site_gadget_add(site, "IBar");
z_bryce_autosize_set(b, 1);
z_bryce_autohide_set(b, 1);
}

View File

@ -34,11 +34,11 @@ typedef enum
typedef Evas_Object *(*Z_Gadget_Create_Cb)(Evas_Object *parent, int *id, Z_Gadget_Site_Orient orient);
typedef Evas_Object *(*Z_Gadget_Configure_Cb)(Evas_Object *gadget);
typedef void (*Z_Gadget_Style_Cb)(Evas_Object *gadget, Eina_Stringshare *name);
typedef void (*Z_Gadget_Style_Cb)(Evas_Object *owner, Eina_Stringshare *name, Evas_Object *g);
Z_API Evas_Object *z_gadget_site_add(Evas_Object *parent, Z_Gadget_Site_Orient orient);
Z_API Z_Gadget_Site_Anchor z_gadget_site_anchor_get(Evas_Object *obj);
Z_API void z_gadget_site_owner_set(Evas_Object *obj, Z_Gadget_Site_Anchor an, Z_Gadget_Style_Cb cb);
Z_API void z_gadget_site_owner_setup(Evas_Object *obj, Z_Gadget_Site_Anchor an, Z_Gadget_Style_Cb cb);
Z_API Z_Gadget_Site_Orient z_gadget_site_orient_get(Evas_Object *obj);
Z_API Z_Gadget_Site_Gravity z_gadget_site_gravity_get(Evas_Object *obj);
Z_API void z_gadget_site_gadget_add(Evas_Object *obj, const char *type);