From: John Ellis Date: Sat, 26 Mar 2005 03:50:35 +0000 (+0000) Subject: Fri Mar 25 22:39:30 2005 John Ellis X-Git-Tag: v1.0.0~1778 X-Git-Url: http://geeqie.org/cgi-bin/gitweb.cgi?p=geeqie.git;a=commitdiff_plain;h=d59bd2fd190ff1e799f52a3bbe2ddecc52b91a82 Fri Mar 25 22:39:30 2005 John Ellis * 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. ##### --- diff --git a/ChangeLog b/ChangeLog index 3ca2b4a2..08eecd71 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +Fri Mar 25 22:39:30 2005 John Ellis + + * 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 * image.c (image_change_from_image): Fix and use pixbuf_renderer_move. diff --git a/TODO b/TODO index 537a2aad..566a0351 100644 --- 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: ( ) ( ) ( ) diff --git a/src/image.c b/src/image.c index 07a4db76..ae29e100 100644 --- a/src/image.c +++ b/src/image.c @@ -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; } diff --git a/src/pixbuf-renderer.c b/src/pixbuf-renderer.c index 0a0dfd47..91edec4c 100644 --- a/src/pixbuf-renderer.c +++ b/src/pixbuf-renderer.c @@ -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); } } diff --git a/src/pixbuf-renderer.h b/src/pixbuf-renderer.h index 900ac897..f9ded392 100644 --- a/src/pixbuf-renderer.h +++ b/src/pixbuf-renderer.h @@ -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); }; diff --git a/src/view_dir_tree.c b/src/view_dir_tree.c index 9a0437a2..9c8d9d56 100644 --- a/src/view_dir_tree.c +++ b/src/view_dir_tree.c @@ -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); }