Mercurial > projects > doodle
comparison doodle/gtk/canvas.d @ 48:1b4c9ba58673
Stylistic overhaul.
author | daveb |
---|---|
date | Tue, 03 Aug 2010 17:37:21 +0930 |
parents | f2e4e1d29b98 |
children | 30ecedfe2ce2 |
comparison
equal
deleted
inserted
replaced
47:14f1c051c35b | 48:1b4c9ba58673 |
---|---|
34 | 34 |
35 // x and y run right and up respectively | 35 // x and y run right and up respectively |
36 // | 36 // |
37 // Model units are millimetres. | 37 // Model units are millimetres. |
38 // | 38 // |
39 // mZoom -> pixels-per-model-unit | 39 // _zoom -> pixels-per-model-unit |
40 // mViewSize -> size of view window in pixels | 40 // _viewSize -> size of view window in pixels |
41 // mViewCentre -> location in model corresponding to centre of view | 41 // _viewCentre -> location in model corresponding to centre of view |
42 // mCanvasBounds -> size of the virtual canvas in model coordinates | 42 // _canvasBounds -> size of the virtual canvas in model coordinates |
43 // | 43 // |
44 // User operations: | 44 // User operations: |
45 // pan (middle click and drag) | 45 // pan (middle click and drag) |
46 // zoom about a point (hold control and move scroll wheel) | 46 // zoom about a point (hold control and move scroll wheel) |
47 // resize the widget | 47 // resize the widget |
48 | 48 |
49 class Canvas : Table, Viewport { | 49 class Canvas : Table, Viewport { |
50 this(in Layer[] layers, EventHandler event_handler, Grid grid, in double ppi) { | 50 this(in Layer[] layers, EventHandler eventHandler, Grid grid, in double ppi) { |
51 super(3, 3, 0); | 51 super(3, 3, 0); |
52 | 52 |
53 mDamage = Rectangle.DEFAULT; | 53 _damage = Rectangle.DEFAULT; |
54 | 54 |
55 mLayers = layers.dup; | 55 _layers = layers.dup; |
56 mEventHandler = event_handler; | 56 _eventHandler = eventHandler; |
57 mGrid = grid; | 57 _grid = grid; |
58 mPPI = ppi; | 58 _ppi = ppi; |
59 | 59 |
60 /* | 60 /* |
61 writefln("Layer bounds: %s", layer_bounds); | 61 writefln("Layer bounds: %s", layerBounds); |
62 writefln("Canvas bounds: %s", mCanvasBounds); | 62 writefln("Canvas bounds: %s", _canvasBounds); |
63 writefln("View centre: %s", mViewCentre); | 63 writefln("View centre: %s", _viewCentre); |
64 */ | 64 */ |
65 | 65 |
66 // Create our child widgets and register callbacks | 66 // Create our child widgets and register callbacks |
67 | 67 |
68 info("B1"); | 68 info("B1"); |
69 mHRuler = new HRuler; | 69 _hRuler = new HRuler; |
70 attach(mHRuler, | 70 attach(_hRuler, |
71 1, 2, | 71 1, 2, |
72 0, 1, | 72 0, 1, |
73 AttachOptions.FILL | AttachOptions.EXPAND, AttachOptions.SHRINK, | 73 AttachOptions.FILL | AttachOptions.EXPAND, AttachOptions.SHRINK, |
74 0, 0); | 74 0, 0); |
75 mHRuler.setMetric(MetricType.PIXELS); | 75 _hRuler.setMetric(MetricType.PIXELS); |
76 | 76 |
77 info("B2"); | 77 info("B2"); |
78 mVRuler = new VRuler; | 78 _vRuler = new VRuler; |
79 attach(mVRuler, | 79 attach(_vRuler, |
80 0, 1, | 80 0, 1, |
81 1, 2, | 81 1, 2, |
82 AttachOptions.SHRINK, AttachOptions.FILL | AttachOptions.EXPAND, | 82 AttachOptions.SHRINK, AttachOptions.FILL | AttachOptions.EXPAND, |
83 0, 0); | 83 0, 0); |
84 info("B3"); | 84 info("B3"); |
85 mVRuler.setMetric(MetricType.PIXELS); | 85 _vRuler.setMetric(MetricType.PIXELS); |
86 info("J"); | 86 info("J"); |
87 | 87 |
88 mDrawingArea = new DrawingArea; | 88 _drawingArea = new DrawingArea; |
89 mDrawingArea.addOnRealize(&on_realize); | 89 _drawingArea.addOnRealize(&onRealize); |
90 mDrawingArea.addOnConfigure(&on_configure); | 90 _drawingArea.addOnConfigure(&onConfigure); |
91 mDrawingArea.addOnExpose(&on_expose); | 91 _drawingArea.addOnExpose(&onExpose); |
92 mDrawingArea.addOnButtonPress(&on_button_press); | 92 _drawingArea.addOnButtonPress(&onButtonPress); |
93 mDrawingArea.addOnButtonRelease(&on_button_release); | 93 _drawingArea.addOnButtonRelease(&onButtonRelease); |
94 mDrawingArea.addOnKeyPress(&on_key_event); | 94 _drawingArea.addOnKeyPress(&onKeyEvent); |
95 mDrawingArea.addOnKeyRelease(&on_key_event); | 95 _drawingArea.addOnKeyRelease(&onKeyEvent); |
96 mDrawingArea.addOnMotionNotify(&on_motion_notify); | 96 _drawingArea.addOnMotionNotify(&onMotionNotify); |
97 mDrawingArea.addOnScroll(&on_scroll); | 97 _drawingArea.addOnScroll(&onScroll); |
98 mDrawingArea.addOnEnterNotify(&on_enter_notify); | 98 _drawingArea.addOnEnterNotify(&onEnterNotify); |
99 mDrawingArea.addOnLeaveNotify(&on_leave_notify); | 99 _drawingArea.addOnLeaveNotify(&onLeaveNotify); |
100 mDrawingArea.setEvents(EventMask.EXPOSURE_MASK | | 100 _drawingArea.setEvents(EventMask.EXPOSURE_MASK | |
101 EventMask.POINTER_MOTION_MASK | | 101 EventMask.POINTER_MOTION_MASK | |
102 EventMask.POINTER_MOTION_HINT_MASK | | 102 EventMask.POINTER_MOTION_HINT_MASK | |
103 EventMask.BUTTON_MOTION_MASK | | 103 EventMask.BUTTON_MOTION_MASK | |
104 EventMask.BUTTON_PRESS_MASK | | 104 EventMask.BUTTON_PRESS_MASK | |
105 EventMask.BUTTON_RELEASE_MASK | | 105 EventMask.BUTTON_RELEASE_MASK | |
109 EventMask.LEAVE_NOTIFY_MASK | | 109 EventMask.LEAVE_NOTIFY_MASK | |
110 EventMask.FOCUS_CHANGE_MASK | | 110 EventMask.FOCUS_CHANGE_MASK | |
111 EventMask.SCROLL_MASK); | 111 EventMask.SCROLL_MASK); |
112 info("M"); | 112 info("M"); |
113 | 113 |
114 attach(mDrawingArea, | 114 attach(_drawingArea, |
115 1, 2, | 115 1, 2, |
116 1, 2, | 116 1, 2, |
117 AttachOptions.FILL | AttachOptions.EXPAND, AttachOptions.FILL | AttachOptions.EXPAND, | 117 AttachOptions.FILL | AttachOptions.EXPAND, AttachOptions.FILL | AttachOptions.EXPAND, |
118 0, 0); | 118 0, 0); |
119 | 119 |
120 // value, lower, upper, step-inc, page-inc, page-size | 120 // value, lower, upper, step-inc, page-inc, page-size |
121 // Give the adjustments dummy values until we receive a configure | 121 // Give the adjustments dummy values until we receive a configure |
122 mHAdjustment = new Adjustment(0.0, 0.0, 1.0, 0.2, 0.5, 0.5); | 122 _hAdjustment = new Adjustment(0.0, 0.0, 1.0, 0.2, 0.5, 0.5); |
123 mHAdjustment.addOnValueChanged(&onValueChanged); | 123 _hAdjustment.addOnValueChanged(&onValueChanged); |
124 mHScrollbar = new HScrollbar(mHAdjustment); | 124 _hScrollbar = new HScrollbar(_hAdjustment); |
125 mHScrollbar.setInverted(false); | 125 _hScrollbar.setInverted(false); |
126 attach(mHScrollbar, | 126 attach(_hScrollbar, |
127 1, 2, | 127 1, 2, |
128 2, 3, | 128 2, 3, |
129 AttachOptions.FILL | AttachOptions.EXPAND, AttachOptions.SHRINK, | 129 AttachOptions.FILL | AttachOptions.EXPAND, AttachOptions.SHRINK, |
130 0, 0); | 130 0, 0); |
131 info("Q"); | 131 info("Q"); |
132 | 132 |
133 mVAdjustment = new Adjustment(0.0, 0.0, 1.0, 0.2, 0.5, 0.5); | 133 _vAdjustment = new Adjustment(0.0, 0.0, 1.0, 0.2, 0.5, 0.5); |
134 mVAdjustment.addOnValueChanged(&onValueChanged); | 134 _vAdjustment.addOnValueChanged(&onValueChanged); |
135 mVScrollbar = new VScrollbar(mVAdjustment); | 135 _vScrollbar = new VScrollbar(_vAdjustment); |
136 mVScrollbar.setInverted(true); | 136 _vScrollbar.setInverted(true); |
137 attach(mVScrollbar, | 137 attach(_vScrollbar, |
138 2, 3, | 138 2, 3, |
139 1, 2, | 139 1, 2, |
140 AttachOptions.SHRINK, | 140 AttachOptions.SHRINK, |
141 AttachOptions.FILL | AttachOptions.EXPAND, | 141 AttachOptions.FILL | AttachOptions.EXPAND, |
142 0, 0); | 142 0, 0); |
143 } | 143 } |
144 | 144 |
145 override void zoom_relative(in Point pixel_datum, in double factor) { | 145 override void zoomRelative(in Point pixelDatum, in double factor) { |
146 // Work out pixel distance from current centre to datum, | 146 // Work out pixel distance from current centre to datum, |
147 // Do the zoom, then work out the new centre that keeps the | 147 // Do the zoom, then work out the new centre that keeps the |
148 // pixel distance the same | 148 // pixel distance the same |
149 | 149 |
150 Point old_model_datum = pixel_to_model(pixel_datum); | 150 Point oldModelDatum = pixelToModel(pixelDatum); |
151 Vector pixel_distance = model_to_pixel(old_model_datum - mViewCentre); | 151 Vector pixelDistance = modelToPixel(oldModelDatum - _viewCentre); |
152 mZoom = clamp_zoom(factor * mZoom); | 152 _zoom = clampZoom(factor * _zoom); |
153 mViewCentre = old_model_datum - pixel_to_model(pixel_distance); | 153 _viewCentre = oldModelDatum - pixelToModel(pixelDistance); |
154 | 154 |
155 update_adjustments; | 155 updateAdjustments; |
156 update_rulers; | 156 updateRulers; |
157 mGrid.zoom_changed(mZoom); | 157 _grid.zoomChanged(_zoom); |
158 queueDraw; | 158 queueDraw; |
159 } | 159 } |
160 | 160 |
161 override void pan_relative(in Vector pixel_displacement) { | 161 override void panRelative(in Vector pixelDisplacement) { |
162 mViewCentre = mViewCentre + pixel_to_model(pixel_displacement); | 162 _viewCentre = _viewCentre + pixelToModel(pixelDisplacement); |
163 | 163 |
164 update_adjustments; | 164 updateAdjustments; |
165 update_rulers; | 165 updateRulers; |
166 queueDraw; | 166 queueDraw; |
167 } | 167 } |
168 | 168 |
169 override void set_cursor(in Cursor cursor) { | 169 override void setCursor(in Cursor cursor) { |
170 CursorType cursor_type; | 170 CursorType cursor_type; |
171 | 171 |
172 switch (cursor) { | 172 switch (cursor) { |
173 case Cursor.DEFAULT: | 173 case Cursor.DEFAULT: |
174 cursor_type = CursorType.ARROW; | 174 cursor_type = CursorType.ARROW; |
181 break; | 181 break; |
182 default: | 182 default: |
183 assert(0); | 183 assert(0); |
184 } | 184 } |
185 | 185 |
186 mDrawingArea.setCursor(new gdk.Cursor.Cursor(cursor_type)); | 186 _drawingArea.setCursor(new gdk.Cursor.Cursor(cursor_type)); |
187 } | 187 } |
188 | 188 |
189 override void damage_model(in Rectangle area) { | 189 override void damageModel(in Rectangle area) { |
190 mDamage = mDamage | model_to_pixel(area); | 190 _damage = _damage | modelToPixel(area); |
191 } | 191 } |
192 | 192 |
193 override void damage_pixel(in Rectangle area) { | 193 override void damagePixel(in Rectangle area) { |
194 mDamage = mDamage | area; | 194 _damage = _damage | area; |
195 } | 195 } |
196 | 196 |
197 private { | 197 private { |
198 | 198 |
199 void update_bounds() { | 199 void update_bounds() { |
200 } | 200 } |
201 | 201 |
202 | 202 |
203 bool on_configure(GdkEventConfigure * event, Widget widget) { | 203 bool onConfigure(GdkEventConfigure * event, Widget widget) { |
204 assert(widget is mDrawingArea); | 204 assert(widget is _drawingArea); |
205 | 205 |
206 mViewSize = Vector(cast(double)event.width, cast(double)event.height); | 206 _viewSize = Vector(cast(double)event.width, cast(double)event.height); |
207 | 207 |
208 Rectangle layer_bounds = Rectangle.DEFAULT; | 208 Rectangle layerBounds = Rectangle.DEFAULT; |
209 | 209 |
210 foreach (ref layer; mLayers) { | 210 foreach (ref layer; _layers) { |
211 layer_bounds = layer_bounds | layer.bounds; | 211 layerBounds = layerBounds | layer.bounds; |
212 } | 212 } |
213 | 213 |
214 assert(layer_bounds.valid); | 214 assert(layerBounds.valid); |
215 | 215 |
216 Rectangle padded_layer_bounds = expand(move(layer_bounds, - layer_bounds.size), 2.0 * layer_bounds.size); | 216 Rectangle paddedLayerBounds = expand(move(layerBounds, - layerBounds.size), 2.0 * layerBounds.size); |
217 | 217 |
218 if (!mHadConfigure) { | 218 if (!_hadConfigure) { |
219 info("1"); | 219 info("1"); |
220 const double MM_PER_INCH = 25.4; | 220 const double MM_PER_INCH = 25.4; |
221 mZoom = 0.25 * mPPI / MM_PER_INCH; | 221 _zoom = 0.25 * _ppi / MM_PER_INCH; |
222 | 222 |
223 mCanvasBounds = padded_layer_bounds; | 223 _canvasBounds = paddedLayerBounds; |
224 mViewCentre = mCanvasBounds.centre; | 224 _viewCentre = _canvasBounds.centre; |
225 | 225 |
226 mGrid.zoom_changed(mZoom); | 226 _grid.zoomChanged(_zoom); |
227 | 227 |
228 mHadConfigure = true; | 228 _hadConfigure = true; |
229 } | 229 } |
230 else { | 230 else { |
231 // Use configure events as an opportunity | 231 // Use configure events as an opportunity |
232 // to consolidate the canvas-bounds | 232 // to consolidate the canvas-bounds |
233 // XXX nasty code. | 233 // XXX nasty code. |
234 Vector z = mViewSize / mZoom; | 234 Vector z = _viewSize / _zoom; |
235 Rectangle r = Rectangle(mViewCentre - z / 2.0, z); | 235 Rectangle r = Rectangle(_viewCentre - z / 2.0, z); |
236 mCanvasBounds = r | padded_layer_bounds; | 236 _canvasBounds = r | paddedLayerBounds; |
237 } | 237 } |
238 | 238 |
239 update_adjustments; | 239 updateAdjustments; |
240 update_rulers; | 240 updateRulers; |
241 | 241 |
242 //writefln("Canvas bounds: %s", mCanvasBounds); | 242 //writefln("Canvas bounds: %s", _canvasBounds); |
243 //writefln("View centre: %s", mViewCentre); | 243 //writefln("View centre: %s", _viewCentre); |
244 | 244 |
245 return true; | 245 return true; |
246 } | 246 } |
247 | 247 |
248 bool on_expose(GdkEventExpose * event, Widget widget) { | 248 bool onExpose(GdkEventExpose * event, Widget widget) { |
249 assert(widget is mDrawingArea); | 249 assert(widget is _drawingArea); |
250 | 250 |
251 Drawable dr = mDrawingArea.getWindow; | 251 Drawable dr = _drawingArea.getWindow; |
252 | 252 |
253 int width, height; | 253 int width, height; |
254 dr.getSize(width, height); | 254 dr.getSize(width, height); |
255 //writefln("Got expose %dx%d\n", width, height); | 255 //writefln("Got expose %dx%d\n", width, height); |
256 | 256 |
257 scope model_cr = new Context(dr); | 257 scope modelCr = new Context(dr); |
258 scope pixel_cr = new Context(dr); | 258 scope pixelCr = new Context(dr); |
259 | 259 |
260 Rectangle pixel_damage = | 260 Rectangle pixel_damage = |
261 event is null ? | 261 event is null ? |
262 Rectangle(Point(0.0, 0.0), mViewSize) : | 262 Rectangle(Point(0.0, 0.0), _viewSize) : |
263 Rectangle(Point(cast(double)event.area.x, mViewSize.y - cast(double)(event.area.y + event.area.height)), | 263 Rectangle(Point(cast(double)event.area.x, _viewSize.y - cast(double)(event.area.y + event.area.height)), |
264 Vector(cast(double)event.area.width, cast(double)event.area.height)); | 264 Vector(cast(double)event.area.width, cast(double)event.area.height)); |
265 | 265 |
266 Rectangle model_damage = pixel_to_model(pixel_damage); | 266 Rectangle model_damage = pixelToModel(pixel_damage); |
267 | 267 |
268 //writefln("Pixel damage: %s, model damage: %s", pixel_damage, model_damage); | 268 //writefln("Pixel damage: %s, model damage: %s", pixel_damage, model_damage); |
269 | 269 |
270 model_cr.save; pixel_cr.save; { | 270 modelCr.save; pixelCr.save; { |
271 // Setup model context and clip | 271 // Setup model context and clip |
272 | 272 |
273 GtkAdjustment * h_gtkAdjustment = mHAdjustment.getAdjustmentStruct; | 273 GtkAdjustment * h_gtkAdjustment = _hAdjustment.getAdjustmentStruct; |
274 GtkAdjustment * v_gtkAdjustment = mVAdjustment.getAdjustmentStruct; | 274 GtkAdjustment * v_gtkAdjustment = _vAdjustment.getAdjustmentStruct; |
275 | 275 |
276 model_cr.scale(mZoom, -mZoom); | 276 modelCr.scale(_zoom, -_zoom); |
277 model_cr.translate(-gtk_adjustment_get_value(h_gtkAdjustment), | 277 modelCr.translate(-gtk_adjustment_get_value(h_gtkAdjustment), |
278 -gtk_adjustment_get_value(v_gtkAdjustment) - gtk_adjustment_get_page_size(v_gtkAdjustment)); | 278 -gtk_adjustment_get_value(v_gtkAdjustment) - gtk_adjustment_get_page_size(v_gtkAdjustment)); |
279 | 279 |
280 rectangle(model_cr, model_damage); | 280 rectangle(modelCr, model_damage); |
281 model_cr.clip; | 281 modelCr.clip; |
282 | 282 |
283 // Setup pixel context and clip | 283 // Setup pixel context and clip |
284 | 284 |
285 pixel_cr.translate(0.0, mViewSize.y); | 285 pixelCr.translate(0.0, _viewSize.y); |
286 pixel_cr.scale(1.0, -1.0); | 286 pixelCr.scale(1.0, -1.0); |
287 | 287 |
288 rectangle(pixel_cr, pixel_damage); | 288 rectangle(pixelCr, pixel_damage); |
289 pixel_cr.clip; | 289 pixelCr.clip; |
290 | 290 |
291 // Fill the background | 291 // Fill the background |
292 | 292 |
293 pixel_cr.save; { | 293 pixelCr.save; { |
294 // Make the window light grey | 294 // Make the window light grey |
295 pixel_cr.setSourceRgba(0.9, 0.9, 0.9, 1.0); | 295 pixelCr.setSourceRgba(0.9, 0.9, 0.9, 1.0); |
296 rectangle(pixel_cr, pixel_damage); | 296 rectangle(pixelCr, pixel_damage); |
297 pixel_cr.fill; | 297 pixelCr.fill; |
298 } pixel_cr.restore; | 298 } pixelCr.restore; |
299 | 299 |
300 // Draw each layer | 300 // Draw each layer |
301 | 301 |
302 foreach(ref layer; mLayers) { | 302 foreach(ref layer; _layers) { |
303 model_cr.save; pixel_cr.save; { | 303 modelCr.save; pixelCr.save; { |
304 layer.draw(this, pixel_damage, pixel_cr, model_damage, model_cr); | 304 layer.draw(this, pixel_damage, pixelCr, model_damage, modelCr); |
305 } pixel_cr.restore; model_cr.restore; | 305 } pixelCr.restore; modelCr.restore; |
306 } | 306 } |
307 } pixel_cr.restore; model_cr.restore; | 307 } pixelCr.restore; modelCr.restore; |
308 | 308 |
309 return true; | 309 return true; |
310 } | 310 } |
311 | 311 |
312 bool on_button_press(GdkEventButton * event, Widget widget) { | 312 bool onButtonPress(GdkEventButton * event, Widget widget) { |
313 assert(widget is mDrawingArea); | 313 assert(widget is _drawingArea); |
314 //writefln("Got button event\n"); | 314 //writefln("Got button event\n"); |
315 | 315 |
316 Point pixel_point = Point(event.x + 0.5, mViewSize.y - (event.y + 0.5)); | 316 Point pixelPoint = Point(event.x + 0.5, _viewSize.y - (event.y + 0.5)); |
317 Point model_point = pixel_to_model(pixel_point); | 317 Point modelPoint = pixelToModel(pixelPoint); |
318 | 318 |
319 auto button_event = new ButtonEvent(gtk2tk_button_action(event.type), | 319 auto buttonEvent = new ButtonEvent(gtk2tkButtonAction(event.type), |
320 gtk2tk_button_name(event.button), | 320 gtk2tkButtonName(event.button), |
321 pixel_point, | 321 pixelPoint, |
322 model_point, | 322 modelPoint, |
323 gtk2tk_mask(event.state)); | 323 gtk2tkMask(event.state)); |
324 | 324 |
325 mEventHandler.handle_button_press(this, button_event); | 325 _eventHandler.handleButtonPress(this, buttonEvent); |
326 | 326 |
327 fix_damage; | 327 fixDamage; |
328 | 328 |
329 return true; | 329 return true; |
330 } | 330 } |
331 | 331 |
332 bool on_button_release(GdkEventButton * event, Widget widget) { | 332 bool onButtonRelease(GdkEventButton * event, Widget widget) { |
333 assert(widget is mDrawingArea); | 333 assert(widget is _drawingArea); |
334 //writefln("Got button event\n"); | 334 //writefln("Got button event\n"); |
335 | 335 |
336 Point pixel_point = Point(event.x + 0.5, mViewSize.y - (event.y + 0.5)); | 336 Point pixelPoint = Point(event.x + 0.5, _viewSize.y - (event.y + 0.5)); |
337 Point model_point = pixel_to_model(pixel_point); | 337 Point modelPoint = pixelToModel(pixelPoint); |
338 | 338 |
339 auto button_event = new ButtonEvent(gtk2tk_button_action(event.type), | 339 auto buttonEvent = new ButtonEvent(gtk2tkButtonAction(event.type), |
340 gtk2tk_button_name(event.button), | 340 gtk2tkButtonName(event.button), |
341 pixel_point, | 341 pixelPoint, |
342 model_point, | 342 modelPoint, |
343 gtk2tk_mask(event.state)); | 343 gtk2tkMask(event.state)); |
344 | 344 |
345 mEventHandler.handle_button_release(this, button_event); | 345 _eventHandler.handleButtonRelease(this, buttonEvent); |
346 | 346 |
347 fix_damage; | 347 fixDamage; |
348 | 348 |
349 return true; | 349 return true; |
350 } | 350 } |
351 | 351 |
352 bool on_key_event(GdkEventKey * event, Widget widget) { | 352 bool onKeyEvent(GdkEventKey * event, Widget widget) { |
353 assert(widget is mDrawingArea); | 353 assert(widget is _drawingArea); |
354 //writefln("Got key event\n"); | 354 //writefln("Got key event\n"); |
355 | 355 |
356 //auto key_event = new KeyEvent("", | 356 //auto key_event = new KeyEvent("", |
357 // mEventHandle.handle_key(key_event); | 357 // mEventHandle.handle_key(key_event); |
358 | 358 |
359 fix_damage; | 359 fixDamage; |
360 | 360 |
361 return true; | 361 return true; |
362 } | 362 } |
363 | 363 |
364 bool on_motion_notify(GdkEventMotion * event, Widget widget) { | 364 bool onMotionNotify(GdkEventMotion * event, Widget widget) { |
365 assert(widget is mDrawingArea); | 365 assert(widget is _drawingArea); |
366 //writefln("Got motion notify\n"); | 366 //writefln("Got motion notify\n"); |
367 gtk_widget_event(mHRuler.getWidgetStruct(), cast(GdkEvent *)event); | 367 gtk_widget_event(_hRuler.getWidgetStruct(), cast(GdkEvent *)event); |
368 gtk_widget_event(mVRuler.getWidgetStruct(), cast(GdkEvent *)event); | 368 gtk_widget_event(_vRuler.getWidgetStruct(), cast(GdkEvent *)event); |
369 | 369 |
370 Point pixel_point = Point(event.x + 0.5, mViewSize.y - (event.y + 0.5)); | 370 Point pixelPoint = Point(event.x + 0.5, _viewSize.y - (event.y + 0.5)); |
371 Point model_point = pixel_to_model(pixel_point); | 371 Point modelPoint = pixelToModel(pixelPoint); |
372 | 372 |
373 auto motion_event = new MotionEvent(pixel_point, | 373 auto motion_event = new MotionEvent(pixelPoint, |
374 model_point, | 374 modelPoint, |
375 gtk2tk_mask(event.state)); | 375 gtk2tkMask(event.state)); |
376 | 376 |
377 mEventHandler.handle_motion(this, motion_event); | 377 _eventHandler.handleMotion(this, motion_event); |
378 | 378 |
379 fix_damage; | 379 fixDamage; |
380 | 380 |
381 return true; | 381 return true; |
382 } | 382 } |
383 | 383 |
384 bool on_scroll(GdkEventScroll * event, Widget widget) { | 384 bool onScroll(GdkEventScroll * event, Widget widget) { |
385 assert(widget is mDrawingArea); | 385 assert(widget is _drawingArea); |
386 //writefln("Got scroll\n"); | 386 //writefln("Got scroll\n"); |
387 | 387 |
388 Point pixel_point = Point(event.x + 0.5, mViewSize.y - (event.y + 0.5)); | 388 Point pixelPoint = Point(event.x + 0.5, _viewSize.y - (event.y + 0.5)); |
389 Point model_point = pixel_to_model(pixel_point); | 389 Point modelPoint = pixelToModel(pixelPoint); |
390 | 390 |
391 auto scroll_event = new ScrollEvent(gtk2tk_direction(event.direction), | 391 auto scroll_event = new ScrollEvent(gtk2tkDirection(event.direction), |
392 pixel_point, | 392 pixelPoint, |
393 model_point, | 393 modelPoint, |
394 gtk2tk_mask(event.state)); | 394 gtk2tkMask(event.state)); |
395 | 395 |
396 mEventHandler.handle_scroll(this, scroll_event); | 396 _eventHandler.handleScroll(this, scroll_event); |
397 | 397 |
398 fix_damage; | 398 fixDamage; |
399 | 399 |
400 return true; | 400 return true; |
401 } | 401 } |
402 | 402 |
403 /* | 403 /* |
404 public enum GdkCrossingMode { | 404 public enum GdkCrossingMode { |
405 NORMAL, | 405 NORMAL, |
406 GRAB, | 406 GRAB, |
407 UNGRAB, | 407 UNGRAB, |
408 GTK_GRAB, | 408 GTK_GRAB, |
409 GTK_UNGRAB, | 409 GTK_UNGRAB, |
410 STATE_CHANGED | 410 STATE_CHANGED |
411 } | 411 } |
412 | 412 |
413 public struct GdkEventCrossing { | 413 public struct GdkEventCrossing { |
414 GdkEventType type; | 414 GdkEventType type; |
415 GdkWindow *window; | 415 GdkWindow *window; |
416 byte sendEvent; | 416 byte sendEvent; |
417 GdkWindow *subwindow; | 417 GdkWindow *subwindow; |
418 uint time; | 418 uint time; |
419 double x; | 419 double x; |
420 double y; | 420 double y; |
421 double xRoot; | 421 double xRoot; |
422 double yRoot; | 422 double yRoot; |
423 GdkCrossingMode mode; | 423 GdkCrossingMode mode; |
424 GdkNotifyType detail; | 424 GdkNotifyType detail; |
425 int focus; | 425 int focus; |
426 uint state; | 426 uint state; |
427 } | 427 } |
428 */ | 428 */ |
429 | 429 |
430 bool on_enter_notify(GdkEventCrossing * event, Widget widget) { | 430 bool onEnterNotify(GdkEventCrossing * event, Widget widget) { |
431 assert(widget is mDrawingArea); | 431 assert(widget is _drawingArea); |
432 //writefln("Enter %d %d %d", cast(int)event.mode, event.focus, event.state); | 432 //writefln("Enter %d %d %d", cast(int)event.mode, event.focus, event.state); |
433 // TODO | 433 // TODO |
434 return true; | 434 return true; |
435 } | 435 } |
436 | 436 |
437 bool on_leave_notify(GdkEventCrossing * event, Widget widget) { | 437 bool onLeaveNotify(GdkEventCrossing * event, Widget widget) { |
438 assert(widget is mDrawingArea); | 438 assert(widget is _drawingArea); |
439 //writefln("Leave %d %d %d", cast(int)event.mode, event.focus, event.state); | 439 //writefln("Leave %d %d %d", cast(int)event.mode, event.focus, event.state); |
440 // TODO | 440 // TODO |
441 return true; | 441 return true; |
442 } | 442 } |
443 | 443 |
444 void onValueChanged(Adjustment adjustment) { | 444 void onValueChanged(Adjustment adjustment) { |
445 GtkAdjustment * h_gtkAdjustment = mHAdjustment.getAdjustmentStruct; | 445 GtkAdjustment * h_gtkAdjustment = _hAdjustment.getAdjustmentStruct; |
446 GtkAdjustment * v_gtkAdjustment = mVAdjustment.getAdjustmentStruct; | 446 GtkAdjustment * v_gtkAdjustment = _vAdjustment.getAdjustmentStruct; |
447 | 447 |
448 Point view_left_top = Point(gtk_adjustment_get_value(h_gtkAdjustment), | 448 Point viewLeftTop = Point(gtk_adjustment_get_value(h_gtkAdjustment), |
449 gtk_adjustment_get_value(v_gtkAdjustment)); | 449 gtk_adjustment_get_value(v_gtkAdjustment)); |
450 | 450 |
451 Vector model_size = pixel_to_model(mViewSize); | 451 Vector modelSize = pixelToModel(_viewSize); |
452 | 452 |
453 //writefln("%s", view_left_bottom); | 453 //writefln("%s", viewLeftBottom); |
454 mViewCentre = view_left_top + model_size / 2.0; | 454 _viewCentre = viewLeftTop + modelSize / 2.0; |
455 //writefln("onValueChanged mViewCentre: %s", mViewCentre); | 455 //writefln("onValueChanged _viewCentre: %s", _viewCentre); |
456 | 456 |
457 update_rulers; | 457 updateRulers; |
458 | 458 |
459 queueDraw; | 459 queueDraw; |
460 } | 460 } |
461 | 461 |
462 void update_rulers() { | 462 void updateRulers() { |
463 invariant Vector model_size = pixel_to_model(mViewSize); | 463 invariant Vector modelSize = pixelToModel(_viewSize); |
464 | 464 |
465 invariant Point view_left_bottom = mViewCentre - model_size / 2.0; | 465 invariant Point viewLeftBottom = _viewCentre - modelSize / 2.0; |
466 invariant Point view_right_top = mViewCentre + model_size / 2.0; | 466 invariant Point viewRightTop = _viewCentre + modelSize / 2.0; |
467 | 467 |
468 // Define these just to obtain the position | 468 // Define these just to obtain the position |
469 // below and we can preserve it | 469 // below and we can preserve it |
470 double lower, upper, position, max_size; | 470 double lower, upper, position, maxSize; |
471 | 471 |
472 mHRuler.getRange(lower, upper, position, max_size); | 472 _hRuler.getRange(lower, upper, position, maxSize); |
473 mHRuler.setRange(view_left_bottom.x, | 473 _hRuler.setRange(viewLeftBottom.x, |
474 view_right_top.x, | 474 viewRightTop.x, |
475 position, | 475 position, |
476 mZoom * 50.0); | 476 _zoom * 50.0); |
477 | 477 |
478 mVRuler.getRange(lower, upper, position, max_size); | 478 _vRuler.getRange(lower, upper, position, maxSize); |
479 mVRuler.setRange(view_right_top.y, | 479 _vRuler.setRange(viewRightTop.y, |
480 view_left_bottom.y, | 480 viewLeftBottom.y, |
481 position, | 481 position, |
482 mZoom * 50.0); | 482 _zoom * 50.0); |
483 } | 483 } |
484 | 484 |
485 void update_adjustments() { | 485 void updateAdjustments() { |
486 invariant Vector model_size = pixel_to_model(mViewSize); | 486 invariant Vector modelSize = pixelToModel(_viewSize); |
487 | 487 |
488 invariant Point view_left_bottom = mViewCentre - model_size / 2.0; | 488 invariant Point viewLeftBottom = _viewCentre - modelSize / 2.0; |
489 invariant Point view_right_top = mViewCentre + model_size / 2.0; | 489 invariant Point viewRightTop = _viewCentre + modelSize / 2.0; |
490 | 490 |
491 // Adjust the canvas size if necessary | 491 // Adjust the canvas size if necessary |
492 mCanvasBounds = Rectangle(min_extents(mCanvasBounds.min_corner, view_left_bottom), | 492 _canvasBounds = Rectangle(minExtents(_canvasBounds.minCorner, viewLeftBottom), |
493 max_extents(mCanvasBounds.max_corner, view_right_top)); | 493 maxExtents(_canvasBounds.maxCorner, viewRightTop)); |
494 | 494 |
495 // Update the adjustments | 495 // Update the adjustments |
496 | 496 |
497 GtkAdjustment * h_gtkAdjustment = mHAdjustment.getAdjustmentStruct; | 497 GtkAdjustment * h_gtkAdjustment = _hAdjustment.getAdjustmentStruct; |
498 GtkAdjustment * v_gtkAdjustment = mVAdjustment.getAdjustmentStruct; | 498 GtkAdjustment * v_gtkAdjustment = _vAdjustment.getAdjustmentStruct; |
499 | 499 |
500 gtk_adjustment_set_lower(h_gtkAdjustment, mCanvasBounds.min_corner.x); | 500 gtk_adjustment_set_lower(h_gtkAdjustment, _canvasBounds.minCorner.x); |
501 gtk_adjustment_set_upper(h_gtkAdjustment, mCanvasBounds.max_corner.x); | 501 gtk_adjustment_set_upper(h_gtkAdjustment, _canvasBounds.maxCorner.x); |
502 gtk_adjustment_set_value(h_gtkAdjustment, view_left_bottom.x); | 502 gtk_adjustment_set_value(h_gtkAdjustment, viewLeftBottom.x); |
503 gtk_adjustment_set_step_increment(h_gtkAdjustment, mCanvasBounds.size.x / 16.0); | 503 gtk_adjustment_set_step_increment(h_gtkAdjustment, _canvasBounds.size.x / 16.0); |
504 gtk_adjustment_set_page_increment(h_gtkAdjustment, mCanvasBounds.size.x / 4.0); | 504 gtk_adjustment_set_page_increment(h_gtkAdjustment, _canvasBounds.size.x / 4.0); |
505 gtk_adjustment_set_page_size(h_gtkAdjustment, model_size.x); | 505 gtk_adjustment_set_page_size(h_gtkAdjustment, modelSize.x); |
506 | 506 |
507 gtk_adjustment_set_lower(v_gtkAdjustment, mCanvasBounds.min_corner.y); | 507 gtk_adjustment_set_lower(v_gtkAdjustment, _canvasBounds.minCorner.y); |
508 gtk_adjustment_set_upper(v_gtkAdjustment, mCanvasBounds.max_corner.y); | 508 gtk_adjustment_set_upper(v_gtkAdjustment, _canvasBounds.maxCorner.y); |
509 gtk_adjustment_set_value(v_gtkAdjustment, view_left_bottom.y); | 509 gtk_adjustment_set_value(v_gtkAdjustment, viewLeftBottom.y); |
510 gtk_adjustment_set_step_increment(v_gtkAdjustment, mCanvasBounds.size.y / 16.0); | 510 gtk_adjustment_set_step_increment(v_gtkAdjustment, _canvasBounds.size.y / 16.0); |
511 gtk_adjustment_set_page_increment(v_gtkAdjustment, mCanvasBounds.size.y / 4.0); | 511 gtk_adjustment_set_page_increment(v_gtkAdjustment, _canvasBounds.size.y / 4.0); |
512 gtk_adjustment_set_page_size(v_gtkAdjustment, model_size.y); | 512 gtk_adjustment_set_page_size(v_gtkAdjustment, modelSize.y); |
513 | 513 |
514 mHAdjustment.changed; | 514 _hAdjustment.changed; |
515 mHAdjustment.valueChanged; | 515 _hAdjustment.valueChanged; |
516 mVAdjustment.changed; | 516 _vAdjustment.changed; |
517 mVAdjustment.valueChanged; | 517 _vAdjustment.valueChanged; |
518 } | 518 } |
519 | 519 |
520 void fix_damage() { | 520 void fixDamage() { |
521 if (mDamage.valid) { | 521 if (_damage.valid) { |
522 //writefln("Damage: %s", mDamage); | 522 //writefln("Damage: %s", _damage); |
523 int x, y, w, h; | 523 int x, y, w, h; |
524 mDamage.get_quantised(x, y, w, h); | 524 _damage.getQuantised(x, y, w, h); |
525 mDrawingArea.queueDrawArea(x, cast(int)mViewSize.y - (y + h), w, h); | 525 _drawingArea.queueDrawArea(x, cast(int)_viewSize.y - (y + h), w, h); |
526 mDamage = Rectangle.DEFAULT; | 526 _damage = Rectangle.DEFAULT; |
527 } | 527 } |
528 else { | 528 else { |
529 //writefln("No damage"); | 529 //writefln("No damage"); |
530 } | 530 } |
531 } | 531 } |
532 | 532 |
533 double clamp_zoom(in double zoom) { return clamp(zoom, 0.2, 10.0); } | 533 double clampZoom(in double zoom) { return clamp(zoom, 0.2, 10.0); } |
534 | 534 |
535 Point model_to_pixel(in Point model) const { | 535 Point modelToPixel(in Point model) const { |
536 return Point.DEFAULT + mViewSize / 2.0 + mZoom * (model - mViewCentre); | 536 return Point.DEFAULT + _viewSize / 2.0 + _zoom * (model - _viewCentre); |
537 } | 537 } |
538 | 538 |
539 Point pixel_to_model(in Point pixel) const { | 539 Point pixelToModel(in Point pixel) const { |
540 return mViewCentre + (pixel - mViewSize / 2.0 - Point.DEFAULT) / mZoom; | 540 return _viewCentre + (pixel - _viewSize / 2.0 - Point.DEFAULT) / _zoom; |
541 } | 541 } |
542 | 542 |
543 Vector model_to_pixel(in Vector model) const { | 543 Vector modelToPixel(in Vector model) const { |
544 return mZoom * model; | 544 return _zoom * model; |
545 } | 545 } |
546 | 546 |
547 Vector pixel_to_model(in Vector pixel) const { | 547 Vector pixelToModel(in Vector pixel) const { |
548 return pixel / mZoom; | 548 return pixel / _zoom; |
549 } | 549 } |
550 | 550 |
551 Rectangle model_to_pixel(in Rectangle model) const { | 551 Rectangle modelToPixel(in Rectangle model) const { |
552 return Rectangle(model_to_pixel(model.position), model_to_pixel(model.size)); | 552 return Rectangle(modelToPixel(model.position), modelToPixel(model.size)); |
553 } | 553 } |
554 | 554 |
555 Rectangle pixel_to_model(in Rectangle model) const { | 555 Rectangle pixelToModel(in Rectangle model) const { |
556 return Rectangle(pixel_to_model(model.position), pixel_to_model(model.size)); | 556 return Rectangle(pixelToModel(model.position), pixelToModel(model.size)); |
557 } | 557 } |
558 | 558 |
559 void on_realize(Widget widget) { | 559 void onRealize(Widget widget) { |
560 assert(widget is mDrawingArea); | 560 assert(widget is _drawingArea); |
561 //writefln("Got realize\n"); | 561 //writefln("Got realize\n"); |
562 } | 562 } |
563 | 563 |
564 bool mHadConfigure; | 564 bool _hadConfigure; |
565 Rectangle mDamage; // pixels | 565 Rectangle _damage; // pixels |
566 | 566 |
567 // Model units are in millimetres | 567 // Model units are in millimetres |
568 // Screen units are in pixels | 568 // Screen units are in pixels |
569 double mZoom; // pixels-per-model-unit | 569 double _zoom; // pixels-per-model-unit |
570 Vector mViewSize; // pixel: size of view window in pixels | 570 Vector _viewSize; // pixel: size of view window in pixels |
571 Point mViewCentre; // model: where in the model is the centre of our view | 571 Point _viewCentre; // model: where in the model is the centre of our view |
572 Rectangle mCanvasBounds; // model: | 572 Rectangle _canvasBounds; // model: |
573 | 573 |
574 // Child widgets: | 574 // Child widgets: |
575 HRuler mHRuler; | 575 HRuler _hRuler; |
576 VRuler mVRuler; | 576 VRuler _vRuler; |
577 DrawingArea mDrawingArea; | 577 DrawingArea _drawingArea; |
578 Adjustment mHAdjustment; | 578 Adjustment _hAdjustment; |
579 HScrollbar mHScrollbar; | 579 HScrollbar _hScrollbar; |
580 Adjustment mVAdjustment; | 580 Adjustment _vAdjustment; |
581 VScrollbar mVScrollbar; | 581 VScrollbar _vScrollbar; |
582 | 582 |
583 Layer[] mLayers; | 583 Layer[] _layers; |
584 EventHandler mEventHandler; | 584 EventHandler _eventHandler; |
585 Grid mGrid; | 585 Grid _grid; |
586 double mPPI; | 586 double _ppi; |
587 } | 587 } |
588 } | 588 } |