Index: src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/X11NotificationAreaBox.cs
===================================================================
--- src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/X11NotificationAreaBox.cs	(revision 5192)
+++ src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/X11NotificationAreaBox.cs	(working copy)
@@ -51,6 +51,7 @@
         private TrackInfoPopup popup;
         private bool can_show_popup = false;
         private bool cursor_over_trayicon = false;
+        private bool hide_delay_started = false;
         private int panel_size;
         
         public event EventHandler Disconnected;
@@ -312,8 +313,17 @@
         
         private void OnLeaveNotifyEvent (object o, LeaveNotifyEventArgs args) 
         {
-            cursor_over_trayicon = false;
-            HidePopup ();
+            // hide 10 seconds after moving away from tray icon to allow
+            // user to seek/update ratings
+            if (!hide_delay_started) {
+                hide_delay_started = true;
+                GLib.Timeout.Add (10000, delegate {
+                    hide_delay_started = false;
+                    cursor_over_trayicon = false;
+                    HidePopup ();
+                    return false;
+                });
+            }
         }
         
         public void OnPlayerEvent (PlayerEventArgs args)
Index: src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/TrackInfoPopup.cs
===================================================================
--- src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/TrackInfoPopup.cs	(revision 5192)
+++ src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/TrackInfoPopup.cs	(working copy)
@@ -27,13 +27,18 @@
 //
 using System;
 using Gtk;
+using Mono.Unix;
 
+using Banshee.Collection;
+using Banshee.Collection.Database;
 using Banshee.Base;
 using Banshee.Gui.Widgets;
 using Banshee.Widgets;
+using Banshee.MediaEngine;
 using Banshee.ServiceStack;
 using Banshee.Gui;
 using Hyena;
