gdx-studio
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 | } |