e_gadcon_popup now responds to changes in the content's size hint changes, and resizes itself accordingly.

with this, the resize func will no longer be needed, if users of the popup set the size_min hint of the content of the popup.


SVN revision: 40864
This commit is contained in:
Viktor Kojouharov 2009-05-31 15:48:26 +00:00
parent 61507d226d
commit 293b3d41dd
1 changed files with 107 additions and 78 deletions

View File

@ -6,6 +6,9 @@
/* local subsystem functions */ /* local subsystem functions */
static void _e_gadcon_popup_free(E_Gadcon_Popup *pop); static void _e_gadcon_popup_free(E_Gadcon_Popup *pop);
static void _e_gadcon_popup_locked_set(E_Gadcon_Popup *pop, Eina_Bool locked); static void _e_gadcon_popup_locked_set(E_Gadcon_Popup *pop, Eina_Bool locked);
static void _e_gadcon_popup_size_recalc(E_Gadcon_Popup *pop, Evas_Object *obj, Eina_Bool skip_resize);
static void _e_gadcon_popup_position(E_Gadcon_Popup *pop);
static void _e_gadcon_popup_changed_size_hints_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
/* externally accessible functions */ /* externally accessible functions */
@ -40,7 +43,6 @@ e_gadcon_popup_new(E_Gadcon_Client *gcc, void (*resize_func) (Evas_Object *obj,
EAPI void EAPI void
e_gadcon_popup_content_set(E_Gadcon_Popup *pop, Evas_Object *o) e_gadcon_popup_content_set(E_Gadcon_Popup *pop, Evas_Object *o)
{ {
Evas_Coord w = 0, h = 0;
Evas_Object *old_o; Evas_Object *old_o;
if (!pop) return; if (!pop) return;
@ -53,26 +55,16 @@ e_gadcon_popup_content_set(E_Gadcon_Popup *pop, Evas_Object *o)
edje_object_part_unswallow(pop->o_bg, old_o); edje_object_part_unswallow(pop->o_bg, old_o);
evas_object_del(old_o); evas_object_del(old_o);
} }
e_widget_min_size_get(o, &w, &h);
if ((!w) || (!h)) evas_object_size_hint_min_get(o, &w, &h);
if ((!w) || (!h))
{
edje_object_size_min_get(o, &w, &h);
edje_object_size_min_restricted_calc(o, &w, &h, w, h);
}
if (pop->resize_func) pop->resize_func(o, &w, &h);
edje_extern_object_min_size_set(o, w, h);
edje_object_part_swallow(pop->o_bg, "e.swallow.content", o); edje_object_part_swallow(pop->o_bg, "e.swallow.content", o);
edje_object_size_min_calc(pop->o_bg, &pop->w, &pop->h); evas_object_event_callback_add(o, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
evas_object_resize(pop->o_bg, pop->w, pop->h); _e_gadcon_popup_changed_size_hints_cb, pop);
_e_gadcon_popup_size_recalc(pop, o, EINA_FALSE);
} }
EAPI void EAPI void
e_gadcon_popup_show(E_Gadcon_Popup *pop) e_gadcon_popup_show(E_Gadcon_Popup *pop)
{ {
Evas_Coord gx, gy, gw, gh, zw, zh, zx, zy;
Evas_Coord px, py;
if (!pop) return; if (!pop) return;
E_OBJECT_CHECK(pop); E_OBJECT_CHECK(pop);
E_OBJECT_TYPE_CHECK(pop, E_GADCON_POPUP_TYPE); E_OBJECT_TYPE_CHECK(pop, E_GADCON_POPUP_TYPE);
@ -81,6 +73,103 @@ e_gadcon_popup_show(E_Gadcon_Popup *pop)
e_popup_show(pop->win); e_popup_show(pop->win);
_e_gadcon_popup_position(pop);
}
EAPI void
e_gadcon_popup_hide(E_Gadcon_Popup *pop)
{
if (!pop) return;
E_OBJECT_CHECK(pop);
E_OBJECT_TYPE_CHECK(pop, E_GADCON_POPUP_TYPE);
if (pop->pinned) return;
e_popup_hide(pop->win);
if (pop->gadcon_was_locked)
_e_gadcon_popup_locked_set(pop, 0);
}
EAPI void
e_gadcon_popup_toggle_pinned(E_Gadcon_Popup *pop)
{
if (!pop) return;
E_OBJECT_CHECK(pop);
E_OBJECT_TYPE_CHECK(pop, E_GADCON_POPUP_TYPE);
if (pop->pinned)
{
pop->pinned = 0;
edje_object_signal_emit(pop->o_bg, "e,state,unpinned", "e");
}
else
{
pop->pinned = 1;
edje_object_signal_emit(pop->o_bg, "e,state,pinned", "e");
}
}
EAPI void
e_gadcon_popup_lock_set(E_Gadcon_Popup *pop, Eina_Bool setting)
{
if (!pop) return;
E_OBJECT_CHECK(pop);
E_OBJECT_TYPE_CHECK(pop, E_GADCON_POPUP_TYPE);
setting = !!setting;
if (pop->gadcon_lock == setting) return;
pop->gadcon_lock = setting;
if (setting != pop->gadcon_was_locked)
_e_gadcon_popup_locked_set(pop, setting);
}
/* local subsystem functions */
static void
_e_gadcon_popup_free(E_Gadcon_Popup *pop)
{
if (pop->gadcon_was_locked)
_e_gadcon_popup_locked_set(pop, 0);
pop->gcc = NULL;
e_object_del(E_OBJECT(pop->win));
free(pop);
}
static void
_e_gadcon_popup_locked_set(E_Gadcon_Popup *pop, Eina_Bool locked)
{
if (!pop->gcc)
return;
e_gadcon_locked_set(pop->gcc->gadcon, locked);
pop->gadcon_was_locked = locked;
}
static void
_e_gadcon_popup_size_recalc(E_Gadcon_Popup *pop, Evas_Object *obj, Eina_Bool skip_resize)
{
Evas_Coord w = 0, h = 0;
e_widget_min_size_get(obj, &w, &h);
if ((!w) || (!h)) evas_object_size_hint_min_get(obj, &w, &h);
if ((!w) || (!h))
{
edje_object_size_min_get(obj, &w, &h);
edje_object_size_min_restricted_calc(obj, &w, &h, w, h);
}
if (pop->resize_func && !skip_resize) pop->resize_func(obj, &w, &h);
edje_extern_object_min_size_set(obj, w, h);
edje_object_size_min_calc(pop->o_bg, &pop->w, &pop->h);
evas_object_resize(pop->o_bg, pop->w, pop->h);
if (pop->win->visible)
_e_gadcon_popup_position(pop);
}
static void
_e_gadcon_popup_position(E_Gadcon_Popup *pop)
{
Evas_Coord gx, gy, gw, gh, zw, zh, zx, zy, px, py;
/* Popup positioning */ /* Popup positioning */
e_gadcon_client_geometry_get(pop->gcc, &gx, &gy, &gw, &gh); e_gadcon_client_geometry_get(pop->gcc, &gx, &gy, &gw, &gh);
zx = pop->gcc->gadcon->zone->x; zx = pop->gcc->gadcon->zone->x;
@ -150,70 +239,10 @@ e_gadcon_popup_show(E_Gadcon_Popup *pop)
_e_gadcon_popup_locked_set(pop, 1); _e_gadcon_popup_locked_set(pop, 1);
} }
EAPI void
e_gadcon_popup_hide(E_Gadcon_Popup *pop)
{
if (!pop) return;
E_OBJECT_CHECK(pop);
E_OBJECT_TYPE_CHECK(pop, E_GADCON_POPUP_TYPE);
if (pop->pinned) return;
e_popup_hide(pop->win);
if (pop->gadcon_was_locked)
_e_gadcon_popup_locked_set(pop, 0);
}
EAPI void
e_gadcon_popup_toggle_pinned(E_Gadcon_Popup *pop)
{
if (!pop) return;
E_OBJECT_CHECK(pop);
E_OBJECT_TYPE_CHECK(pop, E_GADCON_POPUP_TYPE);
if (pop->pinned)
{
pop->pinned = 0;
edje_object_signal_emit(pop->o_bg, "e,state,unpinned", "e");
}
else
{
pop->pinned = 1;
edje_object_signal_emit(pop->o_bg, "e,state,pinned", "e");
}
}
EAPI void
e_gadcon_popup_lock_set(E_Gadcon_Popup *pop, Eina_Bool setting)
{
if (!pop) return;
E_OBJECT_CHECK(pop);
E_OBJECT_TYPE_CHECK(pop, E_GADCON_POPUP_TYPE);
setting = !!setting;
if (pop->gadcon_lock == setting) return;
pop->gadcon_lock = setting;
if (setting != pop->gadcon_was_locked)
_e_gadcon_popup_locked_set(pop, setting);
}
/* local subsystem functions */
static void static void
_e_gadcon_popup_free(E_Gadcon_Popup *pop) _e_gadcon_popup_changed_size_hints_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
{ {
if (pop->gadcon_was_locked) E_Gadcon_Popup *pop = data;
_e_gadcon_popup_locked_set(pop, 0);
pop->gcc = NULL;
e_object_del(E_OBJECT(pop->win));
free(pop);
}
static void _e_gadcon_popup_size_recalc(pop, obj, EINA_TRUE);
_e_gadcon_popup_locked_set(E_Gadcon_Popup *pop, Eina_Bool locked)
{
if (!pop->gcc)
return;
e_gadcon_locked_set(pop->gcc->gadcon, locked);
pop->gadcon_was_locked = locked;
} }