Hello this patch adds undo/redo buttons to the menu editor :)

Tristan feel free to change glade_app_[undo/redo]_button_new() related
functions to another file if you think they do not belong to glade-app.c
(I think they do because undo/redo command are app specific and not
project)


2006-01-23  Juan Pablo Ugarte <[EMAIL PROTECTED]>

        * glade-app.[ch]: glade_app_[undo/redo]_button_new()
          new functions to create undo/redo buttons which are updated
          automatically.

        * glade-gtk.c: glade_gtk_table_has_child() fixed (bug 325791)
          undo/redo buttons added to MenuBarEditor
Index: src/glade-app.c
===================================================================
RCS file: /cvs/gnome/glade3/src/glade-app.c,v
retrieving revision 1.29
diff -u -r1.29 glade-app.c
--- src/glade-app.c	22 Jan 2006 09:09:33 -0000	1.29
+++ src/glade-app.c	23 Jan 2006 23:06:23 -0000
@@ -82,6 +82,7 @@
 				      * GladeWidgets.
 				      */
 	GtkAccelGroup *accel_group;	/* Default acceleration group for this app */
+	GList *undo_list, *redo_list;	/* Lists of buttons to refresh in update-ui signal */
 };
 
 enum
@@ -332,6 +333,64 @@
 }
 
 static void
+glade_app_refresh_undo_redo_button (GladeApp *app,
+				    GtkWidget *button,
+				    gboolean undo)
+{
+	GladeCommand *command = NULL;
+	static GtkTooltips *button_tips = NULL;
+	GladeProject *project;
+	gchar *desc;
+
+	if (button_tips == NULL)
+		button_tips = gtk_tooltips_new ();
+	
+	if ((project = glade_app_get_active_project (app)) != NULL)
+	{
+		if (undo)
+			command = glade_command_next_undo_item (project);
+		else
+			command = glade_command_next_redo_item (project);
+	}
+
+	/* Change tooltips */
+	desc = g_strdup_printf ((undo) ? _("Undo: %s") : _("Redo: %s"),
+			command ? command->description : _("the last action"));
+	gtk_tooltips_set_tip (GTK_TOOLTIPS (button_tips), button, desc, NULL);
+	g_free (desc);
+
+	/* Set sensitivity on the button */
+	gtk_widget_set_sensitive (button, command != NULL);
+}
+
+void
+glade_app_undo_redo_button_update_ui (GladeApp *app)
+{
+	GList *list;
+	gboolean clean_undo_list = FALSE, clean_redo_list = FALSE;
+	
+	for (list = app->priv->undo_list; list; list = list->next)
+	{
+		if (list->data)
+			glade_app_refresh_undo_redo_button (app, list->data, TRUE);
+		else
+			clean_undo_list = TRUE;
+	}
+	if (clean_undo_list)
+		app->priv->undo_list = g_list_remove_all (app->priv->undo_list, NULL);
+		
+	for (list = app->priv->redo_list; list; list = list->next)
+	{
+		if (list->data)
+			glade_app_refresh_undo_redo_button (app, list->data, FALSE);
+		else
+			clean_redo_list = TRUE;
+	}
+	if (clean_redo_list)
+		app->priv->redo_list = g_list_remove_all (app->priv->redo_list, NULL);
+}
+
+static void
 glade_app_init (GladeApp *app)
 {
 	static gboolean initialized = FALSE;
@@ -394,6 +453,12 @@
 
 	/* Load the configuration file */
 	app->priv->config = glade_app_config_load (app);
+	
+	/* Undo/Redo button list */
+	app->priv->undo_list = app->priv->redo_list = NULL;
+	g_signal_connect (app, "update-ui", 
+			  G_CALLBACK (glade_app_undo_redo_button_update_ui),
+			  NULL);	
 }
 
 GType
@@ -807,6 +872,48 @@
 	app->priv->accel_group = accel_group;
 }
 
+static GtkWidget *
+glade_app_undo_redo_button_new (GladeApp *app, gboolean undo)
+{
+	GtkWidget *button;
+	
+	button = gtk_button_new_from_stock ((undo) ? 
+					    GTK_STOCK_UNDO : 
+					    GTK_STOCK_REDO);
+	
+	g_signal_connect_swapped (button, "clicked",
+				  (undo) ? G_CALLBACK (glade_app_command_undo) : 
+					   G_CALLBACK (glade_app_command_redo),
+				  app);
+	
+	if (undo)
+	{
+		app->priv->undo_list = g_list_prepend (app->priv->undo_list, button);
+		g_object_add_weak_pointer (G_OBJECT (button), &app->priv->undo_list->data);
+	}
+	else
+	{
+		app->priv->redo_list = g_list_prepend (app->priv->redo_list, button);
+		g_object_add_weak_pointer (G_OBJECT (button), &app->priv->redo_list->data);
+	}
+	
+	glade_app_refresh_undo_redo_button (app, button, undo);
+	
+	return button;
+}
+
+GtkWidget *
+glade_app_undo_button_new (GladeApp *app)
+{
+	return glade_app_undo_redo_button_new (app, TRUE);
+}
+
+GtkWidget *
+glade_app_redo_button_new (GladeApp *app)
+{
+	return glade_app_undo_redo_button_new (app, FALSE);
+}
+
 /* Default application convinience functions */
 
 static GladeApp *glade_default_app = NULL;
