more index work. not working yet.
authorCarsten Haitzler <raster@rasterman.com>
Mon, 7 Sep 2009 11:10:13 +0000 (11:10 +0000)
committerCarsten Haitzler <raster@rasterman.com>
Mon, 7 Sep 2009 11:10:13 +0000 (11:10 +0000)
SVN revision: 42320

data/themes/default.edc
src/bin/test_index.c
src/lib/elm_index.c

index fbdd0c2..5034ccb 100644 (file)
@@ -13067,4 +13067,160 @@ collections {
          }
       }
    }
+
+///////////////////////////////////////////////////////////////////////////////
+   group { name: "elm/index/base/vertical/default";
+      images {
+        image: "bt_base1.png" COMP;
+        image: "bt_base2.png" COMP;
+        image: "bt_hilight.png" COMP;
+        image: "bt_shine.png" COMP;
+      }
+      parts {
+         part { name: "0";
+            type: RECT;
+           mouse_events:  0;
+           description { state: "default" 0.0;
+               rel1.to: "elm.swallow.index.0";
+               rel1.offset: -1 -1;
+               rel2.to: "elm.swallow.index.0";
+               rel2.offset: 0 0;
+               color: 0 100 0 50;
+           }
+        }
+         part { name: "1";
+            type: RECT;
+           mouse_events:  0;
+           description { state: "default" 0.0;
+               rel1.to: "elm.swallow.index.1";
+               rel1.offset: -1 -1;
+               rel2.to: "elm.swallow.index.1";
+               rel2.offset: 0 0;
+               color: 100 0 0 50;
+           }
+        }
+        part { name: "elm.swallow.index.0";
+           type: SWALLOW;
+           description { state: "default" 0.0;
+               align: 1.0 0.5;
+               rel1 {
+                  relative: 1.0 0.0;
+                  offset: -3 2;
+               }
+               rel2 {
+                  relative: 1.0 1.0;
+                  offset: -3 -3;
+               }
+           }
+        }
+        part { name: "elm.swallow.index.1";
+           type: SWALLOW;
+           description { state: "default" 0.0;
+               align: 1.0 0.5;
+               rel1 {
+                  to_x: "elm.swallow.index.0";
+                  relative: 0.0 0.0;
+                  offset: -3 2;
+               }
+               rel2 {
+                  to_x: "elm.swallow.index.0";
+                  relative: 0.0 1.0;
+                  offset: -3 -3;
+               }
+           }
+        }
+        part { name: "button_image";
+           mouse_events: 1;
+           description { state: "default" 0.0;
+               rel1 {
+                  to: "elm.text";
+                  offset: -5 -5;
+               }
+               rel2 {
+                  to: "elm.text";
+                  offset: 4 4;
+               }
+              image {
+                 normal: "bt_base2.png";
+                 border: 7 7 7 7;
+              }
+               image.middle: SOLID;
+           }
+        }
+         part { name: "elm.text";
+           type: TEXT;
+           effect: SOFT_SHADOW;
+           mouse_events: 0;
+           scale: 1;
+           description { state: "default" 0.0;
+               align: 0.0 0.5;
+              rel1 {
+                  to: "elm.swallow.index.1";
+                  relative: 0.0 0.5;
+                  offset: -8 0;
+               }
+              rel2 {
+                  to: "elm.swallow.index.1";
+                  relative: 0.0 0.5;
+                  offset: -8 -1;
+               }
+              color: 224 224 224 255;
+              color3: 0 0 0 64;
+              text {
+                 font:     "Sans,Edje-Vera";
+                 size:     10;
+                 min:      1 1;
+                 align:    1.0 0.5;
+              }
+           }
+        }
+        part { name: "over1";
+           mouse_events: 0;
+           description { state: "default" 0.0;
+               rel1 {
+                  to: "button_image";
+               }
+              rel2 {
+                    to: "button_image";
+                    relative: 1.0 0.5;
+                 }
+              image {
+                 normal: "bt_hilight.png";
+                 border: 7 7 7 0;
+              }
+           }
+        }
+        part { name: "over2";
+           mouse_events: 1;
+           repeat_events: 1;
+            ignore_flags: ON_HOLD;
+           description { state: "default" 0.0;
+               rel1 {
+                  to: "button_image";
+               }
+               rel2 {
+                  to: "button_image";
+               }
+              image {
+                 normal: "bt_shine.png";
+                 border: 7 7 7 7;
+              }
+           }
+        }
+        part { name: "elm.swallow.event";
+           type: SWALLOW;
+           description { state: "default" 0.0;
+               align: 1.0 0.5;
+               rel1 {
+                  relative: 1.0 0.0;
+                  offset: -1 9;
+               }
+               rel2 {
+                  relative: 1.0 1.0;
+                  offset: -1 -1;
+               }
+           }
+        }
+      }
+   }
 }
