[PATCH] Information Sidebar plugins



Hello,

...as my "undo/redo thing" has to wait for a little bit more support
from gio... I'm sitting down here playing with the source code, hoping
to produce something useful...

Sooo... this patch extends the libnautilus-extension plugin mechanism by
allowing new widgets to be added to the information sidebar. 
It could be interesting for Tracker / Beagle to integrate a widget to
set/retrieve/show tags attached to files, or to integrate
a mini player for audio/video files, or to integrate a sudoku widget,
or...
Ideally, everything that is shown now in the sidebar (icon, info, and
"open with..." buttons) could be implemented as plugins.

For now, communication is only from nautilus to the plugin (i.e. a
plugin cannot ask something to nautilus): the plugin gets notified when
the current selection changes and when the location changes.

If you see a use case where communication between the plugin and
nautilus would be useful raise your hand.

A simple example plugin can be found at
http://diuf.unifr.ch/pai/people/broccoa/dev/simple-sidebar-plugin.tar.gz
and a screencast: http://www.youtube.com/watch?v=xmqGc2Il34M)

Reviews, comments, etc. are welcome

cheers

A.

-- 
Amos Brocco | Ph.D Student | Computer Science Department - DIUF |
University of Fribourg | A406 Pérolles 21 | Bd. Pérolles 90 |
CH-1700 Fribourg | http://diuf.unifr.ch/pai/people/broccoa


--- nautilus-2.22.0/libnautilus-extension/nautilus-sidebar-widget-provider.h	1970-01-01 01:00:00.000000000 +0100
+++ nautilus-2.22.0-workspace/libnautilus-extension/nautilus-sidebar-widget-provider.h	2008-03-23 16:56:51.000000000 +0100
@@ -0,0 +1,62 @@
+/*
+ *   nautilus-sidebar-widget-provider.c - Interface for Nautilus extensions that 
+ *                             		  provide sidebar widgets.
+ *
+ *  Copyright (C) 2008 Amos Brocco
+ *
+ *  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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+/*  This interface is implemented by Nautilus extensions that want to 
+ *  provide information sidebar widgets. Those widges are created along
+ *  with the Information sidebar.
+ */
+
+#ifndef NAUTILUS_SIDEBAR_WIDGET_PROVIDER_H
+#define NAUTILUS_SIDEBAR_WIDGET_PROVIDER_H
+
+#include <glib-object.h>
+#include <gtk/gtkwidget.h>
+#include "nautilus-extension-types.h"
+#include "nautilus-sidebar-widget.h"
+
+G_BEGIN_DECLS
+
+#define NAUTILUS_TYPE_SIDEBAR_WIDGET_PROVIDER           (nautilus_sidebar_widget_provider_get_type ())
+#define NAUTILUS_SIDEBAR_WIDGET_PROVIDER(obj)           (G_TYPE_CHECK_INSTANCE_CAST ((obj), NAUTILUS_TYPE_SIDEBAR_WIDGET_PROVIDER, NautilusSidebarWidgetProvider))
+#define NAUTILUS_IS_SIDEBAR_WIDGET_PROVIDER(obj)        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NAUTILUS_TYPE_SIDEBAR_WIDGET_PROVIDER))
+#define NAUTILUS_SIDEBAR_WIDGET_PROVIDER_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), NAUTILUS_TYPE_SIDEBAR_WIDGET_PROVIDER, NautilusSidebarWidgetProviderIface))
+
+typedef struct _NautilusSidebarWidgetProvider       NautilusSidebarWidgetProvider;
+typedef struct _NautilusSidebarWidgetProviderIface  NautilusSidebarWidgetProviderIface;
+
+struct _NautilusSidebarWidgetProviderIface {
+	GTypeInterface g_iface;
+
+	NautilusSidebarWidget* 	(*get_widget) 	(NautilusSidebarWidgetProvider *provider);
+	char* 			(*get_name) 	(NautilusSidebarWidgetProvider *provider);
+	int 			(*get_order) 	(NautilusSidebarWidgetProvider *provider);
+};
+
+/* Interface Functions */
+GType       		nautilus_sidebar_widget_provider_get_type      	(void);
+NautilusSidebarWidget* 	nautilus_sidebar_widget_provider_get_widget    	(NautilusSidebarWidgetProvider* provider);
+gchar*			nautilus_sidebar_widget_provider_get_name 	(NautilusSidebarWidgetProvider* provider);
+int			nautilus_sidebar_widget_provider_get_order 	(NautilusSidebarWidgetProvider* provider);
+
+G_END_DECLS
+
+#endif
--- nautilus-2.22.0/libnautilus-extension/Makefile.in	2008-03-11 00:28:38.000000000 +0100
+++ nautilus-2.22.0-workspace/libnautilus-extension/Makefile.in	2008-03-23 17:06:40.000000000 +0100
@@ -64,6 +64,7 @@ am__objects_1 =
 am_libnautilus_extension_la_OBJECTS = nautilus-column-provider.lo \
 	nautilus-column.lo nautilus-extension-types.lo \
 	nautilus-file-info.lo nautilus-info-provider.lo \