@@ -1027,3 +1134,16 @@
 	}
 }
 
+GtkWidget *
+glade_default_app_undo_button_new (void)
+{
+	g_return_val_if_fail (glade_default_app != NULL, NULL);
+	return glade_app_undo_redo_button_new (glade_default_app, TRUE);
+}
+
+GtkWidget *
+glade_default_app_redo_button_new (void)
+{
+	g_return_val_if_fail (glade_default_app != NULL, NULL);
+	return glade_app_undo_redo_button_new (glade_default_app, FALSE);
+}
Index: src/glade-app.h
===================================================================
RCS file: /cvs/gnome/glade3/src/glade-app.h,v
retrieving revision 1.12
diff -u -r1.12 glade-app.h
--- src/glade-app.h	6 Dec 2005 20:46:48 -0000	1.12
+++ src/glade-app.h	23 Jan 2006 23:06:23 -0000
@@ -101,6 +101,9 @@
 LIBGLADEUI_API void               glade_app_set_accel_group (GladeApp *app, GtkAccelGroup *accel_group);
 LIBGLADEUI_API void               glade_app_update_instance_count  (GladeApp *app, GladeProject *project);
 
+LIBGLADEUI_API GtkWidget 	 *glade_app_undo_button_new (GladeApp *app);
+LIBGLADEUI_API GtkWidget 	 *glade_app_redo_button_new (GladeApp *app);
+
 /* Default glade application */
 LIBGLADEUI_API void               glade_default_app_set (GladeApp *app);
 LIBGLADEUI_API GtkWidget*         glade_default_app_get_window (void);
@@ -131,7 +134,8 @@
 								      gboolean      emit_signal);
 LIBGLADEUI_API void               glade_default_app_selection_clear  (gboolean      emit_signal);
 LIBGLADEUI_API void               glade_default_app_selection_changed(void);
-
+LIBGLADEUI_API GtkWidget	         *glade_default_app_undo_button_new  (void);
+LIBGLADEUI_API GtkWidget	         *glade_default_app_redo_button_new  (void);
 
 G_END_DECLS
 
Index: src/glade-gtk.c
===================================================================
RCS file: /cvs/gnome/glade3/src/glade-gtk.c,v
retrieving revision 1.96
diff -u -r1.96 glade-gtk.c
--- src/glade-gtk.c	23 Jan 2006 02:22:33 -0000	1.96
+++ src/glade-gtk.c	23 Jan 2006 23:06:31 -0000
@@ -496,25 +496,15 @@
 
 /* GtkTable */
 static gboolean
-glade_gtk_table_has_child (GtkTable *table,
-			   guint left_attach,
-			   guint right_attach,
-			   guint top_attach,
-			   guint bottom_attach)
+glade_gtk_table_has_child (GtkTable *table, guint left_attach, guint top_attach)
 {
 	GList *list;
 
 	for (list = table->children; list && list->data; list = list->next)
 	{
 		GtkTableChild *child = list->data;
-		
-		if (child->left_attach   == left_attach &&
-		    child->right_attach  == right_attach &&
-		    child->top_attach    == top_attach &&
-		    child->bottom_attach == bottom_attach)
-
-		if (left_attach >= child->left_attach && left_attach <= child->right_attach &&
-		    top_attach >= child->top_attach && top_attach <= child->bottom_attach)
+		if (left_attach >= child->left_attach && left_attach < child->right_attach &&
+		    top_attach >= child->top_attach && top_attach < child->bottom_attach)
 			return TRUE;
 
 	}
@@ -585,8 +575,7 @@
 
 	for (i = 0; i < table->ncols; i++)
 		for (j = 0; j < table->nrows; j++)
-			if (glade_gtk_table_has_child
-			    (table, i, i + 1, j, j + 1) == FALSE)
+			if (glade_gtk_table_has_child (table, i, j) == FALSE)
 				gtk_table_attach_defaults
 					(table, glade_placeholder_new (),
 					 i, i + 1, j, j + 1);
@@ -1950,8 +1939,7 @@
 	if (position < 0)
 	{
 		position = glade_gtk_menu_shell_get_item_position (container, child);
-		glade_widget_property_set (gitem, "position", position);
-		return;
+		g_value_set_int (value, position);
 	}
 	
 	g_object_ref (child);
@@ -3332,7 +3320,7 @@
 	}
 	
 	if (glade_gtk_menu_editor_is_child (e, widget))
-		g_idle_add (glade_gtk_menu_editor_update_treeview_idle, e);
+		glade_gtk_menu_editor_update_treeview_idle (e);
 
 }
 
@@ -3411,10 +3399,12 @@
 	GladeGtkMenuEditor *e;
 	GtkCellRenderer *renderer;
 	GtkTreeViewColumn *column;
