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 }