From e8a1bd8b701e4fabfa886a8121e7bd3cddf0bd2d Mon Sep 17 00:00:00 2001 From: Jan-Thierry Wegener Date: Thu, 3 Jun 2021 22:07:17 +0200 Subject: [PATCH] Enabled selection of multiple images in the image resource pannel. Added drag and drop with multiple images to the tiles plugin. --- .../plugin/tiled/TiledPanelMediator.java | 31 ++-- .../editor/plugin/tiled/TiledPlugin.java | 8 +- .../controller/BootstrapViewCommand.java | 57 +++++-- .../editor/view/HyperLap2DScreen.java | 19 ++- .../stage/input/MetaKeyInputProcessor.java | 132 +++++++++++++++ .../ui/ImageResourceSelectionUIMediator.java | 155 ++++++++++++++++++ .../view/ui/box/UIResourcesBoxMediator.java | 31 +++- .../UIAnimationsTabMediator.java | 29 ++-- .../ui/box/resourcespanel/UIImagesTab.java | 8 +- .../resourcespanel/UIImagesTabMediator.java | 12 +- .../draggable/box/BoxItemResource.java | 128 ++++++++++++++- .../draggable/box/ImageResource.java | 29 +++- .../draggable/box/SpineResource.java | 28 +++- .../draggable/box/SpriteResource.java | 24 ++- 14 files changed, 615 insertions(+), 76 deletions(-) create mode 100644 src/main/java/games/rednblack/editor/view/stage/input/MetaKeyInputProcessor.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/ImageResourceSelectionUIMediator.java diff --git a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/TiledPanelMediator.java b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/TiledPanelMediator.java index 0861f232..a5216236 100644 --- a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/TiledPanelMediator.java +++ b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/TiledPanelMediator.java @@ -18,28 +18,28 @@ package games.rednblack.editor.plugin.tiled; +import java.util.HashMap; + +import org.puremvc.java.interfaces.INotification; +import org.puremvc.java.patterns.mediator.Mediator; + import com.badlogic.ashley.core.Engine; import com.badlogic.ashley.core.Entity; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Input; -import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.scenes.scene2d.utils.DragAndDrop; -import games.rednblack.editor.plugin.tiled.view.SpineDrawable; -import games.rednblack.editor.renderer.factory.EntityFactory; -import games.rednblack.h2d.common.vo.CursorData; + import games.rednblack.editor.plugin.tiled.data.TileVO; import games.rednblack.editor.plugin.tiled.tools.DeleteTileTool; import games.rednblack.editor.plugin.tiled.tools.DrawTileTool; +import games.rednblack.editor.plugin.tiled.view.SpineDrawable; import games.rednblack.editor.plugin.tiled.view.tabs.SettingsTab; import games.rednblack.editor.renderer.components.DimensionsComponent; +import games.rednblack.editor.renderer.factory.EntityFactory; import games.rednblack.editor.renderer.utils.ComponentRetriever; import games.rednblack.h2d.common.MsgAPI; import games.rednblack.h2d.common.ResourcePayloadObject; -import org.puremvc.java.interfaces.INotification; -import org.puremvc.java.patterns.mediator.Mediator; - -import java.util.HashMap; /** * Created by mariam on 2/2/2016. @@ -63,6 +63,7 @@ public class TiledPanelMediator extends Mediator { return new String[]{ MsgAPI.SCENE_LOADED, TiledPlugin.TILE_ADDED, + TiledPlugin.IMAGE_BUNDLE_DROP_SINGLE, TiledPlugin.TILE_SELECTED, TiledPlugin.ACTION_DELETE_TILE, TiledPlugin.ACTION_SET_GRID_SIZE_FROM_LIST, @@ -105,10 +106,13 @@ public class TiledPanelMediator extends Mediator { if (type == EntityFactory.UNKNOWN_TYPE) return; //only some resources can become a tile! String tileName = resourcePayloadObject.name; - if (tiledPlugin.dataToSave.containsTile(tileName)) return; - + // we send a notifier even in the case when the tile is not already added tiledPlugin.facade.sendNotification(TiledPlugin.TILE_ADDED, new Object[]{tileName, type}); - + if (type == EntityFactory.IMAGE_TYPE) { + // ensure that all selected images are dropped + // the respective listener is responsible for dropping one-by-one, since he tracks the selected ones + tiledPlugin.facade.sendNotification(TiledPlugin.IMAGE_BUNDLE_DROP, new Object[]{tileName, type}); + } } }; tiledPlugin.facade.sendNotification(MsgAPI.ADD_TARGET, target); @@ -116,10 +120,15 @@ public class TiledPanelMediator extends Mediator { viewComponent.setEngine(engine); viewComponent.setFixedPosition(); break; + case TiledPlugin.IMAGE_BUNDLE_DROP_SINGLE: + // aliasing the drop from the main project case TiledPlugin.TILE_ADDED: Object[] payload = notification.getBody(); tileName = (String) payload[0]; int type = (int) payload[1]; + // we only add tiles that have not been added previously + if (tiledPlugin.dataToSave.containsTile(tileName)) return; + viewComponent.addTile(tileName, type); tiledPlugin.dataToSave.addTile(tileName, type); diff --git a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/TiledPlugin.java b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/TiledPlugin.java index 19b9adc0..12e77eb3 100644 --- a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/TiledPlugin.java +++ b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/TiledPlugin.java @@ -18,6 +18,8 @@ package games.rednblack.editor.plugin.tiled; +import java.util.Set; + import com.badlogic.ashley.core.Entity; import com.badlogic.gdx.math.Rectangle; import com.badlogic.gdx.math.Vector2; @@ -26,6 +28,7 @@ import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; import com.badlogic.gdx.utils.Array; import com.kotcrab.vis.ui.VisUI; import com.kotcrab.vis.ui.widget.VisImageButton; + import games.rednblack.editor.plugin.tiled.data.TileVO; import games.rednblack.editor.plugin.tiled.manager.ResourcesManager; import games.rednblack.editor.plugin.tiled.offset.OffsetPanel; @@ -45,8 +48,6 @@ import games.rednblack.h2d.common.MenuAPI; import games.rednblack.h2d.common.plugins.H2DPluginAdapter; import net.mountainblade.modular.annotations.Implementation; -import java.util.Set; - /** * Created by mariam on 2/2/2016. */ @@ -66,6 +67,9 @@ public class TiledPlugin extends H2DPluginAdapter { public static final String TILE_GRID_OFFSET_ADDED = CLASS_NAME + ".TILE_GRID_OFFSET_ADDED"; public static final String ACTION_SET_GRID_SIZE_FROM_ITEM = CLASS_NAME + ".ACTION_SET_GRID_SIZE_FROM_ITEM"; public static final String ACTION_SET_GRID_SIZE_FROM_LIST = CLASS_NAME + ".ACTION_SET_GRID_SIZE_FROM_LIST"; + // notification from the main project + public static final String IMAGE_BUNDLE_DROP_SINGLE = "games.rednblack.editor.view.ui.box.UIResourcesBoxMediator.IMAGE_BUNDLE_DROP_SINGLE"; + public static final String IMAGE_BUNDLE_DROP = "games.rednblack.editor.view.ui.box.UIResourcesBoxMediator.IMAGE_BUNDLE_DROP"; //-------end--------// public static final String TILE_TAG = "TILE"; diff --git a/src/main/java/games/rednblack/editor/controller/BootstrapViewCommand.java b/src/main/java/games/rednblack/editor/controller/BootstrapViewCommand.java index 6326a396..08db49d5 100644 --- a/src/main/java/games/rednblack/editor/controller/BootstrapViewCommand.java +++ b/src/main/java/games/rednblack/editor/controller/BootstrapViewCommand.java @@ -18,20 +18,52 @@ package games.rednblack.editor.controller; -import games.rednblack.editor.HyperLap2DFacade; -import games.rednblack.editor.splash.SplashScreenAdapter; -import games.rednblack.editor.view.ui.*; -import games.rednblack.editor.view.menu.HyperLap2DMenuBarMediator; -import games.rednblack.editor.view.HyperLap2DScreenMediator; -import games.rednblack.editor.view.stage.SandboxMediator; -import games.rednblack.editor.view.stage.UIStageMediator; -import games.rednblack.editor.view.ui.box.*; -import games.rednblack.editor.view.ui.box.bottom.*; -import games.rednblack.editor.view.ui.dialog.*; -import games.rednblack.editor.view.ui.panel.*; import org.puremvc.java.interfaces.INotification; import org.puremvc.java.patterns.command.SimpleCommand; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.splash.SplashScreenAdapter; +import games.rednblack.editor.view.HyperLap2DScreenMediator; +import games.rednblack.editor.view.menu.HyperLap2DMenuBarMediator; +import games.rednblack.editor.view.stage.SandboxMediator; +import games.rednblack.editor.view.stage.UIStageMediator; +import games.rednblack.editor.view.ui.FollowersUIMediator; +import games.rednblack.editor.view.ui.ImageResourceSelectionUIMediator; +import games.rednblack.editor.view.ui.RulersUIMediator; +import games.rednblack.editor.view.ui.StickyNotesUIMediator; +import games.rednblack.editor.view.ui.UIDropDownMenuMediator; +import games.rednblack.editor.view.ui.UIWindowActionMediator; +import games.rednblack.editor.view.ui.UIWindowTitleMediator; +import games.rednblack.editor.view.ui.box.UIAlignBoxMediator; +import games.rednblack.editor.view.ui.box.UICompositeHierarchyMediator; +import games.rednblack.editor.view.ui.box.UIItemsTreeBoxMediator; +import games.rednblack.editor.view.ui.box.UILayerBoxMediator; +import games.rednblack.editor.view.ui.box.UIMultiPropertyBoxMediator; +import games.rednblack.editor.view.ui.box.UIResourcesBoxMediator; +import games.rednblack.editor.view.ui.box.UIToolBoxMediator; +import games.rednblack.editor.view.ui.box.bottom.UIGridBoxMediator; +import games.rednblack.editor.view.ui.box.bottom.UILivePreviewBoxMediator; +import games.rednblack.editor.view.ui.box.bottom.UIResolutionBoxMediator; +import games.rednblack.editor.view.ui.box.bottom.UISceneBoxMediator; +import games.rednblack.editor.view.ui.box.bottom.UIZoomBoxMediator; +import games.rednblack.editor.view.ui.dialog.AboutDialogMediator; +import games.rednblack.editor.view.ui.dialog.AutoTraceDialogMediator; +import games.rednblack.editor.view.ui.dialog.CodeEditorDialogMediator; +import games.rednblack.editor.view.ui.dialog.ConsoleDialogMediator; +import games.rednblack.editor.view.ui.dialog.CreateNewResolutionDialogMediator; +import games.rednblack.editor.view.ui.dialog.CreateNoiseDialogMediator; +import games.rednblack.editor.view.ui.dialog.CreatePlaceholderDialogMediator; +import games.rednblack.editor.view.ui.dialog.LoadingBarDialogMediator; +import games.rednblack.editor.view.ui.dialog.NewProjectDialogMediator; +import games.rednblack.editor.view.ui.dialog.NodeEditorDialogMediator; +import games.rednblack.editor.view.ui.dialog.SaveProjectDialogMediator; +import games.rednblack.editor.view.ui.dialog.SettingsDialogMediator; +import games.rednblack.editor.view.ui.panel.CustomVariablesPanelMediator; +import games.rednblack.editor.view.ui.panel.EditSpriteAnimationPanelMediator; +import games.rednblack.editor.view.ui.panel.ImportPanelMediator; +import games.rednblack.editor.view.ui.panel.ShaderUniformsPanelMediator; +import games.rednblack.editor.view.ui.panel.TagsPanelMediator; + /** * Created by sargis on 4/1/15. */ @@ -67,6 +99,9 @@ public class BootstrapViewCommand extends SimpleCommand { facade.registerMediator(new UIStageMediator()); facade.registerMediator(new SandboxMediator()); facade.registerMediator(new UIDropDownMenuMediator()); + + // improved selection behavior for the image panel + facade.registerMediator(new ImageResourceSelectionUIMediator()); //Panels facade.registerMediator(new ImportPanelMediator()); diff --git a/src/main/java/games/rednblack/editor/view/HyperLap2DScreen.java b/src/main/java/games/rednblack/editor/view/HyperLap2DScreen.java index 92f4c352..4f3ea266 100644 --- a/src/main/java/games/rednblack/editor/view/HyperLap2DScreen.java +++ b/src/main/java/games/rednblack/editor/view/HyperLap2DScreen.java @@ -19,7 +19,11 @@ package games.rednblack.editor.view; import com.badlogic.ashley.core.Engine; -import com.badlogic.gdx.*; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Graphics; +import com.badlogic.gdx.InputMultiplexer; +import com.badlogic.gdx.InputProcessor; +import com.badlogic.gdx.Screen; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.Texture; @@ -29,20 +33,22 @@ import com.badlogic.gdx.scenes.scene2d.Touchable; import com.badlogic.gdx.scenes.scene2d.actions.Actions; import com.badlogic.gdx.scenes.scene2d.ui.Image; import com.badlogic.gdx.utils.Align; + import games.rednblack.editor.HyperLap2DApp; +import games.rednblack.editor.HyperLap2DFacade; import games.rednblack.editor.proxy.ProjectManager; import games.rednblack.editor.proxy.SettingsManager; import games.rednblack.editor.utils.KeyBindingsLayout; import games.rednblack.editor.view.menu.FileMenu; import games.rednblack.editor.view.menu.ResourcesMenu; +import games.rednblack.editor.view.stage.Sandbox; +import games.rednblack.editor.view.stage.UIStage; +import games.rednblack.editor.view.stage.input.MetaKeyInputProcessor; +import games.rednblack.editor.view.stage.input.SandboxInputAdapter; +import games.rednblack.editor.view.ui.widget.actors.basic.SandboxBackUI; import games.rednblack.editor.view.ui.widget.actors.basic.WhitePixel; import games.rednblack.h2d.common.MenuAPI; import games.rednblack.h2d.common.MsgAPI; -import games.rednblack.editor.view.ui.widget.actors.basic.SandboxBackUI; -import games.rednblack.editor.view.stage.Sandbox; -import games.rednblack.editor.HyperLap2DFacade; -import games.rednblack.editor.view.stage.UIStage; -import games.rednblack.editor.view.stage.input.SandboxInputAdapter; import games.rednblack.h2d.common.vo.SceneConfigVO; public class HyperLap2DScreen implements Screen, InputProcessor { @@ -141,6 +147,7 @@ public class HyperLap2DScreen implements Screen, InputProcessor { multiplexer.addProcessor(this); multiplexer.addProcessor(uiStage); multiplexer.addProcessor(new SandboxInputAdapter()); + multiplexer.addProcessor(MetaKeyInputProcessor.getInstance()); Gdx.input.setInputProcessor(multiplexer); } diff --git a/src/main/java/games/rednblack/editor/view/stage/input/MetaKeyInputProcessor.java b/src/main/java/games/rednblack/editor/view/stage/input/MetaKeyInputProcessor.java new file mode 100644 index 00000000..f2ddc854 --- /dev/null +++ b/src/main/java/games/rednblack/editor/view/stage/input/MetaKeyInputProcessor.java @@ -0,0 +1,132 @@ +package games.rednblack.editor.view.stage.input; + +import com.badlogic.gdx.Input; +import com.badlogic.gdx.InputProcessor; + +/** + * This processor serves other {@link InputListener} as a helper to know if the shift/alt/ctrl keys are pressed. + * + * This class is implemented as a singleton. + * + * @author Jan-Thierry Wegener + * + */ +public final class MetaKeyInputProcessor implements InputProcessor { + + private static MetaKeyInputProcessor INSTANCE; + + private boolean isShiftDown = false; + private boolean isCtrlDown = false; + private boolean isAltDown = false; + + private MetaKeyInputProcessor() { + } + + /** + * Facade Singleton Factory method + * + * @return The Singleton instance of the processor. + */ + public synchronized static MetaKeyInputProcessor getInstance() { + if (INSTANCE == null) { + INSTANCE = new MetaKeyInputProcessor(); + } + return INSTANCE; + } + + /** + * Returns whether a shift key is currently pressed or not. + * + * @return true if one of the shift keys is pressed, false otherwise. + */ + public boolean isShiftDown() { + return isShiftDown; + } + + /** + * Returns whether a control key is currently pressed or not. + * + * @return true if one of the ctrl keys is pressed, false otherwise. + */ + public boolean isCtrlDown() { + return isCtrlDown; + } + + /** + * Returns whether a alt key is currently pressed or not. + * + * @return true if one of the alt keys is pressed, false otherwise. + */ + public boolean isAltDown() { + return isAltDown; + } + + @Override + public boolean keyDown(int keycode) { + switch (keycode) { + case Input.Keys.SHIFT_LEFT: + case Input.Keys.SHIFT_RIGHT: + isShiftDown = true; + break; + case Input.Keys.ALT_LEFT: + case Input.Keys.ALT_RIGHT: + isAltDown = true; + break; + case Input.Keys.CONTROL_LEFT: + case Input.Keys.CONTROL_RIGHT: + isCtrlDown = true; + break; + } + return false; + } + + @Override + public boolean keyUp(int keycode) { + switch (keycode) { + case Input.Keys.SHIFT_LEFT: + case Input.Keys.SHIFT_RIGHT: + isShiftDown = false; + break; + case Input.Keys.ALT_LEFT: + case Input.Keys.ALT_RIGHT: + isAltDown = false; + break; + case Input.Keys.CONTROL_LEFT: + case Input.Keys.CONTROL_RIGHT: + isCtrlDown = false; + break; + } + return false; + } + + @Override + public boolean keyTyped(char character) { + return false; + } + + @Override + public boolean touchDown(int screenX, int screenY, int pointer, int button) { + return false; + } + + @Override + public boolean touchUp(int screenX, int screenY, int pointer, int button) { + return false; + } + + @Override + public boolean touchDragged(int screenX, int screenY, int pointer) { + return false; + } + + @Override + public boolean mouseMoved(int screenX, int screenY) { + return false; + } + + @Override + public boolean scrolled(float amountX, float amountY) { + return false; + } + +} diff --git a/src/main/java/games/rednblack/editor/view/ui/ImageResourceSelectionUIMediator.java b/src/main/java/games/rednblack/editor/view/ui/ImageResourceSelectionUIMediator.java new file mode 100644 index 00000000..302af7ae --- /dev/null +++ b/src/main/java/games/rednblack/editor/view/ui/ImageResourceSelectionUIMediator.java @@ -0,0 +1,155 @@ +package games.rednblack.editor.view.ui; + +import java.util.HashSet; +import java.util.Set; +import java.util.SortedSet; +import java.util.TreeSet; + +import org.puremvc.java.interfaces.INotification; +import org.puremvc.java.patterns.mediator.Mediator; + +import com.badlogic.gdx.scenes.scene2d.ui.Cell; +import com.kotcrab.vis.ui.widget.VisTable; + +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.view.ui.box.UIResourcesBoxMediator; +import games.rednblack.editor.view.ui.box.resourcespanel.UIImagesTab; +import games.rednblack.editor.view.ui.box.resourcespanel.draggable.box.ImageResource; + +/** + * This mediator is part of the behavior that allows multiple images to be selected and dropped to other panels (like the GridTilesTab from the tiles plugin). + * + * @author Jan-Thierry Wegener + */ +public class ImageResourceSelectionUIMediator extends Mediator { + + public static final String NAME = ImageResourceSelectionUIMediator.class.getCanonicalName(); + + private final SortedSet imageResourceSelectedSet = new TreeSet<>(); + + /** + * The image table from {@link UIImagesTab}. This is the table we add our selection behavior to. + */ + private VisTable imagesTable; + + private ImageResource imageResourcePreviousClick; + + public ImageResourceSelectionUIMediator() { + super(NAME); + } + + @Override + public void onRegister() { + super.onRegister(); + } + + @Override + public String[] listNotificationInterests() { + return new String[]{ + UIResourcesBoxMediator.IMAGE_LEFT_CLICK, + UIResourcesBoxMediator.IMAGE_BUNDLE_DROP, + UIResourcesBoxMediator.IMAGE_TABLE_UPDATED + }; + } + + @Override + public void handleNotification(INotification notification) { + super.handleNotification(notification); + + switch (notification.getName()) { + case UIResourcesBoxMediator.IMAGE_LEFT_CLICK: + ImageResource imageResource = notification.getBody(); + if (imageResourceSelectedSet.remove(imageResource.getPayloadData().name)) { + setSelected(imageResource, false); + if (UIResourcesBoxMediator.SHIFT_EVENT_TYPE.equals(notification.getType())) { + removeBetween(imageResourcePreviousClick, imageResource); + } + } else { + setSelected(imageResource, true); + if (UIResourcesBoxMediator.SHIFT_EVENT_TYPE.equals(notification.getType())) { + addSelectionBetween(imageResourcePreviousClick, imageResource); + } + } + imageResourcePreviousClick = imageResource; + break; + case UIResourcesBoxMediator.IMAGE_BUNDLE_DROP: + Set nameSet = new HashSet<>(imageResourceSelectedSet); + // remove the dropped one, so that it is not added twice + Object[] payloadBody = notification.getBody(); + nameSet.remove(payloadBody[0]); + for (String name : nameSet) { + HyperLap2DFacade.getInstance().sendNotification(UIResourcesBoxMediator.IMAGE_BUNDLE_DROP_SINGLE, new Object[] {name, payloadBody[1]}); + } + break; + case UIResourcesBoxMediator.IMAGE_TABLE_UPDATED: + imagesTable = notification.getBody(); + break; + default: + System.err.println("Unknown notification: " + notification); + } + + } + + private void setSelected(ImageResource imageResource, boolean isSelected) { + if (isSelected) { + imageResource.switchToMouseOverColor(); + imageResource.setHighlightWhenMouseOver(false); + imageResourceSelectedSet.add(imageResource.getPayloadData().name); + } else { + imageResource.switchToStandardColor(); + imageResource.setHighlightWhenMouseOver(true); + imageResourceSelectedSet.remove(imageResource.getPayloadData().name); + } + } + + private int getCellIndex(ImageResource imageResource, int defaultIndex) { + Cell cell = imagesTable.getCell(imageResource); + int index = defaultIndex; + if (cell != null) { + // compute the indixes, should be faster than iterating over the array of cells + index = cell.getRow() * imagesTable.getColumns() + cell.getColumn(); + } + return index; + } + + private void addSelectionBetween(ImageResource imageResourceStart, ImageResource imageResourceEnd) { + int startIndex = getCellIndex(imageResourceStart, 0); + int endIndex = getCellIndex(imageResourceEnd, imagesTable.getCells().size - 1); + + // we want to start with start :) + if (endIndex < startIndex) { + int tmp = startIndex; + startIndex = endIndex; + // add one to include the previously clicked image + endIndex = tmp; + } + + for (int i = startIndex; i <= endIndex; i++) { + Cell cell = imagesTable.getCells().get(i); + ImageResource imageResource = cell.getActor(); + setSelected(imageResource, true); + } + } + + private void removeBetween(ImageResource imageResourceStart, ImageResource imageResourceEnd) { + int startIndex = getCellIndex(imageResourceStart, 0); + int endIndex = getCellIndex(imageResourceEnd, imagesTable.getCells().size - 1); + + // we want to start with start :) + if (endIndex < startIndex) { + int tmp = startIndex; + startIndex = endIndex; + // add one to include the previously clicked image + endIndex = tmp; + } + + for (int i = startIndex; i <= endIndex; i++) { + Cell cell = imagesTable.getCells().get(i); + ImageResource imageResource = cell.getActor(); + setSelected(imageResource, false); + } + } + + + +} diff --git a/src/main/java/games/rednblack/editor/view/ui/box/UIResourcesBoxMediator.java b/src/main/java/games/rednblack/editor/view/ui/box/UIResourcesBoxMediator.java index c326146e..8b34a757 100644 --- a/src/main/java/games/rednblack/editor/view/ui/box/UIResourcesBoxMediator.java +++ b/src/main/java/games/rednblack/editor/view/ui/box/UIResourcesBoxMediator.java @@ -18,16 +18,22 @@ package games.rednblack.editor.view.ui.box; -import com.badlogic.gdx.scenes.scene2d.utils.DragAndDrop; -import com.badlogic.gdx.utils.Array; -import games.rednblack.editor.view.ui.box.resourcespanel.*; -import games.rednblack.h2d.common.MsgAPI; -import games.rednblack.editor.HyperLap2DFacade; -import games.rednblack.editor.proxy.ProjectManager; -import games.rednblack.h2d.common.view.ui.widget.imagetabbedpane.ImageTab; +import java.util.stream.Stream; + import org.puremvc.java.interfaces.INotification; -import java.util.stream.Stream; +import com.badlogic.gdx.scenes.scene2d.utils.DragAndDrop; +import com.badlogic.gdx.utils.Array; + +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.proxy.ProjectManager; +import games.rednblack.editor.view.ui.box.resourcespanel.UIActionsTabMediator; +import games.rednblack.editor.view.ui.box.resourcespanel.UIAnimationsTabMediator; +import games.rednblack.editor.view.ui.box.resourcespanel.UIImagesTabMediator; +import games.rednblack.editor.view.ui.box.resourcespanel.UILibraryItemsTabMediator; +import games.rednblack.editor.view.ui.box.resourcespanel.UIParticleEffectsTabMediator; +import games.rednblack.h2d.common.MsgAPI; +import games.rednblack.h2d.common.view.ui.widget.imagetabbedpane.ImageTab; /** * Created by azakhary on 4/17/2015. @@ -39,6 +45,15 @@ public class UIResourcesBoxMediator extends PanelMediator { private static final String PREFIX = "games.rednblack.editor.view.ui.box.UIResourcesBoxMediator"; + public static final String IMAGE_LEFT_CLICK = PREFIX + ".IMAGE_LEFT_CLICK"; + public static final String IMAGE_BUNDLE_DROP = PREFIX + ".IMAGE_BUNDLE_DROP"; + public static final String IMAGE_BUNDLE_DROP_SINGLE = PREFIX + ".IMAGE_BUNDLE_DROP_SINGLE"; + + + public static final String SHIFT_EVENT_TYPE = PREFIX + ".SHIFT_EVENT_TYPE"; + + public static final String IMAGE_TABLE_UPDATED = PREFIX + ".IMAGE_TABLE_UPDATED"; + public static final String IMAGE_RIGHT_CLICK = PREFIX + ".IMAGE_RIGHT_CLICK"; public static final String SPINE_ANIMATION_RIGHT_CLICK = PREFIX + ".SPINE_ANIMATION_RIGHT_CLICK"; public static final String SPRITE_ANIMATION_RIGHT_CLICK = PREFIX + ".SPRITE_ANIMATION_RIGHT_CLICK"; diff --git a/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/UIAnimationsTabMediator.java b/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/UIAnimationsTabMediator.java index 5d69797e..d66bf881 100644 --- a/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/UIAnimationsTabMediator.java +++ b/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/UIAnimationsTabMediator.java @@ -18,26 +18,28 @@ package games.rednblack.editor.view.ui.box.resourcespanel; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.Set; +import java.util.function.BiFunction; + +import org.apache.commons.lang3.ArrayUtils; +import org.puremvc.java.interfaces.INotification; + +import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Array; -import games.rednblack.h2d.extention.spine.SpineItemType; + import games.rednblack.editor.controller.commands.resource.DeleteSpineAnimation; import games.rednblack.editor.controller.commands.resource.DeleteSpriteAnimation; import games.rednblack.editor.factory.ItemFactory; import games.rednblack.editor.proxy.ResourceManager; import games.rednblack.editor.renderer.factory.EntityFactory; -import games.rednblack.editor.view.stage.Sandbox; import games.rednblack.editor.view.ui.box.resourcespanel.draggable.DraggableResource; -import games.rednblack.editor.view.ui.box.resourcespanel.draggable.DraggableResourceView; +import games.rednblack.editor.view.ui.box.resourcespanel.draggable.box.BoxItemResource; import games.rednblack.editor.view.ui.box.resourcespanel.draggable.box.SpineResource; import games.rednblack.editor.view.ui.box.resourcespanel.draggable.box.SpriteResource; -import org.apache.commons.lang3.ArrayUtils; -import org.puremvc.java.interfaces.INotification; - -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.util.Set; -import java.util.function.BiFunction; +import games.rednblack.h2d.extention.spine.SpineItemType; /** * Created by azakhary on 4/17/2015. @@ -87,12 +89,13 @@ public class UIAnimationsTabMediator extends UIResourcesTabMediator strings, Class resourceClass, BiFunction factoryFunction, String searchText) { + private void createAnimationResources(Set strings, Class resourceClass, BiFunction factoryFunction, String searchText) { for (String animationName : strings) { if (!animationName.contains(searchText)) continue; try { - Constructor constructor = resourceClass.getConstructor(String.class); - DraggableResource draggableResource = new DraggableResource((DraggableResourceView) constructor.newInstance(animationName)); + Constructor constructor = resourceClass.getConstructor(String.class, Color.class, Color.class, Color.class, Color.class, boolean.class); + DraggableResource draggableResource = new DraggableResource(constructor.newInstance(animationName, new Color(1, 1, 1, 0.2f), new Color(1, 1, 1, 0.4f), + new Color(200f / 255f, 200f / 255f, 200f / 255f, 0.2f), new Color(255f / 255f, 94f / 255f, 0f / 255f, 1f), true)); draggableResource.initDragDrop(); draggableResource.setFactoryFunction(factoryFunction); animationBoxes.add(draggableResource); diff --git a/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/UIImagesTab.java b/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/UIImagesTab.java index a87f5488..394c17b9 100644 --- a/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/UIImagesTab.java +++ b/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/UIImagesTab.java @@ -19,13 +19,14 @@ package games.rednblack.editor.view.ui.box.resourcespanel; import com.badlogic.gdx.scenes.scene2d.Actor; -import com.badlogic.gdx.scenes.scene2d.utils.Drawable; import com.badlogic.gdx.utils.Array; -import com.kotcrab.vis.ui.VisUI; import com.kotcrab.vis.ui.widget.VisScrollPane; import com.kotcrab.vis.ui.widget.VisTable; -import games.rednblack.h2d.common.view.ui.StandardWidgetsFactory; + +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.view.ui.box.UIResourcesBoxMediator; import games.rednblack.editor.view.ui.box.resourcespanel.draggable.DraggableResource; +import games.rednblack.h2d.common.view.ui.StandardWidgetsFactory; /** * Created by azakhary on 4/17/2015. @@ -64,5 +65,6 @@ public class UIImagesTab extends UIResourcesTab { imagesTable.row(); } } + HyperLap2DFacade.getInstance().sendNotification(UIResourcesBoxMediator.IMAGE_TABLE_UPDATED, imagesTable); } } diff --git a/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/UIImagesTabMediator.java b/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/UIImagesTabMediator.java index f7831bb9..2fc3a5af 100644 --- a/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/UIImagesTabMediator.java +++ b/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/UIImagesTabMediator.java @@ -18,16 +18,18 @@ package games.rednblack.editor.view.ui.box.resourcespanel; +import org.apache.commons.lang3.ArrayUtils; +import org.puremvc.java.interfaces.INotification; + +import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.utils.Array; + import games.rednblack.editor.controller.commands.resource.DeleteImageResource; -import games.rednblack.editor.view.stage.Sandbox; import games.rednblack.editor.factory.ItemFactory; import games.rednblack.editor.proxy.ResourceManager; import games.rednblack.editor.view.ui.box.resourcespanel.draggable.DraggableResource; import games.rednblack.editor.view.ui.box.resourcespanel.draggable.box.ImageResource; -import org.apache.commons.lang3.ArrayUtils; -import org.puremvc.java.interfaces.INotification; /** * Created by azakhary on 4/17/2015. @@ -74,7 +76,9 @@ public class UIImagesTabMediator extends UIResourcesTabMediator { for (TextureAtlas.AtlasRegion region : new Array.ArrayIterator<>(atlasRegions)) { if(!region.name.contains(searchText))continue; boolean is9patch = region.findValue("split") != null; - DraggableResource draggableResource = new DraggableResource(new ImageResource(region)); + ImageResource imageResource = new ImageResource(region, new Color(1, 1, 1, 0.2f), new Color(1, 1, 1, 0.4f), + new Color(200f / 255f, 200f / 255f, 200f / 255f, 0.2f), new Color(255f / 255f, 94f / 255f, 0f / 255f, 1f), true); + DraggableResource draggableResource = new DraggableResource(imageResource); if (is9patch) { draggableResource.setFactoryFunction(ItemFactory.get()::create9Patch); } else { diff --git a/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/draggable/box/BoxItemResource.java b/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/draggable/box/BoxItemResource.java index 45056054..dfcda3fa 100644 --- a/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/draggable/box/BoxItemResource.java +++ b/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/draggable/box/BoxItemResource.java @@ -20,13 +20,18 @@ package games.rednblack.editor.view.ui.box.resourcespanel.draggable.box; import com.badlogic.gdx.Input; import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.Group; import com.badlogic.gdx.scenes.scene2d.InputEvent; import com.badlogic.gdx.scenes.scene2d.InputListener; +import com.badlogic.gdx.utils.Null; + import games.rednblack.editor.HyperLap2DFacade; -import games.rednblack.editor.view.ui.widget.actors.basic.PixelRect; import games.rednblack.editor.view.stage.Sandbox; +import games.rednblack.editor.view.stage.input.MetaKeyInputProcessor; +import games.rednblack.editor.view.ui.box.UIResourcesBoxMediator; import games.rednblack.editor.view.ui.box.resourcespanel.draggable.DraggableResourceView; +import games.rednblack.editor.view.ui.widget.actors.basic.PixelRect; /** * Created by sargis on 5/6/15. @@ -36,27 +41,134 @@ public abstract class BoxItemResource extends Group implements DraggableResource protected float thumbnailSize = 50; protected PixelRect rc; + /** + * The color to fill the background of the image. Also the color of the background when the mouse is not over the image. + */ + private final Color fillColor; + /** + * The standard color of the border. Also the color of the border when the mouse is not over the image. + */ + private final Color borderColor; + /** + * The color of the border when the mouse hovers over the image. + */ + private final Color borderMouseOverColor; + /** + * The color to fill the background of the image when the mouse hovers over the image. + */ + private final Color fillMouseOverColor; + /** + * Whether to change the border color when the mouse hovers over the image. + */ + private boolean highlightWhenMouseOver; + public BoxItemResource() { + this(new Color(1, 1, 1, 0.2f), new Color(1, 1, 1, 0.4f), Color.BLACK, Color.BLACK, false); + } + + /** + * Creates a new box item resource with the given colors. + * + * @param region The atlas region for the image resource. + * @param fillColor The color to fill the background of the image. + * @param borderColor The standard color of the border. Also used when the mouse is not hovering over the image. + * @param fillMouseOverColor The color to fill the background of the image when the mouse hovers over the image. Only used if the the parameter highlightWhenMouseOver is set to true. + * @param borderMouseOverColor The color of the border when the mouse hovers over the image. Only used if the the parameter highlightWhenMouseOver is set to true. + * @param highlightWhenMouseOver Whether to change the border color when the mouse hovers over the image. + */ + public BoxItemResource(Color fillColor, Color borderColor, Color fillMouseOverColor, Color borderMouseOverColor, boolean highlightWhenMouseOver) { sandbox = Sandbox.getInstance(); rc = new PixelRect(thumbnailSize, thumbnailSize); - rc.setFillColor(new Color(1, 1, 1, 0.2f)); - rc.setBorderColor(new Color(1, 1, 1, 0.4f)); + rc.setFillColor(fillColor); + rc.setBorderColor(borderColor); addActor(rc); setWidth(thumbnailSize); setHeight(thumbnailSize); + + this.fillColor = fillColor; + this.borderColor = borderColor; + this.fillMouseOverColor = fillMouseOverColor; + this.borderMouseOverColor = borderMouseOverColor; + this.highlightWhenMouseOver = highlightWhenMouseOver; } + /** + * Sets the right-click event. Should not be used with {@link #setClickEvent(String, String, String)}. + * + * @param eventName The event name in case of a right-click. + * @param payload The payload for the right-click. + */ public void setRightClickEvent(String eventName, String payload) { + setClickEvent(null, eventName, null, payload); + } + + /** + * Sets the left/right-click event. Should not be used with {@link #setRightClickEvent(String, String)}. + * + * @param leftClickEventName The event name in case of a left-click. + * @param leftClickPayload The payload for the left-click. + * @param rightClickEventName The event name in case of a right-click. + * @param rightClickPayload The payload for the right-click. + */ + public void setClickEvent(String leftClickEventName, String rightClickEventName, Object leftClickPayload, Object rightClickPayload) { addListener(new InputListener() { - public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) { + private boolean isOver; + @Override + public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) { super.touchDown(event, x, y, pointer, button); return true; } - public void touchUp (InputEvent event, float x, float y, int pointer, int button) { - if(button == Input.Buttons.RIGHT) { - HyperLap2DFacade.getInstance().sendNotification(eventName, payload); - } + @Override + public void touchUp (InputEvent event, float x, float y, int pointer, int button) { + // we only care for the event if the mouse is still in this resource + if (isOver && !event.isTouchFocusCancel()) { + if(button == Input.Buttons.LEFT && leftClickEventName != null) { + String shiftEventType = MetaKeyInputProcessor.getInstance().isShiftDown() ? UIResourcesBoxMediator.SHIFT_EVENT_TYPE : null; + HyperLap2DFacade.getInstance().sendNotification(leftClickEventName, leftClickPayload, shiftEventType); + } + if(button == Input.Buttons.RIGHT && rightClickEventName != null) { + HyperLap2DFacade.getInstance().sendNotification(rightClickEventName, rightClickPayload); + } + } + } + @Override + public void enter (InputEvent event, float x, float y, int pointer, @Null Actor fromActor) { + // mouse is in the resource + isOver = true; + // check if we have to change the color + if (highlightWhenMouseOver) { + switchToMouseOverColor(); + } + } + @Override + public void exit (InputEvent event, float x, float y, int pointer, @Null Actor fromActor) { + // mouse no longer in the resource + isOver = false; + // check if we have to revert the color + if (highlightWhenMouseOver) { + rc.setFillColor(fillColor); + rc.setBorderColor(borderColor); + } } }); } + + public void setHighlightWhenMouseOver(boolean highlightWhenMouseOver) { + this.highlightWhenMouseOver = highlightWhenMouseOver; + } + + public void switchToMouseOverColor() { + if (fillMouseOverColor != null && borderMouseOverColor != null) { + rc.setFillColor(fillMouseOverColor); + rc.setBorderColor(borderMouseOverColor); + } + } + + public void switchToStandardColor() { + if (fillColor != null && borderColor != null) { + rc.setFillColor(fillColor); + rc.setBorderColor(borderColor); + } + } + } diff --git a/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/draggable/box/ImageResource.java b/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/draggable/box/ImageResource.java index 6d46af4c..2d94ed5b 100644 --- a/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/draggable/box/ImageResource.java +++ b/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/draggable/box/ImageResource.java @@ -18,19 +18,39 @@ package games.rednblack.editor.view.ui.box.resourcespanel.draggable.box; +import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.g2d.TextureAtlas.AtlasRegion; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.ui.Image; -import games.rednblack.h2d.common.ResourcePayloadObject; + import games.rednblack.editor.view.ui.box.UIResourcesBoxMediator; +import games.rednblack.h2d.common.ResourcePayloadObject; public class ImageResource extends BoxItemResource { private final Image payloadImg; private final ResourcePayloadObject payload; - + public ImageResource(AtlasRegion region) { + // this is not changing the behavior of the former constructor + // as long as the colors of the super class are not changed + this(region, new Color(1, 1, 1, 0.2f), new Color(1, 1, 1, 0.4f), Color.BLACK, Color.BLACK, false); + } + + /** + * Creates a new image resource from the given {@link AtlasRegion}. + * + * @param region The atlas region for the image resource. + * @param fillColor The color to fill the background of the image. + * @param borderColor The standard color of the border. Also used when the mouse is not hovering over the image. + * @param fillMouseOverColor The color to fill the background of the image when the mouse hovers over the image. Only used if the the parameter highlightWhenMouseOver is set to true. + * @param borderMouseOverColor The color of the border when the mouse hovers over the image. Only used if the the parameter highlightWhenMouseOver is set to true. + * @param highlightWhenMouseOver Whether to change the border color when the mouse hovers over the image. + */ + public ImageResource(AtlasRegion region, Color fillColor, Color borderColor, Color fillMouseOverColor, Color borderMouseOverColor, boolean highlightWhenMouseOver) { + super(fillColor, borderColor, fillMouseOverColor, borderMouseOverColor, highlightWhenMouseOver); + Image img = new Image(region); if (img.getWidth() > thumbnailSize || img.getHeight() > thumbnailSize) { // resizing is needed @@ -52,8 +72,8 @@ public class ImageResource extends BoxItemResource { } addActor(img); - - setRightClickEvent(UIResourcesBoxMediator.IMAGE_RIGHT_CLICK, region.name); + + setClickEvent(UIResourcesBoxMediator.IMAGE_LEFT_CLICK, UIResourcesBoxMediator.IMAGE_RIGHT_CLICK, this, region.name); payloadImg = new Image(region); payload = new ResourcePayloadObject(); @@ -70,4 +90,5 @@ public class ImageResource extends BoxItemResource { public ResourcePayloadObject getPayloadData() { return payload; } + } diff --git a/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/draggable/box/SpineResource.java b/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/draggable/box/SpineResource.java index c5e44b67..eed06626 100644 --- a/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/draggable/box/SpineResource.java +++ b/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/draggable/box/SpineResource.java @@ -19,14 +19,16 @@ package games.rednblack.editor.view.ui.box.resourcespanel.draggable.box; import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.InputEvent; import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; -import games.rednblack.h2d.common.ResourcePayloadObject; + import games.rednblack.editor.HyperLap2DFacade; import games.rednblack.editor.renderer.data.SpineVO; import games.rednblack.editor.view.ui.box.UIResourcesBoxMediator; import games.rednblack.editor.view.ui.widget.actors.SpineActor; +import games.rednblack.h2d.common.ResourcePayloadObject; /** * Created by azakhary on 7/3/2014. @@ -40,7 +42,23 @@ public class SpineResource extends BoxItemResource { private boolean isMouseInside = false; public SpineResource(String animationName) { - super(); + // this is not changing the behavior of the former constructor + // as long as the colors of the super class are not changed + this(animationName, new Color(1, 1, 1, 0.2f), new Color(1, 1, 1, 0.4f), Color.BLACK, Color.BLACK, false); + } + + /** + * Creates a new spine resource from the given animation name. + * + * @param animationName The of the animation for the spine resource. + * @param fillColor The color to fill the background of the image. + * @param borderColor The standard color of the border. Also used when the mouse is not hovering over the image. + * @param fillMouseOverColor The color to fill the background of the image when the mouse hovers over the image. Only used if the the parameter highlightWhenMouseOver is set to true. + * @param borderMouseOverColor The color of the border when the mouse hovers over the image. Only used if the the parameter highlightWhenMouseOver is set to true. + * @param highlightWhenMouseOver Whether to change the border color when the mouse hovers over the image. + */ + public SpineResource(String animationName, Color fillColor, Color borderColor, Color fillMouseOverColor, Color borderMouseOverColor, boolean highlightWhenMouseOver) { + super(fillColor, borderColor, fillMouseOverColor, borderMouseOverColor, highlightWhenMouseOver); facade = HyperLap2DFacade.getInstance(); SpineVO vo = new SpineVO(); vo.animationName = animationName; @@ -69,12 +87,14 @@ public class SpineResource extends BoxItemResource { animThumb.setAnimation(animThumb.skeletonData.getAnimations().get(0).getName()); addListener(new ClickListener() { - public void enter(InputEvent event, float x, float y, int pointer, Actor fromActor) { + @Override + public void enter(InputEvent event, float x, float y, int pointer, Actor fromActor) { isMouseInside = true; super.enter(event, x, y, pointer, fromActor); } - public void exit(InputEvent event, float x, float y, int pointer, Actor toActor) { + @Override + public void exit(InputEvent event, float x, float y, int pointer, Actor toActor) { isMouseInside = false; super.enter(event, x, y, pointer, toActor); } diff --git a/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/draggable/box/SpriteResource.java b/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/draggable/box/SpriteResource.java index ce753d8b..210b3785 100644 --- a/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/draggable/box/SpriteResource.java +++ b/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/draggable/box/SpriteResource.java @@ -18,14 +18,16 @@ package games.rednblack.editor.view.ui.box.resourcespanel.draggable.box; +import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.InputEvent; import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; -import games.rednblack.h2d.common.ResourcePayloadObject; + import games.rednblack.editor.renderer.data.SpriteAnimationVO; import games.rednblack.editor.renderer.resources.IResourceRetriever; import games.rednblack.editor.view.ui.box.UIResourcesBoxMediator; import games.rednblack.editor.view.ui.widget.actors.SpriteAnimationActor; +import games.rednblack.h2d.common.ResourcePayloadObject; /** * Created by azakhary on 7/3/2014. @@ -40,7 +42,23 @@ public class SpriteResource extends BoxItemResource { private boolean isMouseInside = false; public SpriteResource(String animationName) { - super(); + // this is not changing the behavior of the former constructor + // as long as the colors of the super class are not changed + this(animationName, new Color(1, 1, 1, 0.2f), new Color(1, 1, 1, 0.4f), Color.BLACK, Color.BLACK, false); + } + + /** + * Creates a new sprite resource from the given animation name. + * + * @param animationName The of the animation for the sprite resource. + * @param fillColor The color to fill the background of the image. + * @param borderColor The standard color of the border. Also used when the mouse is not hovering over the image. + * @param fillMouseOverColor The color to fill the background of the image when the mouse hovers over the image. Only used if the the parameter highlightWhenMouseOver is set to true. + * @param borderMouseOverColor The color of the border when the mouse hovers over the image. Only used if the the parameter highlightWhenMouseOver is set to true. + * @param highlightWhenMouseOver Whether to change the border color when the mouse hovers over the image. + */ + public SpriteResource(String animationName, Color fillColor, Color borderColor, Color fillMouseOverColor, Color borderMouseOverColor, boolean highlightWhenMouseOver) { + super(fillColor, borderColor, fillMouseOverColor, borderMouseOverColor, highlightWhenMouseOver); SpriteAnimationVO vo = new SpriteAnimationVO(); vo.animationName = animationName; @@ -68,11 +86,13 @@ public class SpriteResource extends BoxItemResource { addListener(new ClickListener() { + @Override public void enter(InputEvent event, float x, float y, int pointer, Actor fromActor) { isMouseInside = true; super.enter(event, x, y, pointer, fromActor); } + @Override public void exit(InputEvent event, float x, float y, int pointer, Actor toActor) { isMouseInside = false; super.enter(event, x, y, pointer, toActor);