[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.orgDate: Wed Jan 31 17:17:15 EET 2007
- Previous message: [maemo-commits] r9499 - in projects/haf/branches/hildon-libs/hildon-1: . src
- Next message: [maemo-commits] r9501 - projects/haf/trunk/hildon-theme-layout-4
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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);
- Previous message: [maemo-commits] r9499 - in projects/haf/branches/hildon-libs/hildon-1: . src
- Next message: [maemo-commits] r9501 - projects/haf/trunk/hildon-theme-layout-4
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]