Fri Mar 25 22:39:30 2005 John Ellis <johne@verizon.net>
authorJohn Ellis <johne@verizon.net>
Sat, 26 Mar 2005 03:50:35 +0000 (03:50 +0000)
committerJohn Ellis <johne@verizon.net>
Sat, 26 Mar 2005 03:50:35 +0000 (03:50 +0000)
        * image.c: Connect to 'zoom' signal of pixbuf-renderer and notify
        listener to update. Fix delay flip by listening for 'render_complete'.
        * pixbuf-renderer.[ch]: Add complete property and and emit a
        'render-complete' signal when changing complete back to TRUE.
        * view_dir_tree.c (vdtree_row_expanded): Populate a folder node
        whenever it is expanded.

##### Note: GQview CVS on sourceforge is not always up to date, please use #####
##### an offical release when making enhancements and translation updates. #####

ChangeLog
TODO
src/image.c
src/pixbuf-renderer.c
src/pixbuf-renderer.h
src/view_dir_tree.c

index 3ca2b4a..08eecd7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+Fri Mar 25 22:39:30 2005  John Ellis  <johne@verizon.net>
+
+       * image.c: Connect to 'zoom' signal of pixbuf-renderer and notify
+       listener to update. Fix delay flip by listening for 'render_complete'.
+       * pixbuf-renderer.[ch]: Add complete property and and emit a
+       'render-complete' signal when changing complete back to TRUE.
+       * view_dir_tree.c (vdtree_row_expanded): Populate a folder node
+       whenever it is expanded.
+
 Wed Mar 23 00:22:28 2005  John Ellis  <johne@verizon.net>
 
        * image.c (image_change_from_image): Fix and use pixbuf_renderer_move.
diff --git a/TODO b/TODO
index 537a2aa..566a035 100644 (file)
--- a/TODO
+++ b/TODO
@@ -11,8 +11,11 @@ Major:
 
  > image.c:
    > need to keep a list of ImageWindows and provide function to sync options to each object.
-   > test and probably fix delay_flip.
+  d> test and probably fix delay_flip.
+      > UPDATE: works as before (pre pixbuf-renderer), but should be fixed to provide a single redraw
+        by pre-rendering any scaled tiles that are visible before signaling 'render_complete'.
    > make this a g_object with signals for completed, changed, etc.
+   > fix region computation rounding when updating scaled image in 'area ready' signal.
 
 
  > work on pan view:
@@ -38,6 +41,7 @@ Major:
     w> fix search. (UPDATE: still can not find day containing name/path/partial)
      > supports thumbnail size images only, should grey out actual size items in size menu or something...
      > allow use of file date or EXIF (embedded) date.
+     > fix scrolling when 'day' popup appears outsize of canvas.
 
    > grid view:
      > allow sorting by name, date, size, dimensions, etc.
@@ -51,6 +55,9 @@ Major:
  > the info dialog is not set as a transient of the calling window, this causes it to be behind
    a full screen window when 'stay above other windows' is enabled.
 
+ > folder tree view shortcuts for expanding/collapsing leak through to the main
+   window (+,-,*,/, etc.), figure what behavior is desired and fix this.
+
  -------------
 
  > update translations: ( ) ( ) ( )
index 07a4db7..ae29e10 100644 (file)
@@ -76,6 +76,13 @@ static void image_update_util(ImageWindow *imd)
        if (imd->func_update) imd->func_update(imd, imd->data_update);
 }
 
+static void image_zoom_cb(PixbufRenderer *pr, gdouble zoom, gpointer data)
+{
+       ImageWindow *imd = data;
+
+       image_update_util(imd);
+}
+
 static void image_complete_util(ImageWindow *imd, gint preload)
 {
        if (imd->il && image_get_pixbuf(imd) != image_loader_get_pixbuf(imd->il)) return;
@@ -88,6 +95,13 @@ static void image_complete_util(ImageWindow *imd, gint preload)
        if (imd->func_complete) imd->func_complete(imd, preload, imd->data_complete);
 }
 
