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
devs/princeamd/enlightenment-0.17-elive
Viktor Kojouharov 14 years ago
parent 61507d226d
commit 293b3d41dd
  1. 185
      src/bin/e_gadcon_popup.c

@ -6,6 +6,9 @@
/* local subsystem functions */
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_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 */
@ -40,7 +43,6 @@ e_gadcon_popup_new(E_Gadcon_Client *gcc, void (*resize_func) (Evas_Object *obj,
EAPI void
e_gadcon_popup_content_set(E_Gadcon_Popup *pop, Evas_Object *o)
{
Evas_Coord w = 0, h = 0;
Evas_Object *old_o;
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);
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_size_min_calc(pop->o_bg, &pop->w, &pop->h);
evas_object_resize(pop->o_bg, pop->w, pop->h);
evas_object_event_callback_add(o, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
_e_gadcon_popup_changed_size_hints_cb, pop);
_e_gadcon_popup_size_recalc(pop, o, EINA_FALSE);
}
EAPI void
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;
E_OBJECT_CHECK(pop);
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_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 */
e_gadcon_client_geometry_get(pop->gcc, &gx, &gy, &gw, &gh);
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);
}
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)
_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_locked_set(pop, 0);
pop->gcc = NULL;
e_object_del(E_OBJECT(pop->win));
free(pop);
}
E_Gadcon_Popup *pop = data;
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;
_e_gadcon_popup_size_recalc(pop, obj, EINA_TRUE);
}

Loading…
Cancel
Save