annotate doodle/gtk/canvas.d @ 41:f2e4e1d29b98

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