oooh fix some infinite loops in entry .. and oh so much make color

specture.selector/sliders WORK again... properly.



SVN revision: 79557
This commit is contained in:
Carsten Haitzler 2012-11-23 11:24:39 +00:00
parent 4d880b56ec
commit cff3bfb61b
5 changed files with 196 additions and 151 deletions

View File

@ -39,7 +39,7 @@ e_color_dialog_new(E_Container *con, const E_Color *color, Eina_Bool alpha_enabl
o = e_widget_csel_add(dia->dia->win->evas, dia->color, alpha_enabled);
evas_object_show(o);
e_widget_size_min_get(o, &mw, &mh);
e_dialog_content_set(dia->dia, o, 460, 260);
e_dialog_content_set(dia->dia, o, mw, mh);
e_widget_on_change_hook_set(o, _e_color_dialog_cb_csel_change, dia);
/* buttons at the bottom */

View File

@ -17,6 +17,7 @@ struct _E_Entry_Smart_Data
Evas_Coord theme_height;
int preedit_start_pos;
int preedit_end_pos;
int changing;
Eina_Bool enabled : 1;
Eina_Bool noedit : 1;
Eina_Bool focused : 1;
@ -105,6 +106,7 @@ e_entry_text_set(Evas_Object *entry, const char *_text)
{
E_Entry_Smart_Data *sd;
char *text = NULL;
const char *otext;
if (evas_object_smart_smart_get(entry) != _e_entry_smart) SMARTERRNR();
if ((!entry) || (!(sd = evas_object_smart_data_get(entry))))
@ -113,12 +115,15 @@ e_entry_text_set(Evas_Object *entry, const char *_text)
text = evas_textblock_text_utf8_to_markup(
edje_object_part_object_get(sd->entry_object, ENTRY_PART_NAME),
_text);
if ((text) && (_text) && (!strcmp(text, _text))) return;
if ((!text) && (!_text)) return;
otext = edje_object_part_text_get(sd->entry_object, ENTRY_PART_NAME);
if ((text) && (otext) && (!strcmp(text, otext))) return;
if ((!text) && (!otext)) return;
edje_object_part_text_set(sd->entry_object, ENTRY_PART_NAME, text);
sd->changing++;
edje_object_message_signal_process(sd->entry_object);
sd->changing--;
evas_object_smart_callback_call(entry, "changed", NULL);
if (text)
free(text);
if (text) free(text);
}
/**
@ -657,7 +662,7 @@ _entry_changed_signal_cb(void *data,
if ((!object) || !(sd = evas_object_smart_data_get(object)))
return;
if (sd->changing) return;
evas_object_smart_callback_call(object, "changed", NULL);
edje_object_size_min_calc(sd->entry_object, &sd->min_width, &sd->height);
_entry_recalc_size(object);

View File

@ -128,14 +128,14 @@ _e_wid_cb_color_changed(void *data, Evas_Object *o)
}
/* update the spectrum */
if (o != wd->spectrum && changed != -1)
if (o != wd->spectrum/* && changed != -1*/)
{
if (wd->mode == changed ||
(wd->mode >= E_COLOR_COMPONENT_H && changed <= E_COLOR_COMPONENT_B) ||
(wd->mode <= E_COLOR_COMPONENT_B && changed >= E_COLOR_COMPONENT_H))
e_widget_spectrum_update(wd->spectrum, 1);
else
e_widget_spectrum_update(wd->spectrum, 0);
e_widget_spectrum_update(wd->spectrum, 1);
}
e_widget_color_well_update(wd->well);
@ -152,26 +152,23 @@ _e_wid_cb_color_changed(void *data, Evas_Object *o)
case E_COLOR_COMPONENT_R:
snprintf(buf, 10, "%i", wd->cv->r);
break;
case E_COLOR_COMPONENT_G:
snprintf(buf, 10, "%i", wd->cv->g);
break;
case E_COLOR_COMPONENT_B:
snprintf(buf, 10, "%i", wd->cv->b);
break;
case E_COLOR_COMPONENT_H:
snprintf(buf, 10, "%.0f", wd->cv->h);
break;
case E_COLOR_COMPONENT_S:
snprintf(buf, 10, "%.2f", wd->cv->s);
break;
case E_COLOR_COMPONENT_V:
snprintf(buf, 10, "%.2f", wd->cv->v);
break;
default:
break;
}
e_widget_entry_text_set(eo, buf);
i++;
@ -197,7 +194,8 @@ e_widget_csel_add(Evas *evas, E_Color *color, Eina_Bool alpha_enabled)
E_Radio_Group *grp = NULL;
char *labels[6] = { N_("R"), N_("G"), N_("B"), N_("H"), N_("S"), N_("V") };
E_Widget_Data *wd;
Evas_Coord mw, mh;
obj = e_widget_add(evas);
e_widget_del_hook_set(obj, _e_wid_del_hook);
@ -245,6 +243,9 @@ e_widget_csel_add(Evas *evas, E_Color *color, Eina_Bool alpha_enabled)
case E_COLOR_COMPONENT_V:
snprintf(wd->values[i], 10, "%.2f", wd->cv->v);
break;
default:
break;
}
o = e_widget_radio_add(evas, _(labels[i]), i, grp);
@ -257,13 +258,14 @@ e_widget_csel_add(Evas *evas, E_Color *color, Eina_Bool alpha_enabled)
evas_object_show(o);
wd->sliders = eina_list_append(wd->sliders, o);
e_widget_on_change_hook_set(o, _e_wid_cb_color_changed, wd);
e_widget_table_object_append(frame, o, 1, i, 1, 1, 1, 1, 1, 0);
e_widget_size_min_set(o, 32, 16);
e_widget_table_object_append(frame, o, 1, i, 6, 1, 1, 1, 1, 0);
o = e_widget_entry_add(evas, &(wd->values[i]), NULL, NULL, NULL);
e_widget_sub_object_add(obj, o);
evas_object_show(o);
wd->entries = eina_list_append(wd->entries, o);
e_widget_table_object_append(frame, o, 2, i, 1, 1, 1, 1, 1, 1);
e_widget_table_object_append(frame, o, 7, i, 1, 1, 1, 1, 1, 0);
e_widget_on_change_hook_set(o, _e_wid_cb_color_changed, wd);
}
@ -274,33 +276,37 @@ e_widget_csel_add(Evas *evas, E_Color *color, Eina_Bool alpha_enabled)
o = e_widget_slider_add(evas, 1, 0, "%0.0f", 0, 255, 1, 0, NULL,
&(wd->cv->a), 100);
e_widget_on_change_hook_set(o, _e_wid_cb_alpha_changed, wd);
e_widget_table_object_append(frame, o, 1, i, 2, 1, 1, 1, 0, 0);
e_widget_table_object_append(frame, o, 1, i, 10, 1, 1, 1, 0, 0);
}
e_widget_table_object_append(table, frame, 2, 0, 1, 2, 1, 0, 1, 0);
o = e_widget_spectrum_add(evas, wd->mode, wd->cv);
e_widget_sub_object_add(obj, o);
evas_object_show(o);
e_widget_on_change_hook_set(o, _e_wid_cb_color_changed, wd);
wd->spectrum = o;
e_widget_table_object_append(table, o, 1, 1, 1, 1, 1, 1, 1, 1);
e_widget_size_min_set(o, 120, 120);
e_widget_table_object_append(table, o, 0, 0, 1, 2, 1, 1, 1, 1);
o = e_widget_cslider_add(evas, wd->mode, wd->cv, 1, 1);
e_widget_sub_object_add(obj, o);
e_widget_on_change_hook_set(o, _e_wid_cb_color_changed, wd);
e_widget_size_min_set(o, 30, 50);
e_widget_size_min_set(o, 16, 16);
evas_object_show(o);
wd->vert = o;
e_widget_table_object_append(table, o, 2, 1, 1, 1, 0, 1, 0, 1);
e_widget_table_object_append(table, frame, 3, 1, 1, 1, 1, 1, 1, 1);
e_widget_table_object_append(table, o, 1, 0, 1, 2, 0, 1, 0, 1);
o = e_widget_color_well_add(evas, wd->cv, 0);
e_widget_sub_object_add(obj, o);
evas_object_show(o);
evas_object_resize(o, 20, 20);
wd->well = o;
e_widget_table_object_append(table, o, 3, 2, 1, 1, 1, 1, 1, 1);
e_widget_size_min_set(o, 32, 32);
e_widget_table_object_append(table, o, 0, 2, 3, 1, 1, 1, 0, 0);
e_widget_size_min_get(table, &mw, &mh);
e_widget_size_min_set(obj, mw, mh);
return obj;
}

