clean up some multibutton ugliness - this breaks theme api...

multibuttonentry really didnt follow elm conventions - it didnt use
namespacing for most singals/swallows - it dug into objects reading
object part geometry where it just should have calced min size and be
done. it did all sorts of other things it shouldnt/didnt need to.. so
i fixed that now... and dark theme has the support.
This commit is contained in:
Carsten Haitzler 2013-08-23 23:30:46 +09:00
parent 533617e053
commit e663eb4411
2 changed files with 81 additions and 169 deletions

View File

@ -129,10 +129,8 @@ _shrink_mode_set(Evas_Object *obj,
int count;
Eina_List *l;
Elm_Multibuttonentry_Item *item;
Evas_Coord button_min_width = 0;
ELM_MULTIBUTTONENTRY_DATA_GET_OR_RETURN(obj, sd);
Elm_Widget_Smart_Data *wd = eo_data_scope_get(obj, ELM_OBJ_WIDGET_CLASS);
if (sd->view_state == MULTIBUTTONENTRY_VIEW_ENTRY)
evas_object_hide(sd->entry);
@ -140,7 +138,6 @@ _shrink_mode_set(Evas_Object *obj,
evas_object_hide(sd->guide_text);
else if (sd->view_state == MULTIBUTTONENTRY_VIEW_SHRINK)
{
evas_object_hide(sd->rect_for_end);
evas_object_hide(sd->end);
sd->view_state = MULTIBUTTONENTRY_VIEW_NONE;
}
@ -171,24 +168,10 @@ _shrink_mode_set(Evas_Object *obj,
item = NULL;
count = eina_list_count(sd->items);
button_min_width = 0;
/* Evas_Coord button_min_height = 0; */
if (sd->end_type == MULTIBUTTONENTRY_CLOSED_IMAGE)
{
const char *size_str;
size_str = edje_object_data_get(sd->end, "closed_button_width");
if (size_str) button_min_width = (Evas_Coord)atoi(size_str);
/* it use for later
size_str = edje_object_data_get(sd->end, "closed_button_height");
if (size_str) button_min_width = (Evas_Coord)atoi(size_str);
*/
}
EINA_LIST_FOREACH(sd->items, l, item)
{
int w_label_count = 0;
Evas_Coord w_label_count = 0, h = 0;
char buf[MAX_STR];
elm_box_pack_end(sd->box, item->button);
@ -199,77 +182,34 @@ _shrink_mode_set(Evas_Object *obj,
w -= box_inner_item_width_padding;
count--;
if (sd->end_type == MULTIBUTTONENTRY_CLOSED_LABEL)
if (count > 0)
{
if (count > 0)
{
snprintf(buf, sizeof(buf), "... + %d", count);
elm_object_text_set(sd->end, buf);
evas_object_size_hint_min_get
(sd->end, &w_label_count, NULL);
}
if (w < 0 || w < w_label_count)
{
elm_box_unpack(sd->box, item->button);
evas_object_hide(item->button);
item->visible = EINA_FALSE;
count++;
snprintf(buf, sizeof(buf), "... + %d", count);
elm_object_text_set(sd->end, buf);
evas_object_size_hint_min_get
(sd->end, &w_label_count, NULL);
elm_box_pack_end(sd->box, sd->end);
evas_object_show(sd->end);
sd->view_state = MULTIBUTTONENTRY_VIEW_SHRINK;
evas_object_smart_callback_call
(obj, SIG_EXPAND_STATE_CHANGED, (void *)1);
break;
}
snprintf(buf, sizeof(buf), "... + %i", count);
edje_object_part_text_escaped_set(sd->end, "elm.text", buf);
edje_object_size_min_calc(sd->end, &w_label_count, NULL);
elm_coords_finger_size_adjust(1, &w_label_count, 1, NULL);
}
else if (sd->end_type == MULTIBUTTONENTRY_CLOSED_IMAGE)
if ((w < 0) || (w < w_label_count))
{
if (w < button_min_width)
{
Evas_Coord rectSize;
Evas_Coord closed_height = 0;
const char *height_str =
edje_object_data_get
(wd->resize_obj, "closed_height");
if (height_str)
closed_height =
(Evas_Coord)atoi(height_str);
elm_box_unpack(sd->box, item->button);
evas_object_hide(item->button);
item->visible = EINA_FALSE;
w += item->vw;
rectSize = w - button_min_width;
if (!sd->rect_for_end)
{
Evas *e = evas_object_evas_get(obj);
sd->rect_for_end = evas_object_rectangle_add(e);
evas_object_color_set(sd->rect_for_end, 0, 0, 0, 0);
}
evas_object_size_hint_min_set
(sd->rect_for_end, rectSize, closed_height *
elm_config_scale_get());
elm_box_pack_end(sd->box, sd->rect_for_end);
evas_object_show(sd->rect_for_end);
elm_box_pack_end(sd->box, sd->end);
evas_object_show(sd->end);
sd->view_state = MULTIBUTTONENTRY_VIEW_SHRINK;
evas_object_smart_callback_call
(obj, SIG_EXPAND_STATE_CHANGED, 0);
break;
}
elm_box_unpack(sd->box, item->button);
evas_object_hide(item->button);
item->visible = EINA_FALSE;
count++;
snprintf(buf, sizeof(buf), "... + %d", count);
edje_object_part_text_escaped_set(sd->end, "elm.text", buf);
edje_object_size_min_calc(sd->end, &w_label_count, &h);
elm_coords_finger_size_adjust(1, &w_label_count, 1, &h);
evas_object_size_hint_min_set
(sd->end, w_label_count, h);
elm_box_pack_end(sd->box, sd->end);
evas_object_show(sd->end);
sd->view_state = MULTIBUTTONENTRY_VIEW_SHRINK;
evas_object_smart_callback_call
(obj, SIG_EXPAND_STATE_CHANGED, (void *)1);
break;
}
}
}
@ -284,8 +224,6 @@ _shrink_mode_set(Evas_Object *obj,
}
evas_object_hide(sd->end);
if (sd->rect_for_end) evas_object_hide(sd->rect_for_end);
// pack buttons only 1line
if (sd->label) elm_box_pack_end(sd->box, sd->label);
@ -430,18 +368,13 @@ _current_button_state_change(Evas_Object *obj,
switch (state)
{
case MULTIBUTTONENTRY_BUTTON_STATE_DEFAULT:
edje_object_signal_emit(item->button, "default", "");
sd->selected_it = NULL;
break;
case MULTIBUTTONENTRY_BUTTON_STATE_SELECTED:
edje_object_signal_emit(item->button, "focused", "");
edje_object_signal_emit(item->button, "elm,state,focused", "elm");
evas_object_smart_callback_call(obj, SIG_ITEM_SELECTED, item);
break;
case MULTIBUTTONENTRY_BUTTON_STATE_DEFAULT:
default:
edje_object_signal_emit(item->button, "default", "");
edje_object_signal_emit(item->button, "elm,state,default", "elm");
sd->selected_it = NULL;
break;
}
@ -543,34 +476,51 @@ _button_clicked_cb(void *data,
}
static void
_button_resize(Evas_Object *btn,
_button_deleted_cb(void *data,
Evas_Object *obj,
const char *emission __UNUSED__,
const char *source __UNUSED__)
{
Eina_List *l;
Elm_Multibuttonentry_Item *item = NULL;
ELM_MULTIBUTTONENTRY_DATA_GET_OR_RETURN(data, sd);
// change the current
EINA_LIST_FOREACH(sd->items, l, item)
{
if (item->button == obj)
{
elm_widget_item_del(item);
break;
}
}
}
static void
_button_resize(Evas_Object *obj,
Evas_Object *btn,
Evas_Coord *realw,
Evas_Coord *vieww)
{
Evas_Coord rw, vw;
const char *size_str;
Evas_Coord w_btn = 0, button_max_width = 0;
Evas_Coord w_text, h_btn, padding_outer = 0;
Evas_Coord w_btn = 0, h_btn = 0, button_max_width = 0;
size_str = edje_object_data_get(btn, "button_max_size");
if (size_str) button_max_width = (Evas_Coord)atoi(size_str);
if (size_str) button_max_width = atoi(size_str);
button_max_width *= elm_widget_scale_get(obj) * elm_config_scale_get();
// decide the size of button
edje_object_part_geometry_get(btn, "elm.base", NULL, NULL, NULL, &h_btn);
edje_object_part_geometry_get
(btn, "elm.btn.text", NULL, NULL, &w_text, NULL);
edje_object_part_geometry_get
(btn, "right.padding", NULL, NULL, &padding_outer, NULL);
w_btn = w_text + (2 * padding_outer);
edje_object_size_min_calc(btn, &w_btn, &h_btn);
rw = w_btn;
if (button_max_width < w_btn)
vw = button_max_width;
else
vw = w_btn;
if (button_max_width < w_btn) vw = button_max_width;
else vw = w_btn;
//resize btn
elm_coords_finger_size_adjust(1, &vw, 1, &h_btn);
evas_object_resize(btn, vw, h_btn);
evas_object_size_hint_min_set(btn, vw, h_btn);
@ -590,7 +540,7 @@ _item_text_set_hook(Elm_Object_Item *it,
item = (Elm_Multibuttonentry_Item *)it;
edje_object_part_text_escaped_set(item->button, "elm.btn.text", label);
_button_resize(item->button, &item->rw, &item->vw);
_button_resize(item->base.widget, item->button, &item->rw, &item->vw);
}
static const char *
@ -616,21 +566,20 @@ static void
_access_multibuttonentry_label_register(Evas_Object *obj, Eina_Bool is_access)
{
ELM_MULTIBUTTONENTRY_DATA_GET_OR_RETURN(obj, sd);
Evas_Object *po;
po = (Evas_Object *)edje_object_part_object_get(sd->label, "mbe.label");
po = (Evas_Object *)edje_object_part_object_get(sd->label, "elm.text");
if (is_access)
{
Evas_Object *ao;
ao = _elm_access_edje_object_part_object_register
(obj, sd->label, "mbe.label");
(obj, sd->label, "elm.text");
_elm_access_text_set(_elm_access_info_get(ao),
ELM_ACCESS_TYPE, E_("multi button entry label"));
}
else
_elm_access_edje_object_part_object_unregister
(obj, sd->label, "mbe.label");
(obj, sd->label, "elm.text");
evas_object_pass_events_set(po, !is_access);
@ -704,6 +653,8 @@ _button_item_add(Elm_Multibuttonentry_Smart_Data *sd,
edje_object_signal_callback_add
(btn, "mouse,clicked,1", "*", _button_clicked_cb, obj);
edje_object_signal_callback_add
(btn, "elm,deleted", "elm", _button_deleted_cb, obj);
evas_object_size_hint_weight_set(btn, 0.0, 0.0);
evas_object_show(btn);
@ -715,7 +666,7 @@ _button_item_add(Elm_Multibuttonentry_Smart_Data *sd,
elm_widget_item_text_set_hook_set(item, _item_text_set_hook);
elm_widget_item_text_get_hook_set(item, _item_text_get_hook);
elm_widget_item_data_set(item, data);
_button_resize(btn, &rw, &vw);
_button_resize(obj, btn, &rw, &vw);
item->button = btn;
item->rw = rw;
@ -1112,7 +1063,7 @@ static void
_label_set(Evas_Object *obj,
const char *str)
{
Evas_Coord width, height, sum_width = 0;
Evas_Coord width, height;
ELM_MULTIBUTTONENTRY_DATA_GET_OR_RETURN(obj, sd);
@ -1122,34 +1073,21 @@ _label_set(Evas_Object *obj,
evas_object_size_hint_min_set(sd->label, 0, 0);
evas_object_resize(sd->label, 0, 0);
edje_object_part_text_escaped_set(sd->label, "mbe.label", str);
edje_object_part_text_escaped_set(sd->label, "elm.text", str);
if (!strlen(str))
{
/* FIXME: not work yet */
edje_object_signal_emit(sd->label, "elm,mbe,clear_text", "");
edje_object_part_geometry_get
(sd->label, "mbe.label", NULL, NULL, &width, &height);
sum_width += width;
edje_object_signal_emit(sd->label, "elm,mbe,clear_text", "elm");
edje_object_size_min_calc(sd->label, &width, &height);
}
else
{
edje_object_signal_emit(sd->label, "elm,mbe,set_text", "");
edje_object_part_geometry_get
(sd->label, "mbe.label", NULL, NULL, &width, &height);
sum_width += width;
edje_object_part_geometry_get
(sd->label, "mbe.label.left.padding", NULL, NULL, &width, NULL);
sum_width += width;
edje_object_part_geometry_get
(sd->label, "mbe.label.right.padding", NULL, NULL, &width, NULL);
sum_width += width;
edje_object_signal_emit(sd->label, "elm,mbe,set_text", "elm");
edje_object_size_min_calc(sd->label, &width, &height);
}
evas_object_size_hint_min_set(sd->label, sum_width, height);
elm_coords_finger_size_adjust(1, &width, 1, &height);
evas_object_size_hint_min_set(sd->label, width, height);
evas_object_show(sd->label);
_view_update(sd);
}
@ -1376,9 +1314,6 @@ _box_layout_cb(Evas_Object *o,
static void
_view_init(Evas_Object *obj, Elm_Multibuttonentry_Smart_Data *sd)
{
const char *end_type;
Elm_Widget_Smart_Data *wd = eo_data_scope_get(obj, ELM_OBJ_WIDGET_CLASS);
sd->box = elm_box_add(obj);
if (!sd->box) return;
@ -1412,20 +1347,8 @@ _view_init(Evas_Object *obj, Elm_Multibuttonentry_Smart_Data *sd)
sd->view_state = MULTIBUTTONENTRY_VIEW_ENTRY;
end_type = edje_object_data_get
(wd->resize_obj, "closed_button_type");
if (!end_type || !strcmp(end_type, "label"))
{
sd->end = elm_label_add(obj);
if (!sd->end) return;
elm_object_style_set(sd->end, "extended/multibuttonentry_default");
sd->end_type = MULTIBUTTONENTRY_CLOSED_LABEL;
}
else
{
const char *size_str;
Evas_Coord button_min_width = 0;
Evas_Coord button_min_height = 0;
Evas_Coord button_min_width = 0, button_min_height = 0;
sd->end = edje_object_add(evas_object_evas_get(obj));
if (!sd->end) return;
@ -1433,15 +1356,9 @@ _view_init(Evas_Object *obj, Elm_Multibuttonentry_Smart_Data *sd)
(obj, sd->end, "multibuttonentry", "closedbutton",
elm_widget_style_get(obj));
size_str = edje_object_data_get(sd->end, "closed_button_width");
if (size_str) button_min_width = (Evas_Coord)atoi(size_str);
size_str = edje_object_data_get(sd->end, "closed_button_height");
if (size_str) button_min_height = (Evas_Coord)atoi(size_str);
sd->end_type = MULTIBUTTONENTRY_CLOSED_IMAGE;
evas_object_size_hint_min_set
(sd->end, button_min_width * elm_config_scale_get(),
button_min_height * elm_config_scale_get());
edje_object_size_min_calc(sd->end, &button_min_width, &button_min_height);
elm_coords_finger_size_adjust(1, &button_min_width, 1, &button_min_height);
evas_object_size_hint_min_set(sd->end, button_min_width, button_min_height);
elm_widget_sub_object_add(obj, sd->end);
}
}
@ -1579,7 +1496,6 @@ _elm_multibuttonentry_smart_del(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
if (sd->label) evas_object_del(sd->label);
if (sd->guide_text) evas_object_del(sd->guide_text);
if (sd->end) evas_object_del(sd->end);
if (sd->rect_for_end) evas_object_del(sd->rect_for_end);
eo_do_super(obj, MY_CLASS, evas_obj_smart_del());
}
@ -1626,7 +1542,7 @@ _elm_multibuttonentry_smart_focus_next(Eo *obj, void *_pd, va_list *list)
if (sd->label)
{
po = (Evas_Object *)edje_object_part_object_get(sd->label, "mbe.label");
po = (Evas_Object *)edje_object_part_object_get(sd->label, "elm.text");
ao = evas_object_data_get(po, "_part_access_obj");
int_ret = elm_widget_focus_get(ao);
items = eina_list_append(items, ao);

View File

@ -78,16 +78,12 @@ struct _Elm_Multibuttonentry_Smart_Data
* total number of
* invisible buttons */
Evas_Object *rect_for_end;
Eina_List *items;
Eina_List *filter_list;
Elm_Object_Item *selected_it; /* selected item */
const char *label_str, *guide_text_str;
MultiButtonEntry_Closed_Button_Type end_type;
int n_str;
Multibuttonentry_View_State view_state;