more gadcon work... oooh getting close.
authorCarsten Haitzler <raster@rasterman.com>
Fri, 10 Feb 2006 12:21:22 +0000 (12:21 +0000)
committerCarsten Haitzler <raster@rasterman.com>
Fri, 10 Feb 2006 12:21:22 +0000 (12:21 +0000)
SVN revision: 20383

src/bin/e_gadcon.c
src/bin/e_gadcon.h
src/bin/e_menu.c
src/bin/e_shelf.c
src/modules/start/e_mod_main.c

index f4e2ba62462ead3513bc01b69b6ee0a6d877cc7c..8745b5610e22fedb92a9da70489dc8a9117d084d 100644 (file)
@@ -43,6 +43,7 @@ static void e_gadcon_layout_pack_size_set(Evas_Object *obj, int size);
 static void e_gadcon_layout_pack_request_set(Evas_Object *obj, int pos, int size);
 static void e_gadcon_layout_pack_options_set(Evas_Object *obj, int pos, int size, int res);
 static void e_gadcon_layout_pack_min_size_set(Evas_Object *obj, int w, int h);
+static void e_gadcon_layout_pack_aspect_set(Evas_Object *obj, int w, int h);
 static void e_gadcon_layout_unpack(Evas_Object *obj);
 
 static Evas_Hash *providers = NULL;
@@ -161,8 +162,8 @@ e_gadcon_populate(E_Gadcon *gc)
    E_Config_Gadcon *cf_gc;
    E_Config_Gadcon_Client *cf_gcc;
    
-   E_OBJECT_CHECK_RETURN(gc, NULL);
-   E_OBJECT_TYPE_CHECK_RETURN(gc, E_GADCON_TYPE, NULL);
+   E_OBJECT_CHECK(gc);
+   E_OBJECT_TYPE_CHECK(gc, E_GADCON_TYPE);
    ok = 0;
    e_gadcon_layout_freeze(gc->o_container);
    printf("e_config->gadcons = %p\n", e_config->gadcons);
@@ -184,7 +185,6 @@ e_gadcon_populate(E_Gadcon *gc)
             E_Gadcon_Client_Class *cc;
             
             cf_gcc = l->data;
-            printf("cf_gcc->name = %s\n", cf_gcc->name);
             cc = evas_hash_find(providers, cf_gcc->name);
             if (cc)
               {
@@ -295,6 +295,40 @@ e_gadcon_all_edit_end(void)
      }
 }
 
+EAPI void
+e_gadcon_zone_set(E_Gadcon *gc, E_Zone *zone)
+{
+   E_OBJECT_CHECK(gc);
+   E_OBJECT_TYPE_CHECK(gc, E_GADCON_TYPE);
+   gc->zone = zone;
+}
+
+EAPI E_Zone *
+e_gadcon_zone_get(E_Gadcon *gc)
+{
+   E_OBJECT_CHECK_RETURN(gc, NULL);
+   E_OBJECT_TYPE_CHECK_RETURN(gc, E_GADCON_TYPE, NULL);
+   return gc->zone;
+}
+
+EAPI void
+e_gadcon_ecore_evas_set(E_Gadcon *gc, Ecore_Evas *ee)
+{
+   E_OBJECT_CHECK(gc);
+   E_OBJECT_TYPE_CHECK(gc, E_GADCON_TYPE);
+   gc->ecore_evas = ee;
+}
+
+EAPI int
+e_gadcon_canvas_zone_geometry_get(E_Gadcon *gc, int *x, int *y, int *w, int *h)
+{
+   E_OBJECT_CHECK_RETURN(gc, 0);
+   E_OBJECT_TYPE_CHECK_RETURN(gc, E_GADCON_TYPE, 0);
+   if (!gc->ecore_evas) return 0;
+   ecore_evas_geometry_get(gc->ecore_evas, x, y, w, h);
+   return 1;
+}
+
 EAPI E_Gadcon_Client *
 e_gadcon_client_new(E_Gadcon *gc, char *name, char *id, Evas_Object *base_obj)
 {
@@ -432,6 +466,14 @@ e_gadcon_client_min_size_set(E_Gadcon_Client *gcc, Evas_Coord w, Evas_Coord h)
    e_gadcon_layout_pack_min_size_set(gcc->o_base, w, h);
 }
 
