/*
* Copyright (c) 2012. HappyDroids LLC, All rights reserved.
*/
package com.happydroids.droidtowers.designer;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.InputListener;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.actions.Actions;
import com.badlogic.gdx.scenes.scene2d.ui.Image;
import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.scenes.scene2d.utils.ActorGestureListener;
import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable;
import com.badlogic.gdx.utils.Scaling;
import com.happydroids.droidtowers.TowerAssetManager;
import com.happydroids.droidtowers.gui.TowerWindow;
import com.happydroids.droidtowers.input.InputSystem;
import com.happydroids.droidtowers.platform.Display;
public class GridObjectDesigner extends TowerWindow {
private final Canvas canvas;
private final DesignerInputAdapter inputProcessor;
public GridObjectDesigner(Stage stage) {
super("Designer", stage);
Table sidebar = new Table();
sidebar.defaults().center().space(Display.devicePixel(8));
addAtlasItemsToSidebar(sidebar, "designer/housing/cheap.txt");
addAtlasItemsToSidebar(sidebar, "designer/housing/high-class.txt");
padding(0);
debug();
row().fill();
ScrollPane scrollPane = new ScrollPane(sidebar);
ScrollPane.ScrollPaneStyle paneStyle = new ScrollPane.ScrollPaneStyle(scrollPane.getStyle());
paneStyle.background = TowerAssetManager.ninePatchDrawable(TowerAssetManager.WHITE_SWATCH, Color.LIGHT_GRAY);
scrollPane.setStyle(paneStyle);
add(scrollPane).width(180);
canvas = new Canvas();
add(canvas).width(512).height(128).expand().center();
inputProcessor = new DesignerInputAdapter(canvas);
InputSystem.instance().addInputProcessor(inputProcessor, 5);
getContent().addListener(new ActorGestureListener() {
private float initialZoom = 1f;
@Override public void touchDown(InputEvent event, float x, float y, int pointer, int button) {
super.touchDown(event, x, y, pointer, button);
initialZoom = canvas.getScaleX();
}
@Override public void zoom(InputEvent event, float initialDistance, float distance) {
float zoom = MathUtils.clamp(initialZoom * distance / initialDistance, 1f, 1.5f);
canvas.setScale(zoom);
}
});
setDismissCallback(new Runnable() {
@Override public void run() {
InputSystem.instance().removeInputProcessor(inputProcessor);
}
});
}
private void addAtlasItemsToSidebar(Table sidebar, final String atlasFileName) {
TextureAtlas atlas = new TextureAtlas(atlasFileName);
for (final TextureAtlas.AtlasRegion region : atlas.getRegions()) {
sidebar.row();
final Image image = new Image(new TextureRegionDrawable(region), Scaling.fit);
sidebar.add(image).minWidth(32).minHeight(32);
image.addListener(new InputListener() {
@Override public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
event.cancel();
Image selectedItem = new Image(region);
selectedItem.setScaling(Scaling.none);
float width = selectedItem.getWidth();
float height = selectedItem.getHeight();
if (width < 32) {
selectedItem.setWidth(32);
}
if (height < 32) {
selectedItem.setHeight(32);
}
selectedItem.setOrigin(width / 2, height / 2);
selectedItem.addAction(Actions.sequence(Actions.scaleTo(1.25f, 1.25f, 0.15f),
Actions.scaleTo(1f, 1f, 0.15f)));
selectedItem.setPosition(event.getStageX() - x, event.getStageY() - y);
event.getStage().addActor(selectedItem);
inputProcessor.setSelectedItem(selectedItem);
inputProcessor.setTouchOffset(new Vector2(x, y));
inputProcessor.setOriginalPosition(new Vector2(event.getStageX(), event.getStageY()));
return true;
}
});
}
}
}