Mercurial > projects > doodle
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 |
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 | 3 public { |
4 import doodle.dia.tool; | |
5 } | |
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 | 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 | 35 } |
2
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
diff
changeset
|
36 |
36 | 37 // Layer overrides: |
38 | |
39 override Rectangle bounds() const { | |
40 return Rectangle(); | |
41 } | |
42 | |
57 | 43 override void draw(const IViewport viewport, |
48 | 44 in Rectangle pixelDamage, scope Context pixelCr, |
45 in Rectangle modelDamage, scope Context modelCr) const { | |
56 | 46 if (_grabbedTool) { |
47 _grabbedTool.draw(viewport, pixelDamage, pixelCr); | |
36 | 48 } |
49 } | |
50 | |
51 // EventHandler overrides: | |
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 | 54 // writefln("%s", event); |
7 | 55 |
48 | 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 | 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 | 61 break; |
62 } | |
63 } | |
64 } | |
65 else { | |
48 | 66 _grabbedTool.handleButtonPress(viewport, event); |
7 | 67 } |
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 | 73 // writefln("%s", event); |
7 | 74 |
48 | 75 if (_grabbedTool !is null) { |
76 _grabbedTool.handleButtonRelease(viewport, event); | |
7 | 77 |
58
c63719604adb
Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents:
57
diff
changeset
|
78 if (_grabbedButton == event.buttonName) { |
48 | 79 _grabbedTool = null; |
7 | 80 } |
81 } | |
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 | 87 // writefln("%s", event); |
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 | 100 // writefln("%s", event); |
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 | 113 //writefln("%s", event); |
7 | 114 |
48 | 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 | 117 if (tool.handleMotion(viewport, event)) { |
7 | 118 break; |
119 } | |
120 } | |
121 } | |
122 else { | |
48 | 123 _grabbedTool.handleMotion(viewport, event); |
7 | 124 } |
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 | 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 | 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 | 134 if (tool.handleScroll(viewport, event)) { |
7 | 135 break; |
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 | 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 | 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 } |