handle parent widget not being a GtkWindow by calling

2004-10-13  Sven Neumann  <sven@gimp.org>

	* app/widgets/gimpmessagedialog.c: handle parent widget not being
	a GtkWindow by calling gtk_widget_get_toplevel().

	* app/actions/data-commands.c
	* app/actions/edit-commands.c
	* app/actions/file-commands.c: ported more boolean queries to
	GimpMessageDialog.
This commit is contained in:
Sven Neumann 2004-10-13 15:27:00 +00:00 committed by Sven Neumann
parent 8300c550e3
commit 2b2737f2ad
5 changed files with 123 additions and 88 deletions

View file

@ -1,3 +1,13 @@
2004-10-13 Sven Neumann <sven@gimp.org>
* app/widgets/gimpmessagedialog.c: handle parent widget not being
a GtkWindow by calling gtk_widget_get_toplevel().
* app/actions/data-commands.c
* app/actions/edit-commands.c
* app/actions/file-commands.c: ported more boolean queries to
GimpMessageDialog.
2004-10-13 Sven Neumann <sven@gimp.org>
* app/widgets/Makefile.am

View file

@ -33,6 +33,8 @@
#include "widgets/gimpdataeditor.h"
#include "widgets/gimpdatafactoryview.h"
#include "widgets/gimpdialogfactory.h"
#include "widgets/gimpmessagebox.h"
#include "widgets/gimpmessagedialog.h"
#include "dialogs/dialogs.h"
@ -53,9 +55,9 @@ struct _GimpDataDeleteData
/* local function prototypes */
static void data_delete_callback (GtkWidget *widget,
gboolean delete,
gpointer data);
static void data_delete_confirm_response (GtkWidget *dialog,
gint response_id,
GimpDataDeleteData *delete_data);
/* public functions */
@ -138,32 +140,33 @@ data_delete_data_cmd_callback (GtkAction *action,
{
GimpDataDeleteData *delete_data;
GtkWidget *dialog;
gchar *str;
delete_data = g_new0 (GimpDataDeleteData, 1);
delete_data->factory = view->factory;
delete_data->data = data;
str = g_strdup_printf (_("Are you sure you want to delete '%s' "
"from the list and from disk?"),
GIMP_OBJECT (data)->name);
dialog = gimp_message_dialog_new (_("Delete Object"), GIMP_STOCK_WARNING,
GTK_WIDGET (view), 0,
gimp_standard_help_func, NULL,
dialog = gimp_query_boolean_box (_("Delete Data Object"),
GTK_WIDGET (view),
gimp_standard_help_func, NULL,
GIMP_STOCK_QUESTION,
str,
GTK_STOCK_DELETE, GTK_STOCK_CANCEL,
G_OBJECT (data),
"disconnect",
data_delete_callback,
delete_data);
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
GTK_STOCK_DELETE, GTK_RESPONSE_OK,
g_object_weak_ref (G_OBJECT (dialog), (GWeakNotify) g_free, delete_data);
NULL);
g_free (str);
g_signal_connect_object (data, "disconnect",
G_CALLBACK (gtk_widget_destroy),
dialog, G_CONNECT_SWAPPED);
g_signal_connect (dialog, "response",
G_CALLBACK (data_delete_confirm_response),
delete_data);
gimp_message_box_set_primary_text (GIMP_MESSAGE_DIALOG (dialog)->box,
_("Are you sure you want to delete "
"'%s' from the list and from disk?"),
GIMP_OBJECT (data)->name);
gtk_widget_show (dialog);
}
}
@ -211,13 +214,13 @@ data_edit_data_cmd_callback (GtkAction *action,
/* private functions */
static void
data_delete_callback (GtkWidget *widget,
gboolean delete,
gpointer data)
data_delete_confirm_response (GtkWidget *dialog,
gint response_id,
GimpDataDeleteData *delete_data)
{
GimpDataDeleteData *delete_data = data;
gtk_widget_destroy (dialog);
if (delete)
if (response_id == GTK_RESPONSE_OK)
{
GError *error = NULL;
@ -229,4 +232,6 @@ data_delete_callback (GtkWidget *widget,
g_clear_error (&error);
}
}
g_free (delete_data);
}

View file

@ -41,6 +41,8 @@
#include "widgets/gimpclipboard.h"
#include "widgets/gimphelp-ids.h"
#include "widgets/gimpdialogfactory.h"
#include "widgets/gimpmessagebox.h"
#include "widgets/gimpmessagedialog.h"
#include "dialogs/dialogs.h"
@ -54,9 +56,9 @@
static void edit_paste (GimpDisplay *gdisp,
gboolean paste_into);
static void edit_undo_clear_callback (GtkWidget *widget,
gboolean clear,
gpointer data);
static void edit_undo_clear_response (GtkWidget *dialog,
gint response_id,
GimpImage *gimage);
static void cut_named_buffer_callback (GtkWidget *widget,
const gchar *name,
gpointer data);
@ -99,16 +101,26 @@ edit_undo_clear_cmd_callback (GtkAction *action,
return_if_no_image (gimage, data);
return_if_no_widget (widget, data);
dialog = gimp_query_boolean_box (_("Clear Undo History"), widget,
gimp_standard_help_func,
GIMP_HELP_EDIT_UNDO_CLEAR,
GIMP_STOCK_QUESTION,
_("Really clear image's undo history?"),
GTK_STOCK_CLEAR, GTK_STOCK_CANCEL,
G_OBJECT (gimage),
"disconnect",
edit_undo_clear_callback,
gimage);
dialog = gimp_message_dialog_new (_("Clear Undo History"), GIMP_STOCK_WARNING,
widget, 0,
gimp_standard_help_func, NULL,
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
GTK_STOCK_CLEAR, GTK_RESPONSE_OK,
NULL);
g_signal_connect_object (gimage, "disconnect",
G_CALLBACK (gtk_widget_destroy),
dialog, G_CONNECT_SWAPPED);
g_signal_connect (dialog, "response",
G_CALLBACK (edit_undo_clear_response),
gimage);
gimp_message_box_set_primary_text (GIMP_MESSAGE_DIALOG (dialog)->box,
_("Really clear image's undo history?"));
gtk_widget_show (dialog);
}
@ -284,14 +296,14 @@ edit_paste (GimpDisplay *gdisp,
}
static void
edit_undo_clear_callback (GtkWidget *widget,
gboolean clear,
gpointer data)
edit_undo_clear_response (GtkWidget *dialog,
gint response_id,
GimpImage *gimage)
{
if (clear)
{
GimpImage *gimage = data;
gtk_widget_destroy (dialog);
if (response_id == GTK_RESPONSE_OK)
{
gimp_image_undo_disable (gimage);
gimp_image_undo_enable (gimage);
gimp_image_flush (gimage);

View file

@ -41,6 +41,8 @@
#include "widgets/gimpdialogfactory.h"
#include "widgets/gimpfiledialog.h"
#include "widgets/gimphelp-ids.h"
#include "widgets/gimpmessagebox.h"
#include "widgets/gimpmessagedialog.h"
#include "display/gimpdisplay.h"
#include "display/gimpdisplay-foreach.h"
@ -72,9 +74,9 @@ static void file_save_dialog_destroyed (GtkWidget *dialog,
static void file_new_template_callback (GtkWidget *widget,
const gchar *name,
gpointer data);
static void file_revert_confirm_callback (GtkWidget *widget,
gboolean revert,
gpointer data);
static void file_revert_confirm_response (GtkWidget *dialog,
gint response_id,
GimpDisplay *gdisp);
/* public functions */
@ -269,57 +271,58 @@ file_revert_cmd_callback (GtkAction *action,
gpointer data)
{
GimpDisplay *gdisp;
GtkWidget *query_box;
GtkWidget *dialog;
const gchar *uri;
return_if_no_display (gdisp, data);
uri = gimp_object_get_name (GIMP_OBJECT (gdisp->gimage));
query_box = g_object_get_data (G_OBJECT (gdisp->gimage), REVERT_DATA_KEY);
dialog = g_object_get_data (G_OBJECT (gdisp->gimage), REVERT_DATA_KEY);
if (! uri)
{
g_message (_("Revert failed. No file name associated with this image."));
}
else if (query_box)
else if (dialog)
{
gtk_window_present (GTK_WINDOW (query_box->window));
gtk_window_present (GTK_WINDOW (dialog));
}
else
{
gchar *basename;
gchar *text;
dialog =
gimp_message_dialog_new (_("Revert Image"), GIMP_STOCK_QUESTION,
gdisp->shell, 0,
gimp_standard_help_func, GIMP_HELP_FILE_REVERT,
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
GTK_STOCK_REVERT_TO_SAVED, GTK_RESPONSE_OK,
NULL);
g_signal_connect_object (gdisp, "disconnect",
G_CALLBACK (gtk_widget_destroy),
dialog, G_CONNECT_SWAPPED);
g_signal_connect (dialog, "response",
G_CALLBACK (file_revert_confirm_response),
gdisp);
basename = g_path_get_basename (uri);
text = g_strdup_printf (_("Revert '%s' to\n"
"'%s'?\n\n"
"You will lose all your changes, "
"including all undo information."),
basename, uri);
gimp_message_box_set_primary_text (GIMP_MESSAGE_DIALOG (dialog)->box,
_("Revert '%s' to '%s'?"),
basename, uri);
g_free (basename);
query_box = gimp_query_boolean_box (_("Revert Image"),
gdisp->shell,
gimp_standard_help_func,
GIMP_HELP_FILE_REVERT,
GIMP_STOCK_QUESTION,
text,
GTK_STOCK_YES, GTK_STOCK_NO,
G_OBJECT (gdisp), "disconnect",
file_revert_confirm_callback,
gdisp);
gimp_message_box_set_text (GIMP_MESSAGE_DIALOG (dialog)->box,
_("By reverting the image to the state saved "
"on disk, you will lose all changes, "
"including all undo information."));
g_free (text);
g_object_set_data (G_OBJECT (gdisp->gimage), REVERT_DATA_KEY, dialog);
g_object_set_data (G_OBJECT (gdisp->gimage), REVERT_DATA_KEY,
query_box);
gtk_window_set_transient_for (GTK_WINDOW (query_box),
GTK_WINDOW (gdisp->shell));
gtk_widget_show (query_box);
gtk_widget_show (dialog);
}
}
@ -444,25 +447,24 @@ file_new_template_callback (GtkWidget *widget,
}
static void
file_revert_confirm_callback (GtkWidget *widget,
gboolean revert,
gpointer data)
file_revert_confirm_response (GtkWidget *dialog,
gint response_id,
GimpDisplay *gdisp)
{
GimpDisplay *gdisp = GIMP_DISPLAY (data);
GimpImage *old_gimage = gdisp->gimage;
GimpImage *old_gimage = gdisp->gimage;
gtk_widget_destroy (dialog);
g_object_set_data (G_OBJECT (old_gimage), REVERT_DATA_KEY, NULL);
if (revert)
if (response_id == GTK_RESPONSE_OK)
{
Gimp *gimp;
Gimp *gimp = old_gimage->gimp;
GimpImage *new_gimage;
const gchar *uri;
GimpPDBStatusType status;
GError *error = NULL;
gimp = old_gimage->gimp;
uri = gimp_object_get_name (GIMP_OBJECT (old_gimage));
new_gimage = file_open_image (gimp, gimp_get_user_context (gimp),

View file

@ -75,7 +75,13 @@ gimp_message_dialog_new (const gchar *title,
va_list args;
g_return_val_if_fail (title != NULL, NULL);
g_return_val_if_fail (parent == NULL || GTK_IS_WINDOW (parent), NULL);
g_return_val_if_fail (parent == NULL || GTK_IS_WIDGET (parent), NULL);
if (parent)
{
if (! GTK_IS_WINDOW (parent))
parent = gtk_widget_get_toplevel (parent);
}
dialog = g_object_new (GIMP_TYPE_MESSAGE_DIALOG,
"title", title,
@ -104,8 +110,8 @@ gimp_message_dialog_new (const gchar *title,
NULL);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
dialog->box, FALSE, FALSE, 0);
gtk_widget_show (dialog->box);
GTK_WIDGET (dialog->box), FALSE, FALSE, 0);
gtk_widget_show (GTK_WIDGET (dialog->box));
return GTK_WIDGET (dialog);
}