[gtk/wip/otte/bitset: 7/23] listbase: Port rubberband to gtk_selection_model_set_selection()



commit e04e553ecda37261bdf4dd5eccf7ad191084d403
Author: Benjamin Otte <otte redhat com>
Date:   Sun Jun 14 06:50:22 2020 +0200

    listbase: Port rubberband to gtk_selection_model_set_selection()

 gtk/gtklistbase.c | 55 ++++++++++++++++++++++++++++---------------------------
 1 file changed, 28 insertions(+), 27 deletions(-)
---
diff --git a/gtk/gtklistbase.c b/gtk/gtklistbase.c
index 9b33c56a53..67f04e1ccc 100644
--- a/gtk/gtklistbase.c
+++ b/gtk/gtklistbase.c
@@ -22,6 +22,7 @@
 #include "gtklistbaseprivate.h"
 
 #include "gtkadjustment.h"
+#include "gtkbitset.h"
 #include "gtkdropcontrollermotion.h"
 #include "gtkgesturedrag.h"
 #include "gtkgizmoprivate.h"
@@ -30,7 +31,6 @@
 #include "gtkmultiselection.h"
 #include "gtkorientable.h"
 #include "gtkscrollable.h"
-#include "gtkset.h"
 #include "gtksingleselection.h"
 #include "gtksnapshot.h"
 #include "gtkstylecontextprivate.h"
@@ -42,7 +42,7 @@ typedef struct _RubberbandData RubberbandData;
 struct _RubberbandData
 {
   GtkWidget *widget;
-  GtkSet *active;
+  GtkBitset *active;
   double x1, y1;
   double x2, y2;
   gboolean modify;
@@ -55,7 +55,7 @@ rubberband_data_free (gpointer data)
   RubberbandData *rdata = data;
 
   g_clear_pointer (&rdata->widget, gtk_widget_unparent);
-  g_clear_pointer (&rdata->active, gtk_set_free);
+  g_clear_pointer (&rdata->active, gtk_bitset_unref);
   g_free (rdata);
 }
 
@@ -1399,19 +1399,7 @@ gtk_list_base_start_rubberband (GtkListBase *self,
   priv->rubberband->widget = gtk_gizmo_new ("rubberband",
                                             NULL, NULL, NULL, NULL, NULL, NULL);
   gtk_widget_set_parent (priv->rubberband->widget, GTK_WIDGET (self));
-  priv->rubberband->active = gtk_set_new ();
-}
-
-static void
-range_cb (guint     position,
-          guint    *start,
-          guint    *n_items,
-          gboolean *selected,
-          gpointer  data)
-{
-  GtkSet *set = data;
-
-  gtk_set_find_range (set, position, gtk_set_get_max (set) + 1, start, n_items, selected);
+  priv->rubberband->active = gtk_bitset_new_empty ();
 }
 
 static void
@@ -1433,16 +1421,29 @@ gtk_list_base_stop_rubberband (GtkListBase *self)
     }
 
   model = gtk_list_item_manager_get_model (priv->item_manager);
-
-  if (priv->rubberband->modify)
+  if (model != NULL)
     {
-      gtk_selection_model_unselect_callback (model, range_cb, priv->rubberband->active);
-    }
-  else
-    {
-      gtk_selection_model_select_callback (model,
-                                           !priv->rubberband->extend,
-                                           range_cb, priv->rubberband->active);
+      GtkBitset *selected, *mask;
+
+      if (priv->rubberband->extend)
+        {
+          mask = gtk_bitset_ref (priv->rubberband->active);
+        }
+      else
+        {
+          mask = gtk_bitset_new_empty ();
+          gtk_bitset_add_range (mask, 0, g_list_model_get_n_items (G_LIST_MODEL (model)));
+        }
+
+      if (priv->rubberband->modify)
+        selected = gtk_bitset_new_empty ();
+      else
+        selected = gtk_bitset_ref (priv->rubberband->active);
+
+      gtk_selection_model_set_selection (model, selected, mask);
+
+      gtk_bitset_unref (selected);
+      gtk_bitset_unref (mask);
     }
 
   g_clear_pointer (&priv->rubberband, rubberband_data_free);
@@ -1497,12 +1498,12 @@ gtk_list_base_update_rubberband_selection (GtkListBase *self)
 
       if (gdk_rectangle_intersect (&rect, &alloc, &alloc))
         {
-          gtk_set_add_item (priv->rubberband->active, pos);
+          gtk_bitset_add (priv->rubberband->active, pos);
           gtk_widget_set_state_flags (item->widget, GTK_STATE_FLAG_ACTIVE, FALSE);
         }
       else
         {
-          gtk_set_remove_item (priv->rubberband->active, pos);
+          gtk_bitset_remove (priv->rubberband->active, pos);
           gtk_widget_unset_state_flags (item->widget, GTK_STATE_FLAG_ACTIVE);
         }
     }


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