1
1
package com .bwyap .engine .gui .element .base ;
2
2
3
3
import java .util .ArrayList ;
4
+ import java .util .Collections ;
5
+ import java .util .HashMap ;
6
+ import java .util .Iterator ;
4
7
import java .util .List ;
8
+ import java .util .Map ;
5
9
6
10
import com .bwyap .engine .gui .element .properties .VectorShapeColourProperties ;
7
11
import com .bwyap .engine .gui .interfaces .GUIBoundsInterface ;
18
22
* @author bwyap
19
23
*
20
24
*/
21
- public abstract class Panel extends SelectableElement implements IColouredVectorShape {
25
+ public abstract class Panel extends SelectableElement implements IColouredVectorShape , Iterable <GUIElementInterface >, Iterator <GUIElementInterface > {
26
+
27
+ protected static final int DEFAULT_PRIORITY = 100 ;
22
28
23
- protected List <GUIElementInterface > elements ;
24
29
protected final VectorShapeColourProperties colours ;
25
-
30
+
26
31
private boolean renderShape ;
27
32
private boolean clip ;
28
33
34
+ // Use a hash map to keep track of GUI elements with given priorities
35
+ private final Map <Integer , List <GUIElementInterface >> elements ;
36
+
37
+ // Auxiliary variables for keeping track of GUI elements with given priorities
38
+ private int elementCount = 0 ;
39
+ private int iteratorNext = 0 ;
40
+ private boolean elementsModified = false ;
41
+ private List <GUIElementInterface > sortedElements ;
42
+
29
43
30
44
public Panel (float x , float y , float width , float height ) {
31
45
super (x , y , width , height );
32
46
colours = new VectorShapeColourProperties ();
33
- elements = new ArrayList <GUIElementInterface >();
34
47
renderShape = true ;
35
48
clip = true ;
49
+
50
+ elements = new HashMap <Integer , List <GUIElementInterface >>();
51
+ sortedElements = new ArrayList <GUIElementInterface >();
36
52
}
37
53
38
54
@@ -43,43 +59,73 @@ public VectorShapeColourProperties colourProperties() {
43
59
44
60
45
61
/**
46
- * Add an element to the panel at the given co-ordinates.
47
- * Co-ordinates are relative to the panel.
62
+ * Add an element to the panel at the given co-ordinates
63
+ * with the default priority. Co-ordinates are relative to the panel.
48
64
* @param e
49
65
*/
50
66
public void addElement (GUIElementInterface e , float x , float y ) {
51
67
e .setPosition (x , y );
52
- elements .add (e );
68
+ addElement (DEFAULT_PRIORITY , e );
69
+ }
70
+
71
+ /**
72
+ * Add an element to the panel at the given co-ordinates
73
+ * with the specified priority. Co-ordinates are relative to the panel.
74
+ * @param e
75
+ */
76
+ public void addElement (int priority , GUIElementInterface e , float x , float y ) {
77
+ e .setPosition (x , y );
78
+ addElement (priority , e );
53
79
}
54
80
55
81
56
82
/**
57
- * Add an element to the panel.
83
+ * Add an element to the panel with the default priority (100) .
58
84
* @param e
59
85
*/
60
86
public void addElement (GUIElementInterface e ) {
61
- elements . add ( e );
87
+ addElement ( DEFAULT_PRIORITY , e );
62
88
}
63
89
64
90
65
91
/**
66
- * Removes an element from the panel.
92
+ * Add an element to the panel with the specified priority.
93
+ * @param priority
67
94
* @param e
68
- * @return
69
95
*/
70
- public boolean removeElement (GUIElementInterface e ) {
71
- return elements .remove (e );
96
+ public void addElement (int priority , GUIElementInterface e ) {
97
+ elementsModified = true ;
98
+ elementCount ++;
99
+ if (elements .containsKey (priority )) {
100
+ elements .get (priority ).add (e );
101
+ }
102
+ else {
103
+ List <GUIElementInterface > list = new ArrayList <GUIElementInterface >();
104
+ list .add (e );
105
+ elements .put (priority , list );
106
+ }
72
107
}
73
108
74
109
110
+
75
111
/**
76
- * Get the GUI elements in this panel
112
+ * Removes an element from the panel.
113
+ * @param e
77
114
* @return
78
115
*/
79
- public List <GUIElementInterface > getElements () {
80
- return elements ;
116
+ public boolean removeElement (GUIElementInterface e ) {
117
+ elementsModified = true ;
118
+ elementCount --;
119
+
120
+ // Find the element and remove it
121
+ for (int k : elements .keySet ()) {
122
+ if (elements .get (k ).contains (e )) {
123
+ return elements .get (k ).remove (e );
124
+ }
125
+ }
126
+ return false ;
81
127
}
82
-
128
+
83
129
84
130
/**
85
131
* Set whether the panel should clip all GUI
@@ -123,47 +169,75 @@ public void onHandleInput(InputHandler input, GUIBoundsInterface bounds) {
123
169
setSelected (false );
124
170
}
125
171
126
- for (GUIElementInterface e : elements ) {
127
- e .handleInput (input , this );
128
- }
172
+ Iterator <GUIElementInterface > it = iterator ();
173
+ while (it .hasNext ()) {
174
+ it .next ().handleInput (input , bounds );
175
+ }
129
176
}
130
177
131
178
132
179
@ Override
133
180
public final void update (float timestep ) {
134
- for (GUIElementInterface e : elements ) {
135
- e .update (timestep );
181
+ Iterator <GUIElementInterface > it = iterator ();
182
+ while (it .hasNext ()) {
183
+ it .next ().update (timestep );
136
184
}
137
185
onUpdate (timestep );
138
186
}
139
187
188
+
189
+ @ Override
190
+ public Iterator <GUIElementInterface > iterator () {
191
+ iteratorNext = 0 ;
192
+
193
+ // Sort element order if new element has been added
194
+ if (elementsModified ) {
195
+ elementsModified = false ;
196
+ List <Integer > keys = new ArrayList <Integer >(elements .keySet ());
197
+
198
+ Collections .sort (keys , Collections .reverseOrder ());
199
+
200
+ sortedElements .clear ();
201
+ for (int k : keys ) {
202
+ sortedElements .addAll (elements .get (k ));
203
+ }
204
+ }
205
+ return this ;
206
+ }
207
+
208
+
209
+ @ Override
210
+ public boolean hasNext () {
211
+ return iteratorNext < elementCount ;
212
+ }
213
+
214
+
215
+ @ Override
216
+ public GUIElementInterface next () {
217
+ return sortedElements .get (iteratorNext ++);
218
+ }
219
+
140
220
141
221
/**
142
222
* Override this method for custom update functionality
143
223
* @param timestep
144
224
*/
145
- public void onUpdate (float timestep ) {
146
-
147
- }
225
+ public void onUpdate (float timestep ) { }
148
226
149
227
150
228
/**
151
229
* Override this method for custom onSelect functionality
152
230
* @param timestep
153
231
*/
154
232
@ Override
155
- public void onSelect () {
156
-
157
- }
233
+ public void onSelect () { }
158
234
159
235
160
236
/**
161
237
* Override this method for custom onDeselect functionality
162
238
* @param timestep
163
239
*/
164
240
@ Override
165
- public void onDeselect () {
166
-
167
- }
241
+ public void onDeselect () { }
168
242
169
243
}
0 commit comments