comparison doodle/fig/select_tool.d @ 63:20d6327c4a75

Event progress. Got key press/release working and panning via keyboard.
author daveb
date Thu, 12 Aug 2010 16:35:24 +0930
parents
children 43cc2135ced0
comparison
equal deleted inserted replaced
62:6c3993f4c3eb 63:20d6327c4a75
1 module doodle.fig.select_tool;
2
3 public {
4 import doodle.dia.tool;
5 }
6
7 private {
8 import doodle.cairo.routines;
9 }
10
11 final class SelectTool : Tool {
12 this() {
13 super("Select");
14 }
15
16 override bool handleButtonPress(scope IViewport viewport, in ButtonEvent event) {
17 if (event.buttonName == ButtonName.LEFT) {
18 _active = true;
19 _anchorPoint = _currentPoint = event.pixelPoint;
20 viewport.setCursor(Cursor.HAND);
21 return true;
22 }
23 else {
24 return false;
25 }
26 }
27
28 override bool handleButtonRelease(scope IViewport viewport, in ButtonEvent event) {
29 if (event.buttonName == ButtonName.LEFT && _active) {
30 _active = false;
31 viewport.damagePixel(feather(Rectangle(_anchorPoint, _currentPoint), LINE_WIDTH / 2.0));
32 viewport.setCursor(Cursor.DEFAULT);
33 return true;
34 }
35 else {
36 return false;
37 }
38 }
39
40 override bool handleMotion(scope IViewport viewport, in MotionEvent event) {
41 if (_active) {
42 viewport.damagePixel(feather(Rectangle(_anchorPoint, _currentPoint), LINE_WIDTH / 2.0));
43 _currentPoint = event.pixelPoint;
44 viewport.damagePixel(feather(Rectangle(_anchorPoint, _currentPoint), LINE_WIDTH / 2.0));
45 }
46
47 return false;
48 }
49
50 override void draw(in IViewport viewport,
51 in Rectangle pixelDamage, scope Context pixelCr) const {
52 if (_active) {
53 /*
54 pixelCr.save; {
55 pixelCr.setSourceRgba(0.0, 0.0, 0.8, 0.3);
56 rectangle(pixelCr, Rectangle(_currentPoint, _anchorPoint));
57 pixelCr.fill();
58 } pixelCr.restore();
59 */
60
61 pixelCr.save(); {
62 double[] dashes = [ 4.0, 4.0 ];
63 pixelCr.setDash(dashes, 0.0);
64 pixelCr.setSourceRgba(0.0, 0.0, 0.5, 1.0);
65 pixelCr.setLineWidth(LINE_WIDTH);
66 rectangle(pixelCr, Rectangle(_currentPoint, _anchorPoint));
67 pixelCr.stroke;
68 } pixelCr.restore;
69 }
70 }
71
72 private {
73 bool _active;
74 Point _currentPoint;
75 Point _anchorPoint; // Pixel
76 static immutable double LINE_WIDTH = 1.0;
77 }
78 }