[gimp] app: add a gyroscope controller to prop-gui



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]