#include <gtk/gtkcellrenderer.h>
#include <gtk/gtkwidget.h>
#include <gtk/gtktreemodel.h>
-#include <gtk/gtkcellareaiter.h>
G_BEGIN_DECLS
typedef struct _GtkCellArea GtkCellArea;
typedef struct _GtkCellAreaClass GtkCellAreaClass;
typedef struct _GtkCellAreaPrivate GtkCellAreaPrivate;
+typedef struct _GtkCellAreaContext GtkCellAreaContext;
+
+/**
+ * GTK_CELL_AREA_WARN_INVALID_CELL_PROPERTY_ID:
+ * @object: the #GObject on which set_cell_property() or get_get_property()
+ * was called
+ * @property_id: the numeric id of the property
+ * @pspec: the #GParamSpec of the property
+ *
+ * This macro should be used to emit a standard warning about unexpected
+ * properties in set_cell_property() and get_cell_property() implementations.
+ */
+#define GTK_CELL_AREA_WARN_INVALID_CELL_PROPERTY_ID(object, property_id, pspec) \
+ G_OBJECT_WARN_INVALID_PSPEC ((object), "cell property id", (property_id), (pspec))
/**
* GtkCellCallback:
* @data: user-supplied data
*
* The type of the callback functions used for iterating over
- * the cell renderers of a #GtkCellArea, see gtk_cell_area_forall().
+ * the cell renderers of a #GtkCellArea, see gtk_cell_area_foreach().
+ *
+ * Return value: %TRUE to stop iterating over cells.
+ */
+typedef gboolean (*GtkCellCallback) (GtkCellRenderer *renderer,
+ gpointer data);
+
+/**
+ * GtkCellAllocCallback:
+ * @renderer: the cell renderer to operate on
+ * @cell_area: the area allocated to @renderer inside the rectangle provided to gtk_cell_area_foreach_alloc().
+ * @data: user-supplied data
+ *
+ * The type of the callback functions used for iterating over
+ * the cell renderers and their allocated areas inside a #GtkCellArea,
+ * see gtk_cell_area_foreach_alloc().
+ *
+ * Return value: %TRUE to stop iterating over cells.
*/
-typedef void (*GtkCellCallback) (GtkCellRenderer *renderer,
- gpointer data);
+typedef gboolean (*GtkCellAllocCallback) (GtkCellRenderer *renderer,
+ const GdkRectangle *cell_area,
+ gpointer data);
struct _GtkCellArea
{
+ /*< private >*/
GInitiallyUnowned parent_instance;
GtkCellAreaPrivate *priv;
};
+
+/**
+ * GtkCellAreaClass:
+ * @add: adds a #GtkCellRenderer to the area.
+ * @remove: removes a #GtkCellRenderer from the area.
+ * @foreach: Calls the #GtkCellCallback function on every #GtkCellRenderer in the area
+ * with the provided user data until the callback returns %TRUE.
+ * @foreach_alloc: Calls the #GtkCellAllocCallback function on every #GtkCellRenderer in the area
+ * with the allocated area for the cell and the provided user data until the callback returns %TRUE.
+ * @event: Handle an event in the area, this is generally used to activate a cell
+ * at the event location for button events but can also be used to generically pass
+ * events to #GtkWidgets drawn onto the area.
+ * @render: Actually render the area's cells to the specified rectangle, @background_area
+ * should be correctly distributed to the cells coresponding background areas.
+ * @apply_attributes: Apply the cell attributes to the cells. This is implemented as a signal and
+ * generally #GtkCellArea subclasses dont need to implement this since it's handled by the base
+ * class but can be overridden to apply some custom attributes.
+ * @create_context: Creates and returns a class specific #GtkCellAreaContext to store cell
+ * alignment and allocation details for a said #GtkCellArea class.
+ * @get_request_mode: This allows an area to tell its layouting widget whether it prefers to
+ * be allocated in %GTK_SIZE_REQUEST_HEIGHT_FOR_WIDTH or %GTK_SIZE_REQUEST_WIDTH_FOR_HEIGHT mode.
+ * @get_preferred_width: Calculates the minimum and natural width of the area's cells
+ * with the current attributes applied while considering the particular layouting details
+ * of the said #GtkCellArea. While requests are performed over a series of rows, alignments
+ * and overall minimum and natural sizes should be stored in the corresponding #GtkCellAreaContext.
+ * @get_preferred_height_for_width: Calculates the minimum and natural height for the area
+ * if the passed @context would be allocated the given width. When implementing this virtual
+ * method it is safe to assume that @context has already stored the aligned cell widths
+ * for every #GtkTreeModel row that @context will be allocated for since this information
+ * was stored at #GtkCellAreaClass.get_preferred_width() time. This virtual method should
+ * also store any necessary alignments of cell heights for the case that the context is
+ * allocated a height.
+ * @get_preferred_height: Calculates the minimum and natural height of the area's cells
+ * with the current attributes applied. Essentially this is the same as
+ * #GtkCellAreaClass.get_preferred_width() only for areas that are being requested as
+ * %GTK_SIZE_REQUEST_WIDTH_FOR_HEIGHT.
+ * @get_preferred_width_for_height: Calculates the minimum and natural width for the area
+ * if the passed @context would be allocated the given height. The same as
+ * #GtkCellAreaClass.get_preferred_height_for_width() only for handling requests in the
+ * %GTK_SIZE_REQUEST_WIDTH_FOR_HEIGHT mode.
+ * @set_cell_property: This should be implemented to handle changes in child cell properties
+ * for a given #GtkCellRenderer that were previously installed on the #GtkCellAreaClass with
+ * gtk_cell_area_class_install_cell_property().
+ * @get_cell_property: This should be implemented to report the values of child cell properties
+ * for a given child #GtkCellRenderer.
+ * @focus: This virtual method should be implemented to navigate focus from cell to cell
+ * inside the #GtkCellArea. The #GtkCellArea should move focus from cell to cell inside
+ * the area and return %FALSE if focus logically leaves the area with the following exceptions:
+ * When the area contains no activatable cells, the entire area recieves focus. Focus should not
+ * be given to cells that are actually "focus siblings" of other sibling cells
+ * (see gtk_cell_area_get_focus_from_sibling()). Focus is set by calling gtk_cell_area_set_focus_cell().
+ * @is_activatable: Returns whether the #GtkCellArea can respond to #GtkCellAreaClass.activate(),
+ * usually this does not need to be implemented since the base class takes care of this however
+ * it can be enhanced if the #GtkCellArea subclass can handle activation in other ways than
+ * activating its #GtkCellRenderers.
+ * @activate: This is called when the layouting widget rendering the #GtkCellArea activates
+ * the focus cell (see gtk_cell_area_get_focus_cell()).
+ */
struct _GtkCellAreaClass
{
+ /*< private >*/
GInitiallyUnownedClass parent_class;
- /* vtable - not signals */
+ /*< public >*/
/* Basic methods */
void (* add) (GtkCellArea *area,
GtkCellRenderer *renderer);
void (* remove) (GtkCellArea *area,
GtkCellRenderer *renderer);
- void (* forall) (GtkCellArea *area,
+ void (* foreach) (GtkCellArea *area,
GtkCellCallback callback,
gpointer callback_data);
+ void (* foreach_alloc) (GtkCellArea *area,
+ GtkCellAreaContext *context,
+ GtkWidget *widget,
+ const GdkRectangle *cell_area,
+ GtkCellAllocCallback callback,
+ gpointer callback_data);
gint (* event) (GtkCellArea *area,
+ GtkCellAreaContext *context,
GtkWidget *widget,
GdkEvent *event,
- const GdkRectangle *cell_area);
+ const GdkRectangle *cell_area,
+ GtkCellRendererState flags);
void (* render) (GtkCellArea *area,
- cairo_t *cr,
+ GtkCellAreaContext *context,
GtkWidget *widget,
- const GdkRectangle *cell_area);
+ cairo_t *cr,
+ const GdkRectangle *background_area,
+ const GdkRectangle *cell_area,
+ GtkCellRendererState flags,
+ gboolean paint_focus);
+ void (* apply_attributes) (GtkCellArea *area,
+ GtkTreeModel *tree_model,
+ GtkTreeIter *iter,
+ gboolean is_expander,
+ gboolean is_expanded);
/* Geometry */
- GtkCellAreaIter *(* create_iter) (GtkCellArea *area);
+ GtkCellAreaContext *(* create_context) (GtkCellArea *area);
GtkSizeRequestMode (* get_request_mode) (GtkCellArea *area);
void (* get_preferred_width) (GtkCellArea *area,
- GtkCellAreaIter *iter,
+ GtkCellAreaContext *context,
GtkWidget *widget,
- gint *minimum_size,
- gint *natural_size);
+ gint *minimum_width,
+ gint *natural_width);
void (* get_preferred_height_for_width) (GtkCellArea *area,
- GtkCellAreaIter *iter,
+ GtkCellAreaContext *context,
GtkWidget *widget,
gint width,
gint *minimum_height,
gint *natural_height);
void (* get_preferred_height) (GtkCellArea *area,
- GtkCellAreaIter *iter,
+ GtkCellAreaContext *context,
GtkWidget *widget,
- gint *minimum_size,
- gint *natural_size);
+ gint *minimum_height,
+ gint *natural_height);
void (* get_preferred_width_for_height) (GtkCellArea *area,
- GtkCellAreaIter *iter,
+ GtkCellAreaContext *context,
GtkWidget *widget,
gint height,
gint *minimum_width,
gint *natural_width);
+ /* Cell Properties */
+ void (* set_cell_property) (GtkCellArea *area,
+ GtkCellRenderer *renderer,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec);
+ void (* get_cell_property) (GtkCellArea *area,
+ GtkCellRenderer *renderer,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec);
+
+ /* Focus */
+ gboolean (* focus) (GtkCellArea *area,
+ GtkDirectionType direction);
+ gboolean (* is_activatable) (GtkCellArea *area);
+ gboolean (* activate) (GtkCellArea *area,
+ GtkCellAreaContext *context,
+ GtkWidget *widget,
+ const GdkRectangle *cell_area,
+ GtkCellRendererState flags);
+
+ /*< private >*/
/* Padding for future expansion */
void (*_gtk_reserved1) (void);
void (*_gtk_reserved8) (void);
};
-GType gtk_cell_area_get_type (void) G_GNUC_CONST;
+GType gtk_cell_area_get_type (void) G_GNUC_CONST;
/* Basic methods */
-void gtk_cell_area_add (GtkCellArea *area,
- GtkCellRenderer *renderer);
-void gtk_cell_area_remove (GtkCellArea *area,
- GtkCellRenderer *renderer);
-void gtk_cell_area_forall (GtkCellArea *area,
- GtkCellCallback callback,
- gpointer callback_data);
-gint gtk_cell_area_event (GtkCellArea *area,
- GtkWidget *widget,
- GdkEvent *event,
- const GdkRectangle *cell_area);
-void gtk_cell_area_render (GtkCellArea *area,
- cairo_t *cr,
- GtkWidget *widget,
- const GdkRectangle *cell_area);
+void gtk_cell_area_add (GtkCellArea *area,
+ GtkCellRenderer *renderer);
+void gtk_cell_area_remove (GtkCellArea *area,
+ GtkCellRenderer *renderer);
+gboolean gtk_cell_area_has_renderer (GtkCellArea *area,
+ GtkCellRenderer *renderer);
+void gtk_cell_area_foreach (GtkCellArea *area,
+ GtkCellCallback callback,
+ gpointer callback_data);
+void gtk_cell_area_foreach_alloc (GtkCellArea *area,
+ GtkCellAreaContext *context,
+ GtkWidget *widget,
+ const GdkRectangle *cell_area,
+ GtkCellAllocCallback callback,
+ gpointer callback_data);
+gint gtk_cell_area_event (GtkCellArea *area,
+ GtkCellAreaContext *context,
+ GtkWidget *widget,
+ GdkEvent *event,
+ const GdkRectangle *cell_area,
+ GtkCellRendererState flags);
+void gtk_cell_area_render (GtkCellArea *area,
+ GtkCellAreaContext *context,
+ GtkWidget *widget,
+ cairo_t *cr,
+ const GdkRectangle *background_area,
+ const GdkRectangle *cell_area,
+ GtkCellRendererState flags,
+ gboolean paint_focus);
+void gtk_cell_area_set_style_detail (GtkCellArea *area,
+ const gchar *detail);
+G_CONST_RETURN gchar *gtk_cell_area_get_style_detail (GtkCellArea *area);
+
+
+void gtk_cell_area_get_cell_allocation (GtkCellArea *area,
+ GtkCellAreaContext *context,
+ GtkWidget *widget,
+ GtkCellRenderer *renderer,
+ const GdkRectangle *cell_area,
+ GdkRectangle *allocation);
+GtkCellRenderer *gtk_cell_area_get_cell_at_position (GtkCellArea *area,
+ GtkCellAreaContext *context,
+ GtkWidget *widget,
+ const GdkRectangle *cell_area,
+ gint x,
+ gint y,
+ GdkRectangle *alloc_area);
+
/* Geometry */
-GtkCellAreaIter *gtk_cell_area_create_iter (GtkCellArea *area);
-GtkSizeRequestMode gtk_cell_area_get_request_mode (GtkCellArea *area);
-void gtk_cell_area_get_preferred_width (GtkCellArea *area,
- GtkCellAreaIter *iter,
- GtkWidget *widget,
- gint *minimum_size,
- gint *natural_size);
-void gtk_cell_area_get_preferred_height_for_width (GtkCellArea *area,
- GtkCellAreaIter *iter,
- GtkWidget *widget,
- gint width,
- gint *minimum_height,
- gint *natural_height);
-void gtk_cell_area_get_preferred_height (GtkCellArea *area,
- GtkCellAreaIter *iter,
- GtkWidget *widget,
- gint *minimum_size,
- gint *natural_size);
-void gtk_cell_area_get_preferred_width_for_height (GtkCellArea *area,
- GtkCellAreaIter *iter,
- GtkWidget *widget,
- gint height,
- gint *minimum_width,
- gint *natural_width);
-
-
-/* Following apis are not class virtual methods */
-void gtk_cell_area_apply_attributes (GtkCellArea *area,
- GtkTreeModel *tree_model,
- GtkTreeIter *iter);
-void gtk_cell_area_attribute_connect (GtkCellArea *area,
- GtkCellRenderer *renderer,
- const gchar *attribute,
- gint column);
-void gtk_cell_area_attribute_disconnect (GtkCellArea *area,
- GtkCellRenderer *renderer,
- const gchar *attribute);
+GtkCellAreaContext *gtk_cell_area_create_context (GtkCellArea *area);
+GtkSizeRequestMode gtk_cell_area_get_request_mode (GtkCellArea *area);
+void gtk_cell_area_get_preferred_width (GtkCellArea *area,
+ GtkCellAreaContext *context,
+ GtkWidget *widget,
+ gint *minimum_size,
+ gint *natural_size);
+void gtk_cell_area_get_preferred_height_for_width (GtkCellArea *area,
+ GtkCellAreaContext *context,
+ GtkWidget *widget,
+ gint width,
+ gint *minimum_height,
+ gint *natural_height);
+void gtk_cell_area_get_preferred_height (GtkCellArea *area,
+ GtkCellAreaContext *context,
+ GtkWidget *widget,
+ gint *minimum_size,
+ gint *natural_size);
+void gtk_cell_area_get_preferred_width_for_height (GtkCellArea *area,
+ GtkCellAreaContext *context,
+ GtkWidget *widget,
+ gint height,
+ gint *minimum_width,
+ gint *natural_width);
+G_CONST_RETURN gchar *gtk_cell_area_get_current_path_string (GtkCellArea *area);
+
+
+/* Attributes */
+void gtk_cell_area_apply_attributes (GtkCellArea *area,
+ GtkTreeModel *tree_model,
+ GtkTreeIter *iter,
+ gboolean is_expander,
+ gboolean is_expanded);
+void gtk_cell_area_attribute_connect (GtkCellArea *area,
+ GtkCellRenderer *renderer,
+ const gchar *attribute,
+ gint column);
+void gtk_cell_area_attribute_disconnect (GtkCellArea *area,
+ GtkCellRenderer *renderer,
+ const gchar *attribute);
+
+/* Cell Properties */
+void gtk_cell_area_class_install_cell_property (GtkCellAreaClass *aclass,
+ guint property_id,
+ GParamSpec *pspec);
+GParamSpec* gtk_cell_area_class_find_cell_property (GtkCellAreaClass *aclass,
+ const gchar *property_name);
+GParamSpec** gtk_cell_area_class_list_cell_properties (GtkCellAreaClass *aclass,
+ guint *n_properties);
+void gtk_cell_area_add_with_properties (GtkCellArea *area,
+ GtkCellRenderer *renderer,
+ const gchar *first_prop_name,
+ ...) G_GNUC_NULL_TERMINATED;
+void gtk_cell_area_cell_set (GtkCellArea *area,
+ GtkCellRenderer *renderer,
+ const gchar *first_prop_name,
+ ...) G_GNUC_NULL_TERMINATED;
+void gtk_cell_area_cell_get (GtkCellArea *area,
+ GtkCellRenderer *renderer,
+ const gchar *first_prop_name,
+ ...) G_GNUC_NULL_TERMINATED;
+void gtk_cell_area_cell_set_valist (GtkCellArea *area,
+ GtkCellRenderer *renderer,
+ const gchar *first_property_name,
+ va_list var_args);
+void gtk_cell_area_cell_get_valist (GtkCellArea *area,
+ GtkCellRenderer *renderer,
+ const gchar *first_property_name,
+ va_list var_args);
+void gtk_cell_area_cell_set_property (GtkCellArea *area,
+ GtkCellRenderer *renderer,
+ const gchar *property_name,
+ const GValue *value);
+void gtk_cell_area_cell_get_property (GtkCellArea *area,
+ GtkCellRenderer *renderer,
+ const gchar *property_name,
+ GValue *value);
+
+/* Focus */
+gboolean gtk_cell_area_is_activatable (GtkCellArea *area);
+gboolean gtk_cell_area_activate (GtkCellArea *area,
+ GtkCellAreaContext *context,
+ GtkWidget *widget,
+ const GdkRectangle *cell_area,
+ GtkCellRendererState flags);
+gboolean gtk_cell_area_focus (GtkCellArea *area,
+ GtkDirectionType direction);
+void gtk_cell_area_set_focus_cell (GtkCellArea *area,
+ GtkCellRenderer *renderer);
+GtkCellRenderer *gtk_cell_area_get_focus_cell (GtkCellArea *area);
+
+
+/* Focus siblings */
+void gtk_cell_area_add_focus_sibling (GtkCellArea *area,
+ GtkCellRenderer *renderer,
+ GtkCellRenderer *sibling);
+void gtk_cell_area_remove_focus_sibling (GtkCellArea *area,
+ GtkCellRenderer *renderer,
+ GtkCellRenderer *sibling);
+gboolean gtk_cell_area_is_focus_sibling (GtkCellArea *area,
+ GtkCellRenderer *renderer,
+ GtkCellRenderer *sibling);
+G_CONST_RETURN GList *gtk_cell_area_get_focus_siblings (GtkCellArea *area,
+ GtkCellRenderer *renderer);
+GtkCellRenderer *gtk_cell_area_get_focus_from_sibling (GtkCellArea *area,
+ GtkCellRenderer *renderer);
+
+/* Cell Activation/Editing */
+GtkCellRenderer *gtk_cell_area_get_edited_cell (GtkCellArea *area);
+GtkCellEditable *gtk_cell_area_get_edit_widget (GtkCellArea *area);
+gboolean gtk_cell_area_activate_cell (GtkCellArea *area,
+ GtkWidget *widget,
+ GtkCellRenderer *renderer,
+ GdkEvent *event,
+ const GdkRectangle *cell_area,
+ GtkCellRendererState flags);
+void gtk_cell_area_stop_editing (GtkCellArea *area,
+ gboolean canceled);
+
+/* Functions for area implementations */
+
+/* Distinguish the inner cell area from the whole requested area including margins */
+void gtk_cell_area_inner_cell_area (GtkCellArea *area,
+ GtkWidget *widget,
+ const GdkRectangle *cell_area,
+ GdkRectangle *inner_area);
+/* Request the size of a cell while respecting the cell margins (requests are margin inclusive) */
+void gtk_cell_area_request_renderer (GtkCellArea *area,
+ GtkCellRenderer *renderer,
+ GtkOrientation orientation,
+ GtkWidget *widget,
+ gint for_size,
+ gint *minimum_size,
+ gint *natural_size);
G_END_DECLS