[recipes] Delay filesystem removal until data is saved



commit 9aceffb9436df6cb1a1469532846fcb1350839cd
Author: Matthias Clasen <mclasen redhat com>
Date:   Sat Feb 18 18:10:13 2017 -0500

    Delay filesystem removal until data is saved
    
    This complication arises because we may have changes made
    to the images, only to not have the recipe saved later.
    In this case, we need to avoid removing the old images,
    and undo the imports.

 src/gr-image-viewer.c |   37 ++++++++++++++++++++++++++++++++++++-
 src/gr-image-viewer.h |    2 ++
 2 files changed, 38 insertions(+), 1 deletions(-)
---
diff --git a/src/gr-image-viewer.c b/src/gr-image-viewer.c
index f7cafe5..2722c1a 100644
--- a/src/gr-image-viewer.c
+++ b/src/gr-image-viewer.c
@@ -49,6 +49,9 @@ struct _GrImageViewer
         GArray *images;
         int index;
 
+        GPtrArray *additions;
+        GPtrArray *removals;
+
         guint hide_timeout;
 
         GtkGesture *gesture;
@@ -86,6 +89,11 @@ gr_image_viewer_finalize (GObject *object)
 {
         GrImageViewer *viewer = GR_IMAGE_VIEWER (object);
 
+        gr_image_viewer_revert_changes (viewer);
+
+        g_clear_pointer (&viewer->additions, g_ptr_array_unref);
+        g_clear_pointer (&viewer->removals, g_ptr_array_unref);
+
         g_clear_pointer (&viewer->images, g_array_unref);
         remove_hide_timeout (viewer);
         g_clear_object (&viewer->gesture);
@@ -414,6 +422,9 @@ gr_image_viewer_init (GrImageViewer *self)
         gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (self->gesture), GTK_PHASE_BUBBLE);
         g_signal_connect (self->gesture, "pressed", G_CALLBACK (button_press), self);
         self->images = gr_rotated_image_array_new ();
+
+        self->additions = g_ptr_array_new_with_free_func (g_free);
+        self->removals = g_ptr_array_new_with_free_func (g_free);
 }
 
 static void
@@ -553,6 +564,8 @@ file_chooser_response (GtkNativeDialog *self,
 
                         add_image (viewer, &ri, TRUE);
 
+                        g_ptr_array_add (viewer->additions, g_strdup (ri.path));
+
                         g_free (ri.path);
                 }
                 g_slist_free_full (names, g_free);
@@ -615,7 +628,7 @@ gr_image_viewer_remove_image (GrImageViewer *viewer)
 
         ri = &g_array_index (viewer->images, GrRotatedImage, viewer->index);
 
-        remove_image (ri->path);
+        g_ptr_array_add (viewer->removals, g_strdup (ri->path));
 
         g_array_remove_index (viewer->images, viewer->index);
 
@@ -671,3 +684,25 @@ gr_image_viewer_get_index (GrImageViewer *viewer)
 {
         return viewer->images->len;
 }
+
+void
+gr_image_viewer_persist_changes (GrImageViewer *viewer)
+{
+        int i;
+
+        g_ptr_array_set_size (viewer->additions, 0);
+        for (i = 0; i < viewer->removals->len; i++)
+                remove_image (g_ptr_array_index (viewer->removals, i));
+        g_ptr_array_set_size (viewer->removals, 0);
+}
+
+void
+gr_image_viewer_revert_changes (GrImageViewer *viewer)
+{
+        int i;
+
+        g_ptr_array_set_size (viewer->removals, 0);
+        for (i = 0; i < viewer->additions->len; i++)
+                remove_image (g_ptr_array_index (viewer->additions, i));
+        g_ptr_array_set_size (viewer->additions, 0);
+}
diff --git a/src/gr-image-viewer.h b/src/gr-image-viewer.h
index b5045f8..3e8e32d 100644
--- a/src/gr-image-viewer.h
+++ b/src/gr-image-viewer.h
@@ -41,6 +41,8 @@ void           gr_image_viewer_rotate_image (GrImageViewer *viewer,
 void           gr_image_viewer_show_image (GrImageViewer *viewer,
                                            int            idx);
 int            gr_image_viewer_get_index (GrImageViewer *viewer);
+void           gr_image_viewer_persist_changes (GrImageViewer *viewer);
+void           gr_image_viewer_revert_changes (GrImageViewer *viewer);
 
 G_END_DECLS
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]