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/SceneEditor.java
package gdxstudio;

import java.awt.Cursor;

import scene2d.Asset;
import scene2d.Scene;

import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.ui.List;
import com.badlogic.gdx.scenes.scene2d.ui.SelectBox;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.badlogic.gdx.scenes.scene2d.ui.TextField;
import com.badlogic.gdx.scenes.scene2d.utils.Align;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.Timer.Task;

public class SceneEditor extends Scene {
	public static Actor selectedActor = null;
	public static boolean reloadAssets = false;
	static AddField addField;

	public SceneEditor(){
		super();
		if(reloadAssets){
			Asset.loadBlocking();  // this is the first time this Scene is created by the Stage
			Content.assetPanel.updateAsset();
			com.badlogic.gdx.utils.Timer.schedule(new Task(){
				@Override
				public void run() {
					Frame.scenePanel.showStudio();
					Scene.scenesMap.removeKey("gdxstudio.SceneEditor");
					Frame.scenePanel.update();
				}
			}, 1f);
			reloadAssets = false;
			addField = new AddField();
		}
		else{
			Frame.scenePanel.showStudio();
			Scene.scenesMap.removeKey("gdxstudio.SceneEditor");
		}
		Content.studioPanel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
	}
	
	public static void doClick(Actor actor){
		addField.remove();
		Frame.actorPanel.lock();
		Frame.propertyPanel.clear();
		Frame.effectPanel.clear();
		Frame.eventPanel.clear();
		selectedActor = actor;
		Scene.getCurrentScene().outline(actor);
		Frame.actorPanel.list.setSelectedIndex(Frame.actorPanel.indexOf(actor.getName()));
		StatusBar.updateSelected(actor.getName());
		Frame.dashPanel.update();
		Frame.propertyPanel.update();
		Frame.effectPanel.update();
		Frame.eventPanel.update();
		Frame.actorPanel.unlock();
		if(selectedActor instanceof List || selectedActor instanceof SelectBox){
			addField.setPosition(actor.getX(), actor.getY() - addField.getHeight());
			Scene.getRoot().addActor(addField);
		}
	}

	
	@Override
	public void onClick(Actor actor) {
		doClick(actor);
	}
	
	boolean dragging;
	int edge;
	float startX, startY, lastX, lastY;
	@Override
	public void onTouchDown(Actor actor) {
		if (Scene.mouseButton == 0) {
			edge = 0;
			float x = Scene.mouse.x;
			float y = Scene.mouse.y;
			if (x > actor.getX() + actor.getWidth() - 10) edge |= Align.right;
			if (y > actor.getY() + actor.getHeight() - 10) edge |= Align.top;
			//if (x < actor.getX() + 20 && y < actor.getY() + 20) edge = Align.left; no rotation
			dragging = edge != 0;
			startX = x;
			startY = y;
			lastX = x;
			lastY = y;
		}
	}

	@Override
	public void onTouchUp() {
		dragging = false;
		Content.studioPanel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
	}

	@Override
	public void onDragged() {
		if(selectedActor != null){
			if(!dragging){
				selectedActor.setPosition(Scene.mouse.x, Scene.mouse.y);
				Frame.propertyPanel.updateProperty("X", ""+selectedActor.getX(), 0);
				Frame.propertyPanel.updateProperty("Y", ""+selectedActor.getY(), 0);
				StatusBar.updateXY(Scene.mouse.x, Scene.mouse.y);
				
			}
			else
			{
				float x = Scene.mouse.x;
				float y = Scene.mouse.y;
				float width = selectedActor.getWidth(), height = selectedActor.getHeight();
				float windowX = selectedActor.getX(), windowY = selectedActor.getY();
				if ((edge & Align.right) != 0) {
					width += x - lastX;
				}
				if ((edge & Align.top) != 0) {
					height += y - lastY;
				}
				if ((edge & Align.top) != 0 && (edge & Align.right) != 0) {
					width += x - lastX;
					height += y - lastY;
				}
				if (edge == Align.left){
					float rot = getAngle(selectedActor.getX()+selectedActor.getOriginX(), 
							selectedActor.getY()+selectedActor.getOriginY(), x, y) 
							- selectedActor.getRotation();
					selectedActor.rotate(rot);
				}
				lastX = x;
				lastY = y;
				selectedActor.setBounds(Math.round(windowX), Math.round(windowY), Math.round(width), Math.round(height));
				Frame.propertyPanel.updateProperty("Width", ""+width, 0);
				Frame.propertyPanel.updateProperty("Height", ""+height, 0);
			}
			Scene.isDirty = true;
		}
	}

