1. fix scale property fetch

2. add hover object - beginning to work. will be used to pop up menus/options
etc.



SVN revision: 36515
This commit is contained in:
Carsten Haitzler 2008-10-08 06:38:20 +00:00
parent e8bfcbd777
commit c78abf03be
8 changed files with 401 additions and 13 deletions

View File

@ -2119,6 +2119,54 @@ collections {
}
}
///////////////////////////////////////////////////////////////////////////////
group { name: "hover";
images {
image: "bt_base1.png" COMP;
image: "bt_base2.png" COMP;
image: "bt_hilight.png" COMP;
image: "bt_shine.png" COMP;
}
parts {
part { name: "base";
type: RECT;
mouse_events: 1;
description { state: "default" 0.0;
color: 0 0 0 200;
}
}
part { name: "box";
type: RECT;
mouse_events: 0;
description { state: "default" 0.0;
color: 255 255 255 200;
rel1.to: "elm.swallow.size";
rel1.offset: -2 -2;
rel2.to: "elm.swallow.size";
rel2.offset: 1 1;
}
}
part { name: "elm.swallow.offset";
type: SWALLOW;
description { state: "default" 0.0;
align: 0.0 0.0;
rel1.relative: 0.0 0.0;
rel2.relative: 0.0 0.0;
}
}
part { name: "elm.swallow.size";
type: SWALLOW;
description { state: "default" 0.0;
align: 0.0 0.0;
rel1.to: "elm.swallow.offset";
rel1.relative: 1.0 1.0;
rel2.to: "elm.swallow.offset";
rel2.relative: 1.0 1.0;
}
}
}
}
///////////////////////////////////////////////////////////////////////////////
group { name: "contact";
images {
@ -2126,7 +2174,7 @@ collections {
image: "bt_base2.png" COMP;
image: "bt_hilight.png" COMP;
image: "bt_shine.png" COMP;
}
}
parts {
part { name: "button_image";
mouse_events: 1;

View File

@ -425,7 +425,7 @@ my_bt_9(void *data, Evas_Object *obj, void *event_info)
static void
my_bt_10(void *data, Evas_Object *obj, void *event_info)
{
Evas_Object *win, *bg, *ly, *ck, *bt;
Evas_Object *win, *bg, *ly, *bt;
char buf[PATH_MAX];
win = elm_win_add(NULL, "layout", ELM_WIN_BASIC);
@ -462,6 +462,50 @@ my_bt_10(void *data, Evas_Object *obj, void *event_info)
evas_object_show(win);
}
static void
my_hover_bt_1(void *data, Evas_Object *obj, void *event_info)
{
Evas_Object *hv = data;
evas_object_show(hv);
}
static void
my_bt_11(void *data, Evas_Object *obj, void *event_info)
{
Evas_Object *win, *bg, *bx, *bt, *hv;
char buf[PATH_MAX];
win = elm_win_add(NULL, "hover", ELM_WIN_BASIC);
elm_win_title_set(win, "Hover");
elm_win_autodel_set(win, 1);
bg = elm_bg_add(win);
elm_win_resize_object_add(win, bg);
evas_object_size_hint_weight_set(bg, 1.0, 1.0);
evas_object_show(bg);
bx = elm_box_add(win);
evas_object_size_hint_weight_set(bx, 1.0, 1.0);
elm_win_resize_object_add(win, bx);
evas_object_show(bx);
hv = elm_hover_add(win);
bt = elm_button_add(win);
elm_button_label_set(bt, "Button");
evas_object_smart_callback_add(bt, "clicked", my_hover_bt_1, hv);
elm_box_pack_end(bx, bt);
evas_object_show(bt);
elm_hover_parent_set(hv, win);
elm_hover_target_set(hv, bt);
evas_object_size_hint_min_set(bg, 160, 160);
evas_object_size_hint_max_set(bg, 640, 640);
evas_object_resize(win, 320, 320);
evas_object_show(win);
}
static void
my_win_main(void)
{
@ -625,6 +669,13 @@ my_win_main(void)
elm_box_pack_end(bx, bt);
evas_object_show(bt);
bt = elm_button_add(win);
elm_button_label_set(bt, "Hover");
evas_object_smart_callback_add(bt, "clicked", my_bt_11, NULL);
evas_object_size_hint_align_set(bt, -1.0, 0.0);
elm_box_pack_end(bx, bt);
evas_object_show(bt);
/* set an initial window size */
evas_object_resize(win, 320, 320);
/* show the window */

View File

@ -171,6 +171,12 @@ extern "C" {
/* smart callbacks elm_win objects will call:
*/
EAPI Evas_Object *elm_hover_add(Evas_Object *parent);
EAPI void elm_hover_target_set(Evas_Object *obj, Evas_Object *target);
EAPI void elm_hover_parent_set(Evas_Object *obj, Evas_Object *parent);
/* smart callbacks elm_win objects will call:
*/
// FIXME: fixes to do
// * current sizing inefficient
// * scroller could do with page up/down/left/right buttons and and idea of

View File

@ -31,6 +31,7 @@ elm_frame.c \
elm_table.c \
elm_clock.c \
elm_layout.c \
elm_hover.c \
\
els_pan.c \
els_pan.h \

View File

@ -0,0 +1,228 @@
#include <Elementary.h>
#include "elm_priv.h"
typedef struct _Widget_Data Widget_Data;
typedef struct _Subinfo Subinfo;
struct _Widget_Data
{
Evas_Object *hov;
Evas_Object *cov;
Evas_Object *offset, *size;
Evas_Object *parent, *target;
Evas_List *subs;
};
struct _Subinfo
{
const char *swallow;
Evas_Object *obj;
};
static void _del_hook(Evas_Object *obj);
static void _sizing_eval(Evas_Object *obj);
static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info);
static void _sub_del(void *data, Evas_Object *obj, void *event_info);
static void
_del_hook(Evas_Object *obj)
{
Widget_Data *wd = elm_widget_data_get(obj);
/*
while (wd->subs)
{
Subinfo *si = wd->subs->data;
wd->subs = evas_list_remove_list(wd->subs, wd->subs);
evas_stringshare_del(si->swallow);
free(si);
}
*/
free(wd);
}
static void
_sizing_eval(Evas_Object *obj)
{
Widget_Data *wd = elm_widget_data_get(obj);
Evas_Coord x = 0, y = 0, w = 0, h = 0, x2 = 0, y2 = 0, w2 = 0, h2 = 0;
if (wd->parent) evas_object_geometry_get(wd->parent, &x, &y, &w, &h);
if (wd->hov) evas_object_geometry_get(wd->hov, &x2, &y2, &w2, &h2);
evas_object_move(wd->cov, x, y);
evas_object_resize(wd->cov, w, h);
evas_object_size_hint_min_set(wd->offset, x2 - x, y2 - y);
edje_object_part_swallow(wd->hov, "elm.swallow.offset", wd->offset);
evas_object_size_hint_min_set(wd->size, w2, h2);
edje_object_part_swallow(wd->hov, "elm.swallow.size", wd->size);
}
static void
_changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
Widget_Data *wd = elm_widget_data_get(data);
Evas_List *l;
/*
for (l = wd->subs; l; l = l->next)
{
Subinfo *si = l->data;
if (si->obj == obj)
{
edje_object_part_swallow(wd->hov, si->swallow, obj);
_sizing_eval(obj);
break;
}
}
*/
}
static void
_sub_del(void *data, Evas_Object *obj, void *event_info)
{
Widget_Data *wd = elm_widget_data_get(obj);
Evas_Object *sub = event_info;
Evas_List *l;
/*
for (l = wd->subs; l; l = l->next)
{
Subinfo *si = l->data;
if (si->obj == sub)
{
evas_object_event_callback_del
(sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints);
wd->subs = evas_list_remove_list(wd->subs, l);
evas_stringshare_del(si->swallow);
free(si);
break;
}
}
*/
}
static void
_hov_move(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
_sizing_eval(data);
}
static void
_hov_resize(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
_sizing_eval(data);
}
static void
_hov_show(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
Widget_Data *wd = elm_widget_data_get(data);
evas_object_show(wd->cov);
}
static void
_hov_hide(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
Widget_Data *wd = elm_widget_data_get(data);
evas_object_hide(wd->cov);
}
static void
_cov_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
Widget_Data *wd = elm_widget_data_get(data);
evas_object_smart_callback_call(data, "clicked", NULL);
evas_object_hide(data);
}
EAPI Evas_Object *
elm_hover_add(Evas_Object *parent)
{
Evas_Object *obj;
Evas *e;
Widget_Data *wd;
wd = ELM_NEW(Widget_Data);
e = evas_object_evas_get(parent);
obj = elm_widget_add(e);
elm_widget_data_set(obj, wd);
elm_widget_del_hook_set(obj, _del_hook);
wd->hov = evas_object_rectangle_add(e);
evas_object_color_set(wd->hov, 0, 0, 0, 0);
elm_widget_resize_object_set(obj, wd->hov);
evas_object_event_callback_add(wd->hov, EVAS_CALLBACK_MOVE, _hov_move, obj);
evas_object_event_callback_add(wd->hov, EVAS_CALLBACK_RESIZE, _hov_resize, obj);
evas_object_event_callback_add(wd->hov, EVAS_CALLBACK_SHOW, _hov_show, obj);
evas_object_event_callback_add(wd->hov, EVAS_CALLBACK_HIDE, _hov_hide, obj);
wd->cov = edje_object_add(e);
_elm_theme_set(wd->cov, "hover", "hover");
elm_widget_sub_object_add(obj, wd->cov);
evas_object_event_callback_add(wd->cov, EVAS_CALLBACK_MOUSE_DOWN, _cov_down, obj);
wd->offset = evas_object_rectangle_add(e);
evas_object_color_set(wd->offset, 0, 0, 0, 0);
elm_widget_sub_object_add(obj, wd->offset);
wd->size = evas_object_rectangle_add(e);
evas_object_color_set(wd->size, 0, 0, 0, 0);
elm_widget_sub_object_add(obj, wd->size);
edje_object_part_swallow(wd->hov, "elm.swallow.offset", wd->offset);
edje_object_part_swallow(wd->hov, "elm.swallow.size", wd->size);
evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj);
_sizing_eval(obj);
return obj;
}
EAPI void
elm_hover_target_set(Evas_Object *obj, Evas_Object *target)
{
Widget_Data *wd = elm_widget_data_get(obj);
wd->target = target;
elm_widget_hover_object_set(target, obj);
_sizing_eval(obj);
}
EAPI void
elm_hover_parent_set(Evas_Object *obj, Evas_Object *parent)
{
Widget_Data *wd = elm_widget_data_get(obj);
wd->parent = parent;
elm_widget_sub_object_add(parent, obj);
_sizing_eval(obj);
}
/*
EAPI void
elm_hover_content_set(Evas_Object *obj, const char *swallow, Evas_Object *content)
{
Widget_Data *wd = elm_widget_data_get(obj);
Subinfo *si;
Evas_List *l;
for (l = wd->subs; l; l = l->next)
{
si = l->data;
if (!strcmp(swallow, si->swallow))
{
if (content == si->obj) return;
elm_widget_sub_object_del(obj, si->obj);
break;
}
}
if (content)
{
edje_object_part_swallow(wd->hov, swallow, content);
elm_widget_sub_object_add(obj, content);
evas_object_event_callback_add(content, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
_changed_size_hints, obj);
si = ELM_NEW(Subinfo);
si->swallow = evas_stringshare_add(swallow);
si->obj = content;
wd->subs = evas_list_append(wd->subs, si);
_sizing_eval(obj);
}
}
*/

View File

@ -42,13 +42,15 @@ elm_init(int argc, char **argv)
(_elm_config->engine == ELM_XRENDER_X11) ||
(_elm_config->engine == ELM_OPENGL_X11))
{
int val;
int val = 1000;
ecore_x_init(NULL);
if (ecore_x_window_prop_card32_get(ecore_x_window_root_first_get(),
ecore_x_atom_get("ENLIGHTENMENT_SCALE"),
&val, 1))
_elm_config->scale = (double)val / 1000.0;
&val, 1) > 0)
{
if (val > 0) _elm_config->scale = (double)val / 1000.0;
}
}
}

