app: add utility function gimp_canvas_handle_calc_size()
which is the code that calculates handle size based on pointer proximity. Use the new function in GimpToolHandleGrid and GimpToolLine, and clean up some stuff in GimpToolLine.
This commit is contained in:
@ -547,6 +547,38 @@ gimp_canvas_handle_set_position (GimpCanvasItem *handle,
|
|||||||
gimp_canvas_item_end_change (handle);
|
gimp_canvas_item_end_change (handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gint
|
||||||
|
gimp_canvas_handle_calc_size (GimpCanvasItem *item,
|
||||||
|
gdouble mouse_x,
|
||||||
|
gdouble mouse_y,
|
||||||
|
gint normal_size,
|
||||||
|
gint hover_size)
|
||||||
|
{
|
||||||
|
gdouble x, y;
|
||||||
|
gdouble distance;
|
||||||
|
gdouble size;
|
||||||
|
gint full_threshold_sq = SQR (hover_size / 2) * 9;
|
||||||
|
gint partial_threshold_sq = full_threshold_sq * 5;
|
||||||
|
|
||||||
|
g_return_val_if_fail (GIMP_IS_CANVAS_HANDLE (item), normal_size);
|
||||||
|
|
||||||
|
gimp_canvas_handle_get_position (item, &x, &y);
|
||||||
|
distance = gimp_canvas_item_transform_distance_square (item,
|
||||||
|
mouse_x,
|
||||||
|
mouse_y,
|
||||||
|
x, y);
|
||||||
|
|
||||||
|
/* calculate the handle size based on distance from the cursor */
|
||||||
|
size = (1.0 - (distance - full_threshold_sq) /
|
||||||
|
(partial_threshold_sq - full_threshold_sq));
|
||||||
|
|
||||||
|
size = CLAMP (size, 0.0, 1.0);
|
||||||
|
|
||||||
|
return (gint) CLAMP ((size * hover_size),
|
||||||
|
normal_size,
|
||||||
|
hover_size);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
gimp_canvas_handle_get_size (GimpCanvasItem *handle,
|
gimp_canvas_handle_get_size (GimpCanvasItem *handle,
|
||||||
gint *width,
|
gint *width,
|
||||||
|
@ -71,6 +71,12 @@ void gimp_canvas_handle_set_position (GimpCanvasItem *handle,
|
|||||||
gdouble x,
|
gdouble x,
|
||||||
gdouble y);
|
gdouble y);
|
||||||
|
|
||||||
|
gint gimp_canvas_handle_calc_size (GimpCanvasItem *item,
|
||||||
|
gdouble mouse_x,
|
||||||
|
gdouble mouse_y,
|
||||||
|
gint normal_size,
|
||||||
|
gint hover_size);
|
||||||
|
|
||||||
void gimp_canvas_handle_get_size (GimpCanvasItem *handle,
|
void gimp_canvas_handle_get_size (GimpCanvasItem *handle,
|
||||||
gint *width,
|
gint *width,
|
||||||
gint *height);
|
gint *height);
|
||||||
|
@ -951,26 +951,6 @@ gimp_tool_handle_grid_get_cursor (GimpToolWidget *widget,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gint
|
|
||||||
calc_handle_diameter (gdouble distance)
|
|
||||||
{
|
|
||||||
#define HANDLE_DIAMETER (2 * GIMP_CANVAS_HANDLE_SIZE_CIRCLE)
|
|
||||||
#define POINT_GRAB_THRESHOLD_SQ (SQR (HANDLE_DIAMETER / 2))
|
|
||||||
#define FULL_HANDLE_THRESHOLD_SQ (POINT_GRAB_THRESHOLD_SQ * 9)
|
|
||||||
#define PARTIAL_HANDLE_THRESHOLD_SQ (FULL_HANDLE_THRESHOLD_SQ * 5)
|
|
||||||
|
|
||||||
/* Calculate the handle size based on distance from the cursor
|
|
||||||
*/
|
|
||||||
gdouble size = (1.0 - (distance - FULL_HANDLE_THRESHOLD_SQ) /
|
|
||||||
(PARTIAL_HANDLE_THRESHOLD_SQ - FULL_HANDLE_THRESHOLD_SQ));
|
|
||||||
|
|
||||||
size = CLAMP (size, 0.0, 1.0);
|
|
||||||
|
|
||||||
return (gint) CLAMP ((size * HANDLE_DIAMETER),
|
|
||||||
GIMP_CANVAS_HANDLE_SIZE_CIRCLE,
|
|
||||||
HANDLE_DIAMETER);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gimp_tool_handle_grid_update_hilight (GimpToolHandleGrid *grid)
|
gimp_tool_handle_grid_update_hilight (GimpToolHandleGrid *grid)
|
||||||
{
|
{
|
||||||
@ -983,16 +963,12 @@ gimp_tool_handle_grid_update_hilight (GimpToolHandleGrid *grid)
|
|||||||
|
|
||||||
if (item)
|
if (item)
|
||||||
{
|
{
|
||||||
gdouble x, y;
|
gdouble diameter =
|
||||||
gdouble dist;
|
gimp_canvas_handle_calc_size (item,
|
||||||
gdouble diameter;
|
|
||||||
|
|
||||||
gimp_canvas_handle_get_position (item, &x, &y);
|
|
||||||
dist = gimp_canvas_item_transform_distance_square (item,
|
|
||||||
private->mouse_x,
|
private->mouse_x,
|
||||||
private->mouse_y,
|
private->mouse_y,
|
||||||
x, y);
|
GIMP_CANVAS_HANDLE_SIZE_CIRCLE,
|
||||||
diameter = calc_handle_diameter (dist);
|
2 * GIMP_CANVAS_HANDLE_SIZE_CIRCLE);
|
||||||
|
|
||||||
gimp_canvas_handle_set_size (item, diameter, diameter);
|
gimp_canvas_handle_set_size (item, diameter, diameter);
|
||||||
gimp_canvas_item_set_highlight (item, (i + 1) == private->handle);
|
gimp_canvas_item_set_highlight (item, (i + 1) == private->handle);
|
||||||
|
@ -42,12 +42,6 @@
|
|||||||
|
|
||||||
|
|
||||||
#define SHOW_LINE TRUE
|
#define SHOW_LINE TRUE
|
||||||
#define HANDLE_CROSS_DIAMETER 18
|
|
||||||
#define HANDLE_DIAMETER 40
|
|
||||||
|
|
||||||
#define POINT_GRAB_THRESHOLD_SQ (SQR (HANDLE_DIAMETER / 2))
|
|
||||||
#define FULL_HANDLE_THRESHOLD_SQ (POINT_GRAB_THRESHOLD_SQ * 9)
|
|
||||||
#define PARTIAL_HANDLE_THRESHOLD_SQ (FULL_HANDLE_THRESHOLD_SQ * 5)
|
|
||||||
|
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
@ -226,8 +220,8 @@ gimp_tool_line_constructed (GObject *object)
|
|||||||
GIMP_HANDLE_CIRCLE,
|
GIMP_HANDLE_CIRCLE,
|
||||||
private->x1,
|
private->x1,
|
||||||
private->y1,
|
private->y1,
|
||||||
HANDLE_DIAMETER,
|
2 * GIMP_CANVAS_HANDLE_SIZE_CROSS,
|
||||||
HANDLE_DIAMETER,
|
2 * GIMP_CANVAS_HANDLE_SIZE_CROSS,
|
||||||
GIMP_HANDLE_ANCHOR_CENTER);
|
GIMP_HANDLE_ANCHOR_CENTER);
|
||||||
|
|
||||||
private->start_handle_cross =
|
private->start_handle_cross =
|
||||||
@ -235,8 +229,8 @@ gimp_tool_line_constructed (GObject *object)
|
|||||||
GIMP_HANDLE_CROSS,
|
GIMP_HANDLE_CROSS,
|
||||||
private->x1,
|
private->x1,
|
||||||
private->y1,
|
private->y1,
|
||||||
HANDLE_CROSS_DIAMETER,
|
GIMP_CANVAS_HANDLE_SIZE_CROSS,
|
||||||
HANDLE_CROSS_DIAMETER,
|
GIMP_CANVAS_HANDLE_SIZE_CROSS,
|
||||||
GIMP_HANDLE_ANCHOR_CENTER);
|
GIMP_HANDLE_ANCHOR_CENTER);
|
||||||
|
|
||||||
private->end_handle_circle =
|
private->end_handle_circle =
|
||||||
@ -244,8 +238,8 @@ gimp_tool_line_constructed (GObject *object)
|
|||||||
GIMP_HANDLE_CIRCLE,
|
GIMP_HANDLE_CIRCLE,
|
||||||
private->x2,
|
private->x2,
|
||||||
private->y2,
|
private->y2,
|
||||||
HANDLE_DIAMETER,
|
2 * GIMP_CANVAS_HANDLE_SIZE_CROSS,
|
||||||
HANDLE_DIAMETER,
|
2 * GIMP_CANVAS_HANDLE_SIZE_CROSS,
|
||||||
GIMP_HANDLE_ANCHOR_CENTER);
|
GIMP_HANDLE_ANCHOR_CENTER);
|
||||||
|
|
||||||
private->end_handle_cross =
|
private->end_handle_cross =
|
||||||
@ -253,8 +247,8 @@ gimp_tool_line_constructed (GObject *object)
|
|||||||
GIMP_HANDLE_CROSS,
|
GIMP_HANDLE_CROSS,
|
||||||
private->x2,
|
private->x2,
|
||||||
private->y2,
|
private->y2,
|
||||||
HANDLE_CROSS_DIAMETER,
|
GIMP_CANVAS_HANDLE_SIZE_CROSS,
|
||||||
HANDLE_CROSS_DIAMETER,
|
GIMP_CANVAS_HANDLE_SIZE_CROSS,
|
||||||
GIMP_HANDLE_ANCHOR_CENTER);
|
GIMP_HANDLE_ANCHOR_CENTER);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -526,19 +520,6 @@ gimp_tool_line_point_motion (GimpToolLine *line,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gint
|
|
||||||
calc_handle_diameter (gdouble distance)
|
|
||||||
{
|
|
||||||
/* Calculate the handle size based on distance from the cursor
|
|
||||||
*/
|
|
||||||
gdouble size = (1.0 - (distance - FULL_HANDLE_THRESHOLD_SQ) /
|
|
||||||
(PARTIAL_HANDLE_THRESHOLD_SQ - FULL_HANDLE_THRESHOLD_SQ));
|
|
||||||
|
|
||||||
size = CLAMP (size, 0.0, 1.0);
|
|
||||||
|
|
||||||
return (gint) (size * HANDLE_DIAMETER);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gimp_tool_line_update_hilight (GimpToolLine *line)
|
gimp_tool_line_update_hilight (GimpToolLine *line)
|
||||||
{
|
{
|
||||||
@ -555,34 +536,24 @@ gimp_tool_line_update_hilight (GimpToolLine *line)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
gdouble dist;
|
start_diameter = gimp_canvas_handle_calc_size (private->start_handle_circle,
|
||||||
|
|
||||||
dist = gimp_canvas_item_transform_distance_square (private->line,
|
|
||||||
private->mouse_x,
|
private->mouse_x,
|
||||||
private->mouse_y,
|
private->mouse_y,
|
||||||
private->x1,
|
0,
|
||||||
private->y1);
|
2 * GIMP_CANVAS_HANDLE_SIZE_CROSS);
|
||||||
start_diameter = calc_handle_diameter (dist);
|
|
||||||
start_visible = start_diameter > 2;
|
start_visible = start_diameter > 2;
|
||||||
|
|
||||||
dist = gimp_canvas_item_transform_distance_square (private->line,
|
end_diameter = gimp_canvas_handle_calc_size (private->end_handle_circle,
|
||||||
private->mouse_x,
|
private->mouse_x,
|
||||||
private->mouse_y,
|
private->mouse_y,
|
||||||
private->x2,
|
0,
|
||||||
private->y2);
|
2 * GIMP_CANVAS_HANDLE_SIZE_CROSS);
|
||||||
end_diameter = calc_handle_diameter (dist);
|
|
||||||
end_visible = end_diameter > 2;
|
end_visible = end_diameter > 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
gimp_canvas_item_set_visible (private->start_handle_circle, start_visible);
|
gimp_canvas_item_set_visible (private->start_handle_circle, start_visible);
|
||||||
gimp_canvas_item_set_visible (private->end_handle_circle, end_visible);
|
gimp_canvas_item_set_visible (private->end_handle_circle, end_visible);
|
||||||
|
|
||||||
/* Update hilights */
|
|
||||||
if (private->grabbed_point)
|
|
||||||
hilight_point = private->grabbed_point;
|
|
||||||
else
|
|
||||||
hilight_point = gimp_tool_line_get_point (line);
|
|
||||||
|
|
||||||
if (start_visible)
|
if (start_visible)
|
||||||
gimp_canvas_handle_set_size (private->start_handle_circle,
|
gimp_canvas_handle_set_size (private->start_handle_circle,
|
||||||
start_diameter, start_diameter);
|
start_diameter, start_diameter);
|
||||||
@ -591,6 +562,12 @@ gimp_tool_line_update_hilight (GimpToolLine *line)
|
|||||||
gimp_canvas_handle_set_size (private->end_handle_circle,
|
gimp_canvas_handle_set_size (private->end_handle_circle,
|
||||||
end_diameter, end_diameter);
|
end_diameter, end_diameter);
|
||||||
|
|
||||||
|
/* Update hilights */
|
||||||
|
if (private->grabbed_point)
|
||||||
|
hilight_point = private->grabbed_point;
|
||||||
|
else
|
||||||
|
hilight_point = gimp_tool_line_get_point (line);
|
||||||
|
|
||||||
gimp_canvas_item_set_highlight (private->start_handle_circle,
|
gimp_canvas_item_set_highlight (private->start_handle_circle,
|
||||||
hilight_point == POINT_START);
|
hilight_point == POINT_START);
|
||||||
gimp_canvas_item_set_highlight (private->start_handle_cross,
|
gimp_canvas_item_set_highlight (private->start_handle_cross,
|
||||||
@ -606,26 +583,19 @@ static GimpToolLinePoint
|
|||||||
gimp_tool_line_get_point (GimpToolLine *line)
|
gimp_tool_line_get_point (GimpToolLine *line)
|
||||||
{
|
{
|
||||||
GimpToolLinePrivate *private = line->private;
|
GimpToolLinePrivate *private = line->private;
|
||||||
gdouble dist;
|
|
||||||
|
|
||||||
/* Check the points in the reverse order of drawing */
|
/* Check the points in the reverse order of drawing */
|
||||||
|
|
||||||
/* Check end point */
|
/* Check end point */
|
||||||
dist = gimp_canvas_item_transform_distance_square (private->line,
|
if (gimp_canvas_item_hit (private->end_handle_circle,
|
||||||
private->mouse_x,
|
private->mouse_x,
|
||||||
private->mouse_y,
|
private->mouse_y))
|
||||||
private->x2,
|
|
||||||
private->y2);
|
|
||||||
if (dist < POINT_GRAB_THRESHOLD_SQ)
|
|
||||||
return POINT_END;
|
return POINT_END;
|
||||||
|
|
||||||
/* Check start point */
|
/* Check start point */
|
||||||
dist = gimp_canvas_item_transform_distance_square (private->line,
|
if (gimp_canvas_item_hit (private->start_handle_circle,
|
||||||
private->mouse_x,
|
private->mouse_x,
|
||||||
private->mouse_y,
|
private->mouse_y))
|
||||||
private->x1,
|
|
||||||
private->y1);
|
|
||||||
if (dist < POINT_GRAB_THRESHOLD_SQ)
|
|
||||||
return POINT_START;
|
return POINT_START;
|
||||||
|
|
||||||
/* No point found */
|
/* No point found */
|
||||||
|
Reference in New Issue
Block a user