Mercurial > projects > doodle
annotate canvas.d @ 13:f0ade1b49fe7
Checkpoint
author | "David Bryant <bagnose@gmail.com>" |
---|---|
date | Sun, 12 Jul 2009 01:04:35 +0930 |
parents | a093c4fbdd43 |
children | 0b7e7d43a79d |
rev | line source |
---|---|
0 | 1 module canvas; |
2 | |
3 import std.stdio; | |
4 import std.math; | |
5 | |
6 import cairo.Context; | |
7 import cairo.Surface; | |
8 | |
9 import gdk.Drawable; | |
10 | |
11 import gtk.Widget; | |
12 import gtk.Toolbar; | |
13 import gtk.Table; | |
14 import gtk.HRuler; | |
15 import gtk.VRuler; | |
16 import gtk.Range; | |
17 import gtk.HScrollbar; | |
18 import gtk.VScrollbar; | |
19 import gtk.DrawingArea; | |
20 import gtk.Adjustment; | |
21 | |
22 import tk.misc; | |
3
7d57cae10805
Renamed geometry2 to geometry
David Bryant <daveb@acres.com.au>
parents:
2
diff
changeset
|
23 import tk.geometry; |
0 | 24 import tk.types; |
25 import tk.events; | |
26 import tk.gtk_support; | |
27 | |
28 private import gtkc.gtk; | |
29 | |
30 import icanvas; | |
2
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
0
diff
changeset
|
31 import cairo_support; |
0 | 32 |
33 // x and y run right and up respectively | |
34 | |
10 | 35 class Canvas : Table, Viewport { |
11 | 36 this(in Layer[] layers, EventHandler event_handler, in double ppi) { |
0 | 37 super(3, 3, 0); |
38 | |
11 | 39 mLayers = layers.dup; |
0 | 40 mEventHandler = event_handler; |
13 | 41 mPPI = ppi; |
0 | 42 |
43 const double MM_PER_INCH = 25.4; | |
13 | 44 mZoom = 0.25 * mPPI / MM_PER_INCH; |
45 | |
46 // Take the union of the bounds of each layer to | |
47 // determine the canvas size | |
11 | 48 |
49 Rectangle total_layer_bounds; | |
0 | 50 |
11 | 51 foreach (ref layer; mLayers) { |
52 total_layer_bounds = total_layer_bounds | layer.bounds; | |
53 } | |
0 | 54 |
13 | 55 assert(total_layer_bounds.valid); |
56 | |
11 | 57 mCanvasLeftBottom = total_layer_bounds.min_corner - total_layer_bounds.size; |
58 mCanvasRightTop = total_layer_bounds.max_corner + total_layer_bounds.size; | |
59 mViewCentre = mCanvasLeftBottom + (mCanvasRightTop - mCanvasLeftBottom) / 2.0; | |
0 | 60 |
13 | 61 // Create our child widgets and register callbacks |
62 | |
63 mHRuler = new HRuler; | |
0 | 64 attach(mHRuler, |
65 1, 2, | |
66 0, 1, | |
67 AttachOptions.FILL | AttachOptions.EXPAND, AttachOptions.SHRINK, | |
68 0, 0); | |
69 mHRuler.setMetric(GtkMetricType.CENTIMETERS); | |
70 | |
13 | 71 mVRuler = new VRuler; |
0 | 72 attach(mVRuler, |
73 0, 1, | |
74 1, 2, | |
75 AttachOptions.SHRINK, AttachOptions.FILL | AttachOptions.EXPAND, | |
76 0, 0); | |
77 mVRuler.setMetric(GtkMetricType.CENTIMETERS); | |
78 | |
13 | 79 mDrawingArea = new DrawingArea; |
0 | 80 mDrawingArea.addOnRealize(&onRealize); |
81 mDrawingArea.addOnConfigure(&onConfigure); | |
82 mDrawingArea.addOnExpose(&onExpose); | |
5 | 83 mDrawingArea.addOnButtonPress(&onButtonPress); |
84 mDrawingArea.addOnButtonRelease(&onButtonRelease); | |
0 | 85 mDrawingArea.addOnKeyPress(&onKeyEvent); |
86 mDrawingArea.addOnKeyRelease(&onKeyEvent); | |
87 mDrawingArea.addOnMotionNotify(&onMotionNotify); | |
88 mDrawingArea.addOnScroll(&onScroll); | |
89 attach(mDrawingArea, | |
90 1, 2, | |
91 1, 2, | |
92 AttachOptions.FILL | AttachOptions.EXPAND, AttachOptions.FILL | AttachOptions.EXPAND, | |
93 0, 0); | |
94 | |
95 // value, lower, upper, step-inc, page-inc, page-size | |
96 // Give the adjustments dummy values until we receive a configure | |
12 | 97 mHAdjustment = new Adjustment(0.0, 0.0, 1.0, 0.2, 0.5, 0.5); |
0 | 98 mHAdjustment.addOnValueChanged(&onValueChanged); |
99 mHScrollbar = new HScrollbar(mHAdjustment); | |
100 attach(mHScrollbar, | |
101 1, 2, | |
102 2, 3, | |
103 AttachOptions.FILL | AttachOptions.EXPAND, AttachOptions.SHRINK, | |
104 0, 0); | |
105 | |
2
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
0
diff
changeset
|
106 mVAdjustment = new Adjustment(0.0, 0.0, 1.0, 0.2, 0.5, 0.5); |
0 | 107 mVAdjustment.addOnValueChanged(&onValueChanged); |
108 mVScrollbar = new VScrollbar(mVAdjustment); | |
109 attach(mVScrollbar, | |
110 2, 3, | |
111 1, 2, | |
112 AttachOptions.SHRINK, | |
113 AttachOptions.FILL | AttachOptions.EXPAND, | |
114 0, 0); | |
115 } | |
116 | |
3
7d57cae10805
Renamed geometry2 to geometry
David Bryant <daveb@acres.com.au>
parents:
2
diff
changeset
|
117 override void rel_zoom(Point screen_datum, double factor) { |
0 | 118 // Work out pixel distance from current centre to datum, |
119 // Do the zoom, then work out the new centre that keeps the | |
120 // pixel distance the same | |
121 | |
3
7d57cae10805
Renamed geometry2 to geometry
David Bryant <daveb@acres.com.au>
parents:
2
diff
changeset
|
122 Point old_model_datum = screen_to_model(screen_datum); |
7d57cae10805
Renamed geometry2 to geometry
David Bryant <daveb@acres.com.au>
parents:
2
diff
changeset
|
123 Vector pixel_distance = model_to_screen(old_model_datum - mViewCentre); |
0 | 124 mZoom = clamp_zoom(factor * mZoom); |
125 mViewCentre = old_model_datum - screen_to_model(pixel_distance); | |
126 | |
12 | 127 //Point new_model_datum = screen_to_model(screen_datum); |
0 | 128 |
13 | 129 update_adjustments; |
0 | 130 //update_rulers(new_model_datum); |
13 | 131 update_rulers; |
132 queueDraw; | |
0 | 133 } |
134 | |
3
7d57cae10805
Renamed geometry2 to geometry
David Bryant <daveb@acres.com.au>
parents:
2
diff
changeset
|
135 override void rel_pan(Vector screen_displacement) { |
0 | 136 mViewCentre = mViewCentre + screen_to_model(screen_displacement); |
137 | |
13 | 138 update_adjustments; |
139 update_rulers; | |
140 queueDraw; | |
141 } | |
142 | |
143 override double zoom() const { | |
144 return mZoom; | |
145 } | |
146 | |
147 override Point model_to_screen(Point model) const { | |
148 return Point.DEFAULT + mViewSize / 2.0 + mZoom * (model - mViewCentre); | |
149 } | |
150 | |
151 override Point screen_to_model(Point screen) const { | |
152 return mViewCentre + (screen - mViewSize / 2.0 - Point.DEFAULT) / mZoom; | |
0 | 153 } |
154 | |
13 | 155 override Vector model_to_screen(Vector model) const { |
156 return mZoom * model; | |
157 } | |
158 | |
159 override Vector screen_to_model(Vector screen) const { | |
160 return screen / mZoom; | |
161 } | |
162 | |
163 override double model_to_screen(double model) const { | |
164 return mZoom * model; | |
165 } | |
166 | |
167 override double screen_to_model(double screen) const { | |
168 return screen / mZoom; | |
169 } | |
170 | |
171 override Rectangle model_to_screen(Rectangle model) const { | |
172 return Rectangle(model_to_screen(model.position), model_to_screen(model.size)); | |
173 } | |
174 | |
175 override Rectangle screen_to_model(Rectangle model) const { | |
176 return Rectangle(screen_to_model(model.position), screen_to_model(model.size)); | |
177 } | |
10 | 178 |
0 | 179 private { |
180 | |
181 void onRealize(Widget widget) { | |
182 assert(widget is mDrawingArea); | |
183 //writefln("Got realize\n"); | |
184 } | |
185 | |
186 bool onConfigure(GdkEventConfigure * event, Widget widget) { | |
187 assert(widget is mDrawingArea); | |
188 | |
3
7d57cae10805
Renamed geometry2 to geometry
David Bryant <daveb@acres.com.au>
parents:
2
diff
changeset
|
189 mViewSize = Vector(cast(double)event.width, cast(double)event.height); |
13 | 190 update_adjustments; |
191 update_rulers; | |
0 | 192 |
193 | |
2
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
0
diff
changeset
|
194 return true; |
0 | 195 } |
196 | |
197 bool onExpose(GdkEventExpose * event, Widget widget) { | |
198 assert(widget is mDrawingArea); | |
199 | |
13 | 200 Drawable dr = mDrawingArea.getWindow; |
0 | 201 |
202 int width, height; | |
203 dr.getSize(width, height); | |
204 //writefln("Got expose %dx%d\n", width, height); | |
205 | |
12 | 206 scope model_cr = new Context(dr); |
207 scope screen_cr = new Context(dr); | |
208 | |
11 | 209 Rectangle damage = |
210 event is null ? | |
211 Rectangle(Point(0.0, 0.0), Vector(cast(double)width, cast(double)height)) : | |
212 Rectangle(Point(cast(double)event.area.x, cast(double)event.area.y), | |
213 Vector(cast(double)event.area.width, cast(double)event.area.height)); | |
0 | 214 |
13 | 215 model_cr.save; screen_cr.save; { |
12 | 216 // Setup model context |
217 | |
218 rectangle(model_cr, damage); | |
13 | 219 model_cr.clip; |
12 | 220 |
221 GtkAdjustment * h_gtkAdjustment = mHAdjustment.getAdjustmentStruct(); | |
222 GtkAdjustment * v_gtkAdjustment = mVAdjustment.getAdjustmentStruct(); | |
223 | |
224 model_cr.translate(mCanvasLeftBottom.x - gtk_adjustment_get_value(h_gtkAdjustment), | |
225 mCanvasLeftBottom.y - gtk_adjustment_get_value(v_gtkAdjustment)); | |
13 | 226 model_cr.scale(mZoom, -mZoom); |
0 | 227 |
12 | 228 // Setup screen context |
229 | |
13 | 230 screen_cr.translate(0.0, mViewSize.y); |
231 screen_cr.scale(1.0, -1.0); | |
12 | 232 rectangle(screen_cr, damage); |
13 | 233 screen_cr.clip; |
12 | 234 |
235 // Fill the background | |
236 | |
13 | 237 screen_cr.save; { |
11 | 238 // Make the window light grey |
12 | 239 screen_cr.setSourceRgba(1.0, 1.0, 1.0, 0.7); |
240 rectangle(screen_cr, damage); | |
13 | 241 screen_cr.fill; |
242 } screen_cr.restore; | |
12 | 243 |
244 // Draw each layer | |
0 | 245 |
11 | 246 foreach(ref layer; mLayers) { |
13 | 247 model_cr.save; screen_cr.save; { |
12 | 248 layer.draw(this, damage, model_cr, screen_cr); |
13 | 249 } screen_cr.restore; model_cr.restore; |
11 | 250 } |
13 | 251 } screen_cr.restore; model_cr.restore; |
0 | 252 |
2
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
0
diff
changeset
|
253 return true; |
0 | 254 } |
255 | |
5 | 256 bool onButtonPress(GdkEventButton * event, Widget widget) { |
0 | 257 assert(widget is mDrawingArea); |
258 //writefln("Got button event\n"); | |
259 | |
3
7d57cae10805
Renamed geometry2 to geometry
David Bryant <daveb@acres.com.au>
parents:
2
diff
changeset
|
260 Point screen_point = Point(event.x + 0.5, event.y + 0.5); |
7d57cae10805
Renamed geometry2 to geometry
David Bryant <daveb@acres.com.au>
parents:
2
diff
changeset
|
261 Point model_point = screen_to_model(screen_point); |
0 | 262 |
7 | 263 auto button_event = new ButtonEvent(gtk2tk_button_action(event.type), |
264 gtk2tk_button_name(event.button), | |
0 | 265 screen_point, |
266 model_point, | |
267 gtk2tk_mask(event.state)); | |
268 | |
5 | 269 mEventHandler.handle_button_press(this, button_event); |
270 | |
271 return true; | |
272 } | |
273 | |
274 bool onButtonRelease(GdkEventButton * event, Widget widget) { | |
275 assert(widget is mDrawingArea); | |
276 //writefln("Got button event\n"); | |
277 | |
278 Point screen_point = Point(event.x + 0.5, event.y + 0.5); | |
279 Point model_point = screen_to_model(screen_point); | |
280 | |
7 | 281 auto button_event = new ButtonEvent(gtk2tk_button_action(event.type), |
282 gtk2tk_button_name(event.button), | |
5 | 283 screen_point, |
284 model_point, | |
285 gtk2tk_mask(event.state)); | |
286 | |
287 mEventHandler.handle_button_release(this, button_event); | |
0 | 288 |
2
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
0
diff
changeset
|
289 return true; |
0 | 290 } |
291 | |
292 bool onKeyEvent(GdkEventKey * event, Widget widget) { | |
293 assert(widget is mDrawingArea); | |
294 //writefln("Got key event\n"); | |
295 | |
296 //auto key_event = new KeyEvent("", | |
297 // mEventHandle.handle_key(key_event); | |
298 | |
2
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
0
diff
changeset
|
299 return true; |
0 | 300 } |
301 | |
302 bool onMotionNotify(GdkEventMotion * event, Widget widget) { | |
303 assert(widget is mDrawingArea); | |
304 //writefln("Got motion notify\n"); | |
305 gtk_widget_event(mHRuler.getWidgetStruct(), cast(GdkEvent *)event); | |
306 gtk_widget_event(mVRuler.getWidgetStruct(), cast(GdkEvent *)event); | |
307 | |
3
7d57cae10805
Renamed geometry2 to geometry
David Bryant <daveb@acres.com.au>
parents:
2
diff
changeset
|
308 Point screen_point = Point(event.x + 0.5, event.y + 0.5); |
7d57cae10805
Renamed geometry2 to geometry
David Bryant <daveb@acres.com.au>
parents:
2
diff
changeset
|
309 Point model_point = screen_to_model(screen_point); |
0 | 310 |
311 auto motion_event = new MotionEvent(screen_point, | |
312 model_point, | |
313 gtk2tk_mask(event.state)); | |
314 | |
315 mEventHandler.handle_motion(this, motion_event); | |
316 | |
2
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
0
diff
changeset
|
317 return true; |
0 | 318 } |
319 | |
320 bool onScroll(GdkEventScroll * event, Widget widget) { | |
321 assert(widget is mDrawingArea); | |
322 //writefln("Got scroll\n"); | |
323 | |
3
7d57cae10805
Renamed geometry2 to geometry
David Bryant <daveb@acres.com.au>
parents:
2
diff
changeset
|
324 Point screen_point = Point(event.x + 0.5, event.y + 0.5); |
7d57cae10805
Renamed geometry2 to geometry
David Bryant <daveb@acres.com.au>
parents:
2
diff
changeset
|
325 Point model_point = screen_to_model(screen_point); |
0 | 326 |
327 auto scroll_event = new ScrollEvent(gtk2tk_direction(event.direction), | |
328 screen_point, | |
329 model_point, | |
330 gtk2tk_mask(event.state)); | |
331 | |
332 mEventHandler.handle_scroll(this, scroll_event); | |
333 | |
2
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
0
diff
changeset
|
334 return true; |
0 | 335 } |
336 | |
337 void onValueChanged(Adjustment adjustment) { | |
13 | 338 GtkAdjustment * h_gtkAdjustment = mHAdjustment.getAdjustmentStruct; |
339 GtkAdjustment * v_gtkAdjustment = mVAdjustment.getAdjustmentStruct; | |
0 | 340 |
3
7d57cae10805
Renamed geometry2 to geometry
David Bryant <daveb@acres.com.au>
parents:
2
diff
changeset
|
341 Point view_left_bottom = Point(gtk_adjustment_get_value(h_gtkAdjustment), |
2
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
0
diff
changeset
|
342 gtk_adjustment_get_value(v_gtkAdjustment)); |
9 | 343 //writefln("%s", view_left_bottom); |
3
7d57cae10805
Renamed geometry2 to geometry
David Bryant <daveb@acres.com.au>
parents:
2
diff
changeset
|
344 Vector model_size = screen_to_model(mViewSize); |
0 | 345 mViewCentre = view_left_bottom + model_size / 2.0; |
346 | |
13 | 347 update_rulers; |
0 | 348 |
13 | 349 queueDraw; |
0 | 350 } |
351 | |
352 void update_rulers() { | |
3
7d57cae10805
Renamed geometry2 to geometry
David Bryant <daveb@acres.com.au>
parents:
2
diff
changeset
|
353 Vector model_size = screen_to_model(mViewSize); |
0 | 354 |
3
7d57cae10805
Renamed geometry2 to geometry
David Bryant <daveb@acres.com.au>
parents:
2
diff
changeset
|
355 Point view_left_bottom = mViewCentre - model_size / 2.0; |
7d57cae10805
Renamed geometry2 to geometry
David Bryant <daveb@acres.com.au>
parents:
2
diff
changeset
|
356 Point view_right_top = mViewCentre + model_size / 2.0; |
0 | 357 |
12 | 358 double lower, upper, position, max_size; |
359 | |
360 mHRuler.getRange(lower, upper, position, max_size); | |
0 | 361 mHRuler.setRange(view_left_bottom.x, |
362 view_right_top.x, | |
12 | 363 position, |
0 | 364 mZoom * 2000.0); |
12 | 365 |
366 mVRuler.getRange(lower, upper, position, max_size); | |
0 | 367 mVRuler.setRange(view_right_top.y, |
368 view_left_bottom.y, | |
369 0.0, | |
370 mZoom * 2000.0); | |
371 } | |
372 | |
373 void update_adjustments() { | |
3
7d57cae10805
Renamed geometry2 to geometry
David Bryant <daveb@acres.com.au>
parents:
2
diff
changeset
|
374 Vector model_size = screen_to_model(mViewSize); |
0 | 375 |
3
7d57cae10805
Renamed geometry2 to geometry
David Bryant <daveb@acres.com.au>
parents:
2
diff
changeset
|
376 Point view_left_bottom = mViewCentre - model_size / 2.0; |
7d57cae10805
Renamed geometry2 to geometry
David Bryant <daveb@acres.com.au>
parents:
2
diff
changeset
|
377 Point view_right_top = mViewCentre + model_size / 2.0; |
0 | 378 |
379 // Adjust the canvas size if necessary | |
380 mCanvasLeftBottom = min_extents(mCanvasLeftBottom, view_left_bottom); | |
381 mCanvasRightTop = max_extents(mCanvasRightTop, view_right_top); | |
382 | |
3
7d57cae10805
Renamed geometry2 to geometry
David Bryant <daveb@acres.com.au>
parents:
2
diff
changeset
|
383 Vector canvas_size = mCanvasRightTop - mCanvasLeftBottom; |
0 | 384 |
385 // Update the adjustments | |
386 | |
387 GtkAdjustment * h_gtkAdjustment = mHAdjustment.getAdjustmentStruct(); | |
388 GtkAdjustment * v_gtkAdjustment = mVAdjustment.getAdjustmentStruct(); | |
389 | |
2
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
0
diff
changeset
|
390 gtk_adjustment_set_lower(h_gtkAdjustment, mCanvasLeftBottom.x); |
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
0
diff
changeset
|
391 gtk_adjustment_set_upper(h_gtkAdjustment, mCanvasRightTop.x); |
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
0
diff
changeset
|
392 gtk_adjustment_set_value(h_gtkAdjustment, view_left_bottom.x); |
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
0
diff
changeset
|
393 gtk_adjustment_set_step_increment(h_gtkAdjustment, canvas_size.x / 10.0); |
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
0
diff
changeset
|
394 gtk_adjustment_set_page_increment(h_gtkAdjustment, canvas_size.x / 5.0); |
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
0
diff
changeset
|
395 gtk_adjustment_set_page_size(h_gtkAdjustment, model_size.x); |
0 | 396 |
2
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
0
diff
changeset
|
397 gtk_adjustment_set_lower(v_gtkAdjustment, mCanvasLeftBottom.y); |
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
0
diff
changeset
|
398 gtk_adjustment_set_upper(v_gtkAdjustment, mCanvasRightTop.y); |
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
0
diff
changeset
|
399 gtk_adjustment_set_value(v_gtkAdjustment, view_left_bottom.y); |
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
0
diff
changeset
|
400 gtk_adjustment_set_step_increment(v_gtkAdjustment, canvas_size.y / 10.0); |
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
0
diff
changeset
|
401 gtk_adjustment_set_page_increment(v_gtkAdjustment, canvas_size.y / 5.0); |
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
0
diff
changeset
|
402 gtk_adjustment_set_page_size(v_gtkAdjustment, model_size.y); |
0 | 403 |
13 | 404 mHAdjustment.changed; |
405 mHAdjustment.valueChanged; | |
406 mVAdjustment.changed; | |
407 mVAdjustment.valueChanged; | |
0 | 408 } |
409 | |
9 | 410 double clamp_zoom(double zoom) { return clamp(zoom, 0.02, 50.0); } |
0 | 411 |
412 // Model units are in millimetres | |
413 // Screen units are in pixels | |
414 | |
11 | 415 double mZoom; // pixels-per-model-unit (mm) |
3
7d57cae10805
Renamed geometry2 to geometry
David Bryant <daveb@acres.com.au>
parents:
2
diff
changeset
|
416 Point mViewCentre; // model: where in the model is the centre of our view |
0 | 417 |
3
7d57cae10805
Renamed geometry2 to geometry
David Bryant <daveb@acres.com.au>
parents:
2
diff
changeset
|
418 Point mCanvasLeftBottom; // model: bottom left corner of canvas |
7d57cae10805
Renamed geometry2 to geometry
David Bryant <daveb@acres.com.au>
parents:
2
diff
changeset
|
419 Point mCanvasRightTop; // model: top right corner of canvas |
0 | 420 |
3
7d57cae10805
Renamed geometry2 to geometry
David Bryant <daveb@acres.com.au>
parents:
2
diff
changeset
|
421 Vector mViewSize; // screen: size of view window in pixels |
0 | 422 |
10 | 423 // Child widgets: |
0 | 424 HRuler mHRuler; |
425 VRuler mVRuler; | |
426 DrawingArea mDrawingArea; | |
427 Adjustment mHAdjustment; | |
428 HScrollbar mHScrollbar; | |
429 Adjustment mVAdjustment; | |
430 VScrollbar mVScrollbar; | |
11 | 431 |
432 // Layers: | |
433 Layer[] mLayers; | |
13 | 434 EventHandler mEventHandler; |
435 double mPPI; | |
0 | 436 } |
437 } |