glade3 r2001 - in trunk: . gladeui plugins/gtk+



Author: tvb
Date: Sat Oct 25 21:43:00 2008
New Revision: 2001
URL: http://svn.gnome.org/viewvc/glade3?rev=2001&view=rev

Log:

	* gladeui/glade-convert.c: Properly convert toolbutton:icon both ways.

	* plugins/gtk+/glade-gtk.c: Undid a little toolbutton support so that
	stock-id remains untouched and is accessible in builder format, TODO
	rework toolbars and menus (will be simpler) with GladeEditable.



Modified:
   trunk/ChangeLog
   trunk/gladeui/glade-command.c
   trunk/gladeui/glade-project.c
   trunk/gladeui/glade-project.h
   trunk/plugins/gtk+/glade-convert.c
   trunk/plugins/gtk+/glade-gtk.c
   trunk/plugins/gtk+/glade-icon-sources.c

Modified: trunk/gladeui/glade-command.c
==============================================================================
--- trunk/gladeui/glade-command.c	(original)
+++ trunk/gladeui/glade-command.c	Sat Oct 25 21:43:00 2008
@@ -2260,41 +2260,55 @@
 }
 
 
+static gint
+find_format_only_object (GObject *object, gpointer fmtptr)
+{
+	GladeWidget *widget = glade_widget_get_from_gobject (object);
+	GladeProjectFormat fmt = GPOINTER_TO_INT (fmtptr);
+
+	if ((fmt == GLADE_PROJECT_FORMAT_GTKBUILDER &&
+	     GWA_LIBGLADE_ONLY (widget->adaptor)) ||
+	    /* If going in libglade format... */
+	    (fmt == GLADE_PROJECT_FORMAT_LIBGLADE &&
+	     /* ... and widget is unsupported by libglade */
+	     (GWA_LIBGLADE_UNSUPPORTED (widget->adaptor) ||
+	      /* ... and widget is a non GtkWidget object */
+	      !GTK_IS_WIDGET (widget->object) ||
+	      /* ... and its a non-window toplevel */
+	      (!widget->parent && !GTK_IS_WINDOW (widget->object)))))
+		return 0;
+
+	return -1;
+}
+
+
 static void
 glade_command_convert_cleanup (GladeProject       *project, 
 			       GladeProjectFormat  fmt)
 {
 	GladeWidget   *widget;
 	const GList   *objects, *list;
+	GList         *l;
 
-	objects = glade_project_get_objects (project);
+	/* List safely delete widgets */
+	while ((l = 
+		g_list_find_custom ((GList *)glade_project_get_objects (project), GINT_TO_POINTER (fmt),
+				    (GCompareFunc)find_project_only_object)) != NULL)
+	{
+		GList delete = { 0, };
+		delete.data = l->data;
+		glade_command_delete (&delete);
+	}
 
+	/* Deal with properties of remaining widgets */
+	objects = glade_project_get_objects (project);
 	for (list = objects; list; list = list->next)
 	{
 		widget = glade_widget_get_from_gobject (list->data);
-
-		/* If libglade-only widget going in builder format ... */
-		if ((fmt == GLADE_PROJECT_FORMAT_GTKBUILDER &&
-		     GWA_LIBGLADE_ONLY (widget->adaptor)) ||
-		    /* If going in libglade format... */
-		    (fmt == GLADE_PROJECT_FORMAT_LIBGLADE &&
-		     /* ... and widget is unsupported by libglade */
-		     (GWA_LIBGLADE_UNSUPPORTED (widget->adaptor) ||
-		      /* ... and widget is a non GtkWidget object */
-		      !GTK_IS_WIDGET (widget->object) ||
-		      /* ... and its a non-window toplevel */
-		      (!widget->parent && !GTK_IS_WINDOW (widget->object)))))
-		{
-			GList delete = { 0, };
-			delete.data = widget;
-			glade_command_delete (&delete);
-		}
-		else
-		{
-			glade_command_convert_cleanup_props (widget->properties, fmt);
-			glade_command_convert_cleanup_props (widget->packing_properties, fmt);
-		}
+		glade_command_convert_cleanup_props (widget->properties, fmt);
+		glade_command_convert_cleanup_props (widget->packing_properties, fmt);
 	}
+	g_list_free (objects);
 }
 
 

