From: Andy W. <wi...@us...> - 2002-04-29 01:14:55
|
CVS Root: /cvsroot/gstreamer Module: gst-editor Changes by: wingo Date: Sun Apr 28 2002 18:14:55 PDT Log message: some work on gst-launch-gui, and a bit of refactoring there is some really bad windowing problem that needs fixoring Modified files: libs/gst/editor : gsteditorelement.c gsteditorpad.c libs/gst/element-browser: Makefile.am browser.c browser.h Added files: libs/gst/element-browser: caps-tree.c caps-tree.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-editor/libs/gst/editor/gsteditorelement.c.diff?r1=1.12&r2=1.13 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-editor/libs/gst/editor/gsteditorpad.c.diff?r1=1.8&r2=1.9 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-editor/libs/gst/element-browser/Makefile.am.diff?r1=1.1&r2=1.2 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-editor/libs/gst/element-browser/browser.c.diff?r1=1.1&r2=1.2 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-editor/libs/gst/element-browser/browser.h.diff?r1=1.1&r2=1.2 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-editor/libs/gst/element-browser/caps-tree.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-editor/libs/gst/element-browser/caps-tree.h?rev=1.1&content-type=text/vnd.viewcvs-markup ====Begin Diffs==== Index: gsteditorelement.c =================================================================== RCS file: /cvsroot/gstreamer/gst-editor/libs/gst/editor/gsteditorelement.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- gsteditorelement.c 26 Apr 2002 15:03:30 -0000 1.12 +++ gsteditorelement.c 29 Apr 2002 01:14:42 -0000 1.13 @@ -418,6 +418,8 @@ element = GST_EDITOR_ELEMENT (item); + g_print ("element repack %p\n", item); + if (G_OBJECT_TYPE (item) == GST_TYPE_EDITOR_ELEMENT) gst_editor_element_resize(element); @@ -475,6 +477,7 @@ l = element->srcpads; while (l) { subitem = GNOME_CANVAS_ITEM (l->data); + g_print ("p x=%f, y=%f \n", x2 - GST_EDITOR_ITEM (subitem)->width, y2 - 2.0 - element->stateheight - (element->srcheight * srcs)); gnome_canvas_item_set (subitem, "x", x2 - GST_EDITOR_ITEM (subitem)->width, "y", y2 - 2.0 - element->stateheight - (element->srcheight * srcs), @@ -485,6 +488,7 @@ l = element->srcpadtemps; while (l) { subitem = GNOME_CANVAS_ITEM (l->data); + g_print ("pt x=%f, y=%f \n", x2 - GST_EDITOR_ITEM (subitem)->width, y2 - 2.0 - element->stateheight - (element->srcheight * srcs)); gnome_canvas_item_set (subitem, "x", x2 - GST_EDITOR_ITEM (subitem)->width, "y", y2 - 2.0 - element->stateheight - (element->srcheight * srcs), Index: gsteditorpad.c =================================================================== RCS file: /cvsroot/gstreamer/gst-editor/libs/gst/editor/gsteditorpad.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- gsteditorpad.c 26 Apr 2002 15:03:30 -0000 1.8 +++ gsteditorpad.c 29 Apr 2002 01:14:42 -0000 1.9 @@ -152,6 +152,7 @@ } item->outline_color = 0x0; + g_print ("new pad or template instance %p\n", pad); } static void @@ -164,6 +165,8 @@ pad = GST_EDITOR_PAD_PARENT (citem); g_return_if_fail (item->object != NULL); + + g_print ("realizing pad %p\n", citem); if (GNOME_CANVAS_ITEM_CLASS (parent_class)->realize) GNOME_CANVAS_ITEM_CLASS (parent_class)->realize (citem); Index: Makefile.am =================================================================== RCS file: /cvsroot/gstreamer/gst-editor/libs/gst/element-browser/Makefile.am,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- Makefile.am 22 Apr 2002 18:56:09 -0000 1.1 +++ Makefile.am 29 Apr 2002 01:14:42 -0000 1.2 @@ -1,10 +1,11 @@ lib_LTLIBRARIES = libgstelementbrowser.la libgstelementbrowser_la_SOURCES = \ - browser.c + browser.c \ + caps-tree.c libgstelementbrowser_la_CFLAGS = $(GST_EDITOR_CFLAGS) libgstelementbrowser_la_LDFLAGS = $(GST_EDITOR_LIBS) libgstelementbrowserincludedir = $(includedir)/gst/element-browser -libgstelementbrowserinclude_HEADERS = browser.h +libgstelementbrowserinclude_HEADERS = browser.h caps-tree.h Index: browser.c =================================================================== RCS file: /cvsroot/gstreamer/gst-editor/libs/gst/element-browser/browser.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- browser.c 22 Apr 2002 18:56:09 -0000 1.1 +++ browser.c 29 Apr 2002 01:14:42 -0000 1.2 @@ -20,6 +20,13 @@ #include "browser.h" + +struct element_select_classlist { + gchar *name; + GSList *subclasses; + GSList *factories; +}; + enum { NAME_COLUMN, @@ -28,37 +35,230 @@ NUM_COLUMNS }; +static void gst_element_browser_init (GstElementBrowser *browser); +static void gst_element_browser_class_init (GstElementBrowserClass *browser); -struct element_select_classlist { - gchar *name; - GSList *subclasses; - GSList *factories; -}; +static gint compare_name (gconstpointer a, gconstpointer b); +static gint compare_str (gconstpointer a, gconstpointer b); +static gint compare_classes (gconstpointer a, gconstpointer b); -struct element_select_details { - GstElementFactory *factory; - GtkWidget *longname, *description, *version, *author, *copyright; -}; +static void populate_store (GtkTreeStore *store, + GtkTreeIter *parent, + struct element_select_classlist *class); +static gboolean tree_select_function (GtkTreeSelection *selection, + GtkTreeModel *model, + GtkTreePath *path, gboolean foo, + gpointer data); +static void tree_select (GtkTreeSelection *selection, + GstElementBrowser *browser); +static GSList* get_class_tree (void); -static gint compare_name(gconstpointer a,gconstpointer b) { - return (strcmp(GST_OBJECT_NAME (a), - GST_OBJECT_NAME (b))); + +static GnomeDialogClass *parent_class = NULL; + + +GType +gst_element_browser_get_type (void) +{ + static GType element_browser_type = 0; + + if (!element_browser_type) { + static const GTypeInfo element_browser_info = { + sizeof(GstElementBrowserClass), + NULL, + NULL, + (GClassInitFunc)gst_element_browser_class_init, + NULL, + NULL, + sizeof(GstElementBrowser), + 0, + (GInstanceInitFunc)gst_element_browser_init, + }; + element_browser_type = g_type_register_static (gnome_dialog_get_type (), "GstElementBrowser", &element_browser_info, 0); + } + return element_browser_type; } -static gint str_compare(gconstpointer a,gconstpointer b) { - return (strcmp((gchar *)a,(gchar *)b)); +static void +gst_element_browser_class_init (GstElementBrowserClass *klass) +{ + parent_class = (GnomeDialogClass*) g_type_class_ref (gnome_dialog_get_type ()); } -/* compare two classes, used for GSList sorting */ -static gint compare_classes (gconstpointer a, gconstpointer b) +static void gst_element_browser_init (GstElementBrowser *browser) { - struct element_select_classlist *A = (struct element_select_classlist *) a; - struct element_select_classlist *B = (struct element_select_classlist *) b; - return (strcmp ((gchar *) A->name, (gchar *) B->name)); + GnomeDialog *dialog; + GtkWidget *treeview; + GtkTreeStore *store; + GtkTreeIter iter; + GtkTreeViewColumn *column; + GtkWidget *scroller; + GtkTable *table; + GtkWidget *vbox, *hpaned; + GtkWidget *frame; + GtkTreeSelection *selection; + GSList *classtree; + + GtkWidget *longname, *version, *author, *description, *copyright; + + dialog = GNOME_DIALOG (browser); + + gnome_dialog_append_button (dialog, GNOME_STOCK_BUTTON_OK); + gnome_dialog_append_button (dialog, GNOME_STOCK_BUTTON_CANCEL); + gnome_dialog_constructv (dialog, "Select an element..,", NULL); + gnome_dialog_set_close (dialog, TRUE); + gnome_dialog_close_hides (dialog, TRUE); + gnome_dialog_set_default (dialog, GNOME_OK); + + gtk_window_set_resizable (GTK_WINDOW (dialog), TRUE); + gtk_window_set_default_size (GTK_WINDOW (dialog), 550, 400); + + hpaned = gtk_hpaned_new (); + gtk_box_pack_start (GTK_BOX (dialog->vbox), hpaned, + TRUE, TRUE, 0); + + store = gtk_tree_store_new (NUM_COLUMNS, + G_TYPE_STRING, + G_TYPE_STRING, + GST_TYPE_ELEMENT_FACTORY); + treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store)); + column = gtk_tree_view_column_new_with_attributes ("Element", + gtk_cell_renderer_text_new (), + "text", NAME_COLUMN, + NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column); + column = gtk_tree_view_column_new_with_attributes ("Description", + gtk_cell_renderer_text_new (), + "text", DESCRIPTION_COLUMN, + NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column); + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)); + gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE); + gtk_tree_selection_set_select_function (selection, tree_select_function, NULL, NULL); + gtk_widget_set_size_request (treeview, 200, -1); + + scroller = gtk_scrolled_window_new (NULL, NULL); + gtk_container_add (GTK_CONTAINER (scroller), treeview); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroller), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_paned_pack1 (GTK_PANED (hpaned), scroller, FALSE, TRUE); + + vbox = gtk_vbox_new (FALSE, 0); + gtk_widget_set_size_request (vbox, 100, -1); + gtk_paned_pack2 (GTK_PANED (hpaned), vbox, TRUE, TRUE); + + frame = gtk_frame_new ("Element Details"); + gtk_box_pack_start (GTK_BOX (vbox), frame, + TRUE, TRUE, 0); + + /* create the details table and put a title on it */ + table = GTK_TABLE (gtk_table_new (2, 5, FALSE)); + + /* the long name of the element */ + longname = gtk_label_new ("Name:"); + gtk_misc_set_alignment (GTK_MISC (longname), 1.0, 0.0); + gtk_table_attach (table, longname, 0, 1, 0, 1, GTK_FILL, 0, 5, 0); + browser->longname = GTK_WIDGET (g_object_new (GTK_TYPE_LABEL, + "selectable", TRUE, + "wrap", TRUE, + "justify", GTK_JUSTIFY_LEFT, + "xalign", 0.0, + "yalign", 0.0, + NULL)); + gtk_table_attach (table, browser->longname, 1, 2, 0, 1, GTK_FILL|GTK_EXPAND, 0, 0, 0); + + /* the description */ + description = gtk_label_new ("Description:"); + gtk_misc_set_alignment (GTK_MISC (description), 1.0, 0.0); + gtk_table_attach (table, description, 0, 1, 1, 2, GTK_FILL, 0, 5, 0); + browser->description = GTK_WIDGET (g_object_new (GTK_TYPE_LABEL, + "selectable", TRUE, + "wrap", TRUE, + "justify", GTK_JUSTIFY_LEFT, + "xalign", 0.0, + "yalign", 0.0, + NULL)); + gtk_table_attach (table, browser->description, 1, 2, 1, 2, GTK_FILL|GTK_EXPAND, 0, 0, 0); + + /* the version */ + version = gtk_label_new ("Version:"); + gtk_misc_set_alignment (GTK_MISC (version), 1.0, 0.0); + gtk_table_attach (table, version, 0, 1, 2, 3, GTK_FILL, 0, 5, 0); + browser->version = GTK_WIDGET (g_object_new (GTK_TYPE_LABEL, + "selectable", TRUE, + "wrap", TRUE, + "justify", GTK_JUSTIFY_LEFT, + "xalign", 0.0, + "yalign", 0.0, + NULL)); + gtk_table_attach (table, browser->version, 1, 2, 2, 3, GTK_FILL|GTK_EXPAND, 0, 0, 0); + + /* the author */ + author = gtk_label_new ("Author:"); + gtk_misc_set_alignment (GTK_MISC (author), 1.0, 0.0); + gtk_table_attach (table, author, 0, 1, 3, 4, GTK_FILL, 0, 5, 0); + browser->author = GTK_WIDGET (g_object_new (GTK_TYPE_LABEL, + "selectable", TRUE, + "wrap", TRUE, + "justify", GTK_JUSTIFY_LEFT, + "xalign", 0.0, + "yalign", 0.0, + NULL)); + gtk_table_attach (table, browser->author, 1, 2, 3, 4, GTK_FILL|GTK_EXPAND, 0, 0, 0); + + /* the copyright */ + copyright = gtk_label_new ("Copyright:"); + gtk_misc_set_alignment (GTK_MISC (copyright), 1.0, 0.0); + gtk_table_attach (table, copyright, 0, 1, 4, 5, GTK_FILL, 0, 5, 0); + browser->copyright = GTK_WIDGET (g_object_new (GTK_TYPE_LABEL, + "selectable", TRUE, + "wrap", TRUE, + "justify", GTK_JUSTIFY_LEFT, + "xalign", 0.0, + "yalign", 0.0, + NULL)); + gtk_table_attach (table, browser->copyright, 1, 2, 4, 5, GTK_FILL|GTK_EXPAND, 0, 0, 0); + + gtk_container_add (GTK_CONTAINER (frame), GTK_WIDGET (table)); + + frame = gtk_frame_new ("Element capabilities"); + gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0); + + browser->capstree = gst_element_browser_caps_tree_new (); + gtk_container_add (GTK_CONTAINER (frame), browser->capstree); + + classtree = get_class_tree (); + while (classtree) { + populate_store (store, NULL, + (struct element_select_classlist *)(classtree->data)); + classtree = g_slist_next (classtree); + } + + g_signal_connect (G_OBJECT (selection), "changed", + G_CALLBACK (tree_select), browser); + + gtk_widget_show_all (GTK_WIDGET (browser)); + gtk_widget_hide (GTK_WIDGET (browser)); +} + +GtkWidget *gst_element_browser_new () +{ + return GTK_WIDGET (g_object_new (gst_element_browser_get_type (), NULL)); +} + +GstElementFactory *gst_element_browser_pick_modal () +{ + GstElementBrowser *browser = GST_ELEMENT_BROWSER (gst_element_browser_new ()); + + if (gnome_dialog_run_and_close (GNOME_DIALOG (browser)) == GNOME_CANCEL) + return NULL; + else + return browser->selected; } static void populate_store (GtkTreeStore *store, GtkTreeIter *parent, - struct element_select_classlist *class) { + struct element_select_classlist *class) +{ GSList *traverse; GtkTreeIter iter, newparent; @@ -92,7 +292,8 @@ } static gboolean tree_select_function (GtkTreeSelection *selection, GtkTreeModel *model, - GtkTreePath *path, gboolean foo, gpointer data) { + GtkTreePath *path, gboolean foo, gpointer data) +{ GtkTreeIter iter; GstElementFactory *factory = NULL; @@ -106,11 +307,11 @@ } -static void tree_select (GtkTreeSelection *selection, gpointer data) { +static void tree_select (GtkTreeSelection *selection, GstElementBrowser *browser) +{ GtkTreeModel *model; GtkTreeIter iter; GstElementFactory *factory; - struct element_select_details *details; /* if this change actually deselects something, ignore it... */ if (!gtk_tree_selection_get_selected (selection, &model, &iter)) @@ -122,134 +323,29 @@ g_return_if_fail (factory != NULL); - details = (struct element_select_details *)data; - details->factory = factory; - - gtk_entry_set_text(GTK_ENTRY(details->longname), - factory->details->longname); - gtk_entry_set_text(GTK_ENTRY(details->description), - factory->details->description); - gtk_entry_set_text(GTK_ENTRY(details->version), - factory->details->version); - gtk_entry_set_text(GTK_ENTRY(details->author), - factory->details->author); - gtk_entry_set_text(GTK_ENTRY(details->copyright), - factory->details->copyright); -} + browser->selected = factory; + gtk_label_set_text (GTK_LABEL (browser->longname), factory->details->longname); + gtk_label_set_text (GTK_LABEL (browser->description), factory->details->description); + gtk_label_set_text (GTK_LABEL (browser->version), factory->details->version); + gtk_label_set_text (GTK_LABEL (browser->author), factory->details->author); + gtk_label_set_text (GTK_LABEL (browser->copyright), factory->details->copyright); -GstElementFactory *gst_element_browser_pick_modal () { - GtkWidget *dialog; - gchar *titles[2]; - GtkWidget *treeview; - GtkTreeStore *store; - GtkTreeIter iter; - GtkTreeViewColumn *column; - GtkWidget *scroller; - GtkTable *table; - GtkWidget *detailslabel; - GtkWidget *detailshsep; - GtkWidget *longname, *description, *version, *author, *copyright; - GtkTreeSelection *selection; + g_object_set (G_OBJECT (browser->capstree), "element-factory", browser->selected, NULL); +} +static GSList *get_class_tree (void) +{ const GList *elements; GstElementFactory *element; gchar **classes, **class; GSList *classtree, *treewalk; GSList **curlist; struct element_select_classlist *branch = NULL; - struct element_select_details details; - - /* first create the dialog and associated stuff */ - dialog = gnome_dialog_new("Select Element", - GNOME_STOCK_BUTTON_OK, - GNOME_STOCK_BUTTON_CANCEL, - NULL); - gnome_dialog_set_close(GNOME_DIALOG(dialog),TRUE); - gnome_dialog_close_hides(GNOME_DIALOG(dialog),TRUE); - gnome_dialog_set_default(GNOME_DIALOG(dialog),GNOME_OK); - gtk_window_set_resizable (GTK_WINDOW (dialog), TRUE); - - store = gtk_tree_store_new (NUM_COLUMNS, - G_TYPE_STRING, - G_TYPE_STRING, - GST_TYPE_ELEMENT_FACTORY); - treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store)); - column = gtk_tree_view_column_new_with_attributes ("Element", - gtk_cell_renderer_text_new (), - "text", NAME_COLUMN, - NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column); - column = gtk_tree_view_column_new_with_attributes ("Description", - gtk_cell_renderer_text_new (), - "text", DESCRIPTION_COLUMN, - NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column); - selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)); - gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE); - gtk_tree_selection_set_select_function (selection, tree_select_function, NULL, NULL); - gtk_widget_set_usize (treeview, 300, 300); - - scroller = gtk_scrolled_window_new (NULL, NULL); - gtk_container_add (GTK_CONTAINER (scroller), treeview); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroller), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox), scroller, - TRUE, TRUE, 0); - - /* create the details table and put a title on it */ - table = GTK_TABLE(gtk_table_new(2,7,FALSE)); - detailslabel = gtk_label_new("Element Details:"); - gtk_misc_set_alignment(GTK_MISC(detailslabel),0.0,0.5); - gtk_table_attach(table,detailslabel,0,2,0,1,GTK_FILL|GTK_EXPAND,0,0,0); - - /* then a separator to keep the title separate */ - detailshsep = gtk_hseparator_new(); - gtk_table_attach(table,detailshsep,0,2,1,2,GTK_FILL|GTK_EXPAND,0,0,0); - - /* the long name of the element */ - longname = gtk_label_new("Name:"); - gtk_misc_set_alignment(GTK_MISC(longname),1.0,0.5); - gtk_table_attach(table,longname,0,1,2,3,GTK_FILL,0,5,0); - details.longname = gtk_entry_new(); - gtk_entry_set_editable(GTK_ENTRY(details.longname),FALSE); - gtk_table_attach(table,details.longname,1,2,2,3,GTK_FILL|GTK_EXPAND,0,0,0); - - /* the description */ - description = gtk_label_new("Description:"); - gtk_misc_set_alignment(GTK_MISC(description),1.0,0.5); - gtk_table_attach(table,description,0,1,3,4,GTK_FILL,0,5,0); - details.description = gtk_entry_new(); - gtk_entry_set_editable(GTK_ENTRY(details.description),FALSE); - gtk_table_attach(table,details.description,1,2,3,4,GTK_FILL|GTK_EXPAND,0,0,0); - - /* the version */ - version = gtk_label_new("Version:"); - gtk_misc_set_alignment(GTK_MISC(version),1.0,0.5); - gtk_table_attach(table,version,0,1,4,5,GTK_FILL,0,5,0); - details.version = gtk_entry_new(); - gtk_entry_set_editable(GTK_ENTRY(details.version),FALSE); - gtk_table_attach(table,details.version,1,2,4,5,GTK_FILL|GTK_EXPAND,0,0,0); - - /* the author */ - author = gtk_label_new("Author:"); - gtk_misc_set_alignment(GTK_MISC(author),1.0,0.5); - gtk_table_attach(table,author,0,1,6,7,GTK_FILL,0,5,0); - details.author = gtk_entry_new(); - gtk_entry_set_editable(GTK_ENTRY(details.author),FALSE); - gtk_table_attach(table,details.author,1,2,6,7,GTK_FILL|GTK_EXPAND,0,0,0); - - /* the copyright */ - copyright = gtk_label_new("Copyright:"); - gtk_misc_set_alignment(GTK_MISC(copyright),1.0,0.5); - gtk_table_attach(table,copyright,0,1,7,8,GTK_FILL,0,5,0); - details.copyright = gtk_entry_new(); - gtk_entry_set_editable(GTK_ENTRY(details.copyright),FALSE); - gtk_table_attach(table,details.copyright,1,2,7,8,GTK_FILL|GTK_EXPAND,0,0,0); - - gtk_box_pack_start(GTK_BOX(GNOME_DIALOG(dialog)->vbox),GTK_WIDGET(table), - FALSE,FALSE,0); + static GSList *ret = NULL; + if (ret) + return ret; /* first create a sorted (by class) tree of all the factories */ classtree = NULL; @@ -287,7 +383,7 @@ /* curlist is pointer to list */ branch = g_new0(struct element_select_classlist,1); branch->name = g_strdup(*class); - *curlist = g_slist_insert_sorted(*curlist,branch,str_compare); + *curlist = g_slist_insert_sorted(*curlist,branch,compare_str); curlist = &branch->subclasses; } class++; @@ -299,26 +395,24 @@ elements = g_list_next(elements); } - /* now fill in the tree */ - /* start with a sort and save to original GSList location - * this is ineffecient since we do it every time, but, ... yeah ;) */ - treewalk = classtree; - treewalk = g_slist_sort (classtree, compare_classes); - classtree = treewalk; - while (treewalk) { - populate_store (store, NULL, - (struct element_select_classlist *)(treewalk->data)); - treewalk = g_slist_next(treewalk); - } + ret = g_slist_sort (classtree, compare_classes); + return ret; +} - g_signal_connect (G_OBJECT (selection), "changed", - G_CALLBACK (tree_select), &details); +static gint compare_name(gconstpointer a,gconstpointer b) +{ + return (strcmp(GST_OBJECT_NAME (a), + GST_OBJECT_NAME (b))); +} - gtk_widget_show_all(GTK_WIDGET(dialog)); +static gint compare_str(gconstpointer a,gconstpointer b) +{ + return (strcmp((gchar *)a,(gchar *)b)); +} - details.factory = NULL; - if (gnome_dialog_run_and_close(GNOME_DIALOG(dialog)) == GNOME_CANCEL) - return NULL; - else - return details.factory; -}; +static gint compare_classes (gconstpointer a, gconstpointer b) +{ + struct element_select_classlist *A = (struct element_select_classlist *) a; + struct element_select_classlist *B = (struct element_select_classlist *) b; + return (strcmp ((gchar *) A->name, (gchar *) B->name)); +} Index: browser.h =================================================================== RCS file: /cvsroot/gstreamer/gst-editor/libs/gst/element-browser/browser.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- browser.h 22 Apr 2002 18:56:09 -0000 1.1 +++ browser.h 29 Apr 2002 01:14:42 -0000 1.2 @@ -17,16 +17,49 @@ * Boston, MA 02111-1307, USA. */ +#include <gst/gst.h> +#include <libgnomeui/libgnomeui.h> + +#include "caps-tree.h" + #ifndef __GST_ELEMENT_BROWSER_H__ #define __GST_ELEMENT_BROWSER_H__ -#include <gst/gst.h> -#include <libgnomeui/libgnomeui.h> +#define GST_TYPE_ELEMENT_BROWSER (gst_element_browser_get_type()) +#define GST_ELEMENT_BROWSER(obj) (GTK_CHECK_CAST ((obj), GST_TYPE_ELEMENT_BROWSER, GstElementBrowser)) +#define GST_ELEMENT_BROWSER_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), GST_TYPE_ELEMENT_BROWSER, GstElementBrowserClass)) +#define GST_IS_ELEMENT_BROWSER(obj) (GTK_CHECK_TYPE ((obj), GST_TYPE_ELEMENT_BROWSER)) +#define GST_IS_ELEMENT_BROWSER_CLASS(obj) (GTK_CHECK_CLASS_TYPE ((klass), GST_TYPE_ELEMENT_BROWSER)) -GstElementFactory *gst_element_browser_pick_modal (void); +typedef struct _GstElementBrowser GstElementBrowser; +typedef struct _GstElementBrowserClass GstElementBrowserClass; + + +struct _GstElementBrowser { + GnomeDialog dialog; + + GstElementFactory *selected; + + GtkWidget *longname; + GtkWidget *description; + GtkWidget *version; + GtkWidget *author; + GtkWidget *copyright; + + GtkWidget *capstree; +}; + +struct _GstElementBrowserClass { + GnomeDialogClass parent_class; +}; + + +GType gst_element_browser_get_type (void); +GtkWidget* gst_element_browser_new (void); +GstElementFactory* gst_element_browser_pick_modal (void); #endif /* __GST_ELEMENT_BROWSER_H__ */ --- NEW FILE: caps-tree.c --- /* GStreamer * Copyright (C) <1999> Erik Walthinsen <om...@cs...> * * 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. */ #include "caps-tree.h" enum { NAME_COLUMN, INFO_COLUMN, NUM_COLUMNS }; enum { PROP_0, PROP_ELEMENT_FACTORY, PROP_ELEMENT }; static void gst_element_browser_caps_tree_init (GstElementBrowserCapsTree *ct); static void gst_element_browser_caps_tree_class_init(GstElementBrowserCapsTreeClass *klass); static void gst_element_browser_caps_tree_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_element_browser_caps_tree_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void add_caps_to_tree (GstCaps *caps, GtkTreeStore *store, GtkTreeIter *parent); static gchar* print_prop (GstPropsEntry *prop); static void update_caps_tree (GstElementBrowserCapsTree *ct); static GtkTreeViewClass *parent_class = NULL; GType gst_element_browser_caps_tree_get_type (void) { static GType element_browser_caps_tree_type = 0; if (!element_browser_caps_tree_type) { static const GTypeInfo element_browser_caps_tree_info = { sizeof(GstElementBrowserCapsTreeClass), NULL, NULL, (GClassInitFunc)gst_element_browser_caps_tree_class_init, NULL, NULL, sizeof(GstElementBrowserCapsTree), 0, (GInstanceInitFunc)gst_element_browser_caps_tree_init, }; element_browser_caps_tree_type = g_type_register_static (gtk_tree_view_get_type (), "GstElementBrowserCapsTree", &element_browser_caps_tree_info, 0); } return element_browser_caps_tree_type; } static void gst_element_browser_caps_tree_class_init (GstElementBrowserCapsTreeClass *klass) { GObjectClass *gobject_class; gobject_class = G_OBJECT_CLASS (klass); parent_class = (GtkTreeViewClass*) g_type_class_ref (gtk_tree_view_get_type ()); gobject_class->set_property = gst_element_browser_caps_tree_set_property; gobject_class->get_property = gst_element_browser_caps_tree_get_property; g_object_class_install_property (gobject_class, PROP_ELEMENT_FACTORY, g_param_spec_object ("element-factory", "Element factory", "Element factory", gst_element_factory_get_type (), G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, PROP_ELEMENT, g_param_spec_object ("element", "Element", "Element", gst_element_get_type (), G_PARAM_READWRITE)); } static void gst_element_browser_caps_tree_init (GstElementBrowserCapsTree *ct) { GList *templs; GtkWidget *tview; GtkTreeStore *store; GtkTreeViewColumn *column; GtkTreeIter iter, parent; store = gtk_tree_store_new (NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING); tview = GTK_WIDGET (ct); gtk_tree_view_set_model (GTK_TREE_VIEW (tview), GTK_TREE_MODEL (store)); column = gtk_tree_view_column_new_with_attributes ("Name", gtk_cell_renderer_text_new (), "text", NAME_COLUMN, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (tview), column); column = gtk_tree_view_column_new_with_attributes ("Info", gtk_cell_renderer_text_new (), "text", INFO_COLUMN, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (tview), column); gtk_widget_show (tview); } static void gst_element_browser_caps_tree_set_property (GObject* object, guint prop_id, const GValue* value, GParamSpec* pspec) { GstElementBrowserCapsTree *ct; ct = GST_ELEMENT_BROWSER_CAPS_TREE (object); switch (prop_id) { case PROP_ELEMENT_FACTORY: ct->factory = GST_ELEMENT_FACTORY (g_value_get_object (value)); break; case PROP_ELEMENT: ct->element = GST_ELEMENT (g_value_get_object (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); return; } update_caps_tree (ct); } static void gst_element_browser_caps_tree_get_property (GObject* object, guint prop_id, GValue* value, GParamSpec* pspec) { GstElementBrowserCapsTree *ct; ct = GST_ELEMENT_BROWSER_CAPS_TREE (object); switch (prop_id) { case PROP_ELEMENT_FACTORY: g_value_set_object (value, G_OBJECT (ct->factory)); break; case PROP_ELEMENT: g_value_set_object (value, G_OBJECT (ct->element)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } GtkWidget *gst_element_browser_caps_tree_new () { return GTK_WIDGET (g_object_new (gst_element_browser_caps_tree_get_type (), NULL)); } static void update_caps_tree (GstElementBrowserCapsTree *ct) { GstElement *element; GstElementFactory *factory; const GList *pads, *templs; GtkTreeStore *store; GtkTreeIter iter; store = GTK_TREE_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (ct))); gtk_tree_store_clear (store); if (ct->element) { pads = gst_element_get_pad_list (ct->element); while (pads) { GstPad *pad = (GstPad *)pads->data; GstCaps *caps = gst_pad_get_caps (pad); gchar *mime; if (caps) { GstType *type; type = gst_type_find_by_id (caps->id); mime = type->mime; } else { mime = "unknown/unknown"; } gtk_tree_store_append (store, &iter, NULL); gtk_tree_store_set (store, &iter, NAME_COLUMN, g_strdup (gst_pad_get_name (pad)), INFO_COLUMN, mime, -1); add_caps_to_tree (caps, store, &iter); pads = g_list_next (pads); } } if (ct->factory) { templs = ct->factory->padtemplates; while (templs) { GstPadTemplate *templ = (GstPadTemplate *)templs->data; GstCaps *caps = templ->caps; gchar *mime; if (caps) { GstType *type; type = gst_type_find_by_id (caps->id); mime = type->mime; } else { mime = "unknown/unknown"; } gtk_tree_store_append (store, &iter, NULL); gtk_tree_store_set (store, &iter, NAME_COLUMN, g_strdup (templ->name_template), INFO_COLUMN, mime, -1); add_caps_to_tree (caps, store, &iter); templs = g_list_next (templs); } } } static void add_caps_to_tree (GstCaps *caps, GtkTreeStore *store, GtkTreeIter *parent) { GtkTreeIter iter; GList *props; GstPropsEntry *prop; GstProps *properties; if (caps) { properties = gst_caps_get_props (caps); props = properties->properties; while (props) { prop = (GstPropsEntry*)(props->data); props = g_list_next(props); gtk_tree_store_append (store, &iter, parent); gtk_tree_store_set (store, &iter, NAME_COLUMN, gst_props_entry_get_name (prop), INFO_COLUMN, print_prop (prop), -1); } } } /* this should really be a GtkTreeViewDataFunc */ static gchar* print_prop (GstPropsEntry *prop) { GstPropsType type; type = gst_props_entry_get_type (prop); switch (type) { case GST_PROPS_INT_TYPE: { gint val; gst_props_entry_get_int (prop, &val); return g_strdup_printf ("Integer: %d", val); break; } case GST_PROPS_INT_RANGE_TYPE: { gint min, max; gst_props_entry_get_int_range (prop, &min, &max); return g_strdup_printf ("Integer range: %d - %d", min, max); break; } case GST_PROPS_FLOAT_TYPE: { gfloat val; gst_props_entry_get_float (prop, &val); return g_strdup_printf ("Float: %f", val); break; } case GST_PROPS_FLOAT_RANGE_TYPE: { gfloat min, max; gst_props_entry_get_float_range (prop, &min, &max); return g_strdup_printf ("Float range: %f - %f", min, max); break; } case GST_PROPS_BOOL_TYPE: { gboolean val; gst_props_entry_get_boolean (prop, &val); return g_strdup_printf ("Boolean: %s", val ? "TRUE" : "FALSE"); break; } case GST_PROPS_STRING_TYPE: { const gchar *val; gst_props_entry_get_string (prop, &val); return g_strdup_printf ("String: %s", val); break; } case GST_PROPS_FOURCC_TYPE: { guint32 val; gst_props_entry_get_fourcc_int (prop, &val); return g_strdup_printf ("FourCC: '%c%c%c%c'", (gchar)( val & 0xff), (gchar)((val >> 8) & 0xff), (gchar)((val >> 16) & 0xff), (gchar)((val >> 24) & 0xff)); break; } case GST_PROPS_LIST_TYPE: { const GList *list; gchar *ret; gint count = 0; gst_props_entry_get_list (prop, &list); ret = g_strdup_printf ("List: "); while (list) { GstPropsEntry *listentry; listentry = (GstPropsEntry*) (list->data); g_strconcat (ret, print_prop (listentry), count++ ? ", " : "", NULL); list = g_list_next (list); } return ret; break; } default: return g_strdup_printf("unknown props %d", type); } } --- NEW FILE: caps-tree.h --- /* GStreamer * Copyright (C) <1999> Erik Walthinsen <om...@cs...> * * 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. */ #include <gst/gst.h> #include <libgnomeui/libgnomeui.h> #ifndef __GST_ELEMENT_BROWSER_CAPS_TREE_H__ #define __GST_ELEMENT_BROWSER_CAPS_TREE_H__ #define GST_TYPE_ELEMENT_BROWSER_CAPS_TREE (gst_element_browser_caps_tree_get_type()) #define GST_ELEMENT_BROWSER_CAPS_TREE(obj) (GTK_CHECK_CAST ((obj), GST_TYPE_ELEMENT_BROWSER_CAPS_TREE, GstElementBrowserCapsTree)) #define GST_ELEMENT_BROWSER_CAPS_TREE_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), GST_TYPE_ELEMENT_BROWSER_CAPS_TREE, GstElementBrowserCapsTreeClass)) #define GST_IS_ELEMENT_BROWSER_CAPS_TREE(obj) (GTK_CHECK_TYPE ((obj), GST_TYPE_ELEMENT_BROWSER_CAPS_TREE)) #define GST_IS_ELEMENT_BROWSER_CAPS_TREE_CLASS(obj) (GTK_CHECK_CLASS_TYPE ((klass), GST_TYPE_ELEMENT_BROWSER_CAPS_TREE)) typedef struct _GstElementBrowserCapsTree GstElementBrowserCapsTree; typedef struct _GstElementBrowserCapsTreeClass GstElementBrowserCapsTreeClass; struct _GstElementBrowserCapsTree { GtkTreeView parent; GstElementFactory *factory; GstElement *element; }; struct _GstElementBrowserCapsTreeClass { GtkTreeViewClass parent_class; }; GType gst_element_browser_caps_tree_get_type (void); GtkWidget* gst_element_browser_caps_tree_new (void); #endif /* __GST_ELEMENT_BROWSER_CAPS_TREE_H__ */ |