mirror of https://github.com/GNOME/gimp.git
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:
parent
634d5ae57d
commit
8738d2f22b
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue