1. fix scale property fetch
authorCarsten Haitzler <raster@rasterman.com>
Wed, 8 Oct 2008 06:38:20 +0000 (06:38 +0000)
committerCarsten Haitzler <raster@rasterman.com>
Wed, 8 Oct 2008 06:38:20 +0000 (06:38 +0000)
2. add hover object - beginning to work. will be used to pop up menus/options
etc.

SVN revision: 36515

data/themes/default.edc
src/bin/test.c
src/lib/Elementary.h
src/lib/Makefile.am
src/lib/elm_hover.c [new file with mode: 0644]
src/lib/elm_main.c
src/lib/elm_priv.h
src/lib/elm_widget.c

index 04c90cf..6be231f 100644 (file)
@@ -2120,13 +2120,61 @@ collections {
    }
    
 ///////////////////////////////////////////////////////////////////////////////
+   group { name: "hover";
+      images {
+        image: "bt_base1.png" COMP;
+        image: "bt_base2.png" COMP;
+        image: "bt_hilight.png" COMP;
+        image: "bt_shine.png" COMP;
+      }
+      parts {
+        part { name: "base";
+           type: RECT;
+           mouse_events: 1;
+           description { state: "default" 0.0;
+              color: 0 0 0 200;
+           }
+        }
+        part { name: "box";
+           type: RECT;
+           mouse_events: 0;
+           description { state: "default" 0.0;
+              color: 255 255 255 200;
+              rel1.to: "elm.swallow.size";
+              rel1.offset: -2 -2;
+              rel2.to: "elm.swallow.size";
+              rel2.offset: 1 1;
+           }
+        }
+        part { name: "elm.swallow.offset";
+            type: SWALLOW;
+           description { state: "default" 0.0;
+              align: 0.0 0.0;
+              rel1.relative: 0.0 0.0;
+              rel2.relative: 0.0 0.0;
+           }
+        }
+        part { name: "elm.swallow.size";
+            type: SWALLOW;
+           description { state: "default" 0.0;
+              align: 0.0 0.0;
+              rel1.to: "elm.swallow.offset";
+              rel1.relative: 1.0 1.0;
+              rel2.to: "elm.swallow.offset";
+              rel2.relative: 1.0 1.0;
+           }
+        }
+      }
+   }
+   
+///////////////////////////////////////////////////////////////////////////////
    group { name: "contact";
       images {
         image: "bt_base1.png" COMP;
         image: "bt_base2.png" COMP;
         image: "bt_hilight.png" COMP;
         image: "bt_shine.png" COMP;
-    }
+      }
       parts {
         part { name: "button_image";
            mouse_events: 1;
index a2de8cb..cc79285 100644 (file)
@@ -425,7 +425,7 @@ my_bt_9(void *data, Evas_Object *obj, void *event_info)
 static void
 my_bt_10(void *data, Evas_Object *obj, void *event_info)
 {
-   Evas_Object *win, *bg, *ly, *ck, *bt;
+   Evas_Object *win, *bg, *ly, *bt;
    char buf[PATH_MAX];
    
    win = elm_win_add(NULL, "layout", ELM_WIN_BASIC);
@@ -463,6 +463,50 @@ my_bt_10(void *data, Evas_Object *obj, void *event_info)
 }
 
 static void
+my_hover_bt_1(void *data, Evas_Object *obj, void *event_info)
+{
+   Evas_Object *hv = data;
+   
+   evas_object_show(hv);
+}
+
+static void
+my_bt_11(void *data, Evas_Object *obj, void *event_info)
+{
+   Evas_Object *win, *bg, *bx, *bt, *hv;
+   char buf[PATH_MAX];
+   
+   win = elm_win_add(NULL, "hover", ELM_WIN_BASIC);
+   elm_win_title_set(win, "Hover");
+   elm_win_autodel_set(win, 1);
+
+   bg = elm_bg_add(win);
+   elm_win_resize_object_add(win, bg);
+   evas_object_size_hint_weight_set(bg, 1.0, 1.0);
+   evas_object_show(bg);
+   
+   bx = elm_box_add(win);
+   evas_object_size_hint_weight_set(bx, 1.0, 1.0);
+   elm_win_resize_object_add(win, bx);
+   evas_object_show(bx);
+
+   hv = elm_hover_add(win);
+   
+   bt = elm_button_add(win);
+   elm_button_label_set(bt, "Button");
+   evas_object_smart_callback_add(bt, "clicked", my_hover_bt_1, hv);
+   elm_box_pack_end(bx, bt);
+   evas_object_show(bt);
+   elm_hover_parent_set(hv, win);
+   elm_hover_target_set(hv, bt);
+   
+   evas_object_size_hint_min_set(bg, 160, 160);
+   evas_object_size_hint_max_set(bg, 640, 640);
+   evas_object_resize(win, 320, 320);
+   evas_object_show(win);
+}
+
+static void
 my_win_main(void)
 {
    Evas_Object *win, *bg, *bx0, *lb, *bx, *bt, *sc, *fr;
@@ -625,6 +669,13 @@ my_win_main(void)
    elm_box_pack_end(bx, bt);
    evas_object_show(bt);
 
+   bt = elm_button_add(win);
+   elm_button_label_set(bt, "Hover");
+   evas_object_smart_callback_add(bt, "clicked", my_bt_11, NULL);
+   evas_object_size_hint_align_set(bt, -1.0, 0.0);
+   elm_box_pack_end(bx, bt);
+   evas_object_show(bt);
+
    /* set an initial window size */
    evas_object_resize(win, 320, 320);
    /* show the window */
index 7f9eb99..68065a3 100644 (file)
@@ -171,6 +171,12 @@ extern "C" {
    /* smart callbacks elm_win objects will call:
     */
    
+   EAPI Evas_Object *elm_hover_add(Evas_Object *parent);
+   EAPI void         elm_hover_target_set(Evas_Object *obj, Evas_Object *target);
+   EAPI void         elm_hover_parent_set(Evas_Object *obj, Evas_Object *parent);
+   /* smart callbacks elm_win objects will call:
+    */
+   
 // FIXME: fixes to do
 // * current sizing inefficient
 // * scroller could do with page up/down/left/right buttons and and idea of
index e75a470..94e611f 100644 (file)
@@ -31,6 +31,7 @@ elm_frame.c \
 elm_table.c \
 elm_clock.c \
 elm_layout.c \
+elm_hover.c \
 \
 els_pan.c \
 els_pan.h \
diff --git a/src/lib/elm_hover.c b/src/lib/elm_hover.c
new file mode 100644 (file)
index 0000000..1028649
--- /dev/null
@@ -0,0 +1,228 @@
+#include <Elementary.h>
+#include "elm_priv.h"
+
+typedef struct _Widget_Data Widget_Data;
+typedef struct _Subinfo     Subinfo;
+
+struct _Widget_Data
+{
+   Evas_Object *hov;
+   Evas_Object *cov;
+   Evas_Object *offset, *size;
+   Evas_Object *parent, *target;
+   Evas_List *subs;
+};
+
+struct _Subinfo
+{
+   const char *swallow;
+   Evas_Object *obj;
+};
+
+static void _del_hook(Evas_Object *obj);
+static void _sizing_eval(Evas_Object *obj);
+static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info);
+static void _sub_del(void *data, Evas_Object *obj, void *event_info);
+
+static void
+_del_hook(Evas_Object *obj)
+{
+   Widget_Data *wd = elm_widget_data_get(obj);
+/*   
+   while (wd->subs)
+     {
+        Subinfo *si = wd->subs->data;
+       wd->subs = evas_list_remove_list(wd->subs, wd->subs);
+       evas_stringshare_del(si->swallow);
+       free(si);
+     }
+ */
+   free(wd);
+}
+
+static void
+_sizing_eval(Evas_Object *obj)
+{
+   Widget_Data *wd = elm_widget_data_get(obj);
+   Evas_Coord x = 0, y = 0, w = 0, h = 0, x2 = 0, y2 = 0, w2 = 0, h2 = 0;
+   
+   if (wd->parent) evas_object_geometry_get(wd->parent, &x, &y, &w, &h);
+   if (wd->hov) evas_object_geometry_get(wd->hov, &x2, &y2, &w2, &h2);
+   evas_object_move(wd->cov, x, y);
+   evas_object_resize(wd->cov, w, h);
+   evas_object_size_hint_min_set(wd->offset, x2 - x, y2 - y);
+   edje_object_part_swallow(wd->hov, "elm.swallow.offset", wd->offset);
+   evas_object_size_hint_min_set(wd->size, w2, h2);
+   edje_object_part_swallow(wd->hov, "elm.swallow.size", wd->size);
+}
+
+static void
+_changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   Widget_Data *wd = elm_widget_data_get(data);
+   Evas_List *l;
+/*   
+   for (l = wd->subs; l; l = l->next)
+     {
+       Subinfo *si = l->data;
+       if (si->obj == obj)
+         {
+            edje_object_part_swallow(wd->hov, si->swallow, obj);
+            _sizing_eval(obj);
+            break;
+         }
+     }
+ */
+}
+
+static void
+_sub_del(void *data, Evas_Object *obj, void *event_info)
+{
+   Widget_Data *wd = elm_widget_data_get(obj);
+   Evas_Object *sub = event_info;
+   Evas_List *l;
+
+/*   
+   for (l = wd->subs; l; l = l->next)
+     {
+       Subinfo *si = l->data;
+       if (si->obj == sub)
+         {
+            evas_object_event_callback_del
+              (sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints);
+            wd->subs = evas_list_remove_list(wd->subs, l);
+            evas_stringshare_del(si->swallow);
+            free(si);
+            break;
+         }
+     }
+ */
+}    
+
+static void
+_hov_move(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   _sizing_eval(data);
+}
+
+static void
+_hov_resize(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   _sizing_eval(data);
+}
+
+static void
+_hov_show(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   Widget_Data *wd = elm_widget_data_get(data);
+   evas_object_show(wd->cov);
+}
+
+static void
+_hov_hide(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   Widget_Data *wd = elm_widget_data_get(data);
+   evas_object_hide(wd->cov);
+}
+
+static void
+_cov_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   Widget_Data *wd = elm_widget_data_get(data);
+   evas_object_smart_callback_call(data, "clicked", NULL);
+   evas_object_hide(data);
+}
+
+EAPI Evas_Object *
+elm_hover_add(Evas_Object *parent)
+{
+   Evas_Object *obj;
+   Evas *e;
+   Widget_Data *wd;
+   
+   wd = ELM_NEW(Widget_Data);
+   e = evas_object_evas_get(parent);
+   obj = elm_widget_add(e);
+   elm_widget_data_set(obj, wd);
+   elm_widget_del_hook_set(obj, _del_hook);
+
+   wd->hov = evas_object_rectangle_add(e);
+   evas_object_color_set(wd->hov, 0, 0, 0, 0);
+   elm_widget_resize_object_set(obj, wd->hov);
+   evas_object_event_callback_add(wd->hov, EVAS_CALLBACK_MOVE, _hov_move, obj);
+   evas_object_event_callback_add(wd->hov, EVAS_CALLBACK_RESIZE, _hov_resize, obj);
+   evas_object_event_callback_add(wd->hov, EVAS_CALLBACK_SHOW, _hov_show, obj);
+   evas_object_event_callback_add(wd->hov, EVAS_CALLBACK_HIDE, _hov_hide, obj);
+   
+   wd->cov = edje_object_add(e);
+   _elm_theme_set(wd->cov, "hover", "hover");
+   elm_widget_sub_object_add(obj, wd->cov);
+   evas_object_event_callback_add(wd->cov, EVAS_CALLBACK_MOUSE_DOWN, _cov_down, obj);
+   
+   wd->offset = evas_object_rectangle_add(e);
+   evas_object_color_set(wd->offset, 0, 0, 0, 0);
+   elm_widget_sub_object_add(obj, wd->offset);
+   
+   wd->size = evas_object_rectangle_add(e);
+   evas_object_color_set(wd->size, 0, 0, 0, 0);
+   elm_widget_sub_object_add(obj, wd->size);
+   
+   edje_object_part_swallow(wd->hov, "elm.swallow.offset", wd->offset);
+   edje_object_part_swallow(wd->hov, "elm.swallow.size", wd->size);
+   
+   evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj);
+   
+   _sizing_eval(obj);
+   return obj;
+}
+
+EAPI void
+elm_hover_target_set(Evas_Object *obj, Evas_Object *target)
+{
+   Widget_Data *wd = elm_widget_data_get(obj);
+   wd->target = target;
+   elm_widget_hover_object_set(target, obj);
+   _sizing_eval(obj);
+}
+
+EAPI void
+elm_hover_parent_set(Evas_Object *obj, Evas_Object *parent)
+{
+   Widget_Data *wd = elm_widget_data_get(obj);
+   wd->parent = parent;
+   elm_widget_sub_object_add(parent, obj);
+   _sizing_eval(obj);
+}
+
+/*
+EAPI void
+elm_hover_content_set(Evas_Object *obj, const char *swallow, Evas_Object *content)
+{
+   Widget_Data *wd = elm_widget_data_get(obj);
+   Subinfo *si;
+   Evas_List *l;
+   
+   for (l = wd->subs; l; l = l->next)
+     {
+       si = l->data;
+       if (!strcmp(swallow, si->swallow))
+         {
+            if (content == si->obj) return;
+            elm_widget_sub_object_del(obj, si->obj);
+            break;
+         }
+     }
+   if (content)
+     {
+       edje_object_part_swallow(wd->hov, swallow, content);
+       elm_widget_sub_object_add(obj, content);
+       evas_object_event_callback_add(content, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
+                                      _changed_size_hints, obj);
+       si = ELM_NEW(Subinfo);
+       si->swallow = evas_stringshare_add(swallow);
+       si->obj = content;
+       wd->subs = evas_list_append(wd->subs, si);
+       _sizing_eval(obj);
+     }
+}
+*/
index a0e2761..46d5548 100644 (file)
@@ -42,13 +42,15 @@ elm_init(int argc, char **argv)
        (_elm_config->engine == ELM_XRENDER_X11) ||
        (_elm_config->engine == ELM_OPENGL_X11))
      {
-       int val;
+       int val = 1000;
        
        ecore_x_init(NULL);
        if (ecore_x_window_prop_card32_get(ecore_x_window_root_first_get(),
                                           ecore_x_atom_get("ENLIGHTENMENT_SCALE"),
-                                          &val, 1))
-         _elm_config->scale = (double)val / 1000.0;
+                                          &val, 1) > 0)
+         {
+            if (val > 0) _elm_config->scale = (double)val / 1000.0;
+         }
      }
     
 }
