Skip to content

Commit a0a0ebd

Browse files
committed
Editor validations when creating verbs and animations.
1 parent 5ebab5f commit a0a0ebd

File tree

4 files changed

+126
-81
lines changed

4 files changed

+126
-81
lines changed

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,8 +381,14 @@ protected void ok() {
381381
FilteredSelectBox<String> cb = (FilteredSelectBox<String>) id.getField();
382382

383383
if (e == null && cb.getSelectedIndex() == 0) {
384+
AnimationRenderer renderer = (AnimationRenderer) parent.getRenderer();
385+
384386
for (int i = 1; i < cb.getItems().size; i++) {
385387
cb.setSelectedIndex(i);
388+
389+
if (renderer.getAnimations().get(id.getText()) != null)
390+
continue;
391+
386392
inputsToModel(true);
387393
// doc.setId(e, cb.getItems().get(i));
388394

@@ -486,4 +492,17 @@ protected void modelToInputs() {
486492
}
487493
}
488494

495+
@Override
496+
protected boolean validateFields() {
497+
AnimationRenderer renderer = (AnimationRenderer) parent.getRenderer();
498+
HashMap<String, AnimationDesc> animations = renderer.getAnimations();
499+
500+
if ((e == null && animations.get(id.getText()) != null)
501+
|| (e != null && animations.get(id.getText()) != null && !e.id.equals(id.getText()))) {
502+
id.setError(true);
503+
return false;
504+
}
505+
506+
return super.validateFields();
507+
}
489508
}

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

Lines changed: 63 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import com.bladecoder.engine.actions.Param.Type;
2626
import com.bladecoder.engine.model.Verb;
2727
import com.bladecoder.engine.model.VerbManager;
28+
import com.bladecoder.engine.util.ActionUtils;
2829
import com.bladecoder.engineeditor.Ctx;
2930
import com.bladecoder.engineeditor.ui.panels.EditModelDialog;
3031
import com.bladecoder.engineeditor.ui.panels.EditableSelectBox;
@@ -34,11 +35,10 @@
3435
import com.bladecoder.engineeditor.ui.panels.ScopePanel;
3536

3637
public class EditVerbDialog extends EditModelDialog<VerbManager, Verb> {
37-
private static final String VERBS[] = { "lookat", "pickup", "talkto", "use",
38-
"leave", "action", "enter", "exit" };
38+
private static final String VERBS[] = { "lookat", "pickup", "talkto", "use", "leave", "action", "enter", "exit" };
3939

4040
private static final String SCENE_VERBS[] = { "init", "test" };
41-
41+
4242
private static final String DEFAULT_DESC = "Verbs are used to create the game interaction. Select or write the verb to create";
4343
private static final String CUSTOM_VERB_DESC = "User defined verbs can be called\n from dialogs or inside other verbs using \nthe 'run_verb' action";
4444

@@ -50,59 +50,52 @@ public class EditVerbDialog extends EditModelDialog<VerbManager, Verb> {
5050
"Called when the user clicks\n in an exit zone in scene",
5151
"Called when the user clicks in the actor. Useful for one click actions. Doesn't show the verb menu.",
5252
"Called when the player enters\n in the object bounding box",
53-
"Called when the player exits\n the object bounding box"};
53+
"Called when the player exits\n the object bounding box" };
54+
55+
private static final String SCENE_VERBS_INFO[] = { "Called every time\n that the scene is loaded",
56+
"Called every time\n that the scene is loaded in test mode.\n'test' verb is called before the 'init' verb" };
5457

55-
private static final String SCENE_VERBS_INFO[] = {
56-
"Called every time\n that the scene is loaded",
57-
"Called every time\n that the scene is loaded in test mode.\n'test' verb is called before the 'init' verb"};
58-
5958
private InputPanel id;
6059
private InputPanel state;
6160
private InputPanel target;
6261
private InputPanel icon;
63-
62+
6463
private String scope;
6564

66-
public EditVerbDialog(Skin skin, String scope, VerbManager parentElement,
67-
Verb e) {
65+
public EditVerbDialog(Skin skin, String scope, VerbManager parentElement, Verb e) {
6866
super(skin);
69-
67+
7068
this.scope = scope;
71-
72-
id = InputPanelFactory.createInputPanel(skin, "Verb ID",
73-
"Select the verb to create.", Type.EDITABLE_OPTION, true,
74-
"", ScopePanel.SCENE_SCOPE.equals(scope) ? SCENE_VERBS : VERBS);
75-
state = InputPanelFactory.createInputPanel(skin, "State",
76-
"Select the state.");
77-
target = InputPanelFactory.createInputPanel(skin,
78-
"Target BaseActor",
69+
70+
id = InputPanelFactory.createInputPanel(skin, "Verb ID", "Select the verb to create.", Type.EDITABLE_OPTION,
71+
true, "", ScopePanel.SCENE_SCOPE.equals(scope) ? SCENE_VERBS : VERBS);
72+
state = InputPanelFactory.createInputPanel(skin, "State", "Select the state.");
73+
target = InputPanelFactory.createInputPanel(skin, "Target BaseActor",
7974
"Select the target actor id for the 'use' verb.");
80-
81-
icon = InputPanelFactory.createInputPanel(skin,
82-
"UI Icon",
75+
76+
icon = InputPanelFactory.createInputPanel(skin, "UI Icon",
8377
"The icon that will be showed in the ui for selecting the verb.");
8478

8579
if (ScopePanel.SCENE_SCOPE.equals(scope))
8680
setInfo(SCENE_VERBS_INFO[0]);
8781
else
8882
setInfo(VERBS_INFO[0]);
8983

90-
id.getField()
91-
.addListener(new ChangeListener() {
84+
id.getField().addListener(new ChangeListener() {
85+
86+
@Override
87+
public void changed(ChangeEvent event, Actor actor) {
88+
updateDesc();
89+
}
9290

93-
@Override
94-
public void changed(ChangeEvent event, Actor actor) {
95-
updateDesc();
96-
}
91+
});
9792

98-
});
99-
100-
((EditableSelectBox<?>)id.getField()).getInput().setTextFieldListener(new TextFieldListener() {
93+
((EditableSelectBox<?>) id.getField()).getInput().setTextFieldListener(new TextFieldListener() {
10194
@Override
10295
public void keyTyped(TextField actor, char c) {
10396
updateDesc();
10497
}
105-
});
98+
});
10699

107100
init(parentElement, e, new InputPanel[] { id, state, target, icon });
108101

@@ -114,25 +107,24 @@ public void keyTyped(TextField actor, char c) {
114107
if (id.equals("use"))
115108
setVisible(target, true);
116109
}
117-
110+
118111
updateDesc();
119112
}
120-
113+
121114
private void updateDesc() {
122-
String idStr = (String) id.getText();
123-
int i = ((OptionsInputPanel) id)
124-
.getSelectedIndex();
115+
String idStr = id.getText();
116+
int i = ((OptionsInputPanel) id).getSelectedIndex();
125117

126-
if(i == -1) {
127-
if(idStr != null && idStr.isEmpty())
118+
if (i == -1) {
119+
if (idStr != null && idStr.isEmpty())
128120
setInfo(DEFAULT_DESC);
129121
else
130122
setInfo(CUSTOM_VERB_DESC);
131123
} else {
132124
if (ScopePanel.SCENE_SCOPE.equals(scope)) {
133125
setInfo(SCENE_VERBS_INFO[i]);
134126
} else {
135-
setInfo(VERBS_INFO[i]);
127+
setInfo(VERBS_INFO[i]);
136128
}
137129
}
138130

@@ -141,26 +133,25 @@ private void updateDesc() {
141133
else
142134
setVisible(target, false);
143135

144-
pack();
145-
}
136+
pack();
137+
}
146138

147139
@Override
148140
protected void inputsToModel(boolean create) {
149-
150-
if(create) {
141+
142+
if (create) {
151143
e = new Verb();
152144
} else {
153145
HashMap<String, Verb> verbs = parent.getVerbs();
154146
verbs.remove(e.getHashKey());
155147
}
156-
148+
157149
e.setId(id.getText());
158150
e.setState(state.getText());
159151
e.setTarget(target.getText());
160152
e.setIcon(icon.getText());
161-
162-
parent.addVerb(e);
163153

154+
parent.addVerb(e);
164155

165156
// TODO UNDO OP
166157
// UndoOp undoOp = new UndoAddElement(doc, e);
@@ -175,5 +166,28 @@ protected void modelToInputs() {
175166
state.setText(e.getState());
176167
target.setText(e.getTarget());
177168
icon.setText(e.getIcon());
178-
}
169+
}
170+
171+
@Override
172+
protected boolean validateFields() {
173+
174+
if (!super.validateFields())
175+
return false;
176+
177+
Verb verb = parent.getVerb(id.getText(), state.getText(), target.getText());
178+
179+
if (verb == null)
180+
return true;
181+
182+
boolean sameParams = verb.getId().equals(id.getText())
183+
&& ActionUtils.compareNullStr(verb.getState(), state.getText())
184+
&& ActionUtils.compareNullStr(verb.getTarget(), target.getText());
185+
186+
if (sameParams && (e == null || verb != e)) {
187+
id.setError(true);
188+
return false;
189+
}
190+
191+
return true;
192+
}
179193
}

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

Lines changed: 38 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import com.bladecoder.engine.model.SpriteActor;
3333
import com.bladecoder.engineeditor.Ctx;
3434
import com.bladecoder.engineeditor.common.ElementUtils;
35+
import com.bladecoder.engineeditor.common.Message;
3536
import com.bladecoder.engineeditor.model.Project;
3637
import com.bladecoder.engineeditor.ui.panels.CellRenderer;
3738
import com.bladecoder.engineeditor.ui.panels.EditModelDialog;
@@ -65,7 +66,7 @@ public void changed(ChangeEvent event, Actor actor) {
6566
String id = null;
6667

6768
if (pos != -1)
68-
id = list.getItems().get(pos).id;
69+
id = list.getItems().get(pos).id;
6970

7071
Ctx.project.setSelectedFA(id);
7172

@@ -88,12 +89,14 @@ public void changed(ChangeEvent event, Actor actor) {
8889
flipInit();
8990
}
9091
});
91-
92+
9293
Ctx.project.addPropertyChangeListener(Project.NOTIFY_ELEMENT_CREATED, new PropertyChangeListener() {
9394
@Override
9495
public void propertyChange(PropertyChangeEvent evt) {
95-
if (evt.getNewValue() instanceof Dialog && !(evt.getSource() instanceof EditDialogDialog) && parent instanceof SpriteActor) {
96-
HashMap<String, AnimationDesc> animations = ((AnimationRenderer)parent.getRenderer()).getAnimations();
96+
if (evt.getNewValue() instanceof Dialog && !(evt.getSource() instanceof EditDialogDialog)
97+
&& parent instanceof SpriteActor) {
98+
HashMap<String, AnimationDesc> animations = ((AnimationRenderer) parent.getRenderer())
99+
.getAnimations();
97100
addElements(parent, Arrays.asList(animations.values().toArray(new AnimationDesc[0])));
98101
}
99102
}
@@ -105,14 +108,14 @@ private void setDefault() {
105108

106109
if (pos == -1)
107110
return;
108-
109-
AnimationRenderer renderer = (AnimationRenderer)((SpriteActor) Ctx.project.getSelectedActor()).getRenderer();
111+
112+
AnimationRenderer renderer = (AnimationRenderer) ((SpriteActor) Ctx.project.getSelectedActor()).getRenderer();
110113

111114
String id = list.getItems().get(pos).id;
112115
String oldId = renderer.getInitAnimation();
113-
116+
114117
renderer.setInitAnimation(id);
115-
118+
116119
Ctx.project.setModified(this, "init_animation", oldId, id);
117120
}
118121

@@ -121,27 +124,27 @@ private void flipInit() {
121124

122125
if (pos == -1)
123126
return;
124-
125-
AnimationRenderer renderer = (AnimationRenderer)((SpriteActor) Ctx.project.getSelectedActor()).getRenderer();
127+
128+
AnimationRenderer renderer = (AnimationRenderer) ((SpriteActor) Ctx.project.getSelectedActor()).getRenderer();
126129

127130
String id = list.getItems().get(pos).id;
128131

129132
String newValue = AnimationRenderer.getFlipId(id);
130133

131134
renderer.setInitAnimation(newValue);
132-
135+
133136
Ctx.project.setModified(this, "init_animation", id, newValue);
134137
}
135138

136139
@Override
137140
protected void delete() {
138141
AnimationDesc d = removeSelected();
139-
140-
AnimationRenderer renderer = (AnimationRenderer)parent.getRenderer();
141-
142+
143+
AnimationRenderer renderer = (AnimationRenderer) parent.getRenderer();
144+
142145
renderer.getAnimations().remove(d.id);
143-
144-
// UNDO
146+
147+
// UNDO
145148
Ctx.project.getUndoStack().add(new UndoDeleteAnimation(parent, d));
146149

147150
// delete init_animation attr if the animation to delete is the chapter
@@ -150,47 +153,53 @@ protected void delete() {
150153
HashMap<String, AnimationDesc> animations = renderer.getAnimations();
151154
String newValue = null;
152155

153-
if(animations.size() > 0)
156+
if (animations.size() > 0)
154157
newValue = animations.keySet().iterator().next();
155-
158+
156159
renderer.setInitAnimation(newValue);
157-
160+
158161
Ctx.project.setModified(this, "init_animation", d.id, newValue);
159162
}
160-
163+
161164
Ctx.project.setModified();
162165
}
163-
166+
164167
@Override
165168
protected void copy() {
166169
AnimationDesc e = list.getSelected();
167170

168171
if (e == null)
169172
return;
170173

171-
clipboard = (AnimationDesc)ElementUtils.cloneElement(e);
174+
clipboard = (AnimationDesc) ElementUtils.cloneElement(e);
172175
toolbar.disablePaste(false);
173176
}
174177

175178
@Override
176179
protected void paste() {
177-
AnimationDesc newElement = (AnimationDesc)ElementUtils.cloneElement(clipboard);
178-
180+
AnimationDesc newElement = (AnimationDesc) ElementUtils.cloneElement(clipboard);
181+
182+
if (((AnimationRenderer) parent.getRenderer()).getAnimations().get(newElement.id) != null) {
183+
Message.showMsg(getStage(), "Animation already exists.", 2);
184+
185+
return;
186+
}
187+
179188
int pos = list.getSelectedIndex() + 1;
180189

181190
list.getItems().insert(pos, newElement);
182191

183-
((AnimationRenderer)parent.getRenderer()).addAnimation(newElement);
192+
((AnimationRenderer) parent.getRenderer()).addAnimation(newElement);
184193

185194
list.setSelectedIndex(pos);
186195
list.invalidateHierarchy();
187-
196+
188197
Ctx.project.setModified();
189-
}
198+
}
190199

191200
@Override
192201
protected EditModelDialog<SpriteActor, AnimationDesc> getEditElementDialogInstance(AnimationDesc e) {
193-
return new EditAnimationDialog(skin, parent, e);
202+
return new EditAnimationDialog(skin, parent, e);
194203
}
195204

196205
// -------------------------------------------------------------------------
@@ -202,7 +211,7 @@ protected EditModelDialog<SpriteActor, AnimationDesc> getEditElementDialogInstan
202211
protected String getCellTitle(AnimationDesc e) {
203212
String name = e.id;
204213
SpriteActor actor = (SpriteActor) Ctx.project.getSelectedActor();
205-
AnimationRenderer renderer = (AnimationRenderer)actor.getRenderer();
214+
AnimationRenderer renderer = (AnimationRenderer) actor.getRenderer();
206215

207216
String init = renderer.getInitAnimation();
208217

0 commit comments

Comments
 (0)