+EAPI void
+e_gadcon_client_aspect_set(E_Gadcon_Client *gcc, int w, int h)
+{
+   E_OBJECT_CHECK(gcc);
+   E_OBJECT_TYPE_CHECK(gcc, E_GADCON_CLIENT_TYPE);
+   e_gadcon_layout_pack_aspect_set(gcc->o_base, w, h);
+}
+
 /* local subsystem functions */
 static void
 _e_gadcon_free(E_Gadcon *gc)
@@ -759,8 +801,8 @@ struct _E_Gadcon_Layout_Item
    } ask;
    int              hookp;
    struct {
-      Evas_Coord    w, h;
-   } min, max;
+      int           w, h;
+   } min, aspect;
    Evas_Coord       x, y, w, h;
    Evas_Object     *obj;
    unsigned char    can_move : 1;
@@ -1007,6 +1049,18 @@ e_gadcon_layout_pack_min_size_set(Evas_Object *obj, int w, int h)
    _e_gadcon_layout_smart_reconfigure(bi->sd);
 }
 
+static void
+e_gadcon_layout_pack_aspect_set(Evas_Object *obj, int w, int h)
+{
+   E_Gadcon_Layout_Item *bi;
+   
+   bi = evas_object_data_get(obj, "e_gadcon_layout_data");
+   if (!bi) return;
+   bi->aspect.w = w;
+   bi->aspect.h = h;
+   _e_gadcon_layout_smart_reconfigure(bi->sd);
+}
+
 static void
 e_gadcon_layout_unpack(Evas_Object *obj)
 {
@@ -1137,6 +1191,17 @@ _e_gadcon_layout_smart_reconfigure(E_Smart_Data *sd)
        else
          min += bi->min.h;
        bi->ask.size2 = bi->ask.size;
+       if ((bi->aspect.w > 0) && (bi->aspect.h > 0))
+         {
+            if (sd->horizontal)
+              {
+                 bi->ask.size2 = (h * bi->aspect.w) / bi->aspect.h;
+              }
+            else 
+              {
+                 bi->ask.size2 = (w * bi->aspect.h) / bi->aspect.w;
+              }
+         }
      }
    if (sd->horizontal)
      {
index 98c82c4e0ebd25ea3db43cca7fd9c27aacc3a11e..7e2fa3e942578145762e0b3bdfe147d30026e1e3 100644 (file)
@@ -45,6 +45,8 @@ struct _E_Gadcon
       Evas_Object      *o_parent;
       char             *swallow_name;
    } edje;
+   Ecore_Evas          *ecore_evas;
+   E_Zone              *zone;
    
    E_Gadcon_Orient      orient;
    
@@ -96,10 +98,15 @@ EAPI void             e_gadcon_edit_begin(E_Gadcon *gc);
 EAPI void             e_gadcon_edit_end(E_Gadcon *gc);
 EAPI void             e_gadcon_all_edit_begin(void);
 EAPI void             e_gadcon_all_edit_end(void);
+EAPI void             e_gadcon_zone_set(E_Gadcon *gc, E_Zone *zone);
+EAPI E_Zone          *e_gadcon_zone_get(E_Gadcon *gc);
+EAPI void             e_gadcon_ecore_evas_set(E_Gadcon *gc, Ecore_Evas *ee);
+EAPI int              e_gadcon_canvas_zone_geometry_get(E_Gadcon *gc, int *x, int *y, int *w, int *h);
     
 EAPI E_Gadcon_Client *e_gadcon_client_new(E_Gadcon *gc, char *name, char *id, Evas_Object *base_obj);
 EAPI void             e_gadcon_client_size_request(E_Gadcon_Client *gcc, Evas_Coord w, Evas_Coord h);
 EAPI void             e_gadcon_client_min_size_set(E_Gadcon_Client *gcc, Evas_Coord w, Evas_Coord h);
+EAPI void             e_gadcon_client_aspect_set(E_Gadcon_Client *gcc, int w, int h);
 EAPI void             e_gadcon_client_edit_begin(E_Gadcon_Client *gcc);
 EAPI void             e_gadcon_client_edit_end(E_Gadcon_Client *gcc);
     