View File

@ -47,6 +47,7 @@ EAPI void *elm_widget_data_get(Evas_Object *obj);
EAPI void elm_widget_sub_object_add(Evas_Object *obj, Evas_Object *sobj);
EAPI void elm_widget_sub_object_del(Evas_Object *obj, Evas_Object *sobj);
EAPI void elm_widget_resize_object_set(Evas_Object *obj, Evas_Object *sobj);
EAPI void elm_widget_hover_object_set(Evas_Object *obj, Evas_Object *sobj);
EAPI void elm_widget_can_focus_set(Evas_Object *obj, int can_focus);
EAPI int elm_widget_can_focus_get(Evas_Object *obj);
EAPI int elm_widget_focus_get(Evas_Object *obj);

View File

@ -2,8 +2,8 @@
#include "elm_priv.h"
#define SMART_NAME "e_widget"
#define API_ENTRY Smart_Data *sd; sd = evas_object_smart_data_get(obj); if ((!obj) || (!sd) || (evas_object_type_get(obj) && strcmp(evas_object_type_get(obj), SMART_NAME)))
#define INTERNAL_ENTRY Smart_Data *sd; sd = evas_object_smart_data_get(obj); if (!sd) return;
#define API_ENTRY Smart_Data *sd = evas_object_smart_data_get(obj); if ((!obj) || (!sd) || (evas_object_type_get(obj) && strcmp(evas_object_type_get(obj), SMART_NAME)))
#define INTERNAL_ENTRY Smart_Data *sd = evas_object_smart_data_get(obj); if (!sd) return;
typedef struct _Smart_Data Smart_Data;
struct _Smart_Data
@ -11,8 +11,8 @@ struct _Smart_Data
Evas_Object *parent_obj;
Evas_Coord x, y, w, h;
Evas_List *subobjs;
Evas_List *hovers;
Evas_Object *resize_obj;
Evas_Object *hover_obj;
void (*del_func) (Evas_Object *obj);
void (*focus_func) (Evas_Object *obj);
void (*activate_func) (Evas_Object *obj);
@ -44,6 +44,15 @@ static void _smart_init(void);
/* local subsystem globals */
static Evas_Smart *_e_smart = NULL;
static void
_sub_obj_del(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
Smart_Data *sd = data;
if (obj == sd->resize_obj) sd->resize_obj = NULL;
else if (obj == sd->hover_obj) sd->hover_obj = NULL;
else sd->subobjs = evas_list_remove(sd->subobjs, obj);
}
/* externally accessible functions */
EAPI Evas_Object *
elm_widget_add(Evas *evas)
@ -147,11 +156,35 @@ EAPI void
elm_widget_resize_object_set(Evas_Object *obj, Evas_Object *sobj)
{
API_ENTRY return;
if (sd->resize_obj) evas_object_smart_member_del(sd->resize_obj);
if (sd->resize_obj)
{
evas_object_event_callback_del(sd->resize_obj, EVAS_CALLBACK_DEL, _sub_obj_del);
evas_object_smart_member_del(sd->resize_obj);
}
sd->resize_obj = sobj;
evas_object_smart_member_add(sobj, obj);
_smart_reconfigure(sd);
evas_object_smart_callback_call(obj, "sub-object-add", sobj);
if (sd->resize_obj)
{
evas_object_smart_member_add(sobj, obj);
evas_object_event_callback_add(sobj, EVAS_CALLBACK_DEL, _sub_obj_del, sd);
_smart_reconfigure(sd);
evas_object_smart_callback_call(obj, "sub-object-add", sobj);
}
}
EAPI void
elm_widget_hover_object_set(Evas_Object *obj, Evas_Object *sobj)
{
API_ENTRY return;
if (sd->hover_obj)
{
evas_object_event_callback_del(sd->hover_obj, EVAS_CALLBACK_DEL, _sub_obj_del);
}
sd->hover_obj = sobj;
if (sd->hover_obj)
{
evas_object_event_callback_add(sobj, EVAS_CALLBACK_DEL, _sub_obj_del, sd);
_smart_reconfigure(sd);
}
}
EAPI void
@ -439,7 +472,12 @@ _smart_reconfigure(Smart_Data *sd)
{
evas_object_move(sd->resize_obj, sd->x, sd->y);
evas_object_resize(sd->resize_obj, sd->w, sd->h);
}
}
if (sd->hover_obj)
{
evas_object_move(sd->hover_obj, sd->x, sd->y);
evas_object_resize(sd->hover_obj, sd->w, sd->h);
}
}
static void
@ -464,10 +502,23 @@ _smart_del(Evas_Object *obj)
INTERNAL_ENTRY;
if (sd->del_func) sd->del_func(obj);
if (sd->resize_obj)
{
evas_object_event_callback_del(sd->resize_obj, EVAS_CALLBACK_DEL, _sub_obj_del);
sd->resize_obj = NULL;
evas_object_del(sd->resize_obj);
}
if (sd->hover_obj)
{
evas_object_event_callback_del(sd->hover_obj, EVAS_CALLBACK_DEL, _sub_obj_del);
sd->hover_obj = NULL;
evas_object_del(sd->hover_obj);
}
while (sd->subobjs)
{
sobj = sd->subobjs->data;
sd->subobjs = evas_list_remove_list(sd->subobjs, sd->subobjs);
evas_object_event_callback_del(sobj, EVAS_CALLBACK_DEL, _sub_obj_del);
evas_object_del(sobj);
}
free(sd);