+	nautilus-sidebar-widget.lo nautilus-sidebar-widget-provider.lo \
 	nautilus-location-widget-provider.lo nautilus-menu-item.lo \
 	nautilus-menu-provider.lo nautilus-property-page-provider.lo \
 	nautilus-property-page.lo nautilus-menu.lo $(am__objects_1)
@@ -326,6 +327,8 @@ libnautilus_extension_include_HEADERS = 
 	nautilus-menu-provider.h                \
 	nautilus-property-page-provider.h       \
 	nautilus-property-page.h                \
+	nautilus-sidebar-widget.h               \
+	nautilus-sidebar-widget-provider.h      \
 	nautilus-menu.h                         \
 	$(NULL)
 
@@ -341,6 +344,8 @@ libnautilus_extension_la_SOURCES = \
 	nautilus-menu-provider.c                        \
 	nautilus-property-page-provider.c               \
 	nautilus-property-page.c                        \
+	nautilus-sidebar-widget.c			\
+	nautilus-sidebar-widget-provider.c		\
 	nautilus-menu.c                                 \
 	$(NULL)
 
@@ -434,6 +439,9 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote  /$(DEPDIR)/nautilus-menu Plo am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote  /$(DEPDIR)/nautilus-property-page-provider Plo am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote  /$(DEPDIR)/nautilus-property-page Plo am__quote@
+ AMDEP_TRUE@@am__include@ @am__quote  /$(DEPDIR)/nautilus-sidebar-widget-provider Plo am__quote@
+ AMDEP_TRUE@@am__include@ @am__quote  /$(DEPDIR)/nautilus-sidebar-widget Plo am__quote@
+
 
 .c.o:
 @am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
