[maemo-commits] [maemo-commits] r9500 - in projects/haf/branches/maemo-af-desktop/hildon-desktop: . libhildondesktop src

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Wed Jan 31 17:17:15 EET 2007
Author: jobi
Date: 2007-01-31 17:17:14 +0200 (Wed, 31 Jan 2007)
New Revision: 9500

Modified:
   projects/haf/branches/maemo-af-desktop/hildon-desktop/ChangeLog
   projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/hildon-home-area.c
   projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/hildon-home-area.h
   projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/hildon-home-window.c
   projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-plugin-loader-legacy.c
Log:

2007-01-31  Johan Bilien  <johan.bilien at nokia.com>

	* libhildondesktop/hildon-home-area.[ch]:
	- added hildon_home_area_set_batch_add, which allows to add
	applets in a bunch (for placement)
	- added hildon_home_area_place which places the applets according
	to a simple algorithm
	* libhildondesktop/hildon-home-window.c: Set batch_add mode
	on the are before opening the "select applets" dialog, and
	unset it when done
	* src/hd-plugin-loader-legacy.c: pass NULL as state_data in
	the home applets initialization callback



Modified: projects/haf/branches/maemo-af-desktop/hildon-desktop/ChangeLog
===================================================================
--- projects/haf/branches/maemo-af-desktop/hildon-desktop/ChangeLog	2007-01-31 14:28:11 UTC (rev 9499)
+++ projects/haf/branches/maemo-af-desktop/hildon-desktop/ChangeLog	2007-01-31 15:17:14 UTC (rev 9500)
@@ -1,3 +1,16 @@
+2007-01-31  Johan Bilien  <johan.bilien at nokia.com>
+
+	* libhildondesktop/hildon-home-area.[ch]:
+	- added hildon_home_area_set_batch_add, which allows to add
+	applets in a bunch (for placement)
+	- added hildon_home_area_place which places the applets according
+	to a simple algorithm
+	* libhildondesktop/hildon-home-window.c: Set batch_add mode
+	on the are before opening the "select applets" dialog, and
+	unset it when done
+	* src/hd-plugin-loader-legacy.c: pass NULL as state_data in
+	the home applets initialization callback
+
 2007-01-29  Johan Bilien  <johan.bilien at nokia.com>
 
 	* src/hd-plugin-loader-legacy.c: Initialize the symbols structure

Modified: projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/hildon-home-area.c
===================================================================
--- projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/hildon-home-area.c	2007-01-31 14:28:11 UTC (rev 9499)
+++ projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/hildon-home-area.c	2007-01-31 15:17:14 UTC (rev 9500)
@@ -30,7 +30,10 @@
 #include <string.h> /* strlen */
 #include <errno.h>
 
+#define APPLET_ADD_X_STEP       20
+#define APPLET_ADD_Y_STEP       20
 
+
 enum
 {
   HILDON_HOME_AREA_PROPERTY_LAYOUT_MODE = 1
@@ -42,6 +45,9 @@
   gboolean      layout_changed;
 
   GHashTable   *layout;
+
+  GList        *to_add;
+  gboolean      batch_add;
 } HildonHomeAreaPriv;
 
 #define HILDON_HOME_AREA_GET_PRIVATE(obj) \
@@ -371,7 +377,17 @@
   g_return_if_fail (area);
 
   priv = HILDON_HOME_AREA_GET_PRIVATE (area);
+      
+  g_debug ("Adding Hildon Home applet %s",
+           hildon_desktop_item_get_id (HILDON_DESKTOP_ITEM (applet)));
 
+  if (priv->batch_add)
+    {
+      g_debug ("Batch adding it");
+      priv->to_add = g_list_append (priv->to_add, applet);
+      return;
+    }
+
   if (priv->layout && HILDON_IS_HOME_APPLET (applet))
     {
       g_debug ("Adding Hildon Home applet");
@@ -404,7 +420,162 @@
 
 }
 
