X-Git-Url: http://pileus.org/git/?p=grits;a=blobdiff_plain;f=src%2Fobjects%2Fgrits-object.h;h=2c11cd3ba1751d9d64a35ef42ad0e4eaa4d18e7d;hp=3060c64332a2d55366502859a9c598d0c0b10194;hb=67a63167629adc48ff31530dd58ece577f3d7460;hpb=4bef8517366b0195e321add06250e7d659434661 diff --git a/src/objects/grits-object.h b/src/objects/grits-object.h index 3060c64..2c11cd3 100644 --- a/src/objects/grits-object.h +++ b/src/objects/grits-object.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2010 Andy Spencer + * Copyright (C) 2009-2011 Andy Spencer * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -15,53 +15,125 @@ * along with this program. If not, see . */ -#ifndef __GIS_OBJECT_H__ -#define __GIS_OBJECT_H__ +#ifndef __GRITS_OBJECT_H__ +#define __GRITS_OBJECT_H__ #include #include -#include "gis-util.h" - -/* GisObject */ -#define GIS_TYPE_OBJECT (gis_object_get_type()) -#define GIS_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GIS_TYPE_OBJECT, GisObject)) -#define GIS_IS_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GIS_TYPE_OBJECT)) -#define GIS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIS_TYPE_OBJECT, GisObjectClass)) -#define GIS_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIS_TYPE_OBJECT)) -#define GIS_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIS_TYPE_OBJECT, GisObjectClass)) - -typedef struct _GisObject GisObject; -typedef struct _GisObjectClass GisObjectClass; - -struct _GisObject { - GObject parent_instance; - GisPoint center; - gboolean hidden; - gdouble lod; +#include "grits-util.h" + +/* GritsObject */ +#define GRITS_TYPE_OBJECT (grits_object_get_type()) +#define GRITS_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GRITS_TYPE_OBJECT, GritsObject)) +#define GRITS_IS_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GRITS_TYPE_OBJECT)) +#define GRITS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GRITS_TYPE_OBJECT, GritsObjectClass)) +#define GRITS_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GRITS_TYPE_OBJECT)) +#define GRITS_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GRITS_TYPE_OBJECT, GritsObjectClass)) + +/* Bitmask of things to skip while drawing the object */ +#define GRITS_SKIP_LOD (1<<0) +#define GRITS_SKIP_HORIZON (1<<1) +#define GRITS_SKIP_CENTER (1<<2) +#define GRITS_SKIP_STATE (1<<3) + +/* Mouse move threshold for clicking */ +#define GRITS_CLICK_THRESHOLD 8 + +/* Picking states */ +typedef struct { + guint picked : 1; + guint selected : 1; + guint clicking : 6; +} GritsState; + +typedef struct _GritsObject GritsObject; +typedef struct _GritsObjectClass GritsObjectClass; + +#include "grits-opengl.h" +struct _GritsObject { + GObject parent_instance; + GritsViewer *viewer; // The viewer the object was added to + gpointer ref; // Reference for objects that have been added + GritsPoint center; // Center of the object + gboolean hidden; // If true, the object will not be drawn + gdouble lod; // Level of detail, used to hide small objects + guint32 skip; // Bit mask of safe operations + + GritsState state; // Internal, used for picking + GdkCursor *cursor; // Internal, cached cursor }; -#include "gis-opengl.h" -struct _GisObjectClass { +struct _GritsObjectClass { GObjectClass parent_class; /* Move some of these to GObject? */ - void (*draw) (GisObject *object, GisOpenGL *opengl); + void (*draw) (GritsObject *object, GritsOpenGL *opengl); + void (*pick) (GritsObject *object, GritsOpenGL *opengl); + void (*hide) (GritsObject *object, gboolean hidden); }; -GType gis_object_get_type(void); +GType grits_object_get_type(void); /* Implemented by sub-classes */ -void gis_object_draw(GisObject *object, GisOpenGL *opengl); +void grits_object_draw(GritsObject *object, GritsOpenGL *opengl); + +void grits_object_hide(GritsObject *object, gboolean hidden); + +/* Interal, used by grits_opengl */ +void grits_object_pick(GritsObject *object, GritsOpenGL *opengl); +gboolean grits_object_set_pointer(GritsObject *object, GdkEvent *event, gboolean selected); +gboolean grits_object_event(GritsObject *object, GdkEvent *event); + +/** + * grits_object_queue_draw: + * @object: The #GritsObject that needs drawing + * + * Cause the widget to be redrawn on the screen at some later point + */ +void grits_object_queue_draw(GritsObject *object); + +/** + * grits_object_set_cursor: + * @object: The #GritsObject to set the cursor for + * @cursor: The cursor to use when the object is hovered over + * + * Causes the cursor to use a particular icon when located over a given object + */ +void grits_object_set_cursor(GritsObject *object, GdkCursorType cursor); + +/** + * grits_object_destroy: + * @object: The #GritsObject to destroy + * + * Removes the widget from it's current viewer (if it has one) and decrements + * it's reference count. + */ +void grits_object_destroy(GritsObject *object); + +/** + * grits_object_destroy_pointer: + * @object: The pointer to the #GritsObject to destroy + * + * This functions the same as grits_object_destroy, except that the location of + * the object is set to null before proceeding. + */ +#define grits_object_destroy_pointer(object) ({ \ + if (*object) { \ + GritsObject *tmp = GRITS_OBJECT(*object); \ + *object = NULL; \ + grits_object_destroy(tmp); \ + } \ +}) /** - * gis_object_center: - * @object: The #GisObject to get the center of + * grits_object_center: + * @object: The #GritsObject to get the center of * - * Get the #GisPoint representing the center of an object + * Get the #GritsPoint representing the center of an object * * Returns: the center point */ -#define gis_object_center(object) \ - (&GIS_OBJECT(object)->center) +#define grits_object_center(object) \ + (&GRITS_OBJECT(object)->center) #endif