+static void image_render_complete_cb(PixbufRenderer *pr, gpointer data)
+{
+       ImageWindow *imd = data;
+
+       image_complete_util(imd, FALSE);
+}
+
 static void image_new_util(ImageWindow *imd)
 {
        if (imd->func_new) imd->func_new(imd, imd->data_new);
@@ -539,6 +553,7 @@ static gint image_load_begin(ImageWindow *imd, const gchar *path)
        if (imd->il) return FALSE;
 
        imd->completed = FALSE;
+       g_object_set(G_OBJECT(imd->pr), "complete", FALSE, NULL);
 
        if (image_post_buffer_get(imd))
                {
@@ -1411,6 +1426,11 @@ ImageWindow *image_new(gint frame)
        g_signal_connect(G_OBJECT(imd->pr), "destroy",
                         G_CALLBACK(image_destroy_cb), imd);
 
+       g_signal_connect(G_OBJECT(imd->pr), "zoom",
+                        G_CALLBACK(image_zoom_cb), imd);
+       g_signal_connect(G_OBJECT(imd->pr), "render_complete",
+                        G_CALLBACK(image_render_complete_cb), imd);
+
        return imd;
 }
 
index 0a0dfd4..91edec4 100644 (file)
@@ -135,6 +135,7 @@ enum {
        SIGNAL_ZOOM = 0,
        SIGNAL_CLICKED,
        SIGNAL_SCROLL_NOTIFY,
+       SIGNAL_RENDER_COMPLETE,
        SIGNAL_COUNT
 };
 
@@ -149,6 +150,7 @@ enum {
        PROP_SCROLL_RESET,
        PROP_DELAY_FLIP,
        PROP_LOADING,
+       PROP_COMPLETE,
        PROP_CACHE_SIZE_DISPLAY,
        PROP_CACHE_SIZE_TILES,
        PROP_WINDOW_FIT,
@@ -172,6 +174,7 @@ static void pixbuf_renderer_get_property(GObject *object, guint prop_id,
                                         GValue *value, GParamSpec *pspec);
 static gint pixbuf_renderer_expose(GtkWidget *widget, GdkEventExpose *event);
 
+static void pr_render_complete_signal(PixbufRenderer *pr);
 
 static void pr_overlay_list_clear(PixbufRenderer *pr);
 static void pr_scroller_timer_set(PixbufRenderer *pr, gint start);
@@ -326,6 +329,14 @@ static void pixbuf_renderer_class_init(PixbufRendererClass *class)
                                                             FALSE,
                                                             G_PARAM_READABLE | G_PARAM_WRITABLE));
 
+       g_object_class_install_property(gobject_class,
+                                       PROP_COMPLETE,
+                                       g_param_spec_boolean("complete",
+                                                            "Image rendering complete",
+                                                            NULL,
+                                                            FALSE,
+                                                            G_PARAM_READABLE | G_PARAM_WRITABLE));
+
        g_object_class_install_property(gobject_class,
                                        PROP_CACHE_SIZE_DISPLAY,
                                        g_param_spec_uint("cache_display",
@@ -400,6 +411,15 @@ static void pixbuf_renderer_class_init(PixbufRendererClass *class)
                             NULL, NULL,
                             g_cclosure_marshal_VOID__VOID,
                             G_TYPE_NONE, 0);
+
+       signals[SIGNAL_RENDER_COMPLETE] = 
+               g_signal_new("render-complete",
+                            G_OBJECT_CLASS_TYPE(gobject_class),
+                            G_SIGNAL_RUN_LAST,
+                            G_STRUCT_OFFSET(PixbufRendererClass, render_complete),
+                            NULL, NULL,
+                            g_cclosure_marshal_VOID__VOID,
+                            G_TYPE_NONE, 0);
 }
 
 static void pixbuf_renderer_init(PixbufRenderer *pr)