+static gint
+sort_by_area (GtkWidget *a, GtkWidget *b)
+{
+  GtkRequisition reqa, reqb;
+
+  gtk_widget_size_request (a, &reqa);
+  gtk_widget_size_request (b, &reqb);
+
+  if (reqa.width * reqa.height > reqb.width * reqb.height)
+    return -1;
+  else if (reqa.width * reqa.height < reqb.width * reqb.height)
+    return 1;
+  else return 0;
+
+}
+
 static void
+hildon_home_area_place (HildonHomeArea *area, GList *applets)
+{
+  HildonHomeAreaPriv      *priv;
+
+  guint columns_last_width[2] = {0, 0};
+  guint columns_last_y[2] = {LAYOUT_AREA_TOP_BORDER_PADDING,
+                             LAYOUT_AREA_TOP_BORDER_PADDING};
+  GList *i_applet, *to_place;
+  gint i_column = 0;
+  gint width = GTK_WIDGET (area)->allocation.width;
+  gint height = GTK_WIDGET (area)->allocation.height;
+  gint last_stacked_x = 0, last_stacked_y = 0;
+  
+  g_return_if_fail (area);
+
+  priv = HILDON_HOME_AREA_GET_PRIVATE (area);
+  applets = g_list_sort (applets, (GCompareFunc)sort_by_area);
+
+  to_place = g_list_copy (applets);
+
+#define PADDING 5
+#define other_c ((i_column + 1) % 2)
+
+  for (i_applet = to_place; i_applet; i_applet = g_list_next (i_applet))
+    {
+      GtkWidget *applet = GTK_WIDGET (i_applet->data);
+      GtkRequisition req;
+      const gchar *name = 
+          hildon_desktop_item_get_id (HILDON_DESKTOP_ITEM (applet));
+      gint x = -1, y = -1;
+      gint selected_column = -1;
+      
+      g_debug ("Looking at applet %s", name);
+
+      gtk_widget_size_request (applet, &req);
+
+#if 0
+      g_debug ("column %i, last y %i %i, last width %i %i",
+               i_column,
+               columns_last_y[0], columns_last_y[1],
+               columns_last_width[0], columns_last_width[1]);
+
+      g_debug ("Got applet with size %ix%i", req.width, req.height);
+      g_debug ("Area has size %ix%i", width, height);
+#endif
+
+      if (columns_last_y[i_column] + req.height + PADDING < height
+          && req.width + columns_last_width[(1+i_column)%2] + LAYOUT_AREA_LEFT_BORDER_PADDING + LAYOUT_AREA_RIGHT_BORDER_PADDING < width)
+        {
+          x = i_column? (width - req.width - LAYOUT_AREA_RIGHT_BORDER_PADDING):
+              LAYOUT_AREA_LEFT_BORDER_PADDING;
+          y = columns_last_y[i_column] + PADDING;
+
+          selected_column = i_column;
+        }
+      else if (columns_last_y[other_c] + req.height + PADDING < height
+                              && req.width + columns_last_width[i_column] + LAYOUT_AREA_LEFT_BORDER_PADDING + LAYOUT_AREA_RIGHT_BORDER_PADDING < width)
+        {
+          x = other_c? (width - req.width - LAYOUT_AREA_RIGHT_BORDER_PADDING):
+              LAYOUT_AREA_LEFT_BORDER_PADDING;
+          y = columns_last_y[other_c] + PADDING;
+
+          selected_column = other_c;
+        }
+
+        if (selected_column < 0)
+        {
+          /* Revert to top-left stacking */
+          x = last_stacked_x;
+          y = last_stacked_y;
+
+          if (x + req.width > width - LAYOUT_AREA_LEFT_BORDER_PADDING
+                                    - LAYOUT_AREA_RIGHT_BORDER_PADDING)
+            x = LAYOUT_AREA_LEFT_BORDER_PADDING;
+          
+          if (y + req.height > height - LAYOUT_AREA_TOP_BORDER_PADDING
+                                      - LAYOUT_AREA_BOTTOM_BORDER_PADDING)
+            y = LAYOUT_AREA_TOP_BORDER_PADDING;
+
+          last_stacked_x = x + APPLET_ADD_X_STEP;
+          last_stacked_y = y + APPLET_ADD_Y_STEP;
+        }
+          
+      g_debug ("Placing applet %s at %ix%i", name, x,y);
+
+      if (applet->parent)
+        gtk_fixed_move (GTK_FIXED (area), applet, x, y);
+      else
+        {
+          GdkRectangle *layout = g_new (GdkRectangle, 1);
+          layout->x = x;
+          layout->y = y;
+          layout->width = -1;
+          layout->height = -1;
+
+          g_hash_table_insert (priv->layout, g_strdup (name), layout);
+          gtk_container_add (GTK_CONTAINER (area), applet);
+        }
+      gtk_widget_show_all (applet);
+      applets = g_list_remove (applets, applet);
+
+
+      if (selected_column >= 0)
+        {
+          columns_last_y[selected_column] += req.height + PADDING;
+          columns_last_width[selected_column] = req.width;
+
+          if (columns_last_y[i_column] > columns_last_y[(i_column+1)%2])
+            i_column = (i_column + 1)%2;
+
+        }
+
+    }
+
+  g_list_free (to_place);
+
+#undef PADDING
+
+}
+
+
+
+static void
+hildon_home_area_batch_add (HildonHomeArea *area)
+{
+  HildonHomeAreaPriv      *priv;
+  GList                   *children, *to_place;
+  g_return_if_fail (area);
+
+  priv = HILDON_HOME_AREA_GET_PRIVATE (area);
+
+  children = gtk_container_get_children (GTK_CONTAINER (area));
+
+  to_place = g_list_concat (children, priv->to_add);
+
+  hildon_home_area_place (area, to_place);
+}
+
+static void
 hildon_home_area_remove (GtkContainer *area, GtkWidget *applet)
 {
   HildonHomeAreaPriv      *priv;
@@ -710,3 +881,20 @@
 
   return overlap;
 }
