[Goodies-commits] r3056 - ristretto/trunk/src

Stephan Arts stephan at xfce.org
Thu Aug 23 23:45:16 CEST 2007


Author: stephan
Date: 2007-08-23 21:45:16 +0000 (Thu, 23 Aug 2007)
New Revision: 3056

Modified:
   ristretto/trunk/src/navigator.c
   ristretto/trunk/src/navigator.h
   ristretto/trunk/src/thumbnail_viewer.c
Log:
Improve the thumbnail viewer performance



Modified: ristretto/trunk/src/navigator.c
===================================================================
--- ristretto/trunk/src/navigator.c	2007-08-23 18:15:33 UTC (rev 3055)
+++ ristretto/trunk/src/navigator.c	2007-08-23 21:45:16 UTC (rev 3056)
@@ -38,6 +38,9 @@
 static gint
 rstto_navigator_entry_name_compare_func(RsttoNavigatorEntry *a, RsttoNavigatorEntry *b);
 
+static void
+rstto_navigator_entry_free_pixbuf (RsttoNavigatorEntry *entry);
+
 enum
 {
     RSTTO_NAVIGATOR_SIGNAL_ENTRY_MODIFIED = 0,
@@ -184,11 +187,8 @@
 {
     if(navigator->file_iter)
     {
-        if(((RsttoNavigatorEntry *)navigator->file_iter->data)->pixbuf)
-        {
-            g_object_unref(((RsttoNavigatorEntry *)navigator->file_iter->data)->pixbuf);
-            ((RsttoNavigatorEntry *)navigator->file_iter->data)->pixbuf = NULL;
-        }
+        navigator->old_position = rstto_navigator_get_position(navigator);
+        rstto_navigator_entry_free_pixbuf(navigator->file_iter->data);
     }
     navigator->file_iter = g_list_first(navigator->file_list);
     if(navigator->file_iter)
@@ -202,11 +202,8 @@
 {
     if(navigator->file_iter)
     {
-        if(((RsttoNavigatorEntry *)navigator->file_iter->data)->pixbuf)
-        {
-            g_object_unref(((RsttoNavigatorEntry *)navigator->file_iter->data)->pixbuf);
-            ((RsttoNavigatorEntry *)navigator->file_iter->data)->pixbuf = NULL;
-        }
+        navigator->old_position = rstto_navigator_get_position(navigator);
+        rstto_navigator_entry_free_pixbuf(navigator->file_iter->data);
         navigator->file_iter = g_list_next(navigator->file_iter);
     }
     if(!navigator->file_iter)
@@ -228,11 +225,8 @@
 {
     if(navigator->file_iter)
     {
-        if(((RsttoNavigatorEntry *)navigator->file_iter->data)->pixbuf)
-        {
-            g_object_unref(((RsttoNavigatorEntry *)navigator->file_iter->data)->pixbuf);
-            ((RsttoNavigatorEntry *)navigator->file_iter->data)->pixbuf = NULL;
-        }
+        navigator->old_position = rstto_navigator_get_position(navigator);
+        rstto_navigator_entry_free_pixbuf(navigator->file_iter->data);
         navigator->file_iter = g_list_previous(navigator->file_iter);
     }
     if(!navigator->file_iter)
@@ -254,11 +248,8 @@
 {
     if(navigator->file_iter)
     {
-        if(((RsttoNavigatorEntry *)navigator->file_iter->data)->pixbuf)
-        {
-            g_object_unref(((RsttoNavigatorEntry *)navigator->file_iter->data)->pixbuf);
-            ((RsttoNavigatorEntry *)navigator->file_iter->data)->pixbuf = NULL;
-        }
+        navigator->old_position = rstto_navigator_get_position(navigator);
+        rstto_navigator_entry_free_pixbuf(navigator->file_iter->data);
     }
     navigator->file_iter = g_list_last(navigator->file_list);
 
@@ -324,11 +315,7 @@
 {
     if(navigator->file_iter)
     {
-        if(((RsttoNavigatorEntry *)navigator->file_iter->data)->pixbuf)
-        {
-            g_object_unref(((RsttoNavigatorEntry *)navigator->file_iter->data)->pixbuf);
-            ((RsttoNavigatorEntry *)navigator->file_iter->data)->pixbuf = NULL;
-        }
+        rstto_navigator_entry_free_pixbuf(navigator->file_iter->data);
     }
 
     navigator->file_list = g_list_insert_sorted(navigator->file_list, entry, navigator->compare_func);
@@ -361,11 +348,8 @@
 {
     if(navigator->file_iter)
     {
-        if(((RsttoNavigatorEntry *)navigator->file_iter->data)->pixbuf)
-        {
-            g_object_unref(((RsttoNavigatorEntry *)navigator->file_iter->data)->pixbuf);
-            ((RsttoNavigatorEntry *)navigator->file_iter->data)->pixbuf = NULL;
-        }
+        navigator->old_position = rstto_navigator_get_position(navigator);
+        rstto_navigator_entry_free_pixbuf(navigator->file_iter->data);
     }
     navigator->file_iter = g_list_nth(navigator->file_list, n);
     if(navigator->file_iter)
@@ -490,3 +474,19 @@
     }
     return entry->pixbuf;
 }
+
+static void
+rstto_navigator_entry_free_pixbuf (RsttoNavigatorEntry *entry)
+{
+    if(entry->pixbuf)
+    {
+        g_object_unref(entry->pixbuf);
+        entry->pixbuf = NULL;
+    }
+}
+
+gint
+rstto_navigator_get_old_position (RsttoNavigator *navigator)
+{
+    return navigator->old_position;
+}

Modified: ristretto/trunk/src/navigator.h
===================================================================
--- ristretto/trunk/src/navigator.h	2007-08-23 18:15:33 UTC (rev 3055)
+++ ristretto/trunk/src/navigator.h	2007-08-23 21:45:16 UTC (rev 3056)
@@ -50,6 +50,7 @@
     ThunarVfsPath      *path;
     GList              *file_list;
     GList              *file_iter;
+    gint                old_position;
     gboolean            running;
     gint                id;
     GCompareFunc        compare_func;
@@ -78,6 +79,8 @@
 rstto_navigator_get_file (RsttoNavigator *navigator);
 gint
 rstto_navigator_get_position(RsttoNavigator *navigator);
+gint
+rstto_navigator_get_old_position(RsttoNavigator *navigator);
 
 void
 rstto_navigator_add (RsttoNavigator *navigator, RsttoNavigatorEntry *entry);

Modified: ristretto/trunk/src/thumbnail_viewer.c
===================================================================
--- ristretto/trunk/src/thumbnail_viewer.c	2007-08-23 18:15:33 UTC (rev 3055)
+++ ristretto/trunk/src/thumbnail_viewer.c	2007-08-23 21:45:16 UTC (rev 3056)
@@ -35,6 +35,7 @@
     gint dimension;
     gint offset;
     gboolean auto_center;
+    gint selection;
     gint begin;
     gint end;
 };
@@ -57,12 +58,12 @@
 
 static void
 rstto_thumbnail_viewer_paint(RsttoThumbnailViewer *viewer);
+static gboolean
+rstto_thumbnail_viewer_paint_entry (RsttoThumbnailViewer *viewer, gint nr, gboolean selected);
 
 static GtkWidgetClass *parent_class = NULL;
 
 static void
-cb_rstto_thumbnailer_nav_file_changed(RsttoNavigator *nav, RsttoThumbnailViewer *viewer);
-static void
 cb_rstto_thumbnailer_nav_new_entry (RsttoNavigator *nav,
                                     gint nr,
                                     RsttoNavigatorEntry *entry,
@@ -167,9 +168,13 @@
     {
         case GTK_ORIENTATION_HORIZONTAL:
             viewer->priv->dimension = widget->allocation.height;
+            viewer->priv->begin = viewer->priv->offset / viewer->priv->dimension;
+            viewer->priv->end = widget->allocation.width / viewer->priv->dimension + viewer->priv->begin;
             break;
         case GTK_ORIENTATION_VERTICAL:
             viewer->priv->dimension = widget->allocation.width;
+            viewer->priv->begin = viewer->priv->offset / viewer->priv->dimension;
+            viewer->priv->end = widget->allocation.height / viewer->priv->dimension + viewer->priv->begin;
             break;
     }
 
@@ -235,7 +240,7 @@
     GtkWidget *widget = GTK_WIDGET(viewer);
     GdkColor color;
 
-    RsttoNavigatorEntry *current_entry = rstto_navigator_get_file(viewer->priv->navigator);
+    gint position = rstto_navigator_get_position(viewer->priv->navigator);
 
     color.pixel = 0xffffffff;
     GdkGC *gc = gdk_gc_new(GDK_DRAWABLE(widget->window));
@@ -249,116 +254,32 @@
                         &(widget->style->bg[GTK_STATE_NORMAL]));
     
     gint i;
-    gint begin = viewer->priv->offset / viewer->priv->dimension;
-    gint end = 0;
     switch (viewer->priv->orientation)
     {
         case GTK_ORIENTATION_HORIZONTAL:
-            end = widget->allocation.width / viewer->priv->dimension + begin + 1;
-            if (end > rstto_navigator_get_n_files(viewer->priv->navigator))
-                end = rstto_navigator_get_n_files(viewer->priv->navigator);
-            if (widget->allocation.width > (end * viewer->priv->dimension - viewer->priv->offset))
+            if (widget->allocation.width > (viewer->priv->end * viewer->priv->dimension - viewer->priv->offset))
             {
                 gdk_window_clear_area(widget->window, 
-                                        (viewer->priv->dimension * end) - viewer->priv->offset, 
+                                        (viewer->priv->dimension * viewer->priv->end) - viewer->priv->offset, 
                                         0,
-                                        widget->allocation.width - (viewer->priv->dimension * end - viewer->priv->offset) - 16,
+                                        widget->allocation.width - (viewer->priv->dimension * viewer->priv->end - viewer->priv->offset) - 16,
                                         widget->allocation.height);
             }
             break;
         case GTK_ORIENTATION_VERTICAL:
-            end = widget->allocation.height / viewer->priv->dimension + begin;
-            if (end > rstto_navigator_get_n_files(viewer->priv->navigator))
-                end = rstto_navigator_get_n_files(viewer->priv->navigator);
-            if (widget->allocation.height > (end * viewer->priv->dimension) - viewer->priv->offset)
+            if (widget->allocation.height > (viewer->priv->end * viewer->priv->dimension) - viewer->priv->offset)
             {
                 gdk_window_clear_area(widget->window, 
                                         0,
-                                        (viewer->priv->dimension * end) - viewer->priv->offset, 
+                                        (viewer->priv->dimension * viewer->priv->end) - viewer->priv->offset, 
                                         widget->allocation.width,
-                                        widget->allocation.height - (viewer->priv->dimension * end - viewer->priv->offset) - 16);
+                                        widget->allocation.height - (viewer->priv->dimension * viewer->priv->end - viewer->priv->offset) - 16);
             }
             break;
     }
-    GdkPixmap *pixmap = NULL;
-
-    for(i = begin; i <= end; ++i)
+    for(i = viewer->priv->begin; i <= viewer->priv->end; ++i)
     { 
-        RsttoNavigatorEntry *entry = rstto_navigator_get_nth_file(viewer->priv->navigator, i);
-        if (entry)
-        {
-            GdkPixbuf *pixbuf = rstto_navigator_entry_get_thumb(entry, viewer->priv->dimension - 8);
-            pixmap = gdk_pixmap_new(widget->window, viewer->priv->dimension, viewer->priv->dimension, -1);
-
-            gdk_draw_rectangle(GDK_DRAWABLE(pixmap),
-                                gc,
-                                TRUE,
-                                0,
-                                0,
-                                viewer->priv->dimension,
-                                viewer->priv->dimension);
-            if(current_entry == entry)
-            {
-                gdk_draw_rectangle(GDK_DRAWABLE(pixmap),
-                                gc_bg_selected,
-                                TRUE,
-                                4, 4, 
-                                viewer->priv->dimension - 8,
-                                viewer->priv->dimension - 8);
-            }
-            else
-            {
-                gdk_draw_rectangle(GDK_DRAWABLE(pixmap),
-                                gc_bg_normal,
-                                TRUE,
-                                4, 4, 
-                                viewer->priv->dimension - 8,
-                                viewer->priv->dimension - 8);
-            }
-
-            if(pixbuf)
-            {
-                gdk_draw_pixbuf(GDK_DRAWABLE(pixmap),
-                                gc,
-                                pixbuf,
-                                0, 0,
-                                (0.5 * (viewer->priv->dimension - gdk_pixbuf_get_width(pixbuf))),
-                                (0.5 * (viewer->priv->dimension  - gdk_pixbuf_get_height(pixbuf))),
-                                -1, -1,
-                                GDK_RGB_DITHER_NORMAL,
-                                0, 0);
-            }
-
-            gint pixmap_offset = 0;
-            if (i == begin)
-            {
-                pixmap_offset = viewer->priv->offset - (begin * viewer->priv->dimension );
-            }
-            switch (viewer->priv->orientation)
-            {
-                case GTK_ORIENTATION_HORIZONTAL:
-                    gdk_draw_drawable(GDK_DRAWABLE(widget->window),
-                                gc,
-                                pixmap,
-                                pixmap_offset, 0,
-                                16 + ( i * viewer->priv->dimension) - viewer->priv->offset + pixmap_offset,
-                                0,
-                                -1,
-                                -1);
-
-                    break;
-                case GTK_ORIENTATION_VERTICAL:
-                    gdk_draw_drawable(GDK_DRAWABLE(widget->window),
-                                gc,
-                                pixmap,
-                                0, pixmap_offset,
-                                0,
-                                16 + ( i * viewer->priv->dimension) - viewer->priv->offset + pixmap_offset,
-                                -1,
-                                -1);
-                    break;
-            }
-        }
+        rstto_thumbnail_viewer_paint_entry(viewer, i , i==position?TRUE:FALSE);
     }
     switch (viewer->priv->orientation)
     {
@@ -445,9 +366,6 @@
 
     viewer->priv->navigator = navigator;
 
-    if (0)
-        g_signal_connect(G_OBJECT(navigator), "file_changed", G_CALLBACK(cb_rstto_thumbnailer_nav_file_changed), viewer);
-
     g_signal_connect(G_OBJECT(navigator), "new-entry", G_CALLBACK(cb_rstto_thumbnailer_nav_new_entry), viewer);
     g_signal_connect(G_OBJECT(navigator), "iter-changed", G_CALLBACK(cb_rstto_thumbnailer_nav_iter_changed), viewer);
     g_signal_connect(G_OBJECT(navigator), "reordered", G_CALLBACK(cb_rstto_thumbnailer_nav_reordered), viewer);
@@ -456,32 +374,6 @@
 }
 
 static void
-cb_rstto_thumbnailer_nav_file_changed(RsttoNavigator *nav, RsttoThumbnailViewer *viewer)
-{
-    GtkWidget *widget = GTK_WIDGET(viewer);
-    if (GTK_WIDGET_REALIZED (viewer))
-    {
-        if(viewer->priv->auto_center)
-        {
-            gint nr = rstto_navigator_get_position(nav);
-            switch (viewer->priv->orientation)
-            {
-                case GTK_ORIENTATION_HORIZONTAL:
-                    viewer->priv->offset = nr * viewer->priv->dimension - widget->allocation.width / 2 +viewer->priv->dimension / 2;
-                    break;
-                case GTK_ORIENTATION_VERTICAL:
-                    viewer->priv->offset = nr * viewer->priv->dimension - widget->allocation.height / 2 +viewer->priv->dimension / 2;
-                    break;
-            }
-            if (viewer->priv->offset < 0)
-                viewer->priv->offset = 0;
-        }
-        rstto_thumbnail_viewer_paint(viewer);   
-
-    }
-}
-
-static void
 cb_rstto_thumbnailer_button_press_event (RsttoThumbnailViewer *viewer,
                                          GdkEventButton *event)
 {
@@ -533,6 +425,8 @@
                     if((rstto_navigator_get_n_files(viewer->priv->navigator) * viewer->priv->dimension - viewer->priv->offset) > widget->allocation.height)
                     {
                         viewer->priv->offset += viewer->priv->dimension / 2;
+                        viewer->priv->begin = viewer->priv->offset / viewer->priv->dimension;
+                        viewer->priv->end = widget->allocation.height / viewer->priv->dimension + viewer->priv->begin;
                     }
                 }
                 if(viewer->priv->orientation == GTK_ORIENTATION_HORIZONTAL)
@@ -540,6 +434,8 @@
                     if((rstto_navigator_get_n_files(viewer->priv->navigator) * viewer->priv->dimension - viewer->priv->offset) > widget->allocation.width)
                     {
                         viewer->priv->offset += viewer->priv->dimension / 2;
+                        viewer->priv->begin = viewer->priv->offset / viewer->priv->dimension;
+                        viewer->priv->end = widget->allocation.width / viewer->priv->dimension + viewer->priv->begin;
                     }
                 }
             }
@@ -581,16 +477,76 @@
     {
         /* Check if the entry is visible */
         if ((nr >= viewer->priv->begin) && (nr <= viewer->priv->end))
-            rstto_thumbnail_viewer_paint(viewer);
+        {
+            RsttoNavigatorEntry *s_entry = rstto_navigator_get_file(nav);
+            if (s_entry == entry)
+            {
+                rstto_thumbnail_viewer_paint_entry(viewer, nr, TRUE);
+            }
+            else
+            {
+                rstto_thumbnail_viewer_paint_entry(viewer, nr, FALSE);
+            }
+        }
     }
 }
 
 static void
 cb_rstto_thumbnailer_nav_iter_changed(RsttoNavigator *nav, gint nr, RsttoNavigatorEntry *entry, RsttoThumbnailViewer *viewer)
 {
+    GtkWidget *widget = GTK_WIDGET(viewer);
     if (GTK_WIDGET_REALIZED(viewer))
     {
-        rstto_thumbnail_viewer_paint(viewer);
+        GdkCursor *cursor = gdk_cursor_new(GDK_WATCH);
+        gdk_window_set_cursor(widget->window, cursor);
+        gdk_cursor_unref(cursor);
+        
+        if (viewer->priv->auto_center == TRUE)
+        {
+            switch (viewer->priv->orientation)
+            {
+                case GTK_ORIENTATION_HORIZONTAL:
+                    viewer->priv->offset = nr * viewer->priv->dimension - widget->allocation.width / 2 +viewer->priv->dimension / 2;
+                    viewer->priv->begin = viewer->priv->offset / viewer->priv->dimension;
+                    viewer->priv->end = widget->allocation.width / viewer->priv->dimension + viewer->priv->begin;
+                    break;
+                case GTK_ORIENTATION_VERTICAL:
+                    viewer->priv->offset = nr * viewer->priv->dimension - widget->allocation.height / 2 +viewer->priv->dimension / 2;
+                    viewer->priv->begin = viewer->priv->offset / viewer->priv->dimension;
+                    viewer->priv->end = widget->allocation.height / viewer->priv->dimension + viewer->priv->begin;
+                    break;
+            }
+            if (viewer->priv->offset < 0)
+            {
+                viewer->priv->offset = 0;
+                viewer->priv->begin = 0;
+                viewer->priv->end = rstto_navigator_get_n_files(nav) - 1;
+            }
+            else
+            {
+                if (viewer->priv->end > rstto_navigator_get_n_files(nav))
+                    viewer->priv->end = rstto_navigator_get_n_files(nav) - 1;
+            }
+            rstto_thumbnail_viewer_paint(viewer);
+        }
+        else
+        {
+            rstto_thumbnail_viewer_paint_entry(viewer, rstto_navigator_get_old_position(viewer->priv->navigator), FALSE);
+            RsttoNavigatorEntry *s_entry = rstto_navigator_get_file(nav);
+            if (s_entry == entry)
+            {
+                rstto_thumbnail_viewer_paint_entry(viewer, nr, TRUE);
+            }
+            else
+            {
+                rstto_thumbnail_viewer_paint_entry(viewer, nr, FALSE);
+            }
+        }
+        
+
+        cursor = gdk_cursor_new(GDK_LEFT_PTR);
+        gdk_window_set_cursor(widget->window, cursor);
+        gdk_cursor_unref(cursor);
     }
 }
 
