[maemo-commits] [maemo-commits] r11507 - in projects/haf/trunk/hildon-desktop: . libhildondesktop src

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Mon May 7 19:39:08 EEST 2007
Author: moimart
Date: 2007-05-07 19:39:05 +0300 (Mon, 07 May 2007)
New Revision: 11507

Modified:
   projects/haf/trunk/hildon-desktop/ChangeLog
   projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-menu.c
   projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-window.c
   projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-window.h
   projects/haf/trunk/hildon-desktop/src/hd-switcher-menu-item.c
   projects/haf/trunk/hildon-desktop/src/hd-switcher-menu-item.h
   projects/haf/trunk/hildon-desktop/src/hd-switcher-menu.c
Log:
	* src/hd-switcher-menu-item.[ch]:
        - Renamed some methods
        - Added leave notify event handler to unselect itself
        * src/hd-switcher-menu.c:
        - Implemented blinking notifications.
        - Fixed theme of icon.
        - Fixed first selected item. Misses stack_changed to track selected
        items.
        * libhildondesktop/hildon-desktop-popup-window.[ch]:
        - Added "popdown-window" signal
	* ChangeLog updated




Modified: projects/haf/trunk/hildon-desktop/ChangeLog
===================================================================
--- projects/haf/trunk/hildon-desktop/ChangeLog	2007-05-07 16:15:36 UTC (rev 11506)
+++ projects/haf/trunk/hildon-desktop/ChangeLog	2007-05-07 16:39:05 UTC (rev 11507)
@@ -1,3 +1,16 @@
+2007-05-07  Moises Martinez  <moises.martinez at nokia.com>
+
+	* src/hd-switcher-menu-item.[ch]:
+	- Renamed some methods
+	- Added leave notify event handler to unselect itself
+	* src/hd-switcher-menu.c:
+	- Implemented blinking notifications.
+	- Fixed theme of icon.
+	- Fixed first selected item. Misses stack_changed to track selected
+	items.
+	* libhildondesktop/hildon-desktop-popup-window.[ch]:
+	- Added "popdown-window" signal
+
 2007-05-07  Johan Bilien  <johan.bilien at nokia.com>
 
 	* libhildondesktop/hildon-desktop-toggle-button.[ch]:

Modified: projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-menu.c
===================================================================
--- projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-menu.c	2007-05-07 16:15:36 UTC (rev 11506)
+++ projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-menu.c	2007-05-07 16:39:05 UTC (rev 11507)
@@ -262,6 +262,14 @@
   GList *menu_items = NULL, *l;
   gint w,h,x,y;
 
+  gtk_widget_get_pointer (GTK_WIDGET (widget), &x, &y);
+
+  w = widget->allocation.width;
+  h = widget->allocation.height;
+
+  if (!((x >= 0) && (x <= w) && (y >= 0) && (y <= h)))
+    return TRUE;    	 
+
   menu_items = 
     gtk_container_get_children (GTK_CONTAINER (menu->priv->box_items));
 

Modified: projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-window.c
===================================================================
--- projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-window.c	2007-05-07 16:15:36 UTC (rev 11506)
+++ projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-window.c	2007-05-07 16:39:05 UTC (rev 11507)
@@ -44,6 +44,7 @@
 enum
 {
   SIGNAL_POPUP_SHOW,
+  SIGNAL_POPUP_CLOSE,
   POPUP_N_SIGNALS
 };
 
@@ -154,6 +155,15 @@
                       NULL, NULL,
                       g_cclosure_marshal_VOID__VOID,
                       G_TYPE_NONE, 0);
