Mercurial > projects > doodle
comparison dia/standard_tools.d @ 22:17c2df87b459
Package refactoring.
author | "David Bryant <bagnose@gmail.com>" |
---|---|
date | Wed, 15 Jul 2009 23:31:29 +0930 |
parents | standard_tools.d@d6e7a5a6f008 |
children | a24c13bb9c98 |
comparison
equal
deleted
inserted
replaced
21:993ac3a183c8 | 22:17c2df87b459 |
---|---|
1 module dia.standard_tools; | |
2 | |
3 public { | |
4 import tool; | |
5 } | |
6 | |
7 private { | |
8 import cairo_support; | |
9 import std.math; | |
10 import std.stdio; | |
11 } | |
12 | |
13 final class PanTool : Tool { | |
14 override bool handle_button_press(Viewport viewport, in ButtonEvent event) { | |
15 if (event.button_name == ButtonName.MIDDLE) { | |
16 mLastPosition = event.pixel_point; | |
17 return true; | |
18 } | |
19 else { | |
20 return false; | |
21 } | |
22 } | |
23 | |
24 override bool handle_motion(Viewport viewport, in MotionEvent event) { | |
25 if (event.mask.is_set(Modifier.MIDDLE_BUTTON)) { | |
26 viewport.pan_relative(mLastPosition - event.pixel_point); | |
27 mLastPosition = event.pixel_point; | |
28 | |
29 return true; | |
30 } | |
31 else { | |
32 return false; | |
33 } | |
34 } | |
35 | |
36 override bool handle_scroll(Viewport viewport, in ScrollEvent event) { | |
37 if (event.mask.is_unset(Modifier.MIDDLE_BUTTON)) { | |
38 Vector delta; | |
39 | |
40 switch (event.scroll_direction) { | |
41 case ScrollDirection.UP: | |
42 delta = event.mask.is_set(Modifier.SHIFT) ? Vector(AMOUNT, 0.0) : Vector(0.0, AMOUNT); | |
43 break; | |
44 case ScrollDirection.DOWN: | |
45 delta = event.mask.is_set(Modifier.SHIFT) ? Vector(-AMOUNT, 0.0) : Vector(0.0, -AMOUNT); | |
46 break; | |
47 case ScrollDirection.LEFT: | |
48 delta = Vector(-AMOUNT, 0.0); | |
49 break; | |
50 case ScrollDirection.RIGHT: | |
51 delta = Vector(AMOUNT, 0.0); | |
52 break; | |
53 } | |
54 | |
55 viewport.pan_relative(delta); | |
56 } | |
57 | |
58 return true; | |
59 } | |
60 | |
61 private { | |
62 Point mLastPosition; | |
63 static invariant double AMOUNT = 60.0; | |
64 } | |
65 } | |
66 | |
67 final class ZoomTool : Tool { | |
68 override bool handle_scroll(Viewport viewport, in ScrollEvent event) { | |
69 if (event.mask.is_set(Modifier.CONTROL)) { | |
70 if (event.scroll_direction == ScrollDirection.DOWN) { | |
71 viewport.zoom_relative(event.pixel_point, 1.0 / ZOOM); | |
72 return true; | |
73 } | |
74 else if (event.scroll_direction == ScrollDirection.UP) { | |
75 viewport.zoom_relative(event.pixel_point, ZOOM); | |
76 return true; | |
77 } | |
78 else { | |
79 return false; | |
80 } | |
81 } | |
82 else { | |
83 return false; | |
84 } | |
85 } | |
86 | |
87 private { | |
88 static invariant double ZOOM = sqrt(2.0); | |
89 } | |
90 } | |
91 | |
92 final class LassoTool : Tool { | |
93 override bool handle_button_press(Viewport viewport, in ButtonEvent event) { | |
94 if (event.button_name == ButtonName.LEFT) { | |
95 mActive = true; | |
96 mAnchorPoint = mCurrentPoint = event.pixel_point; | |
97 return true; | |
98 } | |
99 else { | |
100 return false; | |
101 } | |
102 } | |
103 | |
104 override bool handle_button_release(Viewport viewport, in ButtonEvent event) { | |
105 if (event.button_name == ButtonName.LEFT && mActive) { | |
106 mActive = false; | |
107 viewport.damage_pixel(Rectangle(mAnchorPoint, mCurrentPoint).feathered(LINE_WIDTH / 2.0)); | |
108 return true; | |
109 } | |
110 else { | |
111 return false; | |
112 } | |
113 } | |
114 | |
115 override bool handle_motion(Viewport viewport, in MotionEvent event) { | |
116 if (mActive) { | |
117 viewport.damage_pixel(Rectangle(mAnchorPoint, mCurrentPoint).feathered(LINE_WIDTH / 2.0)); | |
118 mCurrentPoint = event.pixel_point; | |
119 viewport.damage_pixel(Rectangle(mAnchorPoint, mCurrentPoint).feathered(LINE_WIDTH / 2.0)); | |
120 } | |
121 | |
122 return false; | |
123 } | |
124 | |
125 override void draw(const Viewport viewport, | |
126 in Rectangle pixel_damage, scope Context pixel_cr, | |
127 in Rectangle model_damage, scope Context model_cr) const { | |
128 if (mActive) { | |
129 pixel_cr.save; { | |
130 double[] dashes = [ 4.0, 4.0 ]; | |
131 pixel_cr.setDash(dashes, 0.0); | |
132 pixel_cr.setSourceRgba(0.0, 0.0, 0.5, 1.0); | |
133 pixel_cr.setLineWidth(LINE_WIDTH); | |
134 //writefln("Drawing rectangle: %s", Rectangle(mCurrentPoint, mAnchorPoint)); | |
135 rectangle(pixel_cr, Rectangle(mCurrentPoint, mAnchorPoint)); | |
136 pixel_cr.stroke; | |
137 } pixel_cr.restore; | |
138 } | |
139 } | |
140 | |
141 private { | |
142 bool mActive; | |
143 Point mCurrentPoint; | |
144 Point mAnchorPoint; // Pixel | |
145 static invariant double LINE_WIDTH = 1.0; | |
146 } | |
147 } |