[Goodies-commits] r2985 - ristretto/trunk/src
Stephan Arts
stephan at xfce.org
Sat Aug 11 19:36:52 CEST 2007
Author: stephan
Date: 2007-08-11 17:36:52 +0000 (Sat, 11 Aug 2007)
New Revision: 2985
Modified:
ristretto/trunk/src/navigator.c
ristretto/trunk/src/thumbnail_viewer.c
Log:
Move thumbnailer code to the thumbnail viewer
Modified: ristretto/trunk/src/navigator.c
===================================================================
--- ristretto/trunk/src/navigator.c 2007-08-11 06:09:59 UTC (rev 2984)
+++ ristretto/trunk/src/navigator.c 2007-08-11 17:36:52 UTC (rev 2985)
@@ -45,7 +45,6 @@
struct _RsttoNavigatorEntry
{
ThunarVfsInfo *info;
- GdkPixbuf *pixbuf;
GdkPixbufRotation rotation;
gboolean h_flipped;
gboolean v_flipped;
@@ -590,7 +589,6 @@
entry = g_new0(RsttoNavigatorEntry, 1);
entry->info = info;
- entry->pixbuf = gdk_pixbuf_new_from_file_at_size(filename, 64, 64, NULL);
g_free(filename);
}
@@ -603,12 +601,6 @@
return entry->info;
}
-GdkPixbuf *
-rstto_navigator_entry_get_thumbnail (RsttoNavigatorEntry *entry)
-{
- return entry->pixbuf;
-}
-
GdkPixbufRotation
rstto_navigator_entry_get_rotation (RsttoNavigatorEntry *entry)
{
@@ -738,8 +730,6 @@
_rstto_navigator_entry_free(RsttoNavigatorEntry *nav_entry)
{
thunar_vfs_info_unref(nav_entry->info);
- if(nav_entry->pixbuf)
- g_object_unref(nav_entry->pixbuf);
g_free(nav_entry);
}
Modified: ristretto/trunk/src/thumbnail_viewer.c
===================================================================
--- ristretto/trunk/src/thumbnail_viewer.c 2007-08-11 06:09:59 UTC (rev 2984)
+++ ristretto/trunk/src/thumbnail_viewer.c 2007-08-11 17:36:52 UTC (rev 2985)
@@ -28,12 +28,29 @@
#include "navigator.h"
#include "thumbnail_viewer.h"
+typedef struct _RsttoThumbnailViewerCache RsttoThumbnailViewerCache;
+
+struct _RsttoThumbnailViewerCache
+{
+ gint begin;
+ gint end;
+ GList *pixmaps;
+};
+
+static gboolean
+rstto_thumbnail_viewer_cache_add (RsttoThumbnailViewerCache *cache, GdkPixmap *pixmap, gint nr);
+static gboolean
+rstto_thumbnail_viewer_cache_remove (RsttoThumbnailViewerCache *cache, gint nr);
+static GdkPixmap *
+rstto_thumbnail_viewer_cache_get_pixmap (RsttoThumbnailViewerCache *cache, gint nr);
+
struct _RsttoThumbnailViewerPriv
{
GtkOrientation orientation;
RsttoNavigator *navigator;
gint dimension;
gint offset;
+ RsttoThumbnailViewerCache *cache;
};
static void
@@ -93,12 +110,19 @@
rstto_thumbnail_viewer_init(RsttoThumbnailViewer *viewer)
{
viewer->priv = g_new0(RsttoThumbnailViewerPriv, 1);
+ viewer->priv->cache = g_new0(RsttoThumbnailViewerCache, 1);
+ viewer->priv->cache->begin = -1;
+ viewer->priv->cache->end = -1;
+
gtk_widget_set_redraw_on_allocate(GTK_WIDGET(viewer), TRUE);
gtk_widget_set_events (GTK_WIDGET(viewer),
GDK_BUTTON_PRESS_MASK);
g_signal_connect(G_OBJECT(viewer), "button_press_event", G_CALLBACK(cb_rstto_thumbnailer_button_press_event), NULL);
viewer->priv->orientation = GTK_ORIENTATION_HORIZONTAL;
+
+ if (0)
+ rstto_thumbnail_viewer_cache_remove(NULL, 0);
}
static void
@@ -230,73 +254,86 @@
gint i;
gdk_window_clear(widget->window);
- for(i = 0; i < rstto_navigator_get_n_files(viewer->priv->navigator); ++i)
+ gint begin = viewer->priv->offset / viewer->priv->dimension;
+ gint end = widget->allocation.width / viewer->priv->dimension - begin;
+ GdkPixmap *pixmap = NULL;
+ for(i = begin; i <= end; ++i)
{
RsttoNavigatorEntry *entry = rstto_navigator_get_nth_file(viewer->priv->navigator, i);
- GdkPixbuf *pixbuf = rstto_navigator_entry_get_thumbnail(entry);
- GdkPixmap *pixmap = gdk_pixmap_new(widget->window, viewer->priv->dimension, viewer->priv->dimension, -1);
+ if (entry)
+ {
+ ThunarVfsInfo *info = rstto_navigator_entry_get_info(entry);
+ gchar *filename = thunar_vfs_path_dup_string(info->path);
+ GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file_at_size(filename, viewer->priv->dimension - 8, viewer->priv->dimension - 8, NULL);
+ pixmap = rstto_thumbnail_viewer_cache_get_pixmap(viewer->priv->cache, i);
+ if (!pixmap)
+ {
+ pixmap = gdk_pixmap_new(widget->window, viewer->priv->dimension, viewer->priv->dimension, -1);
+ rstto_thumbnail_viewer_cache_add(viewer->priv->cache, pixmap, i);
+ }
- 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);
- }
+ 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);
- }
- switch (viewer->priv->orientation)
- {
- case GTK_ORIENTATION_HORIZONTAL:
- gdk_draw_drawable(GDK_DRAWABLE(widget->window),
- gc,
- pixmap,
- 0, 0,
- 16+(i*viewer->priv->dimension)-viewer->priv->offset,
- 0,
- -1,
- -1);
+ 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);
+ }
+ switch (viewer->priv->orientation)
+ {
+ case GTK_ORIENTATION_HORIZONTAL:
+ gdk_draw_drawable(GDK_DRAWABLE(widget->window),
+ gc,
+ pixmap,
+ 0, 0,
+ 16+(i*viewer->priv->dimension)-viewer->priv->offset,
+ 0,
+ -1,
+ -1);
- break;
- case GTK_ORIENTATION_VERTICAL:
- gdk_draw_drawable(GDK_DRAWABLE(widget->window),
- gc,
- pixmap,
- 0, 0,
- 0,
- 16+(i*viewer->priv->dimension)-viewer->priv->offset,
- viewer->priv->dimension,
- viewer->priv->dimension);
- break;
+ break;
+ case GTK_ORIENTATION_VERTICAL:
+ gdk_draw_drawable(GDK_DRAWABLE(widget->window),
+ gc,
+ pixmap,
+ 0, 0,
+ 0,
+ 16+(i*viewer->priv->dimension)-viewer->priv->offset,
+ viewer->priv->dimension,
+ viewer->priv->dimension);
+ break;
+ }
}
}
switch (viewer->priv->orientation)
@@ -479,3 +516,34 @@
{
return viewer->priv->orientation;
}
+
+static gboolean
+rstto_thumbnail_viewer_cache_add (RsttoThumbnailViewerCache *cache, GdkPixmap *pixmap, gint nr)
+{
+ if (cache->begin == -1)
+ {
+ cache->begin = nr;
+ cache->end = nr;
+
+ cache->pixmaps = g_list_prepend(cache->pixmaps, pixmap);
+ }
+ else
+ {
+ /* This is the hard part */
+ }
+ return TRUE;
+}
+
+static gboolean
+rstto_thumbnail_viewer_cache_remove (RsttoThumbnailViewerCache *cache, gint nr)
+{
+
+}
+
+static GdkPixmap *
+rstto_thumbnail_viewer_cache_get_pixmap (RsttoThumbnailViewerCache *cache, gint nr)
+{
+ if(nr < cache->end && nr > cache->begin)
+ return NULL;
+ return g_list_nth_data(cache->pixmaps, cache->begin - nr);
+}
More information about the Goodies-commits
mailing list