From d6183e95e51d1e3807ed5150768de2426b6b8e65 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Tue, 1 Sep 2009 16:34:28 +0100 Subject: [PATCH] [layout] Add initial implementation of LayoutManager The LayoutManager class is an abstract proxy for the size requesition and size allocation process in ClutterActor. A ClutterLayoutManager sub-class must implement get_preferred_width(), get_preferred_height() and allocate(); a ClutterContainer using the LayoutManager API will then proxy the corresponding Actor virtual functions to the LayoutManager instance. This allows having a generic "blank" ClutterActor sub-class, implementing the ClutterContainer interface, which leaves only the layout management implementation to the application developers. --- clutter/Makefile.am | 2 + clutter/clutter-layout-manager.c | 180 +++++++++++++++++++++++++++++++ clutter/clutter-layout-manager.h | 92 ++++++++++++++++ clutter/clutter.h | 1 + 4 files changed, 275 insertions(+) create mode 100644 clutter/clutter-layout-manager.c create mode 100644 clutter/clutter-layout-manager.h diff --git a/clutter/Makefile.am b/clutter/Makefile.am index 05336cc2e..34fb51841 100644 --- a/clutter/Makefile.am +++ b/clutter/Makefile.am @@ -78,6 +78,7 @@ source_h = \ $(srcdir)/clutter-group.h \ $(srcdir)/clutter-interval.h \ $(srcdir)/clutter-keysyms.h \ + $(srcdir)/clutter-layout-manager.h \ $(srcdir)/clutter-list-model.h \ $(srcdir)/clutter-main.h \ $(srcdir)/clutter-media.h \ @@ -142,6 +143,7 @@ source_c = \ $(srcdir)/clutter-group.c \ $(srcdir)/clutter-id-pool.c \ $(srcdir)/clutter-interval.c \ + $(srcdir)/clutter-layout-manager.c \ $(srcdir)/clutter-list-model.c \ $(srcdir)/clutter-main.c \ clutter-marshal.c \ diff --git a/clutter/clutter-layout-manager.c b/clutter/clutter-layout-manager.c new file mode 100644 index 000000000..f9e59087f --- /dev/null +++ b/clutter/clutter-layout-manager.c @@ -0,0 +1,180 @@ +/** + * SECTION:clutter-layout-manager + * @short_description: Layout managers base class + * + * #ClutterLayoutManager is FIXME + * + * #ClutterLayoutManager is available since Clutter 1.2 + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "clutter-debug.h" +#include "clutter-layout-manager.h" +#include "clutter-marshal.h" +#include "clutter-private.h" + +#define LAYOUT_MANAGER_WARN_NOT_IMPLEMENTED(m,method) G_STMT_START { \ + GObject *_obj = G_OBJECT (m); \ + g_warning ("Layout managers of type %s do not implement " \ + "the ClutterLayoutManager::%s method", \ + G_OBJECT_TYPE_NAME (_obj), \ + (method)); } G_STMT_END + +G_DEFINE_ABSTRACT_TYPE (ClutterLayoutManager, clutter_layout_manager, G_TYPE_OBJECT); + +static void +layout_manager_real_get_preferred_width (ClutterLayoutManager *manager, + ClutterContainer *container, + gfloat for_height, + gfloat *min_width_p, + gfloat *nat_width_p) +{ + LAYOUT_MANAGER_WARN_NOT_IMPLEMENTED (manager, "get_preferred_width"); + + if (min_width_p) + *min_width_p = 0.0; + + if (nat_width_p) + *nat_width_p = 0.0; +} + +static void +layout_manager_real_get_preferred_height (ClutterLayoutManager *manager, + ClutterContainer *container, + gfloat for_width, + gfloat *min_height_p, + gfloat *nat_height_p) +{ + LAYOUT_MANAGER_WARN_NOT_IMPLEMENTED (manager, "get_preferred_height"); + + if (min_height_p) + *min_height_p = 0.0; + + if (nat_height_p) + *nat_height_p = 0.0; +} + +static void +layout_manager_real_allocate (ClutterLayoutManager *manager, + ClutterContainer *container, + const ClutterActorBox *allocation, + ClutterAllocationFlags flags) +{ + LAYOUT_MANAGER_WARN_NOT_IMPLEMENTED (manager, "allocate"); +} + +static void +clutter_layout_manager_class_init (ClutterLayoutManagerClass *klass) +{ + klass->get_preferred_width = layout_manager_real_get_preferred_width; + klass->get_preferred_height = layout_manager_real_get_preferred_height; + klass->allocate = layout_manager_real_allocate; +} + +static void +clutter_layout_manager_init (ClutterLayoutManager *manager) +{ +} + +/** + * clutter_layout_manager_get_preferred_width: + * @manager: a #ClutterLayoutManager + * @container: the #ClutterContainer using @manager + * @for_height: the height for which the width should be computed, or -1 + * @min_width_p: (out) (allow-none): return location for the minimum width + * of the layout, or %NULL + * @nat_width_p: (out) (allow-none): return location for the natural width + * of the layout, or %NULL + * + * Computes the minimum and natural widths of the @container according + * to @manager. + * + * See also clutter_actor_get_preferred_width() + * + * Since: 1.2 + */ +void +clutter_layout_manager_get_preferred_width (ClutterLayoutManager *manager, + ClutterContainer *container, + gfloat for_height, + gfloat *min_width_p, + gfloat *nat_width_p) +{ + ClutterLayoutManagerClass *klass; + + g_return_if_fail (CLUTTER_IS_LAYOUT_MANAGER (manager)); + g_return_if_fail (CLUTTER_IS_CONTAINER (container)); + + klass = CLUTTER_LAYOUT_MANAGER_GET_CLASS (manager); + klass->get_preferred_width (manager, container, for_height, + min_width_p, + nat_width_p); +} + +/** + * clutter_layout_manager_get_preferred_height: + * @manager: a #ClutterLayoutManager + * @container: the #ClutterContainer using @manager + * @for_width: the width for which the height should be computed, or -1 + * @min_height_p: (out) (allow-none): return location for the minimum height + * of the layout, or %NULL + * @nat_height_p: (out) (allow-none): return location for the natural height + * of the layout, or %NULL + * + * Computes the minimum and natural heights of the @container according + * to @manager. + * + * See also clutter_actor_get_preferred_height() + * + * Since: 1.2 + */ +void +clutter_layout_manager_get_preferred_height (ClutterLayoutManager *manager, + ClutterContainer *container, + gfloat for_width, + gfloat *min_height_p, + gfloat *nat_height_p) +{ + ClutterLayoutManagerClass *klass; + + g_return_if_fail (CLUTTER_IS_LAYOUT_MANAGER (manager)); + g_return_if_fail (CLUTTER_IS_CONTAINER (container)); + + klass = CLUTTER_LAYOUT_MANAGER_GET_CLASS (manager); + klass->get_preferred_height (manager, container, for_width, + min_height_p, + nat_height_p); +} + +/** + * clutter_layout_manager_allocate: + * @manager: a #ClutterLayoutManager + * @container: the #ClutterContainer using @manager + * @allocation: the #ClutterActorBox containing the allocated area + * of @container + * @flags: the allocation flags + * + * Allocates the children of @container given an area + * + * See also clutter_actor_allocate() + * + * Since: 1.2 + */ +void +clutter_layout_manager_allocate (ClutterLayoutManager *manager, + ClutterContainer *container, + const ClutterActorBox *allocation, + ClutterAllocationFlags flags) +{ + ClutterLayoutManagerClass *klass; + + g_return_if_fail (CLUTTER_IS_LAYOUT_MANAGER (manager)); + g_return_if_fail (CLUTTER_IS_CONTAINER (container)); + g_return_if_fail (allocation != NULL); + + klass = CLUTTER_LAYOUT_MANAGER_GET_CLASS (manager); + klass->allocate (manager, container, allocation, flags); +} diff --git a/clutter/clutter-layout-manager.h b/clutter/clutter-layout-manager.h new file mode 100644 index 000000000..f93e68a02 --- /dev/null +++ b/clutter/clutter-layout-manager.h @@ -0,0 +1,92 @@ +#if !defined(__CLUTTER_H_INSIDE__) && !defined(CLUTTER_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __CLUTTER_LAYOUT_MANAGER_H__ +#define __CLUTTER_LAYOUT_MANAGER_H__ + +#include +#include + +G_BEGIN_DECLS + +#define CLUTTER_TYPE_LAYOUT_MANAGER (clutter_layout_manager_get_type ()) +#define CLUTTER_LAYOUT_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_LAYOUT_MANAGER, ClutterLayoutManager)) +#define CLUTTER_IS_LAYOUT_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_LAYOUT_MANAGER)) +#define CLUTTER_LAYOUT_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_LAYOUT_MANAGER, ClutterLayoutManagerClass)) +#define CLUTTER_IS_LAYOUT_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_LAYOUT_MANAGER)) +#define CLUTTER_LAYOUT_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_LAYOUT_MANAGER, ClutterLayoutManagerClass)) + +typedef struct _ClutterLayoutManager ClutterLayoutManager; +typedef struct _ClutterLayoutManagerClass ClutterLayoutManagerClass; + +/** + * ClutterLayoutManager: + * + * The #ClutterLayoutManager structure contains only private data + * and should be accessed using the provided API + * + * Since: 1.2 + */ +struct _ClutterLayoutManager +{ + GObject parent_instance; +}; + +/** + * ClutterLayoutManagerClass: + * + * The #ClutterLayoutManagerClass structure contains only private + * data and should be accessed using the provided API + * + * Since: 1.2 + */ +struct _ClutterLayoutManagerClass +{ + GObjectClass parent_class; + + void (* get_preferred_width) (ClutterLayoutManager *manager, + ClutterContainer *container, + gfloat for_height, + gfloat *minimum_width_p, + gfloat *natural_width_p); + void (* get_preferred_height) (ClutterLayoutManager *manager, + ClutterContainer *container, + gfloat for_width, + gfloat *minimum_height_p, + gfloat *natural_height_p); + void (* allocate) (ClutterLayoutManager *manager, + ClutterContainer *container, + const ClutterActorBox *allocation, + ClutterAllocationFlags flags); + + void (* _clutter_padding_1) (void); + void (* _clutter_padding_2) (void); + void (* _clutter_padding_3) (void); + void (* _clutter_padding_4) (void); + void (* _clutter_padding_5) (void); + void (* _clutter_padding_6) (void); + void (* _clutter_padding_7) (void); + void (* _clutter_padding_8) (void); +}; + +GType clutter_layout_manager_get_type (void) G_GNUC_CONST; + +void clutter_layout_manager_get_preferred_width (ClutterLayoutManager *manager, + ClutterContainer *container, + gfloat for_height, + gfloat *min_width_p, + gfloat *nat_width_p); +void clutter_layout_manager_get_preferred_height (ClutterLayoutManager *manager, + ClutterContainer *container, + gfloat for_width, + gfloat *min_height_p, + gfloat *nat_height_p); +void clutter_layout_manager_allocate (ClutterLayoutManager *manager, + ClutterContainer *container, + const ClutterActorBox *allocation, + ClutterAllocationFlags flags); + +G_END_DECLS + +#endif /* __CLUTTER_LAYOUT_MANAGER_H__ */ diff --git a/clutter/clutter.h b/clutter/clutter.h index 701cf3176..95e35c252 100644 --- a/clutter/clutter.h +++ b/clutter/clutter.h @@ -54,6 +54,7 @@ #include "clutter-group.h" #include "clutter-interval.h" #include "clutter-keysyms.h" +#include "clutter-layout-manager.h" #include "clutter-list-model.h" #include "clutter-main.h" #include "clutter-media.h"