deskbar-applet r2061 - in trunk: . deskbar deskbar/ui



Author: sebp
Date: Thu Apr  3 13:17:36 2008
New Revision: 2061
URL: http://svn.gnome.org/viewvc/deskbar-applet?rev=2061&view=rev

Log:
Added the possibility to run Deskbar as a tray icon instead of an applet with the -t option from the commandline. It only works with Window UI.

Added:
   trunk/deskbar/ui/AbstractCuemiacDeskbarIcon.py
   trunk/deskbar/ui/DeskbarStatusIcon.py
Modified:
   trunk/ChangeLog
   trunk/deskbar/deskbar-applet.py
   trunk/deskbar/ui/DeskbarTray.py
   trunk/deskbar/ui/Makefile.am

Modified: trunk/deskbar/deskbar-applet.py
==============================================================================
--- trunk/deskbar/deskbar-applet.py	(original)
+++ trunk/deskbar/deskbar-applet.py	Thu Apr  3 13:17:36 2008
@@ -4,7 +4,8 @@
 import sys
 from os.path import abspath, join, dirname, exists
 import logging
-import gettext, locale
+import gettext
+import locale
 from gettext import gettext as _
 import gnomeapplet
 from optparse import OptionParser
@@ -50,7 +51,6 @@
 import deskbar
 import deskbar.defs
 import deskbar.gtkexcepthook
-from deskbar.ui.DeskbarTray import DeskbarTray
 
 # Setup i18n
 gettext.bindtextdomain('deskbar-applet', abspath(join(deskbar.defs.DATA_DIR, "locale")))
@@ -77,6 +77,7 @@
 usage = "deskbar-applet [OPTIONS]"
 parser = OptionParser(usage=usage)
 parser.add_option("-w", "--window", dest="window", action="store_true", help="Launch the applet in a standalone window for test purposes (default=no)")
+parser.add_option("-t", "--tray", dest="tray", action="store_true", help="Run Deskbar as a tray icon instead of an applet")
 parser.add_option("-v", "--version", dest="version", action="store_true", help="Print version")
 parser.add_option("--oaf-activate-iid")
 parser.add_option("--oaf-ior-fd")
@@ -86,14 +87,25 @@
     print deskbar.defs.VERSION
     sys.exit()
 
-if options.window:
+if options.tray:
+    from deskbar.ui.DeskbarStatusIcon import DeskbarStatusIcon
+    
+    deskbar_status_icon = DeskbarStatusIcon ()
+    gtk.gdk.threads_enter()
+    gtk.main()
+    gtk.gdk.threads_leave()
+elif options.window:
     import gnome
+    from deskbar.ui.DeskbarTray import DeskbarTray
+    
     gnome.init(deskbar.defs.PACKAGE, deskbar.defs.VERSION)
     build_window()
     gtk.gdk.threads_enter()
     gtk.main()
     gtk.gdk.threads_leave()
 else:
