[gtk/wip/otte/bitset: 7/23] listbase: Port rubberband to gtk_selection_model_set_selection()
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/otte/bitset: 7/23] listbase: Port rubberband to gtk_selection_model_set_selection()
- Date: Fri, 26 Jun 2020 04:08:58 +0000 (UTC)
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]