From b551acf84761c6593d40ba9df425990dfa8afbb6 Mon Sep 17 00:00:00 2001 From: fgnm Date: Sat, 11 Jul 2020 12:49:30 +0200 Subject: [PATCH] - Extend PluginAPI with storage. - Store Skin Composer version checking and automatic update. --- assets/plugins/plugin-9patch-0.0.1.jar | Bin 21998 -> 22003 bytes assets/plugins/plugin-performance-0.0.1.jar | Bin 4902 -> 4910 bytes assets/plugins/plugin-skin-composer-0.0.1.jar | Bin 9557 -> 10634 bytes assets/plugins/plugin-tiled-0.0.1.jar | Bin 50562 -> 50560 bytes .../games/rednblack/h2d/common/MsgAPI.java | 2 + .../h2d/common/UIDraggablePanel.java | 6 ++ .../h2d/common/plugins/H2DPluginAdapter.java | 13 ++- .../h2d/common/plugins/PluginAPI.java | 40 ++++---- .../h2d/common/vo/EditorConfigVO.java | 9 +- .../plugin/ninepatch/NinePatchPlugin.java | 1 + .../plugin/performance/PerformancePlugin.java | 1 + .../skincomposer/DownloadingDialog.java | 15 ++- .../skincomposer/SkinComposerMediator.java | 92 ++++++++++++------ .../skincomposer/SkinComposerPlugin.java | 2 + .../editor/plugin/tiled/TiledPlugin.java | 1 + .../rednblack/editor/proxy/PluginManager.java | 9 +- .../editor/proxy/ProjectManager.java | 4 +- .../editor/view/HyperLap2DScreenMediator.java | 8 +- 18 files changed, 143 insertions(+), 60 deletions(-) diff --git a/assets/plugins/plugin-9patch-0.0.1.jar b/assets/plugins/plugin-9patch-0.0.1.jar index fcbc3c23341e0bfb2be2f2ee4b911ffb24e51781..7d5f657aa85e3aec01cf206386a1081a37599a69 100644 GIT binary patch delta 1973 zcmZ9NdpwkB8^^~O8Vtr^mKu~ZgL2HoN}8P=<2=To)^Ske(4dTUXfTEh2@g57p|Wyl z5OOFinMKZ0M7>ctw7k)jFvY$+eLnAg+UK9|bzjf*``y?5&vm`87Wh~#Ans%<2or@s z;Bbhk?{c2=ZIMUp@ zDnyT`&nYdKk1|J4G!d`MWeCqipUVN7hUMdN%0`8LmmOa$4tN-~dXCw21W)D3;@qCq zTa?V~D3}H(PvxTrMuz2htQTT3hK(BhMR}D|gnSA6tooBf zr;+bzM4eW~jCE%uIEXDP(z8!kL>naTmEDyLck1vOLgjjWXz!v`-~PjnQ{9ugsZpa_W6H}(YVBtt+}$ z2G0LpqFva@Dl8Kp6A1>7P60bYg!*E^kC`q5Hx)Y6IE7`6Qw&Tm!wif;UilGEN z%3I&={nH+aQ;n&-BZ?V}ar)6BRf5GP=A66hniE&GMk~7JwQU@iMrGuS4P@to&FZh!sRiz9M_9+uC>qAX_#DPqNWx>uHRlIN$^$s3Kus(!vT zhGw<=q`&&gdY)CNA9OXVUo=*HOQ8-1gkohLE@R4tf?I2(5^AKgX{XSVW-$&G^jG+I z6DZW9TjlG9*n%mqP6p*wnF;%b|5K@m5!sK3e!ZPgncCOWmu_M|nSI$W5!3Chm*i)vX@k*7TiRa?s%02jv}kKc8JY+O(RLdu!F@=k2b<=mD`tiLWVrza`2A z#-@BO5fnOG`CoU*8 z*{99H8Rz%>ig;t#6y#9~_v+TmVYmE{)oz`fNh($&oDQN}8c*vf7IVxG5f%-ku_pEh z4(G_^2fnb4Z;5KHk76xwgbAZO({WLbcFT?&%K`<{v;UjU9Mk%bSSE8WKF5&W^SO@&sMEK#alz>%cy4tf zf)pZ=LHKY2n>%DG7m?e`j$T@NuyLE$+IYq1+>&g|I$S s_um#5lrJS6*zF<*_U|sHEWmdCDKel>39n4%=iaNN7^f5w(zfdBvi delta 1971 zcmZXVc{r4N8^<3@8e=9LBqqxwI%AteI5WmrLUE3L$VrYRk*%>y%Vf!#^>NS;8ck>p z+0)2G)+{+p*`nx(rY3P5+q}igqwDQ@-}m|F^L@V0{kwnP>w2#1zLyz%3k*J_t(AZv z8~|W2z`2o?g$xzgL7WnV3JnP3Iy(Tx`0x;|`OJ1$m&=Fc6W-QtARG-cWho|B=m*EZmzh#*n}ZT`Jec;THRUT3Ph zH6C=NG2h3!kLBI&AHdFrZg5S|gyKhS)kN(AtoQt!^qkL`5z&|Nb?5LZ4|{2?8Xo;g zDU|1gR~`q7t3n)_s7k6Mw6;D`oe7#;<@py3Cf$Xp>^G@~_1AWN_-l?ZiSlSc-^E@r z)1{ByLP`MH-mhNlztmaHh<5pFp%(4bQ2Pm{A%<>wo)g4*EogdK-OUr`%}qi0QVZXG zoTHKFHfZQ`s@!9GmXkxuZ%!jF^)dU%log`Vpadz?vF#0dOPpgkeIPo}f4IgUTs8G? zRPpuD*HhB)o4E|ST;hZDJ{ZnSiFXYg&RLGXRWm>h96HwC5phz^ zgA}iHu-DpjY=u2ZvmyV>)g!6)i0U=|@R?rM29vw_QR8e*wpcfrJCG@}ul{@lrJ=EC zs>Z3kLe3`C(^a+Q*;&7jH*zfrW*H$`?f$I!>8zvisnIXrx=o?gUyd!bapjW@o}3)2 z!h37c`y>&p5RYv8WDnmeYwMrwhR@yx$~5{`n~Fmctk}7WI&2kT91%C0qF80G*HpTM zG}iDLL3j*T@C=lVXTmRzNA#SaNK^V1)I$?BvuY0=%v+VgnS-UzLJ@guQKO{7F8n`E zt6zHPG0IX$$o6JZeef`;wI!n)eBcc8qTYCY0fMU{(ERM))GR}0%AOhRE%nooq=V6) zfiKEC7G8GhHjp#n82TuFX1rkPYQ@tS##7U?Z7C^r#nx zrK>%j6ZZK^{bV?vbA7C+ujV%*Mn&^->xHeaBkwl~)V$LqVbaFP#s&<9<`e4YgHbI= zFaMw!7+BvtGxqUQ0aBP!IX-##KKVM~Y>(FAhaGFwoBK!J3BMhm>d{6tJw0>L^zVq- zQw1|W2l#hRFb~zN);n5$$gbKvy^hSi8ObbC(kF~5)vVvkmi@z0O-Fn-?p1)DN^ThA z7#*+aV)&=0SEGuWjNVBCGyHeJQJLBnE~l`{eS6i<=Weif8AJZX0%gwXmV{*W=`81! zh=A_%)z7@TrmOJsZ``~?o6`gbTy@Qa%sF`8y&@Cz-|(;PpE3f|j=DWP#bcvr3cdSe zMgM{YTO|9ppXpF|)sdJ?WFJ9|^mBj1+z~ao@YrD)6P|S@=u;$@LO6p^hs(kfjT}&e{ zx0Vmd7mqJWD2pm)5(Jlz8XK7E>RsuivYva!>)d@nys%KRF|sHd&8adpOE15Q@PF?W z6|Y^+-tq#5wNX ze995UPr^WUrlSIso)J^Iw`Ds$4g~=E-@^m-F|F9`LL4YeLO_LK=xedE+mW*WFA|&Z e?QS@DfwUWmLPGJMF#2W-gM%b_p=g_(?*9g2tb|wq diff --git a/assets/plugins/plugin-performance-0.0.1.jar b/assets/plugins/plugin-performance-0.0.1.jar index 9c735403f7951b8e754ee5f17a1e68feb0c1477f..4f4c96bafdfeedc07ab14c9696b0c454246d5146 100644 GIT binary patch delta 987 zcmZ3cwoZ*Vz?+$ci-CcIgTXrS^+eucW)Rh^45n7a(IxecHg))%4z7b4POrKg(1m)k#w>Md%vV zDL9vFXz$*9*3RJ9dLI)O-#?81G#=m0Yi)CPIhmIJ?9ATpXLcHwKYPAD-=4uINw3pd z^N#Og_M0khmpYWMbGBXFAo==`?Td#U%MIoo`YWQg>jT4NPn#5v^WvYUo{G}kACquG zQ=eNutvQ>Rh zFKrK#oOen0Wpjs4PF=WUs}67QkG|6z0@iRxSKXP~7PZ|aw|jD@&Yncp(%_HVJmT!y zTCb?2`K10jFKM+&IkfG^p5zJ3?k!rGqPgMv(%(^QqK)c(j;`cftrcT@WbMfv`!lO} z&i@Pcy6h!&X<-Y8;0lYz=*it_I}RLBEVsQA*mf|y@sn?KnD2QN&B~=R@jukw>KtCY zXp-G_*-rv#8Yd>S^c)b<6aU>;b22aD(lo6@OO!R4>Ms{|DyiCauJwIbx8!8*%c_)g z3*&YDufIz!^Pi}DxZcA!>VEgN#Tm9;*KRK|<#`}@_|D7omMK+h9@_jewK*6f~`4r!byMG#TmD!$bXqGpV_!5!$(KQTl5TPc)!+`&;_x%-bOz2EX-^7znEOHFj1_s zjh)^2?i_=Pvm0~Ww{H6S<8)_hhWh8Wj31Nqoa(=Q(B<~7G^<{86|0Od z&DYmAe9>NHlXU)6{U6UqH}?Oy{FCc22Y=nk>1Ls)1fy#w&77#U?sD}_=l*P&<`=H= z3pckUec@HQ+-7>{`K^LkYeKf4HQZazzQf_Is}pNd(v|tAQ0ijWjocq33ai3=*M%Jz|;0SEvXVZ;jn delta 998 zcmZ3dwoHvTz?+$ci-CcIgQ1OK&qUs0=JwsYCpIgCsg=55>ZS>Znk>L*4W|7V-GzYs z0E)i)wDnv@Cuh^;!fx-os_F&*doi&p<}Sg}CuO~A6ke!ftyr>e=hOE-n2T?q4j`sh?v zX>R4pKV1(?f~%z0J?99WF1m2ZUL9X=mUYJiOr#D?wEMnf<+a?v`;StTxbtr%9uC^` zSY`d6##WZEXChB=%`+%@dOVxwr0ex5Jb&Akrqo-OTwD4*Xw7Y-Q^(eF?^d(XKJ@l% z%7)CJJpKQJy-s^c8BJ`F5L~fqVfgg(YcvjgU@W)Y71DN5d?A;P`!${WN}8-o?>MlC z#p)fdbw1f(tyjsREtKNrl$OEW-)-w2S2Sx|$&xO^mmZx4H%e?5d35t9Wd~Qh&n%9v zvb!m{OZ{uT=U=|VZwxnGHRus+YkmBGcgM?pZNUJ;%i8|cp zU2vT7ORo36%k%dyXK2gt6P>=4OT1w;+Fsfl91Z%)xAIq<;_?qJhl9@; z-?=;g<+CX#U$1+-W7XWX=jZ#2KEACvW09nX*1M0&?5Q)(%dh@Zzi8F_n*ybRSO11K zFZr1E!ZUsMx!FnzrYZ(zpVQZNay|WYf3F0a&CLxpMsN4toc;6g&$-*!@7Kzn&j5S)8Q7dTHUSlk#t3-ET^+e<-x|m|fN)&z?st zzc_gXydJ1LjA1_~B=_dP-YNEQ`_R<)AMYyaQuWBKibw^-{Mi{_Wk&@ z*BZU*E1a8GOmZ=GXgnuy>5;QVcd?0a&s(8&TR4xa*)43}_fB?+&;nPh>$6Wk*<^iT z(hYw*7fW8@s~+q>BWBw)eqQ^LN$--4$2RX4z5R@z3t7W!V}7$DGEh6y?%kW;vDC4G zvdQLru0B>~V4j*JPzKI6l>&xfdaVE?8@(2A0`m<7J;8L1U??w2wwioTFi8OfZ5Js@(dw4un{|jq?w|)z(Rb&Qfx2zL23ag9?TB_ diff --git a/assets/plugins/plugin-skin-composer-0.0.1.jar b/assets/plugins/plugin-skin-composer-0.0.1.jar index 35a41bf364da4f7e47a7b7f47ea3400b93d439d5..aa1f00e4518e7d6a11e756356a7dc5d359ef28be 100644 GIT binary patch delta 6173 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 delta 5024 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 delta 5764 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 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; } } }