index 8f11dac..e7d7ff9 100644 (file)
@@ -47,6 +47,7 @@ EAPI void        *elm_widget_data_get(Evas_Object *obj);
 EAPI void         elm_widget_sub_object_add(Evas_Object *obj, Evas_Object *sobj);
 EAPI void         elm_widget_sub_object_del(Evas_Object *obj, Evas_Object *sobj);
 EAPI void         elm_widget_resize_object_set(Evas_Object *obj, Evas_Object *sobj);
+EAPI void         elm_widget_hover_object_set(Evas_Object *obj, Evas_Object *sobj);
 EAPI void         elm_widget_can_focus_set(Evas_Object *obj, int can_focus);
 EAPI int          elm_widget_can_focus_get(Evas_Object *obj);
 EAPI int          elm_widget_focus_get(Evas_Object *obj);
index 54d414b..4c423f2 100644 (file)
@@ -2,8 +2,8 @@
 #include "elm_priv.h"
 
 #define SMART_NAME "e_widget"
-#define API_ENTRY Smart_Data *sd; sd = evas_object_smart_data_get(obj); if ((!obj) || (!sd) || (evas_object_type_get(obj) && strcmp(evas_object_type_get(obj), SMART_NAME)))
-#define INTERNAL_ENTRY Smart_Data *sd; sd = evas_object_smart_data_get(obj); if (!sd) return;
+#define API_ENTRY Smart_Data *sd = evas_object_smart_data_get(obj); if ((!obj) || (!sd) || (evas_object_type_get(obj) && strcmp(evas_object_type_get(obj), SMART_NAME)))
+#define INTERNAL_ENTRY Smart_Data *sd = evas_object_smart_data_get(obj); if (!sd) return;
 typedef struct _Smart_Data Smart_Data;
 
 struct _Smart_Data
