listitemwidget: Add a private struct

I had to rename the item property to list_item anyway, so I could just
do the next step with it.
This commit is contained in:
Benjamin Otte
2019-11-03 03:17:37 +01:00
parent 36c695513b
commit beb70382b2
2 changed files with 66 additions and 38 deletions

View File

@@ -33,26 +33,35 @@
#include "gtkwidget.h"
#include "gtkwidgetprivate.h"
typedef struct _GtkListItemWidgetPrivate GtkListItemWidgetPrivate;
struct _GtkListItemWidgetPrivate
{
GtkListItemFactory *factory;
GtkListItem *list_item;
};
enum
{
ACTIVATE_SIGNAL,
LAST_SIGNAL
};
G_DEFINE_TYPE (GtkListItemWidget, gtk_list_item_widget, GTK_TYPE_WIDGET)
G_DEFINE_TYPE_WITH_PRIVATE (GtkListItemWidget, gtk_list_item_widget, GTK_TYPE_WIDGET)
static guint signals[LAST_SIGNAL] = { 0 };
static void
gtk_list_item_widget_activate_signal (GtkListItemWidget *self)
{
if (!self->item->activatable)
GtkListItemWidgetPrivate *priv = gtk_list_item_widget_get_instance_private (self);
if (!priv->list_item->activatable)
return;
gtk_widget_activate_action (GTK_WIDGET (self),
"list.activate-item",
"u",
self->item->position);
priv->list_item->position);
}
static gboolean
@@ -60,6 +69,7 @@ gtk_list_item_widget_focus (GtkWidget *widget,
GtkDirectionType direction)
{
GtkListItemWidget *self = GTK_LIST_ITEM_WIDGET (widget);
GtkListItemWidgetPrivate *priv = gtk_list_item_widget_get_instance_private (self);
/* The idea of this function is the following:
* 1. If any child can take focus, do not ever attempt
@@ -71,11 +81,11 @@ gtk_list_item_widget_focus (GtkWidget *widget,
* activation and selection handling, but no useless widgets
* get focused and moving focus is as fast as possible.
*/
if (self->item && self->item->child)
if (priv->list_item && priv->list_item->child)
{
if (gtk_widget_get_focus_child (widget))
return FALSE;
if (gtk_widget_child_focus (self->item->child, direction))
if (gtk_widget_child_focus (priv->list_item->child, direction))
return TRUE;
}
@@ -83,7 +93,7 @@ gtk_list_item_widget_focus (GtkWidget *widget,
return FALSE;
if (!gtk_widget_get_can_focus (widget) ||
!self->item->selectable)
!priv->list_item->selectable)
return FALSE;
return gtk_widget_grab_focus (widget);
@@ -93,8 +103,9 @@ static gboolean
gtk_list_item_widget_grab_focus (GtkWidget *widget)
{
GtkListItemWidget *self = GTK_LIST_ITEM_WIDGET (widget);
GtkListItemWidgetPrivate *priv = gtk_list_item_widget_get_instance_private (self);
if (self->item->child && gtk_widget_grab_focus (self->item->child))
if (priv->list_item->child && gtk_widget_grab_focus (priv->list_item->child))
return TRUE;
return GTK_WIDGET_CLASS (gtk_list_item_widget_parent_class)->grab_focus (widget);
@@ -104,13 +115,14 @@ static void
gtk_list_item_widget_dispose (GObject *object)
{
GtkListItemWidget *self = GTK_LIST_ITEM_WIDGET (object);
GtkListItemWidgetPrivate *priv = gtk_list_item_widget_get_instance_private (self);
if (self->item)
if (priv->list_item)
{
gtk_list_item_factory_teardown (self->factory, self);
g_assert (self->item == NULL);
gtk_list_item_factory_teardown (priv->factory, self);
g_assert (priv->list_item == NULL);
}
g_clear_object (&self->factory);
g_clear_object (&priv->factory);
G_OBJECT_CLASS (gtk_list_item_widget_parent_class)->dispose (object);
}
@@ -121,9 +133,10 @@ gtk_list_item_widget_select_action (GtkWidget *widget,
GVariant *parameter)
{
GtkListItemWidget *self = GTK_LIST_ITEM_WIDGET (widget);
GtkListItemWidgetPrivate *priv = gtk_list_item_widget_get_instance_private (self);
gboolean modify, extend;
if (!self->item->selectable)
if (!priv->list_item->selectable)
return;
g_variant_get (parameter, "(bb)", &modify, &extend);
@@ -131,7 +144,7 @@ gtk_list_item_widget_select_action (GtkWidget *widget,
gtk_widget_activate_action (GTK_WIDGET (self),
"list.select-item",
"(ubb)",
self->item->position, modify, extend);
priv->list_item->position, modify, extend);
}
static void
@@ -211,21 +224,22 @@ gtk_list_item_widget_class_init (GtkListItemWidgetClass *klass)
}
static void
gtk_list_item_widget_click_gesture_pressed (GtkGestureClick *gesture,
int n_press,
double x,
double y,
GtkListItemWidget *self)
gtk_list_item_widget_click_gesture_pressed (GtkGestureClick *gesture,
int n_press,
double x,
double y,
GtkListItemWidget *self)
{
GtkListItemWidgetPrivate *priv = gtk_list_item_widget_get_instance_private (self);
GtkWidget *widget = GTK_WIDGET (self);
if (!self->item->selectable && !self->item->activatable)
if (!priv->list_item->selectable && !priv->list_item->activatable)
{
gtk_gesture_set_state (GTK_GESTURE (gesture), GTK_EVENT_SEQUENCE_DENIED);
return;
}
if (self->item->selectable)
if (priv->list_item->selectable)
{
GdkModifierType state;
GdkModifierType mask;
@@ -244,17 +258,17 @@ gtk_list_item_widget_click_gesture_pressed (GtkGestureClick *gesture,
gtk_widget_activate_action (GTK_WIDGET (self),
"list.select-item",
"(ubb)",
self->item->position, modify, extend);
priv->list_item->position, modify, extend);
}
if (self->item->activatable)
if (priv->list_item->activatable)
{
if (n_press == 2)
{
gtk_widget_activate_action (GTK_WIDGET (self),
"list.activate-item",
"u",
self->item->position);
priv->list_item->position);
}
}
@@ -270,13 +284,14 @@ gtk_list_item_widget_focus_changed_cb (GtkEventControllerKey *controller,
GtkListItemWidget *self)
{
GtkWidget *widget = GTK_WIDGET (self);
GtkListItemWidgetPrivate *priv = gtk_list_item_widget_get_instance_private (self);
if (gtk_event_controller_key_contains_focus (controller))
{
gtk_widget_activate_action (widget,
"list.scroll-to-item",
"u",
self->item->position);
priv->list_item->position);
}
}
@@ -339,10 +354,12 @@ gtk_list_item_widget_new (GtkListItemFactory *factory,
NULL);
if (factory)
{
result->factory = g_object_ref (factory);
GtkListItemWidgetPrivate *priv = gtk_list_item_widget_get_instance_private (result);
priv->factory = g_object_ref (factory);
gtk_list_item_factory_setup (factory, result);
g_assert (result->item != NULL);
g_assert (priv->list_item != NULL);
}
return GTK_WIDGET (result);
@@ -354,8 +371,10 @@ gtk_list_item_widget_update (GtkListItemWidget *self,
gpointer item,
gboolean selected)
{
if (self->factory)
gtk_list_item_factory_update (self->factory, self, position, item, selected);
GtkListItemWidgetPrivate *priv = gtk_list_item_widget_get_instance_private (self);
if (priv->factory)
gtk_list_item_factory_update (priv->factory, self, position, item, selected);
if (selected)
gtk_widget_set_state_flags (GTK_WIDGET (self), GTK_STATE_FLAG_SELECTED, FALSE);
@@ -367,7 +386,9 @@ void
gtk_list_item_widget_default_setup (GtkListItemWidget *self,
GtkListItem *list_item)
{
self->item = list_item;
GtkListItemWidgetPrivate *priv = gtk_list_item_widget_get_instance_private (self);
priv->list_item = list_item;
list_item->owner = self;
if (list_item->child)
@@ -378,9 +399,11 @@ void
gtk_list_item_widget_default_teardown (GtkListItemWidget *self,
GtkListItem *list_item)
{
g_assert (self->item == list_item);
GtkListItemWidgetPrivate *priv = gtk_list_item_widget_get_instance_private (self);
self->item = NULL;
g_assert (priv->list_item == list_item);
priv->list_item = NULL;
list_item->owner = NULL;
if (list_item->child)
@@ -416,24 +439,32 @@ gtk_list_item_widget_remove_child (GtkListItemWidget *self,
GtkListItem *
gtk_list_item_widget_get_list_item (GtkListItemWidget *self)
{
return self->item;
GtkListItemWidgetPrivate *priv = gtk_list_item_widget_get_instance_private (self);
return priv->list_item;
}
guint
gtk_list_item_widget_get_position (GtkListItemWidget *self)
{
return self->item->position;
GtkListItemWidgetPrivate *priv = gtk_list_item_widget_get_instance_private (self);
return priv->list_item->position;
}
gpointer
gtk_list_item_widget_get_item (GtkListItemWidget *self)
{
return self->item->item;
GtkListItemWidgetPrivate *priv = gtk_list_item_widget_get_instance_private (self);
return priv->list_item->item;
}
gboolean
gtk_list_item_widget_get_selected (GtkListItemWidget *self)
{
return self->item->selected;
GtkListItemWidgetPrivate *priv = gtk_list_item_widget_get_instance_private (self);
return priv->list_item->selected;
}

View File

@@ -38,9 +38,6 @@ typedef struct _GtkListItemWidgetClass GtkListItemWidgetClass;
struct _GtkListItemWidget
{
GtkWidget parent_instance;
GtkListItemFactory *factory;
GtkListItem *item;
};
struct _GtkListItemWidgetClass