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
package gdxstudio.panel;
import gdxstudio.Content;
import gdxstudio.Export;
import gdxstudio.Frame;
import gdxstudio.SceneEditor;
import gdxstudio.Style;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.event.ListSelectionEvent;

import scene2d.Camera;
import scene2d.Scene;
import scene2d.Serializer;
import web.laf.lite.widget.CenterPanel;

import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.EventListener;

final public class ScenePanel extends BaseList {
	private static final long serialVersionUID = 1L;

	public static JComboBox<String> stateComboBox = BaseTable.createComboBox("Scenes", "Maps", "Actors", 
			"Assets");
	private static JButton addscene, updown ,delete, resume, pause;
	
	private final Timer saveTimer = new Timer(20000, new ActionListener(){
		@Override
		public void actionPerformed(ActionEvent arg0) {
			Scene.getCurrentScene().save(getSelectedValue());
		}
	});
	private static File classPath;
	
	public ScenePanel(){
		super("Scenes", true);
		saveTimer.start();
		Serializer.registerSerializer(SceneEditor.class, new Serializer.SceneSerializer());
		initToolBar();
		add(scrollPane);
		stateComboBox.addItemListener(new ItemListener(){
			@Override
			public void itemStateChanged(ItemEvent e) {
				clear();
				switch(stateComboBox.getSelectedIndex()){
					case 0: header.setText("SCENES");break;
					case 1: header.setText("MAPS");break;
					case 2: header.setText("ACTORS");break;
				}
				update();
			}
	    });
	}
	
	void initToolBar(){
		JPanel tools = Style.createButtonToolBarPanel();
		addscene = Style.createToolButton("New Scene", "newfile", this);
		updown = Style.createToolButton("ScenePriority", "updown", this);
		delete = Style.createToolButton("Delete", "trash", this);
		resume = Style.createToolButton("Resume", "resume", this);
		pause = Style.createToolButton("Pause", "pause", this);
		pause.setEnabled(false);
		tools.add(addscene);
		tools.add(updown);
		tools.add(delete);
		tools.add(resume);
		tools.add(pause);
		stateComboBox.setPreferredSize(new Dimension(65, 17));
		tools.add(new CenterPanel(stateComboBox, false, true));
		add(tools);
	}
	
	
	public void update(){
		lock();
		listModel.clear();
		for(String s: Scene.scenesMap.keys())
			listModel.addElement(s.replace(Scene.basePackage, ""));
		if(listModel.getSize()>0 && listModel.get(0) != null || !listModel.get(0).isEmpty())
			list.setSelectedIndex(0);
		Frame.eventPanel.update();
		classPath = new File(Content.getProject()+"bin/");
		unlock();
	}
	
	private void createSceneFile(){
		String text = JOptionPane.showInputDialog(Frame.getInstance(), "Create a New Scene", "New Scene", 
				JOptionPane.OK_CANCEL_OPTION);
		if(text == null || text.isEmpty())
			return;
		String name = text.replace(".json", "").replace(".java", "");
		name = Scene.capitalize(name);
		if(listModel.contains(name)){
			JOptionPane.showConfirmDialog(null, "Error: File already exists: "+name, "Error", 
					JOptionPane.OK_OPTION);
			return;
		}
		else{
			Export.writeFile("source/"+name+".java",
					Export.readFileFromClassPath("SceneTemplate.txt").replace("$$$", name));
			listModel.addElement(name);
			Scene.scenesMap.put(name, "");
			Frame.eventPanel.update();
		}
		list.setSelectedIndex(listModel.indexOf(name));
		Scene.isDirty = true;
		Scene.getCurrentScene().save(getSelectedValue());
	}

