Skip to content

Commit c1cddd3

Browse files
committed
Allow show/hide actors in editor.
1 parent 4bf8835 commit c1cddd3

File tree

5 files changed

+153
-37
lines changed

5 files changed

+153
-37
lines changed

adventure-editor/src/main/java/com/bladecoder/engineeditor/model/Project.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.io.FileReader;
2424
import java.io.IOException;
2525
import java.util.ArrayList;
26+
import java.util.HashSet;
2627
import java.util.List;
2728
import java.util.Properties;
2829

@@ -108,6 +109,7 @@ public class Project extends PropertyChange {
108109
private String selectedFA;
109110
private boolean modified = false;
110111
private final World world = new World();
112+
private final HashSet<String> hidenActors = new HashSet<>();
111113

112114
public Project() {
113115
loadConfig();
@@ -548,4 +550,20 @@ public void saveGradleProperties(OrderedProperties prop, File projectPath) throw
548550

549551
prop.store(os, null);
550552
}
553+
554+
public void toggleEditorVisibility(BaseActor a) {
555+
String name = a.getInitScene() + "." + a.getId();
556+
557+
if (hidenActors.contains(name)) {
558+
hidenActors.remove(name);
559+
} else {
560+
hidenActors.add(name);
561+
}
562+
}
563+
564+
public boolean isEditorVisible(BaseActor a) {
565+
String name = a.getInitScene() + "." + a.getId();
566+
567+
return !hidenActors.contains(name);
568+
}
551569
}

