From efa3c517693b8eae29082c1a57fb7677bdc548e4 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sat, 11 Jan 2014 19:44:32 +0000 Subject: Separate item.h. git-svn-id: http://svn.drobilla.net/lad/trunk/ganv@5299 a436a847-0d15-0410-975c-d299462d15a1 --- ganv/item.h | 210 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 210 insertions(+) create mode 100644 ganv/item.h (limited to 'ganv/item.h') diff --git a/ganv/item.h b/ganv/item.h new file mode 100644 index 0000000..a9a8fee --- /dev/null +++ b/ganv/item.h @@ -0,0 +1,210 @@ +/* This file is part of Ganv. + * Copyright 2007-2014 David Robillard + * + * Ganv is free software: you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or any later version. + * + * Ganv is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for details. + * + * You should have received a copy of the GNU General Public License along + * with Ganv. If not, see . + */ + +/* Based on GnomeCanvas, by Federico Mena + * and Raph Levien + * Copyright 1997-2000 Free Software Foundation + */ + +#ifndef GANV_ITEM_H +#define GANV_ITEM_H + +#include + +#include +#include + +G_BEGIN_DECLS + +/** + * GanvItem: Base class for all canvas items. + * + * All canvas items are derived from GanvItem. The only information a GanvItem + * contains is its parent canvas, its parent canvas item, its bounding box in + * world coordinates, and its current affine transformation. + * + * Items inside a canvas are organized in a tree, where leaves are items + * without any children. Each canvas has a single root item, which can be + * obtained with the ganv_canvas_base_get_root() function. + * + * The abstract GanvItem class does not have any configurable or queryable + * attributes. + */ + +typedef struct _GanvItem GanvItem; +typedef struct _GanvItemClass GanvItemClass; + +/* Object flags for items */ +enum { + GANV_ITEM_REALIZED = 1 << 1, + GANV_ITEM_MAPPED = 1 << 2, + GANV_ITEM_ALWAYS_REDRAW = 1 << 3, + GANV_ITEM_VISIBLE = 1 << 4, + GANV_ITEM_NEED_UPDATE = 1 << 5, + GANV_ITEM_NEED_VIS = 1 << 6, +}; + +#define GANV_TYPE_ITEM (ganv_item_get_type()) +#define GANV_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GANV_TYPE_ITEM, GanvItem)) +#define GANV_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GANV_TYPE_ITEM, GanvItemClass)) +#define GANV_IS_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GANV_TYPE_ITEM)) +#define GANV_IS_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GANV_TYPE_ITEM)) +#define GANV_ITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GANV_TYPE_ITEM, GanvItemClass)) + +struct _GanvItem { + GtkObject object; + + /* Parent canvas for this item */ + struct _GanvCanvasBase* canvas; + + /* Parent for this item */ + GanvItem* parent; + + /* Layer (z order), higher values are on top */ + guint layer; + + /* Position in parent-relative coordinates. */ + double x, y; + + /* Bounding box for this item (in canvas coordinates) */ + double x1, y1, x2, y2; + + /* True if parent manages this item (don't call add/remove) */ + gboolean managed; +}; + +struct _GanvItemClass { + GtkObjectClass parent_class; + + /** + * Add a child to this item (optional). + */ + void (* add)(GanvItem* item, GanvItem* child); + + /** + * Remove a child from this item (optional). + */ + void (* remove)(GanvItem* item, GanvItem* child); + + /** + * Tell the item to update itself. + * + * The flags are from the update flags defined above. The item should + * update its internal state from its queued state, and recompute and + * request its repaint area. The update method also recomputes the + * bounding box of the item. + */ + void (* update)(GanvItem* item, int flags); + + /** + * Realize an item (create GCs, etc.). + */ + void (* realize)(GanvItem* item); + + /** + * Unrealize an item. + */ + void (* unrealize)(GanvItem* item); + + /** + * Map an item - normally only need by items with their own GdkWindows. + */ + void (* map)(GanvItem* item); + + /** + * Unmap an item + */ + void (* unmap)(GanvItem* item); + + /** + * Draw an item of this type. + * + * (x, y) are the upper-left canvas pixel coordinates of the drawable. + * (width, height) are the dimensions of the drawable. + */ + void (* draw)(GanvItem* item, cairo_t* cr, + int x, int y, int width, int height); + + /** + * Calculate the distance from an item to the specified point. + * + * It also returns a canvas item which is actual item the point is within, + * which may not be equal to @item if @item has children. (cx, cy) are the + * canvas pixel coordinates that correspond to the item-relative + * coordinates (x, y). + */ + double (* point)(GanvItem* item, double x, double y, int cx, int cy, + GanvItem** actual_item); + + /** + * Fetch the item's bounding box (need not be exactly tight). + * + * This should be in item-relative coordinates. + */ + void (* bounds)(GanvItem* item, double* x1, double* y1, double* x2, double* y2); + + /** + * Signal: an event occurred for an item of this type. + * + * The (x, y) coordinates are in the canvas world coordinate system. + */ + gboolean (* event)(GanvItem* item, GdkEvent* event); + + /* Reserved for future expansion */ + gpointer spare_vmethods [4]; +}; + +GType ganv_item_get_type(void) G_GNUC_CONST; + +GanvItem* ganv_item_new(GanvItem* parent, GType type, + const gchar* first_arg_name, ...); + +void ganv_item_construct(GanvItem* item, GanvItem* parent, + const gchar* first_arg_name, va_list args); + +void ganv_item_set(GanvItem* item, const gchar* first_arg_name, ...); + +void ganv_item_set_valist(GanvItem* item, + const gchar* first_arg_name, va_list args); + +void ganv_item_raise(GanvItem* item); + +void ganv_item_lower(GanvItem* item); + +void ganv_item_move(GanvItem* item, double dx, double dy); + +void ganv_item_show(GanvItem* item); + +void ganv_item_hide(GanvItem* item); + +int ganv_item_grab(GanvItem* item, unsigned int event_mask, + GdkCursor* cursor, guint32 etime); + +void ganv_item_ungrab(GanvItem* item, guint32 etime); + +void ganv_item_i2w(GanvItem* item, double* x, double* y); + +void ganv_item_w2i(GanvItem* item, double* x, double* y); + +void ganv_item_grab_focus(GanvItem* item); + +void ganv_item_get_bounds(GanvItem* item, + double* x1, double* y1, double* x2, double* y2); + +void ganv_item_request_update(GanvItem* item); + +G_END_DECLS + +#endif /* GANV_ITEM_H */ -- cgit v1.2.1