	@Override
	public void actionPerformed(ActionEvent event) {
		switch(((JButton)event.getSource()).getToolTipText()){
			case "New Scene": 
				createSceneFile();
				break;
			case "ScenePriority": 
				int sceneindex = list.getSelectedIndex();
				if(sceneindex+1 < listModel.size()){
					lock();
					String selected = listModel.getElementAt(sceneindex);
					String selectedValue = Scene.scenesMap.getValueAt(sceneindex);
					String down = listModel.getElementAt(sceneindex+1);
					String downValue = Scene.scenesMap.getValueAt(sceneindex+1);
					
					/* Changing the model of List */
					listModel.setElementAt(selected, sceneindex+1);
					listModel.setElementAt(down, sceneindex);
					
					/* Changing the sceneMap of Stage */
					Scene.scenesMap.setKey(sceneindex+1, selected);
					Scene.scenesMap.setValue(sceneindex+1, selectedValue);
					Scene.scenesMap.setKey(sceneindex, down);
					Scene.scenesMap.setValue(sceneindex, downValue);
					
					list.setSelectedIndex(sceneindex+1);
					unlock();
				}
				break;
			case "Delete":
				int confirm = JOptionPane.showConfirmDialog(null, 
						"Are you Sure you want to delete the Scene?", "Delete Scene", 
						JOptionPane.YES_NO_OPTION);
				if(confirm == JOptionPane.YES_OPTION){
					lock();
					Export.deleteFile("source/"+list.getSelectedValue()+".java");
					Export.deleteFile("bin/"+list.getSelectedValue()+".class");
					Scene.scenesMap.removeKey(list.getSelectedValue());
					int index = listModel.indexOf(list.getSelectedValue())-1;
					if(index != -1){
						Content.editor.load();
						if(Content.currentView.equals("Editor"))
							Content.toggleView(1);
					}
					listModel.removeElement(list.getSelectedValue());
					Frame.eventPanel.update();
					list.setSelectedValue(listModel.elementAt(index), true);
					showStudio();
					Scene.isDirty = true;
					Scene.getCurrentScene().save(getSelectedValue());
					unlock();
				}
				break;
			case "Resume": 
				Scene.getCurrentScene().save(getSelectedValue());
				list.setEnabled(false);
				addscene.setEnabled(false);
				updown.setEnabled(false);
				delete.setEnabled(false);
				resume.setEnabled(false);
				pause.setEnabled(true);
				Frame.sceneEffectPanel.disable();
				Frame.propertyPanel.disable();
				Frame.effectPanel.disable();
				Frame.eventPanel.disable();
				Content.widgetPanel.disable();
				Content.toggleView(2);
				runGame();
				break;
			case "Pause": 
				Scene.cl = null;
				Scene.debug = true;
				list.setEnabled(true);
				addscene.setEnabled(true);
				updown.setEnabled(true);
				delete.setEnabled(true);
				resume.setEnabled(true);
				pause.setEnabled(false);
				Frame.sceneEffectPanel.enable();
				Frame.propertyPanel.enable();
				Frame.effectPanel.enable();
				Frame.eventPanel.enable();
				Content.widgetPanel.enable();
				Scene.scenesMap.put("gdxstudio.SceneEditor", "");
				Scene.setScene("gdxstudio.SceneEditor");
				Content.toggleView(2);
				showStudio();
				break;
		}
	}

	private String prevScene = "";
	@Override
	public void valueChanged(ListSelectionEvent e) {
		if (e.getValueIsAdjusting() == false) {
			ConsolePanel.clear();
			Content.editor.clearIcons();
			Content.editor.save();
			Scene.getCurrentScene().save(prevScene);//Warning Only Change
			if(list.getSelectedValue() == null)
				return;	
			prevScene = list.getSelectedValue();
			if(resume.isEnabled())
				showStudio();
			Content.editor.load();
			Frame.actorPanel.setHeaderText(list.getSelectedValue());
		}
	}
	
	public void showStudio(){
		Frame.actorPanel.clear();
		Scene.getRoot().clearChildren();
		Scene.getCurrentScene().clear();
		Camera.clearAllHud();
		Camera.followActor(null);
		Camera.reset();
		if(selectedValueExists()){
			Scene.getCurrentScene().load(getSelectedValue());
			for(Actor child: Scene.getCurrentScene().getChildren()){
				Frame.actorPanel.addActor(child.getName());
				for(EventListener l: child.getListeners())
					child.removeListener(l);
			}
			Scene.getRoot().addActor(Scene.getCurrentScene());
		}
		Frame.sceneEffectPanel.update();
	}
	
	public void runGame() {
		try {
			ConsolePanel.clear();
			Frame.actorPanel.clear();
			URL url = classPath.toURI().toURL();
			URLClassLoader cl = URLClassLoader.newInstance(new URL[]{url});
			Scene.cl = cl;
			Scene.debug = false;
			Scene.setScene(list.getSelectedValue());
		} catch (MalformedURLException me) {
			me.printStackTrace();
		}
	}
	
	public boolean selectedValueExists(){
		if(list.getSelectedValue() != null && !list.getSelectedValue().isEmpty())
			return true;
		return false;
	}
	
	public String getSelectedValue(){
		return list.getSelectedValue();
	}
}