index 2c723c8..c77d302 100644 (file)
@@ -49,6 +49,13 @@ test_index(void *data, Evas_Object *obj, void *event_info)
         it = elm_genlist_item_append(gl, &itci,
                                      i/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, NULL/* func */,
                                      NULL/* func data */);
+        if ((i % 10) == 0)
+          {
+             char buf[32];
+             
+             snprintf(buf, sizeof(buf), "%i\n", i / 10);
+             elm_index_item_append(id, buf, it);
+          }
      }
 
    evas_object_resize(win, 320, 480);
index 9c5ccfe..249cf40 100644 (file)
  */
 
 typedef struct _Widget_Data Widget_Data;
+typedef struct _Item Item;
 
 struct _Widget_Data
 {
    Evas_Object *base;
    Evas_Object *event;
-   Evas_Object *bx[2];
-   const char *label;
+   Evas_Object *bx[2]; // 2 - for now all that's supported
+   Eina_List *items; // 1 list. yes N levels, but only 2 for now and # of items will be small
+   int level;
    Eina_Bool horizontal : 1;
+   Eina_Bool active : 1;
+   Eina_Bool down : 1;
+};
+
+struct _Item
+{
+   Evas_Object *obj;
+   const char *letter;
+   const void *data;
+   int level;
+   Evas_Object *base;
+   Eina_Bool selected : 1;
 };
 
 static void _del_hook(Evas_Object *obj);
 static void _theme_hook(Evas_Object *obj);
 static void _sizing_eval(Evas_Object *obj);
+static void _index_eval(Evas_Object *obj);
 
 static void
 _del_hook(Evas_Object *obj)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
-   if (wd->label) eina_stringshare_del(wd->label);
+//   if (wd->label) eina_stringshare_del(wd->label);
    free(wd);
 }
 
@@ -41,9 +56,9 @@ _theme_hook(Evas_Object *obj)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
    if (wd->horizontal)
-     _elm_theme_set(wd->base, "index", "horizontal", elm_widget_style_get(obj));
+     _elm_theme_set(wd->base, "index", "base/horizontal", elm_widget_style_get(obj));
    else
-     _elm_theme_set(wd->base, "index", "vertical", elm_widget_style_get(obj));
+     _elm_theme_set(wd->base, "index", "base/vertical", elm_widget_style_get(obj));
    edje_object_part_swallow(wd->base, "elm.swallow.event", wd->event);
    edje_object_part_swallow(wd->base, "elm.swallow.content", wd->bx[0]);
    if (edje_object_part_exists(wd->base, "elm.swallow.content.sub"))
@@ -65,8 +80,8 @@ _theme_hook(Evas_Object *obj)
      }
    edje_object_message_signal_process(wd->base);
    edje_object_scale_set(wd->base, elm_widget_scale_get(obj) * _elm_config->scale);
-   // FIXME: content and sub lists - eval
    _sizing_eval(obj);
+   if (wd->active) _index_eval(obj);
 }
 
 static void
@@ -82,9 +97,53 @@ _sizing_eval(Evas_Object *obj)
    evas_object_size_hint_max_set(obj, maxw, maxh);
 }
 
+static Item *
+_item_new(Evas_Object *obj, const char *letter, const void *item)
+{
+   Widget_Data *wd = elm_widget_data_get(obj);
+   Item *it;
+   it = calloc(1, sizeof(Item));
+   if (!it) return NULL;
+   it->obj = obj;
+   it->letter = eina_stringshare_add(letter);
+   it->data = item;
+   it->level = wd->level;
+   return it;
+}
+
+static Item *
+_item_find(Evas_Object *obj, const void *item)
+{
+   Widget_Data *wd = elm_widget_data_get(obj);
+   Eina_List *l;
+   Item *it;
+   EINA_LIST_FOREACH(wd->items, l, it)
+     {
+        if (it->data == item) return it;
+     }
+   return NULL;
+}
+
+static void
+_item_free(Item *it)
+{
+   Widget_Data *wd = elm_widget_data_get(it->obj);
+   wd->items = eina_list_remove(wd->items, it);
+   if (it->base) evas_object_del(it->base);
+   eina_stringshare_del(it->letter);
+   free(it);
+}
+
+static void
+_index_eval(Evas_Object *obj)
+{
+   Widget_Data *wd = elm_widget_data_get(obj);
+}
+
 static void 
 _wheel(void *data, Evas *e, Evas_Object *o, void *event_info)
 {
+   Widget_Data *wd = elm_widget_data_get(data);
    Evas_Event_Mouse_Wheel *ev = event_info;
    Evas_Object *obj = o;
 }