+ 
+  signals[SIGNAL_POPUP_SHOW] =
+        g_signal_new ("popdown-window",
+                      G_OBJECT_CLASS_TYPE (object_class),
+                      G_SIGNAL_RUN_LAST,
+                      G_STRUCT_OFFSET (HildonDesktopPopupWindowClass,popdown_window),
+                      NULL, NULL,
+                      g_cclosure_marshal_VOID__VOID,
+                      G_TYPE_NONE, 0); 
 
   g_object_class_install_property (object_class,
                                    PROP_POPUP_N_PANES,
@@ -967,6 +977,8 @@
 
   for (i=0; i < popup->priv->n_extra_panes; i++)
     gtk_grab_remove (popup->priv->extra_panes[i]);	  
+
+  g_signal_emit_by_name (popup, "popdown-window");
 }
 
 void 

Modified: projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-window.h
===================================================================
--- projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-window.h	2007-05-07 16:15:36 UTC (rev 11506)
+++ projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-window.h	2007-05-07 16:39:05 UTC (rev 11507)
@@ -66,6 +66,7 @@
   /* */	
 
   void (*popup_window) (HildonDesktopPopupWindow *window);
+  void (*popdown_window) (HildonDesktopPopupWindow *window);
 };
 
 GType 

Modified: projects/haf/trunk/hildon-desktop/src/hd-switcher-menu-item.c
===================================================================
--- projects/haf/trunk/hildon-desktop/src/hd-switcher-menu-item.c	2007-05-07 16:15:36 UTC (rev 11506)
+++ projects/haf/trunk/hildon-desktop/src/hd-switcher-menu-item.c	2007-05-07 16:39:05 UTC (rev 11507)
@@ -264,7 +264,7 @@
   else
   {
     pixbuf_anim = gtk_image_get_animation (GTK_IMAGE (icon));
-      
+    g_debug ("Turning animation off");      
     /* grab static image from menu item and reset */
     pixbuf = gdk_pixbuf_animation_get_static_image (pixbuf_anim);
 
@@ -423,7 +423,7 @@
       gtk_image_set_from_pixbuf 
         (GTK_IMAGE (priv->icon), priv->notification_icon);
 
-    g_debug ("Id: %d Summary of notification: %s", priv->notification_id, priv->notification_summary);
+    g_debug ("pixbuf: %p Id: %d Summary of notification: %s", priv->notification_icon, priv->notification_id, priv->notification_summary);
     
     gtk_label_set_text (GTK_LABEL (priv->label), 
 		        priv->notification_summary); /* TODO: Insert timestamp */
@@ -569,7 +569,7 @@
 	 menuitem->priv->notification_id,
 	 &error);
 
-      if (!error)
+      if (error)
       {
         g_warning ("We cannot close the notification!?!?!");
 	g_error_free (error);
@@ -621,6 +621,14 @@
   return FALSE;
 }
 
+static gboolean 
+hd_switcher_menu_item_leave_notify (GtkWidget        *widget,
+				    GdkEventCrossing *event)
+{
+  gtk_item_deselect (GTK_ITEM (widget));
+	
+  return TRUE;
+}
 
 static void
 hd_switcher_menu_item_class_init (HDSwitcherMenuItemClass *klass)
@@ -638,6 +646,8 @@
   widget_class->size_request = hd_switcher_menu_item_size_request;
   widget_class->button_press_event = hd_switcher_menu_item_button_press_event;
   widget_class->button_release_event = hd_switcher_menu_item_button_release_event;
+
+  widget_class->leave_notify_event = hd_switcher_menu_item_leave_notify;
   
   menuitem_class->activate = hd_switcher_menu_item_activate;
 
