[Xfce4-commits] <ristretto:master> Add sticky bit, to prevent the iterators from jumping around.

Stephan Arts noreply at xfce.org
Sun Nov 13 23:18:06 CET 2011


Updating branch refs/heads/master
         to bd84c942674c5522ea94f6c49fbc27c08e390eda (commit)
       from 813c2cde1312e007c8c8aa57f9ed3a8625b72ac7 (commit)

commit bd84c942674c5522ea94f6c49fbc27c08e390eda
Author: Stephan Arts <stephan at xfce.org>
Date:   Sat Nov 12 00:09:23 2011 +0100

    Add sticky bit, to prevent the iterators from jumping around.

 src/image_list.c  |   90 ++++++++++++++++++++++++++++++++++++++++++----------
 src/image_list.h  |    4 ++
 src/main_window.c |    1 +
 3 files changed, 77 insertions(+), 18 deletions(-)

diff --git a/src/image_list.c b/src/image_list.c
index 64b7308..5484082 100644
--- a/src/image_list.c
+++ b/src/image_list.c
@@ -55,6 +55,20 @@ rstto_image_list_iter_class_init(RsttoImageListIterClass *);
 static void
 rstto_image_list_iter_dispose(GObject *object);
 
+static gboolean
+iter_next (
+        RsttoImageListIter *iter,
+        gboolean sticky);
+static gboolean
+iter_previous (
+        RsttoImageListIter *iter,
+        gboolean sticky);
+static void 
+iter_set_position (
+        RsttoImageListIter *iter,
+        gint pos,
+        gboolean sticky);
+
 static RsttoImageListIter * rstto_image_list_iter_new ();
 
 static gint
@@ -83,7 +97,10 @@ enum
 struct _RsttoImageListIterPriv
 {
     RsttoImageList *image_list;
-    RsttoFile *file;
+    RsttoFile      *file;
+    
+    /* This is set if the iter-position is chosen by the user */
+    gboolean        sticky; 
 };
 
 struct _RsttoImageListPriv
