diff --git a/assets/plugins/plugin-9patch-0.0.1.jar b/assets/plugins/plugin-9patch-0.0.1.jar index fcbc3c23..7d5f657a 100644 Binary files a/assets/plugins/plugin-9patch-0.0.1.jar and b/assets/plugins/plugin-9patch-0.0.1.jar differ diff --git a/assets/plugins/plugin-performance-0.0.1.jar b/assets/plugins/plugin-performance-0.0.1.jar index 9c735403..4f4c96ba 100644 Binary files a/assets/plugins/plugin-performance-0.0.1.jar and b/assets/plugins/plugin-performance-0.0.1.jar differ diff --git a/assets/plugins/plugin-skin-composer-0.0.1.jar b/assets/plugins/plugin-skin-composer-0.0.1.jar index 35a41bf3..aa1f00e4 100644 Binary files a/assets/plugins/plugin-skin-composer-0.0.1.jar and b/assets/plugins/plugin-skin-composer-0.0.1.jar differ diff --git a/assets/plugins/plugin-tiled-0.0.1.jar b/assets/plugins/plugin-tiled-0.0.1.jar index b34075cd..4c0d77ad 100644 Binary files a/assets/plugins/plugin-tiled-0.0.1.jar and b/assets/plugins/plugin-tiled-0.0.1.jar differ diff --git a/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/MsgAPI.java b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/MsgAPI.java index 4d8bef74..017070ef 100644 --- a/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/MsgAPI.java +++ b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/MsgAPI.java @@ -37,6 +37,8 @@ public class MsgAPI { public static final String DISPOSE = GLOBAL_PREFIX + ".DISPOSE"; public static final String CREATE = GLOBAL_PREFIX + ".CREATE_BTN_CLICKED"; + public static final String SAVE_EDITOR_CONFIG = GLOBAL_PREFIX + ".SAVE_EDITOR_CONFIG"; + // tmp events public static final String ZOOM_CHANGED = GLOBAL_PREFIX + ".ZOOM_CHANGED"; public static final String GRID_SIZE_CHANGED = GLOBAL_PREFIX + ".GRID_SIZE_CHANGED"; diff --git a/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/UIDraggablePanel.java b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/UIDraggablePanel.java index 01393131..b9ea37a4 100644 --- a/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/UIDraggablePanel.java +++ b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/UIDraggablePanel.java @@ -81,4 +81,10 @@ public class UIDraggablePanel extends H2DDialog { super.hide(); isOpen = false; } + + @Override + protected void close() { + super.close(); + isOpen = false; + } } diff --git a/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/plugins/H2DPluginAdapter.java b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/plugins/H2DPluginAdapter.java index 35aabdc6..43e0fecf 100644 --- a/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/plugins/H2DPluginAdapter.java +++ b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/plugins/H2DPluginAdapter.java @@ -22,6 +22,8 @@ import com.badlogic.gdx.utils.Array; import com.puremvc.patterns.facade.Facade; import net.mountainblade.modular.Module; +import java.util.HashMap; +import java.util.Map; import java.util.Set; /** @@ -31,9 +33,14 @@ public abstract class H2DPluginAdapter implements H2DPlugin, Module { public Facade facade; protected PluginAPI pluginAPI; + protected String name; + + public H2DPluginAdapter(String name) { + this.name = name; + } public String getName() { - return ""; + return name; } @Override @@ -56,4 +63,8 @@ public abstract class H2DPluginAdapter implements H2DPlugin, Module { public PluginAPI getAPI() { return pluginAPI; } + + public Map getStorage() { + return pluginAPI.getEditorConfig().pluginStorage.computeIfAbsent(name, k -> new HashMap<>()); + } } diff --git a/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/plugins/PluginAPI.java b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/plugins/PluginAPI.java index caf8a24b..f5aacab2 100644 --- a/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/plugins/PluginAPI.java +++ b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/plugins/PluginAPI.java @@ -30,6 +30,7 @@ import com.kotcrab.vis.ui.widget.VisImageButton; import com.puremvc.patterns.facade.Facade; import games.rednblack.editor.renderer.SceneLoader; import games.rednblack.h2d.common.vo.CursorData; +import games.rednblack.h2d.common.vo.EditorConfigVO; import java.util.HashMap; import java.util.HashSet; @@ -43,45 +44,45 @@ public interface PluginAPI { * Get scene loader of the runtime to work with scene and items * @return SceneLoader */ - public SceneLoader getSceneLoader(); + SceneLoader getSceneLoader(); /** * Returns MVC facade, to send notifications or commands, and register mediators * @return Facade */ - public Facade getFacade(); + Facade getFacade(); /** * Returns Ashley engine of main scene where all entities are located * @return Engine */ - public Engine getEngine(); + Engine getEngine(); /** * Get simple libGDX Stage for UI part of editor, to add dialogs or other UI elements and widgets * @return */ - public Stage getUIStage(); + Stage getUIStage(); /** * @return Path of plugin directory */ - public String getPluginDir(); + String getPluginDir(); /** * @return Path of cache directory */ - public String getCacheDir(); + String getCacheDir(); /** * @return Path of working project */ - public String getProjectPath(); + String getProjectPath(); /** * @return TextureAtlas of loaded project */ - public TextureAtlas getProjectTextureAtlas(); + TextureAtlas getProjectTextureAtlas(); /** @@ -90,7 +91,7 @@ public interface PluginAPI { * @param subMenuName pretty string to name new submenu item * @param notificationName unique notification id that will be fired when this menu item is clicked */ - public void addMenuItem(String menu, String subMenuName, String notificationName); + void addMenuItem(String menu, String subMenuName, String notificationName); /** * Adds new tool to the tool bar @@ -99,18 +100,18 @@ public interface PluginAPI { * @param addSeparator true, if should add menu separator * @param tool the tool object that is going to be added */ - public void addTool(String toolName, VisImageButton.VisImageButtonStyle toolBtnStyle, boolean addSeparator, Tool tool); + void addTool(String toolName, VisImageButton.VisImageButtonStyle toolBtnStyle, boolean addSeparator, Tool tool); /** * hot-swaps a tool */ - public void toolHotSwap(Tool tool); + void toolHotSwap(Tool tool); /** * hot-swaps a tool back */ - public void toolHotSwapBack(); + void toolHotSwapBack(); /** * Creates new menu item for Contextual drop down menu, that is created when user right clicks on something in the editor. @@ -118,30 +119,30 @@ public interface PluginAPI { * @param action unique name of notification id that will be fired when this menu item is clicked * @param name pretty text to be written on this menu item */ - public void setDropDownItemName(String action, String name); + void setDropDownItemName(String action, String name); /** * re-loads current project entirely (used when changes were made that require to whole project to be reloaded) */ - public void reLoadProject(); + void reLoadProject(); /** * Saves current project */ - public void saveProject(); + void saveProject(); /** * Creates a revertable command that later can be undone or re-done by user with Ctrl+Z or similar. * @param command Object containing your command logic * @param body Additional data that can be send as parameters */ - public void revertableCommand(IItemCommand command, Object body); + void revertibleCommand(IItemCommand command, Object body); /** * Removes follower object (selection rectangle) from particular entity (usually makes sense when entity is deleted without proper action) * @param entity */ - public void removeFollower(Entity entity); + void removeFollower(Entity entity); /** * Draws an image at selected position @@ -180,4 +181,9 @@ public interface PluginAPI { * returns current selected layer name */ String getCurrentSelectedLayerName(); + + /** + * returns current editor configs + */ + EditorConfigVO getEditorConfig(); } diff --git a/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/vo/EditorConfigVO.java b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/vo/EditorConfigVO.java index 631daca2..a9a0ad98 100644 --- a/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/vo/EditorConfigVO.java +++ b/hyperlap2d-common-api/src/main/java/games/rednblack/h2d/common/vo/EditorConfigVO.java @@ -21,14 +21,17 @@ package games.rednblack.h2d.common.vo; import com.badlogic.gdx.utils.Json; import com.badlogic.gdx.utils.JsonWriter; -/** - * Created by sargis on 8/1/14. - */ +import java.util.HashMap; +import java.util.Map; + public class EditorConfigVO { public static final String EDITOR_CONFIG_FILE = "config.pit"; public String lastOpenedSystemPath = ""; public String lastImportedSystemPath = ""; + //Map to store plugin storage + public Map> pluginStorage = new HashMap<>(); + public String constructJsonString() { String str = ""; Json json = new Json(); diff --git a/plugin-9patch/src/main/java/games/rednblack/editor/plugin/ninepatch/NinePatchPlugin.java b/plugin-9patch/src/main/java/games/rednblack/editor/plugin/ninepatch/NinePatchPlugin.java index 3e8dbca7..ef916df7 100644 --- a/plugin-9patch/src/main/java/games/rednblack/editor/plugin/ninepatch/NinePatchPlugin.java +++ b/plugin-9patch/src/main/java/games/rednblack/editor/plugin/ninepatch/NinePatchPlugin.java @@ -26,6 +26,7 @@ public class NinePatchPlugin extends H2DPluginAdapter { public Entity currEditingEntity; public NinePatchPlugin() { + super(CLASS_NAME); performancePanelMediator = new MainPanelMediator(this); } diff --git a/plugin-performance/src/main/java/games/rednblack/editor/plugin/performance/PerformancePlugin.java b/plugin-performance/src/main/java/games/rednblack/editor/plugin/performance/PerformancePlugin.java index d2138502..c69b4f2a 100644 --- a/plugin-performance/src/main/java/games/rednblack/editor/plugin/performance/PerformancePlugin.java +++ b/plugin-performance/src/main/java/games/rednblack/editor/plugin/performance/PerformancePlugin.java @@ -13,6 +13,7 @@ public class PerformancePlugin extends H2DPluginAdapter { private final PerformancePanelMediator performancePanelMediator; public PerformancePlugin() { + super(CLASS_NAME); performancePanelMediator = new PerformancePanelMediator(this); } diff --git a/plugin-skin-composer/src/main/java/games/rednblack/editor/plugin/skincomposer/DownloadingDialog.java b/plugin-skin-composer/src/main/java/games/rednblack/editor/plugin/skincomposer/DownloadingDialog.java index 905c2dcd..4d976d6c 100644 --- a/plugin-skin-composer/src/main/java/games/rednblack/editor/plugin/skincomposer/DownloadingDialog.java +++ b/plugin-skin-composer/src/main/java/games/rednblack/editor/plugin/skincomposer/DownloadingDialog.java @@ -7,8 +7,8 @@ import games.rednblack.h2d.common.ProgressHandler; import games.rednblack.h2d.common.UIDraggablePanel; public class DownloadingDialog extends UIDraggablePanel implements ProgressHandler { - private VisLabel downloadingLabel; - private VisProgressBar progressBar; + private final VisLabel downloadingLabel; + private final VisProgressBar progressBar; public DownloadingDialog () { super("Skin Composer Plugin"); @@ -21,7 +21,7 @@ public class DownloadingDialog extends UIDraggablePanel implements ProgressHandl VisTable mainTable = new VisTable(); add(mainTable).fill().expand(); - downloadingLabel = new VisLabel("Downloading info ..."); + downloadingLabel = new VisLabel("Checking for updates ..."); mainTable.add(downloadingLabel).left(); mainTable.row().padBottom(5); @@ -32,8 +32,12 @@ public class DownloadingDialog extends UIDraggablePanel implements ProgressHandl pack(); } - public void setCurrentVersion(String name) { - downloadingLabel.setText("Downloading "+ name + " ..."); + public void setMessage(String message) { + downloadingLabel.setText(message); + } + + public void setProgress(float value) { + progressBar.setValue(value); } @Override @@ -48,6 +52,7 @@ public class DownloadingDialog extends UIDraggablePanel implements ProgressHandl @Override public void progressComplete() { + progressBar.setValue(100); close(); } diff --git a/plugin-skin-composer/src/main/java/games/rednblack/editor/plugin/skincomposer/SkinComposerMediator.java b/plugin-skin-composer/src/main/java/games/rednblack/editor/plugin/skincomposer/SkinComposerMediator.java index 257302f0..9ccf3bb7 100644 --- a/plugin-skin-composer/src/main/java/games/rednblack/editor/plugin/skincomposer/SkinComposerMediator.java +++ b/plugin-skin-composer/src/main/java/games/rednblack/editor/plugin/skincomposer/SkinComposerMediator.java @@ -1,8 +1,10 @@ package games.rednblack.editor.plugin.skincomposer; import com.badlogic.gdx.utils.Json; +import com.kotcrab.vis.ui.util.dialog.Dialogs; import com.puremvc.patterns.mediator.SimpleMediator; import com.puremvc.patterns.observer.Notification; +import games.rednblack.h2d.common.MsgAPI; import org.apache.commons.io.FileUtils; import java.io.File; @@ -10,11 +12,12 @@ import java.io.IOException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -public class SkinComposerMediator extends SimpleMediator { +public class SkinComposerMediator extends SimpleMediator { private static final String TAG = SkinComposerMediator.class.getCanonicalName(); public static final String NAME = TAG; private final SkinComposerPlugin plugin; + private String pluginPath, jarPath; public SkinComposerMediator(SkinComposerPlugin plugin) { super(NAME, new DownloadingDialog()); @@ -24,31 +27,30 @@ public class SkinComposerMediator extends SimpleMediator { @Override public String[] listNotificationInterests() { return new String[]{ - SkinComposerPlugin.PANEL_OPEN + SkinComposerPlugin.PANEL_OPEN, + SkinComposerPlugin.DOWNLOAD_JAR }; } - @Override public void handleNotification(Notification notification) { super.handleNotification(notification); + pluginPath = plugin.getAPI().getCacheDir(); + jarPath = pluginPath + File.separator + "SkinComposer.jar"; + switch (notification.getName()) { case SkinComposerPlugin.PANEL_OPEN: + if (viewComponent.isOpen) { + return; + } + ExecutorService executor = Executors.newSingleThreadExecutor(); executor.execute(() -> { - String pluginPath = plugin.getAPI().getCacheDir(); - String jarPath = pluginPath + File.separator + "SkinComposer.jar"; - if (new File(jarPath).exists()) { - try { - Runtime.getRuntime().exec(" java -jar " + jarPath); - } catch (IOException e) { - e.printStackTrace(); - } - return; - } viewComponent.show(plugin.getAPI().getUIStage()); + viewComponent.setMessage("Checking for updates ..."); + viewComponent.setProgress(0); try { FileUtils.forceMkdir(new File(pluginPath)); @@ -61,30 +63,60 @@ public class SkinComposerMediator extends SimpleMediator { Json json = new Json(); json.setIgnoreUnknownFields(true); GithubReleaseData jsonData = json.fromJson(GithubReleaseData.class, data); - viewComponent.setCurrentVersion(jsonData.name); - for (GithubReleaseData.GithubReleaseAssetData assetData : jsonData.assets) { - if (assetData.name.equals("SkinComposer.jar")) { - try { - HttpDownloadUtility.downloadFile(assetData.browser_download_url, pluginPath, viewComponent); - } catch (IOException e) { - viewComponent.progressFailed(); - e.printStackTrace(); - } - break; - } - } - } catch (IOException e) { - e.printStackTrace(); - } - try { - Runtime.getRuntime().exec(" java -jar " + jarPath); + if (!new File(jarPath).exists() || plugin.getStorage().get("latest_update") == null || !plugin.getStorage().get("latest_update").equals(jsonData.tag_name)) { + Dialogs.showConfirmDialog(plugin.getAPI().getUIStage(), + "New update found!", "A new version of Skin Composer has found, would you like to download it?", + new String[]{"Later", "Download Now"}, new Integer[]{0, 1}, r -> { + if (r == 1) { + plugin.facade.sendNotification(SkinComposerPlugin.DOWNLOAD_JAR, jsonData); + } else { + viewComponent.progressComplete(); + runJar(jarPath); + } + }).padBottom(20).pack(); + } else { + viewComponent.progressComplete(); + runJar(jarPath); + } } catch (IOException e) { e.printStackTrace(); } }); executor.shutdown(); break; + case SkinComposerPlugin.DOWNLOAD_JAR: + ExecutorService downloader = Executors.newSingleThreadExecutor(); + downloader.execute(() -> { + GithubReleaseData jsonData = notification.getBody(); + + viewComponent.setMessage("Downloading " + jsonData.name + " ..."); + for (GithubReleaseData.GithubReleaseAssetData assetData : jsonData.assets) { + if (assetData.name.equals("SkinComposer.jar")) { + try { + HttpDownloadUtility.downloadFile(assetData.browser_download_url, pluginPath, viewComponent); + plugin.getStorage().put("latest_update", jsonData.tag_name); + + plugin.facade.sendNotification(MsgAPI.SAVE_EDITOR_CONFIG); + runJar(jarPath); + } catch (IOException e) { + viewComponent.progressFailed(); + e.printStackTrace(); + } + break; + } + } + }); + downloader.shutdown(); + break; + } + } + + private void runJar(String jarPath) { + try { + Runtime.getRuntime().exec(" java -jar " + jarPath); + } catch (IOException e) { + e.printStackTrace(); } } } diff --git a/plugin-skin-composer/src/main/java/games/rednblack/editor/plugin/skincomposer/SkinComposerPlugin.java b/plugin-skin-composer/src/main/java/games/rednblack/editor/plugin/skincomposer/SkinComposerPlugin.java index 72c31e80..3bd0e0c7 100644 --- a/plugin-skin-composer/src/main/java/games/rednblack/editor/plugin/skincomposer/SkinComposerPlugin.java +++ b/plugin-skin-composer/src/main/java/games/rednblack/editor/plugin/skincomposer/SkinComposerPlugin.java @@ -9,10 +9,12 @@ public class SkinComposerPlugin extends H2DPluginAdapter { public static final String PANEL_OPEN = CLASS_NAME + ".PANEL_OPEN"; public static final String WINDOWS_MENU = "games.rednblack.editor.view.HyperLap2DMenuBar.WINDOW_MENU"; + public static final String DOWNLOAD_JAR = CLASS_NAME + ".DOWNLOAD_JAR"; private final SkinComposerMediator skinComposerMediator; public SkinComposerPlugin() { + super(CLASS_NAME); skinComposerMediator = new SkinComposerMediator(this); } 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 e4059b7a..ebd6c35f 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 @@ -85,6 +85,7 @@ public class TiledPlugin extends H2DPluginAdapter { private TransformComponent currentEntityTransformComponent; public TiledPlugin() { + super(CLASS_NAME); selectedTileVO = new TileVO(); currentEntityCustomVariables = new CustomVariables(); } diff --git a/src/main/java/games/rednblack/editor/proxy/PluginManager.java b/src/main/java/games/rednblack/editor/proxy/PluginManager.java index 766eda95..54229489 100644 --- a/src/main/java/games/rednblack/editor/proxy/PluginManager.java +++ b/src/main/java/games/rednblack/editor/proxy/PluginManager.java @@ -50,6 +50,7 @@ import games.rednblack.editor.view.ui.UIDropDownMenuMediator; import games.rednblack.editor.view.ui.box.UILayerBoxMediator; import games.rednblack.editor.view.ui.box.UIToolBoxMediator; import games.rednblack.h2d.common.vo.CursorData; +import games.rednblack.h2d.common.vo.EditorConfigVO; import java.util.*; @@ -125,7 +126,7 @@ public class PluginManager extends BaseProxy implements PluginAPI { } @Override - public void revertableCommand(IItemCommand command, Object body) { + public void revertibleCommand(IItemCommand command, Object body) { Object payload = PluginItemCommand.build(command, body); facade.sendNotification(MsgAPI.ACTION_PLUGIN_PROXY_COMMAND, payload); } @@ -264,4 +265,10 @@ public class PluginManager extends BaseProxy implements PluginAPI { UILayerBoxMediator uiLayerBoxMediator = facade.retrieveMediator(UILayerBoxMediator.NAME); return uiLayerBoxMediator.getViewComponent().getCurrentSelectedLayer().getLayerName(); } + + @Override + public EditorConfigVO getEditorConfig() { + ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); + return projectManager.editorConfigVO; + } } diff --git a/src/main/java/games/rednblack/editor/proxy/ProjectManager.java b/src/main/java/games/rednblack/editor/proxy/ProjectManager.java index 99df1bb7..e4c26c1a 100755 --- a/src/main/java/games/rednblack/editor/proxy/ProjectManager.java +++ b/src/main/java/games/rednblack/editor/proxy/ProjectManager.java @@ -81,7 +81,7 @@ public class ProjectManager extends BaseProxy { private String defaultWorkspacePath; private String DEFAULT_FOLDER = "HyperLap2D"; - private EditorConfigVO editorConfigVO; + public EditorConfigVO editorConfigVO; private String currentWindowTitle = ""; @@ -177,7 +177,7 @@ public class ProjectManager extends BaseProxy { saveEditorConfig(); } - private void saveEditorConfig() { + public void saveEditorConfig() { try { String configFilePath = getRootPath() + File.separator + "configs" + File.separator + EditorConfigVO.EDITOR_CONFIG_FILE; FileUtils.writeStringToFile(new File(configFilePath), editorConfigVO.constructJsonString(), "utf-8"); diff --git a/src/main/java/games/rednblack/editor/view/HyperLap2DScreenMediator.java b/src/main/java/games/rednblack/editor/view/HyperLap2DScreenMediator.java index d5c94805..76ffce7f 100644 --- a/src/main/java/games/rednblack/editor/view/HyperLap2DScreenMediator.java +++ b/src/main/java/games/rednblack/editor/view/HyperLap2DScreenMediator.java @@ -19,6 +19,7 @@ package games.rednblack.editor.view; import com.badlogic.ashley.core.Engine; +import games.rednblack.editor.proxy.ProjectManager; import games.rednblack.h2d.common.MsgAPI; import com.puremvc.patterns.mediator.SimpleMediator; import com.puremvc.patterns.observer.Notification; @@ -47,7 +48,8 @@ public class HyperLap2DScreenMediator extends SimpleMediator { MsgAPI.RENDER, MsgAPI.RESIZE, MsgAPI.DISPOSE, - MsgAPI.SCENE_LOADED + MsgAPI.SCENE_LOADED, + MsgAPI.SAVE_EDITOR_CONFIG }; } @@ -89,6 +91,10 @@ public class HyperLap2DScreenMediator extends SimpleMediator { break; case MsgAPI.DISPOSE: break; + case MsgAPI.SAVE_EDITOR_CONFIG: + ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); + projectManager.saveEditorConfig(); + break; } } }