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