mirror of https://github.com/GNOME/gimp.git
app: add an "auto overlay" API to GimpToolGui
which makes tool dialogs auto-overlay if the canvas is large enough. Set all tools dialogs except GimpImageMapTool's dialog to auto.
This commit is contained in:
parent
17bd4d2c28
commit
cd479ce04e
|
@ -34,6 +34,7 @@
|
|||
#include "widgets/gimpdialogfactory.h"
|
||||
#include "widgets/gimpoverlaybox.h"
|
||||
#include "widgets/gimpoverlaydialog.h"
|
||||
#include "widgets/gimpwidgets-utils.h"
|
||||
|
||||
#include "gimpdisplayshell.h"
|
||||
#include "gimptooldialog.h"
|
||||
|
@ -69,6 +70,7 @@ struct _GimpToolGuiPrivate
|
|||
gboolean focus_on_map;
|
||||
|
||||
gboolean overlay;
|
||||
gboolean auto_overlay;
|
||||
|
||||
GimpDisplayShell *shell;
|
||||
GimpViewable *viewable;
|
||||
|
@ -95,6 +97,9 @@ 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 ResponseEntry * response_entry_new (gint response_id,
|
||||
const gchar *stock_id);
|
||||
|
@ -165,6 +170,9 @@ gimp_tool_gui_dispose (GObject *object)
|
|||
|
||||
if (private->dialog)
|
||||
{
|
||||
if (gtk_widget_get_visible (private->dialog))
|
||||
gimp_tool_gui_hide (GIMP_TOOL_GUI (object));
|
||||
|
||||
if (private->overlay)
|
||||
g_object_unref (private->dialog);
|
||||
else
|
||||
|
@ -281,7 +289,7 @@ gimp_tool_gui_set_description (GimpToolGui *gui,
|
|||
|
||||
if (private->overlay)
|
||||
{
|
||||
g_object_set (private->dialog, "title", description, NULL);
|
||||
/* TODO */
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -325,8 +333,26 @@ gimp_tool_gui_set_shell (GimpToolGui *gui,
|
|||
if (shell == private->shell)
|
||||
return;
|
||||
|
||||
if (private->shell)
|
||||
{
|
||||
g_object_remove_weak_pointer (G_OBJECT (private->shell),
|
||||
(gpointer) &private->shell);
|
||||
g_signal_handlers_disconnect_by_func (private->shell->canvas,
|
||||
gimp_tool_gui_canvas_resized,
|
||||
gui);
|
||||
}
|
||||
|
||||
private->shell = shell;
|
||||
|
||||
if (private->shell)
|
||||
{
|
||||
g_signal_connect (private->shell->canvas, "size-allocate",
|
||||
G_CALLBACK (gimp_tool_gui_canvas_resized),
|
||||
gui);
|
||||
g_object_add_weak_pointer (G_OBJECT (private->shell),
|
||||
(gpointer) &private->shell);
|
||||
}
|
||||
|
||||
gimp_tool_gui_update_shell (gui);
|
||||
}
|
||||
|
||||
|
@ -441,6 +467,12 @@ gimp_tool_gui_set_overlay (GimpToolGui *gui,
|
|||
if (private->overlay == overlay)
|
||||
return;
|
||||
|
||||
if (! private->dialog)
|
||||
{
|
||||
private->overlay = overlay;
|
||||
return;
|
||||
}
|
||||
|
||||
visible = gtk_widget_get_visible (private->dialog);
|
||||
|
||||
if (visible)
|
||||
|
@ -454,7 +486,7 @@ gimp_tool_gui_set_overlay (GimpToolGui *gui,
|
|||
else
|
||||
gtk_widget_destroy (private->dialog);
|
||||
|
||||
private->overlay = overlay ? TRUE : FALSE;
|
||||
private->overlay = overlay;
|
||||
|
||||
gimp_tool_gui_create_dialog (gui, screen, monitor);
|
||||
|
||||
|
@ -470,6 +502,33 @@ gimp_tool_gui_get_overlay (GimpToolGui *gui)
|
|||
return GET_PRIVATE (gui)->overlay;
|
||||
}
|
||||
|
||||
void
|
||||
gimp_tool_gui_set_auto_overlay (GimpToolGui *gui,
|
||||
gboolean auto_overlay)
|
||||
{
|
||||
GimpToolGuiPrivate *private;
|
||||
|
||||
g_return_if_fail (GIMP_IS_TOOL_GUI (gui));
|
||||
|
||||
private = GET_PRIVATE (gui);
|
||||
|
||||
if (private->auto_overlay != auto_overlay)
|
||||
{
|
||||
private->auto_overlay = auto_overlay;
|
||||
|
||||
if (private->shell)
|
||||
gimp_tool_gui_canvas_resized (private->shell->canvas, NULL, gui);
|
||||
}
|
||||
}
|
||||
|
||||
gboolean
|
||||
gimp_tool_gui_get_auto_overlay (GimpToolGui *gui)
|
||||
{
|
||||
g_return_val_if_fail (GIMP_IS_TOOL_GUI (gui), FALSE);
|
||||
|
||||
return GET_PRIVATE (gui)->auto_overlay;
|
||||
}
|
||||
|
||||
void
|
||||
gimp_tool_gui_set_focus_on_map (GimpToolGui *gui,
|
||||
gboolean focus_on_map)
|
||||
|
@ -755,6 +814,35 @@ gimp_tool_gui_dialog_response (GtkWidget *dialog,
|
|||
response_id);
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_tool_gui_canvas_resized (GtkWidget *canvas,
|
||||
GtkAllocation *unused,
|
||||
GimpToolGui *gui)
|
||||
{
|
||||
GimpToolGuiPrivate *private = GET_PRIVATE (gui);
|
||||
|
||||
if (private->auto_overlay)
|
||||
{
|
||||
GtkRequisition requisition;
|
||||
GtkAllocation allocation;
|
||||
gboolean overlay = FALSE;
|
||||
|
||||
gtk_widget_size_request (private->vbox, &requisition);
|
||||
gtk_widget_get_allocation (canvas, &allocation);
|
||||
|
||||
if (allocation.width > 2 * requisition.width &&
|
||||
allocation.height > 3 * requisition.height)
|
||||
{
|
||||
overlay = TRUE;
|
||||
}
|
||||
|
||||
gimp_tool_gui_set_overlay (gui,
|
||||
gtk_widget_get_screen (private->dialog),
|
||||
gimp_widget_get_monitor (private->dialog),
|
||||
overlay);
|
||||
}
|
||||
}
|
||||
|
||||
static ResponseEntry *
|
||||
response_entry_new (gint response_id,
|
||||
const gchar *stock_id)
|
||||
|
|
|
@ -81,6 +81,10 @@ void gimp_tool_gui_set_overlay (GimpToolGui *gui,
|
|||
gboolean overlay);
|
||||
gboolean gimp_tool_gui_get_overlay (GimpToolGui *gui);
|
||||
|
||||
void gimp_tool_gui_set_auto_overlay (GimpToolGui *gui,
|
||||
gboolean auto_overlay);
|
||||
gboolean gimp_tool_gui_get_auto_overlay (GimpToolGui *gui);
|
||||
|
||||
void gimp_tool_gui_set_focus_on_map (GimpToolGui *gui,
|
||||
gboolean focus_on_map);
|
||||
gboolean gimp_tool_gui_get_focus_on_map (GimpToolGui *gui);
|
||||
|
|
|
@ -315,12 +315,13 @@ gimp_color_picker_tool_info_create (GimpColorPickerTool *picker_tool)
|
|||
_("Color Picker Information"),
|
||||
gtk_widget_get_screen (GTK_WIDGET (shell)),
|
||||
gimp_widget_get_monitor (GTK_WIDGET (shell)),
|
||||
FALSE,
|
||||
TRUE,
|
||||
|
||||
GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
|
||||
|
||||
NULL);
|
||||
|
||||
gimp_tool_gui_set_auto_overlay (picker_tool->gui, TRUE);
|
||||
gimp_tool_gui_set_focus_on_map (picker_tool->gui, FALSE);
|
||||
gimp_tool_gui_set_viewable (picker_tool->gui,
|
||||
GIMP_VIEWABLE (tool->drawable));
|
||||
|
|
|
@ -303,6 +303,8 @@ gimp_foreground_select_tool_initialize (GimpTool *tool,
|
|||
GIMP_STOCK_TOOL_FOREGROUND_SELECT, GTK_RESPONSE_APPLY,
|
||||
NULL);
|
||||
|
||||
gimp_tool_gui_set_auto_overlay (fg_select->gui, TRUE);
|
||||
|
||||
g_signal_connect (fg_select->gui, "response",
|
||||
G_CALLBACK (gimp_foreground_select_tool_response),
|
||||
fg_select);
|
||||
|
|
|
@ -1054,12 +1054,13 @@ gimp_measure_tool_dialog_new (GimpMeasureTool *measure)
|
|||
_("Measure Distances and Angles"),
|
||||
gtk_widget_get_screen (GTK_WIDGET (shell)),
|
||||
gimp_widget_get_monitor (GTK_WIDGET (shell)),
|
||||
FALSE,
|
||||
TRUE,
|
||||
|
||||
GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
|
||||
|
||||
NULL);
|
||||
|
||||
gimp_tool_gui_set_auto_overlay (gui, TRUE);
|
||||
gimp_tool_gui_set_focus_on_map (gui, FALSE);
|
||||
|
||||
g_signal_connect (gui, "response",
|
||||
|
|
|
@ -69,7 +69,6 @@
|
|||
|
||||
|
||||
#define RESPONSE_RESET 1
|
||||
#define RESPONSE_EEK 2
|
||||
#define MIN_HANDLE_SIZE 6
|
||||
|
||||
|
||||
|
@ -1642,25 +1641,22 @@ gimp_transform_tool_dialog (GimpTransformTool *tr_tool)
|
|||
|
||||
icon_name = gimp_viewable_get_icon_name (GIMP_VIEWABLE (tool_info));
|
||||
|
||||
tr_tool->overlay = FALSE;
|
||||
|
||||
tr_tool->gui = gimp_tool_gui_new (tool_info,
|
||||
tool_info->blurb,
|
||||
gtk_widget_get_screen (GTK_WIDGET (shell)),
|
||||
gimp_widget_get_monitor (GTK_WIDGET (shell)),
|
||||
tr_tool->overlay,
|
||||
TRUE,
|
||||
|
||||
GIMP_STOCK_WILBER_EEK, RESPONSE_EEK,
|
||||
GIMP_STOCK_RESET, RESPONSE_RESET,
|
||||
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
|
||||
icon_name, GTK_RESPONSE_OK,
|
||||
|
||||
NULL);
|
||||
|
||||
gimp_tool_gui_set_auto_overlay (tr_tool->gui, TRUE);
|
||||
gimp_tool_gui_set_default_response (tr_tool->gui, GTK_RESPONSE_OK);
|
||||
|
||||
gimp_tool_gui_set_alternative_button_order (tr_tool->gui,
|
||||
RESPONSE_EEK,
|
||||
RESPONSE_RESET,
|
||||
GTK_RESPONSE_OK,
|
||||
GTK_RESPONSE_CANCEL,
|
||||
|
@ -1717,18 +1713,6 @@ gimp_transform_tool_response (GimpToolGui *gui,
|
|||
|
||||
switch (response_id)
|
||||
{
|
||||
case RESPONSE_EEK:
|
||||
if (tr_tool->gui)
|
||||
{
|
||||
GimpDisplayShell *shell = gimp_display_get_shell (display);
|
||||
|
||||
gimp_tool_gui_set_overlay (tr_tool->gui,
|
||||
gtk_widget_get_screen (GTK_WIDGET (shell)),
|
||||
gimp_widget_get_monitor (GTK_WIDGET (shell)),
|
||||
! gimp_tool_gui_get_overlay (tr_tool->gui));
|
||||
}
|
||||
break;
|
||||
|
||||
case RESPONSE_RESET:
|
||||
/* Move all undo events to redo, and pop off the first
|
||||
* one as that's the current one, which always sits on
|
||||
|
|
|
@ -122,7 +122,6 @@ struct _GimpTransformTool
|
|||
|
||||
const gchar *progress_text;
|
||||
|
||||
gboolean overlay;
|
||||
GimpToolGui *gui;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue