comparison doodle/dia/standard_tools.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 c63719604adb
children eb5436b47d13
comparison
equal deleted inserted replaced
62:6c3993f4c3eb 63:20d6327c4a75
3 public { 3 public {
4 import doodle.dia.tool; 4 import doodle.dia.tool;
5 } 5 }
6 6
7 private { 7 private {
8 import doodle.cairo.routines; 8 import gdk.Keysyms;
9 import std.math;
10 import std.stdio;
11 } 9 }
12 10
13 final class PanTool : Tool { 11 final class PanTool : Tool {
14 this() { 12 this() {
15 super("Pan"); 13 super("Pan");
41 if (event.mask.isUnset(Modifier.MIDDLE_BUTTON)) { 39 if (event.mask.isUnset(Modifier.MIDDLE_BUTTON)) {
42 Vector delta; 40 Vector delta;
43 41
44 switch (event.scrollDirection) { 42 switch (event.scrollDirection) {
45 case ScrollDirection.UP: 43 case ScrollDirection.UP:
46 delta = event.mask.isSet(Modifier.SHIFT) ? Vector(-AMOUNT, 0.0) : Vector(0.0, AMOUNT); 44 delta = event.mask.isSet(Modifier.SHIFT) ? Vector(-SCROLL_AMOUNT, 0.0) : Vector(0.0, SCROLL_AMOUNT);
47 break; 45 break;
48 case ScrollDirection.DOWN: 46 case ScrollDirection.DOWN:
49 delta = event.mask.isSet(Modifier.SHIFT) ? Vector(AMOUNT, 0.0) : Vector(0.0, -AMOUNT); 47 delta = event.mask.isSet(Modifier.SHIFT) ? Vector(SCROLL_AMOUNT, 0.0) : Vector(0.0, -SCROLL_AMOUNT);
50 break; 48 break;
51 case ScrollDirection.LEFT: 49 case ScrollDirection.LEFT:
52 delta = Vector(-AMOUNT, 0.0); 50 delta = Vector(-SCROLL_AMOUNT, 0.0);
53 break; 51 break;
54 case ScrollDirection.RIGHT: 52 case ScrollDirection.RIGHT:
55 delta = Vector(AMOUNT, 0.0); 53 delta = Vector(SCROLL_AMOUNT, 0.0);
56 break; 54 break;
57 default: 55 default:
58 assert(0); 56 assert(0);
59 } 57 }
60 58
62 } 60 }
63 61
64 return true; 62 return true;
65 } 63 }
66 64
65 override bool handleKeyPress(scope IViewport viewport, in KeyEvent event) {
66 // Respond to arrow keys and pg-up/pg-down
67
68 switch (event.value) {
69 case GdkKeysyms.GDK_Up:
70 viewport.panRelative(Vector(0.0, ARROW_AMOUNT));
71 return true;
72 case GdkKeysyms.GDK_Right:
73 viewport.panRelative(Vector(ARROW_AMOUNT, 0.0));
74 return true;
75 case GdkKeysyms.GDK_Left:
76 viewport.panRelative(Vector(-ARROW_AMOUNT, 0.0));
77 return true;
78 case GdkKeysyms.GDK_Down:
79 viewport.panRelative(Vector(0.0, -ARROW_AMOUNT));
80 return true;
81 case GdkKeysyms.GDK_Page_Up:
82 viewport.panRelative(Vector(0.0, PAGE_AMOUNT));
83 return true;
84 case GdkKeysyms.GDK_Page_Down:
85 viewport.panRelative(Vector(0.0, -PAGE_AMOUNT));
86 return true;
87 default:
88 // Just a key we don't handle
89 return false;
90 }
91 }
92
67 private { 93 private {
68 Point mLastPosition; 94 Point mLastPosition;
69 static immutable double AMOUNT = 60.0; 95 static immutable SCROLL_AMOUNT = 60.0;
96 static immutable ARROW_AMOUNT = 30.0;
97 static immutable PAGE_AMOUNT = 240.0;
70 } 98 }
71 } 99 }
72 100
73 final class ZoomTool : Tool { 101 final class ZoomTool : Tool {
74 this() { 102 this() {
93 return false; 121 return false;
94 } 122 }
95 } 123 }
96 124
97 private { 125 private {
98 static immutable double ZOOM = sqrt(2.0); 126 static immutable double ZOOM = 2^^0.5;
99 } 127 }
100 } 128 }
101
102 final class SelectTool : Tool {
103 this() {
104 super("Select");
105 }
106
107 override bool handleButtonPress(scope IViewport viewport, in ButtonEvent event) {
108 if (event.buttonName == ButtonName.LEFT) {
109 _active = true;
110 _anchorPoint = _currentPoint = event.pixelPoint;
111 viewport.setCursor(Cursor.HAND);
112 return true;
113 }
114 else {
115 return false;
116 }
117 }
118
119 override bool handleButtonRelease(scope IViewport viewport, in ButtonEvent event) {
120 if (event.buttonName == ButtonName.LEFT && _active) {
121 _active = false;
122 viewport.damagePixel(feather(Rectangle(_anchorPoint, _currentPoint), LINE_WIDTH / 2.0));
123 viewport.setCursor(Cursor.DEFAULT);
124 return true;
125 }
126 else {
127 return false;
128 }
129 }
130
131 override bool handleMotion(scope IViewport viewport, in MotionEvent event) {
132 if (_active) {
133 viewport.damagePixel(feather(Rectangle(_anchorPoint, _currentPoint), LINE_WIDTH / 2.0));
134 _currentPoint = event.pixelPoint;
135 viewport.damagePixel(feather(Rectangle(_anchorPoint, _currentPoint), LINE_WIDTH / 2.0));
136 }
137
138 return false;
139 }
140
141 override void draw(in IViewport viewport,
142 in Rectangle pixelDamage, scope Context pixelCr) const {
143 if (_active) {
144 /*
145 pixelCr.save; {
146 pixelCr.setSourceRgba(0.0, 0.0, 0.8, 0.3);
147 rectangle(pixelCr, Rectangle(_currentPoint, _anchorPoint));
148 pixelCr.fill();
149 } pixelCr.restore();
150 */
151
152 pixelCr.save(); {
153 double[] dashes = [ 4.0, 4.0 ];
154 pixelCr.setDash(dashes, 0.0);
155 pixelCr.setSourceRgba(0.0, 0.0, 0.5, 1.0);
156 pixelCr.setLineWidth(LINE_WIDTH);
157 rectangle(pixelCr, Rectangle(_currentPoint, _anchorPoint));
158 pixelCr.stroke;
159 } pixelCr.restore;
160 }
161 }
162
163 private {
164 bool _active;
165 Point _currentPoint;
166 Point _anchorPoint; // Pixel
167 static immutable double LINE_WIDTH = 1.0;
168 }
169 }