@@ -599,3 +555,106 @@
 {
 
 }
+
+static gboolean
+rstto_thumbnail_viewer_paint_entry (RsttoThumbnailViewer *viewer, gint nr, gboolean selected)
+{
+    GdkColor color;
+    GtkWidget *widget = GTK_WIDGET(viewer);
+    gint pixmap_offset = 0;
+    gint max_size = viewer->priv->dimension;
+    RsttoNavigatorEntry *entry = rstto_navigator_get_nth_file(viewer->priv->navigator, nr);
+    color.pixel = 0xffffffff;
+    GdkGC *gc = gdk_gc_new(GDK_DRAWABLE(widget->window));
+    GdkGC *gc_bg_normal = gdk_gc_new(GDK_DRAWABLE(widget->window));
+    GdkGC *gc_bg_selected = gdk_gc_new(GDK_DRAWABLE(widget->window));
+
+    gdk_gc_set_foreground(gc, &color);
+    gdk_gc_set_foreground(gc_bg_selected,
+                        &(widget->style->bg[GTK_STATE_SELECTED]));
+    gdk_gc_set_foreground(gc_bg_normal,
+                        &(widget->style->bg[GTK_STATE_NORMAL]));
+    GdkPixmap *pixmap = NULL;
+    if (entry)
+    {
+        GdkPixbuf *pixbuf = rstto_navigator_entry_get_thumb(entry, viewer->priv->dimension - 8);
+        pixmap = gdk_pixmap_new(widget->window, viewer->priv->dimension, viewer->priv->dimension, -1);
+
+        gdk_draw_rectangle(GDK_DRAWABLE(pixmap),
+                            gc,
+                            TRUE,
+                            0,
+                            0,
+                            viewer->priv->dimension,
+                            viewer->priv->dimension);
+        if(selected)
+        {
+            gdk_draw_rectangle(GDK_DRAWABLE(pixmap),
+                            gc_bg_selected,
+                            TRUE,
+                            4, 4, 
+                            viewer->priv->dimension - 8,
+                            viewer->priv->dimension - 8);
+        }
+        else
+        {
+            gdk_draw_rectangle(GDK_DRAWABLE(pixmap),
+                            gc_bg_normal,
+                            TRUE,
+                            4, 4, 
+                            viewer->priv->dimension - 8,
+                            viewer->priv->dimension - 8);
+        }
+
+        if(pixbuf)
+        {
+            gdk_draw_pixbuf(GDK_DRAWABLE(pixmap),
+                            gc,
+                            pixbuf,
+                            0, 0,
+                            (0.5 * (viewer->priv->dimension - gdk_pixbuf_get_width(pixbuf))),
+                            (0.5 * (viewer->priv->dimension  - gdk_pixbuf_get_height(pixbuf))),
+                            -1, -1,
+                            GDK_RGB_DITHER_NORMAL,
+                            0, 0);
+        }
+
+        /* pixmap_offset */
+        if (nr == viewer->priv->begin)
+        {
+            pixmap_offset = viewer->priv->offset - (nr * viewer->priv->dimension );
+        }
+        /* max_size */
+        if (nr == viewer->priv->end)
+        {
+            max_size = widget->allocation.width - (32 + ( nr * viewer->priv->dimension) - viewer->priv->offset + pixmap_offset);
+            if (max_size <= 0)
+                max_size = viewer->priv->dimension;
+        }
+        switch (viewer->priv->orientation)
+        {
+            case GTK_ORIENTATION_HORIZONTAL:
+                gdk_draw_drawable(GDK_DRAWABLE(widget->window),
+                            gc,
+                            pixmap,
+                            pixmap_offset, 0,
+                            16 + ( nr * viewer->priv->dimension) - viewer->priv->offset + pixmap_offset,
+                            0,
+                            max_size - pixmap_offset,
+                            viewer->priv->dimension);
+
+                break;
+            case GTK_ORIENTATION_VERTICAL:
+                gdk_draw_drawable(GDK_DRAWABLE(widget->window),
+                            gc,
+                            pixmap,
+                            0, pixmap_offset,
+                            0,
+                            16 + ( nr * viewer->priv->dimension) - viewer->priv->offset + pixmap_offset,
+                            viewer->priv->dimension,
+                            max_size - pixmap_offset);
+                break;
+        }
+    }
+    return TRUE;
+}




More information about the Goodies-commits mailing list