annotate doodle/gtk/canvas.d @ 68:64bd864db30d

Bah
author daveb
date Fri, 13 Aug 2010 15:53:48 +0930
parents 31d10176415d
children d540f7e4af9e
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 {
67
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
9 import doodle.core.misc;
40
1f97022e5c6d Checkpoint. Development continues...
daveb
parents: 35
diff changeset
10 import doodle.core.logging;
67
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
11 import doodle.cairo.routines;
28
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.gtk.conversions;
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 gtk.Widget;
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
17 import gtk.Toolbar;
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
18 import gtk.Table;
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
19 import gtk.HRuler;
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
20 import gtk.VRuler;
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
21 import gtk.Range;
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
22 import gtk.HScrollbar;
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
23 import gtk.VScrollbar;
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
24 import gtk.DrawingArea;
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
25 import gtk.Adjustment;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
26
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
27 import gdk.Drawable;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
28
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
29 import gtkc.gtk;
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
30 import gtkc.gtktypes;
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
31 //import gtkc.gdktypes;
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
32
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
33 import std.math;
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
34 import std.stdio;
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
35
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
36 import core.stdc.string : strlen;
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
37 }
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
38
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
39 // x and y run right and up respectively
41
daveb
parents: 40
diff changeset
40 //
daveb
parents: 40
diff changeset
41 // Model units are millimetres.
daveb
parents: 40
diff changeset
42 //
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
43 // _zoom -> pixels-per-model-unit
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
44 // _viewSize -> size of view window in pixels
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
45 // _viewCentre -> location in model corresponding to centre of view
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
46 // _canvasBounds -> size of the virtual canvas in model coordinates
41
daveb
parents: 40
diff changeset
47 //
daveb
parents: 40
diff changeset
48 // User operations:
daveb
parents: 40
diff changeset
49 // pan (middle click and drag)
daveb
parents: 40
diff changeset
50 // zoom about a point (hold control and move scroll wheel)
daveb
parents: 40
diff changeset
51 // resize the widget
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
52
68
daveb
parents: 67
diff changeset
53 final class Canvas : Table, private IViewport {
57
9960c4fbd0dd I is for Interface
"David Bryant <bagnose@gmail.com>"
parents: 54
diff changeset
54 this(in Layer[] layers, IEventHandler eventHandler, IGrid grid, in double ppi) {
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
55 super(3, 3, 0);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
56
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
57 _damage = Rectangle.DEFAULT;
17
c643c04e3f5e Checkpoint
David Bryant <daveb@acres.com.au>
parents: 16
diff changeset
58
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
59 _layers = layers.dup;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
60 _eventHandler = eventHandler;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
61 _grid = grid;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
62 _ppi = ppi;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
63
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
64 /*
62
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
65 trace("Layer bounds: %s", layerBounds);
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
66 trace("Canvas bounds: %s", _canvasBounds);
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
67 trace("View centre: %s", _viewCentre);
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
68 */
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
69
13
f0ade1b49fe7 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 12
diff changeset
70 // Create our child widgets and register callbacks
f0ade1b49fe7 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 12
diff changeset
71
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
72 _hRuler = new HRuler;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
73 attach(_hRuler,
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
74 1, 2,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
75 0, 1,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
76 AttachOptions.FILL | AttachOptions.EXPAND, AttachOptions.SHRINK,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
77 0, 0);
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
78 _hRuler.setMetric(MetricType.PIXELS);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
79
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
80 _vRuler = new VRuler;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
81 attach(_vRuler,
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
82 0, 1,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
83 1, 2,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
84 AttachOptions.SHRINK, AttachOptions.FILL | AttachOptions.EXPAND,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
85 0, 0);
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
86 _vRuler.setMetric(MetricType.PIXELS);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
87
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
88 _drawingArea = new DrawingArea;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
89 _drawingArea.addOnRealize(&onRealize);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
90 _drawingArea.addOnConfigure(&onConfigure);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
91 _drawingArea.addOnExpose(&onExpose);
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
92 _drawingArea.addOnButtonPress(&onButtonPress); // FIXME merge delegate with next
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
93 _drawingArea.addOnButtonRelease(&onButtonRelease);
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
94 _drawingArea.addOnKeyPress(&onKeyPressEvent); // FIXME merge delegate with next
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
95 _drawingArea.addOnKeyRelease(&onKeyReleaseEvent);
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
96 _drawingArea.addOnMotionNotify(&onMotionNotify);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
97 _drawingArea.addOnScroll(&onScroll);
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
98 _drawingArea.addOnEnterNotify(&onEnterNotify); // FIXME merge delegate with next
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
99 _drawingArea.addOnLeaveNotify(&onLeaveNotify);
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
100
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
101 _drawingArea.addOnFocusIn(&onFocusIn);
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
102 _drawingArea.addOnFocusOut(&onFocusOut);
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
103 _drawingArea.addOnMoveFocus(&onMoveFocus);
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
104 _drawingArea.addOnGrabBroken(&onGrabBroken);
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
105 _drawingArea.addOnGrabFocus(&onGrabFocus);
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
106 _drawingArea.addOnGrabNotify(&onGrabNotify);
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
107 // addOnPopupMenu
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
108 // addOnQueryTooltip
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
109 // addOnSelection*
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
110 _drawingArea.setEvents(EventMask.EXPOSURE_MASK |
20
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
111 EventMask.POINTER_MOTION_MASK |
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
112 EventMask.POINTER_MOTION_HINT_MASK |
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
113 EventMask.BUTTON_MOTION_MASK |
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
114 EventMask.BUTTON_PRESS_MASK |
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
115 EventMask.BUTTON_RELEASE_MASK |
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
116 EventMask.KEY_PRESS_MASK |
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
117 EventMask.KEY_RELEASE_MASK |
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
118 EventMask.ENTER_NOTIFY_MASK |
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
119 EventMask.LEAVE_NOTIFY_MASK |
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
120 EventMask.FOCUS_CHANGE_MASK |
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
121 EventMask.SCROLL_MASK);
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
122
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
123 _drawingArea.setCanFocus(true);
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
124
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
125 attach(_drawingArea,
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
126 1, 2,
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 AttachOptions.FILL | AttachOptions.EXPAND, AttachOptions.FILL | AttachOptions.EXPAND,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
129 0, 0);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
130
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
131 // value, lower, upper, step-inc, page-inc, page-size
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
132 // Give the adjustments dummy values until we receive a configure
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
133 _hAdjustment = new Adjustment(0.0, 0.0, 1.0, 0.2, 0.5, 0.5);
67
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
134 _hAdjustment.addOnValueChanged(&onAdjustmentValueChanged);
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
135 _hScrollbar = new HScrollbar(_hAdjustment);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
136 _hScrollbar.setInverted(false);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
137 attach(_hScrollbar,
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
138 1, 2,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
139 2, 3,
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
140 AttachOptions.FILL | AttachOptions.EXPAND,
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
141 AttachOptions.SHRINK,
0
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
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
144 _vAdjustment = new Adjustment(0.0, 0.0, 1.0, 0.2, 0.5, 0.5);
67
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
145 _vAdjustment.addOnValueChanged(&onAdjustmentValueChanged);
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
146 _vScrollbar = new VScrollbar(_vAdjustment);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
147 _vScrollbar.setInverted(true);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
148 attach(_vScrollbar,
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
149 2, 3,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
150 1, 2,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
151 AttachOptions.SHRINK,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
152 AttachOptions.FILL | AttachOptions.EXPAND,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
153 0, 0);
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
68
daveb
parents: 67
diff changeset
156 protected { // XXX the compiler complains about unimplemented methods if this is private
62
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
157
68
daveb
parents: 67
diff changeset
158 // IViewport overrides:
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
159
68
daveb
parents: 67
diff changeset
160 void zoomRelative(in Point pixelDatum, in double factor) {
daveb
parents: 67
diff changeset
161 // Work out pixel distance from current centre to datum,
daveb
parents: 67
diff changeset
162 // Do the zoom, then work out the new centre that keeps the
daveb
parents: 67
diff changeset
163 // pixel distance the same
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
164
68
daveb
parents: 67
diff changeset
165 Point oldModelDatum = pixelToModel(pixelDatum);
daveb
parents: 67
diff changeset
166 Vector pixelDistance = modelToPixel(oldModelDatum - _viewCentre);
daveb
parents: 67
diff changeset
167 _zoom = clampZoom(factor * _zoom);
daveb
parents: 67
diff changeset
168 _viewCentre = oldModelDatum - pixelToModel(pixelDistance);
27
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
169
68
daveb
parents: 67
diff changeset
170 consolidateBounds;
daveb
parents: 67
diff changeset
171
daveb
parents: 67
diff changeset
172 updateAdjustments;
daveb
parents: 67
diff changeset
173 updateRulers;
daveb
parents: 67
diff changeset
174 _grid.zoomChanged(_zoom);
daveb
parents: 67
diff changeset
175 queueDraw;
27
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
176 }
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
177
68
daveb
parents: 67
diff changeset
178 void panRelative(in Vector pixelDisplacement) {
daveb
parents: 67
diff changeset
179 _viewCentre = _viewCentre + pixelToModel(pixelDisplacement);
daveb
parents: 67
diff changeset
180
daveb
parents: 67
diff changeset
181 consolidateBounds;
daveb
parents: 67
diff changeset
182
daveb
parents: 67
diff changeset
183 updateAdjustments;
daveb
parents: 67
diff changeset
184 updateRulers;
daveb
parents: 67
diff changeset
185 queueDraw;
daveb
parents: 67
diff changeset
186 }
daveb
parents: 67
diff changeset
187
daveb
parents: 67
diff changeset
188 void setCursor(in Cursor cursor) {
daveb
parents: 67
diff changeset
189 CursorType cursorType;
27
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
190
68
daveb
parents: 67
diff changeset
191 switch (cursor) {
daveb
parents: 67
diff changeset
192 case Cursor.DEFAULT:
daveb
parents: 67
diff changeset
193 cursorType = CursorType.ARROW;
daveb
parents: 67
diff changeset
194 break;
daveb
parents: 67
diff changeset
195 case Cursor.HAND:
daveb
parents: 67
diff changeset
196 cursorType = CursorType.HAND1;
daveb
parents: 67
diff changeset
197 break;
daveb
parents: 67
diff changeset
198 case Cursor.CROSSHAIR:
daveb
parents: 67
diff changeset
199 cursorType = CursorType.CROSSHAIR;
daveb
parents: 67
diff changeset
200 break;
daveb
parents: 67
diff changeset
201 case Cursor.PENCIL:
daveb
parents: 67
diff changeset
202 cursorType = CursorType.PENCIL;
daveb
parents: 67
diff changeset
203 break;
daveb
parents: 67
diff changeset
204 default:
daveb
parents: 67
diff changeset
205 assert(0);
daveb
parents: 67
diff changeset
206 }
17
c643c04e3f5e Checkpoint
David Bryant <daveb@acres.com.au>
parents: 16
diff changeset
207
68
daveb
parents: 67
diff changeset
208 _drawingArea.setCursor(new gdk.Cursor.Cursor(cursorType));
daveb
parents: 67
diff changeset
209 }
daveb
parents: 67
diff changeset
210
daveb
parents: 67
diff changeset
211 void damageModel(in Rectangle area) {
daveb
parents: 67
diff changeset
212 _damage = _damage | modelToPixel(area);
daveb
parents: 67
diff changeset
213 }
daveb
parents: 67
diff changeset
214
daveb
parents: 67
diff changeset
215 void damagePixel(in Rectangle area) {
daveb
parents: 67
diff changeset
216 _damage = _damage | area;
daveb
parents: 67
diff changeset
217 }
18
df8d81d9f499 Lasso fiddling
David Bryant <daveb@acres.com.au>
parents: 17
diff changeset
218 }
df8d81d9f499 Lasso fiddling
David Bryant <daveb@acres.com.au>
parents: 17
diff changeset
219
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
220 private {
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
221
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
222 void initialiseBounds() {
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
223 Rectangle layerBounds = Rectangle.DEFAULT;
41
daveb
parents: 40
diff changeset
224
67
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
225 foreach (layer; _layers) {
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
226 layerBounds = layerBounds | layer.bounds;
41
daveb
parents: 40
diff changeset
227 }
daveb
parents: 40
diff changeset
228
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
229 assert(layerBounds.valid);
41
daveb
parents: 40
diff changeset
230
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
231 // FIXME use a function that grows a rectangle about its centre
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
232 // and change 2.0 to a class-level constant
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
233 Rectangle paddedLayerBounds = expand(move(layerBounds, - layerBounds.size), 2.0 * layerBounds.size);
41
daveb
parents: 40
diff changeset
234
62
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
235 //
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
236
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
237 _zoom = 0.25 * _ppi / MM_PER_INCH;
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
238
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
239 _canvasBounds = paddedLayerBounds;
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
240 _viewCentre = _canvasBounds.centre;
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
241
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
242 _grid.zoomChanged(_zoom);
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
243
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
244 updateAdjustments;
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
245 updateRulers;
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
246 }
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
247
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
248 void consolidateBounds() {
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
249 Rectangle layerBounds = Rectangle.DEFAULT;
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
250
67
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
251 foreach (layer; _layers) {
62
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
252 layerBounds = layerBounds | layer.bounds;
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
253 }
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
254
62
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
255 assert(layerBounds.valid);
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
256
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
257 Rectangle paddedLayerBounds = expand(move(layerBounds, - layerBounds.size), 2.0 * layerBounds.size);
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
258
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
259 Vector z = _viewSize / _zoom;
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
260 Rectangle r = Rectangle(_viewCentre - z / 2.0, z);
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
261 _canvasBounds = r | paddedLayerBounds;
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
262
62
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
263 updateAdjustments;
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
264 updateRulers;
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
265 }
35
3f6bb0bb22dc Beginnings of grid
David Bryant <bagnose@gmail.com>
parents: 34
diff changeset
266
62
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
267 bool onConfigure(GdkEventConfigure * event, Widget widget) {
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
268 assert(widget is _drawingArea);
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
269
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
270 _viewSize = Vector(cast(double)event.width, cast(double)event.height);
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
271
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
272 if (!_boundsValid) {
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
273 initialiseBounds;
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
274 _boundsValid = true;
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
275 }
41
daveb
parents: 40
diff changeset
276 else {
62
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
277 consolidateBounds;
41
daveb
parents: 40
diff changeset
278 }
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
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 return true;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
281 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
282
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
283 bool onExpose(GdkEventExpose * event, Widget widget) {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
284 assert(widget is _drawingArea);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
285
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
286 Drawable dr = _drawingArea.getWindow;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
287
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
288 int width, height;
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
289 dr.getSize(width, height);
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
290 //trace("Got expose %dx%d\n", width, height);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
291
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
292 scope modelCr = new Context(dr);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
293 scope pixelCr = new Context(dr);
12
a093c4fbdd43 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 11
diff changeset
294
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
295 Rectangle pixelDamage =
11
fb571a3b1f0d Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 10
diff changeset
296 event is null ?
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
297 Rectangle(Point(0.0, 0.0), _viewSize) :
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
298 Rectangle(Point(cast(double)event.area.x, _viewSize.y - cast(double)(event.area.y + event.area.height)),
11
fb571a3b1f0d Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 10
diff changeset
299 Vector(cast(double)event.area.width, cast(double)event.area.height));
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
300
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
301 Rectangle modelDamage = pixelToModel(pixelDamage);
19
22abbf4cde96 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 18
diff changeset
302
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
303 //trace("Pixel damage: %s, model damage: %s", pixelDamage, modelDamage);
19
22abbf4cde96 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 18
diff changeset
304
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
305 modelCr.save; pixelCr.save; {
67
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
306 {
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
307 // Setup model context and clip
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
308 modelCr.translate(0.0, _viewSize.y);
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
309 modelCr.scale(_zoom, -_zoom);
12
a093c4fbdd43 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 11
diff changeset
310
67
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
311 immutable Vector modelSize = pixelToModel(_viewSize);
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
312 immutable Point viewLeftBottom = _viewCentre - modelSize / 2.0;
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
313 modelCr.translate(-viewLeftBottom.x, -viewLeftBottom.y);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
314
67
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
315 rectangle(modelCr, modelDamage);
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
316 modelCr.clip;
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
317 }
12
a093c4fbdd43 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 11
diff changeset
318
67
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
319 {
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
320 // Setup pixel context and clip
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
321 pixelCr.translate(0.0, _viewSize.y);
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
322 pixelCr.scale(1.0, -1.0);
19
22abbf4cde96 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 18
diff changeset
323
67
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
324 rectangle(pixelCr, pixelDamage);
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
325 pixelCr.clip;
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
326 }
12
a093c4fbdd43 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 11
diff changeset
327
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
328 pixelCr.save; {
67
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
329 // Fill the background with light grey
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
330 pixelCr.setSourceRgba(0.9, 0.9, 0.9, 1.0);
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
331 rectangle(pixelCr, pixelDamage);
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
332 pixelCr.fill;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
333 } pixelCr.restore;
12
a093c4fbdd43 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 11
diff changeset
334
a093c4fbdd43 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 11
diff changeset
335 // Draw each layer
67
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
336 foreach(layer; _layers) {
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
337 layer.draw(this, pixelDamage, pixelCr, modelDamage, modelCr);
11
fb571a3b1f0d Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 10
diff changeset
338 }
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
339 } pixelCr.restore; modelCr.restore;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
340
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
341 return true;
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
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
344 bool onButtonPress(GdkEventButton * event, Widget widget) {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
345 assert(widget is _drawingArea);
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
346 //trace("Got button event\n");
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
347
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
348 Point pixelPoint = Point(event.x + 0.5, _viewSize.y - (event.y + 0.5));
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
349 Point modelPoint = pixelToModel(pixelPoint);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
350
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
351 auto buttonEvent = new ButtonEvent(gtk2tkButtonAction(event.type),
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
352 gtk2tkButtonName(event.button),
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
353 pixelPoint,
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
354 modelPoint,
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
355 gtk2tkMask(event.state));
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
356
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
357 _eventHandler.handleButtonPress(this, buttonEvent);
5
8a39b13cd3e6 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 3
diff changeset
358
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
359 fixDamage;
17
c643c04e3f5e Checkpoint
David Bryant <daveb@acres.com.au>
parents: 16
diff changeset
360
5
8a39b13cd3e6 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 3
diff changeset
361 return true;
8a39b13cd3e6 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 3
diff changeset
362 }
8a39b13cd3e6 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 3
diff changeset
363
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
364 bool onButtonRelease(GdkEventButton * event, Widget widget) {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
365 assert(widget is _drawingArea);
5
8a39b13cd3e6 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 3
diff changeset
366
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
367 Point pixelPoint = Point(event.x + 0.5, _viewSize.y - (event.y + 0.5));
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
368 Point modelPoint = pixelToModel(pixelPoint);
5
8a39b13cd3e6 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 3
diff changeset
369
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
370 auto buttonEvent = new ButtonEvent(gtk2tkButtonAction(event.type),
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
371 gtk2tkButtonName(event.button),
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
372 pixelPoint,
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
373 modelPoint,
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
374 gtk2tkMask(event.state));
5
8a39b13cd3e6 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 3
diff changeset
375
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
376 _eventHandler.handleButtonRelease(this, buttonEvent);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
377
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
378 fixDamage;
17
c643c04e3f5e Checkpoint
David Bryant <daveb@acres.com.au>
parents: 16
diff changeset
379
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
380 return true;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
381 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
382
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
383 /*
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
384 public struct GdkEventKey {
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
385 GdkEventType type;
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
386 GdkWindow *window;
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
387 byte sendEvent;
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
388 uint time;
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
389 uint state;
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
390 uint keyval;
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
391 int length;
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
392 char *string;
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
393 ushort hardwareKeycode;
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
394 ubyte group;
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
395 uint bitfield0;
67
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
396 uint isModifier : 1;
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
397 }
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
398 */
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
399 bool onKeyPressEvent(GdkEventKey * event, Widget widget) {
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
400 assert(widget is _drawingArea);
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
401
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
402 auto keyEvent = new KeyEvent(event.string[0..strlen(event.string)].idup,
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
403 event.keyval,
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
404 gtk2tkMask(event.state));
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
405 message("Got key press %s", keyEvent);
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
406 _eventHandler.handleKeyPress(this, keyEvent);
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
407
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
408 fixDamage;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
409
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
410 return true;
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
411 }
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
412
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
413 bool onKeyReleaseEvent(GdkEventKey * event, Widget widget) {
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
414 assert(widget is _drawingArea);
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
415
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
416 auto keyEvent = new KeyEvent(event.string[0..strlen(event.string)].idup,
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
417 event.keyval,
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
418 gtk2tkMask(event.state));
64
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
419 //message("Got key release %s", keyEvent);
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
420 _eventHandler.handleKeyRelease(this, keyEvent);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
421
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
422 fixDamage;
17
c643c04e3f5e Checkpoint
David Bryant <daveb@acres.com.au>
parents: 16
diff changeset
423
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
424 return true;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
425 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
426
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
427 bool onMotionNotify(GdkEventMotion * event, Widget widget) {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
428 assert(widget is _drawingArea);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
429 //writefln("Got motion notify\n");
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
430 gtk_widget_event(_hRuler.getWidgetStruct(), cast(GdkEvent *)event);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
431 gtk_widget_event(_vRuler.getWidgetStruct(), cast(GdkEvent *)event);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
432
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
433 Point pixelPoint = Point(event.x + 0.5, _viewSize.y - (event.y + 0.5));
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
434 Point modelPoint = pixelToModel(pixelPoint);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
435
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
436 auto motionEvent = new MotionEvent(pixelPoint,
64
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
437 modelPoint,
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
438 gtk2tkMask(event.state));
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
439
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
440 _eventHandler.handleMotion(this, motionEvent);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
441
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
442 fixDamage;
17
c643c04e3f5e Checkpoint
David Bryant <daveb@acres.com.au>
parents: 16
diff changeset
443
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
444 return true;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
445 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
446
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
447 bool onScroll(GdkEventScroll * event, Widget widget) {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
448 assert(widget is _drawingArea);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
449 //writefln("Got scroll\n");
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
450
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
451 Point pixelPoint = Point(event.x + 0.5, _viewSize.y - (event.y + 0.5));
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
452 Point modelPoint = pixelToModel(pixelPoint);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
453
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
454 auto scrollEvent = new ScrollEvent(gtk2tkDirection(event.direction),
64
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
455 pixelPoint,
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
456 modelPoint,
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
457 gtk2tkMask(event.state));
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
458
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
459 _eventHandler.handleScroll(this, scrollEvent);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
460
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
461 fixDamage;
17
c643c04e3f5e Checkpoint
David Bryant <daveb@acres.com.au>
parents: 16
diff changeset
462
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
463 return true;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
464 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
465
20
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
466 /*
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
467 public enum GdkCrossingMode {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
468 NORMAL,
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
469 GRAB,
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
470 UNGRAB,
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
471 GTK_GRAB,
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
472 GTK_UNGRAB,
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
473 STATE_CHANGED
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
474 }
20
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
475
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
476 public struct GdkEventCrossing {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
477 GdkEventType type;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
478 GdkWindow *window;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
479 byte sendEvent;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
480 GdkWindow *subwindow;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
481 uint time;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
482 double x;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
483 double y;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
484 double xRoot;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
485 double yRoot;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
486 GdkCrossingMode mode;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
487 GdkNotifyType detail;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
488 int focus;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
489 uint state;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
490 }
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
491 */
20
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
492
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
493 bool onEnterNotify(GdkEventCrossing * event, Widget widget) {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
494 assert(widget is _drawingArea);
64
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
495
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
496 Point pixelPoint = Point(event.x + 0.5, _viewSize.y - (event.y + 0.5));
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
497 Point modelPoint = pixelToModel(pixelPoint);
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
498
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
499 auto crossingEvent = new CrossingEvent(gtk2tkCrossingMode(event.mode),
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
500 pixelPoint,
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
501 modelPoint,
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
502 gtk2tkMask(event.state));
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
503
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
504 _eventHandler.handleEnter(this, crossingEvent);
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
505
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
506 fixDamage;
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
507
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
508 //message("Enter %d %d %d", cast(int)event.mode, event.focus, event.state);
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
509
20
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
510 return true;
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
511 }
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
512
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
513 bool onLeaveNotify(GdkEventCrossing * event, Widget widget) {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
514 assert(widget is _drawingArea);
64
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
515
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
516 Point pixelPoint = Point(event.x + 0.5, _viewSize.y - (event.y + 0.5));
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
517 Point modelPoint = pixelToModel(pixelPoint);
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
518
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
519 auto crossingEvent = new CrossingEvent(gtk2tkCrossingMode(event.mode),
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
520 pixelPoint,
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
521 modelPoint,
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
522 gtk2tkMask(event.state));
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
523
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
524 _eventHandler.handleLeave(this, crossingEvent);
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
525
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
526 fixDamage;
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
527
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
528 //message("Leave %d %d %d", cast(int)event.mode, event.focus, event.state);
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
529
20
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
530 return true;
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
531 }
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
532
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
533 /*
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
534 public struct GdkEventFocus {
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
535 GdkEventType type;
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
536 GdkWindow *window;
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
537 byte sendEvent;
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
538 short inn;
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
539 }
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
540 */
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
541 bool onFocusIn(GdkEventFocus * event, Widget widget) {
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
542 trace("onFocusIn");
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
543 return true;
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
544 }
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
545
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
546 bool onFocusOut(GdkEventFocus * event, Widget widget) {
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
547 trace("onFocusOut");
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
548 return true;
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
549 }
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
550
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
551 void onMoveFocus(GtkDirectionType direction, Widget widget) {
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
552 trace("onMoveFocus");
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
553 }
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
554
64
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
555 bool onGrabBroken(gdk.Event.Event event, Widget widget) {
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
556 trace("onGrabBroken");
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
557 return true;
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
558 }
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
559
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
560 void onGrabFocus(Widget widget) {
64
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
561 //trace("onGrabFocus");
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
562 }
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
563
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
564 void onGrabNotify(gboolean what, Widget widget){
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
565 trace("onGrabNotify");
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
566 }
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
567
67
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
568 void onAdjustmentValueChanged(Adjustment adjustment) {
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
569 GtkAdjustment * hGtkAdjustment = _hAdjustment.getAdjustmentStruct;
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
570 GtkAdjustment * vGtkAdjustment = _vAdjustment.getAdjustmentStruct;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
571
67
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
572 Point viewLeftBottom = Point(gtk_adjustment_get_value(hGtkAdjustment),
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
573 gtk_adjustment_get_value(vGtkAdjustment));
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
574
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
575 Vector modelSize = pixelToModel(_viewSize);
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
576
67
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
577 _viewCentre = viewLeftBottom + modelSize / 2.0;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
578
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
579 updateRulers;
13
f0ade1b49fe7 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 12
diff changeset
580 queueDraw;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
581 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
582
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
583 void updateRulers() {
58
c63719604adb Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents: 57
diff changeset
584 immutable Vector modelSize = pixelToModel(_viewSize);
c63719604adb Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents: 57
diff changeset
585 immutable Point viewLeftBottom = _viewCentre - modelSize / 2.0;
c63719604adb Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents: 57
diff changeset
586 immutable Point viewRightTop = _viewCentre + modelSize / 2.0;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
587
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
588 // Define these just to obtain the position
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
589 // below and we can preserve it
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
590 double lower, upper, position, maxSize;
12
a093c4fbdd43 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 11
diff changeset
591
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
592 _hRuler.getRange(lower, upper, position, maxSize);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
593 _hRuler.setRange(viewLeftBottom.x,
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
594 viewRightTop.x,
12
a093c4fbdd43 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 11
diff changeset
595 position,
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
596 _zoom * 50.0);
12
a093c4fbdd43 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 11
diff changeset
597
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
598 _vRuler.getRange(lower, upper, position, maxSize);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
599 _vRuler.setRange(viewRightTop.y,
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
600 viewLeftBottom.y,
14
0b7e7d43a79d Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 13
diff changeset
601 position,
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
602 _zoom * 50.0);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
603 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
604
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
605 void updateAdjustments() {
58
c63719604adb Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents: 57
diff changeset
606 immutable Vector modelSize = pixelToModel(_viewSize);
c63719604adb Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents: 57
diff changeset
607 immutable Point viewLeftBottom = _viewCentre - modelSize / 2.0;
c63719604adb Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents: 57
diff changeset
608 immutable Point viewRightTop = _viewCentre + modelSize / 2.0;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
609
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
610 // Adjust the canvas size if necessary
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
611 _canvasBounds = Rectangle(minExtents(_canvasBounds.minCorner, viewLeftBottom),
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
612 maxExtents(_canvasBounds.maxCorner, viewRightTop));
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
613
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
614 // Update the adjustments
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
615
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
616 GtkAdjustment * hGtkAdjustment = _hAdjustment.getAdjustmentStruct;
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
617 GtkAdjustment * vGtkAdjustment = _vAdjustment.getAdjustmentStruct;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
618
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
619 gtk_adjustment_set_lower(hGtkAdjustment, _canvasBounds.minCorner.x);
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
620 gtk_adjustment_set_upper(hGtkAdjustment, _canvasBounds.maxCorner.x);
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
621 gtk_adjustment_set_value(hGtkAdjustment, viewLeftBottom.x);
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
622 gtk_adjustment_set_step_increment(hGtkAdjustment, _canvasBounds.size.x / 16.0);
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
623 gtk_adjustment_set_page_increment(hGtkAdjustment, _canvasBounds.size.x / 4.0);
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
624 gtk_adjustment_set_page_size(hGtkAdjustment, modelSize.x);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
625
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
626 gtk_adjustment_set_lower(vGtkAdjustment, _canvasBounds.minCorner.y);
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
627 gtk_adjustment_set_upper(vGtkAdjustment, _canvasBounds.maxCorner.y);
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
628 gtk_adjustment_set_value(vGtkAdjustment, viewLeftBottom.y);
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
629 gtk_adjustment_set_step_increment(vGtkAdjustment, _canvasBounds.size.y / 16.0);
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
630 gtk_adjustment_set_page_increment(vGtkAdjustment, _canvasBounds.size.y / 4.0);
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
631 gtk_adjustment_set_page_size(vGtkAdjustment, modelSize.y);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
632
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
633 _hAdjustment.changed;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
634 _hAdjustment.valueChanged;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
635 _vAdjustment.changed;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
636 _vAdjustment.valueChanged;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
637 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
638
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
639 void fixDamage() {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
640 if (_damage.valid) {
17
c643c04e3f5e Checkpoint
David Bryant <daveb@acres.com.au>
parents: 16
diff changeset
641 int x, y, w, h;
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
642 _damage.getQuantised(x, y, w, h);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
643 _drawingArea.queueDrawArea(x, cast(int)_viewSize.y - (y + h), w, h);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
644 _damage = Rectangle.DEFAULT;
17
c643c04e3f5e Checkpoint
David Bryant <daveb@acres.com.au>
parents: 16
diff changeset
645 }
c643c04e3f5e Checkpoint
David Bryant <daveb@acres.com.au>
parents: 16
diff changeset
646 }
c643c04e3f5e Checkpoint
David Bryant <daveb@acres.com.au>
parents: 16
diff changeset
647
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
648 static double clampZoom(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
649
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
650 Point modelToPixel(in Point model) const {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
651 return Point.DEFAULT + _viewSize / 2.0 + _zoom * (model - _viewCentre);
27
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
652 }
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
653
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
654 Point pixelToModel(in Point pixel) const {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
655 return _viewCentre + (pixel - _viewSize / 2.0 - Point.DEFAULT) / _zoom;
27
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
656 }
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
657
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
658 Vector modelToPixel(in Vector model) const {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
659 return _zoom * model;
27
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
660 }
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
661
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
662 Vector pixelToModel(in Vector pixel) const {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
663 return pixel / _zoom;
27
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
664 }
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
665
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
666 Rectangle modelToPixel(in Rectangle model) const {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
667 return Rectangle(modelToPixel(model.position), modelToPixel(model.size));
27
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
668 }
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
669
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
670 Rectangle pixelToModel(in Rectangle model) const {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
671 return Rectangle(pixelToModel(model.position), pixelToModel(model.size));
27
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
672 }
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
673
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
674 void onRealize(Widget widget) {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
675 assert(widget is _drawingArea);
27
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
676 //writefln("Got realize\n");
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
677 _drawingArea.grabFocus();
27
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
678 }
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
679
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
680 bool _boundsValid;
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
681 Rectangle _damage; // pixels
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
682
67
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
683 // Model units are millimetres
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
684 // Screen units are pixels
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
685 double _zoom; // pixels-per-model-unit
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
686 Vector _viewSize; // pixel: size of view window in pixels
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
687 Point _viewCentre; // model: where in the model is the centre of our view
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
688 Rectangle _canvasBounds; // model:
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
689
10
71ca82e0eb76 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 9
diff changeset
690 // Child widgets:
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
691 HRuler _hRuler;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
692 VRuler _vRuler;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
693 DrawingArea _drawingArea;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
694 Adjustment _hAdjustment;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
695 HScrollbar _hScrollbar;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
696 Adjustment _vAdjustment;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
697 VScrollbar _vScrollbar;
11
fb571a3b1f0d Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 10
diff changeset
698
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
699 Layer[] _layers;
57
9960c4fbd0dd I is for Interface
"David Bryant <bagnose@gmail.com>"
parents: 54
diff changeset
700 IEventHandler _eventHandler;
9960c4fbd0dd I is for Interface
"David Bryant <bagnose@gmail.com>"
parents: 54
diff changeset
701 IGrid _grid;
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
702 double _ppi;
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
703
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
704 static immutable MM_PER_INCH = 25.4;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
705 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
706 }