Refactor oper_connect_motion().
This commit is contained in:
parent
d4bfd8a504
commit
f9827e2ff3
|
@ -293,6 +293,7 @@ static void oper_add_object_end (LdDiagramView *self);
|
||||||
static void oper_connect_begin (LdDiagramView *self, const LdPoint *point);
|
static void oper_connect_begin (LdDiagramView *self, const LdPoint *point);
|
||||||
static void oper_connect_end (LdDiagramView *self);
|
static void oper_connect_end (LdDiagramView *self);
|
||||||
static void oper_connect_motion (LdDiagramView *self, const LdPoint *point);
|
static void oper_connect_motion (LdDiagramView *self, const LdPoint *point);
|
||||||
|
static LdPointArray *create_connection_path (const LdPoint *end_point);
|
||||||
|
|
||||||
static void oper_select_begin (LdDiagramView *self, const LdPoint *point);
|
static void oper_select_begin (LdDiagramView *self, const LdPoint *point);
|
||||||
static void oper_select_end (LdDiagramView *self);
|
static void oper_select_end (LdDiagramView *self);
|
||||||
|
@ -1779,42 +1780,22 @@ oper_connect_motion (LdDiagramView *self, const LdPoint *point)
|
||||||
{
|
{
|
||||||
ConnectData *data;
|
ConnectData *data;
|
||||||
LdPointArray *points;
|
LdPointArray *points;
|
||||||
|
LdPoint end_point;
|
||||||
gdouble diagram_x, diagram_y;
|
gdouble diagram_x, diagram_y;
|
||||||
|
|
||||||
data = &OPER_DATA (self, connect);
|
data = &OPER_DATA (self, connect);
|
||||||
|
|
||||||
/* Find an orthogonal path between the points. */
|
|
||||||
/* TODO: This alghorithm is pretty lame, needs to be improved. */
|
|
||||||
points = ld_point_array_sized_new (4);
|
|
||||||
points->length = 4;
|
|
||||||
|
|
||||||
points->points[0].x = 0;
|
|
||||||
points->points[0].y = 0;
|
|
||||||
|
|
||||||
ld_diagram_view_widget_to_diagram_coords (self,
|
ld_diagram_view_widget_to_diagram_coords (self,
|
||||||
point->x, point->y, &diagram_x, &diagram_y);
|
point->x, point->y, &diagram_x, &diagram_y);
|
||||||
points->points[3].x = floor (diagram_x - data->origin.x + 0.5);
|
end_point.x = floor (diagram_x - data->origin.x + 0.5);
|
||||||
points->points[3].y = floor (diagram_y - data->origin.y + 0.5);
|
end_point.y = floor (diagram_y - data->origin.y + 0.5);
|
||||||
|
|
||||||
if (ABS (points->points[3].x) > ABS (points->points[3].y))
|
points = create_connection_path (&end_point);
|
||||||
{
|
|
||||||
points->points[1].x = points->points[3].x / 2;
|
|
||||||
points->points[1].y = 0;
|
|
||||||
points->points[2].x = points->points[3].x / 2;
|
|
||||||
points->points[2].y = points->points[3].y;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
points->points[1].x = 0;
|
|
||||||
points->points[1].y = points->points[3].y / 2;
|
|
||||||
points->points[2].x = points->points[3].x;
|
|
||||||
points->points[2].y = points->points[3].y / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
queue_object_draw (self, LD_DIAGRAM_OBJECT (data->connection));
|
queue_object_draw (self, LD_DIAGRAM_OBJECT (data->connection));
|
||||||
ld_diagram_connection_set_points (data->connection, points);
|
ld_diagram_connection_set_points (data->connection, points);
|
||||||
queue_object_draw (self, LD_DIAGRAM_OBJECT (data->connection));
|
|
||||||
ld_point_array_free (points);
|
ld_point_array_free (points);
|
||||||
|
queue_object_draw (self, LD_DIAGRAM_OBJECT (data->connection));
|
||||||
|
|
||||||
check_terminals (self, point);
|
check_terminals (self, point);
|
||||||
|
|
||||||
|
@ -1823,6 +1804,51 @@ oper_connect_motion (LdDiagramView *self, const LdPoint *point)
|
||||||
self->priv->terminal_hovered = FALSE;
|
self->priv->terminal_hovered = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* create_connection_path:
|
||||||
|
* @end_point: the end point of the path. The start point is always at {0, 0}.
|
||||||
|
*
|
||||||
|
* Create an orthogonal path between two points.
|
||||||
|
*/
|
||||||
|
static LdPointArray *
|
||||||
|
create_connection_path (const LdPoint *end_point)
|
||||||
|
{
|
||||||
|
LdPointArray *points;
|
||||||
|
|
||||||
|
if (end_point->x == 0 || end_point->y == 0)
|
||||||
|
{
|
||||||
|
points = ld_point_array_sized_new (2);
|
||||||
|
points->length = 2;
|
||||||
|
|
||||||
|
points->points[0].x = 0;
|
||||||
|
points->points[0].y = 0;
|
||||||
|
points->points[1] = *end_point;
|
||||||
|
return points;
|
||||||
|
}
|
||||||
|
|
||||||
|
points = ld_point_array_sized_new (4);
|
||||||
|
points->length = 4;
|
||||||
|
|
||||||
|
points->points[0].x = 0;
|
||||||
|
points->points[0].y = 0;
|
||||||
|
points->points[3] = *end_point;
|
||||||
|
|
||||||
|
if (ABS (end_point->x) > ABS (end_point->y))
|
||||||
|
{
|
||||||
|
points->points[1].x = end_point->x / 2;
|
||||||
|
points->points[1].y = 0;
|
||||||
|
points->points[2].x = end_point->x / 2;
|
||||||
|
points->points[2].y = end_point->y;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
points->points[1].x = 0;
|
||||||
|
points->points[1].y = end_point->y / 2;
|
||||||
|
points->points[2].x = end_point->x;
|
||||||
|
points->points[2].y = end_point->y / 2;
|
||||||
|
}
|
||||||
|
return points;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
oper_select_begin (LdDiagramView *self, const LdPoint *point)
|
oper_select_begin (LdDiagramView *self, const LdPoint *point)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue