package com.overlap2d.plugins.tiled.view.tabs; import com.badlogic.gdx.Input; import com.badlogic.gdx.graphics.g2d.NinePatch; import com.badlogic.gdx.scenes.scene2d.InputEvent; import com.badlogic.gdx.scenes.scene2d.InputListener; import com.badlogic.gdx.scenes.scene2d.utils.Drawable; import com.badlogic.gdx.scenes.scene2d.utils.NinePatchDrawable; import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; import com.badlogic.gdx.utils.Array; import com.kotcrab.vis.ui.widget.VisImageButton; import com.kotcrab.vis.ui.widget.VisLabel; import com.kotcrab.vis.ui.widget.VisScrollPane; import com.kotcrab.vis.ui.widget.VisTable; import com.overlap2d.plugins.tiled.TiledPanel; import com.overlap2d.plugins.tiled.TiledPlugin; import com.overlap2d.plugins.tiled.data.TileVO; import com.overlap2d.plugins.tiled.manager.ResourcesManager; /** * Created by mariam on 2/11/16. */ public class GridTilesTab extends DefaultTab { public static boolean isDrop; private int tilesCount = 19; private Array<VisImageButton> tiles; private Array<TileVO> savedTiles; private int tileIndex; private VisScrollPane pane; private boolean isBottomEdge; private TiledPlugin tiledPlugin; private ResourcesManager resourcesManager; public GridTilesTab(TiledPanel panel, int tabIndex) { super(panel, "Tiles", tabIndex); tiledPlugin = panel.tiledPlugin; resourcesManager = tiledPlugin.pluginRM; tiles = new Array<>(); savedTiles = tiledPlugin.dataToSave.getTiles(); tileIndex = savedTiles.size; } @Override public void initView() { if (isDrop = savedTiles.size == 0) { VisImageButton.VisImageButtonStyle dropBoxStyle = new VisImageButton.VisImageButtonStyle(); dropBoxStyle.up = new TextureRegionDrawable(resourcesManager.getTextureRegion("tiles-drop-here-normal")); dropBoxStyle.imageOver = new TextureRegionDrawable(resourcesManager.getTextureRegion("tiles-drop-here-over")); VisImageButton dropRegion = new VisImageButton(dropBoxStyle); content.clear(); content.add(dropRegion) .center() .padRight(6) .padBottom(6) .padTop(10) .row(); content.add(new VisLabel("Drop an image from resources box")) .expandX() .center() .padBottom(5); content.pack(); } else { if (tileIndex > tilesCount) { tilesCount = tileIndex; } initTiles(); } } public void addTile(String tileName) { if (pane != null) isBottomEdge = pane.isBottomEdge(); if (tileIndex == 0) { setGridSizeToFirstTileSize(tileName); isDrop = false; panel.reInitTabTable(); } initTiles(tileName); panel.pack(); scrollTiles(); tiles.get(tileIndex).setChecked(true); tiledPlugin.facade.sendNotification(TiledPlugin.TILE_SELECTED, new TileVO(tileName)); tileIndex++; } public void selectTile(TileVO tileVO) { tiledPlugin.setSelectedTileVO(tileVO); } public void removeTile() { if (pane != null) isBottomEdge = pane.isBottomEdge(); tileIndex = --tileIndex < 0 ? 0 : tileIndex; tilesCount = --tilesCount < 19 ? 19 : tilesCount; tiles.clear(); initView(); } public void scrollTiles() { if(savedTiles.size + 1 >= tilesCount) { pane.layout(); pane.setSmoothScrolling(!isBottomEdge); pane.setScrollY(100); } } private void setGridSizeToFirstTileSize(String tileName) { float gridWidth = resourcesManager.getTextureRegion(tileName).getRegionWidth() / tiledPlugin.getPixelToWorld(); float gridHeight = resourcesManager.getTextureRegion(tileName).getRegionHeight() / tiledPlugin.getPixelToWorld(); tiledPlugin.dataToSave.setGrid(gridWidth, gridHeight); tiledPlugin.facade.sendNotification(TiledPlugin.GRID_CHANGED); } private void initTiles(String tileName) { content.clear(); tiles.clear(); VisTable listTable = new VisTable(); pane = new VisScrollPane(listTable); content.add(pane) .padTop(20); listTable.top(); if(tileIndex >= tilesCount && !tileName.equals("")) { tilesCount = tileIndex + 1; } for (int i=0; i<tilesCount; i++) { VisImageButton ct; VisImageButton.VisImageButtonStyle imageBoxStyle = new VisImageButton.VisImageButtonStyle(); NinePatchDrawable inactive = new NinePatchDrawable(new NinePatch(resourcesManager.getPluginNinePatch("image-Box-inactive"))); NinePatchDrawable active = new NinePatchDrawable(new NinePatch(resourcesManager.getPluginNinePatch("image-Box-active"))); imageBoxStyle.up = inactive; imageBoxStyle.down = active; imageBoxStyle.checked = active; imageBoxStyle.over = active; Drawable tileDrawable = null; if (i < savedTiles.size) { tileDrawable = new TextureRegionDrawable(resourcesManager.getTextureRegion(savedTiles.get(i).regionName)); } else if (!tileName.equals("")) { if (i == tileIndex) { tileDrawable = new TextureRegionDrawable(resourcesManager.getTextureRegion(tileName)); } } imageBoxStyle.imageUp = tileDrawable; imageBoxStyle.imageDown = tileDrawable; imageBoxStyle.imageChecked = tileDrawable; imageBoxStyle.imageOver = tileDrawable; ct = new VisImageButton(imageBoxStyle); int index = i; ct.addListener(new InputListener() { @Override public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { if (index >= savedTiles.size) return true; for (VisImageButton tile : tiles) { if (tile.isChecked()) { tile.setChecked(false); } } return true; } @Override public void touchUp(InputEvent event, float x, float y, int pointer, int button) { super.touchUp(event, x, y, pointer, button); if(button == Input.Buttons.RIGHT) { tiledPlugin.facade.sendNotification(TiledPlugin.OPEN_DROP_DOWN, savedTiles.get(index).regionName); return; } if (index >= savedTiles.size) { tiles.get(index).setChecked(false); return; } tiledPlugin.facade.sendNotification(TiledPlugin.TILE_SELECTED, savedTiles.get(index)); } }); listTable.add(ct) .width(40) .height(40) .pad(3); if((i+1) % 4 == 0) { listTable.row(); } tiles.add(ct); } content.pack(); } private void initTiles() { initTiles(""); } }