annotate doodle/gtk/cairo_canvas.d @ 136:752676232e4b

Port to GtkD-2.0 (gtk+3)
author David Bryant <bagnose@gmail.com>
date Wed, 26 Sep 2012 17:36:31 +0930
parents bc5baa585b32
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
83
06b4504cbcb0 Checkpoint of trying to get a different renderer going (OpenGL)
daveb
parents: 82
diff changeset
1 module doodle.gtk.cairo_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;
72
5cc2de64f6d0 Cautious Saturday night commits
"David Bryant <bagnose@gmail.com>"
parents: 71
diff changeset
5 import doodle.gtk.events;
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
6 }
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
7
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
8 private {
40
1f97022e5c6d Checkpoint. Development continues...
daveb
parents: 35
diff changeset
9 import doodle.core.logging;
81
d92b9f04b1e8 Bed time
"David Bryant <bagnose@gmail.com>"
parents: 80
diff changeset
10 import doodle.tk.screen_model;
75
3cac0ee8ca35 Ok, things are seem on-track again
"David Bryant <bagnose@gmail.com>"
parents: 74
diff changeset
11 import doodle.dia.layer_stack;
84
cdd4fc728d94 Renamed Drawable to Renderer
daveb
parents: 83
diff changeset
12 import doodle.gtk.cairo_renderer;
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;
81
d92b9f04b1e8 Bed time
"David Bryant <bagnose@gmail.com>"
parents: 80
diff changeset
15 import cairo.Context;
16
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;
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
20 import gtk.Label;
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
21 alias gtk.Label.Label HRuler;
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
22 alias gtk.Label.Label VRuler;
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
23 import gtk.Range;
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
24 import gtk.HScrollbar;
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
25 import gtk.VScrollbar;
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
26 import gtk.DrawingArea;
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
27 import gtk.Adjustment;
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;
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
35 import core.thread;
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
36 }
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
37
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
38 // Bring doodle.tk.geometry.Rectangle into local namespace so we
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
39 // get it instead of gdk.Rectangle.Rectangle
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
40 alias doodle.tk.geometry.Rectangle Rectangle;
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
41
132
bc5baa585b32 Updated to dmd 2.060
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
42 final class CairoCanvas : Table, IViewport {
103
345fb56d89fc Blind checkpoint
David Bryant <bagnose@gmail.com>
parents: 100
diff changeset
43 static this() {
345fb56d89fc Blind checkpoint
David Bryant <bagnose@gmail.com>
parents: 100
diff changeset
44 _cursors = [
345fb56d89fc Blind checkpoint
David Bryant <bagnose@gmail.com>
parents: 100
diff changeset
45 Cursor.DEFAULT : CursorType.ARROW,
345fb56d89fc Blind checkpoint
David Bryant <bagnose@gmail.com>
parents: 100
diff changeset
46 Cursor.HAND : CursorType.HAND1,
345fb56d89fc Blind checkpoint
David Bryant <bagnose@gmail.com>
parents: 100
diff changeset
47 Cursor.CROSSHAIR : CursorType.CROSSHAIR,
345fb56d89fc Blind checkpoint
David Bryant <bagnose@gmail.com>
parents: 100
diff changeset
48 Cursor.PENCIL : CursorType.PENCIL
345fb56d89fc Blind checkpoint
David Bryant <bagnose@gmail.com>
parents: 100
diff changeset
49 ];
345fb56d89fc Blind checkpoint
David Bryant <bagnose@gmail.com>
parents: 100
diff changeset
50 }
345fb56d89fc Blind checkpoint
David Bryant <bagnose@gmail.com>
parents: 100
diff changeset
51
129
10ad5417bf07 Checkpoint
David Bryant <bagnose@gmail.com>
parents: 103
diff changeset
52 this(Layer[] layers, IEventHandler eventHandler, IGrid grid, in double pixelsPerMillimetre) {
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
53 super(3, 3, 0);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
54
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
55 _eventHandler = eventHandler;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
56 _grid = grid;
69
d540f7e4af9e Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 68
diff changeset
57 _pixelsPerMillimetre = pixelsPerMillimetre;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
58
79
535bae7a7305 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 78
diff changeset
59 _layerStack = new LayerStack(layers);
535bae7a7305 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 78
diff changeset
60
13
f0ade1b49fe7 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 12
diff changeset
61 // Create our child widgets and register callbacks
f0ade1b49fe7 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 12
diff changeset
62
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
63 _hRuler = new HRuler("horizontal");
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
64 attach(_hRuler,
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
65 1, 2,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
66 0, 1,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
67 AttachOptions.FILL | AttachOptions.EXPAND, AttachOptions.SHRINK,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
68 0, 0);
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
69 //_hRuler.setMetric(MetricType.PIXELS);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
70
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
71 _vRuler = new VRuler("vertical");
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
72 attach(_vRuler,
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
73 0, 1,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
74 1, 2,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
75 AttachOptions.SHRINK, AttachOptions.FILL | AttachOptions.EXPAND,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
76 0, 0);
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
77 //_vRuler.setMetric(MetricType.PIXELS);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
78
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
79 _drawingArea = new DrawingArea;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
80 _drawingArea.addOnRealize(&onRealize);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
81 _drawingArea.addOnConfigure(&onConfigure);
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
82 _drawingArea.addOnDraw(&onDraw);
81
d92b9f04b1e8 Bed time
"David Bryant <bagnose@gmail.com>"
parents: 80
diff changeset
83 _drawingArea.addOnButtonPress(&onButtonPress);
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
84 _drawingArea.addOnButtonRelease(&onButtonRelease);
81
d92b9f04b1e8 Bed time
"David Bryant <bagnose@gmail.com>"
parents: 80
diff changeset
85 _drawingArea.addOnKeyPress(&onKeyPressEvent);
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
86 _drawingArea.addOnKeyRelease(&onKeyReleaseEvent);
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
87 _drawingArea.addOnMotionNotify(&onMotionNotify);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
88 _drawingArea.addOnScroll(&onScroll);
81
d92b9f04b1e8 Bed time
"David Bryant <bagnose@gmail.com>"
parents: 80
diff changeset
89 _drawingArea.addOnEnterNotify(&onEnterNotify);
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
90 _drawingArea.addOnLeaveNotify(&onLeaveNotify);
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
91
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
92 _drawingArea.addOnFocusIn(&onFocusIn);
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
93 _drawingArea.addOnFocusOut(&onFocusOut);
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
94 _drawingArea.addOnMoveFocus(&onMoveFocus);
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
95 _drawingArea.addOnGrabBroken(&onGrabBroken);
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
96 _drawingArea.addOnGrabFocus(&onGrabFocus);
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
97 _drawingArea.addOnGrabNotify(&onGrabNotify);
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
98 // addOnPopupMenu
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
99 // addOnQueryTooltip
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
100 // addOnSelection*
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
101 _drawingArea.setEvents(EventMask.POINTER_MOTION_MASK |
20
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
102 EventMask.POINTER_MOTION_HINT_MASK |
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
103 EventMask.BUTTON_MOTION_MASK |
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
104 EventMask.BUTTON_PRESS_MASK |
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
105 EventMask.BUTTON_RELEASE_MASK |
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
106 EventMask.KEY_PRESS_MASK |
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
107 EventMask.KEY_RELEASE_MASK |
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
108 EventMask.ENTER_NOTIFY_MASK |
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
109 EventMask.LEAVE_NOTIFY_MASK |
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
110 EventMask.FOCUS_CHANGE_MASK |
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
111 EventMask.SCROLL_MASK);
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
112
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
113 _drawingArea.setCanFocus(true);
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
114
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
115 attach(_drawingArea,
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
116 1, 2,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
117 1, 2,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
118 AttachOptions.FILL | AttachOptions.EXPAND, AttachOptions.FILL | AttachOptions.EXPAND,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
119 0, 0);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
120
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
121 // value, lower, upper, step-inc, page-inc, page-size
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
122 // Give the adjustments dummy values until we receive a configure
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
123 _hAdjustment = new Adjustment(0.0, 0.0, 1.0, 0.2, 0.5, 0.5);
67
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
124 _hAdjustment.addOnValueChanged(&onAdjustmentValueChanged);
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
125 _hScrollbar = new HScrollbar(_hAdjustment);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
126 _hScrollbar.setInverted(false);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
127 attach(_hScrollbar,
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
128 1, 2,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
129 2, 3,
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
130 AttachOptions.FILL | AttachOptions.EXPAND,
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
131 AttachOptions.SHRINK,
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
132 0, 0);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
133
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
134 _vAdjustment = new Adjustment(0.0, 0.0, 1.0, 0.2, 0.5, 0.5);
67
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
135 _vAdjustment.addOnValueChanged(&onAdjustmentValueChanged);
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
136 _vScrollbar = new VScrollbar(_vAdjustment);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
137 _vScrollbar.setInverted(true);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
138 attach(_vScrollbar,
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
139 2, 3,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
140 1, 2,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
141 AttachOptions.SHRINK,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
142 AttachOptions.FILL | AttachOptions.EXPAND,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
143 0, 0);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
144 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
145
68
daveb
parents: 67
diff changeset
146 protected { // XXX the compiler complains about unimplemented methods if this is private
62
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
147
68
daveb
parents: 67
diff changeset
148 // IViewport overrides:
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
149
92
a98116479793 Removed GL support. Improved grid.
daveb
parents: 91
diff changeset
150 void zoomRelative(in double factor, in Point screenDatum) {
77
15ca7d5cd1ed The rulers are broken
"David Bryant <bagnose@gmail.com>"
parents: 75
diff changeset
151 _screenModel.zoomRelative(factor, screenDatum);
132
bc5baa585b32 Updated to dmd 2.060
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
152 consolidateBounds();
bc5baa585b32 Updated to dmd 2.060
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
153 updateAdjustments();
bc5baa585b32 Updated to dmd 2.060
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
154 updateRulers();
77
15ca7d5cd1ed The rulers are broken
"David Bryant <bagnose@gmail.com>"
parents: 75
diff changeset
155 _grid.zoomChanged(_screenModel.zoom);
132
bc5baa585b32 Updated to dmd 2.060
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
156 queueDraw();
27
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
157 }
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
158
72
5cc2de64f6d0 Cautious Saturday night commits
"David Bryant <bagnose@gmail.com>"
parents: 71
diff changeset
159 void panRelative(in Vector screenDisplacement) {
77
15ca7d5cd1ed The rulers are broken
"David Bryant <bagnose@gmail.com>"
parents: 75
diff changeset
160 _screenModel.panRelativeScreen(screenDisplacement);
132
bc5baa585b32 Updated to dmd 2.060
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
161 consolidateBounds();
bc5baa585b32 Updated to dmd 2.060
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
162 updateAdjustments();
bc5baa585b32 Updated to dmd 2.060
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
163 updateRulers();
bc5baa585b32 Updated to dmd 2.060
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
164 queueDraw();
68
daveb
parents: 67
diff changeset
165 }
daveb
parents: 67
diff changeset
166
daveb
parents: 67
diff changeset
167 void setCursor(in Cursor cursor) {
79
535bae7a7305 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 78
diff changeset
168 _drawingArea.setCursor(new gdk.Cursor.Cursor(_cursors[cursor]));
68
daveb
parents: 67
diff changeset
169 }
daveb
parents: 67
diff changeset
170
daveb
parents: 67
diff changeset
171 void damageModel(in Rectangle area) {
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
172 _tmpDamageScreen = _tmpDamageScreen | _screenModel.modelToScreen(area);
68
daveb
parents: 67
diff changeset
173 }
daveb
parents: 67
diff changeset
174
77
15ca7d5cd1ed The rulers are broken
"David Bryant <bagnose@gmail.com>"
parents: 75
diff changeset
175 void damageScreen(in Rectangle area) {
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
176 _tmpDamageScreen = _tmpDamageScreen | area;
68
daveb
parents: 67
diff changeset
177 }
18
df8d81d9f499 Lasso fiddling
David Bryant <daveb@acres.com.au>
parents: 17
diff changeset
178 }
df8d81d9f499 Lasso fiddling
David Bryant <daveb@acres.com.au>
parents: 17
diff changeset
179
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
180 private {
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
181
62
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
182 void consolidateBounds() {
79
535bae7a7305 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 78
diff changeset
183 Rectangle layerBounds = _layerStack.bounds;
535bae7a7305 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 78
diff changeset
184 Rectangle paddedLayerBounds = growCentre(layerBounds, 2 * layerBounds.size);
77
15ca7d5cd1ed The rulers are broken
"David Bryant <bagnose@gmail.com>"
parents: 75
diff changeset
185 _screenModel.consolidateCanvasBounds(paddedLayerBounds);
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
186
132
bc5baa585b32 Updated to dmd 2.060
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
187 updateAdjustments();
bc5baa585b32 Updated to dmd 2.060
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
188 updateRulers();
62
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
189 }
35
3f6bb0bb22dc Beginnings of grid
David Bryant <bagnose@gmail.com>
parents: 34
diff changeset
190
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
191 bool onConfigure(gdk.Event.Event event, Widget widget) {
62
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
192 assert(widget is _drawingArea);
6c3993f4c3eb Checkpoint
daveb
parents: 58
diff changeset
193
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
194 //_surface = ImageSurface.create(CairoFormat.ARGB32, event.configure().width, event.configure().height);
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
195
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
196 auto viewBoundsScreen = Rectangle(Point(0.0, 0.0), Vector(cast(double)event.configure().width, cast(double)event.configure().height));
91
42766e14534e Update screenViewBounds when the window is resized
daveb
parents: 89
diff changeset
197
42766e14534e Update screenViewBounds when the window is resized
daveb
parents: 89
diff changeset
198 if (_screenModel is null) {
42766e14534e Update screenViewBounds when the window is resized
daveb
parents: 89
diff changeset
199 Rectangle layerBounds = _layerStack.bounds;
42766e14534e Update screenViewBounds when the window is resized
daveb
parents: 89
diff changeset
200 Rectangle paddedLayerBounds = growCentre(layerBounds, 2 * layerBounds.size);
42766e14534e Update screenViewBounds when the window is resized
daveb
parents: 89
diff changeset
201 _screenModel = new ScreenModel(0.25 * _pixelsPerMillimetre, paddedLayerBounds, viewBoundsScreen);
42766e14534e Update screenViewBounds when the window is resized
daveb
parents: 89
diff changeset
202 _grid.zoomChanged(_screenModel.zoom);
42766e14534e Update screenViewBounds when the window is resized
daveb
parents: 89
diff changeset
203
132
bc5baa585b32 Updated to dmd 2.060
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
204 updateAdjustments();
bc5baa585b32 Updated to dmd 2.060
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
205 updateRulers();
91
42766e14534e Update screenViewBounds when the window is resized
daveb
parents: 89
diff changeset
206 }
42766e14534e Update screenViewBounds when the window is resized
daveb
parents: 89
diff changeset
207 else {
42766e14534e Update screenViewBounds when the window is resized
daveb
parents: 89
diff changeset
208 _screenModel.setViewBoundsScreen(viewBoundsScreen);
132
bc5baa585b32 Updated to dmd 2.060
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
209 consolidateBounds();
91
42766e14534e Update screenViewBounds when the window is resized
daveb
parents: 89
diff changeset
210 }
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
211
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
212 return true;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
213 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
214
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
215 bool onDraw(Context context, Widget widget) {
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
216 assert(widget is _drawingArea);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
217
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
218 double x0, y0, x1, y1;
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
219 context.clipExtents(x0, y0, x1, y1);
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
220 Rectangle screenDamage =
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
221 Rectangle(_screenModel.viewBoundsScreen.position +
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
222 Vector(x0, _screenModel.viewBoundsScreen.h - y1),
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
223 Vector(x1 - x0, y1 - y0));
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
224 assert(screenDamage.valid);
12
a093c4fbdd43 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 11
diff changeset
225
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
226 writefln("External screen damage: %s", screenDamage);
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
227 writefln("Internal screen damage: %s", _internalDamageScreen);
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
228 assert(screenDamage.contains(_internalDamageScreen));
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
229
77
15ca7d5cd1ed The rulers are broken
"David Bryant <bagnose@gmail.com>"
parents: 75
diff changeset
230 Rectangle modelDamage = _screenModel.screenToModel(screenDamage);
19
22abbf4cde96 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 18
diff changeset
231
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
232 scope Context modelCr = Context.create(context.getTarget());
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
233 scope Context screenCr = Context.create(context.getTarget());
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
234
132
bc5baa585b32 Updated to dmd 2.060
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
235 modelCr.save(); screenCr.save(); {
67
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
236 {
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
237 // Setup model context and clip
77
15ca7d5cd1ed The rulers are broken
"David Bryant <bagnose@gmail.com>"
parents: 75
diff changeset
238 modelCr.translate(0.0, _screenModel.viewBoundsScreen.h);
15ca7d5cd1ed The rulers are broken
"David Bryant <bagnose@gmail.com>"
parents: 75
diff changeset
239 modelCr.scale(_screenModel.zoom, -_screenModel.zoom);
12
a093c4fbdd43 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 11
diff changeset
240
77
15ca7d5cd1ed The rulers are broken
"David Bryant <bagnose@gmail.com>"
parents: 75
diff changeset
241 immutable Point viewLeftBottom = _screenModel.screenToModel(Point(0.0, 0.0));
67
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
242 modelCr.translate(-viewLeftBottom.x, -viewLeftBottom.y);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
243
81
d92b9f04b1e8 Bed time
"David Bryant <bagnose@gmail.com>"
parents: 80
diff changeset
244 modelCr.rectangle(modelDamage.x0, modelDamage.y0, modelDamage.w, modelDamage.h);
132
bc5baa585b32 Updated to dmd 2.060
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
245 modelCr.clip();
67
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
246 }
12
a093c4fbdd43 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 11
diff changeset
247
67
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
248 {
77
15ca7d5cd1ed The rulers are broken
"David Bryant <bagnose@gmail.com>"
parents: 75
diff changeset
249 // Setup screen context and clip
15ca7d5cd1ed The rulers are broken
"David Bryant <bagnose@gmail.com>"
parents: 75
diff changeset
250 screenCr.translate(0.0, _screenModel.viewBoundsScreen.h);
15ca7d5cd1ed The rulers are broken
"David Bryant <bagnose@gmail.com>"
parents: 75
diff changeset
251 screenCr.scale(1.0, -1.0);
19
22abbf4cde96 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 18
diff changeset
252
81
d92b9f04b1e8 Bed time
"David Bryant <bagnose@gmail.com>"
parents: 80
diff changeset
253 screenCr.rectangle(screenDamage.x0, screenDamage.y0, screenDamage.w, screenDamage.h);
132
bc5baa585b32 Updated to dmd 2.060
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
254 screenCr.clip();
67
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
255 }
12
a093c4fbdd43 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 11
diff changeset
256
132
bc5baa585b32 Updated to dmd 2.060
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
257 screenCr.save(); {
67
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
258 // Fill the background with light grey
77
15ca7d5cd1ed The rulers are broken
"David Bryant <bagnose@gmail.com>"
parents: 75
diff changeset
259 screenCr.setSourceRgba(0.9, 0.9, 0.9, 1.0);
81
d92b9f04b1e8 Bed time
"David Bryant <bagnose@gmail.com>"
parents: 80
diff changeset
260 screenCr.rectangle(screenDamage.x0, screenDamage.y0, screenDamage.w, screenDamage.h);
132
bc5baa585b32 Updated to dmd 2.060
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
261 screenCr.fill();
bc5baa585b32 Updated to dmd 2.060
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
262 } screenCr.restore();
12
a093c4fbdd43 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 11
diff changeset
263
84
cdd4fc728d94 Renamed Drawable to Renderer
daveb
parents: 83
diff changeset
264 _layerStack.draw(screenDamage, new CairoRenderer(screenCr),
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
265 modelDamage, new CairoRenderer(modelCr),
89
467febed7367 * Ignore excre
David Bryant <bagnose@gmail.com>
parents: 88
diff changeset
266 _screenModel);
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
267 } screenCr.restore(); screenCr.restore();
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
268
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
269 _internalDamageScreen = Rectangle();
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
270
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
271 return true;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
272 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
273
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
274 bool onButtonPress(gdk.Event.Event event, Widget widget) {
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
275 assert(widget is _drawingArea);
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
276 _eventHandler.handleButtonPress(this, makeButtonEvent(event.button(), _screenModel));
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
277 reportDamage();
5
8a39b13cd3e6 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 3
diff changeset
278 return true;
8a39b13cd3e6 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 3
diff changeset
279 }
8a39b13cd3e6 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 3
diff changeset
280
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
281 bool onButtonRelease(gdk.Event.Event event, Widget widget) {
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
282 assert(widget is _drawingArea);
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
283 _eventHandler.handleButtonRelease(this, makeButtonEvent(event.button(), _screenModel));
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
284 reportDamage();
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
285 return true;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
286 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
287
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
288 bool onKeyPressEvent(gdk.Event.Event event, Widget widget) {
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
289 assert(widget is _drawingArea);
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
290 _eventHandler.handleKeyPress(this, makeKeyEvent(event.key(), _screenModel));
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
291 reportDamage();
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
292 return true;
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
293 }
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
294
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
295 bool onKeyReleaseEvent(gdk.Event.Event event, Widget widget) {
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
296 assert(widget is _drawingArea);
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
297 _eventHandler.handleKeyRelease(this, makeKeyEvent(event.key(), _screenModel));
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
298 reportDamage();
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
299 return true;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
300 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
301
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
302 bool onMotionNotify(gdk.Event.Event event, Widget widget) {
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
303 assert(widget is _drawingArea);
73
6f2525e170f2 Cairo/OpenGL checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 72
diff changeset
304
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
305 if (event.motion().isHint) {
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
306 int x, y;
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
307 GdkModifierType mask;
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
308 _drawingArea.getWindow().getPointer(x, y, mask);
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
309 _eventHandler.handleMotion(this, makeMotionEventHint(x, y, mask, _screenModel));
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
310 }
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
311 else {
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
312 _eventHandler.handleMotion(this, makeMotionEvent(event.motion(), _screenModel));
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
313 }
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
314
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
315 reportDamage();
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
316
77
15ca7d5cd1ed The rulers are broken
"David Bryant <bagnose@gmail.com>"
parents: 75
diff changeset
317 // Pass the events on to the rulers so that they update
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
318 _hRuler.event(event);
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
319 _vRuler.event(event);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
320
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
321 // Simulate delay in case we were slow to handle the event.
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
322 // This is really only relevant if we were to do the drawing from inside
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
323 // the handler. ???
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
324 Thread.sleep(dur!("msecs")(50));
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
325
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
326 return true;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
327 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
328
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
329 bool onScroll(gdk.Event.Event event, Widget widget) {
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
330 assert(widget is _drawingArea);
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
331 _eventHandler.handleScroll(this, makeScrollEvent(event.scroll(), _screenModel));
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
332 reportDamage();
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
333 return true;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
334 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
335
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
336 bool onEnterNotify(gdk.Event.Event event, Widget widget) {
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
337 assert(widget is _drawingArea);
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
338 _eventHandler.handleEnter(this, makeCrossingEvent(event.crossing(), _screenModel));
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
339 reportDamage();
20
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
340 return true;
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
341 }
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
342
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
343 bool onLeaveNotify(gdk.Event.Event event, Widget widget) {
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
344 assert(widget is _drawingArea);
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
345 _eventHandler.handleLeave(this, makeCrossingEvent(event.crossing(), _screenModel));
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
346 reportDamage();
20
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
347 return true;
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
348 }
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
349
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
350 bool onFocusIn(gdk.Event.Event event, Widget widget) {
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
351 trace("onFocusIn");
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
352 return true;
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
353 }
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
354
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
355 bool onFocusOut(gdk.Event.Event event, Widget widget) {
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
356 trace("onFocusOut");
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
357 return true;
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 void onMoveFocus(GtkDirectionType direction, Widget widget) {
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
361 trace("onMoveFocus");
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
64
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
364 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
365 trace("onGrabBroken");
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
366 return true;
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
367 }
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 void onGrabFocus(Widget widget) {
64
eb5436b47d13 Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents: 63
diff changeset
370 //trace("onGrabFocus");
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
371 }
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
372
88
100dd23c7bdf Ch ch ch changes:
David Bryant <bagnose@gmail.com>
parents: 85
diff changeset
373 void onGrabNotify(gboolean what, Widget widget) {
100dd23c7bdf Ch ch ch changes:
David Bryant <bagnose@gmail.com>
parents: 85
diff changeset
374 trace("onGrabNotify: %s", what);
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
375 }
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
376
67
31d10176415d Checkpoint
daveb
parents: 64
diff changeset
377 void onAdjustmentValueChanged(Adjustment adjustment) {
132
bc5baa585b32 Updated to dmd 2.060
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
378 GtkAdjustment * hGtkAdjustment = _hAdjustment.getAdjustmentStruct();
bc5baa585b32 Updated to dmd 2.060
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
379 GtkAdjustment * vGtkAdjustment = _vAdjustment.getAdjustmentStruct();
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
380
77
15ca7d5cd1ed The rulers are broken
"David Bryant <bagnose@gmail.com>"
parents: 75
diff changeset
381 Point oldViewLeftBottom = _screenModel.screenToModel(Point(0.0, 0.0));
71
0f7cf6c6f206 Reimplemented gtk.canvas in terms of tk.pixel_model but
"David Bryant <bagnose@gmail.com>"
parents: 70
diff changeset
382 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
383 gtk_adjustment_get_value(vGtkAdjustment));
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
384
77
15ca7d5cd1ed The rulers are broken
"David Bryant <bagnose@gmail.com>"
parents: 75
diff changeset
385 _screenModel.panRelativeModel(newViewLeftBottom - oldViewLeftBottom);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
386
132
bc5baa585b32 Updated to dmd 2.060
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
387 updateRulers();
bc5baa585b32 Updated to dmd 2.060
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
388 queueDraw();
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
389 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
390
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
391 void updateRulers() {
79
535bae7a7305 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 78
diff changeset
392 immutable Point viewLeftBottom = _screenModel.screenToModel(_screenModel.viewBoundsScreen.corner0);
77
15ca7d5cd1ed The rulers are broken
"David Bryant <bagnose@gmail.com>"
parents: 75
diff changeset
393 immutable Point viewRightTop = _screenModel.screenToModel(_screenModel.viewBoundsScreen.corner1);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
394
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
395 // Define these just to obtain the position
81
d92b9f04b1e8 Bed time
"David Bryant <bagnose@gmail.com>"
parents: 80
diff changeset
396 // below so we can preserve it
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
397 double lower, upper, position, maxSize;
12
a093c4fbdd43 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 11
diff changeset
398
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
399 /+
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
400 _hRuler.getRange(lower, upper, position, maxSize);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
401 _hRuler.setRange(viewLeftBottom.x,
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
402 viewRightTop.x,
12
a093c4fbdd43 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 11
diff changeset
403 position,
77
15ca7d5cd1ed The rulers are broken
"David Bryant <bagnose@gmail.com>"
parents: 75
diff changeset
404 _screenModel.zoom * 50.0);
12
a093c4fbdd43 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 11
diff changeset
405
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
406 _vRuler.getRange(lower, upper, position, maxSize);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
407 _vRuler.setRange(viewRightTop.y,
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
408 viewLeftBottom.y,
14
0b7e7d43a79d Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 13
diff changeset
409 position,
77
15ca7d5cd1ed The rulers are broken
"David Bryant <bagnose@gmail.com>"
parents: 75
diff changeset
410 _screenModel.zoom * 50.0);
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
411 +/
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
412 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
413
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
414 void updateAdjustments() {
77
15ca7d5cd1ed The rulers are broken
"David Bryant <bagnose@gmail.com>"
parents: 75
diff changeset
415 immutable Point viewLeftBottom = _screenModel.screenToModel(Point(0.0, 0.0));
15ca7d5cd1ed The rulers are broken
"David Bryant <bagnose@gmail.com>"
parents: 75
diff changeset
416 immutable Point viewRightTop = _screenModel.screenToModel(_screenModel.viewBoundsScreen.corner1);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
417
79
535bae7a7305 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 78
diff changeset
418 // Adjust the canvas size if necessary
77
15ca7d5cd1ed The rulers are broken
"David Bryant <bagnose@gmail.com>"
parents: 75
diff changeset
419 _screenModel.canvasAccommodate(Rectangle(viewLeftBottom, viewRightTop));
71
0f7cf6c6f206 Reimplemented gtk.canvas in terms of tk.pixel_model but
"David Bryant <bagnose@gmail.com>"
parents: 70
diff changeset
420
79
535bae7a7305 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 78
diff changeset
421 Rectangle viewBoundsModel = _screenModel.viewBoundsModel;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
422
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
423 // Update the adjustments
88
100dd23c7bdf Ch ch ch changes:
David Bryant <bagnose@gmail.com>
parents: 85
diff changeset
424 _hAdjustment.configure(viewLeftBottom.x,
100dd23c7bdf Ch ch ch changes:
David Bryant <bagnose@gmail.com>
parents: 85
diff changeset
425 _screenModel.canvasBoundsModel.x0,
100dd23c7bdf Ch ch ch changes:
David Bryant <bagnose@gmail.com>
parents: 85
diff changeset
426 _screenModel.canvasBoundsModel.x1,
100dd23c7bdf Ch ch ch changes:
David Bryant <bagnose@gmail.com>
parents: 85
diff changeset
427 _screenModel.canvasBoundsModel.w / 16.0,
100dd23c7bdf Ch ch ch changes:
David Bryant <bagnose@gmail.com>
parents: 85
diff changeset
428 _screenModel.canvasBoundsModel.w / 4.0,
100dd23c7bdf Ch ch ch changes:
David Bryant <bagnose@gmail.com>
parents: 85
diff changeset
429 _screenModel.viewBoundsModel.w);
100dd23c7bdf Ch ch ch changes:
David Bryant <bagnose@gmail.com>
parents: 85
diff changeset
430 _vAdjustment.configure(viewLeftBottom.y,
100dd23c7bdf Ch ch ch changes:
David Bryant <bagnose@gmail.com>
parents: 85
diff changeset
431 _screenModel.canvasBoundsModel.y0,
100dd23c7bdf Ch ch ch changes:
David Bryant <bagnose@gmail.com>
parents: 85
diff changeset
432 _screenModel.canvasBoundsModel.y1,
100dd23c7bdf Ch ch ch changes:
David Bryant <bagnose@gmail.com>
parents: 85
diff changeset
433 _screenModel.canvasBoundsModel.h / 16.0,
100dd23c7bdf Ch ch ch changes:
David Bryant <bagnose@gmail.com>
parents: 85
diff changeset
434 _screenModel.canvasBoundsModel.h / 4.0,
100dd23c7bdf Ch ch ch changes:
David Bryant <bagnose@gmail.com>
parents: 85
diff changeset
435 _screenModel.viewBoundsModel.h);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
436 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
437
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
438 void reportDamage() {
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
439 if (_tmpDamageScreen.valid) {
17
c643c04e3f5e Checkpoint
David Bryant <daveb@acres.com.au>
parents: 16
diff changeset
440 int x, y, w, h;
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
441 _tmpDamageScreen.getQuantised(x, y, w, h);
77
15ca7d5cd1ed The rulers are broken
"David Bryant <bagnose@gmail.com>"
parents: 75
diff changeset
442 _drawingArea.queueDrawArea(x, cast(int)_screenModel.viewBoundsScreen.h - (y + h), w, h);
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
443 _internalDamageScreen = _internalDamageScreen | _tmpDamageScreen;
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
444 _tmpDamageScreen = Rectangle();
17
c643c04e3f5e Checkpoint
David Bryant <daveb@acres.com.au>
parents: 16
diff changeset
445 }
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
446 assert(!_tmpDamageScreen.valid);
17
c643c04e3f5e Checkpoint
David Bryant <daveb@acres.com.au>
parents: 16
diff changeset
447 }
c643c04e3f5e Checkpoint
David Bryant <daveb@acres.com.au>
parents: 16
diff changeset
448
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
449 void onRealize(Widget widget) {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
450 assert(widget is _drawingArea);
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 62
diff changeset
451 _drawingArea.grabFocus();
27
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
452 }
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
453
73
6f2525e170f2 Cairo/OpenGL checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 72
diff changeset
454 IEventHandler _eventHandler;
6f2525e170f2 Cairo/OpenGL checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 72
diff changeset
455 IGrid _grid;
6f2525e170f2 Cairo/OpenGL checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 72
diff changeset
456 double _pixelsPerMillimetre;
79
535bae7a7305 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 78
diff changeset
457 LayerStack _layerStack;
535bae7a7305 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 78
diff changeset
458
10
71ca82e0eb76 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 9
diff changeset
459 // Child widgets:
73
6f2525e170f2 Cairo/OpenGL checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 72
diff changeset
460 HRuler _hRuler;
6f2525e170f2 Cairo/OpenGL checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 72
diff changeset
461 VRuler _vRuler;
6f2525e170f2 Cairo/OpenGL checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 72
diff changeset
462 DrawingArea _drawingArea;
6f2525e170f2 Cairo/OpenGL checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 72
diff changeset
463 Adjustment _hAdjustment;
6f2525e170f2 Cairo/OpenGL checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 72
diff changeset
464 HScrollbar _hScrollbar;
6f2525e170f2 Cairo/OpenGL checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 72
diff changeset
465 Adjustment _vAdjustment;
6f2525e170f2 Cairo/OpenGL checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 72
diff changeset
466 VScrollbar _vScrollbar;
11
fb571a3b1f0d Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 10
diff changeset
467
136
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
468 Rectangle _tmpDamageScreen; // accumulated from damageModel and damageScreen calls
752676232e4b Port to GtkD-2.0 (gtk+3)
David Bryant <bagnose@gmail.com>
parents: 132
diff changeset
469 Rectangle _internalDamageScreen; // aggregated from _tmpDamageScreen in reportDamage calls
77
15ca7d5cd1ed The rulers are broken
"David Bryant <bagnose@gmail.com>"
parents: 75
diff changeset
470 ScreenModel _screenModel;
81
d92b9f04b1e8 Bed time
"David Bryant <bagnose@gmail.com>"
parents: 80
diff changeset
471
103
345fb56d89fc Blind checkpoint
David Bryant <bagnose@gmail.com>
parents: 100
diff changeset
472 static immutable CursorType[Cursor] _cursors;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
473 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
474 }