deskbar-applet r2361 - in trunk: . deskbar/core deskbar/ui



Author: sebp
Date: Thu Aug 28 10:21:19 2008
New Revision: 2361
URL: http://svn.gnome.org/viewvc/deskbar-applet?rev=2361&view=rev

Log:
2008-08-28  Sebastian PÃlsterl  <sebp cvs gnome org>

    * deskbar/core/DeskbarHistory.py:
    Added remove_index_and_save method
    
    * deskbar/ui/DeskbarStatusIcon.py:
    Create menu new each time the popup is requested.
    Pressing the delete key will remove the selected item
    from history


Modified:
   trunk/ChangeLog
   trunk/deskbar/core/DeskbarHistory.py
   trunk/deskbar/ui/DeskbarStatusIcon.py

Modified: trunk/deskbar/core/DeskbarHistory.py
==============================================================================
--- trunk/deskbar/core/DeskbarHistory.py	(original)
+++ trunk/deskbar/core/DeskbarHistory.py	Thu Aug 28 10:21:19 2008
@@ -209,6 +209,10 @@
     def remove_index(self, index):
         self.remove (self.get_iter_from_string (str(index)))
     
+    def remove_index_and_save(self, index):
+        self.remove_index(index)
+        self.save()
+    
     def remove_and_save(self, aiter):
         self.remove(aiter)
         self.save()

Modified: trunk/deskbar/ui/DeskbarStatusIcon.py
==============================================================================
--- trunk/deskbar/ui/DeskbarStatusIcon.py	(original)
+++ trunk/deskbar/ui/DeskbarStatusIcon.py	Thu Aug 28 10:21:19 2008
@@ -13,7 +13,7 @@
     
     class Item (gtk.ImageMenuItem):
         
-        def __init__(self, label, stock_id=None, pixbuf=None):
+        def __init__(self, label=None, stock_id=None, pixbuf=None):
             gtk.ImageMenuItem.__init__ (self)
             
             self.box = gtk.HBox (False, 3)
@@ -22,64 +22,42 @@
             
             self.image = gtk.Image ()
             if stock_id != None:
-                self.image.set_from_stock (stock_id, gtk.ICON_SIZE_MENU)
+                self.set_image_from_stock (stock_id)
             elif isinstance(pixbuf, gtk.gdk.Pixbuf):
-                self.image.set_from_pixbuf(pixbuf)
+                self.set_image_from_pixbuf(pixbuf)
             
             self.image.show()
             self.box.pack_start (self.image, False, False, 0)
             
             self.label = gtk.Label ()
-            self.label.set_markup(label)
+            self.set_markup(label)
             self.label.show()
             
             self.alignment = gtk.Alignment ()
             self.alignment.add (self.label)
             self.alignment.show()
             self.box.pack_start (self.alignment)
-    
-    class HistoryMenu (gtk.Menu):
-        
-        def __init__(self, controller):
-            gtk.Menu.__init__(self)
-            self.__controller = controller
-            self.__is_empty = True
             
-        def add_action(self, text, action):
-            if isinstance(action, EmptyHistoryAction):
-                # TRANSLATORS: Below "Empty" is an adjective. As in 
-                #              the state of being empty
-                menuItem = DeskbarPopupMenu.Item (_("<i>Empty</i>"),
-                                                  pixbuf=CATEGORIES["history"]["icon"])
-                self.__is_empty = True
-            else:
-                if self.__is_empty:
-                    self.clear()
-                
-                text = action.get_verb () % action.get_escaped_name(text)
-                # We only want to display the first line of text
-                # E.g. some beagle-live actions display a snippet in the second line 
-                text = text.split("\n")[0]
-                
-                menuItem = DeskbarPopupMenu.Item (text, pixbuf=action.get_pixbuf())
-                menuItem.connect ("activate", self.__controller.on_history_match_selected, text, action)
-                
-                self.__is_empty = False
-                
-            self.append(menuItem)
+        def set_image_from_stock(self, stock_id):
+            if stock_id != None:
+                self.image.set_from_stock (stock_id, gtk.ICON_SIZE_MENU)
             
-        def clear(self):
-            for w in self:
-                self.remove(w)
-    
-    def __init__(self, controller):
+        def set_image_from_pixbuf(self, pixbuf):
+            if pixbuf != None:
+                self.image.set_from_pixbuf(pixbuf)
+            
+        def set_markup(self, text):
+            if text != None:
+                self.label.set_markup(text)
+
+    def __init__(self, controller, history):
         gtk.Menu.__init__ (self)
         
         menuItem = DeskbarPopupMenu.Item (_("History"),
                                           pixbuf=CATEGORIES["history"]["icon"])
         self.append(menuItem)
         