index 29980bf6f64f9d84aed0a9a8417aa475ec4acad3..4efac9d49369d91f0b2aef8fc839cf9aa29eb920 100644 (file)
@@ -182,7 +182,9 @@ e_menu_activate_key(E_Menu *m, E_Zone *zone, int x, int y, int w, int h, int dir
       case E_MENU_POP_DIRECTION_LEFT:
        _e_menu_realize(m);
        m->cur.x = x - m->cur.w;
-       m->cur.y = y ;
+       m->cur.y = y;
+       if ((m->cur.y + m->cur.h) > (m->zone->y + m->zone->h))
+         m->cur.y = y + h - m->cur.h;
        _e_menu_activate_first();
        break;
       case E_MENU_POP_DIRECTION_RIGHT:
@@ -192,14 +194,20 @@ e_menu_activate_key(E_Menu *m, E_Zone *zone, int x, int y, int w, int h, int dir
        break;
       case E_MENU_POP_DIRECTION_UP:
        _e_menu_realize(m);
-       m->cur.x = x + w;
+       m->cur.x = x;
+       if ((m->cur.x + m->cur.w) > (m->zone->x + m->zone->w))
+         m->cur.x = x + w - m->cur.w;
        m->cur.y = y - m->cur.h;
        _e_menu_activate_last();
        break;
       case E_MENU_POP_DIRECTION_DOWN:
        _e_menu_realize(m);
-       m->cur.x = x + w;
+       m->cur.x = x;
+       if ((m->cur.x + m->cur.w) > (m->zone->x + m->zone->w))
+         m->cur.x = x + w - m->cur.w;
        m->cur.y = y + h;
+       if ((m->cur.y + m->cur.h) > (m->zone->y + m->zone->h))
+         m->cur.y = y + h - m->cur.h;
        _e_menu_activate_first();
        break;
       case E_MENU_POP_DIRECTION_AUTO:
@@ -238,20 +246,33 @@ e_menu_activate_mouse(E_Menu *m, E_Zone *zone, int x, int y, int w, int h, int d
       case E_MENU_POP_DIRECTION_LEFT:
        _e_menu_realize(m);
        m->cur.x = x - m->cur.w;
-       m->cur.y = y ;
+       m->cur.y = y;
+       if ((m->cur.y + m->cur.h) > (m->zone->y + m->zone->h))
+         m->cur.y = y + h - m->cur.h;
+       _e_menu_activate_first();
        break;
       case E_MENU_POP_DIRECTION_RIGHT:
        m->cur.x = x + w;
        m->cur.y = y ;
+       _e_menu_activate_first();
        break;
       case E_MENU_POP_DIRECTION_UP:
        _e_menu_realize(m);
-       m->cur.x = x + w;
+       m->cur.x = x;
+       if ((m->cur.x + m->cur.w) > (m->zone->x + m->zone->w))
+         m->cur.x = x + w - m->cur.w;
        m->cur.y = y - m->cur.h;
+       _e_menu_activate_last();
        break;
       case E_MENU_POP_DIRECTION_DOWN:
-       m->cur.x = x + w;
+       _e_menu_realize(m);
+       m->cur.x = x;
+       if ((m->cur.x + m->cur.w) > (m->zone->x + m->zone->w))
+         m->cur.x = x + w - m->cur.w;
        m->cur.y = y + h;
+       if ((m->cur.y + m->cur.h) > (m->zone->y + m->zone->h))
+         m->cur.y = y + h - m->cur.h;
+       _e_menu_activate_first();
        break;
       case E_MENU_POP_DIRECTION_AUTO:
        _e_menu_auto_place(m, x, y, w, h);
@@ -282,20 +303,33 @@ e_menu_activate(E_Menu *m, E_Zone *zone, int x, int y, int w, int h, int dir)
       case E_MENU_POP_DIRECTION_LEFT:
        _e_menu_realize(m);
        m->cur.x = x - m->cur.w;
-       m->cur.y = y ;
+       m->cur.y = y;
+       if ((m->cur.y + m->cur.h) > (m->zone->y + m->zone->h))
+         m->cur.y = y + h - m->cur.h;
+       _e_menu_activate_first();
        break;
       case E_MENU_POP_DIRECTION_RIGHT:
        m->cur.x = x + w;
        m->cur.y = y ;
+       _e_menu_activate_first();
        break;
       case E_MENU_POP_DIRECTION_UP:
        _e_menu_realize(m);
-       m->cur.x = x + w;
+       m->cur.x = x;
+       if ((m->cur.x + m->cur.w) > (m->zone->x + m->zone->w))
+         m->cur.x = x + w - m->cur.w;
        m->cur.y = y - m->cur.h;
+       _e_menu_activate_last();
        break;
       case E_MENU_POP_DIRECTION_DOWN:
-       m->cur.x = x + w;
+       _e_menu_realize(m);
+       m->cur.x = x;
+       if ((m->cur.x + m->cur.w) > (m->zone->x + m->zone->w))
+         m->cur.x = x + w - m->cur.w;
        m->cur.y = y + h;
+       if ((m->cur.y + m->cur.h) > (m->zone->y + m->zone->h))
+         m->cur.y = y + h - m->cur.h;
+       _e_menu_activate_first();
        break;
       case E_MENU_POP_DIRECTION_AUTO:
        _e_menu_auto_place(m, x, y, w, h);
index 2db9ab7db6662036510a603fd703888befdbc073..3dbb1e454b3a37246523cd6ecc5bad887c16747a 100644 (file)
@@ -51,10 +51,11 @@ e_shelf_zone_new(E_Zone *zone, char *name)
    snprintf(buf, sizeof(buf), "%i", shelf_id);
    shelf_id++;
    es->gadcon = e_gadcon_swallowed_new(es->name, buf, es->o_base, "items");
-   e_gadcon_orient(es->gadcon, E_GADCON_ORIENT_HORIZ);
+   e_gadcon_orient(es->gadcon, E_GADCON_ORIENT_TOP);
+   e_gadcon_zone_set(es->gadcon, zone);
+   e_gadcon_ecore_evas_set(es->gadcon, es->ee);
    
    shelves = evas_list_append(shelves, es);
-   
    return es;
 }
 
index f5e6e383faa07f28f2201a4e18643452ce073056..4143a01dc7a54ac07d33aa51a09a417c9bb735a8 100644 (file)
@@ -65,6 +65,7 @@ _gc_init(E_Gadcon *gc, char *name, char *id)
     * another to be the same */
    e_gadcon_client_size_request(gcc, 32, 32);
    e_gadcon_client_min_size_set(gcc, 16, 16);
+   e_gadcon_client_aspect_set(gcc, 1, 1);
    return gcc;
 }
     
@@ -101,21 +102,59 @@ _button_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
    if (ev->button == 1)
      {
        Evas_Coord x, y, w, h;
-
-       /* FIXME: need a way of getting screen-relative coords */
+       int cx, cy, cw, ch;
+       E_Zone *zone;
+       
        evas_object_geometry_get(inst->o_button, &x, &y, &w, &h); 
+       e_gadcon_canvas_zone_geometry_get(inst->gcc->gadcon, &cx, &cy, &cw, &ch);
+       x += cx;
+       y += cy;
+       zone = e_gadcon_zone_get(inst->gcc->gadcon);
+       if (!zone)
+         zone = e_util_zone_current_get(e_manager_current_get());
+       x -= zone->x;
+       y -= zone->y;
        if (!inst->main_menu)
          inst->main_menu = e_int_menus_main_new();
        if (inst->main_menu)
          {
+            int dir;
+            
             e_menu_post_deactivate_callback_set(inst->main_menu,
                                                 _menu_cb_post,
                                                 inst);
-            /* FIXME: need a way of getting gadcon zone */
+            dir = E_MENU_POP_DIRECTION_AUTO;
+            switch (inst->gcc->gadcon->orient)
+              {
+               case E_GADCON_ORIENT_TOP:
+                 dir = E_MENU_POP_DIRECTION_DOWN;
+// these make the menu pop off the panels' edge, not the module's object - not
+// a very generic thing though.
+//               y = cy;
+//               h = ch;
+                 break;
+               case E_GADCON_ORIENT_BOTTOM:
+                 dir = E_MENU_POP_DIRECTION_UP;
+//               y = cy;
+//               h = ch;
+                 break;
+               case E_GADCON_ORIENT_LEFT:
+                 dir = E_MENU_POP_DIRECTION_RIGHT;
+//               x = cx;
+//               w = cw;
+                 break;
+               case E_GADCON_ORIENT_RIGHT:
+                 dir = E_MENU_POP_DIRECTION_LEFT;
+//               x = cx;
+//               w = cw;
+                 break;
+               default:
+                 break;
+              }
             e_menu_activate_mouse(inst->main_menu,
                                   e_util_zone_current_get(e_manager_current_get()),
                                   x, y, w, h,
-                                  E_MENU_POP_DIRECTION_AUTO, ev->timestamp);
+                                  dir, ev->timestamp);
             edje_object_signal_emit(inst->o_button, "active", "");
             evas_event_feed_mouse_up(inst->gcc->gadcon->evas, ev->button, EVAS_BUTTON_NONE, ev->timestamp, NULL);
          }