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