bigboard r7249 - in trunk: . bigboard/stocks/files bigboard/stocks/workspaces



Author: otaylor
Date: Mon Feb  4 18:27:02 2008
New Revision: 7249
URL: http://svn.gnome.org/viewvc/bigboard?rev=7249&view=rev

Log:
main.py: When loading images from files, keep a mtime cache so we can
 detect changes (to thumnails)
FileStock.py: On a recent-files change, don't recreate everything
 (creating flashing), just redo local files that changed and add new
 ones.


Modified:
   trunk/bigboard/stocks/files/FilesStock.py
   trunk/bigboard/stocks/workspaces/WorkspacesStock.py
   trunk/main.py

Modified: trunk/bigboard/stocks/files/FilesStock.py
==============================================================================
--- trunk/bigboard/stocks/files/FilesStock.py	(original)
+++ trunk/bigboard/stocks/files/FilesStock.py	Mon Feb  4 18:27:02 2008
@@ -77,6 +77,7 @@
         return self._source_key
 
     def create_icon_link(self, themed=False):
+        _logger.debug("Creating icon link for %s" % (self.get_image_name(),))
         link = IconLink(self.get_name(), themed=themed)
         link.img.set_property('image-name', self.get_image_name())
         link.link.connect("activated", lambda *args: self.emit('activated', link))
@@ -84,26 +85,48 @@
         return link   
 
 class LocalFile(File):
-    def __init__(self, bookmark_child):
+    def __init__(self, url, bookmark_child):
         super(LocalFile, self).__init__()
-        attrs = xml_get_attrs(bookmark_child, ['href', 'modified', 'visited'])
-        self._url = attrs['href'].encode('utf-8')     
+
+        self._url = url
+        self._source_key = 'files'
+        self._name = urllib.unquote(os.path.basename(url))
+        self._full_name = url
+        self._is_valid = True
+
+        self._access_time = -1
+        self.update(bookmark_child)
+        
+    def update(self, bookmark_child):
+        attrs = xml_get_attrs(bookmark_child, [ 'modified', 'visited'])
+
+        changed = False
+        
         # google.parse_timestamp() just parses an RFC 3339 format timestamp,
         # which 'modified' and 'visited' timestamps here use as well.
         # We'll need to move that function to some more generic file. 
         modified = google.parse_timestamp(attrs['modified'])
         visited = google.parse_timestamp(attrs['visited'])
-        self._access_time = max(modified, visited)
-        self._name = urllib.unquote(os.path.basename(self._url))
-        self._full_name = self._url
-        self._source_key = 'files'
-        self._is_valid = True
-        uri = gnomevfs.URI(self._url)
-        if uri.is_local:        
-            self.__update_async(self.__on_async_update)
-        else:
-            self._is_valid = True
-            self._image_name = gtk.STOCK_FILE
+
+        access_time = max(modified, visited)
+        if (self._access_time != access_time):
+            self._access_time = access_time
+
+            # We redo sniffing and thumbnailing each time the access time
+            # changes (and also initially). Really we should only do it
+            # when modified changed.
+            
+            uri = gnomevfs.URI(self._url)
+            if uri.is_local:        
+                self.__update_async(self.__on_async_update)
+            else:
+                self._is_valid = True
+                self._image_name = gtk.STOCK_FILE
+
+            changed = True
+            
+        if changed:
+            self.emit("changed")
         
     def __on_async_update(self, results):
         _logger.debug("got async results: %s", results)
@@ -466,14 +489,27 @@
         f = open(self.__recentf_path, 'r')
         doc = xml.dom.minidom.parse(f)
 
-        self.__remove_files_for_key('files') 
+        old_files = {}
+        for f in self.__files:
+            if f.get_source_key() == 'files':
+                old_files[f.get_url()] = f
+        
         # we sort the list of files after we add them, so reversing doesn't
         # really matter anymore
-        for child in reversed(xml_query(doc.documentElement, 'bookmark*')):         
-            local_file = LocalFile(child)
-            local_file.connect("changed", self.__on_local_file_changed)
-            local_file.connect('activated', self.__on_file_activated)            
-            self.__files.append(local_file)
+        for child in reversed(xml_query(doc.documentElement, 'bookmark*')):
+            attrs = xml_get_attrs(child, ['href'])
+            url = attrs['href'].encode('utf-8')
+            if url in old_files:
+                old_file = old_files[url]
+                del old_files[url]
+                old_file.update(child)
+            else:
+                local_file = LocalFile(url, child)
+                local_file.connect("changed", self.__on_local_file_changed)
+                local_file.connect('activated', self.__on_file_activated)            
+                self.__files.append(local_file)
+
+        self.__files = filter(lambda f: f.get_url() not in old_files, self.__files)
         self.__files.sort(compare_by_date)
         self.__refresh_files()
         

Modified: trunk/bigboard/stocks/workspaces/WorkspacesStock.py
==============================================================================
--- trunk/bigboard/stocks/workspaces/WorkspacesStock.py	(original)
+++ trunk/bigboard/stocks/workspaces/WorkspacesStock.py	Mon Feb  4 18:27:02 2008
@@ -188,6 +188,16 @@
         screen.connect('active-window-changed', self.__on_active_window_changed)
         screen.connect('window-stacking-changed', self.__on_window_stacking_changed)
         screen.connect('showing-desktop-changed', self.__on_showing_desktop_changed)