+    from deskbar.ui.DeskbarTray import DeskbarTray
+
     gnomeapplet.bonobo_factory(
             "OAFIID:Deskbar_Applet_Factory",
             gnomeapplet.Applet.__gtype__,

Added: trunk/deskbar/ui/AbstractCuemiacDeskbarIcon.py
==============================================================================
--- (empty file)
+++ trunk/deskbar/ui/AbstractCuemiacDeskbarIcon.py	Thu Apr  3 13:17:36 2008
@@ -0,0 +1,80 @@
+from deskbar.core.CoreImpl import CoreImpl
+from deskbar.core.GconfStore import GconfStore
+from deskbar.ui.CuemiacAlignedView import CuemiacAlignedView
+from deskbar.ui.CuemiacWindowController import CuemiacWindowController
+from deskbar.ui.CuemiacWindowView import CuemiacWindowView
+import deskbar
+import gtk
+import gobject
+
+class AbstractCuemiacDeskbarIcon (object):
+    
+    def __init__(self):
+        self.active = False
+          
+    def get_active(self):
+        return self.active
+    
+    def set_active(self, active, time):
+        changed = (self.active != active)
+        self.active = active
+        
+        if changed:
+            self._show_toggle(self, time)
+      
+    def create_button_ui(self):
+        self._view = CuemiacAlignedView(self._controller, self._core, self.image, self.applet)
+        self._active_view = deskbar.BUTTON_UI_NAME
+        
+    def create_window_ui(self):
+        self._view = CuemiacWindowView(self._controller, self._core)
+        self._active_view = deskbar.WINDOW_UI_NAME
+            
+    def _setup_mvc(self):
+        self._core = CoreImpl(deskbar.MODULES_DIRS)
+        self._core.connect("loaded", self.on_loaded)
+        
+        self._controller = CuemiacWindowController(self._core)
+
+        # Select the view based on user choice. CuemiacWindowView is
+        # the new style UI,
+        # CuemiacAlignedView is the older UI as seen in the
+        # Deskbar gnome-2-18 branch.
+        if self._core.get_ui_name() == deskbar.WINDOW_UI_NAME:
+            self.create_window_ui()
+        else:
+            # We need to use an AlignedWindow, which needs a Widget (self.image
+            # in this case) and the applet (self.applet)
+            self.create_button_ui()
+
+        self._view.set_sensitive(False)
+        
+        GconfStore.get_instance().connect("ui-name-changed", self._on_ui_name_changed)
+        
+        self._core.run()
+    
+    def _show_toggle(self, widget, time):
+        self._controller.on_keybinding_activated(widget, time, False)
+        
+    def _on_ui_name_changed(self, gconfstore, name):
+        if name != self._active_view:
+            self._view.destroy()
+            if name == deskbar.WINDOW_UI_NAME:
+                self.create_window_ui()
+            else:
+                self.create_button_ui()
+            self._active_view = name
+       
+    def on_loaded(self, sender):
+        """
+        Called when all modules have been loaded and
+        initialized. You should mark you UI
+        sensitive here
+        """
+        self._view.set_sensitive(True)
+      
+    def setup_menu(self):
+        """
+        Setup popup menu
+        """
+        raise NotImplementedError

Added: trunk/deskbar/ui/DeskbarStatusIcon.py
==============================================================================
--- (empty file)
+++ trunk/deskbar/ui/DeskbarStatusIcon.py	Thu Apr  3 13:17:36 2008
@@ -0,0 +1,113 @@
+import deskbar
+import gtk
+from deskbar.ui.AbstractCuemiacDeskbarIcon import AbstractCuemiacDeskbarIcon
+from gettext import gettext as _
+from os.path import join
+
+class DeskbarPopupMenu (gtk.Menu):
+    
+    class Item (gtk.ImageMenuItem):
+        
+        def __init__(self, label, stock_id):
+            gtk.ImageMenuItem.__init__ (self)
+            
+            self.box = gtk.HBox (False, 3)
+            self.box.show()
+            self.add(self.box)
+            
+            self.image = gtk.Image ()
+            self.image.set_from_stock (stock_id, gtk.ICON_SIZE_MENU)
+            self.image.show()
+            self.box.pack_start (self.image, False, False, 0)
+            
+            self.label = gtk.Label (label)
+            self.label.show()
+            
+            self.alignment = gtk.Alignment ()
+            self.alignment.add (self.label)
+            self.alignment.show()
+            self.box.pack_start (self.alignment)
+    
+    def __init__(self, controller):
+        gtk.Menu.__init__ (self)
+        
+        menuItem = DeskbarPopupMenu.Item (_("Clear History"), gtk.STOCK_DELETE)
+        menuItem.connect ("activate", controller.on_clear_history)
+        self.append(menuItem)
+        
+        menuItem = DeskbarPopupMenu.Item (_("Preferences"), gtk.STOCK_PROPERTIES)
+        menuItem.connect ("activate", controller.on_show_preferences)
+        self.append(menuItem)
+        
+        menuItem = DeskbarPopupMenu.Item (_("Help"), gtk.STOCK_HELP)
+        menuItem.connect ("activate", controller.on_show_help)
+        self.append(menuItem)
+        
+        menuItem = DeskbarPopupMenu.Item (_("About"), gtk.STOCK_ABOUT)
+        menuItem.connect ("activate", controller.on_show_about)
+        self.append(menuItem)
+        
+        self.append(gtk.MenuItem())
+        
+        menuItem = DeskbarPopupMenu.Item (_("Quit"), gtk.STOCK_QUIT)
+        menuItem.connect ("activate", lambda w: gtk.main_quit())
+        self.append(menuItem)
+
+class DeskbarStatusIcon (gtk.StatusIcon, AbstractCuemiacDeskbarIcon):
+    
+    def __init__(self):
+        gtk.StatusIcon.__init__(self)
+        AbstractCuemiacDeskbarIcon.__init__(self)
+        
+        self.set_visible (False)
+        self.set_tooltip (_("Show search entry"))
+        #self.connect ("notify::orientation", self._on_orientation_changed)
+        self.connect ("size-changed", self._on_size_changed)
+        self.connect ("activate", self._on_activate)
+        self.connect ("popup-menu", self._on_popup_menu)
+        
+        self._setup_mvc()
+        self.setup_menu()
+        
+        self._on_size_changed(self, self.get_size())
+        
+    def on_loaded(self, sender):
+        AbstractCuemiacDeskbarIcon.on_loaded (self, sender)
+        self.set_visible (True)
+    
+    def set_button_image_from_file (self, filename, size):
+        # We use an intermediate pixbuf to scale the image
+        if gtk.StatusIcon.get_property(self, "orientation") == gtk.ORIENTATION_HORIZONTAL:
+            pixbuf = gtk.gdk.pixbuf_new_from_file_at_size (filename, -1, size)
+        else:
+            pixbuf = gtk.gdk.pixbuf_new_from_file_at_size (filename, size, -1)
+        gtk.StatusIcon.set_from_pixbuf (self, pixbuf)
+        
+    def _on_size_changed (self, status_icon, size):
+        image_name = "deskbar-applet-panel"
+        if self.get_property("orientation") == gtk.ORIENTATION_HORIZONTAL:
+            image_name += "-h"
+        else:
+            image_name += "-v"
+        
+        if size <= 36:
+            image_name += ".png"
+            s = -1
+        else:
+            image_name += ".svg"
+            s = size-12
+        
+        self.set_button_image_from_file (join(deskbar.ART_DATA_DIR, image_name), s)
+        
+    def _on_activate (self, status_icon):
+        AbstractCuemiacDeskbarIcon.set_active (self, not self.active, gtk.get_current_event_time())
+        
+    def _on_popup_menu (self, status_icon, button, activate_time):
+        self._menu.show_all()
+        self._menu.popup(None, None, None, button, activate_time)
+        
+    def create_button_ui(self):
+        raise NotImplementedError
+    
+    def setup_menu(self):
+        self._menu = DeskbarPopupMenu (self._controller)
\ No newline at end of file

Modified: trunk/deskbar/ui/DeskbarTray.py
==============================================================================
--- trunk/deskbar/ui/DeskbarTray.py	(original)
+++ trunk/deskbar/ui/DeskbarTray.py	Thu Apr  3 13:17:36 2008
@@ -1,34 +1,23 @@
-import gtk
-import gnomeapplet
-import gobject
+from deskbar.ui.AbstractCuemiacDeskbarIcon import AbstractCuemiacDeskbarIcon
 from gettext import gettext as _
-import deskbar
 from os.path import join
-from deskbar.core.CoreImpl import CoreImpl
-from deskbar.ui.CuemiacWindowView import CuemiacWindowView
-from deskbar.ui.CuemiacAlignedView import CuemiacAlignedView
-from deskbar.ui.CuemiacWindowController import CuemiacWindowController
-from deskbar.core.GconfStore import GconfStore
+import deskbar
+import gnomeapplet
+import gobject
+import gtk
         
-class DeskbarTray (gtk.EventBox):
+class DeskbarTray (gtk.EventBox, AbstractCuemiacDeskbarIcon):
     """
-    Button consisting of a image.
-    
     It automatically arranges itself according to one of 
     gnomeapplet.ORIENT_UP,gnomeapplet.ORIENT_{UP,DOWN,LEFT,RIGHT}.
-    
-    Signals:
-        toggled-main: The main button has been toggle
     """
-    __gsignals__ = {
-        "toggled-main" : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, [gobject.TYPE_PYOBJECT]),
-    }
 
     def __init__ (self, applet):
         gtk.EventBox.__init__ (self)
