annotate canvas.d @ 2:d6f44347373d

* Switched over to geometry done with structs instead of classes. * Removed direct access to gtk structs * Refactoring
author David Bryant <daveb@acres.com.au>
date Fri, 10 Jul 2009 15:15:27 +0930
parents e907d2c54ec3
children 7d57cae10805
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;
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
23 import tk.geometry2;
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
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
35 class Canvas : Table, ICanvas {
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
36 static this() {
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
37 ORIGIN = Point2(0.0, 0.0);
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
38 INITIAL_PAGE_SIZE = Vector2(210.0, 297.0); // A4
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
39 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
40
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
41 this(ICanvasEventHandler event_handler) {
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
42 super(3, 3, 0);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
43
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
44 mEventHandler = event_handler;
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
45
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
46 const double PPI = 120.0;
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
47 const double MM_PER_INCH = 25.4;
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
48 mZoom = 0.25 * PPI / MM_PER_INCH;
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
49
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
50 mPageLeftBottom = ORIGIN;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
51 mPageRightTop = ORIGIN + INITIAL_PAGE_SIZE;
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
52 mViewCentre = ORIGIN + INITIAL_PAGE_SIZE / 2.0;
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
53
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
54 mCanvasLeftBottom = mPageLeftBottom - 3.0 * INITIAL_PAGE_SIZE;
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
55 mCanvasRightTop = mPageRightTop + 3.0 * INITIAL_PAGE_SIZE;
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
56
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
57 mHRuler = new HRuler();
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
58 attach(mHRuler,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
59 1, 2,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
60 0, 1,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
61 AttachOptions.FILL | AttachOptions.EXPAND, AttachOptions.SHRINK,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
62 0, 0);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
63 mHRuler.setMetric(GtkMetricType.CENTIMETERS);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
64
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
65 mVRuler = new VRuler();
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
66 attach(mVRuler,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
67 0, 1,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
68 1, 2,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
69 AttachOptions.SHRINK, AttachOptions.FILL | AttachOptions.EXPAND,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
70 0, 0);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
71 mVRuler.setMetric(GtkMetricType.CENTIMETERS);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
72
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
73 mDrawingArea = new DrawingArea();
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
74 mDrawingArea.addOnRealize(&onRealize);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
75 mDrawingArea.addOnConfigure(&onConfigure);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
76 mDrawingArea.addOnExpose(&onExpose);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
77 mDrawingArea.addOnButtonPress(&onButtonEvent);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
78 mDrawingArea.addOnButtonRelease(&onButtonEvent);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
79 mDrawingArea.addOnKeyPress(&onKeyEvent);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
80 mDrawingArea.addOnKeyRelease(&onKeyEvent);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
81 mDrawingArea.addOnMotionNotify(&onMotionNotify);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
82 mDrawingArea.addOnScroll(&onScroll);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
83 attach(mDrawingArea,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
84 1, 2,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
85 1, 2,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
86 AttachOptions.FILL | AttachOptions.EXPAND, AttachOptions.FILL | AttachOptions.EXPAND,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
87 0, 0);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
88
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
89 // value, lower, upper, step-inc, page-inc, page-size
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
90 // Give the adjustments dummy values until we receive a configure
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
91 mHAdjustment = new Adjustment(0.25, 0.0, 1.0, 0.2, 0.5, 0.5);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
92 mHAdjustment.addOnValueChanged(&onValueChanged);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
93 mHScrollbar = new HScrollbar(mHAdjustment);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
94 attach(mHScrollbar,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
95 1, 2,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
96 2, 3,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
97 AttachOptions.FILL | AttachOptions.EXPAND, AttachOptions.SHRINK,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
98 0, 0);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
99
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
100 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
101 mVAdjustment.addOnValueChanged(&onValueChanged);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
102 mVScrollbar = new VScrollbar(mVAdjustment);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
103 attach(mVScrollbar,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
104 2, 3,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
105 1, 2,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
106 AttachOptions.SHRINK,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
107 AttachOptions.FILL | AttachOptions.EXPAND,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
108 0, 0);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
109 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
110
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
111 override void rel_zoom(Point2 screen_datum, double factor) {
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
112 // Work out pixel distance from current centre to datum,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
113 // Do the zoom, then work out the new centre that keeps the
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
114 // pixel distance the same
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
115
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
116 Point2 old_model_datum = screen_to_model(screen_datum);
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
117 Vector2 pixel_distance = model_to_screen(old_model_datum - mViewCentre);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
118 mZoom = clamp_zoom(factor * mZoom);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
119 mViewCentre = old_model_datum - screen_to_model(pixel_distance);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
120
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
121 Point2 new_model_datum = screen_to_model(screen_datum);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
122
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
123 update_adjustments();
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
124 //update_rulers(new_model_datum);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
125 update_rulers();
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
126 queueDraw();
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
127 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
128
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
129 override void rel_pan(Vector2 screen_displacement) {
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
130 mViewCentre = mViewCentre + screen_to_model(screen_displacement);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
131
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
132 update_adjustments();
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
133 update_rulers();
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
134 queueDraw();
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
135 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
136
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
137 private {
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
138
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
139 void onRealize(Widget widget) {
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
140 assert(widget is mDrawingArea);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
141 //writefln("Got realize\n");
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
142 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
143
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
144 bool onConfigure(GdkEventConfigure * event, Widget widget) {
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
145 assert(widget is mDrawingArea);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
146
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
147 mViewSize = Vector2(cast(double)event.width, cast(double)event.height);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
148 update_adjustments();
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
149 update_rulers();
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
150
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
151
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
152 return true;
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
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
155 bool onExpose(GdkEventExpose * event, Widget widget) {
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
156 assert(widget is mDrawingArea);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
157
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
158 Drawable dr = mDrawingArea.getWindow();
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
159
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
160 int width, height;
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
161 dr.getSize(width, height);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
162 //writefln("Got expose %dx%d\n", width, height);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
163
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
164 scope auto cr = new Context(dr);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
165
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
166 if (event) {
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
167 cr.rectangle(event.area.x, event.area.y, event.area.width, event.area.height);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
168 cr.clip();
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
169 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
170
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
171 // Make the window light grey
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
172 cr.setSourceRgba(1.0, 1.0, 1.0, 0.7);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
173 if (event) {
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
174 cr.rectangle(event.area.x, event.area.y, event.area.width, event.area.height);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
175 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
176 else {
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
177 cr.rectangle(0.0, 0.0, width, height);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
178 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
179 cr.fill();
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 {
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
182 // Make the paper white, with a border
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
183
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
184 Point2 screen_page_left_bottom = model_to_screen(mPageLeftBottom);
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
185 Point2 screen_page_right_top = model_to_screen(mPageRightTop);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
186
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
187 cr.setSourceRgba(1.0, 1.0, 1.0, 1.0);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
188 rectangle(cr, screen_page_left_bottom, screen_page_right_top);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
189 cr.fill();
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
190
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
191 cr.setSourceRgba(0.0, 0.0, 0.0, 1.0);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
192 rectangle(cr, screen_page_left_bottom, screen_page_right_top);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
193 cr.stroke();
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
194 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
195
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
196 return true;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
197 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
198
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
199 bool onButtonEvent(GdkEventButton * event, Widget widget) {
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
200 assert(widget is mDrawingArea);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
201 //writefln("Got button event\n");
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
202
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
203 Point2 screen_point = Point2(event.x + 0.5, event.y + 0.5);
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
204 Point2 model_point = screen_to_model(screen_point);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
205
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
206 auto button_event = new ButtonEvent(gtk2tk_click(event.type),
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
207 gtk2tk_button(event.button),
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
208 screen_point,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
209 model_point,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
210 gtk2tk_mask(event.state));
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
211
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
212 //mEventHandle.handle_button_press
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
213
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
214 return true;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
215 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
216
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
217 bool onKeyEvent(GdkEventKey * event, Widget widget) {
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
218 assert(widget is mDrawingArea);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
219 //writefln("Got key event\n");
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
220
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
221 //auto key_event = new KeyEvent("",
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
222 // mEventHandle.handle_key(key_event);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
223
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
224 return true;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
225 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
226
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
227 bool onMotionNotify(GdkEventMotion * event, Widget widget) {
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
228 assert(widget is mDrawingArea);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
229 //writefln("Got motion notify\n");
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
230 gtk_widget_event(mHRuler.getWidgetStruct(), cast(GdkEvent *)event);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
231 gtk_widget_event(mVRuler.getWidgetStruct(), cast(GdkEvent *)event);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
232
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
233 Point2 screen_point = Point2(event.x + 0.5, event.y + 0.5);
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
234 Point2 model_point = screen_to_model(screen_point);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
235
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
236 auto motion_event = new MotionEvent(screen_point,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
237 model_point,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
238 gtk2tk_mask(event.state));
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
239
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
240 mEventHandler.handle_motion(this, motion_event);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
241
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
242 return true;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
243 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
244
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
245 bool onScroll(GdkEventScroll * event, Widget widget) {
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
246 assert(widget is mDrawingArea);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
247 //writefln("Got scroll\n");
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
248
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
249 Point2 screen_point = Point2(event.x + 0.5, event.y + 0.5);
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
250 Point2 model_point = screen_to_model(screen_point);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
251
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
252 auto scroll_event = new ScrollEvent(gtk2tk_direction(event.direction),
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
253 screen_point,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
254 model_point,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
255 gtk2tk_mask(event.state));
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
256
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
257 mEventHandler.handle_scroll(this, scroll_event);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
258
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
259 return true;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
260 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
261
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
262 void onValueChanged(Adjustment adjustment) {
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
263 GtkAdjustment * h_gtkAdjustment = mHAdjustment.getAdjustmentStruct();
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
264 GtkAdjustment * v_gtkAdjustment = mVAdjustment.getAdjustmentStruct();
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
265
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
266 Point2 view_left_bottom = Point2(gtk_adjustment_get_value(h_gtkAdjustment),
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
267 gtk_adjustment_get_value(v_gtkAdjustment));
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
268 writefln("%s", view_left_bottom);
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
269 Vector2 model_size = screen_to_model(mViewSize);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
270 mViewCentre = view_left_bottom + model_size / 2.0;
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
271
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
272 update_rulers();
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
273
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
274 queueDraw();
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
275 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
276
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
277 void update_rulers() {
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
278 Vector2 model_size = screen_to_model(mViewSize);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
279
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
280 Point2 view_left_bottom = mViewCentre - model_size / 2.0;
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
281 Point2 view_right_top = mViewCentre + model_size / 2.0;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
282
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
283 mHRuler.setRange(view_left_bottom.x,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
284 view_right_top.x,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
285 0.0, // TODO preserve the value
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
286 mZoom * 2000.0);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
287 mVRuler.setRange(view_right_top.y,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
288 view_left_bottom.y,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
289 0.0,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
290 mZoom * 2000.0);
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
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
293 void update_adjustments() {
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
294 Vector2 model_size = screen_to_model(mViewSize);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
295
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
296 Point2 view_left_bottom = mViewCentre - model_size / 2.0;
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
297 Point2 view_right_top = mViewCentre + model_size / 2.0;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
298
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
299 // Adjust the canvas size if necessary
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
300 mCanvasLeftBottom = min_extents(mCanvasLeftBottom, view_left_bottom);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
301 mCanvasRightTop = max_extents(mCanvasRightTop, view_right_top);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
302
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
303 Vector2 canvas_size = mCanvasRightTop - mCanvasLeftBottom;
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
304 Vector2 page_size = mPageRightTop - mPageLeftBottom;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
305
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
306 // Update the adjustments
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
307
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
308 GtkAdjustment * h_gtkAdjustment = mHAdjustment.getAdjustmentStruct();
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
309 GtkAdjustment * v_gtkAdjustment = mVAdjustment.getAdjustmentStruct();
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
310
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
311 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
312 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
313 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
314 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
315 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
316 gtk_adjustment_set_page_size(h_gtkAdjustment, model_size.x);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
317
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
318 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
319 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
320 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
321 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
322 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
323 gtk_adjustment_set_page_size(v_gtkAdjustment, model_size.y);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
324
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
325 mHAdjustment.changed();
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
326 mHAdjustment.valueChanged();
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
327 mVAdjustment.changed();
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
328 mVAdjustment.valueChanged();
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
329 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
330
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
331 Point2 model_to_screen(Point2 model) { return ORIGIN + mViewSize / 2.0 + mZoom * (model - mViewCentre); }
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
332 Point2 screen_to_model(Point2 screen) { return mViewCentre + (screen - mViewSize / 2.0 - ORIGIN) / mZoom; }
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
333 Vector2 model_to_screen(Vector2 model) { return mZoom * model; }
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
334 Vector2 screen_to_model(Vector2 screen) { return screen / mZoom; }
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
335 double model_to_screen(double model) { return mZoom * model; }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
336 double screen_to_model(double screen) { return screen / mZoom; }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
337
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
338 double clamp_zoom(double zoom) { return clamp(zoom, 0.1, 10.0); }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
339
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
340 static const Point2 ORIGIN;
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
341 static const Vector2 INITIAL_PAGE_SIZE;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
342
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
343 ICanvasEventHandler mEventHandler;
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
344
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
345 // Model units are in millimetres
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
346 // Screen units are in pixels
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
347
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
348 double mZoom; // pixels-per-mm
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
349 Point2 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
350
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
351 Point2 mCanvasLeftBottom; // model: bottom left corner of canvas
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
352 Point2 mCanvasRightTop; // model: top right corner of canvas
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
353 Point2 mPageLeftBottom; // model: bottom left corner of page
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
354 Point2 mPageRightTop; // model: top right corner of page
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
355
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
356 Vector2 mViewSize; // screen: size of view window in pixels
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
357
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
358 HRuler mHRuler;
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
359 VRuler mVRuler;
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
360 DrawingArea mDrawingArea;
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
361 Adjustment mHAdjustment;
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
362 HScrollbar mHScrollbar;
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
363 Adjustment mVAdjustment;
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
364 VScrollbar mVScrollbar;
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
365 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
366 }