+
+void
+hildon_home_area_set_batch_add (HildonHomeArea *area, gboolean batch_add)
+{
+  HildonHomeAreaPriv      *priv;
+  g_return_if_fail (area);
+  priv = HILDON_HOME_AREA_GET_PRIVATE (area);
+
+  if (priv->batch_add && !batch_add)
+    {
+      priv->batch_add = FALSE;
+      hildon_home_area_batch_add (area);
+    }
+
+  priv->batch_add = batch_add;
+}
+

Modified: projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/hildon-home-area.h
===================================================================
--- projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/hildon-home-area.h	2007-01-31 14:28:11 UTC (rev 9499)
+++ projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/hildon-home-area.h	2007-01-31 15:17:14 UTC (rev 9500)
@@ -85,7 +85,10 @@
 
 gboolean    hildon_home_area_get_overlaps       (HildonHomeArea *area);
 
+void        hildon_home_area_set_batch_add      (HildonHomeArea *area,
+                                                 gboolean batch_add);
 
+
 G_END_DECLS
 
 

Modified: projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/hildon-home-window.c
===================================================================
--- projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/hildon-home-window.c	2007-01-31 14:28:11 UTC (rev 9499)
+++ projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/hildon-home-window.c	2007-01-31 15:17:14 UTC (rev 9500)
@@ -876,7 +876,9 @@
   HildonHomeWindowPrivate *priv = window->priv;
   
   priv->selecting_applets = TRUE;
+  hildon_home_area_set_batch_add (HILDON_HOME_AREA (priv->applet_area), TRUE);
   g_signal_emit_by_name (window, "select-plugins", NULL);
+  hildon_home_area_set_batch_add (HILDON_HOME_AREA (priv->applet_area), FALSE);
   priv->selecting_applets = FALSE;
 
   if (HILDON_IS_HOME_AREA (priv->applet_area))

Modified: projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-plugin-loader-legacy.c
===================================================================
--- projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-plugin-loader-legacy.c	2007-01-31 14:28:11 UTC (rev 9499)
+++ projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-plugin-loader-legacy.c	2007-01-31 15:17:14 UTC (rev 9500)
@@ -427,7 +427,7 @@
     return NULL;
   }
 
-  priv->module_data = ((HomeInitializeFn)symbol) (&state_data,
+  priv->module_data = ((HomeInitializeFn)symbol) (state_data,
                                                   &state_data_length,
                                                   &module_widget);
 


More information about the maemo-commits mailing list