Elementary scroller: Fixed an issue in scroller. When a resize happens (or any change for that matter), we should go to the last "asked for" location. This for example fixes an issue with elm_scrolled_entry (and many other widgets) showing "empty regions" on some resizes.

SVN revision: 56276
This commit is contained in:
Tom Hacohen 2011-01-24 03:01:29 +00:00
parent 338cd44b00
commit 5e82ffad18
2 changed files with 18 additions and 8 deletions

View File

@ -34,6 +34,7 @@ typedef struct _Widget_Data Widget_Data;
struct _Widget_Data
{
Evas_Coord wx, wy, ww, wh; /* Last "wanted" geometry */
Evas_Object *scr;
Evas_Object *content;
const char *widget_name, *widget_base;
@ -247,20 +248,15 @@ _signal_callback_del_hook(Evas_Object *obj, const char *emission, const char *so
static void
_show_region_hook(void *data, Evas_Object *obj)
{
Widget_Data *wd = elm_widget_data_get(data);
Evas_Coord x, y, w, h;
if (!wd) return;
elm_widget_show_region_get(obj, &x, &y, &w, &h);
if (wd->scr)
elm_smart_scroller_child_region_show(wd->scr, x, y, w, h);
elm_scroller_region_show(data, x, y, w, h);
}
static void
_focus_region_hook(Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h)
{
Widget_Data *wd = elm_widget_data_get(obj);
if (wd->scr)
elm_smart_scroller_child_region_show(wd->scr, x, y, w, h);
elm_scroller_region_show(obj, x, y, w, h);
}
static void
@ -299,6 +295,7 @@ _sizing_eval(Evas_Object *obj)
if ((maxw > 0) && (w > maxw)) w = maxw;
if ((maxh > 0) && (h > maxh)) h = maxh;
evas_object_size_hint_min_set(obj, w, h);
elm_smart_scroller_child_region_show(wd->scr, wd->wx, wd->wy, wd->ww, wd->wh);
}
}
@ -531,6 +528,8 @@ elm_scroller_content_set(Evas_Object *obj, Evas_Object *content)
if (!wd) return;
if (wd->content == content) return;
if (wd->content) evas_object_del(wd->content);
wd->wx = wd->wh = wd->ww = wd->wy = 0;
wd->content = content;
if (content)
{
@ -655,6 +654,11 @@ elm_scroller_region_show(Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coor
ELM_CHECK_WIDTYPE(obj, widtype);
Widget_Data *wd = elm_widget_data_get(obj);
if ((!wd) || (!wd->scr)) return;
wd->wx = x;
wd->wh = h;
wd->ww = w;
wd->wy = y;
elm_smart_scroller_child_region_show(wd->scr, x, y, w, h);
}
@ -872,6 +876,10 @@ elm_scroller_region_bring_in(Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_
ELM_CHECK_WIDTYPE(obj, widtype);
Widget_Data *wd = elm_widget_data_get(obj);
if ((!wd) || (!wd->scr)) return;
wd->wx = x;
wd->wh = h;
wd->ww = w;
wd->wy = y;
elm_smart_scroller_region_bring_in(wd->scr, x, y, w, h);
}

View File

@ -941,7 +941,9 @@ elm_smart_scroller_child_region_show(Evas_Object *obj, Evas_Coord x, Evas_Coord
ny = y + h - (ch - my);
if (ny > y) ny = y;
}
if ((nx == px) && (ny == py)) return;
/* Note: this function should "show" a cursor position even if it's the same
* as the cached position, because it makes sense if the size of the
* scroller or the child have changed */
if ((sd->down.bounce_x_animator) || (sd->down.bounce_y_animator) ||
(sd->scrollto.x.animator) || (sd->scrollto.y.animator))
{