@@ -199,6 +216,7 @@ gboolean
 rstto_image_list_add_file (RsttoImageList *image_list, RsttoFile *file, GError **error)
 {
     GList *image_iter = g_list_find (image_list->priv->images, file);
+    GSList *iter = image_list->priv->iterators;
 
     if (!image_iter)
     {
@@ -209,15 +227,15 @@ rstto_image_list_add_file (RsttoImageList *image_list, RsttoFile *file, GError *
             image_list->priv->n_images++;
 
             g_signal_emit (G_OBJECT (image_list), rstto_image_list_signals[RSTTO_IMAGE_LIST_SIGNAL_NEW_IMAGE], 0, file, NULL);
-            if (image_list->priv->n_images == 1)
+            /** TODO: update all iterators */
+            while (iter)
             {
-                /** TODO: update all iterators */
-                GSList *iter = image_list->priv->iterators;
-                while (iter)
+                if (FALSE == RSTTO_IMAGE_LIST_ITER(iter->data)->priv->sticky)
                 {
-                    g_signal_emit (G_OBJECT (iter->data), rstto_image_list_iter_signals[RSTTO_IMAGE_LIST_ITER_SIGNAL_CHANGED], 0, NULL);
-                    iter = g_slist_next (iter);
+                    g_debug("find file");
+                    rstto_image_list_iter_find_file (iter->data, file);
                 }
+                iter = g_slist_next (iter);
             }
             return TRUE;
         }
@@ -274,11 +292,11 @@ rstto_image_list_remove_file (RsttoImageList *image_list, RsttoFile *file)
             {
                 if (rstto_image_list_iter_get_position (iter->data) == rstto_image_list_get_n_images (image_list)-1)
                 {
-                    rstto_image_list_iter_previous (iter->data);
+                    iter_previous (iter->data, FALSE);
                 }
                 else
                 {
-                    rstto_image_list_iter_next (iter->data);
+                    iter_next (iter->data, FALSE);
                 }
                 /* If the image is still the same, 
                  * it's a single item list,
@@ -302,7 +320,7 @@ rstto_image_list_remove_file (RsttoImageList *image_list, RsttoFile *file)
             {
                 if (rstto_file_equal(afile, file))
                 {
-                    rstto_image_list_iter_next (iter->data);
+                    iter_next (iter->data, FALSE);
                 }
             }
             iter = g_slist_next (iter);
@@ -324,7 +342,7 @@ rstto_image_list_remove_all (RsttoImageList *image_list)
     iter = image_list->priv->iterators;
     while (iter)
     {
-        rstto_image_list_iter_set_position (iter->data, -1);
+        iter_set_position (iter->data, -1, FALSE);
         iter = g_slist_next (iter);
     }
     g_signal_emit (G_OBJECT (image_list), rstto_image_list_signals[RSTTO_IMAGE_LIST_SIGNAL_REMOVE_ALL], 0, NULL);
@@ -386,7 +404,6 @@ cb_file_monitor_changed (
         case G_FILE_MONITOR_EVENT_MOVED:
             g_debug("file moved");
             rstto_image_list_remove_file ( image_list, r_file );
-
             r_file = rstto_file_new (other_file);
             rstto_image_list_add_file (image_list, r_file, NULL);
             r_file = NULL;
@@ -509,6 +526,7 @@ rstto_image_list_iter_find_file (RsttoImageListIter *iter, RsttoFile *file)
             iter->priv->file = NULL;
         }
         iter->priv->file = file;
+        iter->priv->sticky = TRUE;
 
         g_signal_emit (G_OBJECT (iter), rstto_image_list_iter_signals[RSTTO_IMAGE_LIST_ITER_SIGNAL_CHANGED], 0, NULL);
 
@@ -533,9 +551,11 @@ rstto_image_list_iter_get_file (RsttoImageListIter *iter)
     return iter->priv->file;
 }
 
-
-void
-rstto_image_list_iter_set_position (RsttoImageListIter *iter, gint pos)
+static void
+iter_set_position (
+        RsttoImageListIter *iter,
+        gint pos,
+        gboolean sticky )
 {
     g_signal_emit (G_OBJECT (iter), rstto_image_list_iter_signals[RSTTO_IMAGE_LIST_ITER_SIGNAL_PREPARE_CHANGE], 0, NULL);
 
@@ -552,8 +572,16 @@ rstto_image_list_iter_set_position (RsttoImageListIter *iter, gint pos)
     g_signal_emit (G_OBJECT (iter), rstto_image_list_iter_signals[RSTTO_IMAGE_LIST_ITER_SIGNAL_CHANGED], 0, NULL);
 }
 
-gboolean
-rstto_image_list_iter_next (RsttoImageListIter *iter)
+void
+rstto_image_list_iter_set_position (RsttoImageListIter *iter, gint pos)
+{
+    iter_set_position ( iter, pos, TRUE );
+}
+
+static gboolean
+iter_next (
+        RsttoImageListIter *iter,
+        gboolean sticky)
 {
     GList *position = NULL;
     RsttoSettings *settings = NULL;
@@ -568,6 +596,8 @@ rstto_image_list_iter_next (RsttoImageListIter *iter)
         iter->priv->file = NULL;
     }
 
+    iter->priv->sticky = sticky;
+
     position = g_list_next (position);
     if (position)
     {
@@ -609,7 +639,15 @@ rstto_image_list_iter_next (RsttoImageListIter *iter)
 }
 
 gboolean
-rstto_image_list_iter_previous (RsttoImageListIter *iter)
+rstto_image_list_iter_next (RsttoImageListIter *iter)
+{
+    return iter_next (iter, TRUE);
+}
+
+static gboolean
+iter_previous (
+        RsttoImageListIter *iter,
+        gboolean sticky)
 {
     GList *position = NULL;
     RsttoSettings *settings = NULL;
@@ -624,6 +662,8 @@ rstto_image_list_iter_previous (RsttoImageListIter *iter)
         iter->priv->file = NULL;
     }
 
+    iter->priv->sticky = sticky;
+
     position = g_list_previous (position);
     if (position)
     {
@@ -652,6 +692,13 @@ rstto_image_list_iter_previous (RsttoImageListIter *iter)
     }
 
     return ret_val;
+
+}
+
+gboolean
+rstto_image_list_iter_previous (RsttoImageListIter *iter)
+{
+    return iter_previous (iter, TRUE);
 }
 
 RsttoImageListIter *
@@ -816,3 +863,10 @@ cb_rstto_image_list_exif_date_compare_func (RsttoFile *a, RsttoFile *b)
     }
     return 1;
 }
+
+gboolean
+rstto_image_list_iter_get_sticky (
+        RsttoImageListIter *iter)
+{
+    return iter->priv->sticky;
+}
diff --git a/src/image_list.h b/src/image_list.h
index 484cb96..8b49818 100644
--- a/src/image_list.h
+++ b/src/image_list.h
@@ -137,6 +137,10 @@ rstto_image_list_iter_find_file (RsttoImageListIter *iter, RsttoFile *file);
 
 RsttoImageListIter *rstto_image_list_iter_clone (RsttoImageListIter *iter);
 
+gboolean
+rstto_image_list_iter_get_sticky (
+        RsttoImageListIter *iter);
+
 G_END_DECLS
 
 #endif /* __RISTRETTO_IMAGE_LIST_H__ */
diff --git a/src/main_window.c b/src/main_window.c
index e8e2742..43eb66c 100644
--- a/src/main_window.c
+++ b/src/main_window.c
@@ -1709,6 +1709,7 @@ cb_rstto_main_window_navigationtoolbar_button_press_event (GtkWidget *widget, Gd
 static void
 cb_rstto_main_window_image_list_iter_changed (RsttoImageListIter *iter, RsttoMainWindow *window)
 {
+    g_debug("Sticky: %d", rstto_image_list_iter_get_sticky (iter));
     rstto_main_window_image_list_iter_changed (window);
 }
 


More information about the Xfce4-commits mailing list