annotate doodle/dia/tool_layer.d @ 63:20d6327c4a75

Event progress. Got key press/release working and panning via keyboard.
author daveb
date Thu, 12 Aug 2010 16:35:24 +0930
parents e64baac3efb2
children eb5436b47d13
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: 26
diff changeset
1 module doodle.dia.tool_layer;
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
diff changeset
2
36
188397ef9a12 Late night tinkering
David Bryant <bagnose@gmail.com>
parents: 28
diff changeset
3 public {
188397ef9a12 Late night tinkering
David Bryant <bagnose@gmail.com>
parents: 28
diff changeset
4 import doodle.dia.tool;
188397ef9a12 Late night tinkering
David Bryant <bagnose@gmail.com>
parents: 28
diff changeset
5 }
188397ef9a12 Late night tinkering
David Bryant <bagnose@gmail.com>
parents: 28
diff changeset
6
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 14
diff changeset
7 private {
28
1754cb773d41 Part-way through getting to compile with configure/builder.
Graham St Jack <graham.stjack@internode.on.net>
parents: 26
diff changeset
8 import doodle.cairo.routines;
58
c63719604adb Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents: 57
diff changeset
9 import doodle.core.logging;
c63719604adb Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents: 57
diff changeset
10 }
c63719604adb Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents: 57
diff changeset
11
c63719604adb Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents: 57
diff changeset
12 // This interface is used by the palette
c63719604adb Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents: 57
diff changeset
13 interface IToolStack {
c63719604adb Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents: 57
diff changeset
14 void use(Tool tool);
c63719604adb Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents: 57
diff changeset
15 }
c63719604adb Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents: 57
diff changeset
16
c63719604adb Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents: 57
diff changeset
17 interface IToolStackObserver {
60
e64baac3efb2 Attempt at a templatised palette
David Bryant <bagnose@gmail.com>
parents: 58
diff changeset
18 void toolChanged(Tool tool);
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 14
diff changeset
19 }
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
diff changeset
20
58
c63719604adb Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents: 57
diff changeset
21 final class ToolLayer : Layer, IEventHandler, IToolStack {
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 60
diff changeset
22 this(in Tool[] staticTools, IToolStackObserver observer, in string name = "Tool") {
12
a093c4fbdd43 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 10
diff changeset
23 super(name);
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 60
diff changeset
24 _staticTools = staticTools.dup;
58
c63719604adb Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents: 57
diff changeset
25 _observer = observer;
c63719604adb Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents: 57
diff changeset
26 }
c63719604adb Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents: 57
diff changeset
27
c63719604adb Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents: 57
diff changeset
28 // IToolStack overrides:
c63719604adb Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents: 57
diff changeset
29
c63719604adb Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents: 57
diff changeset
30 void use(Tool tool) {
c63719604adb Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents: 57
diff changeset
31 assert(_grabbedTool is null);
c63719604adb Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents: 57
diff changeset
32 message("using new tool: %s", tool.name);
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 60
diff changeset
33 _staticTools ~= tool;
60
e64baac3efb2 Attempt at a templatised palette
David Bryant <bagnose@gmail.com>
parents: 58
diff changeset
34 _observer.toolChanged(tool);
7
936feb16eed4 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 6
diff changeset
35 }
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
diff changeset
36
36
188397ef9a12 Late night tinkering
David Bryant <bagnose@gmail.com>
parents: 28
diff changeset
37 // Layer overrides:
188397ef9a12 Late night tinkering
David Bryant <bagnose@gmail.com>
parents: 28
diff changeset
38
188397ef9a12 Late night tinkering
David Bryant <bagnose@gmail.com>
parents: 28
diff changeset
39 override Rectangle bounds() const {
188397ef9a12 Late night tinkering
David Bryant <bagnose@gmail.com>
parents: 28
diff changeset
40 return Rectangle();
188397ef9a12 Late night tinkering
David Bryant <bagnose@gmail.com>
parents: 28
diff changeset
41 }
188397ef9a12 Late night tinkering
David Bryant <bagnose@gmail.com>
parents: 28
diff changeset
42
57
9960c4fbd0dd I is for Interface
"David Bryant <bagnose@gmail.com>"
parents: 56
diff changeset
43 override void draw(const IViewport viewport,
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 36
diff changeset
44 in Rectangle pixelDamage, scope Context pixelCr,
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 36
diff changeset
45 in Rectangle modelDamage, scope Context modelCr) const {
56
b190a9d9352e Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 48
diff changeset
46 if (_grabbedTool) {
b190a9d9352e Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 48
diff changeset
47 _grabbedTool.draw(viewport, pixelDamage, pixelCr);
36
188397ef9a12 Late night tinkering
David Bryant <bagnose@gmail.com>
parents: 28
diff changeset
48 }
188397ef9a12 Late night tinkering
David Bryant <bagnose@gmail.com>
parents: 28
diff changeset
49 }
188397ef9a12 Late night tinkering
David Bryant <bagnose@gmail.com>
parents: 28
diff changeset
50
188397ef9a12 Late night tinkering
David Bryant <bagnose@gmail.com>
parents: 28
diff changeset
51 // EventHandler overrides:
188397ef9a12 Late night tinkering
David Bryant <bagnose@gmail.com>
parents: 28
diff changeset
52
58
c63719604adb Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents: 57
diff changeset
53 bool handleButtonPress(scope IViewport viewport, in ButtonEvent event) {
14
0b7e7d43a79d Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 12
diff changeset
54 // writefln("%s", event);
7
936feb16eed4 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 6
diff changeset
55
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 36
diff changeset
56 if (_grabbedTool is null) {
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 60
diff changeset
57 foreach_reverse(ref tool; _staticTools) {
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 36
diff changeset
58 if (tool.handleButtonPress(viewport, event)) {
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 60
diff changeset
59 _grabbedTool = tool;
58
c63719604adb Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents: 57
diff changeset
60 _grabbedButton = event.buttonName;
7
936feb16eed4 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 6
diff changeset
61 break;
936feb16eed4 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 6
diff changeset
62 }
936feb16eed4 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 6
diff changeset
63 }
936feb16eed4 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 6
diff changeset
64 }
936feb16eed4 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 6
diff changeset
65 else {
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 36
diff changeset
66 _grabbedTool.handleButtonPress(viewport, event);
7
936feb16eed4 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 6
diff changeset
67 }
936feb16eed4 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 6
diff changeset
68
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
diff changeset
69 return true;
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
diff changeset
70 }
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
diff changeset
71
58
c63719604adb Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents: 57
diff changeset
72 bool handleButtonRelease(scope IViewport viewport, in ButtonEvent event) {
14
0b7e7d43a79d Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 12
diff changeset
73 // writefln("%s", event);
7
936feb16eed4 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 6
diff changeset
74
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 36
diff changeset
75 if (_grabbedTool !is null) {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 36
diff changeset
76 _grabbedTool.handleButtonRelease(viewport, event);
7
936feb16eed4 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 6
diff changeset
77
58
c63719604adb Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents: 57
diff changeset
78 if (_grabbedButton == event.buttonName) {
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 36
diff changeset
79 _grabbedTool = null;
7
936feb16eed4 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 6
diff changeset
80 }
936feb16eed4 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 6
diff changeset
81 }
936feb16eed4 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 6
diff changeset
82
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
diff changeset
83 return true;
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
diff changeset
84 }
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
diff changeset
85
58
c63719604adb Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents: 57
diff changeset
86 bool handleKeyPress(scope IViewport viewport, in KeyEvent event) {
14
0b7e7d43a79d Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 12
diff changeset
87 // writefln("%s", event);
0b7e7d43a79d Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 12
diff changeset
88
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 60
diff changeset
89 // FIXME not sure how these should work
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 60
diff changeset
90 foreach_reverse(ref tool; _staticTools) {
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 60
diff changeset
91 if (tool.handleKeyPress(viewport, event)) {
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 60
diff changeset
92 break;
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 60
diff changeset
93 }
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 60
diff changeset
94 }
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 60
diff changeset
95
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
diff changeset
96 return true;
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
diff changeset
97 }
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
diff changeset
98
58
c63719604adb Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents: 57
diff changeset
99 bool handleKeyRelease(scope IViewport viewport, in KeyEvent event) {
14
0b7e7d43a79d Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 12
diff changeset
100 // writefln("%s", event);
0b7e7d43a79d Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 12
diff changeset
101
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 60
diff changeset
102 // FIXME not sure how these should work
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 60
diff changeset
103 foreach_reverse(ref tool; _staticTools) {
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 60
diff changeset
104 if (tool.handleKeyRelease(viewport, event)) {
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 60
diff changeset
105 break;
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 60
diff changeset
106 }
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 60
diff changeset
107 }
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 60
diff changeset
108
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
diff changeset
109 return true;
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
diff changeset
110 }
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
diff changeset
111
58
c63719604adb Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents: 57
diff changeset
112 bool handleMotion(scope IViewport viewport, in MotionEvent event) {
17
c643c04e3f5e Checkpoint
David Bryant <daveb@acres.com.au>
parents: 16
diff changeset
113 //writefln("%s", event);
7
936feb16eed4 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 6
diff changeset
114
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 36
diff changeset
115 if (_grabbedTool is null) {
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 60
diff changeset
116 foreach_reverse(ref tool; _staticTools) {
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 36
diff changeset
117 if (tool.handleMotion(viewport, event)) {
7
936feb16eed4 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 6
diff changeset
118 break;
936feb16eed4 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 6
diff changeset
119 }
936feb16eed4 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 6
diff changeset
120 }
936feb16eed4 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 6
diff changeset
121 }
936feb16eed4 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 6
diff changeset
122 else {
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 36
diff changeset
123 _grabbedTool.handleMotion(viewport, event);
7
936feb16eed4 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 6
diff changeset
124 }
936feb16eed4 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 6
diff changeset
125
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
diff changeset
126 return true;
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
diff changeset
127 }
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
diff changeset
128
58
c63719604adb Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents: 57
diff changeset
129 bool handleScroll(scope IViewport viewport, in ScrollEvent event) {
14
0b7e7d43a79d Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 12
diff changeset
130 // writefln("%s", event);
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
diff changeset
131
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 36
diff changeset
132 if (_grabbedTool is null) {
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 60
diff changeset
133 foreach_reverse(ref tool; _staticTools) {
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 36
diff changeset
134 if (tool.handleScroll(viewport, event)) {
7
936feb16eed4 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 6
diff changeset
135 break;
936feb16eed4 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 6
diff changeset
136 }
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
diff changeset
137 }
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
diff changeset
138 }
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
diff changeset
139 else {
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 36
diff changeset
140 _grabbedTool.handleScroll(viewport, event);
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
diff changeset
141 }
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
diff changeset
142
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
diff changeset
143 return true;
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
diff changeset
144 }
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
diff changeset
145
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
diff changeset
146 private {
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 60
diff changeset
147 Tool[] _staticTools;
58
c63719604adb Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents: 57
diff changeset
148 IToolStackObserver _observer;
c63719604adb Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents: 57
diff changeset
149
63
20d6327c4a75 Event progress. Got key press/release working and panning via keyboard.
daveb
parents: 60
diff changeset
150 Tool _grabbedTool;
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 36
diff changeset
151 ButtonName _grabbedButton;
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
diff changeset
152 }
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
diff changeset
153 }