View File

@ -8,8 +8,6 @@ struct _E_Widget_Data
Evas_Object *o_grad;
Evas_Object *o_event;
Eina_List *o_hgrad;
Evas_Coord x, y, w, h;
int vertical;
@ -37,9 +35,9 @@ static void _e_wid_cb_drag_start(void *data, Evas_Object *obj, const char *emiss
static void _e_wid_cb_drag_stop(void *data, Evas_Object *obj, const char *emission, const char *source);
static void _e_wid_cb_drag(void *data, Evas_Object *obj, const char *emission, const char *source);
/* static void _e_wid_cb_down(void *data, Evas *e, Evas_Object *obj, void *event_info); */
/* static void _e_wid_cb_move(void *data, Evas *e, Evas_Object *obj, void *event_info); */
/* static void _e_wid_cb_up(void *data, Evas *e, Evas_Object *obj, void *event_info); */
static void _e_wid_cb_down(void *data, Evas *e, Evas_Object *obj, void *event_info);
static void _e_wid_cb_move(void *data, Evas *e, Evas_Object *obj, void *event_info);
static void _e_wid_cb_up(void *data, Evas *e, Evas_Object *obj, void *event_info);
Evas_Object *
e_widget_cslider_add(Evas *evas, E_Color_Component mode, E_Color *color, int vertical, int fixed)
@ -63,7 +61,6 @@ e_widget_cslider_add(Evas *evas, E_Color_Component mode, E_Color *color, int ver
wd->mode = mode;
wd->color = color;
wd->prev = calloc(1, sizeof (E_Color));
wd->o_hgrad = NULL;
o = edje_object_add(evas);
wd->o_cslider = o;
@ -76,6 +73,8 @@ e_widget_cslider_add(Evas *evas, E_Color_Component mode, E_Color *color, int ver
evas_object_show(o);
edje_object_size_min_calc(o, &mw, &mh);
e_widget_size_min_set(obj, mw, mh);
evas_object_event_callback_add(o, EVAS_CALLBACK_MOVE, _e_wid_move, wd);
evas_object_event_callback_add(o, EVAS_CALLBACK_RESIZE, _e_wid_resize, wd);
edje_object_signal_callback_add(wd->o_cslider, "drag,start", "*", _e_wid_cb_drag_start, obj);
edje_object_signal_callback_add(wd->o_cslider, "drag", "*", _e_wid_cb_drag, obj);
@ -86,19 +85,19 @@ e_widget_cslider_add(Evas *evas, E_Color_Component mode, E_Color *color, int ver
e_widget_resize_object_set(obj, o);
/* add gradient obj */
o = evas_object_rectangle_add(evas);
o = evas_object_image_filled_add(evas);
e_widget_sub_object_add(obj, o);
/* evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _e_wid_cb_down, obj); */
/* evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_MOVE, _e_wid_cb_move, obj); */
/* evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_UP, _e_wid_cb_up, obj); */
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _e_wid_cb_down, obj);
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_MOVE, _e_wid_cb_move, obj);
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_UP, _e_wid_cb_up, obj);
evas_object_color_set(o, 255, 255, 255, 255);
wd->o_grad = o;
edje_object_part_swallow(wd->o_cslider, "e.swallow.content", o);
o = evas_object_rectangle_add(evas);
evas_object_repeat_events_set(o, EINA_TRUE);
e_widget_sub_object_add(obj, o);
evas_object_event_callback_add(o, EVAS_CALLBACK_MOVE, _e_wid_move, wd);
evas_object_show(o);
evas_object_color_set(o, 0, 0, 0, 0);
wd->o_event = o;
@ -112,11 +111,11 @@ static void
_e_wid_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
E_Widget_Data *wd;
/* Evas_Coord x, y; */
Evas_Coord x, y;
wd = data;
/* evas_object_geometry_get(obj, &x, &y, NULL, NULL); */
/* evas_object_move(wd->o_grad, x, y); */
evas_object_geometry_get(obj, &x, &y, NULL, NULL);
evas_object_move(wd->o_event, x, y);
_e_wid_update(wd);
}
@ -124,11 +123,11 @@ static void
_e_wid_resize(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
E_Widget_Data *wd;
/* Evas_Coord w, h; */
Evas_Coord w, h;
wd = data;
/* evas_object_geometry_get(obj, NULL, NULL, &w, &h); */
/* evas_object_resize(wd->o_grad, w, h); */
evas_object_geometry_get(obj, NULL, NULL, &w, &h);
evas_object_resize(wd->o_event, w, h);
_e_wid_update(wd);
}
@ -217,8 +216,6 @@ _e_wid_update(E_Widget_Data *wd)
if (changed)
{
Evas_Object *o;
if (wd->fixed)
_e_wid_update_fixed(wd);
else
@ -227,17 +224,6 @@ _e_wid_update(E_Widget_Data *wd)
wd->x = x; wd->y = y;
wd->w = w; wd->h = h;
memcpy(wd->prev, wd->color, sizeof (E_Color));
if (wd->mode != E_COLOR_COMPONENT_H)
{
EINA_LIST_FREE(wd->o_hgrad, o)
evas_object_del(o);
evas_object_show(wd->o_grad);
}
else
{
evas_object_hide(wd->o_grad);
}
}
}
@ -246,37 +232,70 @@ _e_wid_gradient_set(Evas_Object *o, Eina_Bool orientation,
int rf, int gf, int bf,
int rt, int gt, int bt)
{
static Evas_Map *m = NULL;
if (!m) m = evas_map_new(4);
evas_map_util_points_populate_from_object(m, o);
if (orientation)
{
evas_map_point_color_set(m, 0, rf, gf, bf, 255);
evas_map_point_color_set(m, 1, rf, gf, bf, 255);
evas_map_point_color_set(m, 2, rt, gt, bt, 255);
evas_map_point_color_set(m, 3, rt, gt, bt, 255);
}
unsigned int *pixels, *p;
int x, r, g, b;
if (!orientation)
evas_object_image_size_set(o, 256, 1);
else
evas_object_image_size_set(o, 1, 256);
pixels = evas_object_image_data_get(o, EINA_TRUE);
if (pixels)
{
/* Rotate by 270° */
evas_map_point_color_set(m, 0, rf, gf, bf, 255);
evas_map_point_color_set(m, 1, rt, gt, bt, 255);
evas_map_point_color_set(m, 2, rt, gt, bt, 255);
evas_map_point_color_set(m, 3, rf, gf, bf, 255);
p = pixels;
for (x = 0; x < 256; x++)
{
r = ((rf * (255 - x)) + (rt * x)) / 255;
g = ((gf * (255 - x)) + (gt * x)) / 255;
b = ((bf * (255 - x)) + (bt * x)) / 255;
*p = 0xff000000 | (r << 16) | (g << 8) | (b);
p++;
}
evas_object_image_data_set(o, pixels);
evas_object_image_data_update_add(o, 0, 0, 256, 256);
}
}
evas_object_map_enable_set(o, 1);
evas_object_map_set(o, m);
static void
_e_wid_gradient_range_set(Evas_Object *o, Eina_Bool orientation,
int rf, int gf, int bf,
int rt, int gt, int bt,
int from, int to)
{
unsigned int *pixels, *p;
int x, r, g, b, v, t;
if (from < 0) from = 0;
if (from > 255) from = 255;
if (to < 0) to = 0;
if (to > 256) to = 256;
if (to <= from) return;
if (!orientation)
evas_object_image_size_set(o, 256, 1);
else
evas_object_image_size_set(o, 1, 256);
pixels = evas_object_image_data_get(o, EINA_TRUE);
if (pixels)
{
t = to - from;
p = pixels + from;
for (x = from; x < to; x++)
{
v = x - from;
r = ((rf * (t - v)) + (rt * v)) / t;
g = ((gf * (t - v)) + (gt * v)) / t;
b = ((bf * (t - v)) + (bt * v)) / t;
*p = 0xff000000 | (r << 16) | (g << 8) | (b);
p++;
}
evas_object_image_data_set(o, pixels);
evas_object_image_data_update_add(o, 0, 0, 256, 256);
}
}
static void
_e_wid_update_standard(E_Widget_Data *wd)
{
Evas_Object *o;
Eina_List *l;
Evas_Coord x, y, w, h;
int r, g, b;
int rd, gd, bd;
int max, min;
@ -316,40 +335,12 @@ _e_wid_update_standard(E_Widget_Data *wd)
break;
case E_COLOR_COMPONENT_H:
evas_color_hsv_to_rgb(0, wd->color->s, wd->color->v, &max, &min, NULL);
if (!wd->o_hgrad)
{
Evas *e;
e = evas_object_evas_get(wd->o_grad);
for (i = 0; i < 6; ++i)
wd->o_hgrad = eina_list_append(wd->o_hgrad,
evas_object_rectangle_add(e));
}
evas_object_geometry_get(wd->o_grad, &x, &y, &w, &h);
evas_object_hide(wd->o_grad);
i = 0;
EINA_LIST_FOREACH(wd->o_hgrad, l, o)
{
if (wd->vertical)
{
evas_object_move(o, x, y + (i * h) / 6);
evas_object_resize(o, w, h / 6);
}
else
{
evas_object_move(o, x + (i * w) / 6, y);
evas_object_resize(o, w / 6, h);
}
_e_wid_gradient_set(o, wd->vertical,
*grad[i][0], *grad[i][1], *grad[i][2],
*grad[i + 1][0], *grad[i + 1][1], *grad[i + 1][2]);
evas_object_show(o);
i++;
}
for (i = 0; i < 6; i++)
_e_wid_gradient_range_set(wd->o_grad, wd->vertical,
*grad[i][0], *grad[i][1], *grad[i][2],
*grad[i + 1][0], *grad[i + 1][1], *grad[i + 1][2],
((i + 0) * 256) / 6,
((i + 1) * 256) / 6);
vx = wd->color->h / 360.0;
break;
case E_COLOR_COMPONENT_S:
@ -370,7 +361,7 @@ _e_wid_update_standard(E_Widget_Data *wd)
rd, gd, bd);
vx = wd->color->v;
break;
case E_COLOR_COMPONENT_MAX:
default:
break;
}
@ -383,10 +374,6 @@ _e_wid_update_fixed(E_Widget_Data *wd)
{
#define GMAX 255
#define GMIN 0
Evas_Object *o;
Eina_List *l;
Evas_Coord x, y, w, h;
unsigned int i;
float vx = 0;
int grad[7][3] = {
@ -432,40 +419,12 @@ _e_wid_update_fixed(E_Widget_Data *wd)
* 300 x n x
* 360 x n n
*/
if (!wd->o_hgrad)
{
Evas *e;
e = evas_object_evas_get(wd->o_grad);
for (i = 0; i < 6; ++i)
wd->o_hgrad = eina_list_append(wd->o_hgrad,
evas_object_rectangle_add(e));
}
evas_object_geometry_get(wd->o_grad, &x, &y, &w, &h);
evas_object_hide(wd->o_grad);
i = 0;
EINA_LIST_FOREACH(wd->o_hgrad, l, o)
{
if (wd->vertical)
{
evas_object_move(o, x, y + (i * h) / 6);
evas_object_resize(o, w, h / 6);
}
else
{
evas_object_move(o, x + (i * w) / 6, y);
evas_object_resize(o, w / 6, h);
}
_e_wid_gradient_set(o, wd->vertical,
grad[i][0], grad[i][1], grad[i][2],
grad[i + 1][0], grad[i + 1][1], grad[i + 1][2]);
evas_object_show(o);
i++;
}
for (i = 0; i < 6; i++)
_e_wid_gradient_range_set(wd->o_grad, wd->vertical,
grad[i][0], grad[i][1], grad[i][2],
grad[i + 1][0], grad[i + 1][1], grad[i + 1][2],
((i + 0) * 256) / 6,
((i + 1) * 256) / 6);
vx = wd->color->h / 360.0;
break;
case E_COLOR_COMPONENT_S:
@ -480,7 +439,7 @@ _e_wid_update_fixed(E_Widget_Data *wd)
0, 0, 0);
vx = wd->color->v;
break;
case E_COLOR_COMPONENT_MAX:
default:
break;
}
@ -588,3 +547,78 @@ _e_wid_cb_drag(void *data, Evas_Object *obj __UNUSED__, const char *emission __U
_e_wid_value_set(o_wid, val);
}
}
static void
_e_wid_mouse_handle(Evas_Object *obj, int mx, int my)
{
E_Widget_Data *wd;
Evas_Coord x, y, w, h;
double vx = 0.0, vy = 0.0;
wd = e_widget_data_get(obj);
evas_object_geometry_get(wd->o_grad, &x, &y, &w, &h);
if (w > 1) vx = (mx - x) / (double)(w - 1);
if (h > 1) vy = (my - y) / (double)(h - 1);
if (vx > 1) vx = 1;
if (vx < 0) vx = 0;
if (vy > 1) vy = 1;
if (vy < 0) vy = 0;
if (wd->vertical)
{
_e_wid_value_set(obj, 1.0 - vy);
edje_object_part_drag_value_set(wd->o_cslider, "e.dragable.cursor", 0.5, 1.0 - vy);
}
else
{
_e_wid_value_set(obj, vx);
edje_object_part_drag_value_set(wd->o_cslider, "e.dragable.cursor", vx, 0.5);
}
e_widget_change(obj);
}
static void
_e_wid_cb_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
{
Evas_Event_Mouse_Down *ev;
Evas_Object *o_wid;
E_Widget_Data *wd;
o_wid = data;
wd = e_widget_data_get(o_wid);
ev = event_info;
wd->dragging = 1;
_e_wid_mouse_handle(o_wid, ev->canvas.x, ev->canvas.y);
}
static void
_e_wid_cb_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
Evas_Object *o_wid;
E_Widget_Data *wd;
o_wid = data;
wd = e_widget_data_get(o_wid);
wd->dragging = 0;
}
static void
_e_wid_cb_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
{
Evas_Event_Mouse_Move *ev;
Evas_Object *o_wid;
E_Widget_Data *wd;
o_wid = data;
wd = e_widget_data_get(o_wid);
ev = event_info;
if (wd->dragging == 1)
{
_e_wid_mouse_handle(o_wid, ev->cur.canvas.x, ev->cur.canvas.y);
}
}

View File

@ -68,9 +68,9 @@ e_widget_spectrum_add(Evas *evas, E_Color_Component mode, E_Color *cv)
evas_object_show(o);
wd->o_spectrum = o;
edje_object_part_swallow(wd->o_edje, "e.swallow.content", o);
edje_extern_object_min_size_set(o, 100, 100);
o = evas_object_rectangle_add(evas);
evas_object_repeat_events_set(o, EINA_TRUE);
evas_object_color_set(o, 0, 0, 0, 0);
e_widget_sub_object_add(obj, o);
evas_object_show(o);