annotate doodle/gtk/canvas.d @ 71:0f7cf6c6f206

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