@@ -501,6 +521,9 @@ static void pixbuf_renderer_set_property(GObject *object, guint prop_id,
                case PROP_LOADING:
                        pr->loading = g_value_get_boolean(value);
                        break;
+               case PROP_COMPLETE:
+                       pr->complete = g_value_get_boolean(value);
+                       break;
                case PROP_CACHE_SIZE_DISPLAY:
                        pr->tile_cache_max = g_value_get_uint(value);
                        break;
@@ -558,6 +581,9 @@ static void pixbuf_renderer_get_property(GObject *object, guint prop_id,
                case PROP_LOADING:
                        g_value_set_boolean(value, pr->loading);
                        break;
+               case PROP_COMPLETE:
+                       g_value_set_boolean(value, pr->complete);
+                       break;
                case PROP_CACHE_SIZE_DISPLAY:
                        g_value_set_uint(value, pr->tile_cache_max);
                        break;
@@ -2010,9 +2036,7 @@ static gint pr_queue_draw_idle_cb(gpointer data)
            (!pr->draw_queue && !pr->draw_queue_2pass) ||
            pr->draw_idle_id == -1)
                {
-#if 0
-               if (!pr->completed) image_complete_util(pr, FALSE);
-#endif
+               pr_render_complete_signal(pr);
 
                pr->draw_idle_id = -1;
                return FALSE;
@@ -2087,9 +2111,7 @@ static gint pr_queue_draw_idle_cb(gpointer data)
 
        if (!pr->draw_queue && !pr->draw_queue_2pass)
                {
-#if 0
-               if (!pr->completed) image_complete_util(pr, FALSE);
-#endif
+               pr_render_complete_signal(pr);
 
                pr->draw_idle_id = -1;
                return FALSE;
@@ -2311,14 +2333,23 @@ static void pr_zoom_signal(PixbufRenderer *pr)
        g_signal_emit(pr, signals[SIGNAL_ZOOM], 0, pr->zoom);
 }
 
+static void pr_clicked_signal(PixbufRenderer *pr, GdkEventButton *bevent)
+{
+       g_signal_emit(pr, signals[SIGNAL_CLICKED], 0, bevent);
+}
+
 static void pr_scroll_notify_signal(PixbufRenderer *pr)
 {
        g_signal_emit(pr, signals[SIGNAL_SCROLL_NOTIFY], 0);
 }
 
-static void pr_button_signal(PixbufRenderer *pr, GdkEventButton *bevent)
+static void pr_render_complete_signal(PixbufRenderer *pr)
 {
-       g_signal_emit(pr, signals[SIGNAL_CLICKED], 0, bevent);
+       if (!pr->complete)
+               {
+               g_signal_emit(pr, signals[SIGNAL_RENDER_COMPLETE], 0);
+               g_object_set(G_OBJECT(pr), "complete", TRUE, NULL);
+               }
 }
 
 /*
@@ -2859,7 +2890,7 @@ static gint pr_mouse_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointe
                        pr->drag_moved = 0;
                        break;
                case 3:
-                       pr_button_signal(pr, bevent);
+                       pr_clicked_signal(pr, bevent);
                        break;
                default:
                        break;
@@ -2901,7 +2932,7 @@ static gint pr_mouse_release_cb(GtkWidget *widget, GdkEventButton *bevent, gpoin
                        }
                else if (bevent->button == 1 || bevent->button == 2)
                        {
-                       pr_button_signal(pr, bevent);
+                       pr_clicked_signal(pr, bevent);
                        }
                }
 
index 900ac89..f9ded39 100644 (file)
@@ -117,6 +117,7 @@ struct _PixbufRenderer
 
        gboolean delay_flip;
        gboolean loading;
+       gboolean complete;
 
        gint scroller_id;
        gint scroller_overlay;
@@ -137,6 +138,8 @@ struct _PixbufRendererClass
        void (* zoom)           (PixbufRenderer *pr, gdouble zoom);
        void (* clicked)        (PixbufRenderer *pr, GdkEventButton *event);
        void (* scroll_notify)  (PixbufRenderer *pr);
+
+       void (* render_complete)(PixbufRenderer *pr);
 };
 
 
index 9a0437a..9c8d9d5 100644 (file)
@@ -1524,6 +1524,7 @@ static void vdtree_row_expanded(GtkTreeView *treeview, GtkTreeIter *iter, GtkTre
 {
        ViewDirTree *vdt = data;
 
+       vdtree_populate_path_by_iter(vdt, iter, FALSE, NULL);
        vdtree_icon_set_by_iter(vdt, iter, vdt->pf->open);
 }