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()); } } }); } }