listitemfactory: Sanitize APIs

Make sure the APIs follow a predictable path:

setup
  bind
    rebind/update (0-N times)
  unbind
teardown

This is the first step towards providing multiple different factories.
This commit is contained in:
Benjamin Otte 2019-06-09 22:50:46 +02:00 committed by Matthias Clasen
parent 0174bf4345
commit 10b967ae1f
3 changed files with 59 additions and 17 deletions

View File

@ -71,21 +71,6 @@
* Reusing factories across different views is allowed, but very uncommon.
*/
struct _GtkListItemFactory
{
GObject parent_instance;
GtkListItemSetupFunc setup_func;
GtkListItemBindFunc bind_func;
gpointer user_data;
GDestroyNotify user_destroy;
};
struct _GtkListItemFactoryClass
{
GObjectClass parent_class;
};
G_DEFINE_TYPE (GtkListItemFactory, gtk_list_item_factory, G_TYPE_OBJECT)
static void
@ -135,7 +120,7 @@ gtk_list_item_factory_new (GtkListItemSetupFunc setup_func,
void
gtk_list_item_factory_setup (GtkListItemFactory *self,
GtkListItem *list_item)
GtkListItem *list_item)
{
g_return_if_fail (GTK_IS_LIST_ITEM_FACTORY (self));
@ -165,6 +150,28 @@ gtk_list_item_factory_bind (GtkListItemFactory *self,
g_object_thaw_notify (G_OBJECT (list_item));
}
void
gtk_list_item_factory_rebind (GtkListItemFactory *self,
GtkListItem *list_item,
guint position,
gpointer item,
gboolean selected)
{
g_return_if_fail (GTK_IS_LIST_ITEM_FACTORY (self));
g_return_if_fail (GTK_IS_LIST_ITEM (list_item));
g_object_freeze_notify (G_OBJECT (list_item));
gtk_list_item_set_item (list_item, item);
gtk_list_item_set_position (list_item, position);
gtk_list_item_set_selected (list_item, selected);
if (self->bind_func)
self->bind_func (list_item, self->user_data);
g_object_thaw_notify (G_OBJECT (list_item));
}
void
gtk_list_item_factory_update (GtkListItemFactory *self,
GtkListItem *list_item,
@ -197,3 +204,15 @@ gtk_list_item_factory_unbind (GtkListItemFactory *self,
g_object_thaw_notify (G_OBJECT (list_item));
}
void
gtk_list_item_factory_teardown (GtkListItemFactory *self,
GtkListItem *list_item)
{
g_return_if_fail (GTK_IS_LIST_ITEM_FACTORY (self));
gtk_list_item_set_child (list_item, NULL);
gtk_list_item_set_selectable (list_item, TRUE);
}

View File

@ -36,6 +36,21 @@ G_BEGIN_DECLS
typedef struct _GtkListItemFactory GtkListItemFactory;
typedef struct _GtkListItemFactoryClass GtkListItemFactoryClass;
struct _GtkListItemFactory
{
GObject parent_instance;
GtkListItemSetupFunc setup_func;
GtkListItemBindFunc bind_func;
gpointer user_data;
GDestroyNotify user_destroy;
};
struct _GtkListItemFactoryClass
{
GObjectClass parent_class;
};
GType gtk_list_item_factory_get_type (void) G_GNUC_CONST;
GtkListItemFactory * gtk_list_item_factory_new (GtkListItemSetupFunc setup_func,
@ -45,12 +60,19 @@ GtkListItemFactory * gtk_list_item_factory_new (GtkListItemSetu
void gtk_list_item_factory_setup (GtkListItemFactory *self,
GtkListItem *list_item);
void gtk_list_item_factory_teardown (GtkListItemFactory *self,
GtkListItem *list_item);
void gtk_list_item_factory_bind (GtkListItemFactory *self,
GtkListItem *list_item,
guint position,
gpointer item,
gboolean selected);
void gtk_list_item_factory_rebind (GtkListItemFactory *self,
GtkListItem *list_item,
guint position,
gpointer item,
gboolean selected);
void gtk_list_item_factory_update (GtkListItemFactory *self,
GtkListItem *list_item,
guint position,

View File

@ -1007,7 +1007,7 @@ gtk_list_item_manager_move_list_item (GtkListItemManager *self,
item = g_list_model_get_item (G_LIST_MODEL (self->model), position);
selected = gtk_selection_model_is_selected (self->model, position);
gtk_list_item_factory_bind (self->factory, GTK_LIST_ITEM (list_item), position, item, selected);
gtk_list_item_factory_rebind (self->factory, GTK_LIST_ITEM (list_item), position, item, selected);
gtk_widget_insert_after (list_item, _gtk_widget_get_parent (list_item), prev_sibling);
g_object_unref (item);
}
@ -1063,6 +1063,7 @@ gtk_list_item_manager_release_list_item (GtkListItemManager *self,
}
gtk_list_item_factory_unbind (self->factory, GTK_LIST_ITEM (item));
gtk_list_item_factory_teardown (self->factory, GTK_LIST_ITEM (item));
gtk_widget_unparent (item);
}