From: ChunEon Park <chuneon.park@samsung.com>

Subject: [PATCH] elc_ctxpopup

Here code is for the ctxpopup. 

Since the functionalities of ctxpopup are somewhat different, 
I'm trying to overwrite the ctxpopup code entirely first. 

The main reason is, 
Original ctxpopup could determine it's size and position by itself.
Of course, upstreamed version supports this. But it can not be reduced
it's
size
And it supposes the arrow position to center of box edje. 

Basically, 
This version calculates it's box size first then find available space
from
the it's position. 
The origin position of the box is not expected, it finds the available
positions. 
But if there is not enough space to be shown, then it finds a best
direction
to be shown again.
In this case, it reduces it's size also as to be shown entirely. 
Since the ctxpopup supports scroller, the reduced box could show the all
items also. 
(The point is ctxpopup should know the size of total items...)

I'm not sure the upstreamed version could cover the above scenario, 
If then, I need to modify it first.

(fixed some minor formatting issue too)



SVN revision: 56021
This commit is contained in:
ChunEon Park 2011-01-10 08:59:40 +00:00 committed by Carsten Haitzler
parent 91ec4bb1da
commit b34d8f7e0e
4 changed files with 1677 additions and 1153 deletions

File diff suppressed because it is too large Load Diff

View File