@@ -694,7 +704,7 @@
 							(G_PARAM_CONSTRUCT | G_PARAM_READWRITE))); 
  
   g_object_class_install_property (gobject_class,
-		  		   MENU_PROP_NOT_BODY,
+		  		   MENU_PROP_NOT_ICON,
 				   g_param_spec_object ("notification-icon",
 					   		"Icon notification",
 							"The icon of the notification",
@@ -830,16 +840,18 @@
 }
 
 void
-hd_switcher_menu_item_set_is_blinking (HDSwitcherMenuItem *menuitem,
+hd_switcher_menu_item_set_blinking (HDSwitcherMenuItem *menuitem,
 				  gboolean       is_blinking)
 {
   g_return_if_fail (HD_IS_SWITCHER_MENU_ITEM (menuitem));
 
   hd_switcher_menu_item_icon_animation (menuitem->priv->icon, is_blinking);
+
+  menuitem->priv->is_blinking = is_blinking;
 }
 
 gboolean
-hd_switcher_menu_item_get_is_blinking (HDSwitcherMenuItem *menuitem)
+hd_switcher_menu_item_is_blinking (HDSwitcherMenuItem *menuitem)
 {
   g_return_val_if_fail (HD_IS_SWITCHER_MENU_ITEM (menuitem), FALSE);
 

Modified: projects/haf/trunk/hildon-desktop/src/hd-switcher-menu-item.h
===================================================================
--- projects/haf/trunk/hildon-desktop/src/hd-switcher-menu-item.h	2007-05-07 16:15:36 UTC (rev 11506)
+++ projects/haf/trunk/hildon-desktop/src/hd-switcher-menu-item.h	2007-05-07 16:39:05 UTC (rev 11507)
@@ -77,9 +77,9 @@
 void         hd_switcher_menu_item_set_entry_info  (HDSwitcherMenuItem *menuitem,
 					       HDEntryInfo   *info);
 HDEntryInfo *hd_switcher_menu_item_get_entry_info  (HDSwitcherMenuItem *menuitem);
-void         hd_switcher_menu_item_set_is_blinking (HDSwitcherMenuItem *menuitem,
+void         hd_switcher_menu_item_set_blinking (HDSwitcherMenuItem *menuitem,
 					       gboolean       is_blinking);
-gboolean     hd_switcher_menu_item_get_is_blinking (HDSwitcherMenuItem *menuitem);
+gboolean     hd_switcher_menu_item_is_blinking (HDSwitcherMenuItem *menuitem);
 
 gint	     hd_switcher_menu_item_get_notification_id (HDSwitcherMenuItem *menuitem);
 

Modified: projects/haf/trunk/hildon-desktop/src/hd-switcher-menu.c
===================================================================
--- projects/haf/trunk/hildon-desktop/src/hd-switcher-menu.c	2007-05-07 16:15:36 UTC (rev 11506)
+++ projects/haf/trunk/hildon-desktop/src/hd-switcher-menu.c	2007-05-07 16:39:05 UTC (rev 11507)
@@ -67,6 +67,8 @@
 #define AS_INTERNAL_PADDING     10
 #define AS_SEPARATOR_HEIGHT     10
 
+#define SWITCHER_TOGGLE_BUTTON GTK_BIN(switcher)->child
+
 enum 
 {
   PROP_MENU_NITEMS=1,
@@ -88,6 +90,13 @@
   GtkImage		   *image_button;
 
   GtkWidget 		   *active_menu_item;
+
+  gboolean 		    is_open;
+
+  GtkIconTheme		   *icon_theme;
+  GtkWidget		   *icon;
+
+  GtkTreeIter		   *last_iter_added;
 };
 
 static GObject *hd_switcher_menu_constructor (GType gtype,
@@ -96,6 +105,8 @@
 
 static void hd_switcher_menu_finalize (GObject *object);
 
+static void hd_switcher_menu_style_set (GtkWidget *widget, GtkStyle *style, gpointer data);
+
 static void hd_switcher_menu_toggled_cb (GtkWidget *button, HDSwitcherMenu *switcher);
 
 static void hd_switcher_menu_scroll_to (HildonDesktopPopupWindow *window,
@@ -134,6 +145,10 @@
 
   switcher->priv->active_menu_item = NULL;
 
+  switcher->priv->is_open = FALSE;
+
+  switcher->priv->last_iter_added = NULL;
+
   switcher->hdwm = hd_wm_get_singleton ();
 
   switcher->nm = 
@@ -146,8 +161,8 @@
 static void 
 hd_switcher_menu_class_init (HDSwitcherMenuClass *switcher)
 {
-  GObjectClass *object_class = G_OBJECT_CLASS (switcher);
-
+  GObjectClass   *object_class = G_OBJECT_CLASS (switcher);
+  
   object_class->constructor = hd_switcher_menu_constructor;
   object_class->finalize    = hd_switcher_menu_finalize;
 
@@ -160,6 +175,64 @@
   hildon_desktop_popup_recalculate_position (switcher->priv->popup_window);  
 }	
 
+static GdkPixbuf *
+hd_switcher_menu_get_icon_from_theme (HDSwitcherMenu *switcher,
+                                     const gchar     *icon_name,
+                                     gint             size)
+{
+  GError *error;
+  GdkPixbuf *retval;
+
+  if (!icon_name)
+    return NULL;
+
+  if (!switcher->priv->icon_theme)
+    switcher->priv->icon_theme = gtk_icon_theme_get_default ();
+
+  g_return_val_if_fail (switcher->priv->icon_theme, NULL);
+
+  if (!icon_name || icon_name[0] == '\0')
+    return NULL;
+
+  error = NULL;
+  retval = gtk_icon_theme_load_icon (switcher->priv->icon_theme,
+                                     icon_name,
+                                     size == -1 ? AS_ICON_SIZE : size,
+                                     0,
+                                     &error);
+  if (error)
+  {
+    g_warning ("Could not load icon '%s': %s\n",
+              icon_name,
+              error->message);
+
+    g_error_free (error);
+
+    return NULL;
+  }
+
+  return retval;
+}
+
+static void 
+hd_switcher_menu_update_open (HildonDesktopPopupWindow *window, HDSwitcherMenu *switcher)
+{
+  GList *children = NULL, *l;
+	
+  switcher->priv->is_open = FALSE;
+
+  children = hildon_desktop_popup_menu_get_children (switcher->priv->menu_notifications);
+
+  for (l = children; l != NULL; l = g_list_next (l))
+  {
+    if (HD_IS_SWITCHER_MENU_ITEM (l->data))
+    {	    
+      if (hd_switcher_menu_item_is_blinking (HD_SWITCHER_MENU_ITEM (l->data)))	    
+        hd_switcher_menu_item_set_blinking (HD_SWITCHER_MENU_ITEM (l->data),FALSE);
+    }
+  }	  
+}	
+
 static GObject *
 hd_switcher_menu_constructor (GType gtype,
 			      guint n_params,
@@ -169,16 +242,26 @@
   HDSwitcherMenu *switcher;
   GtkWidget *button;
   HDWM *hdwm = hd_wm_get_singleton ();
+  GdkPixbuf *pixbuf;
+ 
 
   object = G_OBJECT_CLASS (hd_switcher_menu_parent_class)->constructor (gtype,
            	                                                        n_params,
                                                                         params);
-
   switcher = HD_SWITCHER_MENU (object);
 
   gtk_widget_push_composite_child ();
 
   button = gtk_toggle_button_new ();
+
+  gtk_widget_set_name (button, AS_MENU_BUTTON_NAME);
+  gtk_widget_set_size_request (button, -1, AS_MENU_BUTTON_HEIGHT);
+
+  pixbuf = hd_switcher_menu_get_icon_from_theme (switcher, AS_MENU_BUTTON_ICON, -1);
+  switcher->priv->icon = gtk_image_new_from_pixbuf (pixbuf);
+  gtk_container_add (GTK_CONTAINER (button), switcher->priv->icon);
+  gtk_widget_show (switcher->priv->icon);
+  g_object_unref (pixbuf);
   
   gtk_container_add (GTK_CONTAINER (object), button);
   gtk_widget_show (button);
@@ -214,6 +297,16 @@
   gtk_widget_show (GTK_WIDGET (switcher->priv->menu_applications));
   gtk_widget_show (GTK_WIDGET (switcher->priv->menu_notifications));
 
+  g_signal_connect (switcher,
+		    "style-set",
+		    G_CALLBACK (hd_switcher_menu_style_set),
+		    NULL);
+
+  g_signal_connect (switcher->priv->popup_window,
+		    "popdown-window",
+		    G_CALLBACK (hd_switcher_menu_update_open),
+		    (gpointer)switcher);
+  
   g_signal_connect (switcher->priv->menu_applications,
 		    "popup-menu-resize",
 		    G_CALLBACK (hd_switcher_menu_resize_menu),
@@ -304,6 +397,44 @@
 }	
 
 static void
+hd_switcher_menu_replace_blinking_icon (HDSwitcherMenu *switcher, GdkPixbuf *icon)
+{
+  if (!switcher->priv->is_open && icon)
+  {
+    GdkPixbufAnimation *icon_blinking;
+    GtkWidget *image_blinking;
+
+    icon_blinking =
+      hn_app_pixbuf_anim_blinker_new (icon,1000/ANIM_FPS,-1,10);
+
+    image_blinking = gtk_image_new ();
+    gtk_image_set_from_animation (GTK_IMAGE (image_blinking), icon_blinking);
+
+    if (image_blinking)
+    {    
+      if (GTK_BIN (SWITCHER_TOGGLE_BUTTON)->child == switcher->priv->icon)   
+      {	      
+        g_object_ref (G_OBJECT (switcher->priv->icon));
+        gtk_container_remove (GTK_CONTAINER (SWITCHER_TOGGLE_BUTTON), GTK_WIDGET (switcher->priv->icon));
+      }
+      else
+       gtk_container_remove (GTK_CONTAINER (SWITCHER_TOGGLE_BUTTON), GTK_BIN (SWITCHER_TOGGLE_BUTTON)->child);	      
+    }
+
+    gtk_container_add (GTK_CONTAINER (SWITCHER_TOGGLE_BUTTON), image_blinking);
+    gtk_widget_show (image_blinking);
+  }
+}
+
+static void 
+hd_switcher_menu_style_set (GtkWidget *widget, GtkStyle *style, gpointer data)
+{
+	
+  gtk_widget_set_name (widget, AS_MENU_BUTTON_NAME);	
+  gtk_widget_set_name (GTK_BIN (widget)->child, AS_MENU_BUTTON_NAME);
+}	
+
+static void
 hd_switcher_menu_get_workarea (GtkAllocation *allocation)
 {
   unsigned long n;
@@ -446,9 +577,23 @@
     (gpointer)switcher,
     GDK_CURRENT_TIME);
 
-  g_debug ("actual size of window: w: %d h: %d", 
-  	   GTK_WIDGET (switcher->priv->popup_window)->allocation.width,
-	   GTK_WIDGET (switcher->priv->popup_window)->allocation.height);
+  if (!hildon_desktop_popup_menu_get_children (switcher->priv->menu_notifications))
+    gtk_widget_hide (hildon_desktop_popup_window_get_pane (switcher->priv->popup_window, 1));
+  else
+    gtk_widget_show (hildon_desktop_popup_window_get_pane (switcher->priv->popup_window, 1));  
+
+  switcher->priv->is_open = TRUE;
+
+  if (GTK_BIN (SWITCHER_TOGGLE_BUTTON)->child != switcher->priv->icon)
+  {
+    gtk_container_remove (GTK_CONTAINER (SWITCHER_TOGGLE_BUTTON),
+		    	  GTK_BIN (SWITCHER_TOGGLE_BUTTON)->child);
+
+    gtk_container_add (GTK_CONTAINER (SWITCHER_TOGGLE_BUTTON),
+		       GTK_WIDGET (switcher->priv->icon));
+    
+    g_object_unref (G_OBJECT (switcher->priv->icon)); 
+  }	  
 }	
 
 static void 
@@ -517,12 +662,13 @@
 
       menu_item = hd_switcher_menu_item_new_from_entry_info (entry, TRUE);
 
+      hildon_desktop_popup_menu_add_item
+       (switcher->priv->menu_applications, GTK_MENU_ITEM (menu_item));
+
       if (hd_entry_info_is_active (entry))
         hildon_desktop_popup_menu_select_item 
           (switcher->priv->menu_applications, GTK_MENU_ITEM (menu_item));		
 
-      hildon_desktop_popup_menu_add_item
-       (switcher->priv->menu_applications, GTK_MENU_ITEM (menu_item));
     }
 
     /* append the separator for this app*/
@@ -538,22 +684,10 @@
 			      HDEntryInfo *info,
 			      HDSwitcherMenu *switcher)
 {
-/*  GtkWidget *menu_item;*/
-
   if (!info)
     return;	  
 
   hd_switcher_menu_create_menu (switcher, hdwm);
-/*
-  menu_item = gtk_separator_menu_item_new ();
-
-  hildon_desktop_popup_menu_add_item
-    (switcher->priv->menu_applications, GTK_MENU_ITEM (menu_item));
-  
-  menu_item = hd_switcher_menu_item_new_from_entry_info (info, TRUE);
-
-  hildon_desktop_popup_menu_add_item 
-    (switcher->priv->menu_applications, GTK_MENU_ITEM (menu_item));*/
 }
 
 static void 
@@ -638,8 +772,8 @@
     if (menu_item)
     {
       /* child of one of the app buttons */
-      if (!hd_switcher_menu_item_get_is_blinking (HD_SWITCHER_MENU_ITEM (menu_item)))
-        hd_switcher_menu_item_set_is_blinking (HD_SWITCHER_MENU_ITEM (menu_item), TRUE);
+      if (!hd_switcher_menu_item_is_blinking (HD_SWITCHER_MENU_ITEM (menu_item)))
+        hd_switcher_menu_item_set_blinking (HD_SWITCHER_MENU_ITEM (menu_item), TRUE);
     }
   }
 }
@@ -674,7 +808,13 @@
   gchar *summary = NULL, *body = NULL;
   guint id;
   GtkWidget *menu_item;
-	
+ 
+  GtkWidget *pane_notifications = 
+   hildon_desktop_popup_window_get_pane 
+     (switcher->priv->popup_window, 1);
+  
+  if (switcher->priv->is_open && !GTK_WIDGET_MAPPED (pane_notifications))
+    gtk_widget_show (pane_notifications);	  
 
   gtk_tree_model_get (tree_model,
 		      iter,
@@ -683,13 +823,23 @@
 		      HD_NM_COL_SUMMARY, &summary,
 		      HD_NM_COL_BODY, &body,
 		      -1);
-  g_debug ("Summary %s %s --------->",summary,body);
+
+  if (switcher->priv->last_iter_added == NULL)
+    hd_switcher_menu_notification_deleted_cb 
+      (HILDON_DESKTOP_NOTIFICATION_MANAGER (tree_model), id, switcher);	    
+  
   menu_item = 
     hd_switcher_menu_item_new_from_notification 
       (id, icon, summary, body, TRUE);
 
+  hd_switcher_menu_item_set_blinking (HD_SWITCHER_MENU_ITEM (menu_item), TRUE);
+
   hildon_desktop_popup_menu_add_item
     (switcher->priv->menu_notifications, GTK_MENU_ITEM (menu_item));
+
+  hd_switcher_menu_replace_blinking_icon (switcher, icon);
+    	    
+  switcher->priv->last_iter_added = NULL;
 }
 
 static void 
@@ -724,6 +874,6 @@
                                           GtkTreeIter    *iter,
                                           HDSwitcherMenu *switcher)
 {
-
+   switcher->priv->last_iter_added = iter;	
 }
 


More information about the maemo-commits mailing list