+using Hyena.Widgets;
 
 namespace Banshee.NotificationArea
 {
@@ -41,6 +46,7 @@
     {
         private TrackInfoDisplay header;
         private ConnectedSeekSlider seek_slider;
+        private RatingEntry rating;
     
         public TrackInfoPopup () : base (Gtk.WindowType.Popup)
         {
@@ -60,19 +66,78 @@
             seek_slider.LeftPadding = 0;
             seek_slider.RightPadding = 0;
 
+            HBox rating_box = new HBox ();
+            rating_box.Spacing = 5;
+			
+            Label label = new Label ();
+            label.Markup = String.Format ("<i>{0}</i>", 
+                GLib.Markup.EscapeText (Catalog.GetString ("Rating:")));
+            label.Show ();
+
+            rating = new RatingEntry ();
+
+            TrackInfo track = ServiceManager.PlayerEngine.CurrentTrack;
+            if (track != null) {
+                if (track is DatabaseTrackInfo) {
+                    (track as DatabaseTrackInfo).Refresh ();
+                }
+                rating.Value = track.Rating;
+            }
+
+            rating.HasFrame = false;
+            rating.PreviewOnHover = true;
+            rating.AlwaysShowEmptyStars = true;
+            rating.Changed += OnEntryChanged;
+			
+            rating_box.PackStart (label, false, false, 0);			
+            rating_box.PackStart (rating, false, false, 0);
+        	
             box.PackStart (header, true, true, 0);
+            box.PackStart (rating_box, false, false, 0);
             box.PackStart (seek_slider, false, false, 0);
             
+            ServiceManager.PlayerEngine.ConnectEvent (OnPlayerEvent, PlayerEvent.TrackInfoUpdated);
+			
             Add (box);
             box.ShowAll ();
         }
         
         public override void Dispose ()
         {
+            ServiceManager.PlayerEngine.DisconnectEvent (OnPlayerEvent);
             header.Dispose ();
             base.Dispose ();
         }
-        
+
+        private void OnPlayerEvent (PlayerEventArgs args)
+        {
+            if (args.Event == PlayerEvent.TrackInfoUpdated) {
+                TrackInfo track = ServiceManager.PlayerEngine.CurrentTrack;
+                if (track != null) {
+                    if (track is DatabaseTrackInfo) {
+                        (track as DatabaseTrackInfo).Refresh ();
+                    }
+                rating.Value = track.Rating;
+                }
+            }
+        }
+ 
+        private void OnEntryChanged (object o, EventArgs args)
+        {
+            TrackInfo track = ServiceManager.PlayerEngine.CurrentTrack;
+            if (track != null) {
+                DatabaseTrackInfo db_track = track as DatabaseTrackInfo;
+                if (db_track != null) {
+                    db_track.SavedRating = rating.Value;
+                } else {
+                    track.Rating = rating.Value;
+                    track.Save ();
+                }
+
+                ServiceManager.PlayerEngine.TrackInfoUpdated ();
+            }
+        }
+       
         protected override bool OnExposeEvent (Gdk.EventExpose evnt)
         {
             Gtk.Style.PaintFlatBox (Style, GdkWindow, StateType.Normal, ShadowType.Out, evnt.Area, this, "tooltip", 
Index: src/Core/Banshee.ThickClient/Banshee.Collection.Gui/DefaultColumnController.cs
===================================================================
--- src/Core/Banshee.ThickClient/Banshee.Collection.Gui/DefaultColumnController.cs	(revision 5192)
+++ src/Core/Banshee.ThickClient/Banshee.Collection.Gui/DefaultColumnController.cs	(working copy)
@@ -133,7 +133,9 @@
             br_cell.TextFormat  = Catalog.GetString ("{0} kbps");
             bitrate_column      = Create (BansheeQuery.BitRateField, 0.10, false, br_cell);
             
-            rating_column       = Create (BansheeQuery.RatingField, 0.15, false, new ColumnCellRating (null, true));
+            ColumnCellRating rating_cell    = new ColumnCellRating (null, true);
+            rating_cell.Changed             += OnRatingChanged;
+            rating_column       = Create (BansheeQuery.RatingField, 0.15, false, rating_cell);
             score_column        = Create (BansheeQuery.ScoreField, 0.15, false, new ColumnCellPositiveInt (null, true, 2, 5));
             composer_column     = CreateText (BansheeQuery.ComposerField, 0.25);
             conductor_column    = CreateText (BansheeQuery.ConductorField, 0.25);
@@ -155,6 +157,11 @@
             date_added_column   = Create (BansheeQuery.DateAddedField, 0.15, false, new ColumnCellDateTime (null, true));
         }
 
+        private void OnRatingChanged (object o, EventArgs args)
+        {
+            ServiceManager.PlayerEngine.TrackInfoUpdated ();
+        }
+
         private SortableColumn CreateText (QueryField field, double width)
         {
             return CreateText (field, width, false);
Index: src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellRating.cs
===================================================================
--- src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellRating.cs	(revision 5192)
+++ src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellRating.cs	(working copy)
@@ -41,6 +41,7 @@
         private int hover_value;
         private Gdk.Rectangle actual_area_hack;
         private RatingRenderer renderer = new RatingRenderer ();
+        public event EventHandler Changed;
         
         public ColumnCellRating (string property, bool expand) : base (property, expand)
         {
@@ -74,6 +75,10 @@
             
             if (last_pressed_bound == BoundObjectParent) {
                 Value = RatingFromPosition (x);
+                EventHandler handler = Changed;
+                if (handler != null) {
+                    handler (this, new EventArgs ());
+                }
                 last_pressed_bound = null;
             }
             
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 5192)
+++ ChangeLog	(working copy)
@@ -1,3 +1,15 @@
+2009-04-08  Neil Loknath  <neil.loknath@gmail.com>
+
+    * src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/X11NotificationAreaBox.cs:
+    Delay hiding of tooltip by 10 seconds after mouse pointer moves away from tray icon.
+
+    * src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea/TrackInfoPopup.cs:
+    Add RatingEntry widget, handle rating changes from other locations, and save ratings.
+
+    * src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellRating.cs:
+    * src/Core/Banshee.ThickClient/Banshee.Collection.Gui/DefaultColumnController.cs:
+    To keep tooltip ratings consistent, added OnRatingChanged event to call TrackInfoUpdated. 
+
 2009-04-06  Gabriel Burt  <gabriel.burt@gmail.com>
 
 	* configure.ac:
