[gimp] app: add a gyroscope controller to prop-gui
- From: N/A <ell src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: add a gyroscope controller to prop-gui
- Date: Tue, 10 Apr 2018 14:19:25 +0000 (UTC)
commit 8738d2f22b7940e9ff8a5fb2b486e928e912b4e9
Author: Ell <ell_se yahoo com>
Date: Tue Apr 10 09:51:48 2018 -0400
app: add a gyroscope controller to prop-gui
Add a gyroscope controller, providing a prop-gui interface to
GimpToolGyroscope.
Implement the gyroscope controller in GimpFilterTool.
app/propgui/propgui-types.h | 10 ++++-
app/tools/gimpfiltertool-widgets.c | 91 ++++++++++++++++++++++++++++++++++++
app/tools/gimpfiltertool.c | 16 ++++---
3 files changed, 109 insertions(+), 8 deletions(-)
---
diff --git a/app/propgui/propgui-types.h b/app/propgui/propgui-types.h
index 8e61327..83127f2 100644
--- a/app/propgui/propgui-types.h
+++ b/app/propgui/propgui-types.h
@@ -30,7 +30,8 @@ typedef enum
{
GIMP_CONTROLLER_TYPE_LINE,
GIMP_CONTROLLER_TYPE_SLIDER_LINE,
- GIMP_CONTROLLER_TYPE_TRANSFORM_GRID
+ GIMP_CONTROLLER_TYPE_TRANSFORM_GRID,
+ GIMP_CONTROLLER_TYPE_GYROSCOPE
} GimpControllerType;
@@ -100,6 +101,13 @@ typedef void (* GimpControllerSliderLineCallback) (gpointer
typedef void (* GimpControllerTransformGridCallback) (gpointer data,
GeglRectangle *area,
const GimpMatrix3 *transform);
+typedef void (* GimpControllerGyroscopeCallback) (gpointer data,
+ GeglRectangle *area,
+ gdouble yaw,
+ gdouble pitch,
+ gdouble roll,
+ gdouble zoom,
+ gboolean invert);
typedef GtkWidget * (* GimpCreatePickerFunc) (gpointer creator,
diff --git a/app/tools/gimpfiltertool-widgets.c b/app/tools/gimpfiltertool-widgets.c
index 2f78286..f4a285b 100644
--- a/app/tools/gimpfiltertool-widgets.c
+++ b/app/tools/gimpfiltertool-widgets.c
@@ -29,6 +29,7 @@
#include "core/gimpitem.h"
#include "display/gimpdisplay.h"
+#include "display/gimptoolgyroscope.h"
#include "display/gimptoolline.h"
#include "display/gimptooltransformgrid.h"
@@ -77,6 +78,16 @@ static void gimp_filter_tool_set_transform_grid (Controller
static void gimp_filter_tool_transform_grid_changed (GimpToolWidget *widget,
Controller *controller);
+static void gimp_filter_tool_set_gyroscope (Controller *controller,
+ GeglRectangle *area,
+ gdouble yaw,
+ gdouble pitch,
+ gdouble roll,
+ gdouble zoom,
+ gboolean invert);
+static void gimp_filter_tool_gyroscope_changed (GimpToolWidget *widget,
+ Controller *controller);
+
/* public functions */
@@ -180,6 +191,30 @@ gimp_filter_tool_create_widget (GimpFilterTool *filter_tool,
*set_func_data = controller;
}
break;
+
+ case GIMP_CONTROLLER_TYPE_GYROSCOPE:
+ {
+ GeglRectangle area;
+ gint off_x, off_y;
+
+ gimp_filter_tool_get_drawable_area (filter_tool, &off_x, &off_y, &area);
+
+ controller->widget = gimp_tool_gyroscope_new (shell);
+
+ g_object_set (controller->widget,
+ "speed", 1.0 / MAX (area.width, area.height),
+ "pivot-x", off_x + area.x + area.width / 2.0,
+ "pivot-y", off_y + area.y + area.height / 2.0,
+ NULL);
+
+ g_signal_connect (controller->widget, "changed",
+ G_CALLBACK (gimp_filter_tool_gyroscope_changed),
+ controller);
+
+ *set_func = (GCallback) gimp_filter_tool_set_gyroscope;
+ *set_func_data = controller;
+ }
+ break;
}
g_object_set_data_full (G_OBJECT (controller->widget),
@@ -480,3 +515,59 @@ gimp_filter_tool_transform_grid_changed (GimpToolWidget *widget,
g_free (transform);
}
+
+static void
+gimp_filter_tool_set_gyroscope (Controller *controller,
+ GeglRectangle *area,
+ gdouble yaw,
+ gdouble pitch,
+ gdouble roll,
+ gdouble zoom,
+ gboolean invert)
+{
+ g_signal_handlers_block_by_func (controller->widget,
+ gimp_filter_tool_gyroscope_changed,
+ controller);
+
+ g_object_set (controller->widget,
+ "yaw", yaw,
+ "pitch", pitch,
+ "roll", roll,
+ "zoom", zoom,
+ "invert", invert,
+ NULL);
+
+ g_signal_handlers_unblock_by_func (controller->widget,
+ gimp_filter_tool_gyroscope_changed,
+ controller);
+}
+
+static void gimp_filter_tool_gyroscope_changed (GimpToolWidget *widget,
+ Controller *controller)
+{
+ GimpFilterTool *filter_tool = controller->filter_tool;
+ GimpControllerGyroscopeCallback gyroscope_callback;
+ gint off_x, off_y;
+ GeglRectangle area;
+ gdouble yaw;
+ gdouble pitch;
+ gdouble roll;
+ gdouble zoom;
+ gboolean invert;
+
+ gyroscope_callback =
+ (GimpControllerGyroscopeCallback) controller->creator_callback;
+
+ gimp_filter_tool_get_drawable_area (filter_tool, &off_x, &off_y, &area);
+
+ g_object_get (widget,
+ "yaw", &yaw,
+ "pitch", &pitch,
+ "roll", &roll,
+ "zoom", &zoom,
+ "invert", &invert,
+ NULL);
+
+ gyroscope_callback (controller->creator_data,
+ &area, yaw, pitch, roll, zoom, invert);
+}
diff --git a/app/tools/gimpfiltertool.c b/app/tools/gimpfiltertool.c
index 88440e5..7b04949 100644
--- a/app/tools/gimpfiltertool.c
+++ b/app/tools/gimpfiltertool.c
@@ -220,13 +220,15 @@ gimp_filter_tool_init (GimpFilterTool *filter_tool)
{
GimpTool *tool = GIMP_TOOL (filter_tool);
- gimp_tool_control_set_scroll_lock (tool->control, TRUE);
- gimp_tool_control_set_preserve (tool->control, FALSE);
- gimp_tool_control_set_dirty_mask (tool->control,
- GIMP_DIRTY_IMAGE |
- GIMP_DIRTY_IMAGE_STRUCTURE |
- GIMP_DIRTY_DRAWABLE |
- GIMP_DIRTY_ACTIVE_DRAWABLE);
+ gimp_tool_control_set_scroll_lock (tool->control, TRUE);
+ gimp_tool_control_set_preserve (tool->control, FALSE);
+ gimp_tool_control_set_dirty_mask (tool->control,
+ GIMP_DIRTY_IMAGE |
+ GIMP_DIRTY_IMAGE_STRUCTURE |
+ GIMP_DIRTY_DRAWABLE |
+ GIMP_DIRTY_ACTIVE_DRAWABLE);
+ gimp_tool_control_set_active_modifiers (tool->control,
+ GIMP_TOOL_ACTIVE_MODIFIERS_SEPARATE);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]