+        
+        self.connect('button-press-event', self.__on_button_press_event)
+        
+        self.right_click_menu = gtk.Menu()
+        right_click_menuitem = gtk.MenuItem(label="_Settings", use_underline=True)
+        right_click_menuitem.connect('activate', self.__on_show_settings)
+        self.right_click_menu.append(right_click_menuitem)
+        right_click_menuitem.show()
+                
+        self.dialog = None
        
     def redraw(self):
         self.emit_paint_needed(0, 0, -1, -1)
@@ -283,6 +293,21 @@
         box.connect('button-press-event', switch_viewspace, viewspace)
         return box
         
+    def __on_button_press_event(self, _, event):
+        # Right click?
+        if event.button == 3:
+            # Somehow event.time seems to be broken
+            self.right_click_menu.popup(None, None, None, event.button, gtk.get_current_event_time())
+            return True
+        return False
+    
+    def __on_show_settings(self, _):
+        if (self.dialog):
+            self.dialog.present()
+        else:
+            self.dialog = WorkspacesConfigurationDialog()
+            self.dialog.show()
+        
 
 class WorkspacesStock(Stock):
     """Shows all workspaces."""
@@ -295,3 +320,56 @@
 
     def get_content(self, size):
         return self._box
+        
+class WorkspacesConfigurationDialog(gtk.Window):
+    def __init__(self):
+        gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
+        self.set_title('Workspace configuration')
+        
+        self.screen = wnck.screen_get_default()
+        self.screen.force_update()
+        
+        vbox = gtk.VBox()
+        
+        settinghbox = gtk.HBox()
+        settinglabel = gtk.Label("Number of workspaces:")
+        settinghbox.pack_start(settinglabel)
+        self.adjustment = gtk.Adjustment(self.screen.get_workspace_count(), 1, 100, 1, 2, 0)
+        self.adjustment.connect('value-changed', self.__on_value_changed)
+        self.old_value = self.screen.get_workspace_count()
+        self.spinbutton = gtk.SpinButton(self.adjustment, 1, 0)
+        settinghbox.pack_end(self.spinbutton)
+        vbox.pack_start(settinghbox)
+        
+        buttonhbox = gtk.HButtonBox()
+        okbutton = gtk.Button(stock=gtk.STOCK_OK)
+        okbutton.connect('pressed', self.__on_ok_pressed)
+        buttonhbox.pack_end(okbutton)
+        cancelbutton = gtk.Button(stock=gtk.STOCK_CANCEL)
+        cancelbutton.connect('pressed', self.__on_cancel_pressed)
+        buttonhbox.pack_end(cancelbutton)
+        
+        vbox.pack_end(buttonhbox)
+        vbox.pack_end(gtk.HSeparator())
+        
+        self.add(vbox)
+        vbox.show_all()
+        
+        self.connect('delete-event', self.__on_delete_event)
+        
+    def __on_value_changed(self, adjustment):
+        self.screen.change_workspace_count(int(self.adjustment.get_value()))
+        
+    def __on_cancel_pressed(self, button):
+        self.adjustment.set_value(self.old_value)
+        self.hide()
+        
+    def __on_ok_pressed(self, button):
+        self.uninit()
+    
+    def __on_delete_event(self, widget, event):
+        self.uninit()
+        
+    def uninit(self):
+        self.old_value = self.screen.get_workspace_count()
+        self.hide()

Modified: trunk/main.py
==============================================================================
--- trunk/main.py	(original)
+++ trunk/main.py	Mon Feb  4 18:27:02 2008
@@ -815,22 +815,46 @@
         pass
 
 # TODO: figure out an algorithm for removing pixbufs from the cache
-_pixbufcache = {}
+_surfacecache = {}
+_mtimecache = {}
+def _get_mtime(filename):
+    try:
+        return os.stat(filename).st_mtime
+    except OSError:
+        return -1
+
 def load_image_hook(img_name):
     try:
-        pixbuf = _pixbufcache[img_name]
+        surface = _surfacecache[img_name]
+    except KeyError, e:
+        surface = None
+
+    try:
+        mtime = _mtimecache[img_name]
+        new_mtime = _get_mtime(img_name)
+        if mtime != new_mtime:
+            surface = None
     except KeyError, e:
-        pixbuf = None
-    if not pixbuf:
-        if img_name.find(os.sep) >= 0:
-            pixbuf = gtk.gdk.pixbuf_new_from_file(img_name)
-            _logger.debug("loaded from file '%s': %s" % (img_name,pixbuf))               
-        else:
-            theme = gtk.icon_theme_get_default()
-            pixbuf = theme.load_icon(img_name, 60, gtk.ICON_LOOKUP_USE_BUILTIN)
-            _logger.debug("loaded from icon theme '%s': %s" % (img_name,pixbuf))
-    _pixbufcache[img_name] = pixbuf        
-    return hippo.cairo_surface_from_gdk_pixbuf(pixbuf)    
+        pass
+    
+    if not surface:
+        try:
+            if img_name.find(os.sep) >= 0:
+                pixbuf = gtk.gdk.pixbuf_new_from_file(img_name)
+                _logger.debug("loaded from file '%s': %s" % (img_name,pixbuf))               
+                if pixbuf:
+                    _mtimecache[img_name] = _get_mtime(img_name)
+            else:
+                theme = gtk.icon_theme_get_default()
+                pixbuf = theme.load_icon(img_name, 60, gtk.ICON_LOOKUP_USE_BUILTIN)
+                _logger.debug("loaded from icon theme '%s': %s" % (img_name,pixbuf))
+        except gobject.GError:
+            return None
+            
+        surface = hippo.cairo_surface_from_gdk_pixbuf(pixbuf)
+        _surfacecache[img_name] = surface
+        
+    return surface
 
 def on_name_lost(*args):
     name = str(args[0])



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