app: allow specifying a callback function for propgui pickers

Allow propgui constructors to specify an (optional) callback function
when creating pickers, to be called when a color/coordinate is picked,
similarly to controller callbacks.

Implement picker callback support in GimpFilterTool.  When the active
picker has an associated callback function, call it instead of the
class's color_picked() function.

Add lots of "#include <gegl.h>" to .c files that miss it, which is
now necessary, since this commit adds a Babl* parameter in
propgui-types.h.
This commit is contained in:
Ell 2017-10-16 11:38:28 -04:00
parent 92cd4d4619
commit c5b88702e6
18 changed files with 94 additions and 40 deletions

View File

@ -17,6 +17,7 @@
#include "config.h"
#include <gegl.h>
#include <gtk/gtk.h>
#include "actions-types.h"

View File

@ -17,6 +17,7 @@
#include "config.h"
#include <gegl.h>
#include <gtk/gtk.h>
#include "actions-types.h"

View File

@ -17,6 +17,7 @@
#include "config.h"
#include <gegl.h>
#include <gtk/gtk.h>
#include "actions-types.h"

View File

@ -22,6 +22,7 @@
#include "stdlib.h"
#include <gegl.h>
#include <gtk/gtk.h>
#include "gdk/gdkkeysyms.h"

View File

@ -20,6 +20,7 @@
#include "config.h"
#include <gegl.h>
#include <gtk/gtk.h>
#include "libgimpbase/gimpbase.h"

View File

@ -19,6 +19,7 @@
#include <stdlib.h>
#include <gegl.h>
#include <gtk/gtk.h>
#include "libgimpbase/gimpbase.h"

View File

@ -17,6 +17,7 @@
#include "config.h"
#include <gegl.h>
#include <gtk/gtk.h>
#include "menus-types.h"

View File

@ -17,6 +17,7 @@
#include "config.h"
#include <gegl.h>
#include <gtk/gtk.h>
#include "menus-types.h"

View File

@ -19,6 +19,7 @@
#include <string.h>
#include <gegl.h>
#include <gtk/gtk.h>
#include "menus-types.h"

View File

@ -17,6 +17,7 @@
#include "config.h"
#include <gegl.h>
#include <gtk/gtk.h>
#include "libgimpbase/gimpbase.h"

View File

@ -17,6 +17,7 @@
#include "config.h"
#include <gegl.h>
#include <gtk/gtk.h>
#include "menus-types.h"

View File

@ -175,7 +175,8 @@ _gimp_prop_gui_new_generic (GObject *config,
pspec_name,
GIMP_ICON_CURSOR,
_("Pick coordinates from the image"),
/* pick_abyss = */ TRUE);
/* pick_abyss = */ TRUE,
NULL, NULL);
gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
gtk_widget_show (button);

View File

@ -365,7 +365,8 @@ gimp_prop_widget_new_from_pspec (GObject *config,
pspec->name,
GIMP_ICON_COLOR_PICKER_GRAY,
_("Pick color from the image"),
/* pick_abyss = */ FALSE);
/* pick_abyss = */ FALSE,
NULL, NULL);
gtk_box_pack_start (GTK_BOX (widget), button, FALSE, FALSE, 0);
gtk_widget_show (button);
}

View File

