[patch] pluggable property dialog pages



Hi,

I've attached a patch that makes it possible to have mime-type-sensitive
pages in the properties dialog.  It uses the good 'ol NautilusView stuff
people are used to, so there wasn't much required to make it happen. 
I've also attached a sample view that lets you see metadata contained in
audio files (mp3, ogg, etc).  Let me know what you think.

Thanks,
James

Oh, here's a screenshot: 
http://www.cs.indiana.edu/~jwillcox/files/screenshots/nautilus-music-properties.png
Index: configure.in
===================================================================
RCS file: /cvs/gnome/nautilus/configure.in,v
retrieving revision 1.477
diff -u -r1.477 configure.in
--- configure.in	19 Oct 2002 22:38:47 -0000	1.477
+++ configure.in	24 Oct 2002 02:50:43 -0000
@@ -298,6 +298,13 @@
 EMBLEM_COMPONENT_LIBS="`$PKG_CONFIG --libs $EMBLEM_COMPONENT_MODULES`"
 AC_SUBST(EMBLEM_COMPONENT_LIBS)
 
+dnl music properties component
+MUSIC_PROPERTIES_COMPONENT_MODULES="$COMPONENT_MODULES monkey-media"
+MUSIC_PROPERTIES_COMPONENT_CFLAGS="`$PKG_CONFIG --cflags $MUSIC_PROPERTIES_COMPONENT_MODULES`"
+AC_SUBST(MUSIC_PROPERTIES_COMPONENT_CFLAGS)
+MUSIC_PROPERTIES_COMPONENT_LIBS="`$PKG_CONFIG --libs $MUSIC_PROPERTIES_COMPONENT_MODULES`"
+AC_SUBST(MUSIC_PROPERTIES_COMPONENT_LIBS)
+
 DISABLE_DEPRECATED_CFLAGS=" \
 	-DG_DISABLE_DEPRECATED \
 	-DGDK_DISABLE_DEPRECATED \
@@ -357,6 +364,7 @@
 components/throbber/Makefile
 components/tree/Makefile
 components/emblem/Makefile
+components/music_properties/Makefile
 cut-n-paste-code/Makefile
 cut-n-paste-code/widgets/Makefile
 cut-n-paste-code/widgets/gimphwrapbox/Makefile
Index: components/Makefile.am
===================================================================
RCS file: /cvs/gnome/nautilus/components/Makefile.am,v
retrieving revision 1.41
diff -u -r1.41 Makefile.am
--- components/Makefile.am	4 Oct 2002 10:42:00 -0000	1.41
+++ components/Makefile.am	24 Oct 2002 02:50:44 -0000
@@ -12,6 +12,7 @@
 	throbber 				\
 	tree 					\
 	emblem					\
+	music_properties			\
 	$(NULL)
 
 
Index: libnautilus-private/nautilus-mime-actions.c
===================================================================
RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-mime-actions.c,v
retrieving revision 1.100
diff -u -r1.100 nautilus-mime-actions.c
--- libnautilus-private/nautilus-mime-actions.c	9 May 2002 20:21:34 -0000	1.100
+++ libnautilus-private/nautilus-mime-actions.c	24 Oct 2002 02:50:45 -0000
@@ -767,7 +767,8 @@
 
 
 GList *
-nautilus_mime_get_all_components_for_file (NautilusFile *file)
+nautilus_mime_get_all_components_for_file_extended (NautilusFile *file,
+						    char *extra_reqs)
 {
 	char *mime_type;
 	char *uri_scheme;
@@ -789,8 +790,10 @@
 		item_mime_types = NULL;
 	}
 
-	info_list = nautilus_do_component_query (mime_type, uri_scheme, item_mime_types, FALSE,
-						 explicit_iids, NULL, NULL);
+	info_list = nautilus_do_component_query (mime_type, uri_scheme,
+						 item_mime_types, FALSE,
+						 explicit_iids, NULL,
+						 extra_reqs);
 	
 	eel_g_list_free_deep (explicit_iids);
 	eel_g_list_free_deep (item_mime_types);
@@ -799,6 +802,12 @@
 	g_free (mime_type);
 
 	return info_list;
+}
+
+GList *
+nautilus_mime_get_all_components_for_file (NautilusFile *file)
+{
+	return nautilus_mime_get_all_components_for_file_extended (file, NULL);
 }
 
 gboolean
Index: libnautilus-private/nautilus-mime-actions.h
===================================================================
RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-mime-actions.h,v
retrieving revision 1.23
diff -u -r1.23 nautilus-mime-actions.h
--- libnautilus-private/nautilus-mime-actions.h	30 Oct 2001 00:26:25 -0000	1.23
+++ libnautilus-private/nautilus-mime-actions.h	24 Oct 2002 02:50:45 -0000
@@ -43,7 +43,8 @@
 GList *                  nautilus_mime_get_short_list_components_for_file          (NautilusFile           *file);
 GList *                  nautilus_mime_get_all_applications_for_file               (NautilusFile           *file);
 GList *                  nautilus_mime_get_all_components_for_file                 (NautilusFile           *file);
