Enlightenment CVS committal

Author  : rephorm
Project : e17
Module  : apps/e

Dir     : e17/apps/e/src/bin


Modified Files:
        e_bg.c e_bg.h e_widget.c e_widget_desk_preview.c 
        e_widget_table.c e_widget_table.h 


Log Message:
Dynamically add and remove desks in the preview when you change the # of 
virtual desks. 
A few small fixmes still to go

===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_bg.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -3 -r1.21 -r1.22
--- e_bg.c      16 Oct 2006 04:52:31 -0000      1.21
+++ e_bg.c      16 Oct 2006 23:45:16 -0000      1.22
@@ -10,55 +10,55 @@
 
 /* externally accessible functions */
 EAPI const char *
-e_bg_file_get(E_Zone *zone, E_Desk *desk)
+e_bg_file_get(int container_num, int zone_num, int desk_x, int desk_y)
 {
    Evas_List *l, *ll, *entries;
    int ok;
    int current_spec;
    const char *bgfile = "";
 
-
-   if (!zone) zone = 
e_zone_current_get(e_container_current_get(e_manager_current_get()));
-
    ok = 0;
    current_spec = 0; /* how specific the setting is - we want the least 
general one that applies */
 
-   /* look for desk specific background. if desk is NULL this is skipped */
-   for (l = e_config->desktop_backgrounds; desk && l; l = l->next)
+   /* look for desk specific background. */
+   if (container_num >= 0 || zone_num >= 0 || desk_x >= 0 || desk_y >= 0)
      {
-       E_Config_Desktop_Background *cfbg;
-       int spec;
-       
-       cfbg = l->data;
-       if ((cfbg->container >= 0) && (zone->container->num != 
cfbg->container)) continue;
-       if ((cfbg->zone >= 0) && (zone->num != cfbg->zone)) continue;
-       if ((cfbg->desk_x >= 0) && (cfbg->desk_x != desk->x)) continue;
-       if ((cfbg->desk_y >= 0) && (cfbg->desk_y != desk->y)) continue;
-
-       spec = 0;
-       if (cfbg->container >= 0) spec++;
-       if (cfbg->zone >= 0) spec++;
-       if (cfbg->desk_x >= 0) spec++;
-       if (cfbg->desk_y >= 0) spec++;
+       for (l = e_config->desktop_backgrounds; l; l = l->next)
+         {
+            E_Config_Desktop_Background *cfbg;
+            int spec;
 
-       if (spec <= current_spec) continue;
+            cfbg = l->data;
 
-       entries = edje_file_collection_list(cfbg->file);
-       if (entries)
-         {
-            for (ll = entries; ll; ll = ll->next)
+            spec = 0;
+            if (cfbg->container == container_num) spec++;
+            else if (cfbg->container >= 0) continue;
+            if (cfbg->zone == zone_num) spec++;
+            else if (cfbg->zone >= 0) continue;
+            if (cfbg->desk_x == desk_x) spec++;
+            else if (cfbg->desk_x >= 0) continue;
+            if (cfbg->desk_y == desk_y) spec++;
+            else if (cfbg->desk_y >= 0) continue;
+
+            if (spec <= current_spec) continue;
+
+            entries = edje_file_collection_list(cfbg->file);
+            if (entries)
               {
-                 if (!strcmp(ll->data, "e/desktop/background"))
+                 for (ll = entries; ll; ll = ll->next)
                    {
-                      bgfile = cfbg->file;
-                      current_spec = spec;
-                      ok = 1;
+                      if (!strcmp(ll->data, "e/desktop/background"))
+                        {
+                           bgfile = cfbg->file;
+                           current_spec = spec;
+                           ok = 1;
+                        }
                    }
+                 edje_file_collection_list_free(entries);
               }
-            edje_file_collection_list_free(entries);
          }
      }
-   /* fall back to default bg for zone */
+   /* fall back to default */
    if (!ok)
      {
        entries = 
edje_file_collection_list(e_config->desktop_default_background);
@@ -89,13 +89,18 @@
    Evas_Object *o;
    const char *bgfile = "";
    const char *trans = "";
+   E_Desk *desk;
    
    if (transition == E_BG_TRANSITION_START) trans = e_config->transition_start;
    else if (transition == E_BG_TRANSITION_DESK) trans = 
e_config->transition_desk;
    else if (transition == E_BG_TRANSITION_CHANGE) trans = 
e_config->transition_change;
    if ((!trans) || (strlen(trans) < 1)) transition = E_BG_TRANSITION_NONE;
 
-   bgfile = e_bg_file_get(zone, e_desk_current_get(zone));
+   desk = e_desk_current_get(zone);
+   if (desk)
+     bgfile = e_bg_file_get(zone->container->num, zone->num, desk->x, desk->y);
+   else
+     bgfile = e_bg_file_get(zone->container->num, zone->num, -1, -1);
 
    if (zone->bg_object)
      {
===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_bg.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -3 -r1.6 -r1.7
--- e_bg.h      9 Oct 2006 19:06:43 -0000       1.6
+++ e_bg.h      16 Oct 2006 23:45:16 -0000      1.7
@@ -14,7 +14,7 @@
 #ifndef E_BG_H
 #define E_BG_H
 
-EAPI const char *e_bg_file_get(E_Zone *zone, E_Desk *desk);
+EAPI const char *e_bg_file_get(int container_num, int zone_num,  int desk_x, 
int desk_y);
 EAPI void e_bg_zone_update(E_Zone *zone, E_Bg_Transition transition);
 EAPI void e_bg_add(int container, int zone, int desk_x, int desk_y, char 
*file);
 EAPI void e_bg_del(int container, int zone, int desk_x, int desk_y);
===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_widget.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -3 -r1.14 -r1.15
--- e_widget.c  15 Oct 2006 15:56:45 -0000      1.14
+++ e_widget.c  16 Oct 2006 23:45:16 -0000      1.15
@@ -140,7 +140,7 @@
        printf("----------EEEEEK! dupe sub obj is a sub obj!\n");
        abort();
      }
- */
+  */
    sd->subobjs = evas_list_append(sd->subobjs, sobj);
    if (!sd->child_can_focus)
      {
===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_widget_desk_preview.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -3 -r1.2 -r1.3
--- e_widget_desk_preview.c     13 Oct 2006 02:49:40 -0000      1.2
+++ e_widget_desk_preview.c     16 Oct 2006 23:45:16 -0000      1.3
@@ -2,6 +2,10 @@
  * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
  */
 
+/* 
+ * XXX need to detect when bg's change and update
+ * XXX thumb doesn't properly change size 
+ */
 #include "e.h"
 
 typedef struct _E_Widget_Data E_Widget_Data;
@@ -13,35 +17,18 @@
    Evas_List *desks;
 
    int w, h;
+   int cur_x, cur_y; /* currently drawn */
    int desk_count_x, desk_count_y;
 };
 
-
-static void
-_e_wid_desks_free(E_Widget_Data *wd)
+typedef struct _E_Widget_Desk_Data E_Widget_Desk_Data;
+struct _E_Widget_Desk_Data
 {
-   Evas_List *l;
-   for (l = wd->desks; l; l = l->next)
-     {
-       Evas_Object *desk = l->data;
-       e_widget_sub_object_del(wd->obj, desk);
-       evas_object_del(desk);
-     }
-   evas_list_free(wd->desks);
-   wd->desks = NULL;
-   if (wd->table) 
-     {
-       e_widget_sub_object_del(wd->obj, wd->table);
-       evas_object_del(wd->table);
-     }
-   wd->table = NULL;
-   if (wd->aspect) 
-     {
-       e_widget_sub_object_del(wd->obj, wd->aspect);
-       evas_object_del(wd->aspect);
-     }
-   wd->aspect = NULL;
-}
+   Evas_Object *thumb;
+   int x, y;
+};
+
+static void _e_wid_reconfigure(E_Widget_Data *wd);
 
 static void
 _e_wid_del_hook(Evas_Object *obj)
@@ -51,46 +38,94 @@
    wd = e_widget_data_get(obj);
    if (!wd) return;
 
-   _e_wid_desks_free(wd);
+   evas_list_free(wd->desks);
    free(wd);
 }
 
-/* 
- * XXX break this into num_desks_set and _reconfigure calls 
- * XXX don't completely redraw on change just add/del rows/columns and update 
min sizes
- */
+static void
+_e_wid_desk_del_hook(Evas_Object *obj)
+{
+   E_Widget_Desk_Data *dd;
+
+   dd = e_widget_data_get(obj);
+   if (!dd) return;
+
+   free(dd);
+}
+
 void
 e_widget_desk_preview_num_desks_set(Evas_Object *obj, int nx, int ny)
 {
    E_Widget_Data *wd;
-   Evas_Object *o;
-   int x, y;
-   int aw, ah; /* available */
-   int mw, mh; /* min size for each desk */
-   int tw, th; /* size to thumb at */
-   E_Zone *zone;
 
    wd = e_widget_data_get(obj);
    if (!wd) return;
 
    wd->desk_count_x = nx;
    wd->desk_count_y = ny;
+   _e_wid_reconfigure(wd);
+}
+
+Evas_Object *
+e_widget_deskpreview_desk_add(Evas *evas, E_Zone *zone, int x, int y, int tw, 
int th)
+{
+   Evas_Object *overlay;
+   Evas_Object *obj, *o;
+   const char *bgfile;
+   E_Widget_Desk_Data *dd = NULL;
 
-   _e_wid_desks_free(wd);
 
-   zone = e_zone_current_get(e_container_current_get(e_manager_current_get()));
+   bgfile = e_bg_file_get(zone->container->num, zone->num, x, y);
+
+   /* wrap desks in a widget (to set min size) */
+   obj = e_widget_add(evas);
 
-   o = e_widget_aspect_add(evas_object_evas_get(obj), zone->w * nx, zone->h * 
ny);
+   dd = calloc(1, sizeof(E_Widget_Desk_Data));
+   e_widget_data_set(obj, dd);
+   dd->x = x;
+   dd->y = y;
+
+   e_widget_del_hook_set(obj, _e_wid_desk_del_hook);
+
+   o = edje_object_add(evas);
+   e_theme_edje_object_set(o, "base/theme/widgets", 
"e/widgets/deskpreview/desk");
    e_widget_resize_object_set(obj, o);
-   e_widget_sub_object_add(obj, o);
    evas_object_show(o);
-   wd->aspect = o;
-
-   o = e_widget_table_add(evas_object_evas_get(obj), 1);
    e_widget_sub_object_add(obj, o);
+   overlay = o;
+
+   o = e_thumb_icon_add(evas);
+   e_icon_fill_inside_set(o, 0);
+   e_thumb_icon_file_set(o, bgfile, "e/desktop/background");
+   e_thumb_icon_size_set(o, tw, th);
+   edje_object_part_swallow(overlay, "e.swallow.content", o);
+   e_thumb_icon_begin(o);
    evas_object_show(o);
-   e_widget_aspect_child_set(wd->aspect, o); 
-   wd->table = o;
+   e_widget_sub_object_add(obj, o);
+   dd->thumb = o;
+
+   return obj;
+}
+
+
+static void
+_e_wid_reconfigure(E_Widget_Data *wd)
+{
+   Evas_List *l, *delete = NULL;
+   Evas_Object *o;
+   int x, y;
+   int aw, ah; /* available */
+   int mw, mh; /* min size for each desk */
+   int tw, th; /* size to thumb at */
+   int nx, ny;
+   E_Zone *zone;
+
+   if (wd->desk_count_x == wd->cur_x && wd->desk_count_y == wd->cur_y) return;
+
+   nx = wd->desk_count_x;
+   ny = wd->desk_count_y;
+
+   zone = e_zone_current_get(e_container_current_get(e_manager_current_get()));
 
    evas_object_geometry_get(wd->table, NULL, NULL, &aw, &ah);
 
@@ -120,45 +155,50 @@
      tw = 300;
    th = (tw * zone->h) / zone->w;
 
+   for (l = wd->desks; l; l = l->next)
+     {
+       Evas_Object *dw = l->data;
+       E_Widget_Desk_Data *dd = e_widget_data_get(dw);
+       if (dd->x < nx && dd->y < ny)
+         {
+            e_widget_min_size_set(dw, mw, mh);
+            e_widget_table_object_repack(wd->table, dw, dd->x, dd->y, 1, 1, 1, 
1, 1, 1);
+            e_thumb_icon_size_set(dd->thumb, tw, th);
+            e_thumb_icon_begin(dd->thumb); /* XXX this isn't working - never 
ggetting new thumb */
+         }
+       else
+         {
+            delete = evas_list_append(delete, dw);
+         }
+     }
+   while (delete)
+     {
+       Evas_Object *dw = delete->data;
+       e_widget_table_unpack(wd->table, dw);
+       evas_object_del(dw);
+       wd->desks = evas_list_remove(wd->desks, dw);
+       delete = evas_list_remove_list(delete, delete);
+     }
+
    for (y = 0; y < ny; y++)
      {
-       for (x = 0; x < nx; x++)
+       int sx;
+       if (y >= wd->cur_y) sx = 0;
+       else sx = wd->cur_x;
+       for (x = sx; x < nx; x++)
          {
-            Evas_Object *overlay;
             Evas_Object *dw;
-            const char *bgfile;
-            E_Desk *desk = NULL;
 
-            if (x < zone->desk_x_count && y < zone->desk_y_count)
-              desk = zone->desks[x + (y * zone->desk_x_count)];
-            bgfile = e_bg_file_get(zone, desk);
-
-            /* wrap desks in a widget (to set min size) */
-            dw = e_widget_add(evas_object_evas_get(obj));
+            dw = e_widget_deskpreview_desk_add(evas_object_evas_get(wd->obj), 
zone, x, y, tw, th);
             e_widget_min_size_set(dw, mw, mh);
 
-            o = edje_object_add(evas_object_evas_get(obj));
-            e_theme_edje_object_set(o, "base/theme/widgets", 
"e/widgets/deskpreview/desk");
-            e_widget_resize_object_set(dw, o);
-            e_widget_sub_object_add(dw, o);
-
-            evas_object_show(o);
-            e_widget_sub_object_add(dw, o);
-            overlay = o;
-
-            o = e_thumb_icon_add(evas_object_evas_get(obj));
-            e_icon_fill_inside_set(o, 0);
-            e_thumb_icon_file_set(o, bgfile, "e/desktop/background");
-            e_thumb_icon_size_set(o, tw, th);
-            edje_object_part_swallow(overlay, "e.swallow.content", o);
-            e_thumb_icon_begin(o);
-            evas_object_show(o);
-            e_widget_sub_object_add(dw, o);
-
             e_widget_table_object_append(wd->table, dw, x, y, 1, 1, 1, 1, 1, 
1);
             wd->desks = evas_list_append(wd->desks, dw);
          }
      }
+
+   wd->cur_x = wd->desk_count_x;
+   wd->cur_y = wd->desk_count_y;
 }
 
 Evas_Object *
@@ -167,6 +207,7 @@
    Evas_Object *obj, *o;
    E_Widget_Data *wd;
    Evas_Coord iw, ih;
+   E_Zone *zone;
 
    obj = e_widget_add(evas);
    wd = calloc(1, sizeof(E_Widget_Data));
@@ -174,6 +215,19 @@
    wd->obj = obj;
    e_widget_data_set(obj, wd);
    e_widget_del_hook_set(obj, _e_wid_del_hook);
+
+   zone = e_zone_current_get(e_container_current_get(e_manager_current_get()));
+   o = e_widget_aspect_add(evas, zone->w * nx, zone->h * ny);
+   e_widget_resize_object_set(wd->obj, o);
+   e_widget_sub_object_add(wd->obj, o);
+   evas_object_show(o);
+   wd->aspect = o;
+
+   o = e_widget_table_add(evas, 1);
+   e_widget_sub_object_add(wd->obj, o);
+   evas_object_show(o);
+   e_widget_aspect_child_set(wd->aspect, o); 
+   wd->table = o;
 
    e_widget_desk_preview_num_desks_set(obj, nx, ny);
 
===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_widget_table.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -3 -r1.6 -r1.7
--- e_widget_table.c    26 Aug 2006 08:32:56 -0000      1.6
+++ e_widget_table.c    16 Oct 2006 23:45:16 -0000      1.7
@@ -81,6 +81,13 @@
    e_widget_min_size_set(obj, mw, mh);
 }
 
+EAPI void
+e_widget_table_unpack(Evas_Object *obj, Evas_Object *sobj)
+{
+   e_widget_sub_object_del(obj, sobj);
+   e_table_unpack(sobj);
+}
+
 static void
 _e_wid_del_hook(Evas_Object *obj)
 {
===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_widget_table.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -3 -r1.3 -r1.4
--- e_widget_table.h    26 Aug 2006 08:32:56 -0000      1.3
+++ e_widget_table.h    16 Oct 2006 23:45:16 -0000      1.4
@@ -9,6 +9,7 @@
 EAPI Evas_Object *e_widget_table_add(Evas *evas, int homogenous);
 EAPI void e_widget_table_object_append(Evas_Object *obj, Evas_Object *sobj, 
int col, int row, int colspan, int rowspan, int fill_w, int fill_h, int 
expand_w, int expand_h);
 EAPI void e_widget_table_object_repack(Evas_Object *obj, Evas_Object *sobj, 
int col, int row, int colspan, int rowspan, int fill_w, int fill_h, int 
expand_w, int expand_h);
+EAPI void e_widget_table_unpack(Evas_Object *obj, Evas_Object *sobj);
     
 #endif
 #endif



-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to