@@ -11,8 +11,8 @@ struct _Smart_Data
    Evas_Object   *parent_obj;
    Evas_Coord     x, y, w, h;
    Evas_List     *subobjs;
-   Evas_List     *hovers;
    Evas_Object   *resize_obj;
+   Evas_Object   *hover_obj;
    void         (*del_func) (Evas_Object *obj);
    void         (*focus_func) (Evas_Object *obj);
    void         (*activate_func) (Evas_Object *obj);
@@ -44,6 +44,15 @@ static void _smart_init(void);
 /* local subsystem globals */
 static Evas_Smart *_e_smart = NULL;
 
+static void
+_sub_obj_del(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   Smart_Data *sd = data;
+   if (obj == sd->resize_obj) sd->resize_obj = NULL;
+   else if (obj == sd->hover_obj) sd->hover_obj = NULL;
+   else sd->subobjs = evas_list_remove(sd->subobjs, obj);
+}
+
 /* externally accessible functions */
 EAPI Evas_Object *
 elm_widget_add(Evas *evas)
@@ -147,11 +156,35 @@ EAPI void
 elm_widget_resize_object_set(Evas_Object *obj, Evas_Object *sobj)
 {
    API_ENTRY return;
-   if (sd->resize_obj) evas_object_smart_member_del(sd->resize_obj);
+   if (sd->resize_obj)
+     {
+       evas_object_event_callback_del(sd->resize_obj, EVAS_CALLBACK_DEL, _sub_obj_del);
+       evas_object_smart_member_del(sd->resize_obj);
+     }
    sd->resize_obj = sobj;
-   evas_object_smart_member_add(sobj, obj);
-   _smart_reconfigure(sd);
-   evas_object_smart_callback_call(obj, "sub-object-add", sobj);
+   if (sd->resize_obj)
+     {
+       evas_object_smart_member_add(sobj, obj);
+       evas_object_event_callback_add(sobj, EVAS_CALLBACK_DEL, _sub_obj_del, sd);
+       _smart_reconfigure(sd);
+       evas_object_smart_callback_call(obj, "sub-object-add", sobj);
+     }
+}
+
+EAPI void
+elm_widget_hover_object_set(Evas_Object *obj, Evas_Object *sobj)
+{
+   API_ENTRY return;
+   if (sd->hover_obj)
+     {
+       evas_object_event_callback_del(sd->hover_obj, EVAS_CALLBACK_DEL, _sub_obj_del);
+     }
+   sd->hover_obj = sobj;
+   if (sd->hover_obj)
+     {
+       evas_object_event_callback_add(sobj, EVAS_CALLBACK_DEL, _sub_obj_del, sd);
+       _smart_reconfigure(sd);
+     }
 }
 
 EAPI void
@@ -439,7 +472,12 @@ _smart_reconfigure(Smart_Data *sd)
      {
        evas_object_move(sd->resize_obj, sd->x, sd->y);
        evas_object_resize(sd->resize_obj, sd->w, sd->h);
-    }
+     }
+   if (sd->hover_obj)
+     {
+       evas_object_move(sd->hover_obj, sd->x, sd->y);
+       evas_object_resize(sd->hover_obj, sd->w, sd->h);
+     }
 }
 
 static void
@@ -464,10 +502,23 @@ _smart_del(Evas_Object *obj)
    
    INTERNAL_ENTRY;
    if (sd->del_func) sd->del_func(obj);
+   if (sd->resize_obj)
+     {
+       evas_object_event_callback_del(sd->resize_obj, EVAS_CALLBACK_DEL, _sub_obj_del);
+       sd->resize_obj = NULL;
+       evas_object_del(sd->resize_obj);
+     }
+   if (sd->hover_obj)
+     {
+       evas_object_event_callback_del(sd->hover_obj, EVAS_CALLBACK_DEL, _sub_obj_del);
+       sd->hover_obj = NULL;
+       evas_object_del(sd->hover_obj);
+     }
    while (sd->subobjs)
      {
        sobj = sd->subobjs->data;
        sd->subobjs = evas_list_remove_list(sd->subobjs, sd->subobjs);
+       evas_object_event_callback_del(sobj, EVAS_CALLBACK_DEL, _sub_obj_del);
        evas_object_del(sobj);
      }
    free(sd);