-
Notifications
You must be signed in to change notification settings - Fork 89
Expand file tree
/
Copy pathCircleScaleHandle.java
More file actions
125 lines (108 loc) · 3.37 KB
/
CircleScaleHandle.java
File metadata and controls
125 lines (108 loc) · 3.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package nodebox.handle;
import nodebox.graphics.GraphicsContext;
import nodebox.graphics.Point;
import nodebox.node.Node;
import nodebox.util.Geometry;
public class CircleScaleHandle extends AbstractHandle {
public enum Mode {
RADIUS, DIAMETER
}
private boolean dragging = false;
private String radiusName;
private String xName = null;
private String yName = null;
private Mode mode;
private Point pt = null;
public CircleScaleHandle(Node node) {
this(node, "radius", Mode.RADIUS);
}
public CircleScaleHandle(Node node, String radiusName) {
this(node, radiusName, Mode.RADIUS);
}
public CircleScaleHandle(Node node, Mode mode) {
this(node, "radius", mode);
}
public CircleScaleHandle(Node node, String radiusName, Mode mode) {
this(node, radiusName, mode, null, null);
}
public CircleScaleHandle(Node node, String radiusName, Mode mode, String xName, String yName) {
super(node);
this.radiusName = radiusName;
this.mode = mode;
this.xName = xName;
this.yName = yName;
}
private float getCenterX() {
if (xName != null)
return node.asFloat(xName);
else
return 0;
}
private float getCenterY() {
if (yName != null)
return node.asFloat(yName);
else
return 0;
}
private float getRadius() {
float val = node.asFloat(radiusName);
if (mode == Mode.DIAMETER)
return Math.abs(val / 2);
return Math.abs(val);
}
public void draw(GraphicsContext ctx) {
float x = getCenterX();
float y = getCenterY();
float radius = getRadius();
ctx.nofill();
ctx.ellipsemode(GraphicsContext.EllipseMode.CENTER);
ctx.stroke(HANDLE_COLOR);
ctx.ellipse(x, y, radius * 2, radius * 2);
if (pt != null)
drawDot(ctx, pt.x, pt.y);
}
@Override
public boolean mousePressed(Point pt) {
this.pt = null;
float radius = getRadius();
float d = (float) Geometry.distance(getCenterX(), getCenterY(), pt.x, pt.y);
dragging = (radius - 4 <= d && d <= radius + 4);
return dragging;
}
@Override
public boolean mouseDragged(Point pt) {
if (!dragging) return false;
float newSize = (float) Geometry.distance(getCenterX(), getCenterY(), pt.x, pt.y);
if (mode == Mode.DIAMETER)
newSize *= 2;
if (newSize == getRadius()) return false;
silentSet(radiusName, newSize);
this.pt = pt;
return true;
}
@Override
public boolean mouseReleased(Point pt) {
if (!dragging) return false;
dragging = false;
this.pt = null;
viewer.repaint();
return true;
}
@Override
public boolean mouseMoved(Point pt) {
float x = getCenterX();
float y = getCenterY();
float radius = getRadius();
float d = (float) Geometry.distance(x, y, pt.x, pt.y);
if (radius - 4 <= d && d <= radius + 4) {
float a = (float) Geometry.angle(x, y, pt.x, pt.y);
double[] xy;
xy = Geometry.coordinates(x, y, radius, a);
this.pt = new Point((float) xy[0], (float) xy[1]);
} else {
this.pt = null;
}
viewer.repaint();
return true;
}
}