-gboolean                 nautilus_mime_has_any_components_for_file                 (NautilusFile           *file);
+GList *                  nautilus_mime_get_all_components_for_file_extended        (NautilusFile           *file, char *extra_requirements);
+ gboolean                 nautilus_mime_has_any_components_for_file                 (NautilusFile           *file);
 gboolean                 nautilus_mime_has_any_applications_for_file               (NautilusFile           *file);
 gboolean                 nautilus_mime_has_any_applications_for_file_type          (NautilusFile           *file);
 GnomeVFSResult           nautilus_mime_set_default_action_type_for_file            (NautilusFile           *file,
Index: src/file-manager/fm-properties-window.c
===================================================================
RCS file: /cvs/gnome/nautilus/src/file-manager/fm-properties-window.c,v
retrieving revision 1.157
diff -u -r1.157 fm-properties-window.c
--- src/file-manager/fm-properties-window.c	4 Oct 2002 16:05:55 -0000	1.157
+++ src/file-manager/fm-properties-window.c	24 Oct 2002 02:50:45 -0000
@@ -68,7 +68,12 @@
 #include <libnautilus-private/nautilus-link.h>
 #include <libnautilus-private/nautilus-metadata.h>
 #include <libnautilus-private/nautilus-undo-signal-handlers.h>
+#include <libnautilus-private/nautilus-mime-actions.h>
+#include <libnautilus-private/nautilus-view-identifier.h>
 #include <libnautilus/nautilus-undo.h>
+#include <libnautilus/nautilus-view.h>
+#include <bonobo/bonobo-widget.h>
+#include <bonobo/bonobo-exception.h>
 #include <string.h>
 
 static GHashTable *windows;
@@ -2101,6 +2106,100 @@
 	}
 }
 
+static GtkWidget *
+bonobo_page_error_message (NautilusViewIdentifier *view_id,
+			   CORBA_Environment *ev)
+{
+	GtkWidget *hbox;
+	GtkWidget *label;
+	GtkWidget *image;
+	char *msg;
+
+	hbox = gtk_hbox_new (FALSE, GNOME_PAD);
+	image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_ERROR,
+					  GTK_ICON_SIZE_DIALOG);
+
+	msg = g_strdup_printf ("There was an error while trying to create the view named `%s':  %s", view_id->name, CORBA_exception_id (ev));
+	label = gtk_label_new (msg);
+	g_free (msg);
+
+	gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
+
+	gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
+	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+
+	return hbox;
+}
+
+static void
+append_bonobo_pages (FMPropertiesWindow *window)
+{
+	GList *components, *l;
+	CORBA_Environment ev;
+
+	/* find all the property page views for this file */
+	components = nautilus_mime_get_all_components_for_file_extended
+		(window->details->target_file,
+		 "nautilus:property_page_name.defined()");
+	
+	CORBA_exception_init (&ev);
+
+	l = components;
+	while (l != NULL) {
+		NautilusViewIdentifier *view_id;
+		Bonobo_ServerInfo *server;
+		GtkWidget *vbox, *widget;
+		Bonobo_Unknown obj;
+
+		widget = NULL;
+
+		server = l->data;
+		l = l->next;
+
+		view_id = nautilus_view_identifier_new_from_property_page (server);
+
+		obj = bonobo_activation_activate_from_id (view_id->iid,
+							  0, NULL, &ev);
+
+		if (!BONOBO_EX (&ev)) {
+			Bonobo_Control control;
+			Nautilus_View view;
+			char *uri;
+			
+			control = Bonobo_Unknown_queryInterface
+					(obj, "IDL:Bonobo/Control:1.0", &ev);
+
+			view = Bonobo_Unknown_queryInterface
+					(control, "IDL:Nautilus/View:1.0", &ev);
+
+			uri = nautilus_file_get_uri
+				(window->details->target_file);
+
+			Nautilus_View_load_location (view, uri, &ev);
+			
+			if (!BONOBO_EX (&ev)) {
+				widget = bonobo_widget_new_control_from_objref
+						(control, CORBA_OBJECT_NIL);
+			}
+
+			g_free (uri);
+		}
+
+		if (widget == NULL) {
+			widget = bonobo_page_error_message (view_id, &ev);
+		}
+		
+
+		vbox = create_page_with_vbox (window->details->notebook,
+					      view_id->name);
+		gtk_container_add (GTK_CONTAINER (vbox), widget);
+		gtk_widget_show_all (vbox);
+		
+		nautilus_view_identifier_free (view_id);
+	}
+
+}
+
 static gboolean
 should_show_emblems (FMPropertiesWindow *window) 
 {
@@ -2222,6 +2321,9 @@
 	if (should_show_permissions (window)) {
 		create_permissions_page (window);
 	}
+
+	/* append pages from available views */
+	append_bonobo_pages (window);
 	
 	/* Create box for close button. */
 	hbox = gtk_hbutton_box_new ();

Attachment: music_properties.tar.gz
Description: GNU Zip compressed data



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]