Mercurial > projects > doodle
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 } |