gdx-studio

#libgdx#java#desktop

git clone https://git.pyrossh.dev/gdx-studio

An IDE for creating Games using libgdx and Java supported on all platforms Android, iOS, Desktop


src/gdxstudio/panel/ScenePanel.java
a9b2a64 1
package gdxstudio.panel;
a9b2a64 2
import gdxstudio.Content;
a9b2a64 3
import gdxstudio.Export;
a9b2a64 4
import gdxstudio.Frame;
a9b2a64 5
import gdxstudio.SceneEditor;
a9b2a64 6
import gdxstudio.Style;
a9b2a64 7
a9b2a64 8
import java.awt.Dimension;
a9b2a64 9
import java.awt.event.ActionEvent;
a9b2a64 10
import java.awt.event.ActionListener;
a9b2a64 11
import java.awt.event.ItemEvent;
a9b2a64 12
import java.awt.event.ItemListener;
a9b2a64 13
import java.io.File;
a9b2a64 14
import java.net.MalformedURLException;
a9b2a64 15
import java.net.URL;
a9b2a64 16
import java.net.URLClassLoader;
a9b2a64 17
a9b2a64 18
import javax.swing.JButton;
a9b2a64 19
import javax.swing.JComboBox;
a9b2a64 20
import javax.swing.JOptionPane;
a9b2a64 21
import javax.swing.JPanel;
a9b2a64 22
import javax.swing.Timer;
a9b2a64 23
import javax.swing.event.ListSelectionEvent;
a9b2a64 24
a9b2a64 25
import scene2d.Camera;
a9b2a64 26
import scene2d.Scene;
a9b2a64 27
import scene2d.Serializer;
a9b2a64 28
import web.laf.lite.widget.CenterPanel;
a9b2a64 29
a9b2a64 30
import com.badlogic.gdx.scenes.scene2d.Actor;
a9b2a64 31
import com.badlogic.gdx.scenes.scene2d.EventListener;
a9b2a64 32
a9b2a64 33
final public class ScenePanel extends BaseList {
a9b2a64 34
	private static final long serialVersionUID = 1L;
a9b2a64 35
a9b2a64 36
	public static JComboBox<String> stateComboBox = BaseTable.createComboBox("Scenes", "Maps", "Actors", 
a9b2a64 37
			"Assets");
a9b2a64 38
	private static JButton addscene, updown ,delete, resume, pause;
a9b2a64 39
	
a9b2a64 40
	private final Timer saveTimer = new Timer(20000, new ActionListener(){
a9b2a64 41
		@Override
a9b2a64 42
		public void actionPerformed(ActionEvent arg0) {
a9b2a64 43
			Scene.getCurrentScene().save(getSelectedValue());
a9b2a64 44
		}
a9b2a64 45
	});
a9b2a64 46
	private static File classPath;
a9b2a64 47
	
a9b2a64 48
	public ScenePanel(){
a9b2a64 49
		super("Scenes", true);
a9b2a64 50
		saveTimer.start();
a9b2a64 51
		Serializer.registerSerializer(SceneEditor.class, new Serializer.SceneSerializer());
a9b2a64 52
		initToolBar();
a9b2a64 53
		add(scrollPane);
a9b2a64 54
		stateComboBox.addItemListener(new ItemListener(){
a9b2a64 55
			@Override
a9b2a64 56
			public void itemStateChanged(ItemEvent e) {
a9b2a64 57
				clear();
a9b2a64 58
				switch(stateComboBox.getSelectedIndex()){
a9b2a64 59
					case 0: header.setText("SCENES");break;
a9b2a64 60
					case 1: header.setText("MAPS");break;
a9b2a64 61
					case 2: header.setText("ACTORS");break;
a9b2a64 62
				}
a9b2a64 63
				update();
a9b2a64 64
			}
a9b2a64 65
	    });
a9b2a64 66
	}
a9b2a64 67
	
a9b2a64 68
	void initToolBar(){
a9b2a64 69
		JPanel tools = Style.createButtonToolBarPanel();
a9b2a64 70
		addscene = Style.createToolButton("New Scene", "newfile", this);
a9b2a64 71
		updown = Style.createToolButton("ScenePriority", "updown", this);
a9b2a64 72
		delete = Style.createToolButton("Delete", "trash", this);
a9b2a64 73
		resume = Style.createToolButton("Resume", "resume", this);
a9b2a64 74
		pause = Style.createToolButton("Pause", "pause", this);
a9b2a64 75
		pause.setEnabled(false);
a9b2a64 76
		tools.add(addscene);
a9b2a64 77
		tools.add(updown);
a9b2a64 78
		tools.add(delete);
a9b2a64 79
		tools.add(resume);
a9b2a64 80
		tools.add(pause);
a9b2a64 81
		stateComboBox.setPreferredSize(new Dimension(65, 17));
a9b2a64 82
		tools.add(new CenterPanel(stateComboBox, false, true));
a9b2a64 83
		add(tools);
a9b2a64 84
	}
a9b2a64 85
	
a9b2a64 86
	
a9b2a64 87
	public void update(){
a9b2a64 88
		lock();
a9b2a64 89
		listModel.clear();
a9b2a64 90
		for(String s: Scene.scenesMap.keys())
a9b2a64 91
			listModel.addElement(s.replace(Scene.basePackage, ""));
a9b2a64 92
		if(listModel.getSize()>0 && listModel.get(0) != null || !listModel.get(0).isEmpty())
a9b2a64 93
			list.setSelectedIndex(0);
a9b2a64 94
		Frame.eventPanel.update();
a9b2a64 95
		classPath = new File(Content.getProject()+"bin/");
a9b2a64 96
		unlock();
a9b2a64 97
	}
a9b2a64 98
	
a9b2a64 99
	private void createSceneFile(){
a9b2a64 100
		String text = JOptionPane.showInputDialog(Frame.getInstance(), "Create a New Scene", "New Scene", 
a9b2a64 101
				JOptionPane.OK_CANCEL_OPTION);
a9b2a64 102
		if(text == null || text.isEmpty())
a9b2a64 103
			return;
a9b2a64 104
		String name = text.replace(".json", "").replace(".java", "");
a9b2a64 105
		name = Scene.capitalize(name);
a9b2a64 106
		if(listModel.contains(name)){
a9b2a64 107
			JOptionPane.showConfirmDialog(null, "Error: File already exists: "+name, "Error", 
a9b2a64 108
					JOptionPane.OK_OPTION);
a9b2a64 109
			return;
a9b2a64 110
		}
a9b2a64 111
		else{
a9b2a64 112
			Export.writeFile("source/"+name+".java",
a9b2a64 113
					Export.readFileFromClassPath("SceneTemplate.txt").replace("$$$", name));
a9b2a64 114
			listModel.addElement(name);
a9b2a64 115
			Scene.scenesMap.put(name, "");
a9b2a64 116
			Frame.eventPanel.update();
a9b2a64 117
		}
a9b2a64 118
		list.setSelectedIndex(listModel.indexOf(name));
a9b2a64 119
		Scene.isDirty = true;
a9b2a64 120
		Scene.getCurrentScene().save(getSelectedValue());
a9b2a64 121
	}
a9b2a64 122
a9b2a64 123
	@Override
a9b2a64 124
	public void actionPerformed(ActionEvent event) {
a9b2a64 125
		switch(((JButton)event.getSource()).getToolTipText()){
a9b2a64 126
			case "New Scene": 
a9b2a64 127
				createSceneFile();
a9b2a64 128
				break;
a9b2a64 129
			case "ScenePriority": 
a9b2a64 130
				int sceneindex = list.getSelectedIndex();
a9b2a64 131
				if(sceneindex+1 < listModel.size()){
a9b2a64 132
					lock();
a9b2a64 133
					String selected = listModel.getElementAt(sceneindex);
a9b2a64 134
					String selectedValue = Scene.scenesMap.getValueAt(sceneindex);
a9b2a64 135
					String down = listModel.getElementAt(sceneindex+1);
a9b2a64 136
					String downValue = Scene.scenesMap.getValueAt(sceneindex+1);
a9b2a64 137
					
a9b2a64 138
					/* Changing the model of List */
a9b2a64 139
					listModel.setElementAt(selected, sceneindex+1);
a9b2a64 140
					listModel.setElementAt(down, sceneindex);
a9b2a64 141
					
a9b2a64 142
					/* Changing the sceneMap of Stage */
a9b2a64 143
					Scene.scenesMap.setKey(sceneindex+1, selected);
a9b2a64 144
					Scene.scenesMap.setValue(sceneindex+1, selectedValue);
a9b2a64 145
					Scene.scenesMap.setKey(sceneindex, down);
a9b2a64 146
					Scene.scenesMap.setValue(sceneindex, downValue);
a9b2a64 147
					
a9b2a64 148
					list.setSelectedIndex(sceneindex+1);
a9b2a64 149
					unlock();
a9b2a64 150
				}
a9b2a64 151
				break;
a9b2a64 152
			case "Delete":
a9b2a64 153
				int confirm = JOptionPane.showConfirmDialog(null, 
a9b2a64 154
						"Are you Sure you want to delete the Scene?", "Delete Scene", 
a9b2a64 155
						JOptionPane.YES_NO_OPTION);
a9b2a64 156
				if(confirm == JOptionPane.YES_OPTION){
a9b2a64 157
					lock();
a9b2a64 158
					Export.deleteFile("source/"+list.getSelectedValue()+".java");
a9b2a64 159
					Export.deleteFile("bin/"+list.getSelectedValue()+".class");
a9b2a64 160
					Scene.scenesMap.removeKey(list.getSelectedValue());
a9b2a64 161
					int index = listModel.indexOf(list.getSelectedValue())-1;
a9b2a64 162
					if(index != -1){
a9b2a64 163
						Content.editor.load();
a9b2a64 164
						if(Content.currentView.equals("Editor"))
a9b2a64 165
							Content.toggleView(1);
a9b2a64 166
					}
a9b2a64 167
					listModel.removeElement(list.getSelectedValue());
a9b2a64 168
					Frame.eventPanel.update();
a9b2a64 169
					list.setSelectedValue(listModel.elementAt(index), true);
a9b2a64 170
					showStudio();
a9b2a64 171
					Scene.isDirty = true;
a9b2a64 172
					Scene.getCurrentScene().save(getSelectedValue());
a9b2a64 173
					unlock();
a9b2a64 174
				}
a9b2a64 175
				break;
a9b2a64 176
			case "Resume": 
a9b2a64 177
				Scene.getCurrentScene().save(getSelectedValue());
a9b2a64 178
				list.setEnabled(false);
a9b2a64 179
				addscene.setEnabled(false);
a9b2a64 180
				updown.setEnabled(false);
a9b2a64 181
				delete.setEnabled(false);
a9b2a64 182
				resume.setEnabled(false);
a9b2a64 183
				pause.setEnabled(true);
a9b2a64 184
				Frame.sceneEffectPanel.disable();
a9b2a64 185
				Frame.propertyPanel.disable();
a9b2a64 186
				Frame.effectPanel.disable();
a9b2a64 187
				Frame.eventPanel.disable();
a9b2a64 188
				Content.widgetPanel.disable();
a9b2a64 189
				Content.toggleView(2);
a9b2a64 190
				runGame();
a9b2a64 191
				break;
a9b2a64 192
			case "Pause": 
a9b2a64 193
				Scene.cl = null;
a9b2a64 194
				Scene.debug = true;
a9b2a64 195
				list.setEnabled(true);
a9b2a64 196
				addscene.setEnabled(true);
a9b2a64 197
				updown.setEnabled(true);
a9b2a64 198
				delete.setEnabled(true);
a9b2a64 199
				resume.setEnabled(true);
a9b2a64 200
				pause.setEnabled(false);
a9b2a64 201
				Frame.sceneEffectPanel.enable();
a9b2a64 202
				Frame.propertyPanel.enable();
a9b2a64 203
				Frame.effectPanel.enable();
a9b2a64 204
				Frame.eventPanel.enable();
a9b2a64 205
				Content.widgetPanel.enable();
a9b2a64 206
				Scene.scenesMap.put("gdxstudio.SceneEditor", "");
a9b2a64 207
				Scene.setScene("gdxstudio.SceneEditor");
a9b2a64 208
				Content.toggleView(2);
a9b2a64 209
				showStudio();
a9b2a64 210
				break;
a9b2a64 211
		}
a9b2a64 212
	}
a9b2a64 213
a9b2a64 214
	private String prevScene = "";
a9b2a64 215
	@Override
a9b2a64 216
	public void valueChanged(ListSelectionEvent e) {
a9b2a64 217
		if (e.getValueIsAdjusting() == false) {
a9b2a64 218
			ConsolePanel.clear();
a9b2a64 219
			Content.editor.clearIcons();
a9b2a64 220
			Content.editor.save();
a9b2a64 221
			Scene.getCurrentScene().save(prevScene);//Warning Only Change
a9b2a64 222
			if(list.getSelectedValue() == null)
a9b2a64 223
				return;	
a9b2a64 224
			prevScene = list.getSelectedValue();
a9b2a64 225
			if(resume.isEnabled())
a9b2a64 226
				showStudio();
a9b2a64 227
			Content.editor.load();
a9b2a64 228
			Frame.actorPanel.setHeaderText(list.getSelectedValue());
a9b2a64 229
		}
a9b2a64 230
	}
a9b2a64 231
	
a9b2a64 232
	public void showStudio(){
a9b2a64 233
		Frame.actorPanel.clear();
a9b2a64 234
		Scene.getRoot().clearChildren();
a9b2a64 235
		Scene.getCurrentScene().clear();
a9b2a64 236
		Camera.clearAllHud();
a9b2a64 237
		Camera.followActor(null);
a9b2a64 238
		Camera.reset();
a9b2a64 239
		if(selectedValueExists()){
a9b2a64 240
			Scene.getCurrentScene().load(getSelectedValue());
a9b2a64 241
			for(Actor child: Scene.getCurrentScene().getChildren()){
a9b2a64 242
				Frame.actorPanel.addActor(child.getName());
a9b2a64 243
				for(EventListener l: child.getListeners())
a9b2a64 244
					child.removeListener(l);
a9b2a64 245
			}
a9b2a64 246
			Scene.getRoot().addActor(Scene.getCurrentScene());
a9b2a64 247
		}
a9b2a64 248
		Frame.sceneEffectPanel.update();
a9b2a64 249
	}
a9b2a64 250
	
a9b2a64 251
	public void runGame() {
a9b2a64 252
		try {
a9b2a64 253
			ConsolePanel.clear();
a9b2a64 254
			Frame.actorPanel.clear();
a9b2a64 255
			URL url = classPath.toURI().toURL();
a9b2a64 256
			URLClassLoader cl = URLClassLoader.newInstance(new URL[]{url});
a9b2a64 257
			Scene.cl = cl;
a9b2a64 258
			Scene.debug = false;
a9b2a64 259
			Scene.setScene(list.getSelectedValue());
a9b2a64 260
		} catch (MalformedURLException me) {
a9b2a64 261
			me.printStackTrace();
a9b2a64 262
		}
a9b2a64 263
	}
a9b2a64 264
	
a9b2a64 265
	public boolean selectedValueExists(){
a9b2a64 266
		if(list.getSelectedValue() != null && !list.getSelectedValue().isEmpty())
a9b2a64 267
			return true;
a9b2a64 268
		return false;
a9b2a64 269
	}
a9b2a64 270
	
a9b2a64 271
	public String getSelectedValue(){
a9b2a64 272
		return list.getSelectedValue();
a9b2a64 273
	}
a9b2a64 274
}