-	GtkWidget *vbox, *signal_editor_w, *paned, *hbox, *prop_vbox;
-	GtkWidget *label, *scroll, *item, *button, *buttonbox;
+	GtkWidget *vbox, *signal_editor_w, *paned, *hbox, *prop_vbox, *tree_vbox;
+	GtkWidget *label, *scroll, *item, *button, *buttonbox, *button_table;
 	gchar *title;
 
+	if (menubar == NULL) return NULL;
+		
 	if (g_object_get_data (menubar, "GladeGtkMenuEditor")) return NULL;
 	
 	/* Editor's struct */
@@ -3474,11 +3464,15 @@
 	hbox = gtk_hbox_new (FALSE, 8);
 	gtk_paned_pack1 (GTK_PANED (paned), hbox, TRUE, FALSE);
 	
+	/* TreeView Vbox */
+	tree_vbox = gtk_vbox_new (FALSE, 8);
+	gtk_box_pack_start (GTK_BOX (hbox), tree_vbox, FALSE, TRUE, 0);
+	
 	/* ScrolledWindow */
 	scroll = gtk_scrolled_window_new (NULL, NULL);
 	gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroll), GTK_SHADOW_IN);
 	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
-	gtk_box_pack_start (GTK_BOX (hbox), scroll, FALSE, TRUE, 0);
+	gtk_box_pack_start (GTK_BOX (tree_vbox), scroll, TRUE, TRUE, 0);
 
 	/* TreeView */
 	e->treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (e->store));
@@ -3512,6 +3506,19 @@
 
 	gtk_container_add (GTK_CONTAINER (scroll), e->treeview);
 	
+	/* Add/Remove buttons */
+	button_table = gtk_table_new (1, 2, TRUE);
+	gtk_table_set_col_spacings (GTK_TABLE (button_table), 8);
+	gtk_box_pack_start (GTK_BOX (tree_vbox), button_table, FALSE, TRUE, 0);
+	
+	button = gtk_button_new_from_stock (GTK_STOCK_ADD);
+	g_signal_connect (button, "clicked", G_CALLBACK (glade_gtk_menu_editor_add_item_activate), e);
+	gtk_table_attach_defaults (GTK_TABLE (button_table), button, 0, 1, 0, 1);
+
+	e->remove_button = button = gtk_button_new_from_stock (GTK_STOCK_REMOVE);
+	g_signal_connect (button, "clicked", G_CALLBACK (glade_gtk_menu_editor_delete_item_activate), e);
+	gtk_table_attach_defaults (GTK_TABLE (button_table), button, 1, 2, 0, 1);
+	
 	/* PopUp */
 	e->popup = gtk_menu_new ();
 	
@@ -3561,12 +3568,10 @@
 	gtk_box_set_spacing (GTK_BOX (buttonbox), 8);
 	gtk_box_pack_start (GTK_BOX (vbox), buttonbox, FALSE, TRUE, 0);
 
-	button = gtk_button_new_from_stock (GTK_STOCK_ADD);
-	g_signal_connect (button, "clicked", G_CALLBACK (glade_gtk_menu_editor_add_item_activate), e);
+	button = glade_default_app_undo_button_new ();
 	gtk_container_add (GTK_CONTAINER (buttonbox), button);
 
-	e->remove_button = button = gtk_button_new_from_stock (GTK_STOCK_REMOVE);
-	g_signal_connect (button, "clicked", G_CALLBACK (glade_gtk_menu_editor_delete_item_activate), e);
+	button = glade_default_app_redo_button_new ();
 	gtk_container_add (GTK_CONTAINER (buttonbox), button);
 
 	button = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
@@ -3592,24 +3597,17 @@
 	{
 		gtk_window_set_default_size (GTK_WINDOW (editor->window), 600, 440);
 		gtk_widget_show (editor->window);
+		return;
 	}
 	else
 	{
-		GtkWidget *dialog;
 		GladeWidget *gmenubar = glade_widget_get_from_gobject (menubar);
 		
-		dialog = gtk_message_dialog_new (NULL,
-				GTK_DIALOG_MODAL,
-				GTK_MESSAGE_INFO,
-				GTK_BUTTONS_OK,
-				_("An MenuBar editor is already runing for \"%s\""),
-				glade_widget_get_name (gmenubar));
-		
-		gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), 
-			_("It is not posible to launch more than one editor per menubar."));
-		
-		gtk_dialog_run (GTK_DIALOG (dialog));
-		gtk_widget_destroy (dialog);
+		glade_util_ui_message (GTK_WIDGET (glade_default_app_get_transient_parent ()),
+					GLADE_UI_INFO,
+					_("An MenuBar editor is already runing for \"%s\"\n"
+					  "It is not posible to launch more than one editor per menubar."),
+					(gmenubar) ? glade_widget_get_name (gmenubar) : _("unknown"));
 	}
 }
_______________________________________________
Glade-devel maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/glade-devel

Reply via email to