fix evil scroller self-feeing loop scrollbar sizing issues.

SVN revision: 74041
This commit is contained in:
Carsten Haitzler 2012-07-18 06:59:16 +00:00
parent 3250310508
commit e73440197e
4 changed files with 80 additions and 47 deletions

View File

@ -312,3 +312,9 @@
* Disable html mode pastes from cnp to work around thunderbird.
2012-07-18 Carsten Haitzler (The Rasterman)
* Fix evil little bug where scrolelrs with scrollbars make
self-feeding loops expecially with min size hints on scrollers (which
the change in smart object infra broke too - fixed here).

View File

@ -576,45 +576,56 @@ _elm_scroll_scroll_bar_h_visibility_adjust(
evas_object_geometry_get(sid->pan_obj, NULL, NULL, &vw, &vh);
if (sid->hbar_visible)
{
if (sid->hbar_flags == ELM_SCROLLER_POLICY_AUTO)
if (sid->min_w)
{
if ((sid->content) || (sid->extern_pan))
scroll_h_vis_change = 1;
sid->hbar_visible = EINA_FALSE;
}
else
{
if (sid->hbar_flags == ELM_SCROLLER_POLICY_AUTO)
{
if (w <= vw)
if ((sid->content) || (sid->extern_pan))
{
if (w <= vw)
{
scroll_h_vis_change = 1;
sid->hbar_visible = EINA_FALSE;
}
}
else
{
scroll_h_vis_change = 1;
sid->hbar_visible = EINA_FALSE;
}
}
else
else if (sid->hbar_flags == ELM_SCROLLER_POLICY_OFF)
{
scroll_h_vis_change = 1;
sid->hbar_visible = EINA_FALSE;
}
}
else if (sid->hbar_flags == ELM_SCROLLER_POLICY_OFF)
{
scroll_h_vis_change = 1;
sid->hbar_visible = EINA_FALSE;
}
}
else
{
if (sid->hbar_flags == ELM_SCROLLER_POLICY_AUTO)
if (!sid->min_w)
{
if ((sid->content) || (sid->extern_pan))
if (sid->hbar_flags == ELM_SCROLLER_POLICY_AUTO)
{
if (w > vw)
if ((sid->content) || (sid->extern_pan))
{
scroll_h_vis_change = 1;
sid->hbar_visible = EINA_TRUE;
if (w > vw)
{
scroll_h_vis_change = 1;
sid->hbar_visible = EINA_TRUE;
}
}
}
}
else if (sid->hbar_flags == ELM_SCROLLER_POLICY_ON)
{
scroll_h_vis_change = 1;
sid->hbar_visible = EINA_TRUE;
else if (sid->hbar_flags == ELM_SCROLLER_POLICY_ON)
{
scroll_h_vis_change = 1;
sid->hbar_visible = EINA_TRUE;
}
}
}
if (scroll_h_vis_change)
@ -627,13 +638,13 @@ _elm_scroll_scroll_bar_h_visibility_adjust(
else
edje_object_signal_emit
(sid->edje_obj, "elm,action,hide,hbar", "elm");
edje_object_message_signal_process(sid->edje_obj);
_elm_scroll_scroll_bar_size_adjust(sid);
}
else
edje_object_signal_emit
(sid->edje_obj, "elm,action,hide,hbar", "elm");
edje_object_message_signal_process(sid->edje_obj);
_elm_scroll_scroll_bar_size_adjust(sid);
elm_layout_sizing_eval(sid->obj);
}
return scroll_h_vis_change;
@ -653,45 +664,56 @@ _elm_scroll_scroll_bar_v_visibility_adjust(
evas_object_geometry_get(sid->pan_obj, NULL, NULL, &vw, &vh);
if (sid->vbar_visible)
{
if (sid->vbar_flags == ELM_SCROLLER_POLICY_AUTO)
if (sid->min_h)
{
if ((sid->content) || (sid->extern_pan))
scroll_v_vis_change = 1;
sid->vbar_visible = EINA_FALSE;
}
else
{
if (sid->vbar_flags == ELM_SCROLLER_POLICY_AUTO)
{
if (h <= vh)
if ((sid->content) || (sid->extern_pan))
{
if (h <= vh)
{
scroll_v_vis_change = 1;
sid->vbar_visible = EINA_FALSE;
}
}
else
{
scroll_v_vis_change = 1;
sid->vbar_visible = EINA_FALSE;
}
}
else
else if (sid->vbar_flags == ELM_SCROLLER_POLICY_OFF)
{
scroll_v_vis_change = 1;
sid->vbar_visible = EINA_FALSE;
}
}
else if (sid->vbar_flags == ELM_SCROLLER_POLICY_OFF)
{
scroll_v_vis_change = 1;
sid->vbar_visible = EINA_FALSE;
}
}
else
{
if (sid->vbar_flags == ELM_SCROLLER_POLICY_AUTO)
if (!sid->min_h)
{
if ((sid->content) || (sid->extern_pan))
if (sid->vbar_flags == ELM_SCROLLER_POLICY_AUTO)
{
if (h > vh)
if ((sid->content) || (sid->extern_pan))
{
scroll_v_vis_change = 1;
sid->vbar_visible = EINA_TRUE;
if (h > vh)
{
scroll_v_vis_change = 1;
sid->vbar_visible = EINA_TRUE;
}
}
}
}
else if (sid->vbar_flags == ELM_SCROLLER_POLICY_ON)
{
scroll_v_vis_change = 1;
sid->vbar_visible = EINA_TRUE;
else if (sid->vbar_flags == ELM_SCROLLER_POLICY_ON)
{
scroll_v_vis_change = 1;
sid->vbar_visible = EINA_TRUE;
}
}
}
if (scroll_v_vis_change)
@ -704,13 +726,13 @@ _elm_scroll_scroll_bar_v_visibility_adjust(
else
edje_object_signal_emit
(sid->edje_obj, "elm,action,hide,vbar", "elm");
edje_object_message_signal_process(sid->edje_obj);
_elm_scroll_scroll_bar_size_adjust(sid);
}
else
edje_object_signal_emit
(sid->edje_obj, "elm,action,hide,vbar", "elm");
edje_object_message_signal_process(sid->edje_obj);
_elm_scroll_scroll_bar_size_adjust(sid);
elm_layout_sizing_eval(sid->obj);
}
return scroll_v_vis_change;
@ -990,8 +1012,8 @@ _elm_scroll_content_min_limit(Evas_Object *obj,
{
ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
if (!sid->pan_obj || !sid->edje_obj) return;
if (!sid->edje_obj) return;
if (!sid->cb_func.content_min_limit)
{
ERR("Content minimim size limiting is unimplemented -- you "
@ -999,6 +1021,8 @@ _elm_scroll_content_min_limit(Evas_Object *obj,
return;
}
sid->min_w = !!w;
sid->min_h = !!h;
sid->cb_func.content_min_limit(obj, w, h);
}
@ -3537,8 +3561,9 @@ _elm_scroll_policy_set(Evas_Object *obj,
else
edje_object_signal_emit
(sid->edje_obj, "elm,action,show_notalways,vbar", "elm");
edje_object_message_signal_process(sid->edje_obj);
_elm_scroll_scroll_bar_size_adjust(sid);
elm_layout_sizing_eval(sid->obj);
}
static void

View File

@ -301,6 +301,8 @@ struct _Elm_Scrollable_Smart_Interface_Data
Eina_Bool bouncemex : 1;
Eina_Bool freeze : 1;
Eina_Bool hold : 1;
Eina_Bool min_w : 1;
Eina_Bool min_h : 1;
};
typedef struct _Elm_Scrollable_Smart_Interface Elm_Scrollable_Smart_Interface;

View File

@ -341,7 +341,7 @@ _elm_scroller_smart_sizing_eval(Evas_Object *obj)
if (sd->min_w) w = vmw + minw;
if (sd->min_h) h = vmh + minh;
evas_object_size_hint_max_get(obj, &maxw, &maxh);
if ((maxw > 0) && (w > maxw)) w = maxw;
if ((maxh > 0) && (h > maxh)) h = maxh;