ephysics: use hoversel to select material on sandbox

SVN revision: 78096
This commit is contained in:
Bruno Dilly 2012-10-16 23:18:55 +00:00
parent e25a9d45e8
commit b09c303d52
1 changed files with 76 additions and 61 deletions

View File

@ -14,6 +14,11 @@
#define DEPTH (100)
#define INITIAL_IMPULSE (9500)
static const char *materials[] =
{
"Custom", "Concrete", "Iron", "Plastic", "Polystyrene", "Rubber", "Wood"
};
typedef struct _Sandie_Data {
Evas_Object *win, *tb, *nf, *sl_hardness1, *sl_hardness2;
EPhysics_World *world;
@ -156,13 +161,13 @@ _body2_type_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
}
static void
_body_material_set(Evas_Object *obj, EPhysics_Body *body)
_body_material_set(Evas_Object *obj, Evas_Object *win, EPhysics_Body *body,
EPhysics_Body_Material material)
{
Evas_Object *body_image;
const char *material;
int x, y, w, h;
ephysics_body_material_set(body, elm_spinner_value_get(obj));
ephysics_body_material_set(body, material);
elm_slider_value_set(evas_object_data_get(obj, "mass"),
ephysics_body_mass_get(body));
@ -177,30 +182,16 @@ _body_material_set(Evas_Object *obj, EPhysics_Body *body)
evas_object_geometry_get(body_image, &x, &y, &w, &h);
evas_object_del(body_image);
material = elm_spinner_special_value_get(obj, elm_spinner_value_get(obj));
body_image = elm_image_add(evas_object_data_get(obj, "win"));
body_image = elm_image_add(win);
elm_image_file_set(
body_image, PACKAGE_DATA_DIR "/" SANDBOX_THEME ".edj", material);
body_image, PACKAGE_DATA_DIR "/" SANDBOX_THEME ".edj",
materials[material]);
evas_object_resize(body_image, w, h);
evas_object_move(body_image, x, y);
evas_object_show(body_image);
ephysics_body_evas_object_set(body, body_image, EINA_FALSE);
}
static void
_body1_material_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
{
Sandie_Data *sandie = data;
_body_material_set(obj, sandie->body1);
}
static void
_body2_material_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
{
Sandie_Data *sandie = data;
_body_material_set(obj, sandie->body2);
}
static void
_body_mass_set(Evas_Object *obj, EPhysics_Body *body)
{
@ -786,45 +777,73 @@ _sandie_label_add(Evas_Object *win, Evas_Object *bxparent,
evas_object_show(label);
}
static Evas_Object *
_sandie_enum_add(Evas_Object *win, Evas_Object *bxparent,
const char *subcategory)
static void
_material_sel_cb1(void *data, Evas_Object *obj, void *event_info __UNUSED__)
{
Evas_Object *sp;
_sandie_label_add(win, bxparent, subcategory);
sp = elm_spinner_add(win);
elm_spinner_wrap_set(sp, EINA_TRUE);
elm_spinner_min_max_set(sp, 0, 6);
elm_spinner_value_set(sp, 0);
elm_spinner_step_set(sp, 1);
elm_spinner_label_format_set(sp, "%.0f");
elm_spinner_editable_set(sp, EINA_FALSE);
elm_spinner_special_value_add(sp, EPHYSICS_BODY_MATERIAL_CUSTOM, "Custom");
elm_spinner_special_value_add(sp, EPHYSICS_BODY_MATERIAL_CONCRETE,
"Concrete");
elm_spinner_special_value_add(sp, EPHYSICS_BODY_MATERIAL_IRON, "Iron");
elm_spinner_special_value_add(sp, EPHYSICS_BODY_MATERIAL_PLASTIC, "Plastic");
elm_spinner_special_value_add(sp, EPHYSICS_BODY_MATERIAL_POLYSTYRENE,
"Polystyrene");
elm_spinner_special_value_add(sp, EPHYSICS_BODY_MATERIAL_RUBBER, "Rubber");
elm_spinner_special_value_add(sp, EPHYSICS_BODY_MATERIAL_WOOD, "Wood");
evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5);
evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_box_pack_end(bxparent, sp);
evas_object_show(sp);
evas_object_data_set(sp, "win", win);
return sp;
Sandie_Data *sd = evas_object_data_get(obj, "sd");
elm_object_text_set(obj, materials[(int) data]);
_body_material_set(obj, sd->win, sd->body1, (EPhysics_Body_Material) data);
}
static void
_type_radio_add(Sandie_Data *data, Evas_Object *bxparent,
void (*func) (void *data, Evas_Object *obj, void *event_info))
_material_sel_cb2(void *data, Evas_Object *obj, void *event_info __UNUSED__)
{
Sandie_Data *sd = evas_object_data_get(obj, "sd");
elm_object_text_set(obj, materials[(int) data]);
_body_material_set(obj, sd->win, sd->body2, (EPhysics_Body_Material) data);
}
static Evas_Object *
_material_selector_add(Sandie_Data *sd, Evas_Object *bxparent,
Evas_Smart_Cb func)
{
Evas_Object *box, *hv;
box = elm_box_add(sd->win);
elm_box_horizontal_set(box, EINA_TRUE);
evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(box, EVAS_HINT_FILL, 0.0);
evas_object_show(box);
elm_box_pack_end(bxparent, box);
_sandie_label_add(sd->win, box, "Body Material");
hv = elm_hoversel_add(sd->win);
elm_hoversel_hover_parent_set(hv, sd->nf);
elm_object_text_set(hv, materials[EPHYSICS_BODY_MATERIAL_CUSTOM]);
elm_hoversel_item_add(hv, materials[EPHYSICS_BODY_MATERIAL_CUSTOM],
NULL, ELM_ICON_NONE, func,
(void *) EPHYSICS_BODY_MATERIAL_CUSTOM);
elm_hoversel_item_add(hv, materials[EPHYSICS_BODY_MATERIAL_CONCRETE],
NULL, ELM_ICON_NONE, func,
(void *) EPHYSICS_BODY_MATERIAL_CONCRETE);
elm_hoversel_item_add(hv, materials[EPHYSICS_BODY_MATERIAL_IRON],
NULL, ELM_ICON_NONE, func,
(void *) EPHYSICS_BODY_MATERIAL_IRON);
elm_hoversel_item_add(hv, materials[EPHYSICS_BODY_MATERIAL_PLASTIC],
NULL, ELM_ICON_NONE, func,
(void *) EPHYSICS_BODY_MATERIAL_PLASTIC);
elm_hoversel_item_add(hv, materials[EPHYSICS_BODY_MATERIAL_POLYSTYRENE],
NULL, ELM_ICON_NONE, func,
(void *) EPHYSICS_BODY_MATERIAL_POLYSTYRENE);
elm_hoversel_item_add(hv, materials[EPHYSICS_BODY_MATERIAL_RUBBER],
NULL, ELM_ICON_NONE, func,
(void *) EPHYSICS_BODY_MATERIAL_RUBBER);
elm_hoversel_item_add(hv, materials[EPHYSICS_BODY_MATERIAL_WOOD],
NULL, ELM_ICON_NONE, func,
(void *) EPHYSICS_BODY_MATERIAL_WOOD);
evas_object_size_hint_align_set(hv, 1, 0.5);
elm_box_pack_end(box, hv);
evas_object_show(hv);
evas_object_data_set(hv, "sd", sd);
return hv;
}
static void
_type_radio_add(Sandie_Data *data, Evas_Object *bxparent, Evas_Smart_Cb func)
{
Evas_Object *dbx, *rd, *rdg;
@ -957,7 +976,7 @@ _menu_body_items_create(void *data)
_type_radio_add(sandie, bx, _body1_type_cb);
material_widget = _sandie_enum_add(sandie->win, bx, "Body Material");
material_widget = _material_selector_add(sandie, bx, _material_sel_cb1);
bx = _category_add(sandie->win, bxbody1, "Properties", EINA_TRUE);
@ -985,8 +1004,6 @@ _menu_body_items_create(void *data)
widget = _sandie_slider_add(sandie->win, bx, "Restitution", "%1.3f",
0, 1, 0);
evas_object_data_set(material_widget, "restitution", widget);
evas_object_smart_callback_add(material_widget, "delay,changed",
_body1_material_cb, sandie);
evas_object_smart_callback_add(widget, "delay,changed",
_body1_restitution_cb, sandie);
widget = _sandie_slider_add(sandie->win, bx, "Torque", "%1.3f",
@ -1108,7 +1125,7 @@ _menu_body_items_create(void *data)
_type_radio_add(sandie, bx, _body2_type_cb);
material_widget = _sandie_enum_add(sandie->win, bx, "Body Material");
material_widget = _material_selector_add(sandie, bx, _material_sel_cb2);
bx = _category_add(sandie->win, bxbody2, "Properties", EINA_TRUE);
@ -1136,8 +1153,6 @@ _menu_body_items_create(void *data)
widget = _sandie_slider_add(sandie->win, bx, "Restitution", "%1.3f",
0, 1, 0);
evas_object_data_set(material_widget, "restitution", widget);
evas_object_smart_callback_add(material_widget, "delay,changed",
_body2_material_cb, sandie);
evas_object_smart_callback_add(widget, "delay,changed",
_body2_restitution_cb, sandie);
widget = _sandie_slider_add(sandie->win, bx, "Torque", "%1.3f",