--- nautilus-2.22.0/libnautilus-extension/nautilus-sidebar-widget-provider.c	1970-01-01 01:00:00.000000000 +0100
+++ nautilus-2.22.0-workspace/libnautilus-extension/nautilus-sidebar-widget-provider.c	2008-03-23 17:09:18.000000000 +0100
@@ -0,0 +1,85 @@
+/*
+ *  nautilus-sidebar-widget-provider.c - Interface for Nautilus
+                 extensions that provide extra widgets for the Information sidebar.
+ *
+ *  Copyright (C) 2008 Amos Brocco
+ *
+ *  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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <config.h>
+#include "nautilus-sidebar-widget-provider.h"
+
+#include <glib-object.h>
+
+static void
+nautilus_sidebar_widget_provider_base_init (gpointer g_class)
+{
+}
+
+GType                   
+nautilus_sidebar_widget_provider_get_type (void)
+{
+	static GType type = 0;
+
+	if (!type) {
+		const GTypeInfo info = {
+			sizeof (NautilusSidebarWidgetProviderIface),
+			nautilus_sidebar_widget_provider_base_init,
+			NULL,
+			NULL,
+			NULL,
+			NULL,
+			0,
+			0,
+			NULL
+		};
+		
+		type = g_type_register_static (G_TYPE_INTERFACE, 
+					       "NautilusSidebarWidgetProvider",
+					       &info, 0);
+		g_type_interface_add_prerequisite (type, G_TYPE_OBJECT);
+	}
+
+	return type;
+}
+
+NautilusSidebarWidget*
+nautilus_sidebar_widget_provider_get_widget (NautilusSidebarWidgetProvider* provider)
+{
+	g_return_val_if_fail (NAUTILUS_IS_SIDEBAR_WIDGET_PROVIDER (provider), NULL);
+
+	return NAUTILUS_SIDEBAR_WIDGET_PROVIDER_GET_IFACE (provider)->get_widget (provider);
+
+}
+
+gchar*
+nautilus_sidebar_widget_provider_get_name (NautilusSidebarWidgetProvider* provider)
+{
+	g_return_val_if_fail (NAUTILUS_IS_SIDEBAR_WIDGET_PROVIDER (provider), NULL);
+
+	return NAUTILUS_SIDEBAR_WIDGET_PROVIDER_GET_IFACE (provider)->get_name (provider);
+
+}
+
+int
+nautilus_sidebar_widget_provider_get_order (NautilusSidebarWidgetProvider* provider)
+{
+	g_return_val_if_fail (NAUTILUS_IS_SIDEBAR_WIDGET_PROVIDER (provider), -1);
+
+	return NAUTILUS_SIDEBAR_WIDGET_PROVIDER_GET_IFACE (provider)->get_order (provider);
+
+}			       
--- nautilus-2.22.0/libnautilus-extension/nautilus-sidebar-widget.c	1970-01-01 01:00:00.000000000 +0100
+++ nautilus-2.22.0-workspace/libnautilus-extension/nautilus-sidebar-widget.c	2008-03-24 00:03:28.000000000 +0100
@@ -0,0 +1,83 @@
+/*
+ *  nautilus-sidebar-widget-.c - Interface for Nautilus
+                 extensions that provide extra widgets for the Information sidebar.
+ *
+ *  Copyright (C) 2008 Amos Brocco
+ *
+ *  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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <config.h>
+#include "nautilus-sidebar-widget.h"
+
+#include <glib-object.h>
+
+static void
+nautilus_sidebar_widget_base_init (gpointer g_class)
+{
+}
+
+GType                   
+nautilus_sidebar_widget_get_type (void)
+{
+	static GType type = 0;
+
+	if (!type) {
+		const GTypeInfo info = {
+			sizeof (NautilusSidebarWidgetIface),
+			nautilus_sidebar_widget_base_init,
+			NULL,
+			NULL,
+			NULL,
+			NULL,
+			0,
+			0,
+			NULL
+		};
+		
+		type = g_type_register_static (G_TYPE_INTERFACE, 
+					       "NautilusSidebarWidget",
+					       &info, 0);
+		g_type_interface_add_prerequisite (type, GTK_TYPE_WIDGET);
+	}
+
+	return type;
+}
+
+GtkWidget*
+nautilus_sidebar_widget_get_widget (NautilusSidebarWidget* widget)
+{
+	g_return_val_if_fail (NAUTILUS_IS_SIDEBAR_WIDGET (widget), NULL);
+
+	return NAUTILUS_SIDEBAR_WIDGET_GET_IFACE (widget)->get_widget (widget);
+
+}
+
+void
+nautilus_sidebar_widget_selection_changed (NautilusSidebarWidget* widget, const GList* uris)
+{
+	g_return_if_fail (NAUTILUS_IS_SIDEBAR_WIDGET (widget));
+
+	NAUTILUS_SIDEBAR_WIDGET_GET_IFACE (widget)->selection_changed (widget, uris);
+}			       
+
+void
+nautilus_sidebar_widget_location_changed (NautilusSidebarWidget* widget, const char* uri)
+{
+	g_return_if_fail (NAUTILUS_IS_SIDEBAR_WIDGET (widget));
+
+	NAUTILUS_SIDEBAR_WIDGET_GET_IFACE (widget)->location_changed (widget, uri);
+}
--- nautilus-2.22.0/libnautilus-extension/nautilus-sidebar-widget.h	1970-01-01 01:00:00.000000000 +0100
+++ nautilus-2.22.0-workspace/libnautilus-extension/nautilus-sidebar-widget.h	2008-03-24 00:57:15.000000000 +0100
@@ -0,0 +1,60 @@
+/*
+ *   nautilus-sidebar-widget.c - Interface for Nautilus sidebar widgets.
+ *
+ *  Copyright (C) 2008 Amos Brocco
+ *
+ *  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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+/*  This interface is implemented by Nautilus extensions that want to 
+ *  provide information sidebar widgets. Those widges are created along
+ *  with the Information sidebar.
+ */
+
+#ifndef NAUTILUS_SIDEBAR_WIDGET_H
+#define NAUTILUS_SIDEBAR_WIDGET_H
+
+#include <glib-object.h>
+#include <gtk/gtkwidget.h>
+#include "nautilus-extension-types.h"
+
+G_BEGIN_DECLS
+
+#define NAUTILUS_TYPE_SIDEBAR_WIDGET		   (nautilus_sidebar_widget_get_type ())
+#define NAUTILUS_SIDEBAR_WIDGET(obj)           (G_TYPE_CHECK_INSTANCE_CAST ((obj), NAUTILUS_TYPE_SIDEBAR_WIDGET, NautilusSidebarWidget))
+#define NAUTILUS_IS_SIDEBAR_WIDGET(obj)        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NAUTILUS_TYPE_SIDEBAR_WIDGET))
+#define NAUTILUS_SIDEBAR_WIDGET_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), NAUTILUS_TYPE_SIDEBAR_WIDGET, NautilusSidebarWidgetIface))
+
+typedef struct _NautilusSidebarWidget       NautilusSidebarWidget;
+typedef struct _NautilusSidebarWidgetIface  NautilusSidebarWidgetIface;
+
+struct _NautilusSidebarWidgetIface {
+	GTypeInterface g_iface;
+
+	GtkWidget* 	(*get_widget) 			(NautilusSidebarWidget* widget);
+	void 		(*location_changed) 	(NautilusSidebarWidget* widget, const char* uri);
+	void 		(*selection_changed) 	(NautilusSidebarWidget* widget, const GList* uris);
+};
+
+/* Interface Functions */
+GType       	nautilus_sidebar_widget_get_type      		(void);
+GtkWidget* 		nautilus_sidebar_widget_get_widget    		(NautilusSidebarWidget* widget);
+void			nautilus_sidebar_widget_selection_changed 	(NautilusSidebarWidget* widget, const GList* uris);
+void			nautilus_sidebar_widget_location_changed	(NautilusSidebarWidget* widget, const char* uri);
+
+G_END_DECLS
+
+#endif
--- nautilus-2.22.0/libnautilus-extension/Makefile.am	2008-03-07 16:28:46.000000000 +0100
+++ nautilus-2.22.0-workspace/libnautilus-extension/Makefile.am	2008-03-23 15:56:17.000000000 +0100
@@ -30,6 +30,8 @@ libnautilus_extension_include_HEADERS=		
 	nautilus-menu-provider.h                \
 	nautilus-property-page-provider.h       \
 	nautilus-property-page.h                \