@@ -92,22 +151,58 @@ _wheel(void *data, Evas *e, Evas_Object *o, void *event_info)
 static void 
 _mouse_down(void *data, Evas *e, Evas_Object *o, void *event_info)
 {
+   Widget_Data *wd = elm_widget_data_get(data);
    Evas_Event_Mouse_Down *ev = event_info;
    Evas_Object *obj = o;
+   if (ev->button != 1) return;
+   wd->down = 1;
+   printf("down!\n");
 }
 
 static void 
 _mouse_up(void *data, Evas *e, Evas_Object *o, void *event_info)
 {
+   Widget_Data *wd = elm_widget_data_get(data);
    Evas_Event_Mouse_Up *ev = event_info;
    Evas_Object *obj = o;
+   if (ev->button != 1) return;
+   wd->down = 0;
+   printf("up!\n");
 }
 
 static void 
 _mouse_move(void *data, Evas *e, Evas_Object *o, void *event_info)
 {
+   Widget_Data *wd = elm_widget_data_get(data);
    Evas_Event_Mouse_Move *ev = event_info;
    Evas_Object *obj = o;
+   Evas_Coord x, y, w, h;
+
+   if (!wd->down) return;
+   evas_object_geometry_get(o, &x, &y, &w, &h);
+   if (wd->horizontal)
+     {
+     }
+   else
+     {
+        if (ev->cur.canvas.x < x)
+          {
+             printf("%i\n", wd->level);
+             if (wd->level == 0)
+               {
+                  printf("level up\n");
+                  wd->level = 1;
+               }
+          }
+        else
+          {
+             if (wd->level == 1)
+               {
+                  printf("level down\n");
+                  wd->level = 0;
+               }
+          }
+     }
 }
 
 /**
@@ -125,6 +220,7 @@ elm_index_add(Evas_Object *parent)
    Evas_Object *o;
    Evas *e;
    Widget_Data *wd;
+   Evas_Coord minw, minh;
 
    wd = ELM_NEW(Widget_Data);
    e = evas_object_evas_get(parent);
@@ -138,12 +234,15 @@ elm_index_add(Evas_Object *parent)
    wd->horizontal = EINA_FALSE;
 
    wd->base = edje_object_add(e);
-   _elm_theme_set(wd->base, "index", "vertical", "default");
+   _elm_theme_set(wd->base, "index", "base/vertical", "default");
    elm_widget_resize_object_set(obj, wd->base);
    
    o = evas_object_rectangle_add(e);
    wd->event = o;
    evas_object_color_set(o, 0, 0, 0, 0);
+   minw = minh = 0;
+   elm_coords_finger_size_adjust(1, &minw, 1, &minh);
+   evas_object_size_hint_min_set(o, minw, minh);
    edje_object_part_swallow(wd->base, "elm.swallow.event", o);
    elm_widget_sub_object_add(obj, o);
    evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_WHEEL, _wheel, obj);
@@ -173,54 +272,76 @@ elm_index_add(Evas_Object *parent)
    return obj;
 }
 
-#if 0
 /**
- * Set the label of the index
+ * Set the active state of the index programatically
  *
  * @param obj The index object
- * @param label The text label string in UTF-8
+ * @param active The active starte
  *
  * @ingroup Index
  */
 EAPI void
-elm_index_label_set(Evas_Object *obj, const char *label)
+elm_index_active_set(Evas_Object *obj, Eina_Bool active)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
    if (!wd) return;
