app: add gimp_tool_gui_set_alternative_button_order() and use it

Also make some of GimpToolGui's memory management proper, there was
no leak but it needs to be proper in order to add runtime switching
between dialog and overlay.
This commit is contained in:
Michael Natterer
2013-06-07 15:18:24 +02:00
parent 170b987b99
commit 9a811d276e
4 changed files with 87 additions and 23 deletions

View File

@ -43,10 +43,11 @@ typedef struct _GimpToolGuiPrivate GimpToolGuiPrivate;
struct _GimpToolGuiPrivate
{
gboolean overlay;
GimpToolInfo *tool_info;
gchar *desc;
GimpToolInfo *tool_info;
gboolean overlay;
GimpDisplayShell *shell;
GtkWidget *dialog;
@ -79,6 +80,10 @@ gimp_tool_gui_class_init (GimpToolGuiClass *klass)
static void
gimp_tool_gui_init (GimpToolGui *gui)
{
GimpToolGuiPrivate *private = GET_PRIVATE (gui);
private->vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
g_object_ref_sink (private->vbox);
}
static void
@ -86,9 +91,21 @@ gimp_tool_gui_dispose (GObject *object)
{
GimpToolGuiPrivate *private = GET_PRIVATE (object);
if (private->tool_info)
{
g_object_unref (private->tool_info);
private->tool_info = NULL;
}
if (private->shell)
gimp_tool_gui_set_shell (GIMP_TOOL_GUI (object), NULL);
if (private->vbox)
{
g_object_unref (private->vbox);
private->vbox = NULL;
}
if (private->dialog)
{
if (private->overlay)
@ -97,7 +114,6 @@ gimp_tool_gui_dispose (GObject *object)
gtk_widget_destroy (private->dialog);
private->dialog = NULL;
private->vbox = NULL;
}
G_OBJECT_CLASS (gimp_tool_gui_parent_class)->dispose (object);
@ -147,10 +163,10 @@ gimp_tool_gui_new (GimpToolInfo *tool_info,
private = GET_PRIVATE (gui);
private->overlay = overlay;
private->tool_info = g_object_ref (tool_info);
private->desc = g_strdup (desc);
private->tool_info = tool_info;
private->overlay = overlay;
if (overlay)
{
@ -164,7 +180,7 @@ gimp_tool_gui_new (GimpToolInfo *tool_info,
gtk_container_set_border_width (GTK_CONTAINER (private->dialog), 6);
private->vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
gtk_container_set_border_width (GTK_CONTAINER (private->vbox), 0);
gtk_container_add (GTK_CONTAINER (private->dialog), private->vbox);
gtk_widget_show (private->vbox);
}
@ -176,7 +192,6 @@ gimp_tool_gui_new (GimpToolInfo *tool_info,
gimp_dialog_add_buttons_valist (GIMP_DIALOG (private->dialog), args);
va_end (args);
private->vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
gtk_container_set_border_width (GTK_CONTAINER (private->vbox), 6);
gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (private->dialog))),
private->vbox, TRUE, TRUE, 0);
@ -345,3 +360,54 @@ gimp_tool_gui_set_response_sensitive (GimpToolGui *gui,
response_id, sensitive);
}
}
void
gimp_tool_gui_set_alternative_button_order (GimpToolGui *gui,
...)
{
GimpToolGuiPrivate *private;
va_list args;
gint response_id;
GList *id_list = NULL;
GList *list;
gint *ids;
gint n_ids;
gint i;
g_return_if_fail (GIMP_IS_TOOL_GUI (gui));
private = GET_PRIVATE (gui);
va_start (args, gui);
for (response_id = va_arg (args, gint);
response_id != -1;
response_id = va_arg (args, gint))
{
id_list = g_list_append (id_list, GINT_TO_POINTER (response_id));
}
va_end (args);
n_ids = g_list_length (id_list);
ids = g_new0 (gint, n_ids);
for (list = id_list, i = 0; list; list = g_list_next (list), i++)
{
ids[i] = GPOINTER_TO_INT (list->data);
}
g_list_free (id_list);
if (private->overlay)
{
/* TODO */
}
else
{
gtk_dialog_set_alternative_button_order_from_array (GTK_DIALOG (private->dialog),
n_ids, ids);
}
g_free (ids);
}

View File

@ -69,6 +69,8 @@ void gimp_tool_gui_set_default_response (GimpToolGui *gui,
void gimp_tool_gui_set_response_sensitive (GimpToolGui *gui,
gint response_id,
gboolean sensitive);
void gimp_tool_gui_set_alternative_button_order (GimpToolGui *gui,
...);
#endif /* __GIMP_TOOL_GUI_H__ */

View File

@ -336,14 +336,13 @@ gimp_image_map_tool_initialize (GimpTool *tool,
NULL);
/* FIXME */
#if 0
gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
RESPONSE_RESET,
GTK_RESPONSE_OK,
GTK_RESPONSE_CANCEL,
-1);
#endif
gimp_tool_gui_set_default_response (image_map_tool->gui, GTK_RESPONSE_OK);
gimp_tool_gui_set_alternative_button_order (image_map_tool->gui,
RESPONSE_RESET,
GTK_RESPONSE_OK,
GTK_RESPONSE_CANCEL,
-1);
dialog = gimp_tool_gui_get_dialog (image_map_tool->gui);
vbox = gimp_tool_gui_get_vbox (image_map_tool->gui);

View File

@ -1703,14 +1703,11 @@ gimp_transform_tool_dialog (GimpTransformTool *tr_tool)
gimp_tool_gui_set_default_response (tr_tool->gui, GTK_RESPONSE_OK);
/* FIXME */
#if 0
gtk_dialog_set_alternative_button_order (GTK_DIALOG (tr_tool->dialog),
RESPONSE_RESET,
GTK_RESPONSE_OK,
GTK_RESPONSE_CANCEL,
-1);
#endif
gimp_tool_gui_set_alternative_button_order (tr_tool->gui,
RESPONSE_RESET,
GTK_RESPONSE_OK,
GTK_RESPONSE_CANCEL,
-1);
g_signal_connect (gimp_tool_gui_get_dialog (tr_tool->gui), "response",
G_CALLBACK (gimp_transform_tool_response),