Avoid infinite recalculation loop.

This commit is contained in:
Jaime Thomas 2008-12-21 00:09:07 +00:00
parent acce34c9dc
commit 7f0f6159a8
6 changed files with 128 additions and 20 deletions

View File

@ -6,3 +6,4 @@
-> more configuration options (speed and drive choice)
-> fix combo theme
-> vlagrind errors in evas_box--
-> move callbacks to buttons instead of swallow

View File

@ -120,6 +120,50 @@ group {
}
}
part {
name: "ecdb/burn_image/drive";
type: SWALLOW;
repeat_events: 1;
description {
state: "default" 0.0;
rel1 {
to: "ecdb/burn_image/file";
relative: 0.0 1.0;
offset: 0 5;
}
rel2 {
to: "ecdb/burn_image/file";
relative: 1.0 1.0;
offset: 0 30;
}
}
}
part {
name: "ecdb/burn_image/speed";
type: SWALLOW;
repeat_events: 1;
description {
state: "default" 0.0;
rel1 {
to: "ecdb/burn_image/drive";
relative: 0.0 1.0;
offset: 0 5;
}
rel2 {
to: "ecdb/burn_image/drive";
relative: 1.0 1.0;
offset: 0 30;
}
}
}
part {
name: "progress_outline";
type: IMAGE;

View File

@ -431,7 +431,7 @@ group {
}
box {
layout: "min_size";
layout: "vertical";
padding: 1 1;
align: 0.0 0.5;
}

View File

@ -806,8 +806,12 @@ ecdb_burn_image_page_show(void)
if (!swallow)
{
Evas_Object *b;
Evas_Object *b, *c1, *c2;
Eina_List *l;
Ecdb_Drive_Info *drive;
Evas_Coord x, y, w, h;
char buf[1024];
int i, write_speed_count;
swallow = edje_object_add(ecore_evas_get(em->main_win_ee));
edje_object_file_set(swallow, em->theme_path, "ecdb/burn_image_page");
@ -842,6 +846,37 @@ ecdb_burn_image_page_show(void)
b = ecdb_entry_add(swallow, "ecdb/burn_image/file");
ecdb_entry_text_set(b, "Burn File");
evas_object_show(b);
c1 = ecdb_combo_add(swallow, "ecdb/burn_image/drive");
ecdb_combo_header_set(c1, "Drive");
evas_object_show(c1);
c2 = ecdb_combo_add(swallow, "ecdb/burn_image/speed");
ecdb_combo_header_set(c2, "Speed");
evas_object_show(c2);
EINA_LIST_FOREACH(em->drives, l, drive)
{
b = ecdb_button_add(c1, NULL);
ecdb_button_label_set(b, drive->product);
ecdb_combo_append(c1, b);
evas_object_show(b);
// Need to set this
write_speed_count = drive->write_speeds[0];
for (i = 1; i < write_speed_count; i++)
{
if (drive->write_speeds[i] <= 0)
break;
b = ecdb_button_add(c2, NULL);
snprintf(buf, sizeof(buf), "%d", drive->write_speeds[i]);
printf("speed: %d\n", drive->write_speeds[i]);
ecdb_button_label_set(b, buf);
ecdb_combo_append(c2, b);
evas_object_show(b);
}
}
}
else if (edje_object_part_swallow_get(gui, "action_area") != swallow)

View File

@ -303,6 +303,7 @@ struct _Combo_Data
Evas_Object *, int);
};
/*
static void
_combo_min_size(Evas_Object *o, Evas_Object_Box_Data *p, void *data)
{
@ -317,19 +318,18 @@ _combo_min_size(Evas_Object *o, Evas_Object_Box_Data *p, void *data)
evas_object_geometry_get(o, &offset_x, &offset_y, &w, &h);
y = offset_y + (h / 2);
p->children = eina_list_nth_list(p->children, 0);
opt = eina_list_nth(p->children, 0);
h = 30;
edje_object_size_min_get(opt->obj, NULL, &h);
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
const char *
@ -404,10 +404,11 @@ _combo_clicked(void *data, Evas_Object *obj, void *event_info)
break;
i++;
}
eina_iterator_free(it);
// Should I send the part name? The the normal widget_add would handle
// the swallowing
cd->selected = i;
if (cd->create_header)
header = cd->create_header(data, "ecdb.header.swallow", swallow, i);
edje_object_signal_emit(data, "ecdb,combo,header,swallow", "ecdb");
ecdb_combo_collapse(data);
@ -468,9 +469,8 @@ ecdb_combo_add(Evas_Object *parent, const char *name)
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);
//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);
@ -508,10 +508,12 @@ void
ecdb_combo_expand(Evas_Object *c)
{
Combo_Data *cd;
Eina_Iterator *it;
Evas_Object *o;
const Evas_Object *box;
const char *location;
char buf[1024];
int x, y, w, h, h2;
int box_height = 30;
int x, y, w, h, h2, padding;
cd = evas_object_data_get(c, "cd");
@ -524,17 +526,33 @@ ecdb_combo_expand(Evas_Object *c)
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);
snprintf(buf, sizeof(buf), "ecdb,combo,popup,show,%s", location);
evas_object_geometry_get(c, &x, &y, &w, &h);
h2 = box_height * cd->count;
box = edje_object_part_object_get(cd->popup, "ecdb.box");
evas_object_box_padding_get(box, NULL, &padding);
h2 = -padding;
/* Now resize the attached object... There is code to do this in the
* layout, which makes more sense. However, it goes into an infinite loop,
* so resize here for now
*/
it = evas_object_box_iterator_new(edje_object_part_object_get(cd->popup,
"ecdb.box"));
while (eina_iterator_next(it, (void **)&o))
{
edje_object_size_min_get(o, NULL, &h);
evas_object_resize(o, w, h);
h2 += h + padding;
}
if (!strcmp(location, "top"))
evas_object_move(cd->popup, x, y - h2);
else
evas_object_move(cd->popup, x, y + h);
eina_iterator_free(it);
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);
@ -579,6 +597,15 @@ ecdb_combo_header_create_set(Evas_Object *c, Evas_Object * (*func)
cd->create_header = func;
}
int
ecdb_combo_selected_get(Evas_Object *c)
{
Combo_Data *cd;
cd = evas_object_data_get(c, "cd");
return cd->selected;
}
/******************************* Label ***************************************/

View File

@ -32,6 +32,7 @@ void ecdb_combo_header_create_set(Evas_Object *c, Evas_Object *
const char *name,
Evas_Object *clicked,
int idx));
int ecdb_combo_selected_get(Evas_Object *c);
Evas_Object *ecdb_label_add(Evas_Object *parent, const char *name);
void ecdb_label_text_set(Evas_Object *l, const char *text);