@ -4,12 +4,6 @@
#endif
#ifndef ELM_LIB_QUICKLAUNCH
static void
_list_item_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
evas_object_show(data);
}
static void
_ctxpopup_item_cb(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
{
@ -17,6 +11,130 @@ _ctxpopup_item_cb(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *even
elm_ctxpopup_item_label_get(event_info));
}
#define ITEM_NEW(_hov, _label, _icon) \
if(_icon) \
{ \
ic = elm_icon_add(obj); \
elm_icon_standard_set(ic, _icon); \
elm_icon_scale_set(ic, EINA_FALSE, EINA_FALSE); \
} \
else \
ic = NULL; \
it = elm_ctxpopup_item_append(_hov, _label, ic, _ctxpopup_item_cb, NULL); \
static void
_list_item_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
Evas_Object *ctxpopup, *ic;
Elm_Ctxpopup_Item *it;
Evas_Coord x,y;
ctxpopup = elm_ctxpopup_add(obj);
ITEM_NEW(ctxpopup, "Go to home folder", "home");
ITEM_NEW(ctxpopup, "Save file", "file");
ITEM_NEW(ctxpopup, "Delete file", "delete");
ITEM_NEW(ctxpopup, "Navigate to folder", "folder");
elm_ctxpopup_item_disabled_set(it, EINA_TRUE);
ITEM_NEW(ctxpopup, "Edit entry", "edit");
ITEM_NEW(ctxpopup, "Set date and time", "clock");
elm_ctxpopup_item_disabled_set(it, EINA_TRUE);
evas_pointer_output_xy_get(evas_object_evas_get(obj), &x, &y);
evas_object_size_hint_max_set(ctxpopup, 240, 240);
evas_object_move(ctxpopup, x, y);
evas_object_show(ctxpopup);
}
static void
_list_item_cb2(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
Evas_Object *ctxpopup, *ic;
Elm_Ctxpopup_Item *it;
Evas_Coord x,y;
ctxpopup = elm_ctxpopup_add(obj);
ITEM_NEW(ctxpopup, NULL, "home");
ITEM_NEW(ctxpopup, NULL, "file");
ITEM_NEW(ctxpopup, NULL, "delete");
ITEM_NEW(ctxpopup, NULL, "folder");
ITEM_NEW(ctxpopup, NULL, "edit");
elm_ctxpopup_item_disabled_set(it, EINA_TRUE);
ITEM_NEW(ctxpopup, NULL, "clock");
evas_pointer_output_xy_get(evas_object_evas_get(obj), &x, &y);
evas_object_size_hint_max_set(ctxpopup, 240, 240);
evas_object_move(ctxpopup, x, y);
evas_object_show(ctxpopup);
}
static void
_list_item_cb3(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
Evas_Object *ctxpopup, *ic;
Elm_Ctxpopup_Item *it;
Evas_Coord x,y;
ctxpopup = elm_ctxpopup_add(obj);
ITEM_NEW(ctxpopup, "Eina", NULL);
ITEM_NEW(ctxpopup, "Eet", NULL);
ITEM_NEW(ctxpopup, "Evas", NULL);
ITEM_NEW(ctxpopup, "Ecore", NULL);
elm_ctxpopup_item_disabled_set(it, EINA_TRUE);
ITEM_NEW(ctxpopup, "Embryo", NULL);
ITEM_NEW(ctxpopup, "Edje", NULL);
evas_pointer_output_xy_get(evas_object_evas_get(obj), &x, &y);
evas_object_move(ctxpopup, x, y);
evas_object_show(ctxpopup);
}
static void
_list_item_cb4(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
Evas_Object *ctxpopup, *ic;
Elm_Ctxpopup_Item *it;
Evas_Coord x,y;
ctxpopup = elm_ctxpopup_add(obj);
elm_ctxpopup_horizontal_set(ctxpopup, EINA_TRUE);
ITEM_NEW(ctxpopup, NULL, "home");
ITEM_NEW(ctxpopup, NULL, "file");
ITEM_NEW(ctxpopup, NULL, "delete");
ITEM_NEW(ctxpopup, NULL, "folder");
ITEM_NEW(ctxpopup, NULL, "edit");
ITEM_NEW(ctxpopup, NULL, "clock");
evas_pointer_output_xy_get(evas_object_evas_get(obj), &x, &y);
evas_object_size_hint_max_set(ctxpopup, 240, 240);
evas_object_move(ctxpopup, x, y);
evas_object_show(ctxpopup);
}
static void
_list_item_cb5(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
Evas_Object *ctxpopup, *btn;
Evas_Coord x,y;
char buf[PATH_MAX];
btn = elm_button_add(obj);
elm_button_label_set(btn, "Enlightenment");
evas_object_size_hint_min_set(btn, 150, 150);
ctxpopup = elm_ctxpopup_add(obj);
elm_ctxpopup_content_set(ctxpopup, btn);
evas_pointer_output_xy_get(evas_object_evas_get(obj), &x, &y);
evas_object_move(ctxpopup, x, y);
evas_object_show(ctxpopup);
}
static void _list_clicked(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
{
elm_list_item_selected_set(event_info, EINA_FALSE);
@ -25,11 +143,10 @@ static void _list_clicked(void *data __UNUSED__, Evas_Object *obj __UNUSED__, vo
void
test_ctxpopup(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
Evas_Object *win, *bg, *list, *hov1, *hov2, *hov3, *hov4, *ic;
Elm_Ctxpopup_Item *it;
Evas_Object *win, *bg, *list, *ic;
win = elm_win_add(NULL, "Contexual Popup 2", ELM_WIN_BASIC);
elm_win_title_set(win, "Contextual Popup 2");
win = elm_win_add(NULL, "Contexual Popup", ELM_WIN_BASIC);
elm_win_title_set(win, "Contextual Popup");
elm_win_autodel_set(win, EINA_TRUE);
bg = elm_bg_add(win);
@ -42,75 +159,21 @@ test_ctxpopup(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_in
elm_list_mode_set(list, ELM_LIST_COMPRESS);
evas_object_smart_callback_add(list, "selected", _list_clicked, NULL);
#define ITEM_NEW(_hov, _icon, _label) \
ic = elm_icon_add(win); \
elm_icon_standard_set(ic, _icon); \
elm_icon_scale_set(ic, EINA_FALSE, EINA_FALSE); \
it = elm_ctxpopup_item_append(_hov, _label, ic, _ctxpopup_item_cb, NULL);
hov1 = elm_ctxpopup_add(win);
ITEM_NEW(hov1, "home", "Go to home folder");
ITEM_NEW(hov1, "file", "Save file");
ITEM_NEW(hov1, "delete", "Delete file");
ITEM_NEW(hov1, "folder", "Navigate to folder");
elm_ctxpopup_item_disabled_set(it, EINA_TRUE);
ITEM_NEW(hov1, "edit", "Edit entry");
ITEM_NEW(hov1, "clock", "Set date and time");
ITEM_NEW(hov1, "arrow_up", "Go up");
ITEM_NEW(hov1, "arrow_down", "Go down");
ITEM_NEW(hov1, "arrow_left", "Go left");
elm_ctxpopup_item_disabled_set(it, EINA_TRUE);
ITEM_NEW(hov1, "arrow_right", "Go right");
hov2 = elm_ctxpopup_add(win);
ITEM_NEW(hov2, "home", NULL);
ITEM_NEW(hov2, "file", NULL);
ITEM_NEW(hov2, "delete", NULL);
ITEM_NEW(hov2, "folder", NULL);
ITEM_NEW(hov2, "edit", NULL);
elm_ctxpopup_item_disabled_set(it, EINA_TRUE);
ITEM_NEW(hov2, "clock", NULL);
ITEM_NEW(hov2, "arrow_up", NULL);
ITEM_NEW(hov2, "arrow_down", NULL);
ITEM_NEW(hov2, "arrow_left", NULL);
ITEM_NEW(hov2, "arrow_right", NULL);
hov3 = elm_ctxpopup_add(win);
elm_ctxpopup_horizontal_set(hov3, EINA_TRUE);
ITEM_NEW(hov3, "home", "Zero");
ITEM_NEW(hov3, "file", "Um");
ITEM_NEW(hov3, "delete", "Dos");
ITEM_NEW(hov3, "folder", "Tri");
ITEM_NEW(hov3, "edit", "Vier");
ITEM_NEW(hov3, "clock", "");
hov4 = elm_ctxpopup_add(win);
ITEM_NEW(hov4, NULL, "Eina");
ITEM_NEW(hov4, NULL, "Eet");
ITEM_NEW(hov4, NULL, "Evas");
ITEM_NEW(hov4, NULL, "Ecore");
elm_ctxpopup_item_disabled_set(it, EINA_TRUE);
ITEM_NEW(hov4, NULL, "Embryo");
ITEM_NEW(hov4, NULL, "Edje");
#undef ITEM_NEW
elm_list_item_append(list, "Ctxpopup with icons and labels", NULL, NULL,
_list_item_cb, hov1);
_list_item_cb, NULL);
elm_list_item_append(list, "Ctxpopup with icons only", NULL, NULL,
_list_item_cb, hov2);
_list_item_cb2, NULL);
elm_list_item_append(list, "Ctxpopup with labels only", NULL, NULL,
_list_item_cb3, NULL);
elm_list_item_append(list, "Ctxpopup at horizontal mode", NULL, NULL,
_list_item_cb, hov3);
elm_list_item_append(list, "Ctxpopup with no icons", NULL, NULL,
_list_item_cb, hov4);
_list_item_cb4, NULL);
elm_list_item_append(list, "Ctxpopup with user content", NULL, NULL,
_list_item_cb5, NULL);
evas_object_show(list);
elm_list_go(list);
evas_object_resize(win, 300, 300);
evas_object_resize(win, 400, 400);
evas_object_show(win);
}
#endif

View File

@ -2420,24 +2420,35 @@ extern "C" {
* "changed" - when the color value changes
*/
/* ctxpopup */
/* Contextual Popup */
typedef struct _Elm_Ctxpopup_Item Elm_Ctxpopup_Item;
EAPI Evas_Object *elm_ctxpopup_add(Evas_Object* parent) EINA_ARG_NONNULL(1);
EAPI void elm_ctxpopup_hover_end(Evas_Object *obj) EINA_ARG_NONNULL(1);
EAPI Evas_Object *elm_ctxpopup_item_icon_get(const Elm_Ctxpopup_Item *item) EINA_ARG_NONNULL(1);
EAPI void elm_ctxpopup_item_icon_set(Elm_Ctxpopup_Item *item, Evas_Object *icon) EINA_ARG_NONNULL(1);
EAPI const char *elm_ctxpopup_item_label_get(const Elm_Ctxpopup_Item *item) EINA_ARG_NONNULL(1);
EAPI void elm_ctxpopup_item_label_set(Elm_Ctxpopup_Item *item, const char *label) EINA_ARG_NONNULL(1);
EAPI void elm_ctxpopup_hover_parent_set(Evas_Object *obj, Evas_Object *parent) EINA_ARG_NONNULL(1, 2);
EAPI Evas_Object *elm_ctxpopup_hover_parent_get(const Evas_Object *obj) EINA_ARG_NONNULL(1);
EAPI void elm_ctxpopup_clear(Evas_Object* obj) EINA_ARG_NONNULL(1);
EAPI void elm_ctxpopup_horizontal_set(Evas_Object* obj, Eina_Bool horizontal) EINA_ARG_NONNULL(1);
EAPI Eina_Bool elm_ctxpopup_horizontal_get(const Evas_Object *obj) EINA_ARG_NONNULL(1);
EAPI Elm_Ctxpopup_Item *elm_ctxpopup_item_append(Evas_Object *obj, const char *label, Evas_Object *icon, Evas_Smart_Cb func, const void *data) EINA_ARG_NONNULL(1);
EAPI void elm_ctxpopup_item_del(Elm_Ctxpopup_Item *item) EINA_ARG_NONNULL(1);
EAPI void elm_ctxpopup_item_disabled_set(Elm_Ctxpopup_Item *item, Eina_Bool disabled) EINA_ARG_NONNULL(1);
EAPI Eina_Bool elm_ctxpopup_item_disabled_get(const Elm_Ctxpopup_Item *item) EINA_ARG_NONNULL(1);
typedef enum _Elm_Ctxpopup_Direction
{
ELM_CTXPOPUP_DIRECTION_DOWN,
ELM_CTXPOPUP_DIRECTION_RIGHT,
ELM_CTXPOPUP_DIRECTION_LEFT,
ELM_CTXPOPUP_DIRECTION_UP,
} Elm_Ctxpopup_Direction;
EAPI Evas_Object *elm_ctxpopup_add(Evas_Object *parent) EINA_ARG_NONNULL(1);
EAPI Evas_Object *elm_ctxpopup_item_icon_get(const Elm_Ctxpopup_Item *item) EINA_ARG_NONNULL(1);
EAPI void elm_ctxpopup_item_icon_set(Elm_Ctxpopup_Item *item, Evas_Object *icon) EINA_ARG_NONNULL(1);
EAPI const char *elm_ctxpopup_item_label_get(const Elm_Ctxpopup_Item *item) EINA_ARG_NONNULL(1);
EAPI void elm_ctxpopup_item_label_set(Elm_Ctxpopup_Item *item, const char *label) EINA_ARG_NONNULL(1);
EAPI void elm_ctxpopup_hover_parent_set(Evas_Object *obj, Evas_Object *parent) EINA_ARG_NONNULL(1, 2);
EAPI Evas_Object *elm_ctxpopup_hover_parent_get(const Evas_Object *obj) EINA_ARG_NONNULL(1);
EAPI void elm_ctxpopup_clear(Evas_Object *obj) EINA_ARG_NONNULL(1);
EAPI void elm_ctxpopup_horizontal_set(Evas_Object *obj, Eina_Bool horizontal) EINA_ARG_NONNULL(1);
EAPI Eina_Bool elm_ctxpopup_horizontal_get(const Evas_Object *obj) EINA_ARG_NONNULL(1);
Elm_Ctxpopup_Item *elm_ctxpopup_item_append(Evas_Object *obj, const char *label, Evas_Object *icon, Evas_Smart_Cb func, const void *data) EINA_ARG_NONNULL(1);
EAPI void elm_ctxpopup_item_del(Elm_Ctxpopup_Item *item) EINA_ARG_NONNULL(1);
EAPI void elm_ctxpopup_item_disabled_set(Elm_Ctxpopup_Item *item, Eina_Bool disabled) EINA_ARG_NONNULL(1);
EAPI Eina_Bool elm_ctxpopup_item_disabled_get(const Elm_Ctxpopup_Item *item) EINA_ARG_NONNULL(1);
EAPI void elm_ctxpopup_content_set(Evas_Object *obj, Evas_Object *content) EINA_ARG_NONNULL(1, 2);
EAPI Evas_Object *elm_ctxpopup_content_unset(Evas_Object *obj) EINA_ARG_NONNULL(1);
EAPI void elm_ctxpopup_direction_priority_set(Evas_Object *obj, Elm_Ctxpopup_Direction first, Elm_Ctxpopup_Direction second, Elm_Ctxpopup_Direction third, Elm_Ctxpopup_Direction fourth) EINA_ARG_NONNULL(1);
EAPI void elm_ctxpopup_direction_priority_get(Evas_Object *obj, Elm_Ctxpopup_Direction *first, Elm_Ctxpopup_Direction *second, Elm_Ctxpopup_Direction *third, Elm_Ctxpopup_Direction *fourth) EINA_ARG_NONNULL(1);
/* smart callbacks called:
* "dismissed" - the ctxpopup was dismissed
*/

File diff suppressed because it is too large Load Diff