+	nautilus-sidebar-widget-provider.h	\
+	nautilus-sidebar-widget.h		\
 	nautilus-menu.h                         \
 	$(NULL)
 
@@ -45,6 +47,8 @@ libnautilus_extension_la_SOURCES=			\
 	nautilus-menu-provider.c                        \
 	nautilus-property-page-provider.c               \
 	nautilus-property-page.c                        \
+	nautilus-sidebar-widget-provider.c		\
+	nautilus-sidebar-widget.c			\
 	nautilus-menu.c                                 \
 	$(NULL)
 
--- nautilus-2.22.0/src/nautilus-information-panel.c	2008-03-07 16:28:03.000000000 +0100
+++ nautilus-2.22.0-workspace/src/nautilus-information-panel.c	2008-03-24 01:50:55.000000000 +0100
@@ -51,6 +51,9 @@
 #include <libnautilus-private/nautilus-program-choosing.h>
 #include <libnautilus-private/nautilus-sidebar-provider.h>
 #include <libnautilus-private/nautilus-module.h>
+#include <libnautilus-extension/nautilus-sidebar-widget-provider.h>
+#include <libnautilus-extension/nautilus-sidebar-widget.h>
+#include <gio/gio.h>
 
 struct NautilusInformationPanelDetails {
 	GtkVBox *container;
@@ -67,6 +70,8 @@ struct NautilusInformationPanelDetails {
 	char *default_background_image;
 	char *current_background_color;
 	char *current_background_image;
+
+	GList* widgets;
 };
 
 /* button assignments */
@@ -96,6 +101,16 @@ static void     nautilus_information_pan
 static void     sidebar_provider_iface_init                      (NautilusSidebarProviderIface *iface);
 static GType    nautilus_information_panel_provider_get_type     (void);
 
+/* Extension widgets */
+
+static gint	sort_widget_providers_by_position (gconstpointer a, gconstpointer b);
+static void	load_sidebar_extension_widgets (NautilusInformationPanel *panel);
+static void	add_sidebar_widget (NautilusInformationPanel *panel, NautilusSidebarWidget* widget);
+static void	sidebar_extension_widget_location_changed (NautilusInformationPanel *panel, const gchar* uri);
+static void	sidebar_extension_widget_selection_changed (NautilusInformationPanel *panel, const GList* uris);
+static void	init_sidebar_extension_widgets (NautilusInformationPanel *panel);
+static void	dispose_sidebar_extension_widgets (NautilusInformationPanel *panel);
+
 enum {
 	LOCATION_CHANGED,
 	LAST_SIGNAL
@@ -258,13 +273,18 @@ nautilus_information_panel_init (Nautilu
 	gtk_widget_show (GTK_WIDGET (information_panel->details->container));
 	gtk_container_add (GTK_CONTAINER (information_panel),
 			   GTK_WIDGET (information_panel->details->container));
-
+			   
 	/* allocate and install the index title widget */ 
 	information_panel->details->title = NAUTILUS_SIDEBAR_TITLE (nautilus_sidebar_title_new ());
 	gtk_widget_show (GTK_WIDGET (information_panel->details->title));
 	gtk_box_pack_start (GTK_BOX (information_panel->details->container),
 			    GTK_WIDGET (information_panel->details->title),
 			    FALSE, FALSE, GNOME_PAD);
+			   
+	/* Install extra widgets */
+	information_panel->details->widgets = NULL;
+	load_sidebar_extension_widgets (information_panel);
+	init_sidebar_extension_widgets (information_panel);		
 	
 	/* allocate and install the command button container */
 	make_button_box (information_panel);
@@ -278,7 +298,7 @@ nautilus_information_panel_init (Nautilu
 	gtk_drag_dest_set (GTK_WIDGET (information_panel),
 			   GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_DROP, 
 			   target_table, G_N_ELEMENTS (target_table),
-			   GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_ASK);
+			   GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_ASK);	   
 }
 
 static void
@@ -287,6 +307,8 @@ nautilus_information_panel_finalize (GOb
 	NautilusInformationPanel *information_panel;
 
 	information_panel = NAUTILUS_INFORMATION_PANEL (object);
+	
+	dispose_sidebar_extension_widgets (information_panel);
 
 	if (information_panel->details->file != NULL) {
 		nautilus_file_monitor_remove (information_panel->details->file, information_panel);
@@ -1071,6 +1093,8 @@ nautilus_information_panel_set_uri (Naut
 	nautilus_sidebar_title_set_file (information_panel->details->title,
 					 information_panel->details->file,
 					 initial_title);
+					 
+	sidebar_extension_widget_location_changed (information_panel, new_uri);
 }
 
 static void
@@ -1094,6 +1118,15 @@ nautilus_information_panel_style_set (Gt
 }
 
 static void
+selection_changed_callback (NautilusWindowInfo *window,
+		      NautilusInformationPanel *panel)
+{	
+	GList* selection = nautilus_window_info_get_selection (window);
+	sidebar_extension_widget_selection_changed (panel, selection);
+	g_list_free (selection);
+}
+
+static void
 loading_uri_callback (NautilusWindowInfo *window,
 		      char               *uri,
 		      NautilusInformationPanel *panel)
@@ -1104,6 +1137,8 @@ loading_uri_callback (NautilusWindowInfo
 	nautilus_information_panel_set_uri (panel, 
 					    uri,
 					    title);
+
+	sidebar_extension_widget_location_changed (panel, uri);
 	g_free (title);
 }
 
@@ -1119,6 +1154,8 @@ nautilus_information_panel_set_parent_wi
 				 G_CALLBACK (loading_uri_callback), panel, 0);
 	g_signal_connect_object (window, "title_changed",
 				 G_CALLBACK (title_changed_callback), panel, 0);
+    	g_signal_connect_object (window, "selection_changed",
+    			 G_CALLBACK (selection_changed_callback), panel, 0);
 	
 	title = nautilus_window_info_get_title (window);
 	location = nautilus_window_info_get_current_location (window);
@@ -1165,3 +1202,96 @@ nautilus_information_panel_register (voi
         nautilus_module_add_type (nautilus_information_panel_provider_get_type ());
 }
 
+/* Begin extension widget management */
+
+static gint
+sort_widget_providers_by_position (gconstpointer a, gconstpointer b)
+{
+	NautilusSidebarWidgetProvider* provider_a = (NautilusSidebarWidgetProvider*) a;
+	NautilusSidebarWidgetProvider* provider_b = (NautilusSidebarWidgetProvider*) b;
+
+	int p_a = nautilus_sidebar_widget_provider_get_order (provider_a);
+	int p_b = nautilus_sidebar_widget_provider_get_order (provider_b);
+
+	return p_a < p_b ? -1 : p_a == p_b ? 0 : 1;
+}
+
+static void
+load_sidebar_extension_widgets (NautilusInformationPanel *panel)
+{
+	GList *providers, *l;
+	NautilusSidebarWidget *widget;
+	
+	providers = nautilus_module_get_extensions_for_type (NAUTILUS_TYPE_SIDEBAR_WIDGET_PROVIDER);
+	providers = g_list_sort (providers, sort_widget_providers_by_position);
+
+	for (l = providers; l != NULL; l = l->next) {
+		NautilusSidebarWidgetProvider *provider;
+		
+		provider = NAUTILUS_SIDEBAR_WIDGET_PROVIDER (l->data);
+		widget = nautilus_sidebar_widget_provider_get_widget (provider);
+
+		if (widget != NULL) {
+			add_sidebar_widget (panel, widget);
+		}
+	}
+
+	nautilus_module_extension_list_free (providers);
+}
+
+static void
+add_sidebar_widget (NautilusInformationPanel *panel, NautilusSidebarWidget* widget)
+{
+	GList* widgets = panel->details->widgets;
+
+	panel->details->widgets = g_list_prepend (widgets, widget);
+}
+
+static void
+sidebar_extension_widget_location_changed (NautilusInformationPanel *panel, const gchar* uri)
+{
+	GList* widgets = panel->details->widgets;
+	GList* w;
+
+	for (w = widgets; w != NULL; w = w->next) {
+		NautilusSidebarWidget* widget = NAUTILUS_SIDEBAR_WIDGET (w->data);
+		nautilus_sidebar_widget_location_changed (widget, uri);
+	}
+}
+
+static void
+sidebar_extension_widget_selection_changed (NautilusInformationPanel *panel, const GList* uris)
+{
+	GList* widgets = panel->details->widgets;
+	GList* w;
+
+	for (w = widgets; w != NULL; w = w->next) {
+		NautilusSidebarWidget* widget = NAUTILUS_SIDEBAR_WIDGET (w->data);
+		nautilus_sidebar_widget_selection_changed (widget, uris);
+	}
+}
+
+static void
+init_sidebar_extension_widgets (NautilusInformationPanel *panel)
+{
+	GList* widgets = panel->details->widgets;
+	GList* w;
+
+	for (w = widgets; w != NULL; w = w->next) {
+		NautilusSidebarWidget* widget = NAUTILUS_SIDEBAR_WIDGET (w->data);
+		GtkWidget* actual_widget = nautilus_sidebar_widget_get_widget (widget);
+		gtk_box_pack_start (GTK_BOX (panel->details->container),
+			   GTK_WIDGET (actual_widget), FALSE, FALSE, GNOME_PAD);
+	}
+}
+
+static void
+dispose_sidebar_extension_widgets (NautilusInformationPanel *panel)
+{	
+	GList* widgets = panel->details->widgets;
+	
+	g_list_foreach (widgets, (GFunc) g_object_unref, NULL);
+	
+	g_list_free (widgets);
+}
+

Attachment: signature.asc
Description: Questa =?ISO-8859-1?Q?=E8?= una parte del messaggio firmata digitalmente



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