/* Gnome-Streamer * Copyright (C) <1999> Erik Walthinsen * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __GST_EDITOR_H__ #define __GST_EDITOR_H__ #include #include typedef struct _GstEditor GstEditor; typedef struct _GstEditorClass GstEditorClass; typedef struct _GstEditorElement GstEditorElement; typedef struct _GstEditorElementClass GstEditorElementClass; typedef struct _GstEditorBin GstEditorBin; typedef struct _GstEditorBinClass GstEditorBinClass; typedef struct _GstEditorCanvas GstEditorCanvas; typedef struct _GstEditorCanvasClass GstEditorCanvasClass; typedef struct _GstEditorPad GstEditorPad; typedef struct _GstEditorPadClass GstEditorPadClass; typedef struct _GstEditorConnection GstEditorConnection; typedef struct _GstEditorConnectionClass GstEditorConnectionClass; #define GST_TYPE_EDITOR \ (gst_editor_get_type()) #define GST_EDITOR(obj) \ (GTK_CHECK_CAST((obj),GST_TYPE_EDITOR,GstEditor)) #define GST_EDITOR_CLASS(klass) \ (GTK_CHECK_CLASS_CAST((klass),GST_TYPE_EDITOR,GstEditorClass)) #define GST_IS_EDITOR(obj) \ (GTK_CHECK_TYPE((obj),GST_TYPE_EDITOR)) #define GST_IS_EDITOR_CLASS(obj) \ (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_EDITOR))) struct _GstEditor { GtkFrame frame; /* the actual pipeline to be associated with this thing */ GstPipeline *pipeline; /* the editor canvas */ GstEditorCanvas *canvas; /* the canvas and scrollwindow */ GtkWidget *canvaswidget; GtkWidget *scrollwindow; }; struct _GstEditorClass { GnomeCanvasClass parent_class; }; GtkType gst_editor_get_type(); GstEditor *gst_editor_new(gchar *name); #define GST_EDITOR_SET_OBJECT(item,object) \ (gtk_object_set_data(GTK_OBJECT(item),"gsteditorobject",(object))) #define GST_EDTIOR_GET_OBJECT(item) \ (gtk_object_get_data(GTK_OBJECT(item),"gsteditorobject")) #define GST_TYPE_EDITOR_ELEMENT \ (gst_editor_element_get_type()) #define GST_EDITOR_ELEMENT(obj) \ (GTK_CHECK_CAST((obj),GST_TYPE_EDITOR_ELEMENT,GstEditorElement)) #define GST_EDITOR_ELEMENT_CLASS(klass) \ (GTK_CHECK_CLASS_CAST((klass),GST_TYPE_EDITOR_ELEMENT,GstEditorElementClass)) #define GST_IS_EDITOR_ELEMENT(obj) \ (GTK_CHECK_TYPE((obj),GST_TYPE_EDITOR_ELEMENT)) #define GST_IS_EDITOR_ELEMENT_CLASS(obj) \ (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_EDITOR_ELEMENT))) #define GST_EDITOR_ELEMENT_PARENT(obj) (GST_EDITOR_ELEMENT(obj)->parent) #define GST_EDITOR_ELEMENT_GROUP(obj) (GST_EDITOR_ELEMENT(obj)->group) #define GST_EDITOR_ELEMENT_CANVAS(obj) (GST_EDITOR_ELEMENT(obj)->canvas) struct _GstEditorElement { GstObject object; /* parent object (NULL if I am the parent) */ GstEditorBin *parent; /* toplevel canvas (myself if I am the toplevel) */ GstEditorCanvas *canvas; /* the element we're associated with */ GstElement *element; /* whether we've been realized or not */ gboolean realized; /* toplevel group, must be !NULL */ GnomeCanvasGroup *group; // parent group /* visual stuff */ gdouble x,y; // center gdouble width,height; // size GnomeCanvasItem *border,*title,*resizebox; // easy ones GnomeCanvasItem *statebox[4],*statetext[4]; // GST_STATE_* GnomeCanvasItem *playbox,*playtext; // playstate gboolean states[5]; // visual states gdouble insidewidth,insideheight; // minimum space inside gdouble minwidth,minheight; // minimum size gdouble titlewidth,titleheight; // size of title gdouble statewidth,stateheight; // size of state boxes gdouble sinkwidth,sinkheight; // size of sink pads gdouble srcwidth,srcheight; // size of src pads gint sinks,srcs; // how many pads? GnomeCanvasGroup *insidegroup; // contents if any gboolean resize; // does it need resizing? /* list of pads */ GList *srcpads,*sinkpads; gboolean padlistchange; /* interaction state */ gboolean dragging,resizing,moved,hesitating; gdouble offx,offy,dragx,dragy; }; struct _GstEditorElementClass { GnomeCanvasGroupClass parent_class; void (*realize) (GstEditorElement *element); gint (*event) (GnomeCanvasItem *item,GdkEvent *event, GstEditorElement *element); gint (*button_event) (GnomeCanvasItem *item,GdkEvent *event, GstEditorElement *element); }; GtkType gst_editor_element_get_type(); GstEditorElement *gst_editor_element_new(GstEditorBin *parent, GstElement *element, const gchar *first_arg_name,...); void gst_editor_element_construct(GstEditorElement *element, GstEditorBin *parent, const gchar *first_arg_name, va_list args); void gst_editor_element_repack(GstEditorElement *element); GstEditorPad *gst_editor_element_add_pad(GstEditorElement *element, GstPad *pad); #define GST_TYPE_EDITOR_BIN \ (gst_editor_bin_get_type()) #define GST_EDITOR_BIN(obj) \ (GTK_CHECK_CAST((obj),GST_TYPE_EDITOR_BIN,GstEditorBin)) #define GST_EDITOR_BIN_CLASS(klass) \ (GTK_CHECK_CLASS_CAST((klass),GST_TYPE_EDITOR_BIN,GstEditorBin)) #define GST_IS_EDITOR_BIN(obj) \ (GTK_CHECK_TYPE((obj),GST_TYPE_EDITOR_BIN)) #define GST_IS_EDITOR_BIN_CLASS(obj) \ (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_EDITOR_BIN))) struct _GstEditorBin { GstEditorElement element; /* lists of GUI elements and connections */ GList *elements, *connections; /* connection state */ GstEditorPad *frompad; // where the drawing started from gboolean fromsrc; // are we connecting *from* a source? gboolean connecting; // if we're trying to connect right now GstEditorConnection *connection; // the connection we're operating on GstEditorPad *ghostpad; // potential ghost pad gboolean inpadregion; // is cursor in pad region }; struct _GstEditorBinClass { GstEditorElementClass parent_class; }; GtkType gst_editor_bin_get_type(); GstEditorBin *gst_editor_bin_new(GstEditorBin *parent,GstBin *bin, const gchar *first_arg_name,...); #define GST_TYPE_EDITOR_CANVAS \ (gst_editor_canvas_get_type()) #define GST_EDITOR_CANVAS(obj) \ (GTK_CHECK_CAST((obj),GST_TYPE_EDITOR_CANVAS,GstEditorCanvas)) #define GST_EDITOR_CANVAS_CLASS(klass) \ (GTK_CHECK_CLASS_CAST((klass),GST_TYPE_EDITOR_CANVAS,GstEditorCanvasClass)) #define GST_IS_EDITOR_CANVAS(obj) \ (GTK_CHECK_TYPE((obj),GST_TYPE_EDITOR_CANVAS)) #define GST_IS_EDITOR_CANVAS_CLASS(obj) \ (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_EDITOR_CANVAS))) struct _GstEditorCanvas { GstEditorBin bin; gboolean inchild; GnomeCanvas *canvas; }; struct _GstEditorCanvasClass { GnomeCanvasClass parent_class; }; GtkType gst_editor_canvas_get_type(); GstEditorCanvas *gst_editor_canvas_new(GstBin *bin, const gchar *first_arg_name,...); GtkWidget *gst_editor_canvas_get_canvas(GstEditorCanvas *canvas); void gst_editor_bin_add(GstEditorBin *parent,GstEditorElement *element); #define GST_TYPE_EDITOR_PAD \ (gst_editor_pad_get_type()) #define GST_EDITOR_PAD(obj) \ (GTK_CHECK_CAST((obj),GST_TYPE_EDITOR_PAD,GstEditorPad)) #define GST_EDITOR_PAD_CLASS(klass) \ (GTK_CHECK_CLASS_CAST((klass),GST_TYPE_EDITOR_PAD,GstEditorPadClass)) #define GST_IS_EDITOR_PAD(obj) \ (GTK_CHECK_TYPE((obj),GST_TYPE_EDITOR_PAD)) #define GST_IS_EDITOR_PAD_CLASS(obj) \ (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_EDITOR_PAD))) struct _GstEditorPad { GtkObject object; /* parent element */ GstEditorElement *parent; /* toplevel canvas */ GstEditorCanvas *canvas; /* the pad we're associated with */ GstPad *pad; /* if this is a sink (convenience) */ gboolean issrc; /* whether we've been realized or not */ gboolean realized; /* connections */ GstEditorConnection *connection; GstEditorConnection *ghostconnection; /* visual stuff */ GnomeCanvasGroup *group; GnomeCanvasItem *border,*title,*padbox; gboolean sinkpad; // is this a sink pad? gdouble x,y; // location gdouble width,height; // actual size gdouble boxwidth,boxheight; // size of pad box gboolean resize; // does it need resizing? /* interaction state */ gboolean dragging,resizing,moved; gdouble dragx,dragy; /* connection */ // GnomeCanvasItem *connection; // can't use //GstEditorConnection }; struct _GstEditorPadClass { GtkObjectClass parent_class; void (*realize) (GstEditorPad *pad); }; GtkType gst_editor_pad_get_type(); GstEditorPad *gst_editor_pad_new(GstEditorElement *parent,GstPad *pad, const gchar *first_arg_name, ...); void gst_editor_pad_construct(GstEditorPad *element, GstEditorElement *parent, const gchar *first_arg_name,va_list args); void gst_editor_pad_repack(GstEditorPad *pad); #define GST_TYPE_EDITOR_CONNECTION \ (gst_editor_connection_get_type()) #define GST_EDITOR_CONNECTION(obj) \ (GTK_CHECK_CAST((obj),GST_TYPE_EDITOR_CONNECTION,GstEditorConnection)) #define GST_EDITOR_CONNECTION_CLASS(klass) \ (GTK_CHECK_CLASS_CAST((klass),GST_TYPE_EDITOR_CONNECTION,GstEditorConnectionClass)) #define GST_IS_EDITOR_CONNECTION(obj) \ (GTK_CHECK_TYPE((obj),GST_TYPE_EDITOR_CONNECTION)) #define GST_IS_EDITOR_CONNECTION_CLASS(obj) \ (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_EDITOR_CONNECTION))) struct _GstEditorConnection { GtkObject object; /* our parent */ GstEditorElement *parent; /* the two pads we're connecting */ GstEditorPad *frompad, *topad; /* is this starting at a source (convenience) */ gboolean fromsrc; /* toplevel canvas */ GstEditorCanvas *canvas; /* whether we've been realized or not */ gboolean realized; /* are we a ghosted connection? */ gboolean ghost; /* visual stuff */ GnomeCanvasItem *line; GnomeCanvasPoints *points; gdouble x,y; // terminating point gboolean resize; // does it need resizing? }; struct _GstEditorConnectionClass { GtkObjectClass parent_class; void (*realize) (GstEditorConnection *connection); }; GtkType gst_editor_connection_get_type(); void gst_editor_connection_resize(GstEditorConnection *connection); void gst_editor_connection_set_endpoint(GstEditorConnection *connection, gdouble x,gdouble y); void gst_editor_connection_set_endpad(GstEditorConnection *connection, GstEditorPad *pad); void gst_editor_connection_connect(GstEditorConnection *connection); #endif /* __GST_EDITOR_H__ */