	@Override
	public void onGesture(GestureType type) {
	}
	
	private boolean isHand = true;
	private boolean isRight = false;
	private boolean isTop = false;

	@Override
	public void act(float delta){
		if(selectedActor != null){
			isRight = false;
			isTop = false;
			//Stage.log("my"+Stage.mouse.y+"top"+selectedActor.getTop());
			if (Scene.mouse.x > selectedActor.getRight() - 10 && Scene.mouse.x < selectedActor.getRight()) {
				Content.studioPanel.setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR));
				isHand = false;
				isRight = true;
			}
			if(Scene.mouse.y > selectedActor.getTop() - 10 && Scene.mouse.y < selectedActor.getTop()){
				Content.studioPanel.setCursor(Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR));
				isHand = false;
				isTop = true;
			}
			if (isRight && isTop) {
				Content.studioPanel.setCursor(Cursor.getPredefinedCursor(Cursor.NE_RESIZE_CURSOR));
				isHand = false;
			}
			if (!isRight && !isTop){
				if(!isHand){
					Content.studioPanel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
					isHand = true;
				}
			}
		}
	}
	
	@Override
	public void onKeyTyped(char key) {};
	@Override
	public void onKeyUp(int keycode){};
	@Override
	public void onKeyDown(int keycode){};
	@Override
	public void onPause(){};
	@Override
	public void onResume(){};
	@Override
	public void onDispose(){};
}

class AddField extends Table {
	TextField tf;
	TextButton addBtn;
	TextButton removeBtn;
	
	public AddField(){
		super(Asset.skin);
		setBackground(Asset.skin.getDrawable("dialogDim"));
		tf = new TextField("", Asset.skin);
		addBtn = new TextButton("Add", Asset.skin);
		removeBtn = new TextButton("Remove", Asset.skin);
		add(tf);
		add(addBtn);
		add(removeBtn);
		pack();
		addBtn.addListener(new ClickListener(){
			@Override
	    	public void clicked(InputEvent event, float x, float y){
	    		super.clicked(event, x, y);
	    		if(!tf.getText().isEmpty()){
	    			if(SceneEditor.selectedActor instanceof List){
	    				List list = (List) SceneEditor.selectedActor;
	    				Array<String> arr = new Array<String>(list.getItems());
	    				arr.add(tf.getText());
	    				list.setItems(arr.toArray());
	    				list.pack();
	    				AddField.this.setPosition(list.getX(), list.getY()-AddField.this.getHeight());
	    			}
	    			if(SceneEditor.selectedActor instanceof SelectBox){
	    				SelectBox list = (SelectBox) SceneEditor.selectedActor;
	    				Array<String> arr = new Array<String>(list.getItems());
	    				arr.add(tf.getText());
	    				list.setItems(arr.toArray());
	    				list.pack();
	    				AddField.this.setPosition(list.getX(), list.getY()-AddField.this.getHeight());
	    			}
	    				
	    		}
			}
		});
		removeBtn.addListener(new ClickListener(){
			@Override
	    	public void clicked(InputEvent event, float x, float y){
	    		super.clicked(event, x, y);
	    		if(SceneEditor.selectedActor instanceof List){
		    		List list = (List) SceneEditor.selectedActor;
		    		if(list.getItems().length == 0)
		    			return;
		    		Array<String> arr = new Array<String>(list.getItems());
		    		list.setSelectedIndex(list.getItems().length-1);
		    		arr.removeIndex(list.getSelectedIndex());
		    		list.setItems(arr.toArray());
		    		list.pack();
		    		AddField.this.setPosition(list.getX(), list.getY()-AddField.this.getHeight());
	    		}
	    		if(SceneEditor.selectedActor instanceof SelectBox){
	    			SelectBox list = (SelectBox) SceneEditor.selectedActor;
		    		if(list.getItems().length == 0)
		    			return;
		    		Array<String> arr = new Array<String>(list.getItems());
		    		list.setSelection(list.getItems().length-1);
		    		arr.removeIndex(list.getSelectionIndex());
		    		list.setItems(arr.toArray());
		    		list.pack();
		    		AddField.this.setPosition(list.getX(), list.getY()-AddField.this.getHeight());
	    		}
			}
		});
	}
}