Combo work... selecting doesn't seem to work at the moment, and there are valgrind errors. Getting there though.

This commit is contained in:
Jaime Thomas 2008-12-20 06:06:31 +00:00
parent 43dcb1820f
commit 0ac3dc2f40
4 changed files with 291 additions and 50 deletions

View File

@ -1,6 +1,7 @@
/* vim: set sw=3 ts=3 sts=3 expandtab: */ /* vim: set sw=3 ts=3 sts=3 expandtab: */
group { group {
name: "ecdb/button"; name: "ecdb/button";
min: 50 30;
parts { parts {
part { part {

View File

@ -26,7 +26,7 @@ group {
description { description {
state: "active" 0.0; state: "active" 0.0;
inherit: "default" 0.0; inherit: "default" 0.0;
color: 0 0 0 128; color: 0 0 0 90;
} }
} }
} }
@ -204,6 +204,37 @@ group {
} }
} }
} }
part {
name: "ecdb.header";
type: TEXT;
description {
state: "default" 0.0;
color: 60 60 60 255;
align: 0.0 0.5;
rel1 {
to: "combo_button";
relative: 0.0 0.0;
offset: 9 0;
}
rel2 {
to: "combo_button";
relative: 1.0 1.0;
offset: -1 -1;
}
text {
text: "";
font: "ecdb/default";
min: 1 1;
size: 11;
align: 0.0 0.5;
}
}
}
} }
programs { programs {
@ -242,7 +273,7 @@ group {
program { program {
name: "collapse"; name: "collapse";
signal: "ecdb,combo,collapse"; signal: "ecdb,combo,default";
source: "ecdb"; source: "ecdb";
action: STATE_SET "default" 0.0; action: STATE_SET "default" 0.0;
target: "combo_button"; target: "combo_button";
@ -250,7 +281,7 @@ group {
program { program {
name: "expand"; name: "expand";
signal: "ecdb,combo,expand"; signal: "ecdb,combo,active";
source: "ecdb"; source: "ecdb";
action: STATE_SET "clicked" 0.0; action: STATE_SET "clicked" 0.0;
target: "combo_button"; target: "combo_button";
@ -288,5 +319,98 @@ group {
source: "ecdb"; source: "ecdb";
target: "combo_button"; target: "combo_button";
} }
}
}
group {
name: "ecdb/combo/popup";
parts {
part {
name: "base";
type: IMAGE;
description {
state: "default" 0.0;
min: 1 1;
max: 1 1;
color: 255 255 255 0;
visible: 1;
rel1 {
relative: 0.0 0.0;
offset: 0 0;
}
rel2 {
relative: 1.0 1.0;
offset: -1 -1;
}
image {
normal: "background.png";
}
}
description {
state: "active" 0.0;
inherit: "default" 0.0;
color: 255 255 255 200;
max: 9999 9999;
}
}
part {
name: "ecdb.box";
type: BOX;
description {
state: "default" 0.0;
color: 255 255 255 0;
rel1 {
to: "base";
}
rel2 {
to: "base";
}
box {
layout: "min_size";
padding: 1 1;
align: 0.0 0.5;
}
}
description {
state: "active" 0.0;
inherit: "default" 0.0;
color: 255 255 255 255;
}
}
}
programs {
program {
name: "expand";
signal: "ecdb,combo,popup,show,*";
source: "ecdb";
action: STATE_SET "active" 0.0;
target: "base";
target: "ecdb.box";
transition: DECELERATE 0.2;
}
program {
name: "collapse";
signal: "ecdb,combo,popup,hide,*";
source: "ecdb";
action: STATE_SET "default" 0.0;
target: "base";
target: "ecdb.box";
transition: DECELERATE 0.2;
}
}
} }

View File

@ -775,8 +775,8 @@ ecdb_erase_page_show(void)
EINA_LIST_FOREACH(em->drives, l, drive) EINA_LIST_FOREACH(em->drives, l, drive)
{ {
d = ecdb_button_add(swallow, NULL); d = ecdb_button_add(b, NULL);
ecdb_button_label_set(d, drive->location); ecdb_button_label_set(d, drive->product);
ecdb_combo_append(b, d); ecdb_combo_append(b, d);
evas_object_show(d); evas_object_show(d);
} }

View File

@ -282,6 +282,45 @@ ecdb_entry_text_get(Evas_Object *e)
/****************************** COMBO ****************************************/ /****************************** COMBO ****************************************/
typedef struct _Combo_Data Combo_Data;
struct _Combo_Data
{
Evas_Object *parent;
Evas_Object *back;
Evas_Object *popup;
unsigned int expanded;
unsigned int count;
const char *name;
};
static void
_combo_min_size(Evas_Object *o, Evas_Object_Box_Data *p, void *data)
{
Eina_List *l;
Evas_Object_Box_Option *opt;
int offset_x, offset_y;
int w, h, y;
int wt, ht, xt, yt;
if (eina_list_count(p->children) <= 0)
return;
evas_object_geometry_get(o, &offset_x, &offset_y, &w, &h);
y = offset_y + (h / 2);
EINA_LIST_FOREACH(p->children, l, opt)
{
edje_object_size_min_get(eina_list_nth(p->children, 0), NULL, &h);
evas_object_geometry_get(opt->obj, &xt, &yt, &wt, &ht);
if ((wt != w) || (ht != h))
evas_object_resize(opt->obj, w, h);
if ((xt != 0) || (yt != y))
evas_object_move(opt->obj, offset_x, y);
y += h;
}
}
// Axis preferential -- for now vertical // Axis preferential -- for now vertical
const char * const char *
_combo_best_location(Evas_Object *c) _combo_best_location(Evas_Object *c)
@ -292,7 +331,7 @@ _combo_best_location(Evas_Object *c)
ecore_evas_geometry_get(em->main_win_ee, NULL, NULL, &ww, &wh); ecore_evas_geometry_get(em->main_win_ee, NULL, NULL, &ww, &wh);
evas_object_geometry_get(c, &x, &y, &w, &h); evas_object_geometry_get(c, &x, &y, &w, &h);
if ((w) > (ww - x - w)) if ((h) > (wh - y - h))
{ {
return "top"; return "top";
} }
@ -302,67 +341,107 @@ _combo_best_location(Evas_Object *c)
} }
} }
static void
_combo_del(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
Combo_Data *cd;
cd = evas_object_data_get(data, "cd");
eina_stringshare_del(cd->name);
FREE(cd);
}
static void static void
_combo_resize(void *data, Evas *e, Evas_Object *obj, void *event_info) _combo_resize(void *data, Evas *e, Evas_Object *obj, void *event_info)
{ {
Evas_Object *c, *back; Combo_Data *cd;
int w, h;
// Deal with popup? cd = evas_object_data_get(data, "cd");
c = data; if (cd->expanded)
back = evas_object_data_get(c, "back"); ecdb_combo_collapse(data);
evas_object_move(back, 0, 0);
ecore_evas_geometry_get(em->main_win_ee, NULL, NULL, &w, &h);
evas_object_resize(back, w, h);
} }
static void static void
_combo_hide(void *data, Evas *e, Evas_Object *obj, void *event_info) _combo_hide(void *data, Evas *e, Evas_Object *obj, void *event_info)
{ {
Combo_Data *cd;
cd = evas_object_data_get(data, "cd");
if (cd->expanded)
ecdb_combo_collapse(data); ecdb_combo_collapse(data);
} }
static void static void
_combo_clicked(void *data, Evas_Object *obj, void *event_info) _combo_clicked(void *data, Evas_Object *obj, void *event_info)
{ {
printf("object clicked...");
}
static void
_combo_moveable_click_cb(void *data, Evas_Object *obj, const char *emission,
const char *source)
{
Combo_Data *cd;
cd = evas_object_data_get(data, "cd");
if (cd->expanded)
ecdb_combo_collapse(data); ecdb_combo_collapse(data);
} }
void static void
_combo_click_cb(void *data, Evas_Object *obj, const char *emission, _combo_click_cb(void *data, Evas_Object *obj, const char *emission,
const char *source) const char *source)
{ {
evas_object_smart_callback_call(obj, "clicked", NULL); Evas_Object *c;
ecdb_combo_expand(obj); Combo_Data *cd;
}
void c = data;
_combo_back_clicked_cb(void *data, Evas_Object *obj, const char *emission, cd = evas_object_data_get(c, "cd");
const char *source) if ((cd) && (!cd->expanded))
{ ecdb_combo_expand(c);
ecdb_combo_collapse(data); else
ecdb_combo_collapse(c);
evas_object_smart_callback_call(c, "clicked", NULL);
} }
Evas_Object * Evas_Object *
ecdb_combo_add(Evas_Object *parent, const char *name) ecdb_combo_add(Evas_Object *parent, const char *name)
{ {
Evas_Object *c, *back; Evas_Object *c;
Combo_Data *cd;
c = ecdb_widget_add(parent, name); c = ecdb_widget_add(parent, name);
edje_object_file_set(c, em->theme_path, "ecdb/combo"); edje_object_file_set(c, em->theme_path, "ecdb/combo");
evas_object_event_callback_add(parent, EVAS_CALLBACK_RESIZE, _combo_resize, evas_object_event_callback_add(parent, EVAS_CALLBACK_RESIZE, _combo_resize,
c); c);
evas_object_event_callback_add(parent, EVAS_CALLBACK_HIDE, _combo_hide, c); evas_object_event_callback_add(parent, EVAS_CALLBACK_HIDE, _combo_hide, c);
evas_object_event_callback_add(c, EVAS_CALLBACK_DEL, _combo_del, c);
edje_object_signal_callback_add(c, "ecdb,combo,clicked", "ecdb", edje_object_signal_callback_add(c, "ecdb,combo,clicked", "ecdb",
_combo_click_cb, c); _combo_click_cb, c);
back = edje_object_add(evas_object_evas_get(parent)); cd = calloc(1, sizeof(Combo_Data));
edje_object_file_set(back, em->theme_path, "ecdb/combo/background");
edje_object_signal_callback_add(back, "ecdb,combo,back,dismiss", "ecdb", cd->back = edje_object_add(evas_object_evas_get(parent));
_combo_back_clicked_cb, c); edje_object_file_set(cd->back, em->theme_path, "ecdb/combo/background");
evas_object_data_set(c, "back", back); edje_object_signal_callback_add(cd->back, "ecdb,combo,back,dismiss", "ecdb",
evas_object_pass_events_set(back, 1); _combo_moveable_click_cb, c);
evas_object_show(back); evas_object_pass_events_set(cd->back, 1);
evas_object_show(cd->back);
cd->popup = edje_object_add(evas_object_evas_get(parent));
edje_object_file_set(cd->popup, em->theme_path, "ecdb/combo/popup");
edje_object_signal_callback_add(cd->back, "ecdb,combo,back,dismiss", "ecdb",
_combo_moveable_click_cb, c);
edje_box_layout_register("min_size", _combo_min_size, NULL, NULL, NULL,
NULL);
evas_object_pass_events_set(cd->popup, 1);
evas_object_show(cd->popup);
cd->parent = parent;
cd->name = eina_stringshare_add(name);
evas_object_data_set(c, "cd", cd);
return c; return c;
} }
@ -376,38 +455,75 @@ ecdb_combo_header_set(Evas_Object *c, const char *text)
void void
ecdb_combo_append(Evas_Object *c, Evas_Object *o) ecdb_combo_append(Evas_Object *c, Evas_Object *o)
{ {
edje_object_part_box_append(c, "ecdb.box", o); Combo_Data *cd;
cd = evas_object_data_get(c, "cd");
cd->count++;
edje_object_part_box_append(cd->popup, "ecdb.box", o);
evas_object_smart_callback_add(o, "clicked", _combo_clicked, c); evas_object_smart_callback_add(o, "clicked", _combo_clicked, c);
} }
void void
ecdb_combo_expand(Evas_Object *c) ecdb_combo_expand(Evas_Object *c)
{ {
Evas_Object *back; Combo_Data *cd;
const char *location; const char *location;
//char buf[1024]; char buf[1024];
int w, h; int x, y, w, h, h2;
int box_height = 30;
cd = evas_object_data_get(c, "cd");
edje_object_signal_emit(c, "ecdb,combo,active", "ecdb");
evas_object_move(cd->back, 0, 0);
ecore_evas_geometry_get(em->main_win_ee, NULL, NULL, &w, &h);
evas_object_resize(cd->back, w, h);
evas_object_pass_events_set(cd->back, 0);
evas_object_layer_set(cd->back, evas_object_layer_get(c) + 1);
edje_object_signal_emit(cd->back, "ecdb,combo,back,show", "ecdb");
location = _combo_best_location(c); location = _combo_best_location(c);
edje_object_signal_emit(c, "ecdb,combo,expand", "ecdb"); snprintf(buf, sizeof(buf), "ecdb,combo,popup,show,%s", location);
evas_object_geometry_get(c, &x, &y, &w, &h);
back = evas_object_data_get(c, "back"); h2 = box_height * cd->count;
evas_object_move(back, 0, 0); if (!strcmp(location, "top"))
ecore_evas_geometry_get(em->main_win_ee, NULL, NULL, &w, &h); evas_object_move(cd->popup, x, y - h2);
evas_object_resize(back, w, h); else
evas_object_pass_events_set(back, 0); evas_object_move(cd->popup, x, y + h);
evas_object_layer_set(back, evas_object_layer_get(c) + 1);
edje_object_signal_emit(back, "ecdb,combo,back,show", "ecdb"); evas_object_resize(cd->popup, w, h2);
evas_object_pass_events_set(cd->popup, 0);
evas_object_layer_set(cd->popup, evas_object_layer_get(cd->back) + 1);
edje_object_signal_emit(cd->popup, buf, "ecdb");
cd->expanded = 1;
} }
void void
ecdb_combo_collapse(Evas_Object *c) ecdb_combo_collapse(Evas_Object *c)
{ {
Evas_Object *back; Combo_Data *cd;
const char *location;
char buf[1024];
back = evas_object_data_get(c, "back"); // If we close the window
edje_object_signal_emit(back, "ecdb,combo,back,hide", "ecdb"); if ((!em) || (!em->main_win_ee))
evas_object_pass_events_set(back, 1); return;
edje_object_signal_emit(c, "ecdb,combo,collapse", "ecdb");
cd = evas_object_data_get(c, "cd");
edje_object_signal_emit(cd->back, "ecdb,combo,back,hide", "ecdb");
evas_object_pass_events_set(cd->back, 1);
edje_object_signal_emit(c, "ecdb,combo,default", "ecdb");
location = _combo_best_location(c);
snprintf(buf, sizeof(buf), "ecdb,combo,popup,hide,%s", location);
evas_object_pass_events_set(cd->popup, 1);
edje_object_signal_emit(cd->popup, buf, "ecdb");
cd->expanded = 0;
} }