diff options
author | Emmanuele Bassi <ebassi@gnome.org> | 2013-09-04 14:27:17 +0100 |
---|---|---|
committer | Emmanuele Bassi <ebassi@gnome.org> | 2013-09-12 12:35:04 +0100 |
commit | d36338c48c350024694af457b76e9c01b4f66a73 (patch) | |
tree | c5a009208f7d437335531f00cc23ef1bd1741d9e /endless/eosflexygridcell.c | |
parent | f419efd50898862a63c9f31a61115c5b6de79fec (diff) |
Add EosFlexyGrid
A layout manager for flexible grid layouts using the same algorithm of
the Discovery Center. The UI pattern is going to be used in the app
store and other native applications, so it makes sense to have this
widget in the SDK.
Diffstat (limited to 'endless/eosflexygridcell.c')
-rw-r--r-- | endless/eosflexygridcell.c | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/endless/eosflexygridcell.c b/endless/eosflexygridcell.c new file mode 100644 index 0000000..4cc2627 --- /dev/null +++ b/endless/eosflexygridcell.c @@ -0,0 +1,204 @@ +/* Copyright 2013 Endless Mobile, Inc. */ + +#include "config.h" + +#include "eosflexygrid-private.h" + +#include <glib-object.h> +#include <gtk/gtk.h> + +EOS_DEFINE_ENUM_TYPE (EosFlexyShape, eos_flexy_shape, + EOS_ENUM_VALUE (EOS_FLEXY_SHAPE_SMALL, small) + EOS_ENUM_VALUE (EOS_FLEXY_SHAPE_MEDIUM_HORIZONTAL, medium-horizontal) + EOS_ENUM_VALUE (EOS_FLEXY_SHAPE_MEDIUM_VERTICAL, medium-vertical) + EOS_ENUM_VALUE (EOS_FLEXY_SHAPE_LARGE, large)) + +typedef struct { + EosFlexyShape shape; + + GSequenceIter *iter; + + guint selected : 1; +} EosFlexyGridCellPrivate; + +#if GLIB_CHECK_VERSION (2, 37, 5) + +# define EOS_FLEXY_GRID_CELL_GET_PRIV(obj) \ + ((EosFlexyGridCellPrivate *) eos_flexy_grid_cell_get_instance_private ((EosFlexyGridCell *) (obj))) + +G_DEFINE_TYPE_WITH_PRIVATE (EosFlexyGridCell, eos_flexy_grid_cell, GTK_TYPE_BIN) + +#else + +# define EOS_FLEXY_GRID_CELL_GET_PRIV(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EOS_TYPE_FLEXY_GRID_CELL, EosFlexyGridCellPrivate)) + +G_DEFINE_TYPE (EosFlexyGridCell, eos_flexy_grid_cell, GTK_TYPE_BIN) + +#endif /* GLIB_CHECK_VERSION (2, 37, 5) */ + +enum +{ + PROP_0, + + PROP_SHAPE, + + PROP_LAST +}; + +static GParamSpec *obj_props[PROP_LAST] = { NULL, }; + +static void +eos_flexy_grid_cell_set_property (GObject *gobject, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + EosFlexyGridCell *self = EOS_FLEXY_GRID_CELL (gobject); + + switch (prop_id) + { + case PROP_SHAPE: + eos_flexy_grid_cell_set_shape (self, g_value_get_enum (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); + } +} + +static void +eos_flexy_grid_cell_get_property (GObject *gobject, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + EosFlexyGridCell *self = EOS_FLEXY_GRID_CELL (gobject); + EosFlexyGridCellPrivate *priv = self->priv; + + switch (prop_id) + { + case PROP_SHAPE: + g_value_set_enum (value, priv->shape); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); + } +} + +static void +eos_flexy_grid_cell_class_init (EosFlexyGridCellClass *klass) +{ +#if !GLIB_CHECK_VERSION (2, 37, 6) + g_type_class_add_private (klass, sizeof (EosFlexyGridCellPrivate)); +#endif + + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + gobject_class->set_property = eos_flexy_grid_cell_set_property; + gobject_class->get_property = eos_flexy_grid_cell_get_property; + + obj_props[PROP_SHAPE] = + g_param_spec_enum ("shape", + "Shape", + "The shape of the cell", + EOS_TYPE_FLEXY_SHAPE, + EOS_FLEXY_SHAPE_SMALL, + G_PARAM_STATIC_STRINGS | + G_PARAM_READWRITE); + + g_object_class_install_properties (gobject_class, PROP_LAST, obj_props); +} + +static void +eos_flexy_grid_cell_init (EosFlexyGridCell *self) +{ + EosFlexyGridCellPrivate *priv = EOS_FLEXY_GRID_CELL_GET_PRIV (self); + + priv->shape = EOS_FLEXY_SHAPE_SMALL; + + self->priv = priv; + + GtkStyleContext *context = gtk_widget_get_style_context (GTK_WIDGET (self)); + gtk_style_context_add_class (context, EOS_STYLE_CLASS_FLEXY_GRID_CELL); +} + +GtkWidget * +eos_flexy_grid_cell_new (void) +{ + return g_object_new (EOS_TYPE_FLEXY_GRID_CELL, NULL); +} + +void +eos_flexy_grid_cell_set_shape (EosFlexyGridCell *cell, + EosFlexyShape shape) +{ + EosFlexyGridCellPrivate *priv; + + g_return_if_fail (EOS_IS_FLEXY_GRID_CELL (cell)); + + priv = cell->priv; + if (priv->shape != shape) + { + priv->shape = shape; + + g_object_notify_by_pspec (G_OBJECT (cell), obj_props[PROP_SHAPE]); + } +} + +EosFlexyShape +eos_flexy_grid_cell_get_shape (EosFlexyGridCell *cell) +{ + EosFlexyGridCellPrivate *priv; + + g_return_val_if_fail (EOS_IS_FLEXY_GRID_CELL (cell), EOS_FLEXY_SHAPE_SMALL); + + priv = cell->priv; + + return priv->shape; +} + +/*< private >*/ +void +eos_flexy_grid_cell_set_iter (EosFlexyGridCell *cell, + GSequenceIter *iter) +{ + EosFlexyGridCellPrivate *priv = cell->priv; + + priv->iter = iter; +} + +/*< private >*/ +GSequenceIter * +eos_flexy_grid_cell_get_iter (EosFlexyGridCell *cell) +{ + EosFlexyGridCellPrivate *priv = cell->priv; + + return priv->iter; +} + +/*< private >*/ +void +eos_flexy_grid_cell_set_selected (EosFlexyGridCell *cell, + gboolean selected) +{ + g_return_if_fail (EOS_IS_FLEXY_GRID_CELL (cell)); + + EosFlexyGridCellPrivate *priv = cell->priv; + + selected = !!selected; + if (priv->selected != selected) + { + priv->selected = selected; + } +} + +gboolean +eos_flexy_grid_cell_get_selected (EosFlexyGridCell *cell) +{ + g_return_val_if_fail (EOS_IS_FLEXY_GRID_CELL (cell), FALSE); + + EosFlexyGridCellPrivate *priv = cell->priv; + + return priv->selected; +} |