Hi, this is my first message to glade-devel.

I wrote the attached simple (and is somewhat a quick and dirty hack)
to implement a preview feature in glade-3. The patch is against the
svn revision 1693.

It is still not ready for inclusion, but I would like to hear feedback
from developers and users about how to do it right.

There are currently some issues:
 * The currently seen project is saved in /tmp/temp.glade
 * The project must have a toplevel widget called window1
 *...

Feedback would be welcome, thanks.
Index: src/glade-window.c
===================================================================
--- src/glade-window.c	(revisão 1693)
+++ src/glade-window.c	(cópia de trabalho)
@@ -38,6 +38,9 @@
 #include <gdk/gdkkeysyms.h>
 #include <gtk/gtkstock.h>
 
+#include <glade/glade.h>
+#include <gtk/gtk.h>
+
 #define ACTION_GROUP_STATIC             "GladeStatic"
 #define ACTION_GROUP_PROJECT            "GladeProject"
 #define ACTION_GROUP_PROJECTS_LIST_MENU "GladeProjectsList"
@@ -109,6 +112,8 @@
 	
 	GtkToggleToolButton *selector_button;      /* the widget selector button (replaces the one in the palette) */
 	GtkToggleToolButton *drag_resize_button;   /* sets the pointer to drag/resize mode */
+	GtkToggleToolButton *preview_button;       /* sets the pointer to peview mode */
+
 	gboolean             setting_pointer_mode; /* avoid feedback signal loops */
 
 	GtkToolItem         *undo;                 /* customized buttons for undo/redo with history */
@@ -904,6 +909,51 @@
 }
 
 static void
+on_preview_button_toggled (GtkToggleToolButton *button, GladeWindow *window)
+{
+	GladeProject *project;
+	GError   *error = NULL;
+	GladeWindowPrivate *p = window->priv;
+	GtkWidget *view;
+
+	int n = gtk_notebook_get_current_page (GTK_NOTEBOOK (p->notebook));
+
+	view = gtk_notebook_get_nth_page (GTK_NOTEBOOK (p->notebook), n);
+	project = glade_design_view_get_project (GLADE_DESIGN_VIEW (view));
+
+
+	printf("Preview!\n");
+
+	if (!glade_project_save (project, "/tmp/temp.glade", &error))
+	{
+		/* Reset path so future saves will prompt the file chooser */
+		glade_project_reset_path (project);
+		glade_util_ui_message (GTK_WIDGET (window), GLADE_UI_ERROR, 
+				       _("Failed to save %s: %s"),
+				       "/tmp/temp.glade", error->message);
+		g_error_free (error);
+		return;
+	}
+
+	
+	if (window->priv->setting_pointer_mode)
+		return;
+
+	if (gtk_toggle_tool_button_get_active (window->priv->preview_button))
+		/* To be changed for preview mode */
+		glade_app_set_pointer_mode (GLADE_POINTER_DRAG_RESIZE);
+	else
+		gtk_toggle_tool_button_set_active (window->priv->preview_button, TRUE);
+
+	GladeXML *xml;
+	xml = glade_xml_new("/tmp/temp.glade", NULL, NULL);
+	printf("File loaded!\n");
+	GtkWidget *window1;
+	window1 = glade_xml_get_widget (xml, "window1");
+	gtk_widget_show (window1);
+}
+
+static void
 on_pointer_mode_changed (GladeApp           *app,
 			 GParamSpec         *pspec,
 			 GladeWindow *window)
@@ -919,6 +969,7 @@
 		gtk_toggle_tool_button_set_active (window->priv->drag_resize_button, TRUE);
 	else
 		gtk_toggle_tool_button_set_active (window->priv->drag_resize_button, FALSE);
+	/* Add preview here ! */
 
 	window->priv->setting_pointer_mode = FALSE;
 }
@@ -2539,6 +2590,34 @@
 	return GTK_WIDGET (button);
 }
 
+static GtkWidget *
+create_preview_tool_button (GtkToolbar *toolbar)
+{
+	GtkToolItem  *button;
+	GtkWidget    *image;
+	gchar        *image_path;
+	
+	image_path = g_build_filename (glade_app_get_pixmaps_dir (), "preview.png", NULL);
+	image = gtk_image_new_from_file (image_path);
+	g_free (image_path);
+	
+	button = gtk_toggle_tool_button_new ();
+	gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (button), TRUE);
+	
+	gtk_tool_button_set_icon_widget (GTK_TOOL_BUTTON (button), image);
+	gtk_tool_button_set_label (GTK_TOOL_BUTTON (button), _("Preview"));
+	
+	gtk_tool_item_set_tooltip (GTK_TOOL_ITEM (button),
+				   toolbar->tooltips,
+				   _("Preview project"),
+				   NULL);
+	
+	gtk_widget_show (GTK_WIDGET (button));
+	gtk_widget_show (image);
+	
+	return GTK_WIDGET (button);
+}
+
 static void
 add_project (GladeWindow *window, GladeProject *project)
 {
@@ -3161,7 +3240,7 @@
 	widget = gtk_ui_manager_get_widget (priv->ui, "/MenuBar/FileMenu/OpenRecent");
 	gtk_menu_item_set_submenu (GTK_MENU_ITEM (widget), priv->recent_menu);		  
 	
-	/* palette selector & drag/resize buttons */
+	/* palette selector, drag/resize and preview buttons */
 	sep = GTK_WIDGET (gtk_separator_tool_item_new());
 	gtk_widget_show (GTK_WIDGET (sep));
 	gtk_toolbar_insert (GTK_TOOLBAR (priv->toolbar), GTK_TOOL_ITEM (sep), -1);
@@ -3176,14 +3255,24 @@
 					(GTK_TOOLBAR (priv->toolbar)));	
 	gtk_toolbar_insert (GTK_TOOLBAR (priv->toolbar), 
 			    GTK_TOOL_ITEM (priv->drag_resize_button), -1);
+
+	priv->preview_button = 
+		GTK_TOGGLE_TOOL_BUTTON (create_preview_tool_button 
+					(GTK_TOOLBAR (priv->toolbar)));	
+	gtk_toolbar_insert (GTK_TOOLBAR (priv->toolbar), 
+			    GTK_TOOL_ITEM (priv->preview_button), -1);
+
 	
 	gtk_toggle_tool_button_set_active (priv->selector_button, TRUE);
 	gtk_toggle_tool_button_set_active (priv->drag_resize_button, FALSE);
+	gtk_toggle_tool_button_set_active (priv->preview_button, FALSE);
 
 	g_signal_connect (G_OBJECT (priv->selector_button), "toggled",
 			  G_CALLBACK (on_selector_button_toggled), window);
 	g_signal_connect (G_OBJECT (priv->drag_resize_button), "toggled",
 			  G_CALLBACK (on_drag_resize_button_toggled), window);
+	g_signal_connect (G_OBJECT (priv->preview_button), "toggled",
+			  G_CALLBACK (on_preview_button_toggled), window);
 	g_signal_connect (G_OBJECT (glade_app_get()), "notify::pointer-mode",
 			  G_CALLBACK (on_pointer_mode_changed), window);
 	
_______________________________________________
Glade-devel maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/glade-devel

Reply via email to