3 /* local subsystem functions */
4 static void _e_gadcon_popup_free(E_Gadcon_Popup *pop);
5 static void _e_gadcon_popup_locked_set(E_Gadcon_Popup *pop, Eina_Bool locked);
6 static void _e_gadcon_popup_size_recalc(E_Gadcon_Popup *pop, Evas_Object *obj);
7 static void _e_gadcon_popup_position(E_Gadcon_Popup *pop);
8 static void _e_gadcon_popup_changed_size_hints_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
10 /* externally accessible functions */
13 e_gadcon_popup_new(E_Gadcon_Client *gcc)
19 pop = E_OBJECT_ALLOC(E_Gadcon_Popup, E_GADCON_POPUP_TYPE, _e_gadcon_popup_free);
20 if (!pop) return NULL;
21 zone = e_gadcon_client_zone_get(gcc);
22 pop->win = e_popup_new(zone, 0, 0, 0, 0);
23 e_popup_layer_set(pop->win, 350);
25 o = edje_object_add(pop->win->evas);
26 e_theme_edje_object_set(o, "base/theme/gadman", "e/gadman/popup");
28 evas_object_move(o, 0, 0);
29 e_popup_edje_bg_object_set(pop->win, o);
34 pop->gadcon_was_locked = 0;
40 e_gadcon_popup_content_set(E_Gadcon_Popup *pop, Evas_Object *o)
46 E_OBJECT_TYPE_CHECK(pop, E_GADCON_POPUP_TYPE);
48 old_o = edje_object_part_swallow_get(pop->o_bg, "e.swallow.content");
53 edje_object_part_unswallow(pop->o_bg, old_o);
54 evas_object_del(old_o);
56 edje_object_part_swallow(pop->o_bg, "e.swallow.content", o);
57 evas_object_event_callback_add(o, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
58 _e_gadcon_popup_changed_size_hints_cb, pop);
61 _e_gadcon_popup_size_recalc(pop, o);
65 e_gadcon_popup_show(E_Gadcon_Popup *pop)
69 E_OBJECT_TYPE_CHECK(pop, E_GADCON_POPUP_TYPE);
71 if (pop->win->visible) return;
73 e_popup_show(pop->win);
75 _e_gadcon_popup_position(pop);
79 e_gadcon_popup_hide(E_Gadcon_Popup *pop)
83 E_OBJECT_TYPE_CHECK(pop, E_GADCON_POPUP_TYPE);
84 if (pop->pinned) return;
85 e_popup_hide(pop->win);
86 if (pop->gadcon_was_locked)
87 _e_gadcon_popup_locked_set(pop, 0);
91 e_gadcon_popup_toggle_pinned(E_Gadcon_Popup *pop)
95 E_OBJECT_TYPE_CHECK(pop, E_GADCON_POPUP_TYPE);
100 edje_object_signal_emit(pop->o_bg, "e,state,unpinned", "e");
105 edje_object_signal_emit(pop->o_bg, "e,state,pinned", "e");
110 e_gadcon_popup_lock_set(E_Gadcon_Popup *pop, Eina_Bool setting)
114 E_OBJECT_TYPE_CHECK(pop, E_GADCON_POPUP_TYPE);
117 if (pop->gadcon_lock == setting) return;
118 pop->gadcon_lock = setting;
120 if (setting != pop->gadcon_was_locked)
121 _e_gadcon_popup_locked_set(pop, setting);
124 /* local subsystem functions */
127 _e_gadcon_popup_free(E_Gadcon_Popup *pop)
129 if (pop->gadcon_was_locked)
130 _e_gadcon_popup_locked_set(pop, 0);
132 e_object_del(E_OBJECT(pop->win));
137 _e_gadcon_popup_locked_set(E_Gadcon_Popup *pop, Eina_Bool locked)
142 e_gadcon_locked_set(pop->gcc->gadcon, locked);
143 pop->gadcon_was_locked = locked;
147 _e_gadcon_popup_size_recalc(E_Gadcon_Popup *pop, Evas_Object *obj)
149 Evas_Coord w = 0, h = 0;
151 e_widget_size_min_get(obj, &w, &h);
152 if ((!w) || (!h)) evas_object_size_hint_min_get(obj, &w, &h);
155 edje_object_size_min_get(obj, &w, &h);
156 edje_object_size_min_restricted_calc(obj, &w, &h, w, h);
158 edje_extern_object_min_size_set(obj, w, h);
159 edje_object_size_min_calc(pop->o_bg, &pop->w, &pop->h);
160 evas_object_resize(pop->o_bg, pop->w, pop->h);
162 if (pop->win->visible)
163 _e_gadcon_popup_position(pop);
167 _e_gadcon_popup_position(E_Gadcon_Popup *pop)
169 Evas_Coord gx = 0, gy = 0, gw, gh, zw, zh, zx, zy, px, py;
171 /* Popup positioning */
172 e_gadcon_client_geometry_get(pop->gcc, &gx, &gy, &gw, &gh);
173 zx = pop->win->zone->x;
174 zy = pop->win->zone->y;
175 zw = pop->win->zone->w;
176 zh = pop->win->zone->h;
177 switch (pop->gcc->gadcon->orient)
179 case E_GADCON_ORIENT_CORNER_RT:
180 case E_GADCON_ORIENT_CORNER_RB:
181 case E_GADCON_ORIENT_RIGHT:
184 if (py + pop->h >= (zy + zh))
185 py = gy + gh - pop->h;
188 case E_GADCON_ORIENT_LEFT:
189 case E_GADCON_ORIENT_CORNER_LT:
190 case E_GADCON_ORIENT_CORNER_LB:
193 if (py + pop->h >= (zy + zh))
194 py = gy + gh - pop->h;
197 case E_GADCON_ORIENT_TOP:
198 case E_GADCON_ORIENT_CORNER_TL:
199 case E_GADCON_ORIENT_CORNER_TR:
201 px = (gx + (gw / 2)) - (pop->w / 2);
202 if ((px + pop->w) >= (zx + zw))
203 px = gx + gw - pop->w;
208 case E_GADCON_ORIENT_BOTTOM:
209 case E_GADCON_ORIENT_CORNER_BL:
210 case E_GADCON_ORIENT_CORNER_BR:
212 px = (gx + (gw / 2)) - (pop->w / 2);
213 if ((px + pop->w) >= (zx + zw))
214 px = gx + gw - pop->w;
219 case E_GADCON_ORIENT_FLOAT:
220 px = (gx + (gw / 2)) - (pop->w / 2);
221 if (gy >= (zy + (zh / 2)))
225 if ((px + pop->w) >= (zx + zw))
226 px = gx + gw - pop->w;
232 e_popup_move_resize(pop->win, 50, 50, pop->w, pop->h);
239 e_popup_move_resize(pop->win, px - zx, py - zy, pop->w, pop->h);
241 if (pop->gadcon_lock && (!pop->gadcon_was_locked))
242 _e_gadcon_popup_locked_set(pop, 1);
246 _e_gadcon_popup_changed_size_hints_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
251 _e_gadcon_popup_size_recalc(pop, obj);