summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshilpa.singh <shilpa.singh@samsung.com>2015-05-19 20:56:48 +0900
committerChunEon Park <hermet@hermet.pe.kr>2015-05-19 20:56:48 +0900
commit6b453e8d8cdf861ee9ad8e34703b51ef8f50101a (patch)
tree199188c48d548fc3f7c8ff297dace94f1495fff6
parent2ae332bce7e73df4d54a8ee2ee49a3638576f48e (diff)
downloadelementary-6b453e8d8cdf861ee9ad8e34703b51ef8f50101a.tar.gz
[Elm_ColorSelector]: Unnecessary widget creations, code execution avoided.
Summary: Issue: Too many widgets get created during smart add itself, even if not necessary, adding to the launch time. Solution: Create widgets based on mode, check for modes in generic functions like smart theme, focus etc:- Test Plan: elementary_test can be used to test colorselector demo. Reviewers: cedric, raster, Hermet Subscribers: rajeshps, govi, poornima.srinivasan Differential Revision: https://phab.enlightenment.org/D2532
-rw-r--r--src/lib/elm_colorselector.c326
1 files changed, 191 insertions, 135 deletions
diff --git a/src/lib/elm_colorselector.c b/src/lib/elm_colorselector.c
index 650e0c680..0fbfda66c 100644
--- a/src/lib/elm_colorselector.c
+++ b/src/lib/elm_colorselector.c
@@ -402,7 +402,8 @@ _update_hsla_from_colorbar(Evas_Object *obj, Color_Type type, double x)
if (type != ALPHA && !_hsl_to_rgb(sd)) return;
_update_colorbars(sd);
- _color_picker_init(sd);
+ if ((sd->mode == ELM_COLORSELECTOR_ALL) || (sd->mode == ELM_COLORSELECTOR_PICKER))
+ _color_picker_init(sd);
evas_object_smart_callback_call(obj, SIG_CHANGED, NULL);
evas_object_smart_callback_call(obj, SIG_CHANGED_USER, NULL);
}
@@ -426,34 +427,39 @@ _colors_set(Evas_Object *obj,
sd->b = b;
sd->a = a;
- _rgb_to_hsl(sd);
+ if ((sd->mode == ELM_COLORSELECTOR_ALL) || (sd->mode == ELM_COLORSELECTOR_COMPONENTS)
+ || (sd->mode == ELM_COLORSELECTOR_BOTH))
+ {
+ _rgb_to_hsl(sd);
- edje_object_part_drag_value_get
- (sd->cb_data[0]->colorbar, "elm.arrow", &x, &y);
- x = sd->h / 360.0;
- edje_object_part_drag_value_set
- (sd->cb_data[0]->colorbar, "elm.arrow", x, y);
- _update_ergb(sd, x);
+ edje_object_part_drag_value_get
+ (sd->cb_data[0]->colorbar, "elm.arrow", &x, &y);
+ x = sd->h / 360.0;
+ edje_object_part_drag_value_set
+ (sd->cb_data[0]->colorbar, "elm.arrow", x, y);
+ _update_ergb(sd, x);
- edje_object_part_drag_value_get
- (sd->cb_data[1]->colorbar, "elm.arrow", &x, &y);
- x = 1.0 - sd->s;
- edje_object_part_drag_value_set
- (sd->cb_data[1]->colorbar, "elm.arrow", x, y);
+ edje_object_part_drag_value_get
+ (sd->cb_data[1]->colorbar, "elm.arrow", &x, &y);
+ x = 1.0 - sd->s;
+ edje_object_part_drag_value_set
+ (sd->cb_data[1]->colorbar, "elm.arrow", x, y);
- edje_object_part_drag_value_get
- (sd->cb_data[2]->colorbar, "elm.arrow", &x, &y);
- x = sd->l;
- edje_object_part_drag_value_set(sd->cb_data[2]->colorbar, "elm.arrow", x, y);
+ edje_object_part_drag_value_get
+ (sd->cb_data[2]->colorbar, "elm.arrow", &x, &y);
+ x = sd->l;
+ edje_object_part_drag_value_set(sd->cb_data[2]->colorbar, "elm.arrow", x, y);
- edje_object_part_drag_value_get
- (sd->cb_data[3]->colorbar, "elm.arrow", &x, &y);
- x = sd->a / 255.0;
- edje_object_part_drag_value_set
- (sd->cb_data[3]->colorbar, "elm.arrow", x, y);
+ edje_object_part_drag_value_get
+ (sd->cb_data[3]->colorbar, "elm.arrow", &x, &y);
+ x = sd->a / 255.0;
+ edje_object_part_drag_value_set
+ (sd->cb_data[3]->colorbar, "elm.arrow", x, y);
- _update_colorbars(sd);
- _color_picker_init(sd);
+ _update_colorbars(sd);
+ }
+ if ((sd->mode == ELM_COLORSELECTOR_ALL) || (sd->mode == ELM_COLORSELECTOR_PICKER))
+ _color_picker_init(sd);
evas_object_smart_callback_call(obj, SIG_CHANGED, NULL);
}
@@ -660,7 +666,7 @@ _mouse_out_canvas(void *data, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED)
}
static void
-_color_picker_add(Evas_Object *obj, Elm_Colorselector_Data *sd)
+_create_colorpicker(Evas_Object *obj)
{
Evas_Object *ed;
Evas_Object *im;
@@ -668,6 +674,9 @@ _color_picker_add(Evas_Object *obj, Elm_Colorselector_Data *sd)
Evas_Object *bx;
Eina_Stringshare *style;
int i;
+
+ ELM_COLORSELECTOR_DATA_GET(obj, sd);
+ if (sd->picker) return;
#ifdef HAVE_ELEMENTARY_X
Ecore_X_Window xwin;
@@ -678,6 +687,14 @@ _color_picker_add(Evas_Object *obj, Elm_Colorselector_Data *sd)
ecore_x_input_raw_select(sd->grab.xroot);
}
#endif
+ /* setup the color picker */
+ sd->picker = elm_layout_add(obj);
+ if (!elm_layout_theme_set(sd->picker, "colorselector", "picker/base", elm_widget_style_get(obj)))
+ CRI("Failed to set layout!");
+
+ evas_object_size_hint_weight_set(sd->picker, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(sd->picker, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_widget_sub_object_add(obj, sd->picker);
bx = elm_box_add(sd->picker);
evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
@@ -742,7 +759,6 @@ _color_picker_add(Evas_Object *obj, Elm_Colorselector_Data *sd)
elm_layout_content_set(sd->picker, "elm.swallow.alpha", sd->spinners[3]);
elm_layout_text_set(sd->picker, "elm.label.alpha", E_("A:"));
-
evas_event_callback_add(evas_object_evas_get(obj), EVAS_CALLBACK_CANVAS_FOCUS_IN, _mouse_in_canvas, obj);
evas_event_callback_add(evas_object_evas_get(obj), EVAS_CALLBACK_CANVAS_FOCUS_OUT, _mouse_out_canvas, obj);
@@ -1078,68 +1094,80 @@ _elm_colorselector_elm_widget_theme_apply(Eo *obj, Elm_Colorselector_Data *sd)
eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_theme_apply());
if (!int_ret) return EINA_FALSE;
- if (!sd->col_bars_area) return EINA_FALSE;
-
- elm_widget_theme_object_set
- (obj, sd->col_bars_area, "colorselector", "bg",
- elm_widget_style_get(obj));
-
- hpadstr = edje_object_data_get
- (wd->resize_obj, "horizontal_pad");
- if (hpadstr) h_pad = atoi(hpadstr);
- vpadstr = edje_object_data_get
- (wd->resize_obj, "vertical_pad");
- if (vpadstr) v_pad = atoi(vpadstr);
+ if ((sd->mode == ELM_COLORSELECTOR_PALETTE) ||
+ (sd->mode == ELM_COLORSELECTOR_ALL) ||
+ (sd->mode == ELM_COLORSELECTOR_BOTH))
+ {
+ hpadstr = edje_object_data_get
+ (wd->resize_obj, "horizontal_pad");
+ if (hpadstr) h_pad = atoi(hpadstr);
+ vpadstr = edje_object_data_get
+ (wd->resize_obj, "vertical_pad");
+ if (vpadstr) v_pad = atoi(vpadstr);
+
+ elm_box_padding_set
+ (sd->palette_box,
+ (h_pad * elm_widget_scale_get(obj) * elm_config_scale_get()),
+ (v_pad * elm_widget_scale_get(obj) * elm_config_scale_get()));
+
+ EINA_LIST_FOREACH(sd->items, elist, eo_item)
+ {
+ ELM_COLOR_ITEM_DATA_GET(eo_item, item);
+ if (!elm_layout_theme_set
+ (VIEW(item), "colorselector", "item", elm_widget_style_get(obj)))
+ CRI("Failed to set layout!");
- elm_box_padding_set
- (sd->palette_box,
- (h_pad * elm_widget_scale_get(obj) * elm_config_scale_get()),
- (v_pad * elm_widget_scale_get(obj) * elm_config_scale_get()));
+ elm_widget_theme_object_set
+ (obj, item->color_obj, "colorselector", "item/color",
+ elm_widget_style_get(obj));
+ }
+ }
- EINA_LIST_FOREACH(sd->items, elist, eo_item)
+ if ((sd->mode == ELM_COLORSELECTOR_COMPONENTS) ||
+ (sd->mode == ELM_COLORSELECTOR_ALL) ||
+ (sd->mode == ELM_COLORSELECTOR_BOTH))
{
- ELM_COLOR_ITEM_DATA_GET(eo_item, item);
- if (!elm_layout_theme_set
- (VIEW(item), "colorselector", "item", elm_widget_style_get(obj)))
- CRI("Failed to set layout!");
+ if (!sd->col_bars_area) return EINA_FALSE;
elm_widget_theme_object_set
- (obj, item->color_obj, "colorselector", "item/color",
+ (obj, sd->col_bars_area, "colorselector", "bg",
elm_widget_style_get(obj));
- }
- for (i = 0; i < 4; i++)
- {
- if (sd->cb_data[i])
+
+ for (i = 0; i < 4; i++)
{
- ELM_SAFE_FREE(sd->cb_data[i]->colorbar, evas_object_del);
- ELM_SAFE_FREE(sd->cb_data[i]->bar, evas_object_del);
- ELM_SAFE_FREE(sd->cb_data[i]->lbt, evas_object_del);
- ELM_SAFE_FREE(sd->cb_data[i]->rbt, evas_object_del);
- if (i != 0)
- ELM_SAFE_FREE(sd->cb_data[i]->bg_rect, evas_object_del);
- ELM_SAFE_FREE(sd->cb_data[i]->arrow, evas_object_del);
- ELM_SAFE_FREE(sd->cb_data[i]->touch_area, evas_object_del);
+ if (sd->cb_data[i])
+ {
+ ELM_SAFE_FREE(sd->cb_data[i]->colorbar, evas_object_del);
+ ELM_SAFE_FREE(sd->cb_data[i]->bar, evas_object_del);
+ ELM_SAFE_FREE(sd->cb_data[i]->lbt, evas_object_del);
+ ELM_SAFE_FREE(sd->cb_data[i]->rbt, evas_object_del);
+ if (i != 0)
+ ELM_SAFE_FREE(sd->cb_data[i]->bg_rect, evas_object_del);
+ ELM_SAFE_FREE(sd->cb_data[i]->arrow, evas_object_del);
+ ELM_SAFE_FREE(sd->cb_data[i]->touch_area, evas_object_del);
+ }
}
+ _color_bars_add(obj);
+ elm_colorselector_color_set(obj, sd->r, sd->g, sd->b, sd->a);
}
- if (!elm_layout_theme_set(sd->picker, "colorselector", "picker/base",
- elm_widget_style_get(obj)))
- CRI("Failed to set layout!");
-
- style = eina_stringshare_printf("colorselector/%s", elm_widget_style_get(obj));
-#ifdef HAVE_ELEMENTARY_X
- elm_object_style_set(sd->button, style);
-#endif
- for (i = 0; i < 4; i++)
- elm_object_style_set(sd->spinners[i], style);
+ if ((sd->mode == ELM_COLORSELECTOR_PICKER) ||
+ (sd->mode == ELM_COLORSELECTOR_ALL))
+ {
+ if (!elm_layout_theme_set(sd->picker, "colorselector", "picker/base",
+ elm_widget_style_get(obj)))
+ CRI("Failed to set layout!");
- _color_bars_add(obj);
- elm_colorselector_color_set(obj, sd->r, sd->g, sd->b, sd->a);
+ style = eina_stringshare_printf("colorselector/%s", elm_widget_style_get(obj));
+ #ifdef HAVE_ELEMENTARY_X
+ elm_object_style_set(sd->button, style);
+ #endif
+ for (i = 0; i < 4; i++)
+ elm_object_style_set(sd->spinners[i], style);
+ eina_stringshare_del(style);
+ }
elm_layout_sizing_eval(obj);
-
- eina_stringshare_del(style);
-
return EINA_TRUE;
}
@@ -1529,31 +1557,26 @@ _palette_colors_load(Evas_Object *obj)
sd->config_load = EINA_TRUE;
}
-EOLIAN static void
-_elm_colorselector_evas_object_smart_add(Eo *obj, Elm_Colorselector_Data *priv)
+static void
+_create_colorpalette(Evas_Object *obj)
{
const char *hpadstr, *vpadstr;
unsigned int h_pad = DEFAULT_HOR_PAD;
unsigned int v_pad = DEFAULT_VER_PAD;
+ ELM_COLORSELECTOR_DATA_GET(obj, sd);
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
- eo_do_super(obj, MY_CLASS, evas_obj_smart_add());
- elm_widget_sub_object_parent_add(obj);
-
- if (!elm_layout_theme_set
- (obj, "colorselector", "palette", elm_object_style_get(obj)))
- CRI("Failed to set layout!");
-
- priv->palette_box = elm_box_add(obj);
+ if (sd->palette_box) return;
+ sd->palette_box = elm_box_add(obj);
elm_box_layout_set
- (priv->palette_box, evas_object_box_layout_flow_horizontal, NULL, NULL);
- elm_box_horizontal_set(priv->palette_box, EINA_TRUE);
+ (sd->palette_box, evas_object_box_layout_flow_horizontal, NULL, NULL);
+ elm_box_horizontal_set(sd->palette_box, EINA_TRUE);
evas_object_size_hint_weight_set
- (priv->palette_box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ (sd->palette_box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set
- (priv->palette_box, EVAS_HINT_FILL, EVAS_HINT_FILL);
- elm_box_homogeneous_set(priv->palette_box, EINA_TRUE);
+ (sd->palette_box, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_box_homogeneous_set(sd->palette_box, EINA_TRUE);
hpadstr = edje_object_data_get(wd->resize_obj, "horizontal_pad");
if (hpadstr) h_pad = atoi(hpadstr);
@@ -1561,36 +1584,51 @@ _elm_colorselector_evas_object_smart_add(Eo *obj, Elm_Colorselector_Data *priv)
if (vpadstr) v_pad = atoi(vpadstr);
elm_box_padding_set
- (priv->palette_box,
+ (sd->palette_box,
(h_pad * elm_widget_scale_get(obj) * elm_config_scale_get()),
(v_pad * elm_widget_scale_get(obj) * elm_config_scale_get()));
- elm_box_align_set(priv->palette_box, 0.0, 0.0);
- if (!elm_layout_content_set(obj, "elm.palette", priv->palette_box))
- elm_layout_content_set(obj, "palette", priv->palette_box);
- priv->palette_name = eina_stringshare_add("default");
+ elm_box_align_set(sd->palette_box, 0.0, 0.0);
+ if (!elm_layout_content_set(obj, "elm.palette", sd->palette_box))
+ elm_layout_content_set(obj, "palette", sd->palette_box);
+ sd->palette_name = eina_stringshare_add("default");
_palette_colors_load(obj);
evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _on_resize, NULL);
+}
- /* load background edj */
- priv->col_bars_area = edje_object_add(evas_object_evas_get(obj));
+static void
+_create_colorcomponents(Evas_Object *obj)
+{
+ ELM_COLORSELECTOR_DATA_GET(obj, sd);
+ if (sd->col_bars_area) return;
+ sd->col_bars_area = edje_object_add(evas_object_evas_get(obj));
elm_widget_theme_object_set
- (obj, priv->col_bars_area, "colorselector", "bg",
- elm_widget_style_get(obj));
- if (!elm_layout_content_set(obj, "elm.selector", priv->col_bars_area))
- elm_layout_content_set(obj, "selector", priv->col_bars_area);
+ (obj, sd->col_bars_area, "colorselector", "bg",
+ elm_widget_style_get(obj));
+ if (!elm_layout_content_set(obj, "elm.selector", sd->col_bars_area))
+ elm_layout_content_set(obj, "selector", sd->col_bars_area);
+ _hsl_to_rgb(sd);
+ _color_bars_add(obj);
+}
- elm_layout_signal_emit(obj, "elm,state,both", "elm");
+EOLIAN static void
+_elm_colorselector_evas_object_smart_add(Eo *obj, Elm_Colorselector_Data *priv)
+{
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
- /* setup the color picker */
- priv->picker = elm_layout_add(obj);
- if (!elm_layout_theme_set(priv->picker, "colorselector", "picker/base", elm_widget_style_get(obj)))
+ eo_do_super(obj, MY_CLASS, evas_obj_smart_add());
+ elm_widget_sub_object_parent_add(obj);
+
+ if (!elm_layout_theme_set
+ (obj, "colorselector", "palette", elm_object_style_get(obj)))
CRI("Failed to set layout!");
- evas_object_size_hint_weight_set(priv->picker, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
- evas_object_size_hint_align_set(priv->picker, EVAS_HINT_FILL, EVAS_HINT_FILL);
- elm_widget_sub_object_add(obj, priv->picker);
+ _create_colorpalette(obj);
+
+ _create_colorcomponents(obj);
+
+ elm_layout_signal_emit(obj, "elm,state,both", "elm");
priv->mode = ELM_COLORSELECTOR_BOTH;
priv->focused = ELM_COLORSELECTOR_PALETTE;
@@ -1610,10 +1648,6 @@ _elm_colorselector_evas_object_smart_add(Eo *obj, Elm_Colorselector_Data *priv)
#endif
priv->grab.in = EINA_TRUE;
- _hsl_to_rgb(priv);
- _color_bars_add(obj);
- _color_picker_add(obj, priv);
-
elm_layout_sizing_eval(obj);
elm_widget_can_focus_set(obj, EINA_TRUE);
}
@@ -1624,7 +1658,6 @@ _elm_colorselector_evas_object_smart_del(Eo *obj, Elm_Colorselector_Data *sd)
int i = 0;
void *tmp[4];
-
evas_event_callback_del_full(evas_object_evas_get(obj), EVAS_CALLBACK_CANVAS_FOCUS_IN, _mouse_in_canvas, obj);
evas_event_callback_del_full(evas_object_evas_get(obj), EVAS_CALLBACK_CANVAS_FOCUS_OUT, _mouse_out_canvas, obj);
@@ -1846,19 +1879,27 @@ _elm_colorselector_elm_widget_focus_next(Eo *obj, Elm_Colorselector_Data *sd, El
if (!sd) return EINA_FALSE;
- if (!sd->items) return EINA_FALSE;
-
- EINA_LIST_FOREACH(sd->items, l, eo_item)
+ if ((sd->mode == ELM_COLORSELECTOR_PALETTE) ||
+ (sd->mode == ELM_COLORSELECTOR_ALL)||
+ (sd->mode == ELM_COLORSELECTOR_BOTH))
{
- Elm_Widget_Item_Data *witem = eo_data_scope_get(eo_item, ELM_WIDGET_ITEM_CLASS);
- items = eina_list_append(items, witem->access_obj);
+ if (!sd->items) return EINA_FALSE;
+ EINA_LIST_FOREACH(sd->items, l, eo_item)
+ {
+ Elm_Widget_Item_Data *witem = eo_data_scope_get(eo_item, ELM_WIDGET_ITEM_CLASS);
+ items = eina_list_append(items, witem->access_obj);
+ }
}
-
- for (i = 0; i < 4; i++)
+ if ((sd->mode == ELM_COLORSELECTOR_COMPONENTS) ||
+ (sd->mode == ELM_COLORSELECTOR_ALL) ||
+ (sd->mode == ELM_COLORSELECTOR_BOTH))
{
- items = eina_list_append(items, sd->cb_data[i]->lbt);
- items = eina_list_append(items, sd->cb_data[i]->access_obj);
- items = eina_list_append(items, sd->cb_data[i]->rbt);
+ for (i = 0; i < 4; i++)
+ {
+ items = eina_list_append(items, sd->cb_data[i]->lbt);
+ items = eina_list_append(items, sd->cb_data[i]->access_obj);
+ items = eina_list_append(items, sd->cb_data[i]->rbt);
+ }
}
return elm_widget_focus_list_next_get
@@ -1874,21 +1915,34 @@ _access_obj_process(Evas_Object *obj, Eina_Bool is_access)
ELM_COLORSELECTOR_DATA_GET(obj, sd);
- if (is_access)
+ if ((sd->mode == ELM_COLORSELECTOR_PALETTE) ||
+ (sd->mode == ELM_COLORSELECTOR_ALL) ||
+ (sd->mode == ELM_COLORSELECTOR_BOTH))
{
- EINA_LIST_FOREACH(sd->items, l, eo_it)
- eo_do(eo_it, elm_wdg_item_access_register());
-
- for (i = 0; i < 4; i++)
- _access_colorbar_register(obj, sd->cb_data[i],
- "elm.arrow_bg_access");
+ if (is_access)
+ {
+ EINA_LIST_FOREACH(sd->items, l, eo_it)
+ eo_do(eo_it, elm_wdg_item_access_register());
+ }
+ else
+ {
+ EINA_LIST_FOREACH(sd->items, l, eo_it)
+ eo_do(eo_it, elm_wdg_item_access_unregister());
+ }
}
- else
+ if ((sd->mode == ELM_COLORSELECTOR_COMPONENTS) ||
+ (sd->mode == ELM_COLORSELECTOR_ALL) ||
+ (sd->mode == ELM_COLORSELECTOR_BOTH))
{
- EINA_LIST_FOREACH(sd->items, l, eo_it)
- eo_do(eo_it, elm_wdg_item_access_unregister());
-
- //TODO: _elm_access_edje_object_part_object_unregister() ?
+ for (i = 0; i < 4; i++)
+ {
+ if (is_access)
+ _access_colorbar_register(obj, sd->cb_data[i],
+ "elm.arrow_bg_access");
+ else
+ _elm_access_edje_object_part_object_unregister(obj, sd->cb_data[i]->colorbar,
+ "elm.arrow_bg_access");
+ }
}
}
@@ -1982,6 +2036,7 @@ _elm_colorselector_mode_set(Eo *obj, Elm_Colorselector_Data *sd, Elm_Colorselect
break;
case ELM_COLORSELECTOR_PICKER:
+ _create_colorpicker(obj);
if (!elm_layout_content_set(obj, "elm.picker", sd->picker))
elm_layout_content_set(obj, "picker", sd->picker);
elm_layout_signal_emit(obj, "elm,state,picker", "elm");
@@ -1989,6 +2044,7 @@ _elm_colorselector_mode_set(Eo *obj, Elm_Colorselector_Data *sd, Elm_Colorselect
break;
case ELM_COLORSELECTOR_ALL:
+ _create_colorpicker(obj);
if (!elm_layout_content_set(obj, "elm.palette", sd->palette_box))
elm_layout_content_set(obj, "palette", sd->palette_box);
if (!elm_layout_content_set(obj, "elm.selector", sd->col_bars_area))