-        self.historymenu = DeskbarPopupMenu.HistoryMenu(controller)
+        self.historymenu = HistoryMenu(controller, history)
         menuItem.set_submenu(self.historymenu)
         
         self.append(gtk.SeparatorMenuItem())
@@ -105,7 +83,73 @@
         menuItem = DeskbarPopupMenu.Item (_("Quit"), gtk.STOCK_QUIT)
         menuItem.connect ("activate", lambda w: gtk.main_quit())
         self.append(menuItem)
+        
 
+class HistoryMenu (gtk.Menu):
+    
+    def __init__(self, controller, history):
+        gtk.Menu.__init__(self)
+        self.__controller = controller
+        self.__history = history
+        self.__is_empty = True
+        self.__selected_item = None
+        
+        self.connect ("key-press-event", self.on_key_press_event)
+        
+        for row in history:
+            text = row[history.COL_TEXT]
+            action = row[history.COL_ACTION]
+            
+            menuItem = DeskbarPopupMenu.Item ()
+            menuItem.connect ("select", self.on_item_selected)
+            menuItem.connect ("activate",
+                              self.__controller.on_history_match_selected,
+                              text, action)
+                
+            if isinstance(action, EmptyHistoryAction):
+                # TRANSLATORS: Below "Empty" is an adjective. As in 
+                #              the state of being empty
+                menuItem.set_markup(_("<i>Empty</i>"))
+                menuItem.set_image_from_pixbuf (CATEGORIES["history"]["icon"])
+                
+                self.__is_empty = True
+            else:
+                text = action.get_verb () % action.get_escaped_name(text)
+                # We only want to display the first line of text
+                # E.g. some beagle-live actions display a snippet in the second line 
+                text = text.split("\n")[0]
+                
+                menuItem.set_markup(text)
+                menuItem.set_image_from_pixbuf(action.get_pixbuf())
+                
+                self.__is_empty = False
+                
+            self.append(menuItem)
+    
+    def clear(self):
+        for w in self:
+            self.remove(w)
+        self.__selected_item = None
+        if not self.__is_empty:
+            self.append_empty_action()
+    
+    def on_key_press_event(self, menu, event):
+        if event.keyval == gtk.keysyms.Delete:
+            if self.__selected_item != None:
+                # This is stupid put we need to get the
+                # position of the child somehow
+                for i, child in enumerate(self.get_children()):
+                    if child == self.__selected_item:
+                        break
+                self.__history.remove_index_and_save(i)
+                self.remove(self.__selected_item)
+                self.__selected_item = None
+                self.reposition()
+            
+    def on_item_selected(self, item):
+        self.__selected_item = item
+        
+            
 class DeskbarStatusIcon (gtk.StatusIcon, AbstractCuemiacDeskbarIcon):
     
     def __init__(self):
@@ -120,11 +164,6 @@
         self.connect ("popup-menu", self._on_popup_menu)
         
         self._setup_mvc()
-        self.setup_menu()
-        
-        history = self._core.get_history()
-        history.connect("action-added", lambda w, t, a: self._menu.historymenu.add_action(t, a))
-        history.connect("cleared", lambda w: self._menu.historymenu.clear())
         
         self._on_size_changed(self, self.get_size())
     
@@ -140,8 +179,11 @@
         AbstractCuemiacDeskbarIcon.set_active (self, not self.active, gtk.get_current_event_time())
         
     def _on_popup_menu (self, status_icon, button, activate_time):
+        self.setup_menu()    
         self._menu.show_all()
-        self._menu.popup(None, None, gtk.status_icon_position_menu, button, activate_time, self)
+        self._menu.popup(None, None,
+                         gtk.status_icon_position_menu,
+                         button, activate_time, self)
     
     def _on_ui_name_changed(self, gconfstore, name):
         if name != deskbar.WINDOW_UI_NAME:
@@ -159,5 +201,6 @@
         raise NotImplementedError
     
     def setup_menu(self):
-        self._menu = DeskbarPopupMenu (self._controller)
-        
+        self._menu = DeskbarPopupMenu (self._controller,
+                                       self._core.get_history())
+        
\ No newline at end of file



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]