-   if (wd->label) eina_stringshare_del(wd->label);
-   if (label)
-     {
-       wd->label = eina_stringshare_add(label);
-       edje_object_signal_emit(wd->base, "elm,state,text,visible", "elm");
-       edje_object_message_signal_process(wd->base);
-     }
-   else
-     {
-       wd->label = NULL;
-       edje_object_signal_emit(wd->base, "elm,state,text,hidden", "elm");
-       edje_object_message_signal_process(wd->base);
-     }
-   edje_object_part_text_set(wd->base, "elm.text", label);
-   _sizing_eval(obj);
+   if (wd->active == active) return;
+   wd->active = active;
+   _index_eval(obj);
 }
 
 /**
- * Get the label of the index
+ * XXX
  *
  * @param obj The index object
- * @return The text label string in UTF-8
  *
  * @ingroup Index
  */
-EAPI const char *
-elm_index_label_get(Evas_Object *obj)
+EAPI void
+elm_index_item_level_set(Evas_Object *obj, int level)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return NULL;
+   if (!wd) return;
+   if (wd->level == level) return;
+   wd->level = level;
+   _index_eval(obj);
+}
 
-   return wd->label;
+/**
+ * XXX
+ *
+ * @param obj The index object
+ *
+ * @ingroup Index
+ */
+EAPI int
+elm_index_item_level_get(Evas_Object *obj)
+{
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return 0;
+   return wd->level;
+}
+
+/**
+ * XXX
+ *
+ * @param obj The index object
+ *
+ * @ingroup Index
+ */
+EAPI const void *
+elm_index_item_selected_get(Evas_Object *obj, int level)
+{
+   Widget_Data *wd = elm_widget_data_get(obj);
+   Eina_List *l;
+   Item *it;
+   if (!wd) return NULL;
+   EINA_LIST_FOREACH(wd->items, l, it)
+     {
+        if ((it->selected) && (it->level == level)) return it->data;
+     }
+   return NULL;
 }
-#endif
 
 /**
  * XXX
@@ -233,7 +354,12 @@ EAPI void
 elm_index_item_append(Evas_Object *obj, const char *letter, const void *item)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
+   Item *it;
    if (!wd) return;
+   it = _item_new(obj, letter, item);
+   if (!it) return;
+   wd->items = eina_list_append(wd->items, it);
+   if (wd->active) _index_eval(obj);
 }
 
 /**
@@ -247,7 +373,12 @@ EAPI void
 elm_index_item_prepend(Evas_Object *obj, const char *letter, const void *item)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
+   Item *it;
    if (!wd) return;
+   it = _item_new(obj, letter, item);
+   if (!it) return;
+   wd->items = eina_list_prepend(wd->items, it);
+   if (wd->active) _index_eval(obj);
 }
 
 /**
@@ -261,8 +392,23 @@ EAPI void
 elm_index_item_append_relative(Evas_Object *obj, const char *letter, const void *item, const void *relative)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
+   Item *it, *it_rel;
    if (!wd) return;
-   if (!relative) elm_index_item_append(obj, letter, item);
+   if (!relative)
+     {
+        elm_index_item_append(obj, letter, item);
+        return;
+     }
+   it = _item_new(obj, letter, item);
+   it_rel = _item_find(obj, relative);
+   if (!it_rel)
+     {
+        elm_index_item_append(obj, letter, item);
+        return;
+     }
+   if (!it) return;
+   wd->items = eina_list_append_relative(wd->items, it, it_rel);
+   if (wd->active) _index_eval(obj);
 }
 
 /**
@@ -276,7 +422,40 @@ EAPI void
 elm_index_item_prepend_relative(Evas_Object *obj, const char *letter, const void *item, const void *relative)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
+   Item *it, *it_rel;
    if (!wd) return;
-   if (!relative) elm_index_item_prepend(obj, letter, item);
+   if (!relative)
+     {
+        elm_index_item_prepend(obj, letter, item);
+        return;
+     }
+   it = _item_new(obj, letter, item);
+   it_rel = _item_find(obj, relative);
+   if (!it_rel)
+     {
+        elm_index_item_append(obj, letter, item);
+        return;
+     }
+   if (!it) return;
+   wd->items = eina_list_prepend_relative(wd->items, it, it_rel);
+   if (wd->active) _index_eval(obj);
 }
 
+/**
+ * XXX
+ *
+ * @param obj The index object
+ *
+ * @ingroup Index
+ */
+EAPI void
+elm_index_item_del(Evas_Object *obj, const void *item)
+{
+   Widget_Data *wd = elm_widget_data_get(obj);
+   Item *it;
+   if (!wd) return;
+   it = _item_find(obj, item);
+   if (!it) return;
+   _item_free(it);
+   if (wd->active) _index_eval(obj);
+}