app: add gimp_tool_gui_add_button()

In GimpToolGui, add gimp_tool_gui_add_button() and
gimp_tool_gui_add_buttons_valist(), which allow adding dialog
buttons after construction.
This commit is contained in:
Ell 2019-03-07 16:01:08 -05:00
parent 31b2b55b28
commit b23fae86f0
2 changed files with 100 additions and 44 deletions

View File

@ -84,27 +84,29 @@ struct _GimpToolGuiPrivate
#define GET_PRIVATE(gui) ((GimpToolGuiPrivate *) gimp_tool_gui_get_instance_private ((GimpToolGui *) (gui)))
static void gimp_tool_gui_dispose (GObject *object);
static void gimp_tool_gui_finalize (GObject *object);
static void gimp_tool_gui_dispose (GObject *object);
static void gimp_tool_gui_finalize (GObject *object);
static void gimp_tool_gui_create_dialog (GimpToolGui *gui,
GdkMonitor *monitor);
static void gimp_tool_gui_update_buttons (GimpToolGui *gui);
static void gimp_tool_gui_update_shell (GimpToolGui *gui);
static void gimp_tool_gui_update_viewable (GimpToolGui *gui);
static void gimp_tool_gui_create_dialog (GimpToolGui *gui,
GdkMonitor *monitor);
static void gimp_tool_gui_add_dialog_button (GimpToolGui *gui,
ResponseEntry *entry);
static void gimp_tool_gui_update_buttons (GimpToolGui *gui);
static void gimp_tool_gui_update_shell (GimpToolGui *gui);
static void gimp_tool_gui_update_viewable (GimpToolGui *gui);
static void gimp_tool_gui_dialog_response (GtkWidget *dialog,
gint response_id,
GimpToolGui *gui);
static void gimp_tool_gui_canvas_resized (GtkWidget *canvas,
GtkAllocation *allocation,
GimpToolGui *gui);
static void gimp_tool_gui_dialog_response (GtkWidget *dialog,
gint response_id,
GimpToolGui *gui);
static void gimp_tool_gui_canvas_resized (GtkWidget *canvas,
GtkAllocation *allocation,
GimpToolGui *gui);
static ResponseEntry * response_entry_new (gint response_id,
const gchar *button_text);
static void response_entry_free (ResponseEntry *entry);
static ResponseEntry * response_entry_find (GList *entries,
gint response_id);
static ResponseEntry * response_entry_new (gint response_id,
const gchar *button_text);
static void response_entry_free (ResponseEntry *entry);
static ResponseEntry * response_entry_find (GList *entries,
gint response_id);
G_DEFINE_TYPE_WITH_PRIVATE (GimpToolGui, gimp_tool_gui, GIMP_TYPE_OBJECT)
@ -252,16 +254,7 @@ gimp_tool_gui_new (GimpToolInfo *tool_info,
va_start (args, overlay);
for (button_text = va_arg (args, const gchar *);
button_text;
button_text = va_arg (args, const gchar *))
{
gint response_id = va_arg (args, gint);
private->response_entries = g_list_append (private->response_entries,
response_entry_new (response_id,
button_text));
}
gimp_tool_gui_add_buttons_valist (gui, args);
va_end (args);
@ -634,6 +627,45 @@ gimp_tool_gui_get_focus_on_map (GimpToolGui *gui)
return GET_PRIVATE (gui)->focus_on_map;
}
void
gimp_tool_gui_add_buttons_valist (GimpToolGui *gui,
va_list args)
{
const gchar *button_text;
gint response_id;
g_return_if_fail (GIMP_IS_TOOL_GUI (gui));
while ((button_text = va_arg (args, const gchar *)))
{
response_id = va_arg (args, gint);
gimp_tool_gui_add_button (gui, button_text, response_id);
}
}
void
gimp_tool_gui_add_button (GimpToolGui *gui,
const gchar *button_text,
gint response_id)
{
GimpToolGuiPrivate *private;
ResponseEntry *entry;
g_return_if_fail (GIMP_IS_TOOL_GUI (gui));
g_return_if_fail (button_text != NULL);
private = GET_PRIVATE (gui);
entry = response_entry_new (response_id, button_text);
private->response_entries = g_list_append (private->response_entries,
entry);
if (private->dialog)
gimp_tool_gui_add_dialog_button (gui, entry);
}
void
gimp_tool_gui_set_default_response (GimpToolGui *gui,
gint response_id)
@ -743,14 +775,7 @@ gimp_tool_gui_create_dialog (GimpToolGui *gui,
{
ResponseEntry *entry = list->data;
gimp_overlay_dialog_add_button (GIMP_OVERLAY_DIALOG (private->dialog),
entry->button_text,
entry->response_id);
if (! entry->sensitive)
gimp_overlay_dialog_set_response_sensitive (GIMP_OVERLAY_DIALOG (private->dialog),
entry->response_id,
FALSE);
gimp_tool_gui_add_dialog_button (gui, entry);
}
if (private->default_response != -1)
@ -777,14 +802,7 @@ gimp_tool_gui_create_dialog (GimpToolGui *gui,
{
ResponseEntry *entry = list->data;
gimp_dialog_add_button (GIMP_DIALOG (private->dialog),
entry->button_text,
entry->response_id);
if (! entry->sensitive)
gtk_dialog_set_response_sensitive (GTK_DIALOG (private->dialog),
entry->response_id,
FALSE);
gimp_tool_gui_add_dialog_button (gui, entry);
}
if (private->default_response != -1)
@ -813,6 +831,38 @@ gimp_tool_gui_create_dialog (GimpToolGui *gui,
G_OBJECT (gui), 0);
}
static void
gimp_tool_gui_add_dialog_button (GimpToolGui *gui,
ResponseEntry *entry)
{
GimpToolGuiPrivate *private = GET_PRIVATE (gui);
if (private->overlay)
{
gimp_overlay_dialog_add_button (GIMP_OVERLAY_DIALOG (private->dialog),
entry->button_text,
entry->response_id);
if (! entry->sensitive)
{
gimp_overlay_dialog_set_response_sensitive (
GIMP_OVERLAY_DIALOG (private->dialog),
entry->response_id, FALSE);
}
}
else
{
gimp_dialog_add_button (GIMP_DIALOG (private->dialog),
entry->button_text,
entry->response_id);
if (! entry->sensitive)
gtk_dialog_set_response_sensitive (GTK_DIALOG (private->dialog),
entry->response_id,
FALSE);
}
}
static void
gimp_tool_gui_update_buttons (GimpToolGui *gui)
{

View File

@ -95,6 +95,12 @@ void gimp_tool_gui_set_focus_on_map (GimpToolGui *gui,
gboolean focus_on_map);
gboolean gimp_tool_gui_get_focus_on_map (GimpToolGui *gui);
void gimp_tool_gui_add_buttons_valist (GimpToolGui *gui,
va_list args);
void gimp_tool_gui_add_button (GimpToolGui *gui,
const gchar *button_text,
gint response_id);
void gimp_tool_gui_set_default_response (GimpToolGui *gui,
gint response_id);
void gimp_tool_gui_set_response_sensitive (GimpToolGui *gui,