Modified: trunk/gladeui/glade-project.c
==============================================================================
--- trunk/gladeui/glade-project.c	(original)
+++ trunk/gladeui/glade-project.c	Sat Oct 25 21:43:00 2008
@@ -1046,7 +1046,7 @@
 	 */
 }
 
-gboolean
+static gboolean
 glade_project_load_from_file (GladeProject *project, const gchar *path)
 {
 	GladeXmlContext *context;
@@ -1075,9 +1075,9 @@
 	root = glade_xml_doc_get_root (doc);
 
 	if (glade_xml_node_verify_silent (root, GLADE_XML_TAG_LIBGLADE_PROJECT))
-		project->priv->format = GLADE_PROJECT_FORMAT_LIBGLADE;
+		glade_project_set_format (project, GLADE_PROJECT_FORMAT_LIBGLADE);
 	else if (glade_xml_node_verify_silent (root, GLADE_XML_TAG_BUILDER_PROJECT))
-		project->priv->format = GLADE_PROJECT_FORMAT_GTKBUILDER;
+		glade_project_set_format (project, GLADE_PROJECT_FORMAT_GTKBUILDER);
 	else
 	{
 		g_warning ("Couldnt determine project format, skipping %s", path);
@@ -1088,7 +1088,6 @@
 	/* XXX Need to load project->priv->comment ! */
 	glade_project_read_comment (project, doc);
 
-
 	if (glade_project_read_requires (project, root, path) == FALSE)
 	{
 		glade_xml_context_free (context);

Modified: trunk/gladeui/glade-project.h
==============================================================================
--- trunk/gladeui/glade-project.h	(original)
+++ trunk/gladeui/glade-project.h	Sat Oct 25 21:43:00 2008
@@ -69,8 +69,6 @@
 
 GladeProject  *glade_project_new                 (void);
 
-gboolean       glade_project_load_from_file      (GladeProject *project, const gchar *path);
-
 GladeProject  *glade_project_load                (const gchar  *path);
 
 gboolean       glade_project_save                (GladeProject *project, 

Modified: trunk/plugins/gtk+/glade-convert.c
==============================================================================
--- trunk/plugins/gtk+/glade-convert.c	(original)
+++ trunk/plugins/gtk+/glade-convert.c	Sat Oct 25 21:43:00 2008
@@ -31,6 +31,7 @@
 #include "glade-gtk.h"
 #include "glade-column-types.h"
 #include "glade-model-data.h"
+#include "glade-icon-sources.h"
 #include <gladeui/glade.h>
 
 
@@ -55,6 +56,7 @@
 	GList *textviews;
 	GList *tooltips;
 	GList *combos;
+	GList *toolbuttons;
 } ConvertData;
 
 /*****************************************
@@ -297,7 +299,7 @@
 }
 
 /*****************************************
- *           GtkWidget:tooltips          *
+ *           GtkWidget:tooltip           *
  *****************************************/
 static void
 convert_tooltips_finished (GladeProject  *project,
@@ -536,6 +538,187 @@
 	g_list_free (data->combos);
 }
 
+/******************************
+ *     ToolButton:icon        *
+ ******************************/
+static void
+convert_toolbuttons_finished (GladeProject  *project,
+			      ConvertData   *data)
+{
+	GladeProjectFormat  new_format = glade_project_get_format (project);
+	GladeWidgetAdaptor *adaptor = glade_widget_adaptor_get_by_type (GTK_TYPE_ICON_FACTORY);
+	GladeWidget        *icon_factory = NULL;
+	GladeIconSources   *icon_sources = NULL;
+	GladeProperty      *property;
+	TextData           *tdata;
+	GtkIconSource      *source;
+	GList              *list, *source_list;
+	gchar              *filename;
+	GValue             *value;
+	GdkPixbuf          *pixbuf;
+
+	if (new_format == GLADE_PROJECT_FORMAT_GTKBUILDER)
+	{
+		/* Generate icon_sources first... */
+		for (list = data->toolbuttons; list; list = list->next)
+		{
+			tdata = list->data;
+
+			filename = g_strdup_printf ("generated-icon-%s", tdata->text);
+			glade_util_replace (filename, '.', '-');
+
+			/* get icon source with pixbuf from tdata->text */
+			value = glade_utils_value_from_string (GDK_TYPE_PIXBUF, tdata->text,
+							       project, tdata->widget);
+			pixbuf = g_value_get_object (value);
+			source = gtk_icon_source_new ();
+			gtk_icon_source_set_pixbuf (source, pixbuf);
+			g_value_unset (value);
+			g_free (value);
+			
+			/* Add to the icon source (only one icon set list per icon) */
+			if (!icon_sources)
+				icon_sources = glade_icon_sources_new ();
+			source_list = g_list_append (NULL, source);
+			g_hash_table_insert (icon_sources->sources, g_strdup (filename), source_list);
+			
+			g_free (filename);
+		}
+
+		if (icon_sources)
+		{
+			icon_factory = glade_command_create (adaptor, NULL, NULL, project);
+
+			property = glade_widget_get_property (icon_factory, "sources");
+			glade_command_set_property (property, icon_sources);
+			glade_icon_sources_free (icon_sources);
+		}
+
+		for (list = data->toolbuttons; list; list = list->next)
+		{
+			tdata = list->data;
+
+			filename = g_strdup_printf ("generated-icon-%s", tdata->text);
+			glade_util_replace (filename, '.', '-');
+
+			/* Set stock-id for newly generated icon */
+			property = glade_widget_get_property (tdata->widget, "stock-id");
+			glade_command_set_property (property, filename);
+
+			g_free (filename);
+			g_free (tdata->text);
+			g_free (tdata);
+		}
+	}
+	else
+	{
+		/* Set "icon" property */
+		for (list = data->toolbuttons; list; list = list->next)
+		{
+			tdata = list->data;
+
+			value = glade_utils_value_from_string (GDK_TYPE_PIXBUF, 
+							       tdata->text, 
+							       project, tdata->widget);
+			pixbuf = g_value_get_object (value);
+			property = glade_widget_get_property (tdata->widget, "icon");
+			glade_command_set_property (property, pixbuf);
+			g_value_unset (value);
+			g_free (value);
+
+			g_free (tdata->text);
+			g_free (tdata);
+		}
+	}
+
+	g_list_free (data->toolbuttons);
+}
+
+
+static gint
+find_icon_factory (GObject *object, gpointer blah)
+{
+	if (GTK_IS_ICON_FACTORY (object))
+		return 0;
+	return -1;
+}
+
+static void
+convert_toolbuttons (GladeProject       *project,
+		     GladeProjectFormat  new_format,
+		     ConvertData        *data)
+{
+	GladeIconSources *icon_sources = NULL;
+	GladeWidget      *widget, *gfactory;
+	GladeProperty    *property;
+	GtkIconSource    *source;
+	const GList      *objects, *element;
+	TextData         *tdata;
+	GdkPixbuf        *pixbuf;
+	gchar            *filename = NULL, *stock_id = NULL;
+
+	for (objects = glade_project_get_objects (project); objects; objects = objects->next)
+	{
+		widget = glade_widget_get_from_gobject (objects->data);
+		if (!GTK_IS_TOOL_BUTTON (widget->object))
+			continue;
+
+		if (new_format == GLADE_PROJECT_FORMAT_GTKBUILDER)
+		{
+			pixbuf = NULL;
+			property = glade_widget_get_property (widget, "icon");
+			glade_property_get (property, &pixbuf);
+		
+			if (pixbuf)
+			{
+				filename = g_object_get_data (G_OBJECT (pixbuf), "GladeFileName");
+
+				tdata = g_new0 (TextData, 1);
+				tdata->widget = widget;
+				tdata->text = g_strdup (filename);
+				data->toolbuttons = g_list_prepend (data->toolbuttons, tdata);
+
+				glade_command_set_property (property, NULL);
+			}
+		}
+		else
+		{
+			/* If any stock's are provided in the icon factory, convert
+			 * them to the "icon" property
+			 */
+			property = glade_widget_get_property (widget, "stock-id");
+			glade_property_get (property, &stock_id);
+			if (!stock_id)
+				continue;
+			
+			if ((element = 
+			     g_list_find_custom ((GList *)objects, NULL,
+						 (GCompareFunc)find_icon_factory)) != NULL)
+			{
+				gfactory = glade_widget_get_from_gobject (element->data);
+				property = glade_widget_get_property (gfactory, "sources");
+				glade_property_get (property, &icon_sources);
+
+				if (icon_sources &&
+				    (element = g_hash_table_lookup (icon_sources->sources, stock_id)))
+				{
+					source = element->data;
+					pixbuf = gtk_icon_source_get_pixbuf (source);
+					filename = g_object_get_data (G_OBJECT (pixbuf), 
+								      "GladeFileName");
+					if (filename)
+					{
+						tdata = g_new0 (TextData, 1);
+						tdata->widget     = widget;
+						tdata->text       = g_strdup (filename);
+						data->toolbuttons = g_list_prepend (data->toolbuttons, tdata);
+					}
+				}
+			}
+		}
+	}
+}
+
 
 /*****************************************
  *           Main entry point            *
@@ -548,6 +731,7 @@
 	convert_textviews_finished (project, data);
 	convert_tooltips_finished (project, data);
 	convert_combos_finished (project, data);
+	convert_toolbuttons_finished (project, data);
 
 	/* Once per conversion */
 	g_signal_handlers_disconnect_by_func (G_OBJECT (project),
@@ -566,6 +750,7 @@
 	convert_textviews (project, new_format, data);
 	convert_tooltips (project, new_format, data);
 	convert_combos (project, new_format, data);
+	convert_toolbuttons (project, new_format, data);
 
 	/* Clean up after the new_format is in effect */
 	g_signal_connect (G_OBJECT (project), "convert-finished",

Modified: trunk/plugins/gtk+/glade-gtk.c
==============================================================================
--- trunk/plugins/gtk+/glade-gtk.c	(original)
+++ trunk/plugins/gtk+/glade-gtk.c	Sat Oct 25 21:43:00 2008
@@ -6857,31 +6857,11 @@
 static void
 glade_gtk_tool_button_set_stock_id (GObject *object, const GValue *value)
 {
-	GladeWidget *gbutton;
-	GEnumClass *eclass;
-	GEnumValue *eval;
 	const gchar *stock_id;
 	
 	g_return_if_fail (GTK_IS_TOOL_BUTTON (object));
-	gbutton = glade_widget_get_from_gobject (object);
-		
-	if ((stock_id = g_value_get_string (value)))
-	{
-		eclass = g_type_class_ref (GLADE_TYPE_STOCK_IMAGE);
-
-		if ((eval = g_enum_get_value_by_nick (eclass, stock_id)) != NULL)
-			glade_widget_property_set (gbutton, "glade-stock", eval->value);
-		else
-		{
-			glade_widget_property_set (gbutton, "glade-stock", 
-						   "gtk-missing-image");
-			g_warning ("Invalid stock-id '%s' found in toolbutton", stock_id);
-		}
-
-		glade_widget_property_set (gbutton, "glade-type", GLADEGTK_IMAGE_STOCK);
 		
-		g_type_class_unref (eclass);
-	}
+	stock_id = g_value_get_string (value);
 	
 	if (stock_id && strlen (stock_id) == 0) stock_id = NULL;
 	
@@ -6907,11 +6887,6 @@
 
 		if ((eval = g_enum_get_value (eclass, val)) != NULL)
 			glade_widget_property_set (gbutton, "stock-id", eval->value_nick);
-		else
-		{
-			glade_widget_property_set (gbutton, "stock-id", "gtk-missing-image");
-			g_warning ("Invalid glade stock id '%d' found in toolbutton", val);
-		}		
 		g_type_class_unref (eclass);
 	}
 	else

Modified: trunk/plugins/gtk+/glade-icon-sources.c
==============================================================================
--- trunk/plugins/gtk+/glade-icon-sources.c	(original)
+++ trunk/plugins/gtk+/glade-icon-sources.c	Sat Oct 25 21:43:00 2008
@@ -312,6 +312,9 @@
 	gtk_tree_store_clear (eprop_sources->store);
 	gtk_list_store_clear (eprop_sources->icon_names_store);
 
+	if (!GLADE_EDITOR_PROPERTY (eprop_sources)->property)
+		return;
+
 	glade_property_get (GLADE_EDITOR_PROPERTY (eprop_sources)->property, &sources);
 
 	if (sources)



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