From 77688f9bba800dc04785424585ce96d120886292 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20Bonithon?= Date: Sat, 1 Mar 2025 10:11:05 +0100 Subject: [PATCH] Store adjustment values and restore them when switching file A small improvement: in addition to restoring zoom and orientation, this restores the image position when its dimensions exceed those of the view. Closes: #99 --- src/file.c | 27 +++++++++++++++++++++++++++ src/file.h | 14 ++++++++++++++ src/image_viewer.c | 10 +++++++++- 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/file.c b/src/file.c index a283d521..4f7a32bc 100644 --- a/src/file.c +++ b/src/file.c @@ -73,6 +73,7 @@ struct _RsttoFilePrivate RsttoImageOrientation orientation; gdouble scale; RsttoScale auto_scale; + gdouble h_adjust, v_adjust; }; @@ -484,6 +485,32 @@ rstto_file_set_auto_scale (RsttoFile *r_file, r_file->priv->auto_scale = auto_scale; } +gdouble +rstto_file_get_h_adjustment (RsttoFile *r_file) +{ + return r_file->priv->h_adjust; +} + +gdouble +rstto_file_get_v_adjustment (RsttoFile *r_file) +{ + return r_file->priv->v_adjust; +} + +void +rstto_file_set_h_adjustment (RsttoFile *r_file, + gdouble h_adjust) +{ + r_file->priv->h_adjust = h_adjust; +} + +void +rstto_file_set_v_adjustment (RsttoFile *r_file, + gdouble v_adjust) +{ + r_file->priv->v_adjust = v_adjust; +} + gboolean rstto_file_has_exif (RsttoFile *r_file) { diff --git a/src/file.h b/src/file.h index b67670c4..30377157 100644 --- a/src/file.h +++ b/src/file.h @@ -162,6 +162,20 @@ void rstto_file_set_auto_scale (RsttoFile *r_file, RsttoScale auto_scale); +gdouble +rstto_file_get_h_adjustment (RsttoFile *r_file); + +gdouble +rstto_file_get_v_adjustment (RsttoFile *r_file); + +void +rstto_file_set_h_adjustment (RsttoFile *r_file, + gdouble h_adjust); + +void +rstto_file_set_v_adjustment (RsttoFile *r_file, + gdouble v_adjust); + gboolean rstto_file_has_exif (RsttoFile *r_file); diff --git a/src/image_viewer.c b/src/image_viewer.c index 650759c3..ed114429 100644 --- a/src/image_viewer.c +++ b/src/image_viewer.c @@ -813,12 +813,18 @@ set_adjustments (RsttoImageViewer *viewer, gtk_adjustment_set_upper (viewer->priv->hadjustment, MAX (viewer->priv->rendering.width, alloc.width)); gtk_adjustment_set_page_size (viewer->priv->hadjustment, alloc.width); if (h_value != -1) + { gtk_adjustment_set_value (viewer->priv->hadjustment, h_value); + rstto_file_set_h_adjustment (viewer->priv->file, h_value); + } gtk_adjustment_set_upper (viewer->priv->vadjustment, MAX (viewer->priv->rendering.height, alloc.height)); gtk_adjustment_set_page_size (viewer->priv->vadjustment, alloc.height); if (v_value != -1) + { gtk_adjustment_set_value (viewer->priv->vadjustment, v_value); + rstto_file_set_v_adjustment (viewer->priv->file, v_value); + } g_object_thaw_notify (G_OBJECT (viewer->priv->hadjustment)); g_object_thaw_notify (G_OBJECT (viewer->priv->vadjustment)); @@ -1745,6 +1751,9 @@ cb_rstto_image_loader_closed_idle (gpointer data) viewer->priv->image_height = viewer->priv->original_image_height = transaction->image_height; set_scale_factor (viewer, NULL, NULL); set_scale (viewer, transaction->scale); + set_adjustments (viewer, + rstto_file_get_h_adjustment (viewer->priv->file), + rstto_file_get_v_adjustment (viewer->priv->file)); } else { @@ -1764,7 +1773,6 @@ cb_rstto_image_loader_closed_idle (gpointer data) transaction->error = NULL; viewer->priv->transaction = NULL; - set_adjustments (viewer, -1, -1); gdk_window_invalidate_rect (gtk_widget_get_window (widget), NULL, FALSE); g_signal_emit_by_name (transaction->viewer, "size-ready");