[gimp/gimp-2-10] app: add FOCUS prop-gui controller
- From: Ell <ell src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp/gimp-2-10] app: add FOCUS prop-gui controller
- Date: Thu, 14 May 2020 21:51:32 +0000 (UTC)
commit 5295a1121e91c7e1736ee0538fc98f97b20f4dc9
Author: Ell <ell_se yahoo com>
Date: Fri May 15 00:12:26 2020 +0300
app: add FOCUS prop-gui controller
... based on GimpToolFocus.
(cherry picked from commit 3a62c53009b457c772f2486f047a4676d9959d70)
app/propgui/propgui-types.h | 13 +++-
app/tools/gimpfiltertool-widgets.c | 122 +++++++++++++++++++++++++++++++++++++
2 files changed, 134 insertions(+), 1 deletion(-)
---
diff --git a/app/propgui/propgui-types.h b/app/propgui/propgui-types.h
index 910027a160..11bbc06684 100644
--- a/app/propgui/propgui-types.h
+++ b/app/propgui/propgui-types.h
@@ -32,7 +32,8 @@ typedef enum
GIMP_CONTROLLER_TYPE_SLIDER_LINE,
GIMP_CONTROLLER_TYPE_TRANSFORM_GRID,
GIMP_CONTROLLER_TYPE_TRANSFORM_GRIDS,
- GIMP_CONTROLLER_TYPE_GYROSCOPE
+ GIMP_CONTROLLER_TYPE_GYROSCOPE,
+ GIMP_CONTROLLER_TYPE_FOCUS
} GimpControllerType;
@@ -113,6 +114,16 @@ typedef void (* GimpControllerGyroscopeCallback) (gpointer
gdouble roll,
gdouble zoom,
gboolean invert);
+typedef void (* GimpControllerFocusCallback) (gpointer data,
+ GeglRectangle *area,
+ GimpLimitType type,
+ gdouble x,
+ gdouble y,
+ gdouble radius,
+ gdouble aspect_ratio,
+ gdouble angle,
+ gdouble inner_limit,
+ gdouble midpoint);
typedef GtkWidget * (* GimpCreatePickerFunc) (gpointer creator,
diff --git a/app/tools/gimpfiltertool-widgets.c b/app/tools/gimpfiltertool-widgets.c
index 051679c320..d5cf6fe4b4 100644
--- a/app/tools/gimpfiltertool-widgets.c
+++ b/app/tools/gimpfiltertool-widgets.c
@@ -32,6 +32,7 @@
#include "core/gimpitem.h"
#include "display/gimpdisplay.h"
+#include "display/gimptoolfocus.h"
#include "display/gimptoolgyroscope.h"
#include "display/gimptoolline.h"
#include "display/gimptooltransformgrid.h"
@@ -102,6 +103,19 @@ static void gimp_filter_tool_set_gyroscope (Controller
static void gimp_filter_tool_gyroscope_changed (GimpToolWidget *widget,
Controller *controller);
+static void gimp_filter_tool_set_focus (Controller *controller,
+ GeglRectangle *area,
+ GimpLimitType type,
+ gdouble x,
+ gdouble y,
+ gdouble radius,
+ gdouble aspect_ratio,
+ gdouble angle,
+ gdouble inner_limit,
+ gdouble midpoint);
+static void gimp_filter_tool_focus_changed (GimpToolWidget *widget,
+ Controller *controller);
+
/* public functions */
@@ -246,6 +260,17 @@ gimp_filter_tool_create_widget (GimpFilterTool *filter_tool,
*set_func_data = controller;
}
break;
+
+ case GIMP_CONTROLLER_TYPE_FOCUS:
+ controller->widget = gimp_tool_focus_new (shell);
+
+ g_signal_connect (controller->widget, "changed",
+ G_CALLBACK (gimp_filter_tool_focus_changed),
+ controller);
+
+ *set_func = (GCallback) gimp_filter_tool_set_focus;
+ *set_func_data = controller;
+ break;
}
g_object_add_weak_pointer (G_OBJECT (controller->widget),
@@ -840,3 +865,100 @@ gimp_filter_tool_gyroscope_changed (GimpToolWidget *widget,
gyroscope_callback (controller->creator_data,
&area, yaw, pitch, roll, zoom, invert);
}
+
+static void
+gimp_filter_tool_set_focus (Controller *controller,
+ GeglRectangle *area,
+ GimpLimitType type,
+ gdouble x,
+ gdouble y,
+ gdouble radius,
+ gdouble aspect_ratio,
+ gdouble angle,
+ gdouble inner_limit,
+ gdouble midpoint)
+{
+ GimpTool *tool;
+ GimpDrawable *drawable;
+
+ if (! controller->widget)
+ return;
+
+ tool = GIMP_TOOL (controller->filter_tool);
+ drawable = tool->drawable;
+
+ if (drawable)
+ {
+ gint off_x, off_y;
+
+ gimp_item_get_offset (GIMP_ITEM (drawable), &off_x, &off_y);
+
+ x += off_x + area->x;
+ y += off_y + area->y;
+ }
+
+ g_signal_handlers_block_by_func (controller->widget,
+ gimp_filter_tool_focus_changed,
+ controller);
+
+ g_object_set (controller->widget,
+ "type", type,
+ "x", x,
+ "y", y,
+ "radius", radius,
+ "aspect-ratio", aspect_ratio,
+ "angle", angle,
+ "inner-limit", inner_limit,
+ "midpoint", midpoint,
+ NULL);
+
+ g_signal_handlers_unblock_by_func (controller->widget,
+ gimp_filter_tool_focus_changed,
+ controller);
+}
+
+static void
+gimp_filter_tool_focus_changed (GimpToolWidget *widget,
+ Controller *controller)
+{
+ GimpFilterTool *filter_tool = controller->filter_tool;
+ GimpControllerFocusCallback focus_callback;
+ GimpLimitType type;
+ gdouble x, y;
+ gdouble radius;
+ gdouble aspect_ratio;
+ gdouble angle;
+ gdouble inner_limit;
+ gdouble midpoint;
+ gint off_x, off_y;
+ GeglRectangle area;
+
+ focus_callback = (GimpControllerFocusCallback) controller->creator_callback;
+
+ g_object_get (widget,
+ "type", &type,
+ "x", &x,
+ "y", &y,
+ "radius", &radius,
+ "aspect-ratio", &aspect_ratio,
+ "angle", &angle,
+ "inner-limit", &inner_limit,
+ "midpoint", &midpoint,
+ NULL);
+
+ gimp_filter_tool_get_drawable_area (filter_tool, &off_x, &off_y, &area);
+
+ x -= off_x + area.x;
+ y -= off_y + area.y;
+
+ focus_callback (controller->creator_data,
+ &area,
+ type,
+ x,
+ y,
+ radius,
+ aspect_ratio,
+ angle,
+ inner_limit,
+ midpoint);
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]