@ -75,6 +75,13 @@ typedef struct
/* function types */
typedef void (* GimpPickerCallback) (gpointer data,
gpointer identifier,
gdouble x,
gdouble y,
const Babl *sample_format,
const GimpRGB *color);
typedef void (* GimpControllerLineCallback) (gpointer data,
GeglRectangle *area,
gdouble x1,
@ -95,7 +102,9 @@ typedef GtkWidget * (* GimpCreatePickerFunc) (gpointer creator,
const gchar *property_name,
const gchar *icon_name,
const gchar *tooltip,
gboolean pick_abyss);
gboolean pick_abyss,
GimpPickerCallback callback,
gpointer callback_data);
typedef GCallback (* GimpCreateControllerFunc) (gpointer creator,
GimpControllerType controller_type,

View File

@ -857,6 +857,28 @@ gimp_filter_tool_color_picked (GimpColorTool *color_tool,
{
GimpFilterTool *filter_tool = GIMP_FILTER_TOOL (color_tool);
if (filter_tool->active_picker)
{
GimpPickerCallback callback;
gpointer callback_data;
callback = g_object_get_data (G_OBJECT (filter_tool->active_picker),
"picker-callback");
callback_data = g_object_get_data (G_OBJECT (filter_tool->active_picker),
"picker-callback-data");
if (callback)
{
callback (callback_data,
filter_tool->pick_identifier,
coords->x,
coords->y,
sample_format, color);
return;
}
}
GIMP_FILTER_TOOL_GET_CLASS (filter_tool)->color_picked (filter_tool,
filter_tool->pick_identifier,
coords->x,
@ -1578,11 +1600,13 @@ gimp_filter_tool_color_picker_toggled (GtkWidget *widget,
}
GtkWidget *
gimp_filter_tool_add_color_picker (GimpFilterTool *filter_tool,
gpointer identifier,
const gchar *icon_name,
const gchar *tooltip,
gboolean pick_abyss)
gimp_filter_tool_add_color_picker (GimpFilterTool *filter_tool,
gpointer identifier,
const gchar *icon_name,
const gchar *tooltip,
gboolean pick_abyss,
GimpPickerCallback callback,
gpointer callback_data)
{
GtkWidget *button;
GtkWidget *image;
@ -1606,6 +1630,10 @@ gimp_filter_tool_add_color_picker (GimpFilterTool *filter_tool,
"picker-identifier", identifier);
g_object_set_data (G_OBJECT (button),
"picker-pick-abyss", GINT_TO_POINTER (pick_abyss));
g_object_set_data (G_OBJECT (button),
"picker-callback", callback);
g_object_set_data (G_OBJECT (button),
"picker-callback-data", callback_data);
g_signal_connect (button, "toggled",
G_CALLBACK (gimp_filter_tool_color_picker_toggled),

View File

@ -99,45 +99,47 @@ struct _GimpFilterToolClass
GType gimp_filter_tool_get_type (void) G_GNUC_CONST;
void gimp_filter_tool_get_operation (GimpFilterTool *filter_tool);
void gimp_filter_tool_get_operation (GimpFilterTool *filter_tool);
void gimp_filter_tool_set_config (GimpFilterTool *filter_tool,
GimpConfig *config);
void gimp_filter_tool_set_config (GimpFilterTool *filter_tool,
GimpConfig *config);
void gimp_filter_tool_edit_as (GimpFilterTool *filter_tool,
const gchar *new_tool_id,
GimpConfig *config);
void gimp_filter_tool_edit_as (GimpFilterTool *filter_tool,
const gchar *new_tool_id,
GimpConfig *config);
gboolean gimp_filter_tool_on_guide (GimpFilterTool *filter_tool,
const GimpCoords *coords,
GimpDisplay *display);
gboolean gimp_filter_tool_on_guide (GimpFilterTool *filter_tool,
const GimpCoords *coords,
GimpDisplay *display);
GtkWidget * gimp_filter_tool_dialog_get_vbox (GimpFilterTool *filter_tool);
GtkWidget * gimp_filter_tool_dialog_get_vbox (GimpFilterTool *filter_tool);
void gimp_filter_tool_enable_color_picking (GimpFilterTool *filter_tool,
gpointer identifier,
gboolean pick_abyss);
void gimp_filter_tool_disable_color_picking (GimpFilterTool *filter_tool);
void gimp_filter_tool_enable_color_picking (GimpFilterTool *filter_tool,
gpointer identifier,
gboolean pick_abyss);
void gimp_filter_tool_disable_color_picking (GimpFilterTool *filter_tool);
GtkWidget * gimp_filter_tool_add_color_picker (GimpFilterTool *filter_tool,
gpointer identifier,
const gchar *icon_name,
const gchar *tooltip,
gboolean pick_abyss);
GCallback gimp_filter_tool_add_controller (GimpFilterTool *filter_tool,
GimpControllerType controller_type,
const gchar *status_title,
GCallback callback,
gpointer callback_data,
gpointer *set_func_data);
GtkWidget * gimp_filter_tool_add_color_picker (GimpFilterTool *filter_tool,
gpointer identifier,
const gchar *icon_name,
const gchar *tooltip,
gboolean pick_abyss,
GimpPickerCallback callback,
gpointer callback_data);
GCallback gimp_filter_tool_add_controller (GimpFilterTool *filter_tool,
GimpControllerType controller_type,
const gchar *status_title,
GCallback callback,
gpointer callback_data,
gpointer *set_func_data);
void gimp_filter_tool_set_widget (GimpFilterTool *filter_tool,
GimpToolWidget *widget);
void gimp_filter_tool_set_widget (GimpFilterTool *filter_tool,
GimpToolWidget *widget);
gboolean gimp_filter_tool_get_drawable_area (GimpFilterTool *filter_tool,
gint *drawable_offset_x,
gint *drawable_offset_y,
GeglRectangle *drawable_area);
gboolean gimp_filter_tool_get_drawable_area (GimpFilterTool *filter_tool,
gint *drawable_offset_x,
gint *drawable_offset_y,
GeglRectangle *drawable_area);
#endif /* __GIMP_FILTER_TOOL_H__ */

View File

@ -289,7 +289,8 @@ gimp_levels_tool_color_picker_new (GimpLevelsTool *tool,
GUINT_TO_POINTER (value),
icon_name,
help,
/* pick_abyss = */ FALSE);
/* pick_abyss = */ FALSE,
NULL, NULL);
}
static void

View File

@ -17,6 +17,7 @@
#include "config.h"
#include <gegl.h>
#include <gtk/gtk.h>
#include "tools-types.h"