-        self.active = False
-        self.set_visible_window(False)
-        self.set_sensitive(False)
+        AbstractCuemiacDeskbarIcon.__init__(self)
+        
+        gtk.EventBox.set_visible_window(self, False)
+        gtk.EventBox.set_sensitive(self, False)
         
         self.applet = applet
         self.applet.set_background_widget(applet)
@@ -37,90 +26,26 @@
         self.popup_dir = applet.get_orient()
         
         self.image = gtk.Image ()
-        self.add(self.image)
-        self.connect('button-press-event', self.on_button_press)
+        gtk.EventBox.add(self, self.image)
+        gtk.EventBox.connect(self, 'button-press-event', self.on_button_press)
         
         self.tooltips = gtk.Tooltips()
         self.tooltips.set_tip(self, _("Show search entry"))
         
-        self.__setup_applet_menu()
-        self.__setup_mvc()
+        self.setup_menu()
+        self._setup_mvc()
         
         self.on_change_size(self.applet, self.applet.get_size())
     
     def on_button_press(self, widget, event):
         if event.button == 1: # left mouse button
-            self.set_active(not self.active, event.time)
+            AbstractCuemiacDeskbarIcon.set_active (self, not self.active, event.time)
             return True
-                
-    def get_active(self):
-        return self.active
-    
-    def set_active(self, active, time):
-        changed = (self.active != active)
-        self.active = active
-        
-        if changed:
-            self.__show_toggle(self, time)
-            self.emit ("toggled-main", self)
-    
-    def __setup_mvc(self):
-        self.__core = CoreImpl(deskbar.MODULES_DIRS)
-        self.__core.connect("loaded", self.__on_loaded)
+       
+    def on_loaded(self, sender):
+        AbstractCuemiacDeskbarIcon.on_loaded (self, sender)
+        gtk.EventBox.set_sensitive(self, True)
         
-        self.__controller = CuemiacWindowController(self.__core)
-
-        # Select the view based on user choice. CuemiacWindowView is
-        # the new style UI,
-        # CuemiacAlignedView is the older UI as seen in the
-        # Deskbar gnome-2-18 branch.
-        if self.__core.get_ui_name() == deskbar.WINDOW_UI_NAME:
-            self.__create_window_ui()
-        else:
-            # We need to use an AlignedWindow, which needs a Widget (self.image
-            # in this case) and the applet (self.applet)
-            self.__create_button_ui()
-
-        self.__view.set_sensitive(False)
-        
-        GconfStore.get_instance().connect("ui-name-changed", self.__on_ui_name_changed)
-        
-        self.__core.run()
-        
-    def __create_button_ui(self):
-        self.__view = CuemiacAlignedView(self.__controller, self.__core, self.image, self.applet)
-        self._active_view = deskbar.BUTTON_UI_NAME
-        
-    def __create_window_ui(self):
-        self.__view = CuemiacWindowView(self.__controller, self.__core)
-        self._active_view = deskbar.WINDOW_UI_NAME
-        
-    def __setup_applet_menu(self):
-        self.applet.setup_menu_from_file (
-            deskbar.SHARED_DATA_DIR, "Deskbar_Applet.xml",
-            None, [
-            ("About", lambda a,b: self.__controller.on_show_about(a)),
-            ("Prefs", lambda a,b: self.__controller.on_show_preferences(a)),
-            ("Clear", lambda a,b: self.__controller.on_clear_history(a),),
-            ("Help", lambda a,b: self.__controller.on_show_help(a),)
-            ])
-        
-    def __on_loaded(self, sender):
-        self.set_sensitive(True)
-        self.__view.set_sensitive(True)
-          
-    def __show_toggle(self, widget, time):
-        self.__controller.on_keybinding_activated(widget, time, False)
-        
-    def __on_ui_name_changed(self, gconfstore, name):
-        if name != self._active_view:
-            self.__view.destroy()
-            if name == deskbar.WINDOW_UI_NAME:
-                self.__create_window_ui()
-            else:
-                self.__create_button_ui()
-            self._active_view = name
-    
     def set_button_image_from_file (self, filename, size):
         # We use an intermediate pixbuf to scale the image
         if self.popup_dir in [gnomeapplet.ORIENT_DOWN, gnomeapplet.ORIENT_UP]:
@@ -146,7 +71,17 @@
         
         self.set_button_image_from_file (join(deskbar.ART_DATA_DIR, image_name), s)
         
-        self.set_size_request( size, size )
-            
+        self.set_size_request (size, size)
+      
+    def setup_menu(self):
+        self.applet.setup_menu_from_file (
+            deskbar.SHARED_DATA_DIR, "Deskbar_Applet.xml",
+            None, [
+            ("About", lambda a,b: self._controller.on_show_about(a)),
+            ("Prefs", lambda a,b: self._controller.on_show_preferences(a)),
+            ("Clear", lambda a,b: self._controller.on_clear_history(a),),
+            ("Help", lambda a,b: self._controller.on_show_help(a),)
+            ])
+         
 if gtk.pygtk_version < (2,8,0):            
     gobject.type_register(DeskbarTray)
\ No newline at end of file

Modified: trunk/deskbar/ui/Makefile.am
==============================================================================
--- trunk/deskbar/ui/Makefile.am	(original)
+++ trunk/deskbar/ui/Makefile.am	Thu Apr  3 13:17:36 2008
@@ -4,7 +4,9 @@
 deskbar_ui_PYTHON = \
 	__init__.py \
 	About.py \
+	AbstractCuemiacDeskbarIcon.py \
 	CuemiacWindowController.py \
 	CuemiacWindowView.py \
 	CuemiacAlignedView.py \
+	DeskbarStatusIcon.py \
 	DeskbarTray.py



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