forked from enlightenment/efl
Efl.Ui.Textpath: fix a size problem
Summary: Textpath set its hint_size using its position and calulated path information. The path information is calculated using center postion, radius & start angle. For example, if textpath position is 0,0 and center positon of path is 100,100 and radius 50, then text will be located on the rigth side of textpath object. Moreover there is another problem. [Step to reproduce] 1. Launch elementary_test 2. open Efl.Ui.Textpath 3. see circle is not center aligned. 4. click Clockwise 1 ~ 2 times center position is changed repeatedly. This occurs because textpath size is calculated by position_set. It does not make sense that changing postion defines its size. So this patch is setting textpath hint_size using only given center position. The text will position on the middle of textpath object always. Reviewers: Hermet, jsuya Reviewed By: Hermet Subscribers: cedric, #reviewers, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D8930
This commit is contained in:
parent
708f67c488
commit
451959973d
|
@ -403,7 +403,7 @@ _text_draw(void *data)
|
|||
}
|
||||
|
||||
static void
|
||||
_path_data_get(Eo *obj, Efl_Ui_Textpath_Data *pd, Eina_Bool set_min)
|
||||
_path_data_get(Eo *obj, Efl_Ui_Textpath_Data *pd)
|
||||
{
|
||||
const Efl_Gfx_Path_Command_Type *cmd;
|
||||
const double *points;
|
||||
|
@ -508,10 +508,6 @@ _path_data_get(Eo *obj, Efl_Ui_Textpath_Data *pd, Eina_Bool set_min)
|
|||
}
|
||||
cmd++;
|
||||
}
|
||||
if (set_min)
|
||||
{
|
||||
efl_gfx_hint_size_min_set(obj, rect.size);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -563,7 +559,7 @@ _ellipsis_set(Efl_Ui_Textpath_Data *pd, Eo *obj)
|
|||
static void
|
||||
_efl_ui_textpath_efl_gfx_path_commit(Eo *obj, Efl_Ui_Textpath_Data *pd)
|
||||
{
|
||||
_path_data_get(obj, pd, EINA_TRUE);
|
||||
_path_data_get(obj, pd);
|
||||
_sizing_eval(pd);
|
||||
}
|
||||
|
||||
|
@ -651,7 +647,7 @@ _path_start_angle_adjust(Eo *obj, Efl_Ui_Textpath_Data *pd)
|
|||
pd->circle.start_angle - offset_angle,
|
||||
360);
|
||||
}
|
||||
_path_data_get(obj, pd, EINA_TRUE);
|
||||
_path_data_get(obj, pd);
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
|
@ -753,8 +749,34 @@ _efl_ui_textpath_efl_ui_widget_theme_apply(Eo *obj, Efl_Ui_Textpath_Data *pd)
|
|||
EOLIAN static void
|
||||
_efl_ui_textpath_efl_gfx_entity_position_set(Eo *obj, Efl_Ui_Textpath_Data *pd, Eina_Position2D pos)
|
||||
{
|
||||
Eina_Position2D opos, diff;
|
||||
Efl_Ui_Textpath_Segment *seg;
|
||||
double sx, sy, csx, csy, cex, cey, ex, ey;
|
||||
|
||||
opos = efl_gfx_entity_position_get(obj);
|
||||
|
||||
diff.x = pos.x - opos.x;
|
||||
diff.y = pos.y - opos.y;
|
||||
|
||||
efl_gfx_entity_position_set(efl_super(obj, MY_CLASS), pos);
|
||||
_path_data_get(obj, pd, EINA_FALSE);
|
||||
|
||||
EINA_INLIST_FOREACH(pd->segments, seg)
|
||||
{
|
||||
eina_bezier_values_get(&seg->bezier, &sx, &sy, &csx, &csy,
|
||||
&cex, &cey, &ex, &ey);
|
||||
sx += diff.x;
|
||||
sy += diff.y;
|
||||
csx += diff.x;
|
||||
csy += diff.y;
|
||||
cex += diff.x;
|
||||
cey += diff.y;
|
||||
ex += diff.x;
|
||||
ey += diff.y;
|
||||
|
||||
eina_bezier_values_set(&seg->bezier, sx, sy, csx, csy,
|
||||
cex, cey, ex, ey);
|
||||
}
|
||||
|
||||
_text_draw(pd);
|
||||
}
|
||||
|
||||
|
@ -792,9 +814,11 @@ _efl_ui_textpath_circle_set(Eo *obj, Efl_Ui_Textpath_Data *pd, double x, double
|
|||
radius * 2, start_angle, 360);
|
||||
}
|
||||
|
||||
_path_data_get(obj, pd, EINA_TRUE);
|
||||
_path_data_get(obj, pd);
|
||||
_path_start_angle_adjust(obj, pd);
|
||||
_sizing_eval(pd);
|
||||
|
||||
efl_gfx_hint_size_min_set(obj, EINA_SIZE2D(x * 2, y * 2));
|
||||
}
|
||||
|
||||
EOLIAN static int
|
||||
|
|
Loading…
Reference in New Issue