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.
This commit is contained in:
Ell 2018-04-10 09:51:48 -04:00
parent 634d5ae57d
commit 8738d2f22b
3 changed files with 109 additions and 8 deletions

View File

@ -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,

View File

@ -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);
}

View File

@ -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