adventure-editor/src/main/java/com/bladecoder/engineeditor/scneditor/CanvasDrawer.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@ public void drawBBoxActors(Scene scn, boolean showSpriteBounds) {
6161

6262
for (BaseActor a : scn.getActors().values()) {
6363

64+
if (!Ctx.project.isEditorVisible(a))
65+
continue;
66+
6467
Polygon p = a.getBBox();
6568

6669
if (p == null) {
@@ -74,8 +77,8 @@ public void drawBBoxActors(Scene scn, boolean showSpriteBounds) {
7477
drawer.polygon(p.getTransformedVertices());
7578
} else if (a instanceof InteractiveActor) {
7679
InteractiveActor iActor = (InteractiveActor) a;
77-
78-
if(a instanceof SpriteActor && !showSpriteBounds)
80+
81+
if (a instanceof SpriteActor && !showSpriteBounds)
7982
continue;
8083

8184
if (!scn.getLayer(iActor.getLayer()).isVisible())
@@ -84,7 +87,7 @@ public void drawBBoxActors(Scene scn, boolean showSpriteBounds) {
8487
drawer.setColor(Scene.ACTOR_BBOX_COLOR);
8588
if (p.getTransformedVertices().length > 2)
8689
drawer.polygon(p.getTransformedVertices());
87-
} else if (a instanceof WalkZoneActor) {
90+
} else if (a instanceof WalkZoneActor) {
8891
drawer.setColor(Scene.WALKZONE_COLOR);
8992
if (p.getTransformedVertices().length > 2)
9093
drawer.polygon(p.getTransformedVertices());

adventure-editor/src/main/java/com/bladecoder/engineeditor/scneditor/ScnWidget.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ public void draw(Batch batch, float parentAlpha) {
285285
List<InteractiveActor> actors = layer.getActors();
286286

287287
for (InteractiveActor a : actors) {
288-
if (a instanceof SpriteActor) {
288+
if (a instanceof SpriteActor && Ctx.project.isEditorVisible(a)) {
289289
boolean visibility = a.isVisible();
290290
a.setVisible(true);
291291
((SpriteActor) a).draw(sceneBatch);

adventure-editor/src/main/java/com/bladecoder/engineeditor/scneditor/ScnWidgetInputListener.java

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,11 @@
2828
import com.bladecoder.engine.model.AnchorActor;
2929
import com.bladecoder.engine.model.BaseActor;
3030
import com.bladecoder.engine.model.InteractiveActor;
31+
import com.bladecoder.engine.model.ObstacleActor;
3132
import com.bladecoder.engine.model.Scene;
33+
import com.bladecoder.engine.model.SceneLayer;
3234
import com.bladecoder.engine.model.SpriteActor;
35+
import com.bladecoder.engine.model.WalkZoneActor;
3336
import com.bladecoder.engine.util.PolygonUtils;
3437
import com.bladecoder.engineeditor.Ctx;
3538
import com.bladecoder.engineeditor.common.EditorLogger;
@@ -199,7 +202,7 @@ public boolean touchDown(InputEvent event, float x, float y, int pointer, int bu
199202
}
200203

201204
// CHECK FOR CLICK INSIDE ACTOR TO CHANGE SELECTION
202-
BaseActor a = scn.getActorAt(p.x, p.y);
205+
BaseActor a = getActorAt(scn, p.x, p.y);
203206

204207
if (a != null && a != selActor) {
205208
selActor = a;
@@ -463,4 +466,52 @@ public void enter(InputEvent event, float x, float y, int pointer,
463466
scnWidget.getStage().setKeyboardFocus(scnWidget);
464467
}
465468

469+
/**
470+
* Returns the actor at the position. Including not interactive actors.
471+
*/
472+
private BaseActor getActorAt(Scene s, float x, float y) {
473+
474+
// 1. Search for ANCHOR Actors
475+
for (BaseActor a : s.getActors().values()) {
476+
if (a instanceof AnchorActor && Ctx.project.isEditorVisible(a)) {
477+
float dst = Vector2.dst(x, y, a.getX(), a.getY());
478+
479+
if (dst < Scene.ANCHOR_RADIUS)
480+
return a;
481+
}
482+
}
483+
484+
// 2. Search for INTERACTIVE Actors
485+
for (SceneLayer layer : s.getLayers()) {
486+
487+
if (!layer.isVisible())
488+
continue;
489+
490+
// Obtain actors in reverse (close to camera)
491+
for (int i = layer.getActors().size() - 1; i >= 0; i--) {
492+
BaseActor a = layer.getActors().get(i);
493+
494+
if (a.hit(x, y) && Ctx.project.isEditorVisible(a)) {
495+
return a;
496+
}
497+
}
498+
}
499+
500+
// 3. Search for OBSTACLE actors
501+
for (BaseActor a : s.getActors().values()) {
502+
if (a instanceof ObstacleActor && a.hit(x, y) && Ctx.project.isEditorVisible(a)) {
503+
return a;
504+
}
505+
}
506+
507+
// 4. Search for WALKZONE actors
508+
for (BaseActor a : s.getActors().values()) {
509+
if (a instanceof WalkZoneActor && a.hit(x, y) && Ctx.project.isEditorVisible(a)) {
510+
return a;
511+
}
512+
}
513+
514+
return null;
515+
}
516+
466517
}

adventure-editor/src/main/java/com/bladecoder/engineeditor/ui/ActorList.java

Lines changed: 76 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import java.beans.PropertyChangeEvent;
1919
import java.beans.PropertyChangeListener;
20+
import java.text.MessageFormat;
2021
import java.util.Arrays;
2122

2223
import com.badlogic.gdx.graphics.g2d.TextureRegion;
@@ -51,13 +52,32 @@
5152
public class ActorList extends ModelList<Scene, BaseActor> {
5253

5354
private ImageButton playerBtn;
55+
private ImageButton visibilityBtn;
5456

5557
public ActorList(Skin skin) {
5658
super(skin, true);
5759

60+
// Eye button
61+
visibilityBtn = new ImageButton(skin);
62+
toolbar.addToolBarButton(visibilityBtn, "ic_eye", "Toggle Visibility", "Toggle Visibility in editor");
63+
visibilityBtn.setDisabled(false);
64+
visibilityBtn.addListener(new ChangeListener() {
65+
@Override
66+
public void changed(ChangeEvent event, Actor actor) {
67+
toggleVisibility();
68+
}
69+
});
70+
71+
// Player button
5872
playerBtn = new ImageButton(skin);
5973
toolbar.addToolBarButton(playerBtn, "ic_player_small", "Set player", "Set player");
6074
playerBtn.setDisabled(true);
75+
playerBtn.addListener(new ChangeListener() {
76+
@Override
77+
public void changed(ChangeEvent event, Actor actor) {
78+
setPlayer();
79+
}
80+
});
6181

6282
list.addListener(new ChangeListener() {
6383

@@ -78,13 +98,6 @@ public void changed(ChangeEvent event, Actor actor) {
7898
}
7999
});
80100

81-
playerBtn.addListener(new ChangeListener() {
82-
@Override
83-
public void changed(ChangeEvent event, Actor actor) {
84-
setPlayer();
85-
}
86-
});
87-
88101
list.setCellRenderer(listCellRenderer);
89102

90103
Ctx.project.addPropertyChangeListener(Project.NOTIFY_ACTOR_SELECTED, new PropertyChangeListener() {
@@ -107,11 +120,11 @@ public void propertyChange(PropertyChangeEvent e) {
107120
}
108121

109122
int i = list.getItems().indexOf(newActor, true);
110-
123+
111124
if (i >= 0) {
112125
list.setSelectedIndex(i);
113-
114-
container.getActor().setScrollPercentY(i/(float)list.getItems().size);
126+
127+
container.getActor().setScrollPercentY(i / (float) list.getItems().size);
115128
}
116129
}
117130
});
@@ -122,19 +135,29 @@ public void propertyChange(PropertyChangeEvent evt) {
122135

123136
if (evt.getPropertyName().equals(Project.NOTIFY_ELEMENT_DELETED)) {
124137
if (evt.getNewValue() instanceof BaseActor) {
125-
addElements(Ctx.project.getSelectedScene(),
126-
Arrays.asList(Ctx.project.getSelectedScene().getActors().values().toArray(new BaseActor[0])));
138+
addElements(Ctx.project.getSelectedScene(), Arrays
139+
.asList(Ctx.project.getSelectedScene().getActors().values().toArray(new BaseActor[0])));
127140
}
128141
} else if (evt.getPropertyName().equals(Project.NOTIFY_ELEMENT_CREATED)) {
129142
if (evt.getNewValue() instanceof BaseActor && !(evt.getSource() instanceof EditActorDialog)) {
130-
addElements(Ctx.project.getSelectedScene(),
131-
Arrays.asList(Ctx.project.getSelectedScene().getActors().values().toArray(new BaseActor[0])));
143+
addElements(Ctx.project.getSelectedScene(), Arrays
144+
.asList(Ctx.project.getSelectedScene().getActors().values().toArray(new BaseActor[0])));
132145
}
133146
}
134147
}
135148
});
136149
}
137150

151+
private void toggleVisibility() {
152+
153+
BaseActor e = list.getSelected();
154+
155+
if (e == null)
156+
return;
157+
158+
Ctx.project.toggleEditorVisibility(e);
159+
}
160+
138161
@Override
139162
protected void delete() {
140163
BaseActor a = removeSelected();
@@ -145,8 +168,8 @@ protected void delete() {
145168
if (parent.getPlayer() == a) {
146169
parent.setPlayer(null);
147170
}
148-
149-
if(a.getId().equals(parent.getWalkZone())) {
171+
172+
if (a.getId().equals(parent.getWalkZone())) {
150173
parent.setWalkZone(null);
151174
}
152175

@@ -163,7 +186,7 @@ protected void delete() {
163186
protected EditModelDialog<Scene, BaseActor> getEditElementDialogInstance(BaseActor a) {
164187
return new EditActorDialog(skin, parent, a);
165188
}
166-
189+
167190
@Override
168191
protected void edit() {
169192
BaseActor e = list.getSelected();
@@ -173,20 +196,21 @@ protected void edit() {
173196

174197
EditModelDialog<Scene, BaseActor> dialog = getEditElementDialogInstance(e);
175198
dialog.show(getStage());
176-
199+
177200
dialog.setListener(new ChangeListener() {
178201
@SuppressWarnings("unchecked")
179202
@Override
180203
public void changed(ChangeEvent event, Actor actor) {
181204
BaseActor e = ((EditModelDialog<Scene, BaseActor>) actor).getElement();
182-
183-
// When the type is changed, a new element is created and it is needed to replace the previous element.
184-
if(e != list.getSelected()) {
205+
206+
// When the type is changed, a new element is created and it is needed to
207+
// replace the previous element.
208+
if (e != list.getSelected()) {
185209
int i = list.getSelectedIndex();
186210
getItems().set(i, e);
187211
list.setSelectedIndex(i);
188-
list.invalidateHierarchy();
189-
}
212+
list.invalidateHierarchy();
213+
}
190214
}
191215
});
192216
}
@@ -233,8 +257,8 @@ protected void paste() {
233257

234258
parent.addActor(newElement);
235259
Ctx.project.getI18N().extractStrings(parent.getId(), newElement);
236-
237-
if(newElement instanceof SpriteActor) {
260+
261+
if (newElement instanceof SpriteActor) {
238262
SpriteActor ia = (SpriteActor) newElement;
239263
ia.loadAssets();
240264
EngineAssetManager.getInstance().finishLoading();
@@ -254,18 +278,38 @@ protected void paste() {
254278

255279
@Override
256280
protected String getCellTitle(BaseActor e) {
257-
return e.getId();
281+
boolean enabled = Ctx.project.isEditorVisible(e);
282+
283+
String text = e.getId();
284+
285+
if (!enabled) {
286+
text = MessageFormat.format("[GRAY]{0}[]", text);
287+
}
288+
289+
return text;
258290
}
259291

260292
@Override
261293
protected String getCellSubTitle(BaseActor e) {
262-
if (e instanceof SpriteActor && ((SpriteActor) e).getRenderer() instanceof TextRenderer && ((TextRenderer) ((SpriteActor) e).getRenderer()).getText() != null)
263-
return Ctx.project.translate(((TextRenderer) ((SpriteActor) e).getRenderer()).getText()).replace("\n", "|");
264-
265-
if (e instanceof InteractiveActor)
266-
return Ctx.project.translate(((InteractiveActor) e).getDesc());
294+
boolean enabled = Ctx.project.isEditorVisible(e);
295+
296+
String text = "";
297+
298+
if (e instanceof SpriteActor && ((SpriteActor) e).getRenderer() instanceof TextRenderer
299+
&& ((TextRenderer) ((SpriteActor) e).getRenderer()).getText() != null) {
300+
text = Ctx.project.translate(((TextRenderer) ((SpriteActor) e).getRenderer()).getText()).replace("\n",
301+
"|");
302+
}
303+
304+
if (e instanceof InteractiveActor) {
305+
text = Ctx.project.translate(((InteractiveActor) e).getDesc());
306+
}
307+
308+
if (!enabled && text != null && !text.isEmpty()) {
309+
text = MessageFormat.format("[GRAY]{0}[]", text);
310+
}
267311

268-
return "";
312+
return text;
269313
}
270314

271315
@Override

0 commit comments

Comments
 (0)