[elm_ctxpopup.c]
authorChunEon Park <chuneon.park@samsung.com>
Mon, 30 Aug 2010 14:00:31 +0000 (23:00 +0900)
committerChunEon Park <chuneon.park@samsung.com>
Mon, 30 Aug 2010 14:00:31 +0000 (23:00 +0900)
[elm_slidingdrawer.c]

src/lib/Elementary.h.in
src/lib/elm_ctxpopup.c
src/lib/elm_slidingdrawer.c

index fd8ce4f..9fcc6ed 100755 (executable)
@@ -2407,6 +2407,7 @@ extern "C" {
    /* Sliding Drawer */
    EAPI Evas_Object *elm_slidingdrawer_add(Evas_Object *parent);
    EAPI void         elm_slidingdrawer_content_set (Evas_Object *obj, Evas_Object *content);
+   EAPI Evas_Object *elm_slidingdrawer_content_get(Evas_Object *obj);
 
    /* wipercontrol*/
    EAPI Evas_Object *elm_wipercontrol_add(Evas_Object *parent);
index 4463069..6a800bb 100644 (file)
@@ -174,7 +174,7 @@ _separator_obj_add(Evas_Object *obj)
    if (eina_list_count(wd->items) == 0)
       return;
 
-   item = calloc(1, sizeof(Elm_Ctxpopup_Item));
+   item = ELM_NEW(Elm_Ctxpopup_Item);
    if (!item)
       return;
 
@@ -638,9 +638,6 @@ _ctxpopup_show(void *data, Evas *e, Evas_Object *obj, void *event_info)
 {
    Widget_Data *wd = (Widget_Data *) data;
 
-   if (!wd)
-      return;
-
    if ((eina_list_count(wd->items) < 1) && (!wd->content) && (wd->btn_cnt < 1))
       return;
 
@@ -666,8 +663,6 @@ _ctxpopup_hide(void *data, Evas *e, Evas_Object *obj, void *event_info)
 {
    Widget_Data *wd = (Widget_Data *) data;
 
-   if (!wd)
-      return;
    evas_object_hide(wd->arrow);
 
    if (!wd->screen_dimmed_disabled)
@@ -685,9 +680,6 @@ _ctxpopup_scroller_resize(void *data, Evas *e, Evas_Object * obj,
 {
    Widget_Data *wd = elm_widget_data_get(data);
 
-   if (!wd)
-      return;
-
    if (wd->visible) {
        _sizing_eval(data);
        _show_effect(wd);
@@ -699,9 +691,6 @@ _ctxpopup_move(void *data, Evas *e, Evas_Object *obj, void *event_info)
 {
    Widget_Data *wd = (Widget_Data *) data;
 
-   if (!wd)
-      return;
-
    if( wd->visible && !wd->position_forced)
           evas_object_show(wd->arrow);
 
@@ -849,7 +838,6 @@ elm_ctxpopup_add(Evas_Object *parent)
                         elm_widget_style_get(obj));
 
    //Scroller
-
    wd->scroller = elm_scroller_add(obj);
    elm_object_style_set(wd->scroller, "ctxpopup_vbar");
    elm_scroller_content_min_limit(wd->scroller, EINA_TRUE, EINA_TRUE);
@@ -1073,7 +1061,7 @@ elm_ctxpopup_item_add(Evas_Object *obj, Evas_Object *icon, const char *label,
 
    _separator_obj_add(obj);
 
-   item = calloc(1, sizeof(Elm_Ctxpopup_Item));
+   item = ELM_NEW(Elm_Ctxpopup_Item);
    if (!item)
       return NULL;
 
index dc01d4f..8ae846a 100644 (file)
@@ -11,89 +11,231 @@ typedef struct _Widget_Data Widget_Data;
 \r
 struct _Widget_Data\r
 {\r
-       Evas_Object *sd;\r
+       Evas_Object *win;\r
+       Evas_Object *parent;\r
+       Evas_Object *base;\r
+       Evas_Coord_Rectangle win_rect;\r
+       Evas_Coord_Rectangle base_rect;\r
+       Evas_Coord handler_h;\r
+       Evas_Coord drag;\r
+       Evas_Coord_Point down_pos;\r
 };\r
 \r
+static const char *widtype = NULL;\r
 static void _del_hook(Evas_Object *obj);\r
 static void _theme_hook(Evas_Object *obj);\r
-static void _disable_hook(Evas_Object *obj);\r
 static void _sizing_eval(Evas_Object *obj);\r
+static void _slidingdrawer_show(void *data, Evas *e, Evas_Object *obj, void *event_info);\r
+static void _slidingdrawer_hide(void *data, Evas *e, Evas_Object *obj, void *event_info);\r
+static void _parent_resize(void *data, Evas *e, Evas_Object *obj, void *event_info);\r
 \r
 static void\r
 _del_hook(Evas_Object *obj)\r
 {\r
-       Widget_Data *wd = elm_widget_data_get(obj);\r
-       if (!wd) return;\r
-       free(wd);\r
+   Widget_Data *wd = (Widget_Data *) elm_widget_data_get(obj);\r
+   free(wd);\r
 }\r
 \r
-/*\r
- * FIXME:\r
- */\r
 static void\r
 _theme_hook(Evas_Object *obj)\r
 {\r
-       Widget_Data *wd = elm_widget_data_get(obj);\r
-       if (!wd) return;\r
+       Widget_Data *wd = (Widget_Data *) elm_widget_data_get(obj);\r
+       _elm_theme_object_set(obj, wd->base, "slidingdrawer", "base", elm_widget_style_get(obj));\r
+}\r
 \r
-       _elm_theme_object_set(obj,wd->sd, "slidingdrawer", "base", elm_widget_style_get(obj));\r
+static void\r
+_parent_resize(void *data, Evas *e, Evas_Object *obj, void *event_info)\r
+{\r
+       _sizing_eval(data);\r
+}\r
 \r
-       _sizing_eval(obj);\r
+static void\r
+_slidingdrawer_show(void *data, Evas *e, Evas_Object *obj, void *event_info)\r
+{\r
+       Widget_Data *wd = (Widget_Data*) data;\r
+       evas_object_show(wd->win);\r
+}\r
 \r
-       evas_object_show (wd->sd);\r
+static void\r
+_slidingdrawer_hide(void *data, Evas *e, Evas_Object *obj, void *event_info)\r
+{\r
+       Widget_Data *wd = (Widget_Data*) data;\r
+       evas_object_hide(wd->win);\r
 }\r
 \r
 static void\r
 _sizing_eval(Evas_Object *obj)\r
 {\r
-       Widget_Data *wd = elm_widget_data_get(obj);\r
+       Evas_Coord x, y, w, h;\r
+       Widget_Data *wd;\r
+\r
+       wd = elm_widget_data_get(obj);\r
+\r
+       evas_object_geometry_get(wd->parent, &x, &y, &w, &h);\r
+       evas_object_move(obj, x, y);\r
+       evas_object_resize(obj, w, h);\r
+\r
+       /*\r
+       ecore_x_window_geometry_get(ecore_x_window_root_get(ecore_x_window_focus_get()), &wd->win_rect.x, &wd->win_rect.y, &wd->win_rect.w, &wd->win_rect.h);\r
+       edje_object_part_geometry_get(wd->base, "handler", NULL, NULL, NULL, &wd->handler_h);\r
+       evas_object_resize(wd->win, wd->win_rect.w, wd->handler_h);\r
+       evas_object_move(wd->win, 0, wd->win_rect.h - wd->handler_h);\r
+       evas_object_resize(wd->base, wd->win_rect.w, wd->handler_h);\r
+       wd->base_rect.y = 0;\r
+       wd->base_rect.h = wd->handler_h;\r
+       */\r
 }\r
 \r
-/**\r
- * Set content to the slidingdrawer\r
- *\r
- * @param[in] obj Slidingdrawer object\r
- * @param[in] content Custom object\r
- * @ingroup SlidingDrawer\r
- */\r
+void\r
+_down(void *data, Evas *e, Evas_Object *obj, void *event_info)\r
+{\r
+       Evas_Event_Mouse_Down *ev;\r
+       Widget_Data *wd = (Widget_Data*) data;\r
+\r
+       ev = (Evas_Event_Mouse_Down *) event_info;\r
+       wd = (Widget_Data*) data;\r
+\r
+       evas_object_move(wd->win, 0, 0 );\r
+       evas_object_resize(wd->win, wd->win_rect.w, wd->win_rect.h);\r
+       evas_object_move(wd->base, 0, wd->win_rect.h - wd->base_rect.h);\r
+       wd->base_rect.y = wd->win_rect.h - wd->base_rect.h;\r
+       wd->down_pos.x = ev->output.x;\r
+       wd->down_pos.y = wd->win_rect.h - wd->base_rect.h + ev->output.y;\r
+       fprintf( stderr, "DOWN! window - %d %d %d %d\n", 0, 0, wd->win_rect.w, wd->win_rect.h);\r
+       fprintf( stderr, "DOWN! base - %d %d\n", 0, wd->win_rect.h - wd->base_rect.h );\r
+\r
+}\r
+\r
+void\r
+_move(void *data, Evas *e, Evas_Object *obj, void *event_info)\r
+{\r
+       Evas_Event_Mouse_Move *ev;\r
+       Widget_Data *wd;\r
+\r
+       ev = (Evas_Event_Mouse_Move *) event_info;\r
+\r
+       if(!ev->buttons)\r
+                       return ;\r
+\r
+       wd  = (Widget_Data*) data;\r
+\r
+       wd->drag = ev->cur.output.y - wd->down_pos.y;\r
+       evas_object_move(wd->base, 0, wd->base_rect.y + wd->drag );\r
+       evas_object_resize(wd->base, wd->win_rect.w, wd->handler_h - wd->drag );\r
+}\r
+\r
+void\r
+_up(void *data, Evas *e, Evas_Object *obj, void *event_info)\r
+{\r
+       Evas_Event_Mouse_Up *ev;\r
+       Widget_Data *wd;\r
+       ev = (Evas_Event_Mouse_Up *) event_info;\r
+\r
+       wd = (Widget_Data *) data;\r
+\r
+       wd->base_rect.y = wd->base_rect.y + wd->drag;\r
+       wd->base_rect.h = wd->handler_h - wd->drag;\r
+       evas_object_move(wd->win, 0, wd->base_rect.y);\r
+       evas_object_resize(wd->win, wd->win_rect.w, wd->base_rect.h);\r
+       evas_object_move(wd->base, 0, 0);\r
+       wd->drag = 0;\r
+//     fprintf( stderr, "UP! window - %d %d %d %d\n", 0, wd->base_rect.y, wd->win_rect.w, wd->base_rect.h);\r
+}\r
+\r
+EAPI Evas_Object *\r
+elm_slidingdrawer_content_get(Evas_Object *obj)\r
+{\r
+       ELM_CHECK_WIDTYPE(obj, widtype) NULL;\r
+\r
+       Evas_Object *swallow;\r
+       Widget_Data *wd;\r
+\r
+       wd = elm_widget_data_get(obj);\r
+       swallow = edje_object_part_swallow_get(wd->base, "elm.swallow.content");\r
+       edje_object_part_unswallow(wd->base, swallow);\r
+       return swallow;\r
+}\r
+\r
+\r
 EAPI void\r
 elm_slidingdrawer_content_set (Evas_Object *obj, Evas_Object *content)\r
 {\r
+       ELM_CHECK_WIDTYPE(obj, widtype);\r
+\r
        Widget_Data *wd = elm_widget_data_get(obj);\r
-       if (!wd) return;\r
        if (!content) return;\r
 \r
-       edje_object_part_swallow (wd->sd, "content.swallow", content);\r
+       edje_object_part_swallow (wd->base, "elm.swallow.content", content);\r
 }\r
 \r
-/**\r
- * Add a new slidingdrawer to the parent\r
- * @param parent The parent object\r
- * @return The new object or NULL if it cannot be created\r
- * @ingroup SlidingDrawer\r
- */\r
+\r
 EAPI Evas_Object *\r
 elm_slidingdrawer_add(Evas_Object *parent)\r
 {\r
        Evas_Object *obj;\r
+       Evas_Object *handler;\r
        Evas *e;\r
        Widget_Data *wd;\r
 \r
+       if(!parent)\r
+               return ;\r
+\r
        wd = ELM_NEW(Widget_Data);\r
+       if(!wd) return NULL;\r
+\r
+       ELM_SET_WIDTYPE(widtype, "slidingdrawer");\r
+\r
+       wd->parent = parent;\r
+\r
        e = evas_object_evas_get(parent);\r
+\r
+       //window\r
+       /*\r
+       wd->win = elm_win_add(parent, "slidingdrawer", ELM_WIN_BASIC);\r
+       elm_win_autodel_set(wd->win, EINA_TRUE);\r
+       elm_win_borderless_set(wd->win, EINA_TRUE);\r
+       elm_win_alpha_set(wd->win, EINA_TRUE);\r
+       e = evas_object_evas_get(wd->win);\r
+\r
+       //widget\r
        obj = elm_widget_add(e);\r
        elm_widget_type_set(obj, "slidingdrawer");\r
-       elm_widget_sub_object_add(parent, obj);\r
+       elm_widget_sub_object_add(wd->win, obj);\r
        elm_widget_data_set(obj, wd);\r
        elm_widget_del_hook_set(obj, _del_hook);\r
        elm_widget_theme_hook_set(obj, _theme_hook);\r
-       elm_widget_can_focus_set(obj, 0);\r
-\r
-       wd->sd = edje_object_add(e);\r
+       elm_win_resize_object_add(wd->win, obj);\r
 \r
-       _elm_theme_object_set(obj,wd->sd, "slidingdrawer", "base", "default");\r
+       //base\r
+       wd->base = edje_object_add(e);\r
+       _elm_theme_object_set(wd->win, wd->base, "slidingdrawer", "base", "default");\r
+       elm_widget_sub_object_add(obj, wd->base);\r
+       evas_object_show(wd->base);\r
+       elm_widget_resize_object_set(obj, wd->base);\r
+       */\r
 \r
-       elm_widget_resize_object_set(obj, wd->sd);\r
+       //widget\r
+       obj = elm_widget_add(e);\r
+       elm_widget_type_set(obj, "slidingdrawer");\r
+       elm_widget_sub_object_add(parent, obj);\r
+       elm_widget_data_set(obj, wd);\r
+       elm_widget_del_hook_set(obj, _del_hook);\r
+       elm_widget_theme_hook_set(obj, _theme_hook);\r
+       elm_widget_can_focus_set(obj, EINA_FALSE);\r
+\r
+       //base\r
+       wd->base = edje_object_add(e);\r
+       _elm_theme_object_set(obj, wd->base, "slidingdrawer", "base", "default");\r
+       elm_widget_sub_object_add(obj, wd->base);\r
+       elm_widget_resize_object_set(obj, wd->base);\r
+\r
+       //handler\r
+       evas_object_event_callback_add(parent, EVAS_CALLBACK_RESIZE, _parent_resize, obj);\r
+       //evas_object_event_callback_add(handler, EVAS_CALLBACK_MOUSE_DOWN, _down, wd);\r
+       //evas_object_event_callback_add(handler, EVAS_CALLBACK_MOUSE_MOVE, _move, wd);\r
+       //evas_object_event_callback_add(handler, EVAS_CALLBACK_MOUSE_UP, _up, wd);\r
+       //evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, _slidingdrawer_show, wd);\r
+       //evas_object_event_callback_add(obj, EVAS_CALLBACK_HIDE, _slidingdrawer_hide, wd);\r
 \r
        _sizing_eval(obj);\r
 \r