From d7f561b03b2ec16e3fbf167760eaafbd529e130e Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Tue, 20 Feb 2018 19:49:02 +0300 Subject: [PATCH 01/49] updated sky control plugin. --- README.md | 2 +- app.version | 2 +- build.gradle | 2 +- ...ol-1.1.0.jar => jmb-sky-control-1.1.1.jar} | Bin 25857 -> 25633 bytes .../java/com/ss/editor/config/Config.java | 2 +- 5 files changed, 4 insertions(+), 4 deletions(-) rename embedded-plugins/jmb-sky-control/{jmb-sky-control-1.1.0.jar => jmb-sky-control-1.1.1.jar} (76%) diff --git a/README.md b/README.md index 860272ac..c4039a19 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# jMonkeyBuilder 1.7.0 # +# jMonkeyBuilder 1.7.1 # ### It's 3D Editor to prepare/work/create graphics content for jMonkeyEngine 3.2 ### [![Join the chat at https://gitter.im/jME3-SpaceShift-Editor/Lobby](https://badges.gitter.im/jME3-SpaceShift-Editor/Lobby.svg)](https://gitter.im/jME3-SpaceShift-Editor/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) diff --git a/app.version b/app.version index 9dbb0c00..081af9a1 100644 --- a/app.version +++ b/app.version @@ -1 +1 @@ -1.7.0 \ No newline at end of file +1.7.1 \ No newline at end of file diff --git a/build.gradle b/build.gradle index ed515ea2..bed9f54a 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ apply plugin: 'idea' apply plugin: 'org.junit.platform.gradle.plugin' group = 'com.spaceshift' -version = '1.7.0' +version = '1.7.1' sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/embedded-plugins/jmb-sky-control/jmb-sky-control-1.1.0.jar b/embedded-plugins/jmb-sky-control/jmb-sky-control-1.1.1.jar similarity index 76% rename from embedded-plugins/jmb-sky-control/jmb-sky-control-1.1.0.jar rename to embedded-plugins/jmb-sky-control/jmb-sky-control-1.1.1.jar index 9e2191f6a5e0141b0d1fc2045a305199737282dd..65b22f9d572520d21d33dfb477ef3fc181a5af86 100644 GIT binary patch delta 2539 zcmZuy3pkYN7yo7^W5x_-GDzdrxYfEWVtR1dq;Y#|2NM(=X~e<&hI_vJ@0$I|=Y`i2si0wQphbW}REOO)Q>6A&bTgdjV?q=pKx@sR)@sT^KJ$Y9~{K+;Wy zqgKildSOALf8NMz?T1GXyz9-qHpLU}s#KdAQYz0H|LB%A9XMcB4_bMNO9FKU|| z*&G*9axbUq@oZ*D_3JcVaOLb`lrB|&Y-6u%m9Q?-tW}3F{&QH{ub$R(d1p?f+$$WP z3Ln|>@Mv-H^6f00-B-Pu6 zKR4s%IRo9mtx-Lt4{c4}@jAO@%-&JzJCnx^&ir|QA!$UP?Q9mC(>y0hm96h5e7F$x zYeVC)b0d}$SzYr~!c1D<4$ICXB0@5L^XT&^frF>Oo-v~y%FcN&l!kKKue6;Zx zr{leCz;O4Z>07thtGtSD&-LULC3U~C4UOcqj|rQKX89sF)v!%H(z0v)h zh#WcCU8ua7d0}6Hbar=*%21R+{PDwy9`mOOlajWl-q1YL%D;JP=N>*Fa+wg`;!^cm zex7e+C>}bSB-{7P`G-`BWK`>u+`IC7g-^+w?6KegGc_AX&k zFXg3jhSgt7ej2Z8dNt12c^$eqBf(J%C;30(e|OXK#7o1owmMTob8)4jjQqKrwyMnd zXE9HUNBVzC|4{TIoENBiP(HUpPe^Zhey~lbDysd_Xg9U~^^+@_OXr5CUtHU8o2u{p zhyL%z)k>H2h6|cn;;C;h${0yKit)@^;Fl#3y-V6kj&-r}XoKApUxH?$?VQ%jBW6rEa=UtQujR6A^Q zzQj2YWPD@$p&JFP-!Is=Gs@22=Wj?Eh~x+A#AmX{OKJ}*#6RPvJcEP5*bRoPM>x*FSdYrx3Os&LsAW zRKF%UrRv#}nma?6cNjm;9wCU*_Ur(Q&#o6#hE*rJ*G9jZF)HKP&GmEr*!;19U~3U` z&CCE3v|aF;Ytx?-;59GDeFY7F;aKqA*V81QiYLKaavxp>n*f1HCITEDLHGnv>Z)E} zXQwO%%x=0a1v$FRZ6JrNMGOTRdhB&Utv?Z1%Tu94O|e5fW?baEp#pL>bU`nh0lhQq z2}u~H=3xsB7M`cXs4$Pm(1D?Ot`H6KT#KQt%Ul8N{%1l^+nOc>D>$i(lYpeAKdXGa8-pv}EFa@|ow6U^7I!gTq`Zrv&#M!S`zzXZQuvFb0p_}JQ0&~IQ3_hUd%b(4bA>uY* zoiTAjYd3;jA)|T5W3O7EhD!o^du71;5OHT>yd!;B=-$nvd$+dPKf0_0$YEeL?1E#- z{{J?rf;(szt%Em0+!LB({4#n-qtQ*=wx+_s6&w-RIFJ>%juJ%7t%Lp|q!HwYec0Q- D*2>Dv delta 2693 zcmZ`)30PBC7JfYZH@4R#VckT`@ zzXhi);1SeTAc&S0Qkm#otj!>t3+EKOaiJ-oLsMx5jhqS1J4XWQ30OD|w0RUyXx|$8 zVz$oP$Wk3HwwVp%;et!=#8c5N{%wNEoq7U-BxxbYhk$Ni3GPRj12WY>YMUZD`{?IS zg@*&~TC{1k@x5bCJYT zJYD{3ezyB^1FrrviJo)M#zD(h#xq?%dg&3La3+v)qaGIlTi{aMIHK_#c~6|>QAh0) z{9QflH}`!?>ESgT*@c{0sDsLK`;JQMeGD5;Ay4Ys|Kb%(*Tg#T zG;#LHIm0cvexWx6yV@_d#=A{RTjVu3isbylXy*M%DvE20&QYz!= zroL&L>S&L&UCCnoh(tF}cMs12Q+mMPQ}ar?-ZuM2s^#pf$`F3rmt1kLuwPp&+!->< zdo7-m1gtkUA82x64X$l!%nKA}To`umpq?`;zva6m@(xkXHDv z;R{*ZPI5)9=+{SG&pu7Am$LYKi+lzB>}?yGyw{04#d)Tf+_x+3ouh&1je1;OEM{C8Z2f4+V;XLF0Z^QPHJucJNHr(T?IjXZqUP(7^slHram zHu16}k;1?s=NCo(oImQF?-%XfKPmZgQr1_r+4wrQ>_42}jXx+iOPJe!J4XAet^b&f z`@cVLz^TXuXw&!C!6tj;)Dg{t=wyGS1-3d_fFd(>a6EE#U6Mfw0g3}tz%23B0B=3X zP!S$}D96FY3a>kgMJl6W1@w&NF#(0B1f{4~5T|q!Tv%8I;t8dwaxn#7n5|0_xNDFW#1Gqu<#|(4%QtmT zzaEAlNG5tQQJpdcZM<|CN_Ap_fncI80r|5I7}eF_bR6U?A1_*det2zM3lmCL--)3RX%4zEvG)Nqv; zB6bY?P>^wOFVq;5a4;I`4J}jT2yL`zEwm+~bu>F?isW*)((t}Ylm^&ZhI-b?0NKVc2W?;PUUX!fEs5CY7;cT zKLtdUtT8Gq>%h$@mDSR%l6V^a5Vo@haN`x{qRHdzL2-g9CIsND5~U{4a1teIvXli> zp)|unnCn0=75o-&Y=PyArMNIw){FUK1G6#&IWT z#URkYT^_h8J7U5Chai3Ek&Y^XtdEqZ(Y^ndLMeQ)v?@cF>eXKx0M#oX7ttIZF7v{4 VO2AXsz?kgN?=x)#(G+3-{tL5(p Date: Thu, 22 Feb 2018 08:59:15 +0300 Subject: [PATCH 02/49] fixed selector element dialog. --- .../com/ss/editor/ui/control/model/ModelNodeTree.java | 5 +++++ .../ui/dialog/node/selector/NodeSelectorDialog.java | 9 ++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/ss/editor/ui/control/model/ModelNodeTree.java b/src/main/java/com/ss/editor/ui/control/model/ModelNodeTree.java index 42af6974..3c256d38 100644 --- a/src/main/java/com/ss/editor/ui/control/model/ModelNodeTree.java +++ b/src/main/java/com/ss/editor/ui/control/model/ModelNodeTree.java @@ -25,4 +25,9 @@ public ModelNodeTree(@NotNull final Consumer> selectionHandler, @Nullable final ModelChangeConsumer consumer) { super(selectionHandler, consumer, SelectionMode.MULTIPLE); } + + public ModelNodeTree(@NotNull final Consumer> selectionHandler, + @Nullable final ModelChangeConsumer consumer, @NotNull final SelectionMode selectionMode) { + super(selectionHandler, consumer, selectionMode); + } } diff --git a/src/main/java/com/ss/editor/ui/dialog/node/selector/NodeSelectorDialog.java b/src/main/java/com/ss/editor/ui/dialog/node/selector/NodeSelectorDialog.java index 4f680b30..5589c0e1 100644 --- a/src/main/java/com/ss/editor/ui/dialog/node/selector/NodeSelectorDialog.java +++ b/src/main/java/com/ss/editor/ui/dialog/node/selector/NodeSelectorDialog.java @@ -10,7 +10,9 @@ import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.dialog.AbstractSimpleEditorDialog; import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.util.array.Array; import javafx.scene.control.Button; +import javafx.scene.control.SelectionMode; import javafx.scene.layout.GridPane; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -94,7 +96,7 @@ public NodeSelectorDialog(@NotNull final Spatial model, @NotNull final Class protected void createContent(@NotNull final GridPane root) { super.createContent(root); - nodeTree = new ModelNodeTree(this::processSelect, null); + nodeTree = new ModelNodeTree(this::processSelect, null, SelectionMode.SINGLE); nodeTree.prefHeightProperty().bind(heightProperty()); nodeTree.prefWidthProperty().bind(widthProperty()); @@ -130,10 +132,11 @@ protected boolean isGridStructure() { } /** - * Handle the selected object. + * Handle the selected objects. */ @FxThread - private void processSelect(@Nullable final Object object) { + private void processSelect(@Nullable final Array objects) { + final Object object = objects.first(); final Object result = object instanceof TreeNode ? ((TreeNode) object).getElement() : object; final Class type = getType(); final Button okButton = notNull(getOkButton()); From 1f93f8060c80369e1b9533a0deb7cbfa9f5600ab Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Thu, 22 Feb 2018 09:01:08 +0300 Subject: [PATCH 03/49] increased version. --- README.md | 2 +- app.version | 2 +- build.gradle | 2 +- src/main/java/com/ss/editor/config/Config.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c4039a19..703f3185 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# jMonkeyBuilder 1.7.1 # +# jMonkeyBuilder 1.7.2 # ### It's 3D Editor to prepare/work/create graphics content for jMonkeyEngine 3.2 ### [![Join the chat at https://gitter.im/jME3-SpaceShift-Editor/Lobby](https://badges.gitter.im/jME3-SpaceShift-Editor/Lobby.svg)](https://gitter.im/jME3-SpaceShift-Editor/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) diff --git a/app.version b/app.version index 081af9a1..0a182f2e 100644 --- a/app.version +++ b/app.version @@ -1 +1 @@ -1.7.1 \ No newline at end of file +1.7.2 \ No newline at end of file diff --git a/build.gradle b/build.gradle index bed9f54a..28fb94ab 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ apply plugin: 'idea' apply plugin: 'org.junit.platform.gradle.plugin' group = 'com.spaceshift' -version = '1.7.1' +version = '1.7.2' sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/src/main/java/com/ss/editor/config/Config.java b/src/main/java/com/ss/editor/config/Config.java index 4fad1928..82d95fae 100644 --- a/src/main/java/com/ss/editor/config/Config.java +++ b/src/main/java/com/ss/editor/config/Config.java @@ -42,7 +42,7 @@ public final class Config { * The editor's version. */ @NotNull - public static final Version APP_VERSION = new Version("1.7.1"); + public static final Version APP_VERSION = new Version("1.7.2"); /** * The string version. From 7c78a4cadf3b54b35ecae453d43aa14bd4b5d8d9 Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Thu, 22 Feb 2018 09:43:41 +0300 Subject: [PATCH 04/49] updated snd plugin. --- ...s-1.1.3.jar => jmb-shader-nodes-1.1.1.jar} | Bin 387847 -> 351160 bytes 1 file changed, 0 insertions(+), 0 deletions(-) rename embedded-plugins/jmb-shader-nodes/{jmb-shader-nodes-1.1.3.jar => jmb-shader-nodes-1.1.1.jar} (51%) diff --git a/embedded-plugins/jmb-shader-nodes/jmb-shader-nodes-1.1.3.jar b/embedded-plugins/jmb-shader-nodes/jmb-shader-nodes-1.1.1.jar similarity index 51% rename from embedded-plugins/jmb-shader-nodes/jmb-shader-nodes-1.1.3.jar rename to embedded-plugins/jmb-shader-nodes/jmb-shader-nodes-1.1.1.jar index c9c7a2dbd89f491732c5ca705c93e9874d3a3392..17ff52a4a1097eb56621f05ae36b8299a7787f8a 100644 GIT binary patch delta 135022 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%0DTbRxe1E_Qn1SHKx+tdy)@LE;Tszd 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

?}t_zjdQ=*;YCBu7|s;vj#7a+9N=2rO+HB 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

ejOl|U!k=HSnOOKf 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 z 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 Date: Thu, 22 Feb 2018 11:24:23 +0300 Subject: [PATCH 05/49] test build --- jitpack.yml | 2 ++ prepareEnvironment.sh | 4 ++++ 2 files changed, 6 insertions(+) create mode 100644 prepareEnvironment.sh diff --git a/jitpack.yml b/jitpack.yml index f330c93a..d27ddd2b 100644 --- a/jitpack.yml +++ b/jitpack.yml @@ -1,2 +1,4 @@ jdk: - oraclejdk9 +before_install: + - ./prepareEnvironment.sh diff --git a/prepareEnvironment.sh b/prepareEnvironment.sh new file mode 100644 index 00000000..b420bd40 --- /dev/null +++ b/prepareEnvironment.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env sh + +exec "java -version" +exec "java --list-modules" From 97356671814ad14c05027f280eb568c667b9a2eb Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Thu, 22 Feb 2018 11:27:54 +0300 Subject: [PATCH 06/49] added permissions. --- prepareEnvironment.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 prepareEnvironment.sh diff --git a/prepareEnvironment.sh b/prepareEnvironment.sh old mode 100644 new mode 100755 From f10a2f43745fd4f165ea75fe1a96df4e31216720 Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Thu, 22 Feb 2018 11:33:02 +0300 Subject: [PATCH 07/49] added print java home. --- prepareEnvironment.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/prepareEnvironment.sh b/prepareEnvironment.sh index b420bd40..cba0b84d 100755 --- a/prepareEnvironment.sh +++ b/prepareEnvironment.sh @@ -1,4 +1,6 @@ #!/usr/bin/env sh +echo "$JAVA_HOME" + exec "java -version" exec "java --list-modules" From bb0380c7c51c109d598ec529b378834bdcb670e3 Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Thu, 22 Feb 2018 11:37:30 +0300 Subject: [PATCH 08/49] added print java home. --- prepareEnvironment.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/prepareEnvironment.sh b/prepareEnvironment.sh index cba0b84d..55c99f60 100755 --- a/prepareEnvironment.sh +++ b/prepareEnvironment.sh @@ -2,5 +2,5 @@ echo "$JAVA_HOME" -exec "java -version" -exec "java --list-modules" +exec "$JAVA_HOME/lib/java -version" +exec "$JAVA_HOME/lib/java --list-modules" From 7e4ef2db88ba96f37f8053ad71a5f3110f18efca Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Thu, 22 Feb 2018 11:41:59 +0300 Subject: [PATCH 09/49] added print java home. --- prepareEnvironment.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/prepareEnvironment.sh b/prepareEnvironment.sh index 55c99f60..77b4a1db 100755 --- a/prepareEnvironment.sh +++ b/prepareEnvironment.sh @@ -2,5 +2,5 @@ echo "$JAVA_HOME" -exec "$JAVA_HOME/lib/java -version" -exec "$JAVA_HOME/lib/java --list-modules" +exec "$JAVA_HOME/bin/java -version" +exec "$JAVA_HOME/bin/java --list-modules" From 62b1bc8299a0c7cbef6c930fe68ecd8e28dbea2c Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Thu, 22 Feb 2018 11:49:30 +0300 Subject: [PATCH 10/49] added print java home. --- jitpack.yml | 5 +++++ prepareEnvironment.sh | 4 ---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/jitpack.yml b/jitpack.yml index d27ddd2b..9abdb63e 100644 --- a/jitpack.yml +++ b/jitpack.yml @@ -2,3 +2,8 @@ jdk: - oraclejdk9 before_install: - ./prepareEnvironment.sh +install: + - java -version + - java --list-modules + - ./gradlew install + diff --git a/prepareEnvironment.sh b/prepareEnvironment.sh index 77b4a1db..10ee4925 100755 --- a/prepareEnvironment.sh +++ b/prepareEnvironment.sh @@ -1,6 +1,2 @@ #!/usr/bin/env sh -echo "$JAVA_HOME" - -exec "$JAVA_HOME/bin/java -version" -exec "$JAVA_HOME/bin/java --list-modules" From a4a530a19d9b8ceb9a206cde543fa4893b9dd92d Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Fri, 23 Feb 2018 09:12:20 +0300 Subject: [PATCH 11/49] updated dependencies. --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 28fb94ab..badc70ee 100644 --- a/build.gradle +++ b/build.gradle @@ -61,7 +61,7 @@ dependencies { compile 'org.controlsfx:controlsfx:8.40.14' compile 'com.github.JavaSaBr:RlibFX:4.1.3' - compile 'com.github.JavaSaBr:RLib:6.7.7' + compile 'com.github.JavaSaBr:RLib:6.8.0' compile ("com.github.JavaSaBr:JME3-JFX:1.7.4") { exclude group: 'org.jmonkeyengine' } From 94670dd4c4bee9b4b3bef4850f671246caa86b18 Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Tue, 13 Mar 2018 09:56:20 +0300 Subject: [PATCH 12/49] updated css. --- src/main/java/com/ss/editor/ui/css/CssClasses.java | 9 +++++++++ src/main/resources/ui/css/dark-color.css | 13 +++++++++++++ src/main/resources/ui/css/light-color.css | 13 +++++++++++++ src/main/resources/ui/css/shadow-color.css | 13 +++++++++++++ 4 files changed, 48 insertions(+) diff --git a/src/main/java/com/ss/editor/ui/css/CssClasses.java b/src/main/java/com/ss/editor/ui/css/CssClasses.java index f198abd1..6d09dee3 100644 --- a/src/main/java/com/ss/editor/ui/css/CssClasses.java +++ b/src/main/java/com/ss/editor/ui/css/CssClasses.java @@ -165,4 +165,13 @@ public interface CssClasses { @NotNull String STATS_3D_STATE = "stats-3dstate"; @NotNull String WEBVIEW_TEXT_AREA = "webview-text-area"; + + @NotNull String TEXT_PLAIN_CODE = "plain-code"; + @NotNull String TEXT_KEYWORD = "keyword"; + @NotNull String TEXT_VALUE_TYPE = "value-type"; + @NotNull String TEXT_VALUE_VALUE = "value-value"; + @NotNull String TEXT_SEMICOLON = "semicolon"; + @NotNull String TEXT_PAREN = "paren"; + @NotNull String TEXT_STRING = "string"; + @NotNull String TEXT_COMMENT = "comment"; } \ No newline at end of file diff --git a/src/main/resources/ui/css/dark-color.css b/src/main/resources/ui/css/dark-color.css index 4af17ffb..cc8e73da 100644 --- a/src/main/resources/ui/css/dark-color.css +++ b/src/main/resources/ui/css/dark-color.css @@ -54,50 +54,60 @@ .plain-code { -fx-fill: white; + -fx-text-fill: -fx-fill; } .keyword { -fx-fill: #f92670; -fx-font-weight: bold; + -fx-text-fill: -fx-fill; } .value-type { -fx-fill: #62c59f; -fx-font-weight: bold; + -fx-text-fill: -fx-fill; } .value-value { -fx-fill: #a776a7; -fx-font-weight: bold; + -fx-text-fill: -fx-fill; } .semicolon { -fx-fill: white; -fx-font-weight: bold; + -fx-text-fill: -fx-fill; } .paren { -fx-fill: white; -fx-font-weight: bold; + -fx-text-fill: -fx-fill; } .bracket { -fx-fill: white; -fx-font-weight: bold; + -fx-text-fill: -fx-fill; } .brace { -fx-fill: white; -fx-font-weight: bold; + -fx-text-fill: -fx-fill; } .string { -fx-fill: #ddb03f; + -fx-text-fill: -fx-fill; } .comment { -fx-fill: #5f6c5a; + -fx-text-fill: -fx-fill; } .paragraph-box:has-caret { @@ -106,12 +116,15 @@ .log-severity { -fx-fill: #f92670; + -fx-text-fill: -fx-fill; } .log-framework { -fx-fill: #ddb03f; + -fx-text-fill: -fx-fill; } .log-class { -fx-fill: #62c59f; + -fx-text-fill: -fx-fill; } \ No newline at end of file diff --git a/src/main/resources/ui/css/light-color.css b/src/main/resources/ui/css/light-color.css index 5c625469..d848add1 100644 --- a/src/main/resources/ui/css/light-color.css +++ b/src/main/resources/ui/css/light-color.css @@ -54,50 +54,60 @@ .plain-code { -fx-fill: -var-font-color; + -fx-text-fill: -fx-fill; } .keyword { -fx-fill: #7f0c78; -fx-font-weight: bold; + -fx-text-fill: -fx-fill; } .value-type { -fx-fill: #2a5332; -fx-font-weight: bold; + -fx-text-fill: -fx-fill; } .value-value { -fx-fill: #b6270c; -fx-font-weight: bold; + -fx-text-fill: -fx-fill; } .semicolon { -fx-fill: -var-font-color; -fx-font-weight: bold; + -fx-text-fill: -fx-fill; } .paren { -fx-fill: -var-font-color; -fx-font-weight: bold; + -fx-text-fill: -fx-fill; } .bracket { -fx-fill: -var-font-color; -fx-font-weight: bold; + -fx-text-fill: -fx-fill; } .brace { -fx-fill: -var-font-color; -fx-font-weight: bold; + -fx-text-fill: -fx-fill; } .string { -fx-fill: #1017c7; + -fx-text-fill: -fx-fill; } .comment { -fx-fill: #3f7f5f; + -fx-text-fill: -fx-fill; } .paragraph-box:has-caret { @@ -106,12 +116,15 @@ .log-severity { -fx-fill: red; + -fx-text-fill: -fx-fill; } .log-framework { -fx-fill: #7f0c78; + -fx-text-fill: -fx-fill; } .log-class { -fx-fill: #2a5332; + -fx-text-fill: -fx-fill; } \ No newline at end of file diff --git a/src/main/resources/ui/css/shadow-color.css b/src/main/resources/ui/css/shadow-color.css index a170a5ca..8aee5dc5 100644 --- a/src/main/resources/ui/css/shadow-color.css +++ b/src/main/resources/ui/css/shadow-color.css @@ -54,50 +54,60 @@ .plain-code { -fx-fill: white; + -fx-text-fill: -fx-fill; } .keyword { -fx-fill: #f92670; -fx-font-weight: bold; + -fx-text-fill: -fx-fill; } .value-type { -fx-fill: #62c59f; -fx-font-weight: bold; + -fx-text-fill: -fx-fill; } .value-value { -fx-fill: #a776a7; -fx-font-weight: bold; + -fx-text-fill: -fx-fill; } .semicolon { -fx-fill: white; -fx-font-weight: bold; + -fx-text-fill: -fx-fill; } .paren { -fx-fill: white; -fx-font-weight: bold; + -fx-text-fill: -fx-fill; } .bracket { -fx-fill: white; -fx-font-weight: bold; + -fx-text-fill: -fx-fill; } .brace { -fx-fill: white; -fx-font-weight: bold; + -fx-text-fill: -fx-fill; } .string { -fx-fill: #ddb03f; + -fx-text-fill: -fx-fill; } .comment { -fx-fill: #5f6c5a; + -fx-text-fill: -fx-fill; } .paragraph-box:has-caret { @@ -106,12 +116,15 @@ .log-severity { -fx-fill: #f92670; + -fx-text-fill: -fx-fill; } .log-framework { -fx-fill: #ddb03f; + -fx-text-fill: -fx-fill; } .log-class { -fx-fill: #62c59f; + -fx-text-fill: -fx-fill; } \ No newline at end of file From 53b30e15b5e6c6d33720f2e47e00f43c00c48f46 Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Tue, 13 Mar 2018 17:56:35 +0300 Subject: [PATCH 13/49] prepare to use bintray. --- build.gradle | 19 ++++++++++++++++++- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 051f0c86..d83ae0d8 100644 --- a/build.gradle +++ b/build.gradle @@ -1,9 +1,11 @@ buildscript { repositories { mavenCentral() + jcenter() } dependencies { classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.0' + classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3' } } @@ -11,6 +13,8 @@ apply plugin: 'java' apply plugin: 'maven' apply plugin: 'idea' apply plugin: 'org.junit.platform.gradle.plugin' +apply plugin: 'com.jfrog.bintray' + group = 'com.spaceshift' version = '1.7.0' @@ -71,6 +75,19 @@ repositories { maven { url 'https://jitpack.io' } } +bintray { + user = System.getenv('BINTRAY_USER') + key = System.getenv('BINTRAY_KEY') + publications = ['MyPublication'] + pkg { + repo = 'com.ss.jmonkeybuilder' + name = 'jmonkeybuilder' + userOrg = System.getenv('BINTRAY_USER') + licenses = ['Apache-2.0'] + vcsUrl = 'https://github.com/JavaSaBr/jmonkeybuilder.git' + } +} + javadoc { failOnError = false } @@ -208,4 +225,4 @@ install { } } } -} \ No newline at end of file +} diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 568c50bf..f51202dd 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ +distributionUrl=https\://services.gradle.org/distributions/gradle-4.5.1-bin.zip distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.5.1-bin.zip +zipStoreBase=GRADLE_USER_HOME From 38dd6ff777f4fe5bfa85d69720110ff8a03e15c7 Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Wed, 14 Mar 2018 10:53:21 +0300 Subject: [PATCH 14/49] finished migration to java 9 and bintray. --- build.gradle | 54 +++++++++++++----------- gradle/wrapper/gradle-wrapper.properties | 4 +- 2 files changed, 32 insertions(+), 26 deletions(-) diff --git a/build.gradle b/build.gradle index d83ae0d8..2e236908 100644 --- a/build.gradle +++ b/build.gradle @@ -14,10 +14,11 @@ apply plugin: 'maven' apply plugin: 'idea' apply plugin: 'org.junit.platform.gradle.plugin' apply plugin: 'com.jfrog.bintray' +apply plugin: 'maven-publish' group = 'com.spaceshift' -version = '1.7.0' +version = '1.7.3' compileJava { options.encoding = "UTF-8" @@ -58,6 +59,7 @@ ext.jme3_xbuf_version = '0.9.1' ext.junitPlatformVersion = "1.0.0" ext.junitJupiterVersion = "5.0.0" ext.log4jVersion = '2.6.2' +ext.bintryVersion = version + '-1' junitPlatform { filters { @@ -75,16 +77,36 @@ repositories { maven { url 'https://jitpack.io' } } + +publishing { + publications { + JmbArtifact(MavenPublication) { + from components.java + groupId 'com.ss' + artifactId 'jmonkeybuilder' + version bintryVersion + } + } +} + bintray { - user = System.getenv('BINTRAY_USER') - key = System.getenv('BINTRAY_KEY') - publications = ['MyPublication'] + user = System.getProperty('bintrayUser') + key = System.getProperty('bintrayKey') + publications = ['JmbArtifact'] pkg { - repo = 'com.ss.jmonkeybuilder' - name = 'jmonkeybuilder' - userOrg = System.getenv('BINTRAY_USER') + repo = 'maven' + name = 'com.ss.jmonkeybuilder' licenses = ['Apache-2.0'] + websiteUrl = 'https://github.com/JavaSaBr/jmonkeybuilder' vcsUrl = 'https://github.com/JavaSaBr/jmonkeybuilder.git' + issueTrackerUrl = 'https://github.com/JavaSaBr/jmonkeybuilder/issues' + githubRepo = 'JavaSaBr/jmonkeybuilder' + githubReleaseNotesFile = 'README.md' + version { + name = bintryVersion + desc = bintryVersion + released = new Date() + } } } @@ -209,20 +231,4 @@ artifacts { archives javadocJar } -defaultTasks 'clean', 'install' - -// To specify a license in the pom: -install { - repositories.mavenInstaller { - pom.version = version - pom.artifactId = 'jmonkeybuilder' - pom.project { - licenses { - license { - url 'http://www.apache.org/licenses/LICENSE-2.0.txt' - distribution 'repo' - } - } - } - } -} +defaultTasks 'clean', 'install' \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f51202dd..568c50bf 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ -distributionUrl=https\://services.gradle.org/distributions/gradle-4.5.1-bin.zip distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.5.1-bin.zip From a5e11490c8750ae43f5ab19aab74e431961cad0d Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Thu, 15 Mar 2018 10:11:20 +0300 Subject: [PATCH 15/49] changed jme version. --- build.gradle | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index 0163af3b..9525cd59 100644 --- a/build.gradle +++ b/build.gradle @@ -53,13 +53,13 @@ compileTestJava { ext.applicationMainClass = "com.ss.editor.JfxApplication" ext.applicationVendor = "javasabr@gmail.com" ext.applicationTitle = "jMonkeyBuilder" -ext.jmeVersion = "v3.3.dev-SNAPSHOT" +ext.jmeVersion = "develop-SNAPSHOT" ext.jmbExtVersion = "2.1.1" ext.jme3_xbuf_version = '0.9.1' ext.junitPlatformVersion = "1.0.0" ext.junitJupiterVersion = "5.0.0" ext.log4jVersion = '2.6.2' -ext.bintryVersion = version + '-1' +ext.bintryVersion = version + '-2' junitPlatform { filters { @@ -229,6 +229,4 @@ task wrapper(type: Wrapper) { artifacts { archives sourcesJar archives javadocJar -} - -defaultTasks 'clean', 'install' \ No newline at end of file +} \ No newline at end of file From 677387b407520c89c83aff14df5973dda94956ae Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Thu, 15 Mar 2018 10:13:40 +0300 Subject: [PATCH 16/49] fixed build script. --- build.gradle | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index 9525cd59..740d1e31 100644 --- a/build.gradle +++ b/build.gradle @@ -59,7 +59,7 @@ ext.jme3_xbuf_version = '0.9.1' ext.junitPlatformVersion = "1.0.0" ext.junitJupiterVersion = "5.0.0" ext.log4jVersion = '2.6.2' -ext.bintryVersion = version + '-2' +ext.bintrayVersion = version + '-2' junitPlatform { filters { @@ -82,9 +82,9 @@ publishing { publications { JmbArtifact(MavenPublication) { from components.java - groupId 'com.ss' + groupId 'com.spaceshift' artifactId 'jmonkeybuilder' - version bintryVersion + version bintrayVersion } } } @@ -95,7 +95,7 @@ bintray { publications = ['JmbArtifact'] pkg { repo = 'maven' - name = 'com.ss.jmonkeybuilder' + name = 'com.spaceshift.jmonkeybuilder' licenses = ['Apache-2.0'] websiteUrl = 'https://github.com/JavaSaBr/jmonkeybuilder' vcsUrl = 'https://github.com/JavaSaBr/jmonkeybuilder.git' @@ -103,8 +103,8 @@ bintray { githubRepo = 'JavaSaBr/jmonkeybuilder' githubReleaseNotesFile = 'README.md' version { - name = bintryVersion - desc = bintryVersion + name = bintrayVersion + desc = bintrayVersion released = new Date() } } From d14a847ff3bcf06923deb79e2b94318641a32a2d Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Fri, 16 Mar 2018 09:26:12 +0300 Subject: [PATCH 17/49] fixed task executor. --- .../java/com/ss/editor/JmeApplication.java | 5 ++-- .../executor/impl/FxEditorTaskExecutor.java | 23 ++++++++----------- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/ss/editor/JmeApplication.java b/src/main/java/com/ss/editor/JmeApplication.java index 7c351508..ee72222b 100644 --- a/src/main/java/com/ss/editor/JmeApplication.java +++ b/src/main/java/com/ss/editor/JmeApplication.java @@ -388,8 +388,9 @@ public void update() { super.update(); } - } catch (final AssetNotFoundException | RendererException | AssertionError | ArrayIndexOutOfBoundsException | - NullPointerException | StackOverflowError | IllegalStateException | UnsupportedOperationException e) { + } catch (final AssetNotFoundException | NoSuchMethodError | RendererException | AssertionError | + ArrayIndexOutOfBoundsException | NullPointerException | StackOverflowError | + IllegalStateException | UnsupportedOperationException e) { LOGGER.warning(e); finishWorkOnError(e); } finally { diff --git a/src/main/java/com/ss/editor/executor/impl/FxEditorTaskExecutor.java b/src/main/java/com/ss/editor/executor/impl/FxEditorTaskExecutor.java index edc04c0e..1f002298 100644 --- a/src/main/java/com/ss/editor/executor/impl/FxEditorTaskExecutor.java +++ b/src/main/java/com/ss/editor/executor/impl/FxEditorTaskExecutor.java @@ -1,10 +1,9 @@ package com.ss.editor.executor.impl; -import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; +import com.ss.editor.annotation.FxThread; import com.ss.editor.util.EditorUtil; import com.ss.rlib.concurrent.util.ConcurrentUtils; -import com.ss.rlib.concurrent.util.ThreadUtils; import com.ss.rlib.util.array.Array; import javafx.application.Platform; import org.jetbrains.annotations.NotNull; @@ -27,7 +26,11 @@ public class FxEditorTaskExecutor extends AbstractEditorTaskExecutor { public FxEditorTaskExecutor() { setName(FxEditorTaskExecutor.class.getSimpleName()); setPriority(NORM_PRIORITY); - start(); + try { + Platform.startup(this::start); + } catch (final IllegalStateException e) { + start(); + } } @Override @@ -108,17 +111,9 @@ public void run() { @FromAnyThread private void executeInFxUiThread() { - while (true) { - try { - synchronized (this) { - Platform.runLater(fxTask); - ConcurrentUtils.waitInSynchronize(this); - } - break; - } catch (final IllegalStateException e) { - LOGGER.warning(this, e); - ThreadUtils.sleep(1000); - } + synchronized (this) { + Platform.runLater(fxTask); + ConcurrentUtils.waitInSynchronize(this); } } } From 1c7a40dcf7ea99d8518058d951ebd432bea50f82 Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Wed, 21 Mar 2018 16:36:19 +0300 Subject: [PATCH 18/49] updated build file. --- build.gradle | 23 +++++++++++++---------- gradle/wrapper/gradle-wrapper.jar | Bin 54333 -> 54329 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/build.gradle b/build.gradle index 740d1e31..28fac6ff 100644 --- a/build.gradle +++ b/build.gradle @@ -15,7 +15,7 @@ apply plugin: 'idea' apply plugin: 'org.junit.platform.gradle.plugin' apply plugin: 'com.jfrog.bintray' apply plugin: 'maven-publish' - +apply plugin: 'application' group = 'com.spaceshift' version = '1.7.3' @@ -50,6 +50,8 @@ compileTestJava { options.compilerArgs += '-parameters' } +mainClassName = "com.ss.editor.JfxApplication" + ext.applicationMainClass = "com.ss.editor.JfxApplication" ext.applicationVendor = "javasabr@gmail.com" ext.applicationTitle = "jMonkeyBuilder" @@ -74,10 +76,14 @@ junitPlatform { repositories { mavenCentral() jcenter() - maven { url 'https://jitpack.io' } + maven { + url 'https://jitpack.io' + } + maven { + url "https://dl.bintray.com/javasabr/maven" + } } - publishing { publications { JmbArtifact(MavenPublication) { @@ -85,6 +91,8 @@ publishing { groupId 'com.spaceshift' artifactId 'jmonkeybuilder' version bintrayVersion + artifact sourcesJar + artifact javadocJar } } } @@ -120,7 +128,7 @@ dependencies { compile 'org.fxmisc.richtext:richtextfx:0.8.2' compile 'org.controlsfx:controlsfx:9.0.0' compile 'com.github.JavaSaBr:RlibFX:4.1.3' - compile 'com.github.JavaSaBr:RLib:6.8.0' + compile 'com.spaceshift:rlib:6.8.3-Final' compile ("com.github.JavaSaBr:JME3-JFX:1.7.4") { exclude group: 'org.jmonkeyengine' } @@ -223,10 +231,5 @@ task javadocJar(type: Jar, dependsOn: javadoc) { } task wrapper(type: Wrapper) { - gradleVersion = '4.5.1' -} - -artifacts { - archives sourcesJar - archives javadocJar + gradleVersion = '4.6' } \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index c44b679acd3f794ddbb3aa5e919244914911014a..f6b961fd5a86aa5fbfe90f707c3138408be7c718 100644 GIT binary patch delta 757 zcmY+CUr3Wt7{+&AW7C-VS!CNcr4&o~L{lkNk~%LkW0;eMX_UJtQ_yA@6BN7{7(@fv zcr37JCEXarC;}s-BKOa2&dpgDb!E_vP@r@Z1<~oSzVg7~Jiq6C&dcHDyqe2-IhW%# z=T){xzBg+$8oSS8*KUn$jWCT@em4K>?d}|n&8o}YXqx`Eht~`FMoX|5pBJnCU4kKa zmfgiru#UZkKX{BbH1I|C;%iW$VkTqZw7eqDyDQ&yYg* z^0L-0tK8#zZM)uL{zF5q1h z($xq&6Fp9*qeA+lW}0Xd@@bo%H<6ILB$H$n)`O*d*sKQhE-56pXRStRwF^0BFM$+O z=unTqo*o&49O;6yq78mu+V3OW1t*?xP*#?Ovxd*oyBk@ zTG%DbCb}p%j8DUryqAQJE=kYlon3L4NN$emaBaDc=0~$wiuGlMtm9eK<4Dp>mI*cN zO`fDlw~9ZK9dvL~MdwN@IXo&p^q6pKMZ%7hOc$qA+dsvhm{O?Ir&@uOh5Dye^iOFK zm@ecg2@PqPF5lT!^3G^+BV9|UXSUhvX$vbu>8gW`!M!>}FJ`l4Egpr7P?3@8_H%d^ z%FvgorK<~E)`-!(&&cdLHZ%R~6uQ^0@Xz&Tt={ziFE#v~n>Yude^;dqE&hSu9GWc- delta 705 zcmYL{-%Ha`7{+(rjm?$j*GjXaTd)e{D~3xfrA01^mTOixDlKYW%oMDZpcjQmAYF7} zlSc~EjINT1VkqRYY;&8=`Ey%dMEwKRMHJLc5FJmp&dvEe&-1=7oWmO&)xH_k`u7`q zHjI_nH5$#C{#tj|=k4D+zI8B-p9jW&hx1k|b(&L7Lzb!?I-4(QwjexR_rC*MBModA ztr05=;X$ODeZh5o0X{`kGBbpu`EW6grwIk_D5rCJVVU9A8_+nbz+q4}ijnKbhETMb z9vVf73AM3`wNbH)>;qO}9(D)TnI^JY9IHGZm|eR$6X{y|)@K&nf1U)-PW+ObaS4bPBl>?F&|#=#u!Oi{qn6TsNdFTeQ*PZizkJMIuq~a*@;R zThjWuc#=wb1s=lNq=I`(oHZk`)JB*3WbW_R%JAv zT5x*BL(aiW*f+RVuYi)Ab`4A0o;*M|MckdvyQ`(p@ Date: Mon, 26 Mar 2018 10:41:13 +0300 Subject: [PATCH 19/49] updated dependencies. --- build.gradle | 4 ++-- native-build/.gitignore | 7 ------- 2 files changed, 2 insertions(+), 9 deletions(-) delete mode 100644 native-build/.gitignore diff --git a/build.gradle b/build.gradle index 28fac6ff..069c1ff7 100644 --- a/build.gradle +++ b/build.gradle @@ -127,9 +127,9 @@ dependencies { // base compile 'org.fxmisc.richtext:richtextfx:0.8.2' compile 'org.controlsfx:controlsfx:9.0.0' - compile 'com.github.JavaSaBr:RlibFX:4.1.3' + compile 'com.spaceshift:rlib.fx:4.2.1-Final' compile 'com.spaceshift:rlib:6.8.3-Final' - compile ("com.github.JavaSaBr:JME3-JFX:1.7.4") { + compile ('com.jme3x:jme-jfx:1.7.5-Final') { exclude group: 'org.jmonkeyengine' } diff --git a/native-build/.gitignore b/native-build/.gitignore deleted file mode 100644 index 4aa0d861..00000000 --- a/native-build/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -/projectRefs/ -/project/ -/externalLibs/ -/dist/ -/deploy/ -/build/ -/licenses/ \ No newline at end of file From e4d1b7e9f5b9a69d19a9595ac88f4adcadeca5bf Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Tue, 27 Mar 2018 09:15:40 +0300 Subject: [PATCH 20/49] updated build file. --- build.gradle | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index 069c1ff7..57d7f327 100644 --- a/build.gradle +++ b/build.gradle @@ -41,12 +41,12 @@ compileJava { ]) } -sourceCompatibility = 1.9 -targetCompatibility = 1.9 +sourceCompatibility = 1.10 +targetCompatibility = 1.10 compileTestJava { - sourceCompatibility = 1.9 - targetCompatibility = 1.9 + sourceCompatibility = 1.10 + targetCompatibility = 1.10 options.compilerArgs += '-parameters' } @@ -61,7 +61,7 @@ ext.jme3_xbuf_version = '0.9.1' ext.junitPlatformVersion = "1.0.0" ext.junitJupiterVersion = "5.0.0" ext.log4jVersion = '2.6.2' -ext.bintrayVersion = version + '-2' +ext.bintrayVersion = version + '-3' junitPlatform { filters { From ea638d932c76b8ce454f3ae1b871066d0250158b Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Tue, 27 Mar 2018 10:08:32 +0300 Subject: [PATCH 21/49] updated CI things. --- bitbucket-pipelines.yml | 2 +- jitpack.yml | 9 --------- prepareEnvironment.sh | 2 -- 3 files changed, 1 insertion(+), 12 deletions(-) delete mode 100644 jitpack.yml delete mode 100755 prepareEnvironment.sh diff --git a/bitbucket-pipelines.yml b/bitbucket-pipelines.yml index 12671b88..1d2b570c 100644 --- a/bitbucket-pipelines.yml +++ b/bitbucket-pipelines.yml @@ -5,7 +5,7 @@ # You can specify a custom docker image from Docker Hub as your build environment. # image: atlassian/default-image:latest -image: java:8 +image: java:10 pipelines: default: - step: diff --git a/jitpack.yml b/jitpack.yml deleted file mode 100644 index 9abdb63e..00000000 --- a/jitpack.yml +++ /dev/null @@ -1,9 +0,0 @@ -jdk: - - oraclejdk9 -before_install: - - ./prepareEnvironment.sh -install: - - java -version - - java --list-modules - - ./gradlew install - diff --git a/prepareEnvironment.sh b/prepareEnvironment.sh deleted file mode 100755 index 10ee4925..00000000 --- a/prepareEnvironment.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env sh - From f5940c920dac533be87e44fccef73d888db13057 Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Wed, 4 Apr 2018 09:40:28 +0300 Subject: [PATCH 22/49] refactoring. --- .../ui/component/asset/tree/ResourceTree.java | 518 ++++++++++-------- .../context/menu/action/CopyFileAction.java | 31 +- .../context/menu/action/CutFileAction.java | 23 +- .../context/menu/action/DeleteFileAction.java | 53 +- .../context/menu/action/PasteFileAction.java | 79 +-- .../java/com/ss/editor/ui/util/UiUtils.java | 17 +- .../java/com/ss/editor/util/EditorUtil.java | 15 +- 7 files changed, 412 insertions(+), 324 deletions(-) diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java b/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java index f3f8afb0..fd8c12c3 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java @@ -11,8 +11,6 @@ import com.ss.editor.manager.ExecutorManager; import com.ss.editor.ui.FXConstants; import com.ss.editor.ui.component.asset.tree.context.menu.action.*; -import com.ss.editor.ui.component.asset.tree.context.menu.filler.AssetTreeMultiContextMenuFiller; -import com.ss.editor.ui.component.asset.tree.context.menu.filler.AssetTreeSingleContextMenuFiller; import com.ss.editor.ui.component.asset.tree.resource.*; import com.ss.editor.ui.util.UiUtils; import com.ss.rlib.function.IntObjectConsumer; @@ -22,9 +20,6 @@ import com.ss.rlib.util.array.ArrayFactory; import com.ss.rlib.util.array.ConcurrentArray; import javafx.collections.FXCollections; -import javafx.collections.ObservableList; -import javafx.event.ActionEvent; -import javafx.event.EventHandler; import javafx.scene.control.*; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; @@ -33,6 +28,7 @@ import java.nio.file.Path; import java.util.Objects; +import java.util.Optional; import java.util.function.Consumer; import java.util.function.Predicate; @@ -61,20 +57,20 @@ public class ResourceTree extends TreeView { @NotNull private static final ArrayComparator NAME_COMPARATOR = (first, second) -> { - final int firstLevel = getLevel(first); - final int secondLevel = getLevel(second); + var firstLevel = getLevel(first); + var secondLevel = getLevel(second); if (firstLevel != secondLevel) { return firstLevel - secondLevel; } - final Path firstFile = notNull(first).getFile(); - final Path firstFileFileName = firstFile.getFileName(); - final String firstName = firstFileFileName == null ? firstFile.toString() : firstFileFileName.toString(); + var firstFile = notNull(first).getFile(); + var firstFileFileName = firstFile.getFileName(); + var firstName = firstFileFileName == null ? firstFile.toString() : firstFileFileName.toString(); - final Path secondFile = notNull(second).getFile(); - final Path secondFileName = secondFile.getFileName(); - final String secondName = secondFileName == null ? secondFile.toString() : secondFileName.toString(); + var secondFile = notNull(second).getFile(); + var secondFileName = secondFile.getFileName(); + var secondName = secondFileName == null ? secondFile.toString() : secondFileName.toString(); return StringUtils.compareIgnoreCase(firstName, secondName); }; @@ -84,8 +80,8 @@ public class ResourceTree extends TreeView { */ @NotNull private static final ArrayComparator> ITEM_COMPARATOR = (first, second) -> { - final ResourceElement firstElement = notNull(first).getValue(); - final ResourceElement secondElement = notNull(second).getValue(); + var firstElement = notNull(first).getValue(); + var secondElement = notNull(second).getValue(); return NAME_COMPARATOR.compare(firstElement, secondElement); }; @@ -93,23 +89,22 @@ public class ResourceTree extends TreeView { * The context menu filler registry. */ @NotNull - private static final AssetTreeContextMenuFillerRegistry CONTEXT_MENU_FILLER_REGISTRY = AssetTreeContextMenuFillerRegistry.getInstance(); + private static final AssetTreeContextMenuFillerRegistry CONTEXT_MENU_FILLER_REGISTRY = + AssetTreeContextMenuFillerRegistry.getInstance(); @FromAnyThread - private static int getLevel(@Nullable final ResourceElement element) { - if (element instanceof FolderResourceElement) return 1; - return 2; + private static int getLevel(@Nullable ResourceElement element) { + return element instanceof FolderResourceElement ? 1 : 2; } /** * The default open function. */ @NotNull - private static final Consumer DEFAULT_OPEN_FUNCTION = element -> { - final OpenFileAction action = new OpenFileAction(element); - final EventHandler onAction = action.getOnAction(); - onAction.handle(null); - }; + private static final Consumer DEFAULT_OPEN_FUNCTION = + element -> new OpenFileAction(element) + .getOnAction() + .handle(null); /** * The list of expanded elements. @@ -198,14 +193,18 @@ public ResourceTree(@Nullable final Consumer openFunction, fina } /** + * Set true if need to use lazy mode. + * * @param lazyMode true if need to use lazy mode. */ @FromAnyThread - public void setLazyMode(final boolean lazyMode) { + public void setLazyMode(boolean lazyMode) { this.lazyMode = lazyMode; } /** + * Return true if need to use lazy mode. + * * @return true if need to use lazy mode. */ @FromAnyThread @@ -214,15 +213,19 @@ private boolean isLazyMode() { } /** - * @param needCleanup true of need to cleanup this tree. + * Set true if need to cleanup this tree. + * + * @param needCleanup true if need to cleanup this tree. */ @FromAnyThread - public void setNeedCleanup(final boolean needCleanup) { + public void setNeedCleanup(boolean needCleanup) { this.needCleanup = needCleanup; } /** - * @return true of need to cleanup this tree. + * Return true if need to cleanup this tree. + * + * @return true if need to cleanup this tree. */ @FromAnyThread private boolean isNeedCleanup() { @@ -233,18 +236,13 @@ private boolean isNeedCleanup() { * Handle changed count of expanded elements. */ @FxThread - private void processChangedExpands(@NotNull final Number newValue) { + private void processChangedExpands(@NotNull Number newValue) { if (isLazyMode()) { EXECUTOR_MANAGER.addFxTask(this::lazyLoadChildren); } - final IntObjectConsumer expandHandler = getExpandHandler(); - if (expandHandler == null) { - return; - } - - expandHandler.accept(newValue.intValue(), this); + getExpandHandler().ifPresent(handler -> handler.accept(newValue.intValue(), this)); } /** @@ -253,15 +251,15 @@ private void processChangedExpands(@NotNull final Number newValue) { @FxThread private void lazyLoadChildren() { - final Array> expanded = ArrayFactory.newArray(TreeItem.class); - final Array> allItems = UiUtils.getAllItems(getRoot()); - allItems.stream().filter(TreeItem::isExpanded) + Array> expanded = ArrayFactory.newArray(TreeItem.class); + + UiUtils.allItems(getRoot()).filter(TreeItem::isExpanded) .filter(treeItem -> !treeItem.isLeaf()) .filter(item -> item.getChildren().size() == 1) .filter(item -> item.getChildren().get(0).getValue() == LoadingResourceElement.getInstance()) .forEach(expanded::add); - for (final TreeItem treeItem : expanded) { + for (var treeItem : expanded) { EXECUTOR_MANAGER.addBackgroundTask(() -> lazyLoadChildren(treeItem, null)); } } @@ -272,11 +270,17 @@ private void lazyLoadChildren() { * @param treeItem the tree item. */ @BackgroundThread - private void lazyLoadChildren(@NotNull final TreeItem treeItem, - @Nullable final Consumer> callback) { + private void lazyLoadChildren( + @NotNull TreeItem treeItem, + @Nullable Consumer> callback + ) { + + var element = treeItem.getValue(); + var children = element.getChildren(extensionFilter, isOnlyFolders()); + if (children == null) { + return; + } - final ResourceElement element = treeItem.getValue(); - final Array children = element.getChildren(extensionFilter, isOnlyFolders()); children.sort(NAME_COMPARATOR); EXECUTOR_MANAGER.addFxTask(() -> lazyLoadChildren(treeItem, children, callback)); @@ -290,11 +294,13 @@ private void lazyLoadChildren(@NotNull final TreeItem treeItem, * @param callback the loading callback. */ @FxThread - private void lazyLoadChildren(@NotNull final TreeItem treeItem, - @NotNull final Array children, - @Nullable final Consumer> callback) { + private void lazyLoadChildren( + @NotNull TreeItem treeItem, + @NotNull Array children, + @Nullable Consumer> callback + ) { - final ObservableList> items = treeItem.getChildren(); + var items = treeItem.getChildren(); if (items.size() != 1 || items.get(0).getValue() != LoadingResourceElement.getInstance()) { if (callback != null) callback.accept(treeItem); return; @@ -315,44 +321,48 @@ private void lazyLoadChildren(@NotNull final TreeItem treeItem, } /** - * Sets expand handler. + * Set the expand handler. * - * @param expandHandler the handler for listening expand items. + * @param expandHandler the expand handler. */ @FromAnyThread - public void setExpandHandler(@Nullable final IntObjectConsumer expandHandler) { + public void setExpandHandler(@Nullable IntObjectConsumer expandHandler) { this.expandHandler = expandHandler; } /** - * Sets action tester. + * Set the action tester. * * @param actionTester the action tester. */ @FromAnyThread - public void setActionTester(@NotNull final Predicate> actionTester) { + public void setActionTester(@NotNull Predicate> actionTester) { this.actionTester = actionTester; } /** - * @return the handler for listening expand items. + * Get the expand handler. + * + * @return the expand handler. */ @FromAnyThread - private @Nullable IntObjectConsumer getExpandHandler() { - return expandHandler; + private @NotNull Optional> getExpandHandler() { + return Optional.ofNullable(expandHandler); } /** - * Sets extension filter. + * Set the list of filtered extensions. * * @param extensionFilter the list of filtered extensions. */ @FromAnyThread - public void setExtensionFilter(@NotNull final Array extensionFilter) { + public void setExtensionFilter(@NotNull Array extensionFilter) { this.extensionFilter = extensionFilter; } /** + * Get the list of filtered extensions. + * * @return the list of filtered extensions. */ @FromAnyThread @@ -361,16 +371,18 @@ public void setExtensionFilter(@NotNull final Array extensionFilter) { } /** - * Sets on load handler. + * Set the on load handler. * - * @param onLoadHandler the post loading handler. + * @param onLoadHandler the on load handler. */ @FromAnyThread - public void setOnLoadHandler(@Nullable final Consumer onLoadHandler) { + public void setOnLoadHandler(@Nullable Consumer onLoadHandler) { this.onLoadHandler = onLoadHandler; } /** + * Get the post loading handler. + * * @return the post loading handler. */ @FromAnyThread @@ -379,7 +391,9 @@ public void setOnLoadHandler(@Nullable final Consumer onLoadHandler) { } /** - * @return the flag of read only mode. + * Return true if this tree is read only. + * + * @return true if this tree is read only. */ @FromAnyThread private boolean isReadOnly() { @@ -387,6 +401,8 @@ private boolean isReadOnly() { } /** + * Get the action tester. + * * @return the action tester. */ @FromAnyThread @@ -395,43 +411,40 @@ private boolean isReadOnly() { } /** - * Gets context menu. + * Get a new context menu. * - * @param element the element + * @param element the current selected element. * @return the context menu for the element. */ @FxThread - protected @Nullable ContextMenu getContextMenu(@NotNull final ResourceElement element) { + protected @Nullable ContextMenu getContextMenu(@NotNull ResourceElement element) { if (isReadOnly()) { return null; } - final ContextMenu contextMenu = new ContextMenu(); - final ObservableList items = contextMenu.getItems(); - - final Predicate> actionTester = getActionTester(); + var contextMenu = new ContextMenu(); + var items = contextMenu.getItems(); + var actionTester = getActionTester(); - final MultipleSelectionModel> selectionModel = getSelectionModel(); - final ObservableList> selectedItems = selectionModel.getSelectedItems(); + var selectionModel = getSelectionModel(); + var selectedItems = selectionModel.getSelectedItems(); if (selectedItems.size() == 1) { - final Array fillers = CONTEXT_MENU_FILLER_REGISTRY.getSingleFillers(); - for (final AssetTreeSingleContextMenuFiller filler : fillers) { + for (var filler : CONTEXT_MENU_FILLER_REGISTRY.getSingleFillers()) { filler.fill(element, items, actionTester); } } if (selectedItems.size() >= 1) { - updateSelectedElements(); - final ConcurrentArray selectedElements = getSelectedElements(); + updateSelectedElements(); - final long stamp = selectedElements.readLock(); + var selectedElements = getSelectedElements(); + var stamp = selectedElements.readLock(); try { - final Array fillers = CONTEXT_MENU_FILLER_REGISTRY.getMultiFillers(); - for (final AssetTreeMultiContextMenuFiller filler : fillers) { + for (var filler : CONTEXT_MENU_FILLER_REGISTRY.getMultiFillers()) { filler.fill(selectedElements, items, actionTester); } @@ -453,14 +466,14 @@ private boolean isReadOnly() { * @param rootFolder the root folder. */ @FxThread - public void fill(@NotNull final Path rootFolder) { + public void fill(@NotNull Path rootFolder) { - final Consumer onLoadHandler = getOnLoadHandler(); + var onLoadHandler = getOnLoadHandler(); if (onLoadHandler != null) { onLoadHandler.accept(Boolean.FALSE); } - final TreeItem currentRoot = getRoot(); + var currentRoot = getRoot(); if (currentRoot != null) { setRoot(null); } @@ -476,14 +489,14 @@ public void fill(@NotNull final Path rootFolder) { * @param rootFolders the list of root folder. */ @FxThread - public void fill(@NotNull final Array rootFolders) { + public void fill(@NotNull Array rootFolders) { - final Consumer onLoadHandler = getOnLoadHandler(); + var onLoadHandler = getOnLoadHandler(); if (onLoadHandler != null) { onLoadHandler.accept(Boolean.FALSE); } - final TreeItem currentRoot = getRoot(); + var currentRoot = getRoot(); if (currentRoot != null) { setRoot(null); } @@ -494,6 +507,8 @@ public void fill(@NotNull final Array rootFolders) { } /** + * Get the list of expanded elements. + * * @return the list of expanded elements. */ @FromAnyThread @@ -502,6 +517,8 @@ public void fill(@NotNull final Array rootFolders) { } /** + * Get the list of selected elements. + * * @return the list of selected elements. */ @FromAnyThread @@ -515,16 +532,18 @@ public void fill(@NotNull final Array rootFolders) { @FxThread public void refresh() { - final EditorConfig config = EditorConfig.getInstance(); - final Path currentAsset = config.getCurrentAsset(); + var config = EditorConfig.getInstance(); + var currentAsset = config.getCurrentAsset(); if (currentAsset == null) { setRoot(null); return; } - final Consumer onLoadHandler = getOnLoadHandler(); - if (onLoadHandler != null) onLoadHandler.accept(Boolean.FALSE); + var onLoadHandler = getOnLoadHandler(); + if (onLoadHandler != null) { + onLoadHandler.accept(Boolean.FALSE); + } updateSelectedElements(); updateExpandedElements(); @@ -541,20 +560,18 @@ public void refresh() { @FxThread private void updateExpandedElements() { - final ConcurrentArray expandedElements = getExpandedElements(); - final long stamp = expandedElements.writeLock(); + var elements = getExpandedElements(); + var stamp = elements.writeLock(); try { - expandedElements.clear(); + elements.clear(); - final Array> allItems = UiUtils.getAllItems(this); - allItems.forEach(item -> { - if (!item.isExpanded()) return; - expandedElements.add(item.getValue()); - }); + UiUtils.allItems(getRoot()) + .filter(TreeItem::isExpanded) + .forEach(item -> elements.add(item.getValue())); } finally { - expandedElements.writeUnlock(stamp); + elements.writeUnlock(stamp); } } @@ -564,18 +581,18 @@ private void updateExpandedElements() { @FxThread private void updateSelectedElements() { - final ConcurrentArray selectedElements = getSelectedElements(); - final long stamp = selectedElements.writeLock(); + var elements = getSelectedElements(); + var stamp = elements.writeLock(); try { - selectedElements.clear(); + elements.clear(); - final MultipleSelectionModel> selectionModel = getSelectionModel(); - final ObservableList> selectedItems = selectionModel.getSelectedItems(); - selectedItems.forEach(item -> selectedElements.add(item.getValue())); + getSelectionModel() + .getSelectedItems() + .forEach(item -> elements.add(item.getValue())); } finally { - selectedElements.writeUnlock(stamp); + elements.writeUnlock(stamp); } } @@ -591,10 +608,10 @@ private void showLoading() { * Start the background process of filling. */ @BackgroundThread - private void startBackgroundFill(@NotNull final Path path) { + private void startBackgroundFill(@NotNull Path path) { - final ResourceElement rootElement = createFor(path); - final TreeItem newRoot = new TreeItem<>(rootElement); + var rootElement = createFor(path); + var newRoot = new TreeItem(rootElement); newRoot.setExpanded(true); fill(newRoot); @@ -603,24 +620,33 @@ private void startBackgroundFill(@NotNull final Path path) { cleanup(newRoot); } - EXECUTOR_MANAGER.addFxTask(() -> { - setRoot(newRoot); + EXECUTOR_MANAGER.addFxTask(() -> applyNewRoot(newRoot)); + } - final Consumer onLoadHandler = getOnLoadHandler(); - if (onLoadHandler != null) { - onLoadHandler.accept(Boolean.TRUE); - } - }); + /** + * Applies the new root. + * + * @param newRoot the new root, + */ + @BackgroundThread + private void applyNewRoot(@NotNull TreeItem newRoot) { + + setRoot(newRoot); + + var onLoadHandler = getOnLoadHandler(); + if (onLoadHandler != null) { + onLoadHandler.accept(Boolean.TRUE); + } } /** * Start the background process of filling. */ @BackgroundThread - private void startBackgroundFill(@NotNull final Array paths) { + private void startBackgroundFill(@NotNull Array paths) { - final ResourceElement rootElement = new FoldersResourceElement(paths); - final TreeItem newRoot = new TreeItem<>(rootElement); + var rootElement = new FoldersResourceElement(paths); + var newRoot = new TreeItem(rootElement); newRoot.setExpanded(true); fill(newRoot); @@ -629,35 +655,29 @@ private void startBackgroundFill(@NotNull final Array paths) { cleanup(newRoot); } - EXECUTOR_MANAGER.addFxTask(() -> { - setRoot(newRoot); - final Consumer onLoadHandler = getOnLoadHandler(); - if (onLoadHandler != null) { - onLoadHandler.accept(Boolean.TRUE); - } - }); + EXECUTOR_MANAGER.addFxTask(() -> applyNewRoot(newRoot)); } /** * Start the background process of loading. */ @BackgroundThread - private void startBackgroundRefresh(@NotNull final Path assetFolder) { + private void startBackgroundRefresh(@NotNull Path assetFolder) { - final ResourceElement rootElement = createFor(assetFolder); - final TreeItem newRoot = new TreeItem<>(rootElement); + var rootElement = createFor(assetFolder); + var newRoot = new TreeItem(rootElement); newRoot.setExpanded(true); fill(newRoot); - final ConcurrentArray expandedElements = getExpandedElements(); - final long stamp = expandedElements.writeLock(); + var expandedElements = getExpandedElements(); + var stamp = expandedElements.writeLock(); try { expandedElements.sort(COMPARATOR); expandedElements.forEach(element -> { - final TreeItem item = findItemForValue(newRoot, element); + var item = findItemForValue(newRoot, element); if (item == null) { return; } @@ -672,10 +692,11 @@ private void startBackgroundRefresh(@NotNull final Path assetFolder) { } EXECUTOR_MANAGER.addFxTask(() -> { + setRoot(newRoot); restoreSelection(); - final Consumer onLoadHandler = getOnLoadHandler(); + var onLoadHandler = getOnLoadHandler(); if (onLoadHandler != null) { onLoadHandler.accept(Boolean.TRUE); } @@ -689,17 +710,16 @@ private void startBackgroundRefresh(@NotNull final Path assetFolder) { private void restoreSelection() { EXECUTOR_MANAGER.addFxTask(() -> { - final ConcurrentArray selectedElements = getSelectedElements(); - final long stamp = selectedElements.writeLock(); + var selectedElements = getSelectedElements(); + var stamp = selectedElements.writeLock(); try { - final MultipleSelectionModel> selectionModel = getSelectionModel(); + var selectionModel = getSelectionModel(); - selectedElements.forEach(element -> { - final TreeItem item = findItemForValue(getRoot(), element); - if (item == null) return; - selectionModel.select(item); - }); + selectedElements.stream() + .map(resourceElement -> findItemForValue(getRoot(), resourceElement)) + .filter(Objects::nonNull) + .forEach(selectionModel::select); selectedElements.clear(); @@ -713,21 +733,26 @@ private void restoreSelection() { * Fill the node. */ @FxThread - private void fill(@NotNull final TreeItem treeItem) { + private void fill(@NotNull TreeItem treeItem) { + + var element = treeItem.getValue(); + var extensionFilter = getExtensionFilter(); - final ResourceElement element = treeItem.getValue(); - final Array extensionFilter = getExtensionFilter(); if (!element.hasChildren(extensionFilter, isOnlyFolders())) { return; } - final ObservableList> items = treeItem.getChildren(); + var items = treeItem.getChildren(); if (isLazyMode()) { items.add(new TreeItem<>(LoadingResourceElement.getInstance())); } else { - final Array children = element.getChildren(extensionFilter, isOnlyFolders()); + var children = element.getChildren(extensionFilter, isOnlyFolders()); + if (children == null) { + return; + } + children.sort(NAME_COMPARATOR); children.forEach(child -> items.add(new TreeItem<>(child))); @@ -741,24 +766,25 @@ private void fill(@NotNull final TreeItem treeItem) { * @param file the created file. */ @FxThread - public void notifyCreated(@NotNull final Path file) { + public void notifyCreated(@NotNull Path file) { + + var editorConfig = EditorConfig.getInstance(); + var currentAsset = editorConfig.getCurrentAsset(); + var folder = file.getParent(); - final EditorConfig editorConfig = EditorConfig.getInstance(); - final Path currentAsset = editorConfig.getCurrentAsset(); - final Path folder = file.getParent(); if (!folder.startsWith(currentAsset)) { return; } - final ResourceElement fileElement = createFor(file); - final TreeItem fileItem = findItemForValue(getRoot(), fileElement); + var fileElement = createFor(file); + + var fileItem = findItemForValue(getRoot(), fileElement); if (fileItem != null) { return; } - final ResourceElement element = createFor(folder); - - TreeItem folderItem = findItemForValue(getRoot(), element); + var element = createFor(folder); + var folderItem = findItemForValue(getRoot(), element); if (folderItem == null) { notifyCreated(folder); @@ -769,86 +795,89 @@ public void notifyCreated(@NotNull final Path file) { return; } - final TreeItem newItem = new TreeItem<>(createFor(file)); + var newItem = new TreeItem(createFor(file)); fill(newItem); - final ObservableList> children = folderItem.getChildren(); + var children = folderItem.getChildren(); children.add(newItem); FXCollections.sort(children, ITEM_COMPARATOR); } /** - * Handle a removed file. + * Handle the removed file. * - * @param file the file + * @param file the removed file. */ @FxThread - public void notifyDeleted(@NotNull final Path file) { + public void notifyDeleted(@NotNull Path file) { - final ResourceElement element = createFor(file); - final TreeItem treeItem = findItemForValue(getRoot(), element); + var element = createFor(file); + var treeItem = findItemForValue(getRoot(), element); if (treeItem == null) { return; } - final TreeItem parent = treeItem.getParent(); + var parent = treeItem.getParent(); if (parent == null) { return; } - final ObservableList> children = parent.getChildren(); + var children = parent.getChildren(); children.remove(treeItem); } /** - * Handle a moved file. + * Handle the moved file. * * @param prevFile the prev version. * @param newFile the new version. */ @FxThread - public void notifyMoved(@NotNull final Path prevFile, @NotNull final Path newFile) { + public void notifyMoved(@NotNull Path prevFile, @NotNull Path newFile) { - final ResourceElement prevElement = createFor(prevFile); - final TreeItem prevItem = findItemForValue(getRoot(), prevElement); + var prevElement = createFor(prevFile); + var prevItem = findItemForValue(getRoot(), prevElement); if (prevItem == null) { return; } - final ResourceElement newParentElement = createFor(newFile.getParent()); - final TreeItem newParentItem = findItemForValue(getRoot(), newParentElement); + var newParentElement = createFor(newFile.getParent()); + var newParentItem = findItemForValue(getRoot(), newParentElement); if (newParentItem == null) { return; } - final TreeItem prevParentItem = prevItem.getParent(); - final ObservableList> prevParentChildren = prevParentItem.getChildren(); + var prevParentItem = prevItem.getParent(); + var prevParentChildren = prevParentItem.getChildren(); prevParentChildren.remove(prevItem); prevItem.setValue(createFor(newFile)); - final Array> children = UiUtils.getAllItems(prevItem); + var children = UiUtils.getAllItems(prevItem); children.fastRemove(prevItem); fillChildren(prevFile, newFile, children); - final ObservableList> newParentChildren = newParentItem.getChildren(); + var newParentChildren = newParentItem.getChildren(); newParentChildren.add(prevItem); FXCollections.sort(newParentChildren, ITEM_COMPARATOR); } @FxThread - private void fillChildren(@NotNull final Path prevFile, @NotNull final Path newFile, - @NotNull final Array> children) { - for (final TreeItem child : children) { - - final ResourceElement resourceElement = child.getValue(); - final Path file = resourceElement.getFile(); - final Path relativeFile = file.subpath(prevFile.getNameCount(), file.getNameCount()); - final Path resultFile = newFile.resolve(relativeFile); + private void fillChildren( + @NotNull Path prevFile, + @NotNull Path newFile, + @NotNull Array> children + ) { + for (var child : children) { + + var resourceElement = child.getValue(); + var file = resourceElement.getFile(); + var relativeFile = file.subpath(prevFile.getNameCount(), file.getNameCount()); + var resultFile = newFile.resolve(relativeFile); child.setValue(createFor(resultFile)); } @@ -861,17 +890,17 @@ private void fillChildren(@NotNull final Path prevFile, @NotNull final Path newF * @param newFile the new version. */ @FxThread - public void notifyRenamed(@NotNull final Path prevFile, @NotNull final Path newFile) { + public void notifyRenamed(@NotNull Path prevFile, @NotNull Path newFile) { - final ResourceElement prevElement = createFor(prevFile); - final TreeItem prevItem = findItemForValue(getRoot(), prevElement); + var prevElement = createFor(prevFile); + var prevItem = findItemForValue(getRoot(), prevElement); if (prevItem == null) { return; } prevItem.setValue(createFor(newFile)); - final Array> children = UiUtils.getAllItems(prevItem); + var children = UiUtils.getAllItems(prevItem); children.fastRemove(prevItem); fillChildren(prevFile, newFile, children); @@ -881,23 +910,26 @@ public void notifyRenamed(@NotNull final Path prevFile, @NotNull final Path newF * Handle hotkeys. */ @FxThread - private void processKey(@NotNull final KeyEvent event) { + private void processKey(@NotNull KeyEvent event) { + if (isReadOnly()) { return; } - final EditorConfig editorConfig = EditorConfig.getInstance(); - final Path currentAsset = editorConfig.getCurrentAsset(); + var editorConfig = EditorConfig.getInstance(); + var currentAsset = editorConfig.getCurrentAsset(); if (currentAsset == null) { return; } updateSelectedElements(); - final ConcurrentArray selectedElements = getSelectedElements(); - if (selectedElements.isEmpty()) return; + var selectedElements = getSelectedElements(); + if (selectedElements.isEmpty()) { + return; + } - final ResourceElement firstElement = selectedElements.first(); + var firstElement = selectedElements.first(); if (firstElement instanceof LoadingResourceElement) { return; } @@ -906,7 +938,8 @@ private void processKey(@NotNull final KeyEvent event) { boolean onlyFolders = true; boolean selectedAsset = false; - for (final ResourceElement element : selectedElements.array()) { + for (var element : selectedElements.array()) { + if (element == null) { break; } @@ -922,43 +955,41 @@ private void processKey(@NotNull final KeyEvent event) { } } - final Predicate> actionTester = getActionTester(); - final KeyCode keyCode = event.getCode(); - final boolean controlDown = event.isControlDown(); + var actionTester = getActionTester(); + var keyCode = event.getCode(); + var controlDown = event.isControlDown(); if (!currentAsset.equals(firstElement.getFile())) { - if (controlDown && keyCode == KeyCode.C && actionTester.test(CopyFileAction.class) && !selectedAsset && - (onlyFiles || selectedElements.size() == 1)) { - final CopyFileAction action = new CopyFileAction(selectedElements); - final EventHandler onAction = action.getOnAction(); - onAction.handle(null); + if (controlDown) { - } else if (controlDown && keyCode == KeyCode.X && actionTester.test(CutFileAction.class) && !selectedAsset && - (onlyFiles || selectedElements.size() == 1)) { + if (keyCode == KeyCode.C && actionTester.test(CopyFileAction.class) && + !selectedAsset && (onlyFiles || selectedElements.size() == 1)) { - final CutFileAction action = new CutFileAction(selectedElements); - final EventHandler onAction = action.getOnAction(); - onAction.handle(null); + CopyFileAction.applyFor(selectedElements); - } else if (keyCode == KeyCode.DELETE && actionTester.test(DeleteFileAction.class) && !selectedAsset && - (onlyFiles || selectedElements.size() == 1)) { + } else if (keyCode == KeyCode.X && actionTester.test(CutFileAction.class) && + !selectedAsset && (onlyFiles || selectedElements.size() == 1)) { - final DeleteFileAction action = new DeleteFileAction(selectedElements); - final EventHandler onAction = action.getOnAction(); - onAction.handle(null); + CutFileAction.applyFor(selectedElements); + } + + } else if (keyCode == KeyCode.DELETE && actionTester.test(DeleteFileAction.class) && + !selectedAsset && (onlyFiles || selectedElements.size() == 1)) { + + DeleteFileAction.applyFor(selectedElements); } } - if (controlDown && keyCode == KeyCode.V && hasFileInClipboard() && actionTester.test(PasteFileAction.class)) { - final PasteFileAction action = new PasteFileAction(firstElement); - final EventHandler onAction = action.getOnAction(); - onAction.handle(null); + if (controlDown && keyCode == KeyCode.V && hasFileInClipboard() && + actionTester.test(PasteFileAction.class)) { + + PasteFileAction.applyFor(firstElement); } } /** - * Gets open function. + * Get the open resource function. * * @return the open resource function. */ @@ -971,22 +1002,22 @@ private void processKey(@NotNull final KeyEvent event) { * Cleanup the tree. */ @FxThread - private void cleanup(@NotNull final TreeItem treeItem) { + private void cleanup(@NotNull TreeItem treeItem) { - final ResourceElement element = treeItem.getValue(); + var element = treeItem.getValue(); if (element instanceof FileResourceElement || element instanceof LoadingResourceElement) { return; } - final ObservableList> children = treeItem.getChildren(); + var children = treeItem.getChildren(); for (int i = children.size() - 1; i >= 0; i--) { cleanup(children.get(i)); } if (children.isEmpty() && treeItem.getParent() != null) { - final TreeItem parent = treeItem.getParent(); - final ObservableList> parentChildren = parent.getChildren(); + var parent = treeItem.getParent(); + var parentChildren = parent.getChildren(); parentChildren.remove(treeItem); } } @@ -998,9 +1029,9 @@ private void cleanup(@NotNull final TreeItem treeItem) { * @param needSelect the need select */ @FxThread - public void expandTo(@NotNull final TreeItem treeItem, final boolean needSelect) { + public void expandTo(@NotNull TreeItem treeItem, boolean needSelect) { - TreeItem parent = treeItem; + var parent = treeItem; while (parent != null) { parent.setExpanded(true); @@ -1018,26 +1049,30 @@ public void expandTo(@NotNull final TreeItem treeItem, final bo * @param file the file */ @FxThread - public void markExpand(@NotNull final Path file) { + public void markExpand(@NotNull Path file) { - final ResourceElement element = createFor(file); - final TreeItem treeItem = findItemForValue(getRoot(), element); - if (treeItem == null) return; + var element = createFor(file); + var treeItem = findItemForValue(getRoot(), element); + if (treeItem == null) { + return; + } treeItem.setExpanded(true); } /** - * Sets only folders. + * Set true if need to show only folders. * * @param onlyFolders true if need to show only folders. */ @FromAnyThread - public void setOnlyFolders(final boolean onlyFolders) { + public void setOnlyFolders(boolean onlyFolders) { this.onlyFolders = onlyFolders; } /** + * Return true if need to show only folders. + * * @return true if need to show only folders. */ @FromAnyThread @@ -1046,21 +1081,22 @@ public boolean isOnlyFolders() { } /** - * Expand tree to the file. + * Expand the file in the tree. * - * @param file the file - * @param needSelect the need select + * @param file the file. + * @param needSelect the need select. */ @FxThread - public void expandTo(@NotNull final Path file, final boolean needSelect) { + public void expandTo(@NotNull Path file, boolean needSelect) { if (isLazyMode()) { - final TreeItem targetItem = findItemForValue(getRoot(), file); + var targetItem = findItemForValue(getRoot(), file); if (targetItem == null) { TreeItem parentItem = null; - Path parent = file.getParent(); + + var parent = file.getParent(); while (parent != null) { parentItem = findItemForValue(getRoot(), parent); @@ -1075,23 +1111,25 @@ public void expandTo(@NotNull final Path file, final boolean needSelect) { parentItem = getRoot(); } - final TreeItem toLoad = parentItem; + var toLoad = parentItem; EXECUTOR_MANAGER.addBackgroundTask(() -> lazyLoadChildren(toLoad, item -> expandTo(file, needSelect))); return; } - final ObservableList> children = targetItem.getChildren(); + var children = targetItem.getChildren(); if (children.size() == 1 && children.get(0).getValue() == LoadingResourceElement.getInstance()) { EXECUTOR_MANAGER.addBackgroundTask(() -> lazyLoadChildren(targetItem, item -> expandTo(file, needSelect))); return; } } - final ResourceElement element = createFor(file); - final TreeItem treeItem = findItemForValue(getRoot(), element); - if (treeItem == null) return; + var element = createFor(file); + var treeItem = findItemForValue(getRoot(), element); + if (treeItem == null) { + return; + } - TreeItem parent = treeItem; + var parent = treeItem; while (parent != null) { parent.setExpanded(true); @@ -1104,9 +1142,9 @@ public void expandTo(@NotNull final Path file, final boolean needSelect) { } @FromAnyThread - private void scrollToAndSelect(@NotNull final TreeItem treeItem) { + private void scrollToAndSelect(@NotNull TreeItem treeItem) { EXECUTOR_MANAGER.addFxTask(() -> { - final MultipleSelectionModel> selectionModel = getSelectionModel(); + var selectionModel = getSelectionModel(); selectionModel.clearSelection(); selectionModel.select(treeItem); scrollTo(getRow(treeItem)); diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/CopyFileAction.java b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/CopyFileAction.java index 536b8a41..338f7294 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/CopyFileAction.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/CopyFileAction.java @@ -1,12 +1,12 @@ package com.ss.editor.ui.component.asset.tree.context.menu.action; +import static com.ss.rlib.util.array.ArrayCollectors.toArray; import com.ss.editor.Messages; import com.ss.editor.annotation.FxThread; import com.ss.editor.ui.Icons; import com.ss.editor.ui.component.asset.tree.resource.ResourceElement; import com.ss.editor.util.EditorUtil; import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; import javafx.event.ActionEvent; import javafx.scene.image.Image; import javafx.scene.input.Clipboard; @@ -23,36 +23,37 @@ */ public class CopyFileAction extends FileAction { - public CopyFileAction(@NotNull final Array elements) { + @FxThread + public static void applyFor(@NotNull Array elements) { + new CopyFileAction(elements).getOnAction().handle(null); + } + + public CopyFileAction(@NotNull Array elements) { super(elements); } - @FxThread @Override + @FxThread protected @NotNull String getName() { return Messages.ASSET_COMPONENT_RESOURCE_TREE_CONTEXT_MENU_COPY_FILE; } - @FxThread @Override + @FxThread protected @Nullable Image getIcon() { return Icons.COPY_16; } - @FxThread @Override - protected void execute(@Nullable final ActionEvent event) { + @FxThread + protected void execute(@Nullable ActionEvent event) { super.execute(event); - final Array elements = getElements(); - final Array files = ArrayFactory.newArray(Path.class, elements.size()); - elements.forEach(files, (resource, toStore) -> toStore.add(resource.getFile())); - - final ClipboardContent content = new ClipboardContent(); - - EditorUtil.addCopiedFile(files, content); + var files = getElements().stream() + .map(ResourceElement::getFile) + .collect(toArray(Path.class)); - final Clipboard clipboard = Clipboard.getSystemClipboard(); - clipboard.setContent(content); + var clipboard = Clipboard.getSystemClipboard(); + clipboard.setContent(EditorUtil.addCopiedFile(files, new ClipboardContent())); } } diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/CutFileAction.java b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/CutFileAction.java index ab7efb68..08c0fd4a 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/CutFileAction.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/CutFileAction.java @@ -14,9 +14,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.io.File; import java.nio.file.Path; -import java.util.List; /** * The action to cut a file. @@ -25,37 +23,42 @@ */ public class CutFileAction extends FileAction { - public CutFileAction(@NotNull final Array elements) { + @FxThread + public static void applyFor(@NotNull Array elements) { + new CutFileAction(elements).getOnAction().handle(null); + } + + public CutFileAction(@NotNull Array elements) { super(elements); } - @FxThread @Override + @FxThread protected @Nullable Image getIcon() { return Icons.CUT_16; } - @FxThread @Override + @FxThread protected @NotNull String getName() { return Messages.ASSET_COMPONENT_RESOURCE_TREE_CONTEXT_MENU_CUT_FILE; } - @FxThread @Override - protected void execute(@Nullable final ActionEvent event) { + @FxThread + protected void execute(@Nullable ActionEvent event) { super.execute(event); - final List files = getElements().stream() + var files = getElements().stream() .map(ResourceElement::getFile) .map(Path::toFile) .collect(toList()); - final ClipboardContent content = new ClipboardContent(); + var content = new ClipboardContent(); content.putFiles(files); content.put(EditorUtil.JAVA_PARAM, "cut"); - final Clipboard clipboard = Clipboard.getSystemClipboard(); + var clipboard = Clipboard.getSystemClipboard(); clipboard.setContent(content); } } diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/DeleteFileAction.java b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/DeleteFileAction.java index 63c09d26..7000ffc6 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/DeleteFileAction.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/DeleteFileAction.java @@ -24,50 +24,57 @@ */ public class DeleteFileAction extends FileAction { - public DeleteFileAction(@NotNull final Array elements) { + @FxThread + public static void applyFor(@NotNull Array elements) { + new DeleteFileAction(elements).getOnAction().handle(null); + } + + public DeleteFileAction(@NotNull Array elements) { super(elements); } - @FxThread @Override + @FxThread protected @NotNull String getName() { return Messages.ASSET_COMPONENT_RESOURCE_TREE_CONTEXT_MENU_DELETE_FILE; } - @FxThread @Override + @FxThread protected @Nullable Image getIcon() { return Icons.REMOVE_12; } - @FxThread @Override - protected void execute(@Nullable final ActionEvent event) { + @FxThread + protected void execute(@Nullable ActionEvent event) { super.execute(event); - final Array elements = getElements(); - final ResourceElement first = elements.first(); + var elements = getElements(); + var first = elements.first(); if(elements.size() == 1) { - final Path file = first.getFile(); + var file = first.getFile(); - final EditorConfig editorConfig = EditorConfig.getInstance(); - final Path currentAsset = editorConfig.getCurrentAsset(); - if (currentAsset == null || currentAsset.equals(file)) return; + var editorConfig = EditorConfig.getInstance(); + var currentAsset = editorConfig.getCurrentAsset(); + if (currentAsset == null || currentAsset.equals(file)) { + return; + } - String question = Messages.ASSET_COMPONENT_RESOURCE_TREE_CONTEXT_MENU_DELETE_FILE_QUESTION; + var question = Messages.ASSET_COMPONENT_RESOURCE_TREE_CONTEXT_MENU_DELETE_FILE_QUESTION; question = question.replace("%file_name%", file.getFileName().toString()); - final ConfirmDialog confirmDialog = new ConfirmDialog(result -> handle(file, result), question); + var confirmDialog = new ConfirmDialog(result -> handle(file, result), question); confirmDialog.show(); } else { - String question = Messages.ASSET_COMPONENT_RESOURCE_TREE_CONTEXT_MENU_DELETE_FILES_QUESTION; + var question = Messages.ASSET_COMPONENT_RESOURCE_TREE_CONTEXT_MENU_DELETE_FILES_QUESTION; question = question.replace("%file_count%", String.valueOf(elements.size())); - final ConfirmDialog confirmDialog = new ConfirmDialog(result -> handle(elements, result), question); + var confirmDialog = new ConfirmDialog(result -> handle(elements, result), question); confirmDialog.show(); } } @@ -75,13 +82,13 @@ protected void execute(@Nullable final ActionEvent event) { /** * Handle the answer. */ - private void handle(@NotNull final Path file, @Nullable final Boolean result) { + private void handle(@NotNull Path file, @Nullable Boolean result) { if (!Boolean.TRUE.equals(result)) return; deleteFile(file); } - private void deleteFile(@NotNull final Path file) { - final Array handlers = FileDeleteHandlerFactory.findFor(file); + private void deleteFile(@NotNull Path file) { + var handlers = FileDeleteHandlerFactory.findFor(file); handlers.forEach(file, FileDeleteHandler::preDelete); FileUtils.delete(file); handlers.forEach(file, FileDeleteHandler::postDelete); @@ -90,15 +97,17 @@ private void deleteFile(@NotNull final Path file) { /** * Handle the answer. */ - private void handle(@NotNull final Array elements, @Nullable final Boolean result) { + private void handle(@NotNull Array elements, @Nullable Boolean result) { if (!Boolean.TRUE.equals(result)) { return; } - final EditorConfig editorConfig = EditorConfig.getInstance(); - final Path currentAsset = editorConfig.getCurrentAsset(); - if (currentAsset == null) return; + var editorConfig = EditorConfig.getInstance(); + var currentAsset = editorConfig.getCurrentAsset(); + if (currentAsset == null) { + return; + } elements.stream().map(ResourceElement::getFile) .filter(path -> !currentAsset.equals(path)) diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/PasteFileAction.java b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/PasteFileAction.java index 72d316d1..71dac007 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/PasteFileAction.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/PasteFileAction.java @@ -31,35 +31,44 @@ */ public class PasteFileAction extends FileAction { - public PasteFileAction(@NotNull final ResourceElement element) { + @FxThread + public static void applyFor(@NotNull ResourceElement element) { + new PasteFileAction(element).getOnAction().handle(null); + } + + public PasteFileAction(@NotNull ResourceElement element) { super(element); } - @FxThread @Override + @FxThread protected @NotNull String getName() { return Messages.ASSET_COMPONENT_RESOURCE_TREE_CONTEXT_MENU_PASTE_FILE; } - @FxThread @Override + @FxThread protected @Nullable Image getIcon() { return Icons.PASTE_16; } - @FxThread @Override - protected void execute(@Nullable final ActionEvent event) { + @FxThread + protected void execute(@Nullable ActionEvent event) { super.execute(event); - final Clipboard clipboard = Clipboard.getSystemClipboard(); - if (clipboard == null) return; + var clipboard = Clipboard.getSystemClipboard(); + if (clipboard == null) { + return; + } - final List files = unsafeCast(clipboard.getContent(DataFormat.FILES)); - if (files == null || files.isEmpty()) return; + List files = unsafeCast(clipboard.getContent(DataFormat.FILES)); + if (files == null || files.isEmpty()) { + return; + } - final Path currentFile = getElement().getFile(); - final boolean isCut = "cut".equals(clipboard.getContent(EditorUtil.JAVA_PARAM)); + var currentFile = getElement().getFile(); + var isCut = "cut".equals(clipboard.getContent(EditorUtil.JAVA_PARAM)); if (isCut) { files.forEach(file -> moveFile(currentFile, file.toPath())); @@ -70,7 +79,7 @@ protected void execute(@Nullable final ActionEvent event) { clipboard.clear(); } - private void copyFile(@NotNull final Path currentFile, @NotNull final Path file) { + private void copyFile(@NotNull Path currentFile, @NotNull Path file) { if (Files.isDirectory(currentFile)) { processCopy(currentFile, file); } else { @@ -78,8 +87,7 @@ private void copyFile(@NotNull final Path currentFile, @NotNull final Path file) } } - private void moveFile(@NotNull final Path currentFile, @NotNull final Path file) { - + private void moveFile(@NotNull Path currentFile, @NotNull Path file) { if (Files.isDirectory(currentFile)) { processMove(currentFile, file); } else { @@ -90,9 +98,9 @@ private void moveFile(@NotNull final Path currentFile, @NotNull final Path file) /** * Process of moving. */ - private void processMove(@NotNull final Path targetFolder, @NotNull final Path file) { + private void processMove(@NotNull Path targetFolder, @NotNull Path file) { - final Path newFile = targetFolder.resolve(file.getFileName()); + var newFile = targetFolder.resolve(file.getFileName()); try { Files.move(file, newFile); @@ -101,7 +109,7 @@ private void processMove(@NotNull final Path targetFolder, @NotNull final Path f return; } - final MovedFileEvent event = new MovedFileEvent(); + var event = new MovedFileEvent(); event.setPrevFile(file); event.setNewFile(newFile); @@ -111,10 +119,10 @@ private void processMove(@NotNull final Path targetFolder, @NotNull final Path f /** * Process of copying. */ - private void processCopy(@NotNull final Path targetFolder, @NotNull final Path file) { + private void processCopy(@NotNull Path targetFolder, @NotNull Path file) { - final Array toCopy = ArrayFactory.newArray(Path.class); - final Array copied = ArrayFactory.newArray(Path.class); + Array toCopy = ArrayFactory.newArray(Path.class); + Array copied = ArrayFactory.newArray(Path.class); if (Files.isDirectory(file)) { toCopy.addAll(FileUtils.getFiles(file, true)); @@ -122,8 +130,8 @@ private void processCopy(@NotNull final Path targetFolder, @NotNull final Path f toCopy.slowRemove(file); } - final String freeName = FileUtils.getFirstFreeName(targetFolder, file); - final Path newFile = targetFolder.resolve(freeName); + var freeName = FileUtils.getFirstFreeName(targetFolder, file); + var newFile = targetFolder.resolve(freeName); try { processCopy(file, toCopy, copied, newFile); @@ -131,7 +139,7 @@ private void processCopy(@NotNull final Path targetFolder, @NotNull final Path f EditorUtil.handleException(LOGGER, this, e); } - final RequestSelectFileEvent event = new RequestSelectFileEvent(); + var event = new RequestSelectFileEvent(); event.setFile(newFile); FX_EVENT_MANAGER.notify(event); @@ -140,16 +148,20 @@ private void processCopy(@NotNull final Path targetFolder, @NotNull final Path f /** * Process of copying. */ - private void processCopy(@NotNull final Path file, @NotNull final Array toCopy, - @NotNull final Array copied, @NotNull final Path newFile) throws IOException { + private void processCopy( + @NotNull Path file, + @NotNull Array toCopy, + @NotNull Array copied, + @NotNull Path newFile + ) throws IOException { Files.copy(file, newFile); copied.add(newFile); toCopy.forEach(path -> { - final Path relativeFile = file.relativize(path); - final Path targetFile = newFile.resolve(relativeFile); + var relativeFile = file.relativize(path); + var targetFile = newFile.resolve(relativeFile); try { Files.copy(path, targetFile); @@ -157,10 +169,13 @@ private void processCopy(@NotNull final Path file, @NotNull final Array to throw new RuntimeException(e); } - boolean needAddToCopied = true; + var needAddToCopied = true; + + for (var copiedFile : copied) { - for (final Path copiedFile : copied) { - if (!Files.isDirectory(copiedFile)) continue; + if (!Files.isDirectory(copiedFile)) { + continue; + } if (targetFile.startsWith(copiedFile)) { needAddToCopied = false; @@ -168,7 +183,9 @@ private void processCopy(@NotNull final Path file, @NotNull final Array to } } - if (needAddToCopied) copied.add(targetFile); + if (needAddToCopied) { + copied.add(targetFile); + } }); } } diff --git a/src/main/java/com/ss/editor/ui/util/UiUtils.java b/src/main/java/com/ss/editor/ui/util/UiUtils.java index 6287a0ea..b51d828b 100644 --- a/src/main/java/com/ss/editor/ui/util/UiUtils.java +++ b/src/main/java/com/ss/editor/ui/util/UiUtils.java @@ -47,6 +47,7 @@ import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; +import java.util.stream.Stream; /** * The utility class with utility UI methods. @@ -442,12 +443,26 @@ public static boolean visitUntil(@NotNull final TreeItem item, * @return the list with all items. */ @FxThread - public static Array> getAllItems(@NotNull final TreeItem root) { + public static Array> getAllItems(@NotNull TreeItem root) { final Array> container = ArrayFactory.newArray(TreeItem.class); collectAllItems(container, root); return container; } + /** + * Collect all elements of tree items. + * + * @param the type parameter + * @param root the tree item. + * @return the list with all items. + */ + @FxThread + public static Stream> allItems(@NotNull TreeItem root) { + Array> container = ArrayFactory.newArray(TreeItem.class); + collectAllItems(container, root); + return container.stream(); + } + /** * Collect all elements of tree items. * diff --git a/src/main/java/com/ss/editor/util/EditorUtil.java b/src/main/java/com/ss/editor/util/EditorUtil.java index f2f3b709..905c4467 100644 --- a/src/main/java/com/ss/editor/util/EditorUtil.java +++ b/src/main/java/com/ss/editor/util/EditorUtil.java @@ -301,27 +301,30 @@ public static void requestFxFocus() { * @param content the content to store. */ @FxThread - public static void addCopiedFile(@NotNull final Array paths, @NotNull final ClipboardContent content) { + public static @NotNull ClipboardContent addCopiedFile( + @NotNull Array paths, + @NotNull ClipboardContent content + ) { - final List files = paths.stream() + final var files = paths.stream() .map(Path::toFile) .collect(toList()); content.putFiles(files); content.put(EditorUtil.JAVA_PARAM, "copy"); - final Platform platform = JmeSystem.getPlatform(); + var platform = JmeSystem.getPlatform(); if (platform == Platform.Linux64 || platform == Platform.Linux32) { - final StringBuilder builder = new StringBuilder("copy\n"); + var builder = new StringBuilder("copy\n"); paths.forEach(builder, (path, b) -> b.append(path.toUri().toASCIIString()).append('\n')); builder.delete(builder.length() - 1, builder.length()); - final ByteBuffer buffer = ByteBuffer.allocate(builder.length()); + var buffer = ByteBuffer.allocate(builder.length()); for (int i = 0, length = builder.length(); i < length; i++) { buffer.put((byte) builder.charAt(i)); @@ -331,6 +334,8 @@ public static void addCopiedFile(@NotNull final Array paths, @NotNull fina content.put(GNOME_FILES, buffer); } + + return content; } /** From a96e328d4441a5abff3cab3b5eef14df93532caf Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Thu, 5 Apr 2018 10:05:04 +0300 Subject: [PATCH 23/49] refactoring. --- .../ui/component/asset/tree/ResourceTree.java | 82 ++++++++++++------- .../tree/resource/FolderResourceElement.java | 56 ++++++++----- .../ss/editor/util/svg/SvgImageLoader.java | 58 ++++++------- 3 files changed, 117 insertions(+), 79 deletions(-) diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java b/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java index fd8c12c3..40b03212 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java @@ -20,7 +20,10 @@ import com.ss.rlib.util.array.ArrayFactory; import com.ss.rlib.util.array.ConcurrentArray; import javafx.collections.FXCollections; -import javafx.scene.control.*; +import javafx.scene.control.ContextMenu; +import javafx.scene.control.SelectionMode; +import javafx.scene.control.TreeItem; +import javafx.scene.control.TreeView; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import org.jetbrains.annotations.NotNull; @@ -64,17 +67,15 @@ public class ResourceTree extends TreeView { return firstLevel - secondLevel; } - var firstFile = notNull(first).getFile(); - var firstFileFileName = firstFile.getFileName(); - var firstName = firstFileFileName == null ? firstFile.toString() : firstFileFileName.toString(); - - var secondFile = notNull(second).getFile(); - var secondFileName = secondFile.getFileName(); - var secondName = secondFileName == null ? secondFile.toString() : secondFileName.toString(); - - return StringUtils.compareIgnoreCase(firstName, secondName); + return StringUtils.compareIgnoreCase(getNameToSort(first), getNameToSort(second)); }; + private static @NotNull String getNameToSort(@NotNull ResourceElement element) { + var file = notNull(element).getFile(); + var fileName = file.getFileName(); + return fileName == null ? file.toString() : fileName.toString(); + } + /** * The tree items comparator. */ @@ -148,6 +149,12 @@ private static int getLevel(@Nullable ResourceElement element) { @Nullable private IntObjectConsumer expandHandler; + /** + * Barrier. + */ + private volatile int barrier; + private int barrierSinck; + /** * The flag of read only mode. */ @@ -168,11 +175,11 @@ private static int getLevel(@Nullable ResourceElement element) { */ private boolean needCleanup; - public ResourceTree(final boolean readOnly) { + public ResourceTree(boolean readOnly) { this(DEFAULT_OPEN_FUNCTION, readOnly); } - public ResourceTree(@Nullable final Consumer openFunction, final boolean readOnly) { + public ResourceTree(@Nullable Consumer openFunction, boolean readOnly) { this.openFunction = openFunction; this.readOnly = readOnly; this.expandedElements = ArrayFactory.newConcurrentAtomicARSWLockArray(ResourceElement.class); @@ -192,6 +199,22 @@ public ResourceTree(@Nullable final Consumer openFunction, fina setFocusTraversable(true); } + /** + * Read barrier. + */ + @FromAnyThread + protected void readBarrier() { + barrierSinck = barrier + 1; + } + + /** + * Write barrier. + */ + @FromAnyThread + protected void writeBarrier() { + barrier = barrierSinck + 1; + } + /** * Set true if need to use lazy mode. * @@ -253,7 +276,8 @@ private void lazyLoadChildren() { Array> expanded = ArrayFactory.newArray(TreeItem.class); - UiUtils.allItems(getRoot()).filter(TreeItem::isExpanded) + UiUtils.allItems(getRoot()) + .filter(TreeItem::isExpanded) .filter(treeItem -> !treeItem.isLeaf()) .filter(item -> item.getChildren().size() == 1) .filter(item -> item.getChildren().get(0).getValue() == LoadingResourceElement.getInstance()) @@ -467,19 +491,7 @@ private boolean isReadOnly() { */ @FxThread public void fill(@NotNull Path rootFolder) { - - var onLoadHandler = getOnLoadHandler(); - if (onLoadHandler != null) { - onLoadHandler.accept(Boolean.FALSE); - } - - var currentRoot = getRoot(); - if (currentRoot != null) { - setRoot(null); - } - - showLoading(); - + prepareToFill(); EXECUTOR_MANAGER.addBackgroundTask(() -> startBackgroundFill(rootFolder)); } @@ -490,6 +502,14 @@ public void fill(@NotNull Path rootFolder) { */ @FxThread public void fill(@NotNull Array rootFolders) { + prepareToFill(); + EXECUTOR_MANAGER.addBackgroundTask(() -> startBackgroundFill(rootFolders)); + } + + /** + * Prepare this component to fill again. + */ + protected void prepareToFill() { var onLoadHandler = getOnLoadHandler(); if (onLoadHandler != null) { @@ -502,8 +522,6 @@ public void fill(@NotNull Array rootFolders) { } showLoading(); - - EXECUTOR_MANAGER.addBackgroundTask(() -> startBackgroundFill(rootFolders)); } /** @@ -610,6 +628,7 @@ private void showLoading() { @BackgroundThread private void startBackgroundFill(@NotNull Path path) { + var nextBarrier = barrier + 1; var rootElement = createFor(path); var newRoot = new TreeItem(rootElement); newRoot.setExpanded(true); @@ -620,6 +639,8 @@ private void startBackgroundFill(@NotNull Path path) { cleanup(newRoot); } + barrier = nextBarrier; + EXECUTOR_MANAGER.addFxTask(() -> applyNewRoot(newRoot)); } @@ -631,12 +652,16 @@ private void startBackgroundFill(@NotNull Path path) { @BackgroundThread private void applyNewRoot(@NotNull TreeItem newRoot) { + var nextBarrier = barrier + 1; + setRoot(newRoot); var onLoadHandler = getOnLoadHandler(); if (onLoadHandler != null) { onLoadHandler.accept(Boolean.TRUE); } + + barrier = nextBarrier; } /** @@ -872,6 +897,7 @@ private void fillChildren( @NotNull Path newFile, @NotNull Array> children ) { + for (var child : children) { var resourceElement = child.getValue(); diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/resource/FolderResourceElement.java b/src/main/java/com/ss/editor/ui/component/asset/tree/resource/FolderResourceElement.java index 3af9022f..44371a45 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/resource/FolderResourceElement.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/resource/FolderResourceElement.java @@ -10,7 +10,6 @@ import java.io.IOException; import java.nio.file.AccessDeniedException; -import java.nio.file.DirectoryStream; import java.nio.file.Files; import java.nio.file.Path; @@ -21,39 +20,47 @@ */ public class FolderResourceElement extends ResourceElement { - public FolderResourceElement(@NotNull final Path file) { + public FolderResourceElement(@NotNull Path file) { super(file); } @Override @FromAnyThread - public @Nullable Array getChildren(@NotNull final Array extensionFilter, final boolean onlyFolders) { - if (!Files.isDirectory(file)) return null; + public @Nullable Array getChildren( + @NotNull Array extensionFilter, + boolean onlyFolders + ) { + + if (!Files.isDirectory(file)) { + return null; + } final Array elements = ArrayFactory.newArray(ResourceElement.class); - try (final DirectoryStream stream = Files.newDirectoryStream(file)) { - stream.forEach(child -> { + try (var stream = Files.newDirectoryStream(file)) { + for (Path child : stream) { - final String fileName = child.getFileName().toString(); + var fileName = child.getFileName().toString(); if (fileName.startsWith(".")) { - return; + continue; } else if (Files.isDirectory(child)) { elements.add(createFor(child)); - return; + continue; } - if (onlyFolders) return; + if (onlyFolders) { + continue; + } - final String extension = FileUtils.getExtension(child); + var extension = FileUtils.getExtension(child); if (extensionFilter.isEmpty() || extensionFilter.contains(extension)) { elements.add(createFor(child)); } - }); + } - } catch (final IOException e) { + } catch (IOException e) { LOGGER.warning(this, e); } @@ -62,13 +69,16 @@ public FolderResourceElement(@NotNull final Path file) { @Override @FromAnyThread - public boolean hasChildren(@NotNull final Array extensionFilter, final boolean onlyFolders) { - if (!Files.isDirectory(file)) return false; + public boolean hasChildren(@NotNull Array extensionFilter, boolean onlyFolders) { + + if (!Files.isDirectory(file)) { + return false; + } - try (final DirectoryStream stream = Files.newDirectoryStream(file)) { - for (final Path path : stream) { + try (var stream = Files.newDirectoryStream(file)) { + for (var path : stream) { - final String fileName = path.getFileName().toString(); + var fileName = path.getFileName().toString(); if (fileName.startsWith(".")) { continue; @@ -76,18 +86,20 @@ public boolean hasChildren(@NotNull final Array extensionFilter, final b return true; } - if (onlyFolders) continue; + if (onlyFolders) { + continue; + } - final String extension = FileUtils.getExtension(path); + var extension = FileUtils.getExtension(path); if (extensionFilter.isEmpty() || extensionFilter.contains(extension)) { return true; } } - } catch (final AccessDeniedException e) { + } catch (AccessDeniedException e) { return false; - } catch (final IOException e) { + } catch (IOException e) { LOGGER.warning(this, e); } diff --git a/src/main/java/com/ss/editor/util/svg/SvgImageLoader.java b/src/main/java/com/ss/editor/util/svg/SvgImageLoader.java index e0a3084e..b77e14e7 100644 --- a/src/main/java/com/ss/editor/util/svg/SvgImageLoader.java +++ b/src/main/java/com/ss/editor/util/svg/SvgImageLoader.java @@ -4,7 +4,7 @@ import static org.apache.batik.transcoder.SVGAbstractTranscoder.KEY_WIDTH; import com.ss.editor.annotation.FxThread; import com.sun.javafx.iio.ImageFrame; -import com.sun.javafx.iio.ImageStorage; +import com.sun.javafx.iio.ImageStorage.ImageType; import de.codecentric.centerdevice.javafxsvg.BufferedImageTranscoder; import de.codecentric.centerdevice.javafxsvg.FixedPixelDensityImageFrame; import de.codecentric.centerdevice.javafxsvg.ScreenHelper; @@ -13,6 +13,7 @@ import org.apache.batik.transcoder.TranscoderException; import org.apache.batik.transcoder.TranscoderInput; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.awt.image.BufferedImage; import java.io.IOException; @@ -25,7 +26,7 @@ public class SvgImageLoader extends de.codecentric.centerdevice.javafxsvg.SvgImageLoader { @NotNull - public static ThreadLocal OVERRIDE_COLOR = new ThreadLocal<>(); + public static final ThreadLocal OVERRIDE_COLOR = new ThreadLocal<>(); private static final int DEFAULT_SIZE = 400; private static final int BYTES_PER_PIXEL = 4; // RGBA @@ -35,7 +36,7 @@ public class SvgImageLoader extends de.codecentric.centerdevice.javafxsvg.SvgIma @NotNull private final InputStream input; - protected SvgImageLoader(@NotNull final InputStream input) { + protected SvgImageLoader(@NotNull InputStream input) { super(input); this.input = input; } @@ -53,15 +54,15 @@ public float getPixelScale() { @Override @FxThread - public @NotNull ImageFrame load(int imageIndex, int width, int height, boolean preserveAspectRatio, boolean smooth) + public @Nullable ImageFrame load(int imageIndex, int width, int height, boolean preserveAspectRatio, boolean smooth) throws IOException { if (0 != imageIndex) { return null; } - int imageWidth = width > 0 ? width : DEFAULT_SIZE; - int imageHeight = height > 0 ? height : DEFAULT_SIZE; + var imageWidth = width > 0 ? width : DEFAULT_SIZE; + var imageHeight = height > 0 ? height : DEFAULT_SIZE; try { return createImageFrame(imageWidth, imageHeight, getPixelScale()); @@ -74,11 +75,10 @@ public float getPixelScale() { @FxThread public float calculateMaxRenderScale() { - float maxRenderScale = 0; + var maxRenderScale = 0F; + var accessor = ScreenHelper.getScreenAccessor(); - ScreenHelper.ScreenAccessor accessor = ScreenHelper.getScreenAccessor(); - - for (final Screen screen : Screen.getScreens()) { + for (var screen : Screen.getScreens()) { maxRenderScale = Math.max(maxRenderScale, accessor.getRenderScale(screen)); } @@ -86,19 +86,19 @@ public float calculateMaxRenderScale() { } @FxThread - private @NotNull ImageFrame createImageFrame(final int width, final int height, final float pixelScale) + private @NotNull ImageFrame createImageFrame(int width, int height, float pixelScale) throws TranscoderException { - final BufferedImage bufferedImage = getTranscodedImage(width * pixelScale, height * pixelScale); - final ByteBuffer imageData = getImageData(bufferedImage); + var bufferedImage = getTranscodedImage(width * pixelScale, height * pixelScale); + var imageData = getImageData(bufferedImage); - return new FixedPixelDensityImageFrame(ImageStorage.ImageType.RGBA, imageData, bufferedImage.getWidth(), + return new FixedPixelDensityImageFrame(ImageType.RGBA, imageData, bufferedImage.getWidth(), bufferedImage.getHeight(), getStride(bufferedImage), null, pixelScale, null); } @FxThread - private @NotNull BufferedImage getTranscodedImage(final float width, final float height) throws TranscoderException { - final BufferedImageTranscoder trans = new BufferedImageTranscoder(BufferedImage.TYPE_INT_ARGB); + private @NotNull BufferedImage getTranscodedImage(float width, float height) throws TranscoderException { + var trans = new BufferedImageTranscoder(BufferedImage.TYPE_INT_ARGB); trans.addTranscodingHint(KEY_WIDTH, width); trans.addTranscodingHint(KEY_HEIGHT, height); trans.transcode(new TranscoderInput(this.input), null); @@ -106,7 +106,7 @@ public float calculateMaxRenderScale() { } @FxThread - private int getStride(@NotNull final BufferedImage bufferedImage) { + private int getStride(@NotNull BufferedImage bufferedImage) { return bufferedImage.getWidth() * BYTES_PER_PIXEL; } @@ -117,11 +117,11 @@ private int getStride(@NotNull final BufferedImage bufferedImage) { * @return the bytes pixels. */ @FxThread - private @NotNull ByteBuffer getImageData(@NotNull final BufferedImage bufferedImage) { + private @NotNull ByteBuffer getImageData(@NotNull BufferedImage bufferedImage) { - final int[] argbData = bufferedImage.getRGB(0, 0, bufferedImage.getWidth(), + var argbData = bufferedImage.getRGB(0, 0, bufferedImage.getWidth(), bufferedImage.getHeight(), null, 0, bufferedImage.getWidth()); - final byte[] imageData = new byte[getStride(bufferedImage) * bufferedImage.getHeight()]; + var imageData = new byte[getStride(bufferedImage) * bufferedImage.getHeight()]; copyColorToBytes(argbData, imageData); @@ -135,22 +135,21 @@ private int getStride(@NotNull final BufferedImage bufferedImage) { * @param imageData the bytes pixels data. */ @FxThread - private void copyColorToBytes(final int[] argbData, final byte[] imageData) { + private void copyColorToBytes(int[] argbData, byte[] imageData) { if (argbData.length * BYTES_PER_PIXEL != imageData.length) { throw new ArrayIndexOutOfBoundsException(); } - final Color overrideColor = OVERRIDE_COLOR.get(); + var overrideColor = OVERRIDE_COLOR.get(); for (int i = 0; i < argbData.length; i++) { - final int argb = argbData[i]; - - int alpha = argb >>> 24; - int red = (argb >> 16) & 0xff; - int green = (argb >> 8) & 0xff; - int blue = (argb) & 0xff; + var argb = argbData[i]; + var alpha = argb >>> 24; + var red = (argb >> 16) & 0xff; + var green = (argb >> 8) & 0xff; + var blue = (argb) & 0xff; if (overrideColor != null) { red = (int) (overrideColor.getRed() * 255); @@ -158,7 +157,8 @@ private void copyColorToBytes(final int[] argbData, final byte[] imageData) { blue = (int) (overrideColor.getBlue() * 255); } - int dataOffset = BYTES_PER_PIXEL * i; + var dataOffset = BYTES_PER_PIXEL * i; + imageData[dataOffset] = (byte) red; imageData[dataOffset + 1] = (byte) green; imageData[dataOffset + 2] = (byte) blue; From b0184e63bd06ae82b6c7ec62d1dc13d3f9fc8b02 Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Fri, 6 Apr 2018 09:19:38 +0300 Subject: [PATCH 24/49] fixed fx task executor. --- build.gradle | 4 +- .../executor/impl/FxEditorTaskExecutor.java | 18 ++++---- .../ss/editor/manager/ExecutorManager.java | 42 +++++++++---------- .../ui/component/asset/tree/ResourceTree.java | 41 +++++------------- 4 files changed, 43 insertions(+), 62 deletions(-) diff --git a/build.gradle b/build.gradle index 57d7f327..7fe9d631 100644 --- a/build.gradle +++ b/build.gradle @@ -61,7 +61,7 @@ ext.jme3_xbuf_version = '0.9.1' ext.junitPlatformVersion = "1.0.0" ext.junitJupiterVersion = "5.0.0" ext.log4jVersion = '2.6.2' -ext.bintrayVersion = version + '-3' +ext.bintrayVersion = version + '-4' junitPlatform { filters { @@ -128,7 +128,7 @@ dependencies { compile 'org.fxmisc.richtext:richtextfx:0.8.2' compile 'org.controlsfx:controlsfx:9.0.0' compile 'com.spaceshift:rlib.fx:4.2.1-Final' - compile 'com.spaceshift:rlib:6.8.3-Final' + compile 'com.spaceshift:rlib:6.8.5-Final' compile ('com.jme3x:jme-jfx:1.7.5-Final') { exclude group: 'org.jmonkeyengine' } diff --git a/src/main/java/com/ss/editor/executor/impl/FxEditorTaskExecutor.java b/src/main/java/com/ss/editor/executor/impl/FxEditorTaskExecutor.java index 1f002298..7dfbad4c 100644 --- a/src/main/java/com/ss/editor/executor/impl/FxEditorTaskExecutor.java +++ b/src/main/java/com/ss/editor/executor/impl/FxEditorTaskExecutor.java @@ -28,38 +28,38 @@ public FxEditorTaskExecutor() { setPriority(NORM_PRIORITY); try { Platform.startup(this::start); - } catch (final IllegalStateException e) { + } catch (IllegalStateException e) { start(); } } @Override @FxThread - protected void doExecute(@NotNull final Array execute, @NotNull final Array executed) { + protected void doExecute(@NotNull Array execute, @NotNull Array executed) { - final Runnable[] array = execute.array(); + var array = execute.array(); for (int i = 0, length = execute.size(); i < length; ) { try { for (int count = 0; count < EXECUTE_LIMIT && i < length; count++, i++) { - final Runnable task = array[i]; + var task = array[i]; try { task.run(); - } catch (final Exception e) { + } catch (Exception e) { EditorUtil.handleException(LOGGER, this, e); } executed.add(task); } - } catch (final Exception e) { + } catch (Exception e) { LOGGER.warning(e); } } - ConcurrentUtils.notifyAll(this); + ConcurrentUtils.notifyAll(fxTask); } @Override @@ -111,9 +111,9 @@ public void run() { @FromAnyThread private void executeInFxUiThread() { - synchronized (this) { + synchronized (fxTask) { Platform.runLater(fxTask); - ConcurrentUtils.waitInSynchronize(this); + ConcurrentUtils.waitInSynchronize(fxTask); } } } diff --git a/src/main/java/com/ss/editor/manager/ExecutorManager.java b/src/main/java/com/ss/editor/manager/ExecutorManager.java index 5baa7848..060cd332 100644 --- a/src/main/java/com/ss/editor/manager/ExecutorManager.java +++ b/src/main/java/com/ss/editor/manager/ExecutorManager.java @@ -33,13 +33,7 @@ public class ExecutorManager { @Nullable private static ExecutorManager instance; - /** - * Gets instance. - * - * @return the instance - */ - @NotNull - public static ExecutorManager getInstance() { + public static @NotNull ExecutorManager getInstance() { if (instance == null) instance = new ExecutorManager(); return instance; } @@ -99,10 +93,10 @@ private ExecutorManager() { @FromAnyThread public void addBackgroundTask(@NotNull final Runnable task) { - final EditorTaskExecutor[] executors = getBackgroundTaskExecutors(); - final AtomicInteger nextTaskExecutor = getNextBackgroundTaskExecutor(); + var executors = getBackgroundTaskExecutors(); + var nextTaskExecutor = getNextBackgroundTaskExecutor(); - final int index = nextTaskExecutor.incrementAndGet(); + var index = nextTaskExecutor.incrementAndGet(); if (index < executors.length) { executors[index].execute(task); @@ -113,14 +107,13 @@ public void addBackgroundTask(@NotNull final Runnable task) { } /** - * Add a new javaFX task. + * Add the new task to be executed in the JavaFX thread. * - * @param task the javaFX task. + * @param task the task. */ @FromAnyThread - public void addFxTask(@NotNull final Runnable task) { - final EditorTaskExecutor executor = getFxTaskExecutor(); - executor.execute(task); + public void addFxTask(@NotNull Runnable task) { + getFxTaskExecutor().execute(task); } /** @@ -129,12 +122,13 @@ public void addFxTask(@NotNull final Runnable task) { * @param task the editor task. */ @FromAnyThread - public void addJmeTask(@NotNull final Runnable task) { - final JmeThreadExecutor executor = getJmeTasksExecutor(); - executor.addToExecute(task); + public void addJmeTask(@NotNull Runnable task) { + getJmeTasksExecutor().addToExecute(task); } /** + * Get the list of background tasks executors. + * * @return the list of background tasks executors. */ @FromAnyThread @@ -143,6 +137,8 @@ public void addJmeTask(@NotNull final Runnable task) { } /** + * Get the executor of javaFX tasks. + * * @return the executor of javaFX tasks. */ @FromAnyThread @@ -151,6 +147,8 @@ public void addJmeTask(@NotNull final Runnable task) { } /** + * Get the index of a next background executor. + * * @return the index of a next background executor. */ @FromAnyThread @@ -159,7 +157,9 @@ public void addJmeTask(@NotNull final Runnable task) { } /** - * @return the executor of editor tasks. + * Get the executor of jME tasks. + * + * @return the executor of jME tasks. */ @FromAnyThread private @NotNull JmeThreadExecutor getJmeTasksExecutor() { @@ -173,7 +173,7 @@ public void addJmeTask(@NotNull final Runnable task) { * @param timeout the timeout. */ @FromAnyThread - public void schedule(@NotNull final Runnable runnable, final long timeout) { + public void schedule(@NotNull Runnable runnable, long timeout) { scheduledExecutorService.schedule(runnable, timeout, TimeUnit.MILLISECONDS); } @@ -184,7 +184,7 @@ public void schedule(@NotNull final Runnable runnable, final long timeout) { * @param delay the delay. */ @FromAnyThread - public void scheduleAtFixedRate(@NotNull final Runnable runnable, final long delay) { + public void scheduleAtFixedRate(@NotNull Runnable runnable, long delay) { scheduledExecutorService.scheduleAtFixedRate(runnable, delay, delay, TimeUnit.MILLISECONDS); } } diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java b/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java index 40b03212..a06f1a7f 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java @@ -13,6 +13,8 @@ import com.ss.editor.ui.component.asset.tree.context.menu.action.*; import com.ss.editor.ui.component.asset.tree.resource.*; import com.ss.editor.ui.util.UiUtils; +import com.ss.rlib.concurrent.barrier.Barrier; +import com.ss.rlib.concurrent.barrier.BarrierFactory; import com.ss.rlib.function.IntObjectConsumer; import com.ss.rlib.util.StringUtils; import com.ss.rlib.util.array.Array; @@ -125,6 +127,12 @@ private static int getLevel(@Nullable ResourceElement element) { @Nullable private final Consumer openFunction; + /** + * The memory barrier. + */ + @NotNull + private final Barrier barrier; + /** * The action tester. */ @@ -149,12 +157,6 @@ private static int getLevel(@Nullable ResourceElement element) { @Nullable private IntObjectConsumer expandHandler; - /** - * Barrier. - */ - private volatile int barrier; - private int barrierSinck; - /** * The flag of read only mode. */ @@ -186,6 +188,7 @@ public ResourceTree(@Nullable Consumer openFunction, boolean re this.selectedElements = ArrayFactory.newConcurrentAtomicARSWLockArray(ResourceElement.class); this.extensionFilter = ArrayFactory.newArray(String.class, 0); this.actionTester = actionClass -> true; + this.barrier = BarrierFactory.newVolatileBased(); expandedItemCountProperty() .addListener((observable, oldValue, newValue) -> processChangedExpands(newValue)); @@ -199,22 +202,6 @@ public ResourceTree(@Nullable Consumer openFunction, boolean re setFocusTraversable(true); } - /** - * Read barrier. - */ - @FromAnyThread - protected void readBarrier() { - barrierSinck = barrier + 1; - } - - /** - * Write barrier. - */ - @FromAnyThread - protected void writeBarrier() { - barrier = barrierSinck + 1; - } - /** * Set true if need to use lazy mode. * @@ -509,6 +496,7 @@ public void fill(@NotNull Array rootFolders) { /** * Prepare this component to fill again. */ + @FxThread protected void prepareToFill() { var onLoadHandler = getOnLoadHandler(); @@ -628,7 +616,6 @@ private void showLoading() { @BackgroundThread private void startBackgroundFill(@NotNull Path path) { - var nextBarrier = barrier + 1; var rootElement = createFor(path); var newRoot = new TreeItem(rootElement); newRoot.setExpanded(true); @@ -639,8 +626,6 @@ private void startBackgroundFill(@NotNull Path path) { cleanup(newRoot); } - barrier = nextBarrier; - EXECUTOR_MANAGER.addFxTask(() -> applyNewRoot(newRoot)); } @@ -649,19 +634,15 @@ private void startBackgroundFill(@NotNull Path path) { * * @param newRoot the new root, */ - @BackgroundThread + @FxThread private void applyNewRoot(@NotNull TreeItem newRoot) { - var nextBarrier = barrier + 1; - setRoot(newRoot); var onLoadHandler = getOnLoadHandler(); if (onLoadHandler != null) { onLoadHandler.accept(Boolean.TRUE); } - - barrier = nextBarrier; } /** From af11a7c98335b6364238f58c0195cf35227e6ca9 Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Wed, 11 Apr 2018 10:05:03 +0300 Subject: [PATCH 25/49] refactoring. --- build.gradle | 5 +- .../java/com/ss/editor/JfxApplication.java | 121 ++++++++---------- .../java/com/ss/editor/JmeApplication.java | 76 ++++++----- .../asset/tree/ResourceTreeCell.java | 72 ++++++----- .../asset/tree/resource/ResourceElement.java | 34 ++--- .../ui/control/property/PropertyControl.java | 84 ++++++------ .../ui/control/property/PropertyEditor.java | 98 +++++++------- .../property/builder/PropertyBuilder.java | 14 +- .../builder/impl/SpatialPropertyBuilder.java | 70 +++++----- .../property/impl/MinMaxPropertyControl.java | 15 ++- .../property/impl/StringPropertyControl.java | 32 +++-- .../impl/Vector2FPropertyControl.java | 73 ++++++----- .../impl/Vector3FPropertyControl.java | 62 +++++---- .../java/com/ss/editor/ui/util/UiUtils.java | 23 +--- src/main/resources/ui/css/custom_classes.css | 2 +- 15 files changed, 398 insertions(+), 383 deletions(-) diff --git a/build.gradle b/build.gradle index 7fe9d631..dd2b42f1 100644 --- a/build.gradle +++ b/build.gradle @@ -82,6 +82,9 @@ repositories { maven { url "https://dl.bintray.com/javasabr/maven" } + maven { + url 'https://oss.sonatype.org/content/repositories/snapshots/' + } } publishing { @@ -125,7 +128,7 @@ javadoc { dependencies { // base - compile 'org.fxmisc.richtext:richtextfx:0.8.2' + compile group: 'org.fxmisc.richtext', name: 'richtextfx', version: '1.0.0-SNAPSHOT' compile 'org.controlsfx:controlsfx:9.0.0' compile 'com.spaceshift:rlib.fx:4.2.1-Final' compile 'com.spaceshift:rlib:6.8.5-Final' diff --git a/src/main/java/com/ss/editor/JfxApplication.java b/src/main/java/com/ss/editor/JfxApplication.java index bd2d0fe9..86235e8c 100644 --- a/src/main/java/com/ss/editor/JfxApplication.java +++ b/src/main/java/com/ss/editor/JfxApplication.java @@ -9,8 +9,6 @@ import static com.ss.rlib.util.Utils.run; import static java.nio.file.Files.createDirectories; import static java.nio.file.Files.newOutputStream; -import com.jme3.renderer.Renderer; -import com.jme3.system.JmeContext; import com.jme3.util.LWJGLBufferAllocator; import com.jme3x.jfx.injfx.JmeToJFXApplication; import com.jme3x.jfx.injfx.processor.FrameTransferSceneProcessor; @@ -47,13 +45,13 @@ import com.ss.rlib.logging.impl.FolderFileListener; import com.ss.rlib.manager.InitializeManager; import com.ss.rlib.util.ArrayUtils; +import com.ss.rlib.util.Utils; import com.ss.rlib.util.array.Array; import com.ss.rlib.util.array.ArrayFactory; import com.ss.rlib.util.array.ConcurrentArray; import javafx.application.Application; import javafx.application.Platform; import javafx.beans.value.ChangeListener; -import javafx.collections.ObservableList; import javafx.scene.control.ComboBoxBase; import javafx.scene.image.Image; import javafx.stage.Stage; @@ -67,9 +65,9 @@ import java.io.IOException; import java.io.PrintStream; import java.nio.file.Files; -import java.nio.file.Path; import java.nio.file.Paths; import java.util.Collection; +import java.util.concurrent.CountDownLatch; import java.util.logging.Level; /** @@ -97,12 +95,9 @@ public class JfxApplication extends Application { } /** - * Main. - * - * @param args the args - * @throws IOException the io exception + * The start application method. */ - public static void main(final String[] args) { + public static void main(@NotNull String[] args) { configureLogger(); // need to disable to work on macos @@ -113,10 +108,9 @@ public static void main(final String[] args) { // JavaFX System.setProperty("prism.lcdtext", "false"); System.setProperty("prism.text", "t2k"); - System.setProperty("javafx.animation.fullspeed", "false"); - final EditorConfig editorConfig = EditorConfig.getInstance(); - final OpenGLVersion openGLVersion = editorConfig.getEnum(PREF_OPEN_GL, PREF_DEFAULT_OPEN_GL); + var editorConfig = EditorConfig.getInstance(); + var openGLVersion = editorConfig.getEnum(PREF_OPEN_GL, PREF_DEFAULT_OPEN_GL); // set a render if it isn't override if(System.getProperty("jfx.background.render") == null) { @@ -125,20 +119,6 @@ public static void main(final String[] args) { System.setProperty(LWJGLBufferAllocator.PROPERTY_CONCURRENT_BUFFER_ALLOCATOR, "true"); - // some settings for the render of JavaFX - System.setProperty("prism.printrendergraph", "false"); - System.setProperty("javafx.pulseLogger", "false"); - - //System.setProperty("prism.cacheshapes", "true"); - //System.setProperty("prism.scrollcacheopt", "true"); - //System.setProperty("prism.allowhidpi", "true"); - - //System.setProperty("prism.order", "sw"); - //System.setProperty("prism.showdirty", "true"); - //System.setProperty("prism.showoverdraw", "true"); - //System.setProperty("prism.debug", "true"); - //System.setProperty("prism.verbose", "true"); - CommandLineConfig.args(args); JmeToJFXApplication application; @@ -167,8 +147,10 @@ public static void main(final String[] args) { private static void configureLogger() { // disable the standard logger - if (Config.DEV_DEBUG) { + if (!Config.DEV_DEBUG) { java.util.logging.Logger.getLogger("").setLevel(Level.WARNING); + } else { + java.util.logging.Logger.getLogger("").setLevel(Level.ALL); } // configure our logger @@ -177,7 +159,7 @@ private static void configureLogger() { LoggerLevel.ERROR.setEnabled(true); LoggerLevel.WARNING.setEnabled(true); - final Path logFolder = Config.getFolderForLog(); + var logFolder = Config.getFolderForLog(); if (!Files.exists(logFolder)) { run(() -> createDirectories(logFolder)); @@ -194,18 +176,18 @@ private static void configureLogger() { * @param application the new jME application. */ @JmeThread - private static void startJmeApplication(@NotNull final JmeToJFXApplication application) { + private static void startJmeApplication(@NotNull JmeToJFXApplication application) { - final InitializationManager initializationManager = InitializationManager.getInstance(); + var initializationManager = InitializationManager.getInstance(); initializationManager.onBeforeCreateJmeContext(); application.start(); - final JmeContext context = application.getContext(); - final Renderer renderer = context.getRenderer(); + var context = application.getContext(); + var renderer = context.getRenderer(); if (renderer == null) { - final EditorConfig editorConfig = EditorConfig.getInstance(); + var editorConfig = EditorConfig.getInstance(); editorConfig.set(PREF_OPEN_GL, OpenGLVersion.GL_20); editorConfig.save(); } @@ -220,22 +202,22 @@ private static void startJmeApplication(@NotNull final JmeToJFXApplication appli private static @NotNull ChangeListener makeFocusedListener() { return (observable, oldValue, newValue) -> { - final JmeApplication jmeApplication = JmeApplication.getInstance(); - final Stage stage = EditorUtil.getFxStage(); + var jmeApplication = JmeApplication.getInstance(); + var stage = EditorUtil.getFxStage(); if (newValue || stage.isFocused()) { jmeApplication.setPaused(false); return; } - final EditorConfig editorConfig = EditorConfig.getInstance(); + var editorConfig = EditorConfig.getInstance(); if (!editorConfig.getBoolean(PREF_STOP_RENDER_ON_LOST_FOCUS, PREF_DEFAULT_STOP_RENDER_ON_LOST_FOCUS)) { jmeApplication.setPaused(false); return; } - final JfxApplication application = JfxApplication.getInstance(); - final Window window = ArrayUtils.getInReadLock(application.openedWindows, + var application = JfxApplication.getInstance(); + var window = ArrayUtils.getInReadLock(application.openedWindows, windows -> windows.search(Window::isFocused)); jmeApplication.setPaused(window == null); @@ -251,15 +233,15 @@ public static void start() { } @FromAnyThread - private static void printError(@NotNull final Throwable throwable) { + private static void printError(@NotNull Throwable throwable) { throwable.printStackTrace(); - final String userHome = System.getProperty("user.home"); - final String fileName = "jmonkeybuilder-error.log"; + var userHome = System.getProperty("user.home"); + var fileName = "jmonkeybuilder-error.log"; - try (final PrintStream out = new PrintStream(newOutputStream(Paths.get(userHome, fileName)))) { + try (var out = new PrintStream(newOutputStream(Paths.get(userHome, fileName)))) { throwable.printStackTrace(out); - } catch (final IOException e) { + } catch (IOException e) { e.printStackTrace(); } } @@ -306,7 +288,7 @@ public void requestFocus() { * @param window the new opened window. */ @FxThread - public void addWindow(@NotNull final Window window) { + public void addWindow(@NotNull Window window) { window.focusedProperty().addListener(makeFocusedListener()); ArrayUtils.runInWriteLock(openedWindows, window, Collection::add); } @@ -317,7 +299,7 @@ public void addWindow(@NotNull final Window window) { * @param window the opened window. */ @FxThread - public void removeWindow(@NotNull final Window window) { + public void removeWindow(@NotNull Window window) { ArrayUtils.runInWriteLock(openedWindows, window, Array::slowRemove); } @@ -333,7 +315,7 @@ public void removeWindow(@NotNull final Window window) { @Override @FxThread - public void start(final Stage stage) throws Exception { + public void start(@NotNull Stage stage) throws Exception { JfxApplication.instance = this; this.stage = stage; @@ -343,20 +325,20 @@ public void start(final Stage stage) throws Exception { // initialize javaFX events in javaFX thread. ArrayFactory.asArray(ComboBoxBase.ON_SHOWN); - final ResourceManager resourceManager = ResourceManager.getInstance(); + var resourceManager = ResourceManager.getInstance(); resourceManager.reload(); - final InitializationManager initializationManager = InitializationManager.getInstance(); + var initializationManager = InitializationManager.getInstance(); initializationManager.onBeforeCreateJavaFxContext(); - final PluginManager pluginManager = PluginManager.getInstance(); + var pluginManager = PluginManager.getInstance(); pluginManager.handlePlugins(editorPlugin -> editorPlugin.register(CssRegistry.getInstance())); LogView.getInstance(); SvgImageLoaderFactory.install(); ImageIO.read(getClass().getResourceAsStream("/ui/icons/test/test.jpg")); - final ObservableList icons = stage.getIcons(); + var icons = stage.getIcons(); icons.add(new Image("/ui/icons/app/256x256.png")); icons.add(new Image("/ui/icons/app/128x128.png")); icons.add(new Image("/ui/icons/app/96x96.png")); @@ -366,7 +348,7 @@ public void start(final Stage stage) throws Exception { icons.add(new Image("/ui/icons/app/24x24.png")); icons.add(new Image("/ui/icons/app/16x16.png")); - final EditorConfig config = EditorConfig.getInstance(); + var config = EditorConfig.getInstance(); stage.initStyle(StageStyle.DECORATED); stage.setMinHeight(600); @@ -396,7 +378,7 @@ public void start(final Stage stage) throws Exception { buildScene(); - } catch (final Throwable e) { + } catch (Throwable e) { LOGGER.error(this, e); throw e; } @@ -418,16 +400,19 @@ protected void onExit() { GAnalytics.forceSendEvent(GAEvent.Category.APPLICATION, GAEvent.Action.APPLICATION_CLOSED, GAEvent.Label.THE_EDITOR_APP_WAS_CLOSED); - final EditorConfig config = EditorConfig.getInstance(); + var config = EditorConfig.getInstance(); config.save(); - final JmeThreadExecutor executor = JmeThreadExecutor.getInstance(); + var waiter = new CountDownLatch(1); + + var executor = JmeThreadExecutor.getInstance(); executor.addToExecute(() -> { - final JmeApplication jmeApplication = JmeApplication.getInstance(); - jmeApplication.destroy(); + JmeApplication.getInstance().destroy(); + waiter.countDown(); }); GAnalytics.waitForSend(); + Utils.run(waiter::await); } /** @@ -437,10 +422,10 @@ protected void onExit() { private void buildScene() { this.scene = EditorFxSceneBuilder.build(notNull(stage)); - final InitializationManager initializationManager = InitializationManager.getInstance(); + var initializationManager = InitializationManager.getInstance(); initializationManager.onAfterCreateJavaFxContext(); - final PluginManager pluginManager = PluginManager.getInstance(); + var pluginManager = PluginManager.getInstance(); pluginManager.handlePlugins(editorPlugin -> { editorPlugin.register(FileCreatorRegistry.getInstance()); editorPlugin.register(EditorRegistry.getInstance()); @@ -453,10 +438,10 @@ private void buildScene() { editorPlugin.register(SettingsProviderRegistry.getInstance()); }); - final EditorFxScene scene = getScene(); + var scene = getScene(); - final JmeApplication jmeApplication = JmeApplication.getInstance(); - final JmeThreadExecutor executor = JmeThreadExecutor.getInstance(); + var jmeApplication = JmeApplication.getInstance(); + var executor = JmeThreadExecutor.getInstance(); executor.addToExecute(() -> createSceneProcessor(scene, jmeApplication)); JmeFilePreviewManager.getInstance(); @@ -464,10 +449,10 @@ private void buildScene() { GAnalytics.forceSendEvent(GAEvent.Category.APPLICATION, GAEvent.Action.APPLICATION_LAUNCHED, GAEvent.Label.THE_EDITOR_APP_WAS_LAUNCHED); - final ExecutorManager executorManager = ExecutorManager.getInstance(); + var executorManager = ExecutorManager.getInstance(); executorManager.addBackgroundTask(new CheckNewVersionTask()); - final EditorConfig editorConfig = EditorConfig.getInstance(); + var editorConfig = EditorConfig.getInstance(); if (editorConfig.isAnalyticsQuestion()) { return; } @@ -477,8 +462,8 @@ private void buildScene() { Platform.runLater(() -> { - final Stage stage = notNull(getStage()); - final ConfirmDialog confirmDialog = new ConfirmDialog(result -> { + var stage = notNull(getStage()); + var confirmDialog = new ConfirmDialog(result -> { editorConfig.setAnalyticsQuestion(true); editorConfig.set(PREF_ANALYTICS_GOOGLE, Boolean.TRUE.equals(result)); @@ -491,15 +476,15 @@ private void buildScene() { } @FxThread - private void createSceneProcessor(@NotNull final EditorFxScene scene, @NotNull final JmeApplication jmeApplication) { + private void createSceneProcessor(@NotNull EditorFxScene scene, @NotNull JmeApplication jmeApplication) { - final FrameTransferSceneProcessor sceneProcessor = bind(jmeApplication, scene.getCanvas(), jmeApplication.getViewPort()); + var sceneProcessor = bind(jmeApplication, scene.getCanvas(), jmeApplication.getViewPort()); sceneProcessor.setEnabled(false); sceneProcessor.setTransferMode(ON_CHANGES); this.sceneProcessor = sceneProcessor; - final Stage stage = notNull(getStage()); + var stage = notNull(getStage()); stage.focusedProperty().addListener(makeFocusedListener()); Platform.runLater(scene::notifyFinishBuild); diff --git a/src/main/java/com/ss/editor/JmeApplication.java b/src/main/java/com/ss/editor/JmeApplication.java index ee72222b..fc2ed995 100644 --- a/src/main/java/com/ss/editor/JmeApplication.java +++ b/src/main/java/com/ss/editor/JmeApplication.java @@ -5,10 +5,8 @@ import static com.ss.editor.config.DefaultSettingsProvider.Preferences.*; import static com.ss.rlib.util.ObjectUtils.notNull; import com.jme3.app.DebugKeysAppState; -import com.jme3.asset.AssetManager; import com.jme3.asset.AssetNotFoundException; import com.jme3.asset.plugins.ClasspathLocator; -import com.jme3.audio.AudioRenderer; import com.jme3.audio.Environment; import com.jme3.bounding.BoundingSphere; import com.jme3.environment.EnvironmentCamera; @@ -16,7 +14,6 @@ import com.jme3.environment.generation.JobProgressAdapter; import com.jme3.environment.util.EnvMapUtils; import com.jme3.font.BitmapFont; -import com.jme3.light.LightList; import com.jme3.light.LightProbe; import com.jme3.material.Material; import com.jme3.material.TechniqueDef; @@ -29,7 +26,6 @@ import com.jme3.renderer.RendererException; import com.jme3.renderer.ViewPort; import com.jme3.scene.Node; -import com.jme3.system.AppSettings; import com.jme3x.jfx.injfx.JmeToJFXApplication; import com.ss.editor.analytics.google.GAnalytics; import com.ss.editor.annotation.FromAnyThread; @@ -71,7 +67,7 @@ public class JmeApplication extends JmeToJFXApplication { */ @NotNull private static final JobProgressAdapter EMPTY_JOB_ADAPTER = new JobProgressAdapter() { - public void done(final LightProbe result) { + public void done(@NotNull LightProbe result) { } }; @@ -103,8 +99,8 @@ public void done(final LightProbe result) { try { - final EditorConfig config = EditorConfig.getInstance(); - final AppSettings settings = config.getSettings(); + var config = EditorConfig.getInstance(); + var settings = config.getSettings(); JME_APPLICATION.setSettings(settings); JME_APPLICATION.setShowSettings(false); @@ -207,7 +203,7 @@ public final long asyncLock() { * @param stamp the stamp */ @FromAnyThread - public final void asyncUnlock(final long stamp) { + public final void asyncUnlock(long stamp) { lock.unlockRead(stamp); } @@ -216,7 +212,7 @@ public final void asyncUnlock(final long stamp) { public void destroy() { super.destroy(); - final WorkspaceManager workspaceManager = WorkspaceManager.getInstance(); + var workspaceManager = WorkspaceManager.getInstance(); workspaceManager.save(); System.exit(0); @@ -238,12 +234,12 @@ public void simpleInitApp() { assetManager.registerLoader(XbufLoader.class, FileExtensions.MODEL_XBUF); - final EditorConfig editorConfig = EditorConfig.getInstance(); - final OperatingSystem system = new OperatingSystem(); + var editorConfig = EditorConfig.getInstance(); + var system = new OperatingSystem(); LOGGER.debug(this, "OS: " + system.getDistribution()); - final AssetManager assetManager = getAssetManager(); + var assetManager = getAssetManager(); assetManager.unregisterLocator("", ClasspathLocator.class); assetManager.unregisterLocator("/", ClasspathLocator.class); assetManager.registerLocator("", FolderAssetLocator.class); @@ -251,7 +247,7 @@ public void simpleInitApp() { assetManager.registerLocator("", ClasspathLocator.class); assetManager.addAssetEventListener(EditorConfig.getInstance()); - final AudioRenderer audioRenderer = getAudioRenderer(); + var audioRenderer = getAudioRenderer(); audioRenderer.setEnvironment(new Environment(Environment.Garage)); viewPort.setBackgroundColor(new ColorRGBA(50 / 255F, 50 / 255F, 50 / 255F, 1F)); @@ -267,7 +263,7 @@ public void simpleInitApp() { previewViewPort.attachScene(previewNode); previewViewPort.setBackgroundColor(viewPort.getBackgroundColor()); - final Node guiNode = getGuiNode(); + var guiNode = getGuiNode(); guiNode.detachAllChildren(); ExecutorManager.getInstance(); @@ -275,7 +271,7 @@ public void simpleInitApp() { flyCam.setDragToRotate(true); flyCam.setEnabled(false); - final FilterPostProcessor postProcessor = getPostProcessor(); + var postProcessor = getPostProcessor(); fxaaFilter = new EditorFxaaFilter(); fxaaFilter.setEnabled(editorConfig.getBoolean(PREF_FILTER_FXAA, PREF_DEFAULT_FXAA_FILTER)); @@ -303,7 +299,7 @@ public void simpleInitApp() { createLightProbes(); stateManager.detach(stateManager.getState(DebugKeysAppState.class)); - final InitializationManager initializationManager = InitializationManager.getInstance(); + var initializationManager = InitializationManager.getInstance(); initializationManager.onAfterCreateJmeContext(); new EditorThread(new ThreadGroup("JavaFX"), JfxApplication::start, "JavaFX Launch").start(); @@ -325,7 +321,7 @@ public long syncLock() { * @param stamp the stamp of the lock. */ @FromAnyThread - public void syncUnlock(final long stamp) { + public void syncUnlock(long stamp) { lock.unlockWrite(stamp); } @@ -344,10 +340,10 @@ public long trySyncLock() { public void loseFocus() { super.loseFocus(); - final WindowChangeFocusEvent event = new WindowChangeFocusEvent(); + var event = new WindowChangeFocusEvent(); event.setFocused(false); - final FxEventManager eventManager = FxEventManager.getInstance(); + var eventManager = FxEventManager.getInstance(); eventManager.notify(event); } @@ -356,16 +352,16 @@ public void loseFocus() { public void gainFocus() { super.gainFocus(); - final WindowChangeFocusEvent event = new WindowChangeFocusEvent(); + var event = new WindowChangeFocusEvent(); event.setFocused(true); - final FxEventManager eventManager = FxEventManager.getInstance(); + var eventManager = FxEventManager.getInstance(); eventManager.notify(event); } @Override @JmeThread - public void simpleUpdate(final float tpf) { + public void simpleUpdate(float tpf) { super.simpleUpdate(tpf); previewNode.updateLogicalState(tpf); @@ -375,10 +371,10 @@ public void simpleUpdate(final float tpf) { @Override @JmeThread public void update() { - final long stamp = syncLock(); + var stamp = syncLock(); try { - final JmeThreadExecutor executor = JmeThreadExecutor.getInstance(); + var executor = JmeThreadExecutor.getInstance(); executor.execute(); //System.out.println(cam.getRotation()); @@ -407,7 +403,7 @@ private void finishWorkOnError(@NotNull final Throwable e) { GAnalytics.sendException(e, true); GAnalytics.waitForSend(); - final WorkspaceManager workspaceManager = WorkspaceManager.getInstance(); + var workspaceManager = WorkspaceManager.getInstance(); workspaceManager.clear(); System.exit(2); @@ -429,8 +425,8 @@ private void finishWorkOnError(@NotNull final Throwable e) { @JmeThread private void createLightProbes() { - final EnvironmentCamera environmentCamera = getEnvironmentCamera(); - final EnvironmentCamera previewEnvironmentCamera = getPreviewEnvironmentCamera(); + var environmentCamera = getEnvironmentCamera(); + var previewEnvironmentCamera = getPreviewEnvironmentCamera(); if (environmentCamera == null || previewEnvironmentCamera == null) { return; @@ -445,7 +441,7 @@ private void createLightProbes() { lightProbe = makeProbe(environmentCamera, rootNode, EnvMapUtils.GenerationType.Fast, EMPTY_JOB_ADAPTER); previewLightProbe = makeProbe(previewEnvironmentCamera, previewNode, EnvMapUtils.GenerationType.Fast, EMPTY_JOB_ADAPTER); - BoundingSphere bounds = (BoundingSphere) lightProbe.getBounds(); + var bounds = (BoundingSphere) lightProbe.getBounds(); bounds.setRadius(100); bounds = (BoundingSphere) previewLightProbe.getBounds(); @@ -461,17 +457,18 @@ private void createLightProbes() { * @param progressAdapter the progress adapter */ @JmeThread - public void updateLightProbe(@NotNull final JobProgressAdapter progressAdapter) { + public void updateLightProbe(@NotNull JobProgressAdapter progressAdapter) { - final LightProbe lightProbe = getLightProbe(); - final EnvironmentCamera environmentCamera = getEnvironmentCamera(); + var lightProbe = getLightProbe(); + var environmentCamera = getEnvironmentCamera(); if (lightProbe == null || environmentCamera == null) { progressAdapter.done(null); return; } - LightProbeFactory.updateProbe(lightProbe, environmentCamera, rootNode, EnvMapUtils.GenerationType.Fast, progressAdapter); + LightProbeFactory.updateProbe(lightProbe, environmentCamera, rootNode, + EnvMapUtils.GenerationType.Fast, progressAdapter); } /** @@ -480,7 +477,7 @@ public void updateLightProbe(@NotNull final JobProgressAdapter progr @JmeThread public void disableLightProbe() { - final LightProbe lightProbe = getLightProbe(); + var lightProbe = getLightProbe(); if (lightProbe != null) { rootNode.removeLight(lightProbe); @@ -493,12 +490,12 @@ public void disableLightProbe() { @JmeThread public void enableLightProbe() { - final LightProbe lightProbe = getLightProbe(); + var lightProbe = getLightProbe(); if (lightProbe == null) { return; } - final LightList lightList = rootNode.getLocalLightList(); + var lightList = rootNode.getLocalLightList(); for (int i = 0; i < lightList.size(); i++) { if (lightList.get(i) == lightProbe) { @@ -517,15 +514,16 @@ public void enableLightProbe() { @JmeThread public void updatePreviewLightProbe(@NotNull final JobProgressAdapter progressAdapter) { - final LightProbe lightProbe = getPreviewLightProbe(); - final EnvironmentCamera environmentCamera = getPreviewEnvironmentCamera(); + var lightProbe = getPreviewLightProbe(); + var environmentCamera = getPreviewEnvironmentCamera(); if (lightProbe == null || environmentCamera == null) { progressAdapter.done(null); return; } - LightProbeFactory.updateProbe(lightProbe, environmentCamera, previewNode, EnvMapUtils.GenerationType.Fast, progressAdapter); + LightProbeFactory.updateProbe(lightProbe, environmentCamera, previewNode, + EnvMapUtils.GenerationType.Fast, progressAdapter); } /** @@ -624,7 +622,7 @@ public void updatePreviewLightProbe(@NotNull final JobProgressAdapter { @Nullable private Tooltip tooltip; - /** - * Instantiates a new Resource tree cell. - */ protected ResourceTreeCell() { setOnMouseClicked(this::handleMouseClickedEvent); setOnDragDetected(this::handleStartDragEvent); @@ -63,7 +61,7 @@ protected ResourceTreeCell() { * @param event the stop drag event. */ @FxThread - private void handleStopDragEvent(@NotNull final DragEvent event) { + private void handleStopDragEvent(@NotNull DragEvent event) { setCursor(Cursor.DEFAULT); event.consume(); } @@ -74,17 +72,21 @@ private void handleStopDragEvent(@NotNull final DragEvent event) { * @param mouseEvent the mouse event. */ @FxThread - private void handleStartDragEvent(@NotNull final MouseEvent mouseEvent) { + private void handleStartDragEvent(@NotNull MouseEvent mouseEvent) { startFullDrag(); - final ResourceElement item = getItem(); - if (item == null) return; + var item = getItem(); + if (item == null) { + return; + } - final Path file = item.getFile(); - if (!Files.exists(file)) return; + var file = item.getFile(); + if (!Files.exists(file)) { + return; + } - final Dragboard dragBoard = startDragAndDrop(TransferMode.COPY); - final ClipboardContent content = new ClipboardContent(); + var dragBoard = startDragAndDrop(TransferMode.COPY); + var content = new ClipboardContent(); content.put(DataFormat.FILES, singletonList(file.toFile())); dragBoard.setContent(content); @@ -99,28 +101,38 @@ private void handleStartDragEvent(@NotNull final MouseEvent mouseEvent) { * @param event the mouse clicked event. */ @FxThread - private void handleMouseClickedEvent(@NotNull final MouseEvent event) { + private void handleMouseClickedEvent(@NotNull MouseEvent event) { - final ResourceElement item = getItem(); - if (item == null) return; + var item = getItem(); + if (item == null) { + return; + } - final boolean isFolder = item instanceof FolderResourceElement; - final ResourceTree treeView = (ResourceTree) getTreeView(); + var isFolder = item instanceof FolderResourceElement; + var treeView = (ResourceTree) getTreeView(); if (event.getButton() == MouseButton.SECONDARY) { - final ContextMenu contextMenu = treeView.getContextMenu(item); - if (contextMenu == null) return; + + var contextMenu = treeView.getContextMenu(item); + if (contextMenu == null) { + return; + } + contextMenu.show(this, Side.BOTTOM, 0, 0); - } else if ((treeView.isOnlyFolders() || !isFolder) && event.getButton() == MouseButton.PRIMARY && - event.getClickCount() > 1) { - final Consumer openFunction = treeView.getOpenFunction(); - if (openFunction != null) openFunction.accept(item); + + } else if ((treeView.isOnlyFolders() || !isFolder) && + event.getButton() == MouseButton.PRIMARY && event.getClickCount() > 1) { + + var openFunction = treeView.getOpenFunction(); + if (openFunction != null) { + openFunction.accept(item); + } } } @Override @FxThread - protected void updateItem(@Nullable final ResourceElement item, boolean empty) { + protected void updateItem(@Nullable ResourceElement item, boolean empty) { super.updateItem(item, empty); removeToolTip(); @@ -135,9 +147,9 @@ protected void updateItem(@Nullable final ResourceElement item, boolean empty) { return; } - final Path file = item.getFile(); - final Path fileName = file.getFileName(); - final boolean folder = item instanceof FolderResourceElement; + var file = item.getFile(); + var fileName = file.getFileName(); + var folder = item instanceof FolderResourceElement; icon.setImage(ICON_MANAGER.getIcon(file, folder, true, DEFAULT_FILE_ICON_SIZE)); @@ -148,7 +160,7 @@ protected void updateItem(@Nullable final ResourceElement item, boolean empty) { @FxThread private @NotNull ProgressIndicator createIndicator() { - final ProgressIndicator indicator = new ProgressIndicator(); + var indicator = new ProgressIndicator(); indicator.setMaxHeight(FXConstants.RESOURCE_TREE_CELL_HEIGHT - 2); indicator.setMaxWidth(FXConstants.RESOURCE_TREE_CELL_HEIGHT - 2); return indicator; diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/resource/ResourceElement.java b/src/main/java/com/ss/editor/ui/component/asset/tree/resource/ResourceElement.java index 49fcfc85..c29ad0ec 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/resource/ResourceElement.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/resource/ResourceElement.java @@ -1,7 +1,7 @@ package com.ss.editor.ui.component.asset.tree.resource; -import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; +import com.ss.editor.annotation.FxThread; import com.ss.rlib.logging.Logger; import com.ss.rlib.logging.LoggerManager; import com.ss.rlib.util.array.Array; @@ -30,12 +30,12 @@ public abstract class ResourceElement implements Comparable { @NotNull protected final Path file; - public ResourceElement(@NotNull final Path file) { + public ResourceElement(@NotNull Path file) { this.file = file; } /** - * Create tooltip to preview this element. + * Create a tooltip to preview this element. * * @return the tooltip. */ @@ -45,7 +45,7 @@ public ResourceElement(@NotNull final Path file) { } /** - * Gets file. + * Get the file. * * @return the reference to the file. */ @@ -55,42 +55,42 @@ public ResourceElement(@NotNull final Path file) { } /** - * Gets children. + * Get children of this file. * - * @param extensionFilter the extension filter - * @param onlyFolders the only folders + * @param extensionFilter the extension filter. + * @param onlyFolders true if needs only folders. * @return list of children resource elements. */ @FromAnyThread - public @Nullable Array getChildren(@NotNull final Array extensionFilter, final boolean onlyFolders) { + public @Nullable Array getChildren(@NotNull Array extensionFilter, boolean onlyFolders) { return null; } /** - * Has children boolean. + * Return true if this element has children. * - * @param extensionFilter the extension filter - * @param onlyFolders the only folders + * @param extensionFilter the extension filter. + * @param onlyFolders true if needs only folders. * @return true if this element has children. */ @FromAnyThread - public boolean hasChildren(@NotNull final Array extensionFilter, final boolean onlyFolders) { + public boolean hasChildren(@NotNull Array extensionFilter, boolean onlyFolders) { return false; } @Override - public int compareTo(@Nullable final ResourceElement other) { + public int compareTo(@Nullable ResourceElement other) { if (other == null) return -1; - final Path file = getFile(); - final Path otherFile = other.getFile(); + var file = getFile(); + var otherFile = other.getFile(); return file.getNameCount() - otherFile.getNameCount(); } @Override - public boolean equals(final Object o) { + public boolean equals(@Nullable Object o) { if (this == o) return true; if (o instanceof Path) return file.equals(o); - final ResourceElement that = (ResourceElement) o; + var that = (ResourceElement) o; return file.equals(that.file); } diff --git a/src/main/java/com/ss/editor/ui/control/property/PropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/PropertyControl.java index d7b61a99..7fa7001a 100644 --- a/src/main/java/com/ss/editor/ui/control/property/PropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/PropertyControl.java @@ -139,14 +139,16 @@ public class PropertyControl extends VBox implem */ private boolean ignoreListener; - public PropertyControl(@Nullable final T propertyValue, @NotNull final String propertyName, - @NotNull final C changeConsumer) { + public PropertyControl(@Nullable T propertyValue, @NotNull String propertyName, @NotNull C changeConsumer) { this(propertyValue, propertyName, changeConsumer, null); } - public PropertyControl(@Nullable final T propertyValue, @NotNull final String propertyName, - @NotNull final C changeConsumer, - @Nullable final SixObjectConsumer> changeHandler) { + public PropertyControl( + @Nullable T propertyValue, + @NotNull String propertyName, + @NotNull C changeConsumer, + @Nullable SixObjectConsumer> changeHandler + ) { this.propertyName = propertyName; this.changeConsumer = changeConsumer; this.changeHandler = changeHandler == null ? newChangeHandler() : changeHandler; @@ -174,8 +176,7 @@ public PropertyControl(@Nullable final T propertyValue, @NotNull final String pr public @NotNull SixObjectConsumer> newChangeHandler() { return (changeConsumer, object, propName, newValue, oldValue, handler) -> { - final PropertyOperation operation = - new PropertyOperation<>(object, propName, newValue, oldValue); + var operation = new PropertyOperation(object, propName, newValue, oldValue); operation.setApplyHandler(handler); changeConsumer.execute(operation); @@ -183,23 +184,23 @@ public PropertyControl(@Nullable final T propertyValue, @NotNull final String pr } /** - * Sets edit object. + * Set the edit object. * * @param editObject the edit object. */ @FxThread - public void setEditObject(@NotNull final D editObject) { + public void setEditObject(@NotNull D editObject) { this.editObject = editObject; } /** - * Sets edit object. + * Set the edit object. * * @param editObject the edit object. * @param needReload the true if need to reload. */ @FxThread - public void setEditObject(@NotNull final D editObject, final boolean needReload) { + public void setEditObject(@NotNull D editObject, boolean needReload) { setEditObject(editObject); if (!needReload) { @@ -215,19 +216,19 @@ public void setEditObject(@NotNull final D editObject, final boolean needReload) } /** - * Sets apply handler. + * Set the apply handler. * - * @param applyHandler the handler for handling new value. + * @param applyHandler the apply handler. */ @FxThread - public void setApplyHandler(@NotNull final BiConsumer applyHandler) { + public void setApplyHandler(@NotNull BiConsumer applyHandler) { this.applyHandler = applyHandler; } /** - * Gets sync handler. + * Get the sync handler. * - * @return the handler for getting actual value. + * @return the sync handler. */ @FromAnyThread protected @Nullable Function getSyncHandler() { @@ -235,17 +236,17 @@ public void setApplyHandler(@NotNull final BiConsumer applyHandler) { } /** - * Sets sync handler. + * Set the sync handler. * - * @param syncHandler the handler for getting actual value. + * @param syncHandler the sync handler. */ @FxThread - public void setSyncHandler(@Nullable final Function syncHandler) { + public void setSyncHandler(@Nullable Function syncHandler) { this.syncHandler = syncHandler; } /** - * Gets edit object. + * Get the edit object. * * @return the edit object. */ @@ -255,7 +256,7 @@ public void setSyncHandler(@Nullable final Function syncHandler) { } /** - * Has edit object boolean. + * Return true if this control has an edit object. * * @return true if this control has an edit object. */ @@ -265,7 +266,7 @@ protected boolean hasEditObject() { } /** - * Initializing control. + * Reloading control. */ @FxThread protected void reload() { @@ -280,8 +281,8 @@ public void sync() { setIgnoreListener(true); try { - final Function syncHandler = getSyncHandler(); - final T currentValue = getPropertyValue(); + var syncHandler = getSyncHandler(); + var currentValue = getPropertyValue(); if (syncHandler != null) { setPropertyValue(syncHandler.apply(getEditObject())); @@ -303,7 +304,7 @@ public void sync() { protected void createComponents() { setAlignment(isSingleRow() ? Pos.CENTER_RIGHT : Pos.CENTER); - final HBox container = new HBox(); + var container = new HBox(); container.setAlignment(isSingleRow() ? Pos.CENTER_RIGHT : Pos.CENTER); propertyNameLabel = new Label(getPropertyName() + ":"); @@ -339,21 +340,21 @@ protected void createComponents() { * @param controlWidthPercent the control width percent. */ @FxThread - public void changeControlWidthPercent(final double controlWidthPercent) { + public void changeControlWidthPercent(double controlWidthPercent) { if (!isSingleRow()) { return; } - final Label propertyNameLabel = getPropertyNameLabel(); + var propertyNameLabel = getPropertyNameLabel(); propertyNameLabel.maxWidthProperty().unbind(); propertyNameLabel.maxWidthProperty().bind(widthProperty().multiply(1D - controlWidthPercent)); } /** - * Is single row boolean. + * Return true if this control is a single row. * - * @return true if this control is single row. + * @return true if this control is a single row. */ @FromAnyThread protected boolean isSingleRow() { @@ -363,14 +364,14 @@ protected boolean isSingleRow() { /** * Create components of this control. * - * @param container the container + * @param container the container. */ @FxThread protected void createComponents(@NotNull final HBox container) { } /** - * Gets property name. + * Get the property name. * * @return the name of the property. */ @@ -380,7 +381,7 @@ protected void createComponents(@NotNull final HBox container) { } /** - * Gets change consumer. + * Get the change consumer. * * @return the consumer of changes. */ @@ -396,12 +397,13 @@ protected void createComponents(@NotNull final HBox container) { * @param oldValue the old value */ @FxThread - protected void changed(@Nullable final T newValue, @Nullable final T oldValue) { - changeHandler.accept(getChangeConsumer(), getEditObject(), getPropertyName(), newValue, oldValue, getApplyHandler()); + protected void changed(@Nullable T newValue, @Nullable T oldValue) { + changeHandler.accept(getChangeConsumer(), getEditObject(), getPropertyName(), + newValue, oldValue, getApplyHandler()); } /** - * Gets property value. + * Get the property value. * * @return the value of the property. */ @@ -411,7 +413,7 @@ protected void changed(@Nullable final T newValue, @Nullable final T oldValue) { } /** - * Gets apply handler. + * Get the apply handler. * * @return the handler for handling new value. */ @@ -421,27 +423,27 @@ protected void changed(@Nullable final T newValue, @Nullable final T oldValue) { } /** - * Sets property value. + * Set the property value. * * @param propertyValue the value of the property. */ @FxThread - protected void setPropertyValue(@Nullable final T propertyValue) { + protected void setPropertyValue(@Nullable T propertyValue) { this.propertyValue = propertyValue; } /** - * Sets ignore listener. + * Set the ignore listener. * * @param ignoreListener the flag for ignoring listeners. */ @FxThread - protected void setIgnoreListener(final boolean ignoreListener) { + protected void setIgnoreListener(boolean ignoreListener) { this.ignoreListener = ignoreListener; } /** - * Is ignore listener boolean. + * Return true if need to ignore listeners. * * @return true if need to ignore listeners. */ diff --git a/src/main/java/com/ss/editor/ui/control/property/PropertyEditor.java b/src/main/java/com/ss/editor/ui/control/property/PropertyEditor.java index 818596a9..857cd240 100644 --- a/src/main/java/com/ss/editor/ui/control/property/PropertyEditor.java +++ b/src/main/java/com/ss/editor/ui/control/property/PropertyEditor.java @@ -9,8 +9,6 @@ import com.ss.editor.ui.control.property.builder.PropertyBuilderRegistry; import com.ss.editor.ui.css.CssClasses; import com.ss.rlib.ui.util.FXUtils; -import javafx.collections.ObservableList; -import javafx.scene.Node; import javafx.scene.control.ScrollPane; import javafx.scene.layout.VBox; import org.jetbrains.annotations.NotNull; @@ -51,18 +49,15 @@ public class PropertyEditor extends ScrollPane { @Nullable private Object currentParent; - /** - * Instantiates a new Abstract property editor. - * - * @param changeConsumer the change consumer - */ - public PropertyEditor(@NotNull final C changeConsumer) { + public PropertyEditor(@NotNull C changeConsumer) { this.changeConsumer = changeConsumer; createComponents(); } /** - * @return The container of controls. + * Get the container of controls. + * + * @return the container of controls. */ @FxThread private @NotNull VBox getContainer() { @@ -78,29 +73,29 @@ private void createComponents() { this.container.prefWidthProperty() .bind(widthProperty().subtract(FXConstants.PROPERTY_LIST_OFFSET)); - final VBox wrapper = new VBox(container); + var wrapper = new VBox(container); FXUtils.addClassTo(this, CssClasses.ABSTRACT_PARAM_CONTROL_CONTAINER); - FXUtils.addClassTo(container, CssClasses.DEF_VBOX); - FXUtils.addClassTo(wrapper, CssClasses.DEF_VBOX); + FXUtils.addClassesTo(wrapper, container, CssClasses.DEF_VBOX); setContent(wrapper); } /** - * Sync all properties with controls. + * Sync all property controls. * - * @param object the object + * @param object the object. */ @FxThread - public void syncFor(@Nullable final Object object) { - if (!isNeedUpdate(object)) return; + public void syncFor(@Nullable Object object) { - final VBox container = getContainer(); - container.setDisable(object == null || !canEdit(object, getCurrentParent())); + if (!isNeedUpdate(object)) { + return; + } - final ObservableList children = container.getChildren(); - children.forEach(node -> { + var container = getContainer(); + container.setDisable(object == null || !canEdit(object, getCurrentParent())); + container.getChildren().forEach(node -> { if (node instanceof UpdatableControl) { ((UpdatableControl) node).sync(); } @@ -108,19 +103,19 @@ public void syncFor(@Nullable final Object object) { } /** - * Sync all properties with controls. + * Sync all property controls. */ @FxThread public void refresh() { - final Object object = getCurrentObject(); - if (object == null) return; + var object = getCurrentObject(); + if (object == null) { + return; + } - final VBox container = getContainer(); + var container = getContainer(); container.setDisable(!canEdit(object, getCurrentParent())); - - final ObservableList children = container.getChildren(); - children.forEach(node -> { + container.getChildren().forEach(node -> { if (node instanceof UpdatableControl) { ((UpdatableControl) node).sync(); } @@ -134,14 +129,14 @@ public void refresh() { * @param parent the parent */ @FxThread - public void buildFor(@Nullable final Object object, @Nullable final Object parent) { + public void buildFor(@Nullable Object object, @Nullable Object parent) { if (getCurrentObject() == object) { return; } - final VBox container = getContainer(); - final ObservableList children = container.getChildren(); + var container = getContainer(); + var children = container.getChildren(); children.clear(); if (object != null) { @@ -155,29 +150,32 @@ public void buildFor(@Nullable final Object object, @Nullable final Object paren } /** - * Can edit boolean. + * Return true if we can edit properties of the object. * * @param object the object to edit. * @param parent the parent. * @return true if we can edit properties of the object. */ @FxThread - protected boolean canEdit(@NotNull final Object object, @Nullable final Object parent) { + protected boolean canEdit(@NotNull Object object, @Nullable Object parent) { return true; } /** * Re-build property controls for the object. * - * @param object the object - * @param parent the parent + * @param object the object. + * @param parent the parent. */ @FxThread - public void rebuildFor(@Nullable final Object object, @Nullable final Object parent) { - if (getCurrentObject() != object) return; + public void rebuildFor(@Nullable Object object, @Nullable Object parent) { - final VBox container = getContainer(); - final ObservableList children = container.getChildren(); + if (getCurrentObject() != object) { + return; + } + + var container = getContainer(); + var children = container.getChildren(); children.clear(); if (object != null) { @@ -186,7 +184,7 @@ public void rebuildFor(@Nullable final Object object, @Nullable final Object par } /** - * Rebuild this editor. + * Rebuild all property controls. */ @FxThread public void rebuild() { @@ -194,21 +192,25 @@ public void rebuild() { } /** - * Is need update boolean. + * Return true if need to update property controls. * - * @param object the object - * @return the boolean + * @param object the object. + * @return true if need to update property controls. */ @FxThread - protected boolean isNeedUpdate(@Nullable final Object object) { - final Object currentObject = getCurrentObject(); + protected boolean isNeedUpdate(@Nullable Object object) { + + var currentObject = getCurrentObject(); if (object instanceof EditableProperty) { return currentObject == ((EditableProperty) object).getObject(); } + return currentObject == object; } /** + * Set the current editable object. + * * @param currentObject the current editable object. */ @FxThread @@ -217,7 +219,7 @@ private void setCurrentObject(@Nullable final Object currentObject) { } /** - * Gets current object. + * Get the current object. * * @return the current editable object. */ @@ -227,17 +229,17 @@ private void setCurrentObject(@Nullable final Object currentObject) { } /** - * Sets the current parent. + * Set the current parent. * * @param currentParent the current parent. */ @FxThread - protected void setCurrentParent(@Nullable final Object currentParent) { + protected void setCurrentParent(@Nullable Object currentParent) { this.currentParent = currentParent; } /** - * Gets the current parent. + * Get the current parent. * * @return the current parent. */ diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/PropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/PropertyBuilder.java index 86d5146e..0e72627e 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/PropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/PropertyBuilder.java @@ -2,12 +2,10 @@ import com.ss.editor.annotation.FxThread; import com.ss.editor.model.undo.editor.ChangeConsumer; - +import javafx.scene.layout.VBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import javafx.scene.layout.VBox; - /** * The interface to implement property builder to create property controls for some objects. * @@ -24,8 +22,12 @@ public interface PropertyBuilder extends Comparable { * @param changeConsumer the consumer for working between controls and editor. */ @FxThread - void buildFor(@NotNull Object object, @Nullable Object parent, @NotNull VBox container, - @NotNull ChangeConsumer changeConsumer); + void buildFor( + @NotNull Object object, + @Nullable Object parent, + @NotNull VBox container, + @NotNull ChangeConsumer changeConsumer + ); /** * Get the priority of this builder. @@ -37,7 +39,7 @@ default int getPriority() { } @Override - default int compareTo(@NotNull final PropertyBuilder o) { + default int compareTo(@NotNull PropertyBuilder o) { return o.getPriority() - getPriority(); } } diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/SpatialPropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/SpatialPropertyBuilder.java index b0ab06ac..c5ae947a 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/SpatialPropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/SpatialPropertyBuilder.java @@ -2,7 +2,6 @@ import static com.ss.editor.part3d.editor.impl.scene.AbstractSceneEditor3DPart.KEY_LOADED_MODEL; import com.jme3.math.ColorRGBA; -import com.jme3.math.Quaternion; import com.jme3.math.Vector2f; import com.jme3.math.Vector3f; import com.jme3.renderer.queue.RenderQueue.Bucket; @@ -10,13 +9,12 @@ import com.jme3.scene.Spatial; import com.jme3.scene.Spatial.CullHint; import com.ss.editor.Messages; -import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; +import com.ss.editor.annotation.FxThread; import com.ss.editor.extension.scene.SceneLayer; import com.ss.editor.extension.scene.SceneNode; import com.ss.editor.model.undo.editor.ModelChangeConsumer; import com.ss.editor.model.undo.editor.SceneChangeConsumer; -import com.ss.editor.ui.control.property.impl.LayerModelPropertyControl; import com.ss.editor.ui.control.property.builder.PropertyBuilder; import com.ss.editor.ui.control.property.impl.*; import com.ss.rlib.ui.util.FXUtils; @@ -26,8 +24,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Collection; - /** * The implementation of the {@link PropertyBuilder} to build property controls for {@link Spatial} objects. * @@ -60,40 +56,44 @@ private SpatialPropertyBuilder() { @Override @FxThread - protected void buildForImpl(@NotNull final Object object, @Nullable final Object parent, @NotNull final VBox container, - @NotNull final ModelChangeConsumer changeConsumer) { + protected void buildForImpl( + @NotNull Object object, + @Nullable Object parent, + @NotNull VBox container, + @NotNull ModelChangeConsumer changeConsumer + ) { if (!(object instanceof Spatial)) { return; } - final Spatial spatial = (Spatial) object; - final CullHint cullHint = spatial.getLocalCullHint(); - final ShadowMode shadowMode = spatial.getLocalShadowMode(); - final Bucket queueBucket = spatial.getLocalQueueBucket(); + var spatial = (Spatial) object; + var cullHint = spatial.getLocalCullHint(); + var shadowMode = spatial.getLocalShadowMode(); + var queueBucket = spatial.getLocalQueueBucket(); if (changeConsumer instanceof SceneChangeConsumer) { - final SceneLayer layer = SceneLayer.getLayer(spatial); - final LayerModelPropertyControl propertyControl = new LayerModelPropertyControl(layer, (SceneChangeConsumer) changeConsumer); + var layer = SceneLayer.getLayer(spatial); + var propertyControl = new LayerModelPropertyControl(layer, (SceneChangeConsumer) changeConsumer); propertyControl.setEditObject(spatial); FXUtils.addToPane(propertyControl, container); } - final EnumPropertyControl cullHintControl = + EnumPropertyControl cullHintControl = new EnumPropertyControl<>(cullHint, Messages.MODEL_PROPERTY_CULL_HINT, changeConsumer, CULL_HINTS); cullHintControl.setApplyHandler(Spatial::setCullHint); cullHintControl.setSyncHandler(Spatial::getLocalCullHint); cullHintControl.setEditObject(spatial); - final EnumPropertyControl shadowModeControl = + EnumPropertyControl shadowModeControl = new EnumPropertyControl<>(shadowMode, Messages.MODEL_PROPERTY_SHADOW_MODE, changeConsumer, SHADOW_MODES); shadowModeControl.setApplyHandler(Spatial::setShadowMode); shadowModeControl.setSyncHandler(Spatial::getLocalShadowMode); shadowModeControl.setEditObject(spatial); - final EnumPropertyControl queueBucketControl = + EnumPropertyControl queueBucketControl = new EnumPropertyControl<>(queueBucket, Messages.MODEL_PROPERTY_QUEUE_BUCKET, changeConsumer, BUCKETS); queueBucketControl.setApplyHandler(Spatial::setQueueBucket); queueBucketControl.setSyncHandler(Spatial::getLocalQueueBucket); @@ -107,23 +107,23 @@ protected void buildForImpl(@NotNull final Object object, @Nullable final Object buildSplitLine(container); - final Vector3f location = spatial.getLocalTranslation().clone(); - final Vector3f scale = spatial.getLocalScale().clone(); - final Quaternion rotation = spatial.getLocalRotation().clone(); + var location = spatial.getLocalTranslation().clone(); + var scale = spatial.getLocalScale().clone(); + var rotation = spatial.getLocalRotation().clone(); - final Vector3FPropertyControl locationControl = + Vector3FPropertyControl locationControl = new Vector3FPropertyControl<>(location, Messages.MODEL_PROPERTY_LOCATION, changeConsumer); locationControl.setApplyHandler(Spatial::setLocalTranslation); locationControl.setSyncHandler(Spatial::getLocalTranslation); locationControl.setEditObject(spatial); - final Vector3FPropertyControl scaleControl = + Vector3FPropertyControl scaleControl = new Vector3FPropertyControl<>(scale, Messages.MODEL_PROPERTY_SCALE, changeConsumer); scaleControl.setApplyHandler(Spatial::setLocalScale); scaleControl.setSyncHandler(Spatial::getLocalScale); scaleControl.setEditObject(spatial); - final QuaternionPropertyControl rotationControl = + QuaternionPropertyControl rotationControl = new QuaternionPropertyControl<>(rotation, Messages.MODEL_PROPERTY_ROTATION, changeConsumer); rotationControl.setApplyHandler(Spatial::setLocalRotation); rotationControl.setSyncHandler(Spatial::getLocalRotation); @@ -134,19 +134,19 @@ protected void buildForImpl(@NotNull final Object object, @Nullable final Object FXUtils.addToPane(rotationControl, container); } - final Collection userDataKeys = spatial.getUserDataKeys(); + var userDataKeys = spatial.getUserDataKeys(); if (userDataKeys.isEmpty()) { return; } - int count = 0; + var count = 0; - for (final String key : userDataKeys) { + for (var key : userDataKeys) { if (isNeedSkip(key)) continue; count++; } - if(count < 1) { + if (count < 1) { return; } @@ -155,17 +155,19 @@ protected void buildForImpl(@NotNull final Object object, @Nullable final Object final Array sortedKeys = ArrayFactory.newSortedArray(String.class); sortedKeys.addAll(userDataKeys); - for (final String key : sortedKeys) { - if (isNeedSkip(key)) continue; + for (var key : sortedKeys) { + + if (isNeedSkip(key)) { + continue; + } - final Object data = spatial.getUserData(key); + var data = spatial.getUserData(key); if (data instanceof Float) { - final Float value = (Float) data; + var value = (Float) data; - final FloatPropertyControl control = - new FloatPropertyControl<>(value, key, changeConsumer); + var control = new FloatPropertyControl(value, key, changeConsumer); control.setApplyHandler((sp, newValue) -> sp.setUserData(key, newValue)); control.setSyncHandler(sp -> sp.getUserData(key)); control.setEditObject(spatial); @@ -257,12 +259,12 @@ protected void buildForImpl(@NotNull final Object object, @Nullable final Object } @FxThread - private boolean isNeedSkip(@NotNull final String key) { + private boolean isNeedSkip(@NotNull String key) { return SceneLayer.KEY.equals(key) || KEY_LOADED_MODEL.equals(key); } @FxThread - private boolean canEditTransformation(@NotNull final Spatial spatial) { + private boolean canEditTransformation(@NotNull Spatial spatial) { return !(spatial instanceof SceneNode || spatial instanceof SceneLayer); } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/MinMaxPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/MinMaxPropertyControl.java index 59668649..c8ab5a82 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/MinMaxPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/MinMaxPropertyControl.java @@ -12,14 +12,17 @@ /** * The implementation of the {@link Vector2FPropertyControl} to edit min-max value range. * - * @param the change consumer's type. - * @param the edited object's type. + * @param the type of a {@link ChangeConsumer} + * @param the type of an editing object. * @author JavaSaBr */ public class MinMaxPropertyControl extends Vector2FPropertyControl { - public MinMaxPropertyControl(@Nullable final Vector2f propertyValue, @NotNull final String propertyName, - @NotNull final C changeConsumer) { + public MinMaxPropertyControl( + @Nullable Vector2f propertyValue, + @NotNull String propertyName, + @NotNull C changeConsumer + ) { super(propertyValue, propertyName, changeConsumer); getXField().setMinMax(0, Integer.MAX_VALUE); getYField().setMinMax(0, Integer.MAX_VALUE); @@ -27,13 +30,13 @@ public MinMaxPropertyControl(@Nullable final Vector2f propertyValue, @NotNull fi @Override @FxThread - protected float checkResultXValue(final float x, final float y) { + protected float checkResultXValue(float x, float y) { return min(x, y); } @Override @FxThread - protected float checkResultYValue(final float x, final float y) { + protected float checkResultYValue(float x, float y) { return max(x, y); } } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/StringPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/StringPropertyControl.java index fd5e05ea..59e90a73 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/StringPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/StringPropertyControl.java @@ -1,8 +1,8 @@ package com.ss.editor.ui.control.property.impl; import static com.ss.rlib.util.ObjectUtils.notNull; -import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; +import com.ss.editor.annotation.FxThread; import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; @@ -17,8 +17,8 @@ /** * The implementation of the {@link PropertyControl} to edit string values. * - * @param the type parameter - * @param the type parameter + * @param the type of a change consumer. + * @param the type of an editing property. * @author JavaSaBr */ public class StringPropertyControl extends PropertyControl { @@ -29,14 +29,17 @@ public class StringPropertyControl extends Property @Nullable private TextField valueField; - public StringPropertyControl(@Nullable final String propertyValue, @NotNull final String propertyName, - @NotNull final C changeConsumer) { + public StringPropertyControl( + @Nullable String propertyValue, + @NotNull String propertyName, + @NotNull C changeConsumer + ) { super(propertyValue, propertyName, changeConsumer); } @Override @FxThread - protected void createComponents(@NotNull final HBox container) { + protected void createComponents(@NotNull HBox container) { super.createComponents(container); valueField = new TextField(); @@ -54,6 +57,8 @@ protected boolean isSingleRow() { } /** + * Get the filed with current value. + * * @return the filed with current value. */ @FxThread @@ -64,9 +69,9 @@ protected boolean isSingleRow() { @Override @FxThread protected void reload() { - final String value = getPropertyValue(); - final TextField valueField = getValueField(); - final int caretPosition = valueField.getCaretPosition(); + var value = getPropertyValue(); + var valueField = getValueField(); + var caretPosition = valueField.getCaretPosition(); valueField.setText(value == null ? "" : value); valueField.positionCaret(caretPosition); } @@ -75,16 +80,15 @@ protected void reload() { * Update the value. */ @FxThread - private void updateValue(@NotNull final KeyEvent event) { + private void updateValue(@NotNull KeyEvent event) { if (isIgnoreListener() || event.getCode() != KeyCode.ENTER) { return; } - final TextField valueField = getValueField(); - - final String oldValue = getPropertyValue(); - final String newValue = valueField.getText(); + var valueField = getValueField(); + var oldValue = getPropertyValue(); + var newValue = valueField.getText(); changed(newValue, oldValue); } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/Vector2FPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/Vector2FPropertyControl.java index 4f4e7228..e9fc4e01 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/Vector2FPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/Vector2FPropertyControl.java @@ -2,8 +2,8 @@ import static com.ss.rlib.util.ObjectUtils.notNull; import com.jme3.math.Vector2f; -import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; +import com.ss.editor.annotation.FxThread; import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; @@ -19,9 +19,9 @@ /** * The implementation of the {@link PropertyControl} to edit {@link Vector2f} values. * - * @param the type parameter - * @param the type parameter - * @author JavaSaBr. + * @param the type of a {@link ChangeConsumer} + * @param the type of an editing object. + * @author JavaSaBr */ public class Vector2FPropertyControl extends PropertyControl { @@ -43,24 +43,27 @@ public class Vector2FPropertyControl extends Proper @Nullable private HBox fieldContainer; - public Vector2FPropertyControl(@Nullable final Vector2f propertyValue, @NotNull final String propertyName, - @NotNull final C changeConsumer) { + public Vector2FPropertyControl( + @Nullable Vector2f propertyValue, + @NotNull String propertyName, + @NotNull C changeConsumer + ) { super(propertyValue, propertyName, changeConsumer); } @Override @FxThread - public void changeControlWidthPercent(final double controlWidthPercent) { + public void changeControlWidthPercent(double controlWidthPercent) { super.changeControlWidthPercent(controlWidthPercent); - final HBox valueField = getFieldContainer(); + var valueField = getFieldContainer(); valueField.prefWidthProperty().unbind(); valueField.prefWidthProperty().bind(widthProperty().multiply(controlWidthPercent)); } @Override @FxThread - protected void createComponents(@NotNull final HBox container) { + protected void createComponents(@NotNull HBox container) { super.createComponents(container); fieldContainer = new HBox(); @@ -92,6 +95,8 @@ protected void createComponents(@NotNull final HBox container) { } /** + * Get the field container. + * * @return the field container. */ @FxThread @@ -101,7 +106,7 @@ protected void createComponents(@NotNull final HBox container) { @Override @FxThread - protected void setPropertyValue(@Nullable final Vector2f vector) { + protected void setPropertyValue(@Nullable Vector2f vector) { super.setPropertyValue(vector == null ? null : vector.clone()); } @@ -112,33 +117,33 @@ protected boolean isSingleRow() { } /** - * Check result x value float. + * Check the result x value. * - * @param x the x - * @param y the y - * @return the float + * @param x the x. + * @param y the y. + * @return the result x value. */ @FxThread - protected float checkResultXValue(final float x, final float y) { + protected float checkResultXValue(float x, float y) { return x; } /** - * Check result y value float. + * Check result y value. * - * @param x the x - * @param y the y - * @return the float + * @param x the x. + * @param y the y. + * @return the result y value. */ @FxThread - protected float checkResultYValue(final float x, final float y) { + protected float checkResultYValue(float x, float y) { return y; } /** - * Gets x field. + * Get the X field. * - * @return the field X. + * @return the X field. */ @FxThread protected @NotNull FloatTextField getXField() { @@ -146,9 +151,9 @@ protected float checkResultYValue(final float x, final float y) { } /** - * Gets y field. + * Get the Y field. * - * @return the field Y. + * @return the Y field. */ @FxThread protected @NotNull FloatTextField getYField() { @@ -159,13 +164,13 @@ protected float checkResultYValue(final float x, final float y) { @FxThread protected void reload() { - final Vector2f vector = getPropertyValue() == null ? Vector2f.ZERO : getPropertyValue(); + var vector = getPropertyValue() == null ? Vector2f.ZERO : getPropertyValue(); - final FloatTextField xField = getXField(); + var xField = getXField(); xField.setValue(vector.getX()); xField.positionCaret(xField.getText().length()); - final FloatTextField yField = getYField(); + var yField = getYField(); yField.setValue(vector.getY()); yField.positionCaret(yField.getText().length()); } @@ -176,20 +181,20 @@ protected void reload() { * @param event the event */ @FxThread - private void updateVector(@Nullable final KeyEvent event) { + private void updateVector(@Nullable KeyEvent event) { if (isIgnoreListener() || (event != null && event.getCode() != KeyCode.ENTER)) { return; } - final FloatTextField xField = getXField(); - final float x = xField.getValue(); + var xField = getXField(); + var x = xField.getValue(); - final FloatTextField yField = getYField(); - final float y = yField.getValue(); + var yField = getYField(); + var y = yField.getValue(); - final Vector2f oldValue = getPropertyValue() == null ? Vector2f.ZERO : getPropertyValue(); - final Vector2f newValue = new Vector2f(); + var oldValue = getPropertyValue() == null ? Vector2f.ZERO : getPropertyValue(); + var newValue = new Vector2f(); newValue.set(checkResultXValue(x, y), checkResultYValue(x, y)); changed(newValue, oldValue.clone()); diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/Vector3FPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/Vector3FPropertyControl.java index 914d2abf..f05f85df 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/Vector3FPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/Vector3FPropertyControl.java @@ -46,23 +46,29 @@ public class Vector3FPropertyControl extends Proper @Nullable private FloatTextField zField; - public Vector3FPropertyControl(@Nullable final Vector3f propertyValue, @NotNull final String propertyName, - @NotNull final C changeConsumer) { + public Vector3FPropertyControl( + @Nullable Vector3f propertyValue, + @NotNull String propertyName, + @NotNull C changeConsumer + ) { super(propertyValue, propertyName, changeConsumer); } - public Vector3FPropertyControl(@Nullable final Vector3f propertyValue, @NotNull final String propertyName, - @NotNull final C changeConsumer, - @Nullable final SixObjectConsumer> changeHandler) { + public Vector3FPropertyControl( + @Nullable Vector3f propertyValue, + @NotNull String propertyName, + @NotNull C changeConsumer, + @Nullable SixObjectConsumer> changeHandler + ) { super(propertyValue, propertyName, changeConsumer, changeHandler); } @Override @FxThread - protected void createComponents(@NotNull final HBox container) { + protected void createComponents(@NotNull HBox container) { super.createComponents(container); - final Label xLabel = new Label("x:"); + var xLabel = new Label("x:"); xField = new FloatTextField(); xField.setOnKeyReleased(this::updateVector); @@ -70,7 +76,7 @@ protected void createComponents(@NotNull final HBox container) { xField.prefWidthProperty().bind(widthProperty().divide(3)); xField.setScrollPower(getScrollPower()); - final Label yLabel = new Label("y:"); + var yLabel = new Label("y:"); yField = new FloatTextField(); yField.setOnKeyReleased(this::updateVector); @@ -78,7 +84,7 @@ protected void createComponents(@NotNull final HBox container) { yField.prefWidthProperty().bind(widthProperty().divide(3)); yField.setScrollPower(getScrollPower()); - final Label zLabel = new Label("z:"); + var zLabel = new Label("z:"); zField = new FloatTextField(); zField.setOnKeyReleased(this::updateVector); @@ -104,12 +110,12 @@ protected void createComponents(@NotNull final HBox container) { @Override @FxThread - protected void setPropertyValue(@Nullable final Vector3f vector) { + protected void setPropertyValue(@Nullable Vector3f vector) { super.setPropertyValue(vector == null ? null : vector.clone()); } /** - * Gets scroll power. + * Get the scroll power. * * @return the scroll power. */ @@ -119,7 +125,7 @@ protected float getScrollPower() { } /** - * Gets x field. + * Get the field X. * * @return the field X. */ @@ -129,7 +135,7 @@ protected float getScrollPower() { } /** - * Gets y filed. + * Get the filed Y. * * @return the field Y. */ @@ -139,7 +145,7 @@ protected float getScrollPower() { } /** - * Gets z field. + * Get the field Z. * * @return the field Z. */ @@ -152,17 +158,17 @@ protected float getScrollPower() { @FxThread protected void reload() { - final Vector3f vector = getPropertyValue() == null ? Vector3f.ZERO : getPropertyValue(); + var vector = getPropertyValue() == null ? Vector3f.ZERO : getPropertyValue(); - final FloatTextField xField = getXField(); + var xField = getXField(); xField.setValue(vector.getX()); xField.positionCaret(xField.getText().length()); - final FloatTextField yFiled = getYFiled(); + var yFiled = getYFiled(); yFiled.setValue(vector.getY()); yFiled.positionCaret(xField.getText().length()); - final FloatTextField zField = getZField(); + var zField = getZField(); zField.setValue(vector.getZ()); zField.positionCaret(xField.getText().length()); } @@ -170,26 +176,26 @@ protected void reload() { /** * Update the vector. * - * @param event the event + * @param event the event. */ @FxThread - protected void updateVector(@Nullable final KeyEvent event) { + protected void updateVector(@Nullable KeyEvent event) { if (isIgnoreListener() || (event != null && event.getCode() != KeyCode.ENTER)) { return; } - final FloatTextField xField = getXField(); - final float x = xField.getValue(); + var xField = getXField(); + var x = xField.getValue(); - final FloatTextField yFiled = getYFiled(); - final float y = yFiled.getValue(); + var yFiled = getYFiled(); + var y = yFiled.getValue(); - final FloatTextField zField = getZField(); - final float z = zField.getValue(); + var zField = getZField(); + var z = zField.getValue(); - final Vector3f oldValue = getPropertyValue() == null ? Vector3f.ZERO : getPropertyValue(); - final Vector3f newValue = new Vector3f(); + var oldValue = getPropertyValue() == null ? Vector3f.ZERO : getPropertyValue(); + var newValue = new Vector3f(); newValue.set(x, y, z); changed(newValue, oldValue.clone()); diff --git a/src/main/java/com/ss/editor/ui/util/UiUtils.java b/src/main/java/com/ss/editor/ui/util/UiUtils.java index b51d828b..c4d3e927 100644 --- a/src/main/java/com/ss/editor/ui/util/UiUtils.java +++ b/src/main/java/com/ss/editor/ui/util/UiUtils.java @@ -17,7 +17,6 @@ import com.ss.rlib.util.StringUtils; import com.ss.rlib.util.array.Array; import com.ss.rlib.util.array.ArrayFactory; -import javafx.beans.property.BooleanProperty; import javafx.beans.property.BooleanPropertyBase; import javafx.beans.value.ChangeListener; import javafx.collections.ObservableList; @@ -40,6 +39,7 @@ import java.io.File; import java.nio.file.Path; +import java.util.Arrays; import java.util.List; import java.util.Objects; import java.util.Set; @@ -75,9 +75,9 @@ public abstract class UiUtils { * @param controls the controls. */ @FxThread - public static void addFocusBinding(@NotNull final Pane pane, @NotNull final Control... controls) { + public static void addFocusBinding(@NotNull Pane pane, @NotNull Control... controls) { - final BooleanProperty focused = new BooleanPropertyBase(false) { + var focused = new BooleanPropertyBase(true) { @Override public void invalidated() { @@ -95,21 +95,12 @@ public String getName() { } }; - final ChangeListener listener = (observable, oldValue, newValue) -> { - - boolean result = newValue; - - if (!result) { - for (final Control control : controls) { - result = control.isFocused(); - if (result) break; - } - } - - focused.setValue(result); + ChangeListener listener = (observable, oldValue, newValue) -> { + focused.setValue(newValue || Arrays.stream(controls) + .anyMatch(Node::isFocused)); }; - for (final Control control : controls) { + for (var control : controls) { control.focusedProperty().addListener(listener); } } diff --git a/src/main/resources/ui/css/custom_classes.css b/src/main/resources/ui/css/custom_classes.css index 588642d4..0c775295 100644 --- a/src/main/resources/ui/css/custom_classes.css +++ b/src/main/resources/ui/css/custom_classes.css @@ -726,7 +726,7 @@ } .abstract-param-control > .hbox { - -fx-spacing: 2px; + -fx-spacing: 2px; } .abstract-param-control-multi-value-container { From 3b635803a1046fa3e23458d4dc6134e552c321bc Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Wed, 11 Apr 2018 18:57:08 +0300 Subject: [PATCH 26/49] refactoring. --- .../ui/control/property/PropertyControl.java | 27 ++ .../builder/PropertyBuilderRegistry.java | 16 +- .../builder/impl/AbstractPropertyBuilder.java | 26 +- .../impl/DefaultControlPropertyBuilder.java | 32 +-- .../EditableModelObjectPropertyBuilder.java | 70 ++--- .../impl/EditableObjectPropertyBuilder.java | 61 +++-- .../builder/impl/MaterialPropertyBuilder.java | 37 +-- .../builder/impl/SpatialPropertyBuilder.java | 245 ++++++------------ .../property/impl/FloatPropertyControl.java | 60 +++-- .../property/impl/StringPropertyControl.java | 30 ++- 10 files changed, 310 insertions(+), 294 deletions(-) diff --git a/src/main/java/com/ss/editor/ui/control/property/PropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/PropertyControl.java index 7fa7001a..336c455a 100644 --- a/src/main/java/com/ss/editor/ui/control/property/PropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/PropertyControl.java @@ -272,6 +272,33 @@ protected boolean hasEditObject() { protected void reload() { } + /** + * Return true if this control has not saved changes. + * + * @return true if this control has not saved changes. + */ + public boolean isDirty() { + return true; + } + + /** + * Apply changes from control to the edited object on lost focus. + * + * @param focused the focused state. + */ + protected void applyOnLostFocus(boolean focused) { + if (!isIgnoreListener() && !focused && isDirty()) { + apply(); + } + } + + /** + * Apply changes from control to the edit object. + */ + @FxThread + protected void apply() { + } + /** * Synchronize value from the edit object. */ diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/PropertyBuilderRegistry.java b/src/main/java/com/ss/editor/ui/control/property/builder/PropertyBuilderRegistry.java index 61b9198c..1d9bc820 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/PropertyBuilderRegistry.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/PropertyBuilderRegistry.java @@ -64,7 +64,7 @@ private PropertyBuilderRegistry() { * @param builder the property builder. */ @FromAnyThread - public void register(@NotNull final PropertyBuilder builder) { + public void register(@NotNull PropertyBuilder builder) { builders.add(builder); builders.sort(PropertyBuilder::compareTo); } @@ -75,7 +75,7 @@ public void register(@NotNull final PropertyBuilder builder) { * @param filter the property builder filter. */ @FromAnyThread - public void register(@NotNull final PropertyBuilderFilter filter) { + public void register(@NotNull PropertyBuilderFilter filter) { filters.add(filter); } @@ -88,14 +88,18 @@ public void register(@NotNull final PropertyBuilderFilter filter) { * @param changeConsumer the consumer to work between controls and editor. */ @FxThread - public void buildFor(@NotNull final Object object, @Nullable final Object parent, @NotNull final VBox container, - @NotNull final ChangeConsumer changeConsumer) { + public void buildFor( + @NotNull Object object, + @Nullable Object parent, + @NotNull VBox container, + @NotNull ChangeConsumer changeConsumer + ) { - for (final PropertyBuilder builder : builders) { + for (var builder : builders) { boolean needSkip = false; - for (final PropertyBuilderFilter filter : filters) { + for (var filter : filters) { if (filter.skip(builder, object, parent)) { needSkip = true; break; diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/AbstractPropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/AbstractPropertyBuilder.java index 66ab2f3e..10784e17 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/AbstractPropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/AbstractPropertyBuilder.java @@ -25,14 +25,18 @@ public abstract class AbstractPropertyBuilder implemen @NotNull private final Class type; - protected AbstractPropertyBuilder(@NotNull final Class type) { + protected AbstractPropertyBuilder(@NotNull Class type) { this.type = type; } @Override @FxThread - public void buildFor(@NotNull final Object object, @Nullable final Object parent, @NotNull final VBox container, - @NotNull final ChangeConsumer changeConsumer) { + public void buildFor( + @NotNull Object object, + @Nullable Object parent, + @NotNull VBox container, + @NotNull ChangeConsumer changeConsumer + ) { if (type.isInstance(changeConsumer)) { buildForImpl(object, parent, container, type.cast(changeConsumer)); @@ -48,8 +52,12 @@ public void buildFor(@NotNull final Object object, @Nullable final Object parent * @param changeConsumer the change consumer. */ @FxThread - protected void buildForImpl(@NotNull final Object object, @Nullable final Object parent, - @NotNull final VBox container, @NotNull final C changeConsumer) { + protected void buildForImpl( + @NotNull Object object, + @Nullable Object parent, + @NotNull VBox container, + @NotNull C changeConsumer + ) { } /** @@ -58,9 +66,11 @@ protected void buildForImpl(@NotNull final Object object, @Nullable final Object * @param pane the container of the line. */ @FxThread - protected void buildSplitLine(@NotNull final Pane pane) { - final HBox line = new HBox(); - final VBox container = new VBox(line); + protected void buildSplitLine(@NotNull Pane pane) { + + var line = new HBox(); + var container = new VBox(line); + FXUtils.addClassTo(line, CssClasses.DEF_HBOX); FXUtils.addClassTo(container, CssClasses.ABSTRACT_PARAM_CONTROL_CONTAINER_SPLIT_LINE); FXUtils.addToPane(container, pane); diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/DefaultControlPropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/DefaultControlPropertyBuilder.java index 57386295..a487bea3 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/DefaultControlPropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/DefaultControlPropertyBuilder.java @@ -48,9 +48,9 @@ private DefaultControlPropertyBuilder() { } @FxThread - protected @NotNull List> getProperties(@NotNull final AbstractControl control) { + protected @NotNull List> getProperties(@NotNull AbstractControl control) { - final List> result = new ArrayList<>(); + var result = new ArrayList>(); result.add(new SimpleProperty<>(BOOLEAN, Messages.MODEL_PROPERTY_IS_ENABLED, control, AbstractControl::isEnabled, AbstractControl::setEnabled)); @@ -58,9 +58,9 @@ private DefaultControlPropertyBuilder() { } @FxThread - protected @NotNull List> getProperties(@NotNull final PhysicsControl control) { + protected @NotNull List> getProperties(@NotNull PhysicsControl control) { - final List> result = new ArrayList<>(); + var result = new ArrayList>(); result.add(new SimpleProperty<>(BOOLEAN, Messages.MODEL_PROPERTY_IS_ENABLED, control, PhysicsControl::isEnabled, PhysicsControl::setEnabled)); @@ -69,13 +69,13 @@ private DefaultControlPropertyBuilder() { @Override @FxThread - protected @Nullable List> getProperties(@NotNull final Object object) { + protected @Nullable List> getProperties(@NotNull Object object) { - final List> properties = new ArrayList<>(); + var properties = new ArrayList>(); if (object instanceof VehicleWheel) { - final VehicleWheel control = (VehicleWheel) object; + var control = (VehicleWheel) object; properties.add(new SimpleProperty<>(BOOLEAN, Messages.MODEL_PROPERTY_IS_FRONT, control, VehicleWheel::isFrontWheel, VehicleWheel::setFrontWheel)); @@ -116,7 +116,7 @@ private DefaultControlPropertyBuilder() { } else if (object instanceof AbstractCinematicEvent) { - final AbstractCinematicEvent control = (AbstractCinematicEvent) object; + var control = (AbstractCinematicEvent) object; properties.add(new SimpleProperty<>(ENUM, Messages.MODEL_PROPERTY_LOOP_MODE, control, AbstractCinematicEvent::getLoopMode, AbstractCinematicEvent::setLoopMode)); @@ -129,7 +129,7 @@ private DefaultControlPropertyBuilder() { } else if (object instanceof Animation) { - final Animation animation = (Animation) object; + var animation = (Animation) object; properties.add(new SimpleProperty<>(FLOAT, Messages.MODEL_PROPERTY_LENGTH, animation, Animation::getLength)); @@ -137,7 +137,7 @@ private DefaultControlPropertyBuilder() { if (object instanceof MotionEvent) { - final MotionEvent control = (MotionEvent) object; + var control = (MotionEvent) object; properties.add(new SimpleProperty<>(ENUM, Messages.MODEL_PROPERTY_DIRECTION_TYPE, control, MotionEvent::getDirectionType, MotionEvent::setDirectionType)); @@ -161,7 +161,7 @@ private DefaultControlPropertyBuilder() { if (object instanceof LightControl) { - final LightControl control = (LightControl) object; + var control = (LightControl) object; properties.add(new SimpleProperty<>(ENUM, Messages.MODEL_PROPERTY_DIRECTION_TYPE, control, LightControl::getControlDir, LightControl::setControlDir)); @@ -170,7 +170,7 @@ private DefaultControlPropertyBuilder() { } else if (object instanceof BetterCharacterControl) { - final BetterCharacterControl control = (BetterCharacterControl) object; + var control = (BetterCharacterControl) object; properties.add(new SimpleProperty<>(VECTOR_3F, Messages.MODEL_PROPERTY_GRAVITY, control, BetterCharacterControl::getGravity, BetterCharacterControl::setGravity)); @@ -189,21 +189,21 @@ private DefaultControlPropertyBuilder() { } else if (object instanceof RigidBodyControl) { - final RigidBodyControl control = (RigidBodyControl) object; + var control = (RigidBodyControl) object; properties.add(new SimpleProperty<>(BOOLEAN, Messages.MODEL_PROPERTY_IS_KINEMATIC_SPATIAL, control, RigidBodyControl::isKinematicSpatial, RigidBodyControl::setKinematicSpatial)); } else if (object instanceof SkeletonControl) { - final SkeletonControl control = (SkeletonControl) object; + var control = (SkeletonControl) object; properties.add(new SimpleProperty<>(BOOLEAN, Messages.MODEL_PROPERTY_IS_HARDWARE_SKINNING_PREFERRED, control, SkeletonControl::isHardwareSkinningPreferred, SkeletonControl::setHardwareSkinningPreferred)); } else if (object instanceof VehicleControl) { - final VehicleControl control = (VehicleControl) object; + var control = (VehicleControl) object; properties.add(new SimpleProperty<>(BOOLEAN, Messages.MODEL_PROPERTY_IS_APPLY_PHYSICS_LOCAL, control, VehicleControl::isApplyPhysicsLocal, VehicleControl::setApplyPhysicsLocal)); @@ -212,7 +212,7 @@ private DefaultControlPropertyBuilder() { if (object instanceof PhysicsRigidBody) { - final PhysicsRigidBody control = (PhysicsRigidBody) object; + var control = (PhysicsRigidBody) object; properties.add(new SimpleProperty<>(BOOLEAN, Messages.MODEL_PROPERTY_IS_KINEMATIC, control, PhysicsRigidBody::isKinematic, PhysicsRigidBody::setKinematic)); diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/EditableModelObjectPropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/EditableModelObjectPropertyBuilder.java index 1bbc8ce1..36e729ba 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/EditableModelObjectPropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/EditableModelObjectPropertyBuilder.java @@ -25,81 +25,85 @@ */ public class EditableModelObjectPropertyBuilder extends EditableObjectPropertyBuilder { - protected EditableModelObjectPropertyBuilder(@NotNull final Class type) { + protected EditableModelObjectPropertyBuilder(@NotNull Class type) { super(type); } @Override @FxThread - protected void buildFor(@NotNull final VBox container, @NotNull final ModelChangeConsumer changeConsumer, - @NotNull final EditableProperty description) { + protected void buildFor( + @NotNull VBox container, + @NotNull ModelChangeConsumer changeConsumer, + @NotNull EditableProperty description + ) { + super.buildFor(container, changeConsumer, description); - final EditablePropertyType type = description.getType(); + var type = description.getType(); switch (type) { case DIRECTION_LIGHT_FROM_SCENE: { - final EditableProperty property = cast(description); - final DirectionalLight value = property.getValue(); + EditableProperty property = cast(description); - final LightElementModelPropertyControl> propertyControl = - new LightElementModelPropertyControl<>(DirectionalLight.class, value, property.getName(), changeConsumer); + var value = property.getValue(); + var propertyControl = new LightElementModelPropertyControl>( + DirectionalLight.class, value, property.getName(), changeConsumer); addControl(container, property, propertyControl); break; } case AMBIENT_LIGHT_FROM_SCENE: { - final EditableProperty property = cast(description); - final AmbientLight value = property.getValue(); + EditableProperty property = cast(description); - final LightElementModelPropertyControl> propertyControl = - new LightElementModelPropertyControl<>(AmbientLight.class, value, property.getName(), changeConsumer); + var value = property.getValue(); + var propertyControl = new LightElementModelPropertyControl>( + AmbientLight.class, value, property.getName(), changeConsumer); addControl(container, property, propertyControl); break; } case POINT_LIGHT_FROM_SCENE: { - final EditableProperty property = cast(description); - final PointLight value = property.getValue(); + EditableProperty property = cast(description); - final LightElementModelPropertyControl> propertyControl = - new LightElementModelPropertyControl<>(PointLight.class, value, property.getName(), changeConsumer); + var value = property.getValue(); + var propertyControl = new LightElementModelPropertyControl>( + PointLight.class, value, property.getName(), changeConsumer); addControl(container, property, propertyControl); break; } case LIGHT_FROM_SCENE: { - final EditableProperty property = cast(description); - final Light value = property.getValue(); + EditableProperty property = cast(description); - final LightElementModelPropertyControl> propertyControl = - new LightElementModelPropertyControl<>(Light.class, value, property.getName(), changeConsumer); + var value = property.getValue(); + var propertyControl = new LightElementModelPropertyControl>( + Light.class, value, property.getName(), changeConsumer); addControl(container, property, propertyControl); break; } case SPATIAL_FROM_SCENE: { - final EditableProperty property = cast(description); - final Spatial value = property.getValue(); + EditableProperty property = cast(description); - final SpatialElementModelPropertyControl> propertyControl = - new SpatialElementModelPropertyControl<>(Spatial.class, value, property.getName(), changeConsumer); + var value = property.getValue(); + var propertyControl = new SpatialElementModelPropertyControl>( + Spatial.class, value, property.getName(), changeConsumer); addControl(container, property, propertyControl); break; } case NODE_FROM_SCENE: { - final EditableProperty property = cast(description); - final Node value = property.getValue(); + EditableProperty property = cast(description); - final SpatialElementModelPropertyControl> propertyControl = - new SpatialElementModelPropertyControl<>(Node.class, value, property.getName(), changeConsumer); + var value = property.getValue(); + var propertyControl = new SpatialElementModelPropertyControl>( + Node.class, value, property.getName(), changeConsumer); addControl(container, property, propertyControl); break; @@ -110,16 +114,16 @@ protected void buildFor(@NotNull final VBox container, @NotNull final ModelChang return; } - final SceneChangeConsumer consumer = (SceneChangeConsumer) changeConsumer; + var consumer = (SceneChangeConsumer) changeConsumer; switch (type) { case FILTER_FROM_SCENE: { - final EditableProperty property = cast(description); - final Filter value = property.getValue(); + EditableProperty property = cast(description); - final FilterElementModelPropertyControl> propertyControl = - new FilterElementModelPropertyControl<>(value, property.getName(), consumer); + var value = property.getValue(); + var propertyControl = new FilterElementModelPropertyControl>( + value, property.getName(), consumer); addControl(container, property, propertyControl); break; diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/EditableObjectPropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/EditableObjectPropertyBuilder.java index 1e5ab24e..9865d820 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/EditableObjectPropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/EditableObjectPropertyBuilder.java @@ -1,10 +1,8 @@ package com.ss.editor.ui.control.property.builder.impl; import static com.ss.rlib.util.ObjectUtils.notNull; -import com.jme3.math.ColorRGBA; -import com.jme3.math.Vector2f; -import com.jme3.math.Vector3f; -import com.jme3.math.Vector4f; + +import com.jme3.math.*; import com.jme3.texture.Texture2D; import com.ss.editor.annotation.FxThread; import com.ss.editor.extension.property.EditableProperty; @@ -29,30 +27,37 @@ */ public class EditableObjectPropertyBuilder extends AbstractPropertyBuilder { - protected EditableObjectPropertyBuilder(@NotNull final Class type) { + protected EditableObjectPropertyBuilder(@NotNull Class type) { super(type); } @Override @FxThread - protected void buildForImpl(@NotNull final Object object, @Nullable final Object parent, - @NotNull final VBox container, @NotNull final C changeConsumer) { - - final List> properties = getProperties(object, parent, changeConsumer); + protected void buildForImpl( + @NotNull Object object, + @Nullable Object parent, + @NotNull VBox container, + @NotNull C changeConsumer + ) { + + var properties = getProperties(object, parent, changeConsumer); if (properties == null || properties.isEmpty()) { return; } - for (final EditableProperty description : properties) { + for (var description : properties) { buildFor(container, changeConsumer, description); } } @FxThread - protected void buildFor(@NotNull final VBox container, @NotNull final C changeConsumer, - @NotNull final EditableProperty description) { + protected void buildFor( + @NotNull VBox container, + @NotNull C changeConsumer, + @NotNull EditableProperty description + ) { - final EditablePropertyType type = description.getType(); + var type = description.getType(); switch (type) { case BOOLEAN: { @@ -158,6 +163,17 @@ protected void buildFor(@NotNull final VBox container, @NotNull final C changeCo addControl(container, property, propertyControl); break; } + case QUATERNION: { + + EditableProperty property = cast(description); + var currentValue = property.getValue(); + + var propertyControl = new QuaternionPropertyControl>( + currentValue, property.getName(), changeConsumer); + + addControl(container, property, propertyControl); + break; + } case ENUM: { final EditableProperty, ?> property = cast(description); @@ -200,8 +216,11 @@ protected void buildFor(@NotNull final VBox container, @NotNull final C changeCo * @param propertyControl the property control. */ @FxThread - protected void addControl(@NotNull final VBox container, @NotNull final EditableProperty property, - @NotNull final PropertyControl, T> propertyControl) { + protected void addControl( + @NotNull VBox container, + @NotNull EditableProperty property, + @NotNull PropertyControl, T> propertyControl + ) { propertyControl.setApplyHandler(EditableProperty::setValue); propertyControl.setSyncHandler(EditableProperty::getValue); @@ -220,9 +239,11 @@ protected void addControl(@NotNull final VBox container, @NotNull final Edit * @return the list of properties or null. */ @FxThread - protected @Nullable List> getProperties(@NotNull final Object object, - @Nullable final Object parent, - @NotNull final C changeConsumer) { + protected @Nullable List> getProperties( + @NotNull Object object, + @Nullable Object parent, + @NotNull C changeConsumer + ) { return getProperties(object); } @@ -233,12 +254,12 @@ protected void addControl(@NotNull final VBox container, @NotNull final Edit * @return the list of properties or null. */ @FxThread - protected @Nullable List> getProperties(@NotNull final Object object) { + protected @Nullable List> getProperties(@NotNull Object object) { return null; } @FxThread - protected @NotNull EditableProperty cast(@NotNull final EditableProperty property) { + protected @NotNull EditableProperty cast(@NotNull EditableProperty property) { return ClassUtils.unsafeCast(property); } } diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/MaterialPropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/MaterialPropertyBuilder.java index 50eee8c0..3e81954f 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/MaterialPropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/MaterialPropertyBuilder.java @@ -36,11 +36,6 @@ public class MaterialPropertyBuilder extends EditableObjectPropertyBuilder { private static final ObjectDictionary SIZE_MAP = DictionaryFactory.newObjectDictionary(); static { - - for (final VarType varType : VarType.values()) { - SIZE_MAP.put(varType, 0); - } - SIZE_MAP.put(VarType.Texture2D, -1); SIZE_MAP.put(VarType.Vector3, -2); SIZE_MAP.put(VarType.Boolean, 3); @@ -50,9 +45,9 @@ public class MaterialPropertyBuilder extends EditableObjectPropertyBuilder { @NotNull protected static final Comparator MAT_PARAM_COMPARATOR = (first, second) -> { - final VarType firstType = first.getVarType(); - final VarType secondType = second.getVarType(); - return SIZE_MAP.get(secondType) - SIZE_MAP.get(firstType); + var firstType = first.getVarType(); + var secondType = second.getVarType(); + return SIZE_MAP.get(secondType, () -> 0) - SIZE_MAP.get(firstType, () -> 0); }; /** @@ -71,17 +66,16 @@ protected MaterialPropertyBuilder() { @Override @FxThread - protected @Nullable List> getProperties(@NotNull final Object object) { + protected @Nullable List> getProperties(@NotNull Object object) { if(!(object instanceof Material)) { return null; } - final Material material = (Material) object; - final MaterialDef definition = material.getMaterialDef(); + var material = (Material) object; + var definition = material.getMaterialDef(); - final Collection materialParams = definition.getMaterialParams(); - return materialParams.stream() + return definition.getMaterialParams().stream() .sorted(MAT_PARAM_COMPARATOR) .map(param -> convert(param, material)) .filter(Objects::nonNull) @@ -96,17 +90,15 @@ protected MaterialPropertyBuilder() { * @return the editable property or null. */ @FxThread - private @Nullable EditableProperty convert(@NotNull final MatParam param, - @NotNull final Material material) { + private @Nullable EditableProperty convert(@NotNull MatParam param, @NotNull Material material) { - final EditablePropertyType propertyType = convert(param.getVarType()); + var propertyType = convert(param.getVarType()); if (propertyType == null) { return null; } return new SimpleProperty<>(propertyType, param.getName(), 0.1F, material, - object -> getParamValue(param, object), - (object, newValue) -> applyParam(param, object, newValue)); + object -> getParamValue(param, object), (object, newValue) -> applyParam(param, object, newValue)); } /** @@ -117,8 +109,7 @@ protected MaterialPropertyBuilder() { * @param newValue the new value. */ @FxThread - protected void applyParam(@NotNull final MatParam param, @NotNull final Material material, - @Nullable final Object newValue) { + protected void applyParam(@NotNull MatParam param, @NotNull Material material, @Nullable Object newValue) { if (newValue == null) { material.clearParam(param.getName()); @@ -135,8 +126,8 @@ protected void applyParam(@NotNull final MatParam param, @NotNull final Material * @return the relevant value. */ @FxThread - protected @Nullable Object getParamValue(@NotNull final MatParam param, @NotNull final Material material) { - final MatParam currentParam = material.getParam(param.getName()); + protected @Nullable Object getParamValue(@NotNull MatParam param, @NotNull Material material) { + var currentParam = material.getParam(param.getName()); return currentParam == null ? null : currentParam.getValue(); } @@ -147,7 +138,7 @@ protected void applyParam(@NotNull final MatParam param, @NotNull final Material * @return the editable property type or null. */ @FxThread - protected @Nullable EditablePropertyType convert(@NotNull final VarType varType) { + protected @Nullable EditablePropertyType convert(@NotNull VarType varType) { switch (varType) { case Boolean: diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/SpatialPropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/SpatialPropertyBuilder.java index c5ae947a..77f01526 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/SpatialPropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/SpatialPropertyBuilder.java @@ -1,6 +1,9 @@ package com.ss.editor.ui.control.property.builder.impl; +import static com.ss.editor.extension.property.EditablePropertyType.*; import static com.ss.editor.part3d.editor.impl.scene.AbstractSceneEditor3DPart.KEY_LOADED_MODEL; + +import com.jme3.bullet.objects.VehicleWheel; import com.jme3.math.ColorRGBA; import com.jme3.math.Vector2f; import com.jme3.math.Vector3f; @@ -11,6 +14,10 @@ import com.ss.editor.Messages; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; +import com.ss.editor.extension.property.EditableProperty; +import com.ss.editor.extension.property.EditablePropertyType; +import com.ss.editor.extension.property.SeparatorProperty; +import com.ss.editor.extension.property.SimpleProperty; import com.ss.editor.extension.scene.SceneLayer; import com.ss.editor.extension.scene.SceneNode; import com.ss.editor.model.undo.editor.ModelChangeConsumer; @@ -24,24 +31,19 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + /** * The implementation of the {@link PropertyBuilder} to build property controls for {@link Spatial} objects. * * @author JavaSaBr */ -public class SpatialPropertyBuilder extends AbstractPropertyBuilder { +public class SpatialPropertyBuilder extends EditableModelObjectPropertyBuilder { public static final int PRIORITY = 1; - @NotNull - private static final CullHint[] CULL_HINTS = CullHint.values(); - - @NotNull - private static final ShadowMode[] SHADOW_MODES = ShadowMode.values(); - - @NotNull - private static final Bucket[] BUCKETS = Bucket.values(); - @NotNull private static final PropertyBuilder INSTANCE = new SpatialPropertyBuilder(); @@ -55,102 +57,53 @@ private SpatialPropertyBuilder() { } @Override - @FxThread - protected void buildForImpl( + protected @Nullable List> getProperties( @NotNull Object object, @Nullable Object parent, - @NotNull VBox container, @NotNull ModelChangeConsumer changeConsumer ) { - if (!(object instanceof Spatial)) { - return; + if(!(object instanceof Spatial)) { + return null; } + var properties = new ArrayList>(); var spatial = (Spatial) object; - var cullHint = spatial.getLocalCullHint(); - var shadowMode = spatial.getLocalShadowMode(); - var queueBucket = spatial.getLocalQueueBucket(); - - if (changeConsumer instanceof SceneChangeConsumer) { - - var layer = SceneLayer.getLayer(spatial); - var propertyControl = new LayerModelPropertyControl(layer, (SceneChangeConsumer) changeConsumer); - propertyControl.setEditObject(spatial); - - FXUtils.addToPane(propertyControl, container); - } - - EnumPropertyControl cullHintControl = - new EnumPropertyControl<>(cullHint, Messages.MODEL_PROPERTY_CULL_HINT, changeConsumer, CULL_HINTS); - cullHintControl.setApplyHandler(Spatial::setCullHint); - cullHintControl.setSyncHandler(Spatial::getLocalCullHint); - cullHintControl.setEditObject(spatial); - EnumPropertyControl shadowModeControl = - new EnumPropertyControl<>(shadowMode, Messages.MODEL_PROPERTY_SHADOW_MODE, changeConsumer, SHADOW_MODES); - shadowModeControl.setApplyHandler(Spatial::setShadowMode); - shadowModeControl.setSyncHandler(Spatial::getLocalShadowMode); - shadowModeControl.setEditObject(spatial); + properties.add(new SimpleProperty<>(ENUM, Messages.MODEL_PROPERTY_CULL_HINT, spatial, + Spatial::getCullHint, Spatial::setCullHint)); + properties.add(new SimpleProperty<>(ENUM, Messages.MODEL_PROPERTY_SHADOW_MODE, spatial, + Spatial::getShadowMode, Spatial::setShadowMode)); + properties.add(new SimpleProperty<>(ENUM, Messages.MODEL_PROPERTY_QUEUE_BUCKET, spatial, + Spatial::getLocalQueueBucket, Spatial::setQueueBucket)); - EnumPropertyControl queueBucketControl = - new EnumPropertyControl<>(queueBucket, Messages.MODEL_PROPERTY_QUEUE_BUCKET, changeConsumer, BUCKETS); - queueBucketControl.setApplyHandler(Spatial::setQueueBucket); - queueBucketControl.setSyncHandler(Spatial::getLocalQueueBucket); - queueBucketControl.setEditObject(spatial); + if (canEditTransformation(spatial)) { - FXUtils.addToPane(cullHintControl, container); - FXUtils.addToPane(shadowModeControl, container); - FXUtils.addToPane(queueBucketControl, container); + properties.add(SeparatorProperty.getInstance()); - if (canEditTransformation(spatial)) { + properties.add(new SimpleProperty<>(VECTOR_3F, Messages.MODEL_PROPERTY_LOCATION, spatial, + Spatial::getLocalTranslation, Spatial::setLocalTranslation)); + properties.add(new SimpleProperty<>(VECTOR_3F, Messages.MODEL_PROPERTY_SCALE, spatial, + Spatial::getLocalScale, Spatial::setLocalScale)); + properties.add(new SimpleProperty<>(QUATERNION, Messages.MODEL_PROPERTY_ROTATION, spatial, + Spatial::getLocalRotation, Spatial::setLocalRotation)); - buildSplitLine(container); - - var location = spatial.getLocalTranslation().clone(); - var scale = spatial.getLocalScale().clone(); - var rotation = spatial.getLocalRotation().clone(); - - Vector3FPropertyControl locationControl = - new Vector3FPropertyControl<>(location, Messages.MODEL_PROPERTY_LOCATION, changeConsumer); - locationControl.setApplyHandler(Spatial::setLocalTranslation); - locationControl.setSyncHandler(Spatial::getLocalTranslation); - locationControl.setEditObject(spatial); - - Vector3FPropertyControl scaleControl = - new Vector3FPropertyControl<>(scale, Messages.MODEL_PROPERTY_SCALE, changeConsumer); - scaleControl.setApplyHandler(Spatial::setLocalScale); - scaleControl.setSyncHandler(Spatial::getLocalScale); - scaleControl.setEditObject(spatial); - - QuaternionPropertyControl rotationControl = - new QuaternionPropertyControl<>(rotation, Messages.MODEL_PROPERTY_ROTATION, changeConsumer); - rotationControl.setApplyHandler(Spatial::setLocalRotation); - rotationControl.setSyncHandler(Spatial::getLocalRotation); - rotationControl.setEditObject(spatial); - - FXUtils.addToPane(locationControl, container); - FXUtils.addToPane(scaleControl, container); - FXUtils.addToPane(rotationControl, container); } var userDataKeys = spatial.getUserDataKeys(); if (userDataKeys.isEmpty()) { - return; + return properties; } - var count = 0; - - for (var key : userDataKeys) { - if (isNeedSkip(key)) continue; - count++; - } + var count = userDataKeys.stream() + .filter(s -> !isNeedSkip(s)) + .count(); if (count < 1) { - return; + return properties; } - buildSplitLine(container); + properties.add(SeparatorProperty.getInstance()); final Array sortedKeys = ArrayFactory.newSortedArray(String.class); sortedKeys.addAll(userDataKeys); @@ -163,98 +116,58 @@ protected void buildForImpl( var data = spatial.getUserData(key); - if (data instanceof Float) { - - var value = (Float) data; - - var control = new FloatPropertyControl(value, key, changeConsumer); - control.setApplyHandler((sp, newValue) -> sp.setUserData(key, newValue)); - control.setSyncHandler(sp -> sp.getUserData(key)); - control.setEditObject(spatial); - - FXUtils.addToPane(control, container); - - } else if (data instanceof Integer) { - - final Integer value = (Integer) data; - - final IntegerPropertyControl control = - new IntegerPropertyControl<>(value, key, changeConsumer); - control.setApplyHandler((sp, newValue) -> sp.setUserData(key, newValue)); - control.setSyncHandler(sp -> sp.getUserData(key)); - control.setEditObject(spatial); - - FXUtils.addToPane(control, container); - - } else if (data instanceof Boolean) { - - final Boolean value = (Boolean) data; - - final BooleanPropertyControl control = - new BooleanPropertyControl<>(value, key, changeConsumer); - control.setApplyHandler((sp, newValue) -> sp.setUserData(key, newValue)); - control.setSyncHandler(sp -> sp.getUserData(key)); - control.setEditObject(spatial); - - FXUtils.addToPane(control, container); - - } else if (data instanceof Vector3f) { - - final Vector3f value = (Vector3f) data; - - final Vector3FPropertyControl control = - new Vector3FPropertyControl<>(value, key, changeConsumer); - control.setApplyHandler((sp, newValue) -> sp.setUserData(key, newValue)); - control.setSyncHandler(sp -> sp.getUserData(key)); - control.setEditObject(spatial); - - FXUtils.addToPane(control, container); - - } else if (data instanceof Vector2f) { - - final Vector2f value = (Vector2f) data; - - final Vector2FPropertyControl control = - new Vector2FPropertyControl<>(value, key, changeConsumer); - control.setApplyHandler((sp, newValue) -> sp.setUserData(key, newValue)); - control.setSyncHandler(sp -> sp.getUserData(key)); - control.setEditObject(spatial); - - FXUtils.addToPane(control, container); - - } else if (data instanceof ColorRGBA) { - - final ColorRGBA value = (ColorRGBA) data; + properties.add(new SimpleProperty<>(getUserDataType(data), key, spatial, + sp -> sp.getUserData(key), (sp, val) -> sp.setUserData(key, val))); + } - final ColorPropertyControl control = - new ColorPropertyControl<>(value, key, changeConsumer); - control.setApplyHandler((sp, newValue) -> sp.setUserData(key, newValue)); - control.setSyncHandler(sp -> sp.getUserData(key)); - control.setEditObject(spatial); + return properties; + } - FXUtils.addToPane(control, container); + private @NotNull EditablePropertyType getUserDataType(@NotNull Object value) { + + if (value instanceof Float) { + return EditablePropertyType.FLOAT; + } else if (value instanceof Integer) { + return EditablePropertyType.INTEGER; + } else if (value instanceof Boolean) { + return EditablePropertyType.BOOLEAN; + } else if (value instanceof Vector3f) { + return EditablePropertyType.VECTOR_3F; + } else if (value instanceof Vector2f) { + return EditablePropertyType.VECTOR_2F; + } else if (value instanceof ColorRGBA) { + return EditablePropertyType.COLOR; + } else if (value instanceof String) { + return EditablePropertyType.STRING; + } - } else if (data instanceof String) { + return EditablePropertyType.READ_ONLY_STRING; + } - final String value = (String) data; + @Override + @FxThread + protected void buildForImpl( + @NotNull Object object, + @Nullable Object parent, + @NotNull VBox container, + @NotNull ModelChangeConsumer changeConsumer + ) { + super.buildForImpl(object, parent, container, changeConsumer); - final StringPropertyControl control = - new StringPropertyControl<>(value, key, changeConsumer); - control.setApplyHandler((sp, newValue) -> sp.setUserData(key, newValue)); - control.setSyncHandler(sp -> sp.getUserData(key)); - control.setEditObject(spatial); + if (!(object instanceof Spatial)) { + return; + } - FXUtils.addToPane(control, container); + var spatial = (Spatial) object; - } else { + if (changeConsumer instanceof SceneChangeConsumer) { - final DefaultSinglePropertyControl control = - new DefaultSinglePropertyControl<>(data, key, changeConsumer); - control.setSyncHandler(sp -> sp.getUserData(key)); - control.setEditObject(spatial); + // TODO add an editable property type + var layer = SceneLayer.getLayer(spatial); + var propertyControl = new LayerModelPropertyControl(layer, (SceneChangeConsumer) changeConsumer); + propertyControl.setEditObject(spatial); - FXUtils.addToPane(control, container); - } + FXUtils.addToPane(propertyControl, container); } } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/FloatPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/FloatPropertyControl.java index d3d0f30f..ad436e6c 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/FloatPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/FloatPropertyControl.java @@ -30,53 +30,63 @@ public class FloatPropertyControl extends PropertyC @Nullable private FloatTextField valueField; - public FloatPropertyControl(@Nullable final Float propertyValue, @NotNull final String propertyName, - @NotNull final C changeConsumer) { + public FloatPropertyControl( + @Nullable Float propertyValue, + @NotNull String propertyName, + @NotNull C changeConsumer + ) { + super(propertyValue, propertyName, changeConsumer); } - public FloatPropertyControl(@Nullable final Float propertyValue, @NotNull final String propertyName, - @NotNull final C changeConsumer, - @Nullable final SixObjectConsumer> changeHandler) { + public FloatPropertyControl( + @Nullable Float propertyValue, + @NotNull String propertyName, + @NotNull C changeConsumer, + @Nullable SixObjectConsumer> changeHandler + ) { + super(propertyValue, propertyName, changeConsumer, changeHandler); } @Override @FxThread - public void changeControlWidthPercent(final double controlWidthPercent) { + public void changeControlWidthPercent(double controlWidthPercent) { super.changeControlWidthPercent(controlWidthPercent); - final FloatTextField valueField = getValueField(); + var valueField = getValueField(); valueField.prefWidthProperty().unbind(); valueField.prefWidthProperty().bind(widthProperty().multiply(controlWidthPercent)); } @Override @FxThread - protected void createComponents(@NotNull final HBox container) { + protected void createComponents(@NotNull HBox container) { super.createComponents(container); valueField = new FloatTextField(); valueField.addChangeListener((observable, oldValue, newValue) -> updateValue()); valueField.prefWidthProperty() - .bind(widthProperty().multiply(CONTROL_WIDTH_PERCENT)); + .bind(widthProperty().multiply(CONTROL_WIDTH_PERCENT)); + valueField.focusedProperty() + .addListener((observable, oldValue, newValue) -> applyOnLostFocus(newValue)); FXUtils.addClassTo(valueField, CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); FXUtils.addToPane(valueField, container); } /** - * Sets scroll power. + * Set the scroll power. * * @param scrollPower the scroll power. */ @FxThread - public void setScrollPower(final float scrollPower) { + public void setScrollPower(float scrollPower) { getValueField().setScrollPower(scrollPower); } /** - * Gets scroll power. + * Get the scroll power. * * @return the scroll power. */ @@ -86,13 +96,13 @@ public float getScrollPower() { } /** - * Set value limits for this field. + * Set the value limits for this field. * * @param min the min value. * @param max the max value. */ @FxThread - public void setMinMax(final float min, final float max) { + public void setMinMax(float min, float max) { getValueField().setMinMax(min, max); } @@ -103,6 +113,8 @@ protected boolean isSingleRow() { } /** + * Get the filed with current value. + * * @return the filed with current value. */ @FxThread @@ -113,13 +125,19 @@ protected boolean isSingleRow() { @Override @FxThread protected void reload() { - final Float value = getPropertyValue(); - final FloatTextField valueField = getValueField(); - final int caretPosition = valueField.getCaretPosition(); + var value = getPropertyValue(); + var valueField = getValueField(); + var caretPosition = valueField.getCaretPosition(); valueField.setValue(value == null ? 0F : value); valueField.positionCaret(caretPosition); } + @Override + public boolean isDirty() { + + return super.isDirty(); + } + /** * Update the value. */ @@ -136,4 +154,12 @@ private void updateValue() { final Float oldValue = getPropertyValue(); changed(value, oldValue); } + + @Override + protected void apply() { + + super.apply(); + } + + } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/StringPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/StringPropertyControl.java index 59e90a73..5aefe4c9 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/StringPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/StringPropertyControl.java @@ -7,6 +7,7 @@ import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.util.StringUtils; import javafx.scene.control.TextField; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; @@ -44,7 +45,10 @@ protected void createComponents(@NotNull HBox container) { valueField = new TextField(); valueField.setOnKeyReleased(this::updateValue); - valueField.prefWidthProperty().bind(widthProperty().multiply(CONTROL_WIDTH_PERCENT)); + valueField.prefWidthProperty() + .bind(widthProperty().multiply(CONTROL_WIDTH_PERCENT)); + valueField.focusedProperty() + .addListener((observable, oldValue, newValue) -> applyOnLostFocus(newValue)); FXUtils.addClassTo(valueField, CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); FXUtils.addToPane(valueField, container); @@ -69,10 +73,10 @@ protected boolean isSingleRow() { @Override @FxThread protected void reload() { - var value = getPropertyValue(); + var storedValue = getPropertyValue(); var valueField = getValueField(); var caretPosition = valueField.getCaretPosition(); - valueField.setText(value == null ? "" : value); + valueField.setText(storedValue == null ? "" : storedValue); valueField.positionCaret(caretPosition); } @@ -86,9 +90,25 @@ private void updateValue(@NotNull KeyEvent event) { return; } - var valueField = getValueField(); + apply(); + } + + @Override + public boolean isDirty() { + + var storedValue = getPropertyValue(); + var currentValue = getValueField().getText(); + + return !StringUtils.equals(storedValue, currentValue); + } + + @Override + @FxThread + protected void apply() { + super.apply(); + var oldValue = getPropertyValue(); - var newValue = valueField.getText(); + var newValue = getValueField().getText(); changed(newValue, oldValue); } From 17030e52ab8c64f8187f13905e8f673e42ca3ba3 Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Thu, 12 Apr 2018 10:19:59 +0300 Subject: [PATCH 27/49] updated property controls. --- .../ui/control/property/PropertyControl.java | 14 +++- .../property/impl/BooleanPropertyControl.java | 76 ++++++++++++------- .../property/impl/FloatPropertyControl.java | 36 ++++----- .../property/impl/IntegerPropertyControl.java | 69 +++++++++++------ .../property/impl/StringPropertyControl.java | 7 +- .../impl/Vector3FPropertyControl.java | 50 +++++++----- .../java/com/ss/editor/ui/util/UiUtils.java | 5 +- .../java/com/ss/editor/util/GeomUtils.java | 33 ++++++++ 8 files changed, 194 insertions(+), 96 deletions(-) diff --git a/src/main/java/com/ss/editor/ui/control/property/PropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/PropertyControl.java index 336c455a..30f51905 100644 --- a/src/main/java/com/ss/editor/ui/control/property/PropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/PropertyControl.java @@ -40,6 +40,15 @@ */ public class PropertyControl extends VBox implements UpdatableControl { + /** + * @param the type of a change consumer. + * @param the type of an editing object. + * @param the type of an editing property. + * @author JavaSaBr + */ + public interface ChangeHandler extends SixObjectConsumer> { + } + /** * The constant LOGGER. */ @@ -147,7 +156,7 @@ public PropertyControl( @Nullable T propertyValue, @NotNull String propertyName, @NotNull C changeConsumer, - @Nullable SixObjectConsumer> changeHandler + @Nullable ChangeHandler changeHandler ) { this.propertyName = propertyName; this.changeConsumer = changeConsumer; @@ -173,7 +182,7 @@ public PropertyControl( * @return the six object consumer */ @FromAnyThread - public @NotNull SixObjectConsumer> newChangeHandler() { + public @NotNull ChangeHandler newChangeHandler() { return (changeConsumer, object, propName, newValue, oldValue, handler) -> { var operation = new PropertyOperation(object, propName, newValue, oldValue); @@ -277,6 +286,7 @@ protected void reload() { * * @return true if this control has not saved changes. */ + @FxThread public boolean isDirty() { return true; } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/BooleanPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/BooleanPropertyControl.java index 610ddfc0..1610fcd4 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/BooleanPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/BooleanPropertyControl.java @@ -1,57 +1,62 @@ package com.ss.editor.ui.control.property.impl; import static com.ss.rlib.util.ObjectUtils.notNull; -import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; +import com.ss.editor.annotation.FxThread; import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.function.SixObjectConsumer; import com.ss.rlib.ui.util.FXUtils; -import javafx.beans.property.DoubleProperty; import javafx.scene.control.CheckBox; -import javafx.scene.control.Label; import javafx.scene.layout.HBox; import javafx.scene.layout.Region; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.function.BiConsumer; +import java.util.Objects; /** * The implementation of the {@link PropertyControl} to change boolean values. * - * @param the type of a {@link ChangeConsumer}. - * @param the type of an editing object. + * @param the type of a change consumer. + * @param the type of an editing object. * @author JavaSaBr */ -public class BooleanPropertyControl extends PropertyControl { +public class BooleanPropertyControl extends PropertyControl { /** - * The {@link CheckBox} with current value. + * The field with current value. */ @Nullable private CheckBox checkBox; - public BooleanPropertyControl(@Nullable final Boolean propertyValue, @NotNull final String propertyName, - @NotNull final C changeConsumer) { + public BooleanPropertyControl( + @Nullable Boolean propertyValue, + @NotNull String propertyName, + @NotNull C changeConsumer + ) { super(propertyValue, propertyName, changeConsumer); } - public BooleanPropertyControl(@Nullable final Boolean propertyValue, @NotNull final String propertyName, - @NotNull final C changeConsumer, - @Nullable final SixObjectConsumer> changeHandler) { + public BooleanPropertyControl( + @Nullable Boolean propertyValue, + @NotNull String propertyName, + @NotNull C changeConsumer, + @Nullable ChangeHandler changeHandler + ) { super(propertyValue, propertyName, changeConsumer, changeHandler); } @Override @FxThread - protected void createComponents(@NotNull final HBox container) { + protected void createComponents(@NotNull HBox container) { super.createComponents(container); checkBox = new CheckBox(); - checkBox.selectedProperty().addListener((observable, oldValue, newValue) -> updateValue()); - checkBox.prefWidthProperty().bind(widthProperty().multiply(CONTROL_WIDTH_PERCENT)); + checkBox.selectedProperty() + .addListener((observable, oldValue, newValue) -> updateValue()); + checkBox.prefWidthProperty() + .bind(widthProperty().multiply(CONTROL_WIDTH_PERCENT)); FXUtils.addToPane(checkBox, container); FXUtils.addClassTo(checkBox, CssClasses.ABSTRACT_PARAM_CONTROL_CHECK_BOX); @@ -59,10 +64,10 @@ protected void createComponents(@NotNull final HBox container) { @Override @FxThread - public void changeControlWidthPercent(final double controlWidthPercent) { + public void changeControlWidthPercent(double controlWidthPercent) { - final CheckBox checkBox = getCheckBox(); - final DoubleProperty widthProperty = checkBox.prefWidthProperty(); + var checkBox = getCheckBox(); + var widthProperty = checkBox.prefWidthProperty(); if (widthProperty.isBound()) { super.changeControlWidthPercent(controlWidthPercent); @@ -77,10 +82,10 @@ public void changeControlWidthPercent(final double controlWidthPercent) { @FxThread public void disableCheckboxOffset() { - final CheckBox checkBox = getCheckBox(); + var checkBox = getCheckBox(); checkBox.prefWidthProperty().unbind(); - final Label propertyNameLabel = getPropertyNameLabel(); + var propertyNameLabel = getPropertyNameLabel(); propertyNameLabel.maxWidthProperty().unbind(); propertyNameLabel.setMaxWidth(Region.USE_COMPUTED_SIZE); propertyNameLabel.prefWidthProperty().bind(widthProperty()); @@ -95,7 +100,9 @@ protected boolean isSingleRow() { } /** - * @return the {@link CheckBox} with current value. + * Get the field with current value. + * + * @return the field with current value. */ @FxThread private @NotNull CheckBox getCheckBox() { @@ -105,18 +112,33 @@ protected boolean isSingleRow() { @Override @FxThread protected void reload() { - final Boolean value = getPropertyValue(); - final CheckBox checkBox = getCheckBox(); + var value = getPropertyValue(); + var checkBox = getCheckBox(); checkBox.setSelected(Boolean.TRUE.equals(value)); } + @FxThread + @Override + public boolean isDirty() { + var currentValue = getCheckBox().isSelected(); + var storedValue = getPropertyValue(); + return !Objects.equals(storedValue, currentValue); + } + /** * Update the value. */ @FxThread private void updateValue() { - if (isIgnoreListener()) return; - final CheckBox checkBox = getCheckBox(); + if (!isIgnoreListener()) { + apply(); + } + } + + @Override + protected void apply() { + super.apply(); + var checkBox = getCheckBox(); changed(checkBox.isSelected(), getPropertyValue()); } } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/FloatPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/FloatPropertyControl.java index ad436e6c..a28b23fb 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/FloatPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/FloatPropertyControl.java @@ -1,28 +1,27 @@ package com.ss.editor.ui.control.property.impl; import static com.ss.rlib.util.ObjectUtils.notNull; -import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; +import com.ss.editor.annotation.FxThread; import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.function.SixObjectConsumer; import com.ss.rlib.ui.control.input.FloatTextField; import com.ss.rlib.ui.util.FXUtils; import javafx.scene.layout.HBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.function.BiConsumer; +import java.util.Objects; /** * The implementation of the {@link PropertyControl} to edit float values. * - * @param the change consumer's type. - * @param the edited object's type. + * @param the type of a change consumer. + * @param the type of an editing object. * @author JavaSaBr */ -public class FloatPropertyControl extends PropertyControl { +public class FloatPropertyControl extends PropertyControl { /** * The filed with current value. @@ -43,7 +42,7 @@ public FloatPropertyControl( @Nullable Float propertyValue, @NotNull String propertyName, @NotNull C changeConsumer, - @Nullable SixObjectConsumer> changeHandler + @Nullable ChangeHandler changeHandler ) { super(propertyValue, propertyName, changeConsumer, changeHandler); @@ -132,10 +131,12 @@ protected void reload() { valueField.positionCaret(caretPosition); } + @FxThread @Override public boolean isDirty() { - - return super.isDirty(); + var currentValue = getValueField().getValue(); + var storedValue = getPropertyValue(); + return !Objects.equals(storedValue, currentValue); } /** @@ -143,23 +144,18 @@ public boolean isDirty() { */ @FxThread private void updateValue() { - - if (isIgnoreListener()) { - return; + if (!isIgnoreListener()) { + apply(); } - - final FloatTextField valueField = getValueField(); - final float value = valueField.getValue(); - - final Float oldValue = getPropertyValue(); - changed(value, oldValue); } @Override protected void apply() { - super.apply(); - } + var currentValue = getValueField().getValue(); + var storedValue = getPropertyValue(); + changed(currentValue, storedValue); + } } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/IntegerPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/IntegerPropertyControl.java index 064aac06..8dddc68b 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/IntegerPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/IntegerPropertyControl.java @@ -1,8 +1,8 @@ package com.ss.editor.ui.control.property.impl; import static com.ss.rlib.util.ObjectUtils.notNull; -import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; +import com.ss.editor.annotation.FxThread; import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; @@ -12,14 +12,16 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Objects; + /** * The implementation of the {@link PropertyControl} to edit integer values. * - * @param the type of {@link ChangeConsumer}. - * @param the type of edited object. + * @param the type of a change consumer. + * @param the type of an editing object. * @author JavaSaBr */ -public class IntegerPropertyControl extends PropertyControl { +public class IntegerPropertyControl extends PropertyControl { /** * The filed with current value. @@ -27,29 +29,35 @@ public class IntegerPropertyControl extends Propert @Nullable private IntegerTextField valueField; - public IntegerPropertyControl(@Nullable final Integer propertyValue, @NotNull final String propertyName, - @NotNull final C changeConsumer) { + public IntegerPropertyControl( + @Nullable Integer propertyValue, + @NotNull String propertyName, + @NotNull C changeConsumer + ) { super(propertyValue, propertyName, changeConsumer); } @Override @FxThread - public void changeControlWidthPercent(final double controlWidthPercent) { + public void changeControlWidthPercent(double controlWidthPercent) { super.changeControlWidthPercent(controlWidthPercent); - final IntegerTextField valueField = getValueField(); + var valueField = getValueField(); valueField.prefWidthProperty().unbind(); valueField.prefWidthProperty().bind(widthProperty().multiply(controlWidthPercent)); } @Override @FxThread - protected void createComponents(@NotNull final HBox container) { + protected void createComponents(@NotNull HBox container) { super.createComponents(container); valueField = new IntegerTextField(); valueField.addChangeListener((observable, oldValue, newValue) -> updateValue()); - valueField.prefWidthProperty().bind(widthProperty().multiply(CONTROL_WIDTH_PERCENT)); + valueField.prefWidthProperty() + .bind(widthProperty().multiply(CONTROL_WIDTH_PERCENT)); + valueField.focusedProperty() + .addListener((observable, oldValue, newValue) -> applyOnLostFocus(newValue)); FXUtils.addClassTo(valueField, CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); FXUtils.addToPane(valueField, container); @@ -62,6 +70,8 @@ protected boolean isSingleRow() { } /** + * Get the filed with current value. + * * @return the filed with current value. */ @FxThread @@ -76,22 +86,22 @@ protected boolean isSingleRow() { * @param max the max value. */ @FxThread - public void setMinMax(final int min, final int max) { + public void setMinMax(int min, int max) { getValueField().setMinMax(min, max); } /** - * Sets scroll power. + * Set the scroll power. * * @param scrollPower the scroll power. */ @FxThread - public void setScrollPower(final int scrollPower) { + public void setScrollPower(int scrollPower) { getValueField().setScrollPower(scrollPower); } /** - * Gets scroll power. + * Get the scroll power. * * @return the scroll power. */ @@ -103,27 +113,38 @@ public int getScrollPower() { @Override @FxThread protected void reload() { - final Integer element = getPropertyValue(); - final IntegerTextField valueField = getValueField(); - final int caretPosition = valueField.getCaretPosition(); + var element = getPropertyValue(); + var valueField = getValueField(); + var caretPosition = valueField.getCaretPosition(); valueField.setText(String.valueOf(element)); valueField.positionCaret(caretPosition); } + @FxThread + @Override + public boolean isDirty() { + var currentValue = getValueField().getValue(); + var storedValue = getPropertyValue(); + return !Objects.equals(storedValue, currentValue); + } + /** * Update the value. */ @FxThread private void updateValue() { - - if (isIgnoreListener()) { - return; + if (!isIgnoreListener()) { + apply(); } + } + + @Override + protected void apply() { + super.apply(); - final IntegerTextField valueField = getValueField(); - final int value = valueField.getValue(); - final Integer oldValue = getPropertyValue(); + var currentValue = getValueField().getValue(); + var storedValue = getPropertyValue(); - changed(value, oldValue); + changed(currentValue, storedValue); } } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/StringPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/StringPropertyControl.java index 5aefe4c9..48f7c0ce 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/StringPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/StringPropertyControl.java @@ -19,10 +19,10 @@ * The implementation of the {@link PropertyControl} to edit string values. * * @param the type of a change consumer. - * @param the type of an editing property. + * @param the type of an editing object. * @author JavaSaBr */ -public class StringPropertyControl extends PropertyControl { +public class StringPropertyControl extends PropertyControl { /** * The filed with current value. @@ -93,12 +93,11 @@ private void updateValue(@NotNull KeyEvent event) { apply(); } + @FxThread @Override public boolean isDirty() { - var storedValue = getPropertyValue(); var currentValue = getValueField().getText(); - return !StringUtils.equals(storedValue, currentValue); } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/Vector3FPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/Vector3FPropertyControl.java index f05f85df..da10f612 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/Vector3FPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/Vector3FPropertyControl.java @@ -1,5 +1,6 @@ package com.ss.editor.ui.control.property.impl; +import static com.ss.editor.util.GeomUtils.zeroIfNull; import static com.ss.rlib.util.ObjectUtils.notNull; import com.jme3.math.Vector3f; import com.ss.editor.annotation.FxThread; @@ -7,7 +8,7 @@ import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.util.UiUtils; -import com.ss.rlib.function.SixObjectConsumer; +import com.ss.editor.util.GeomUtils; import com.ss.rlib.ui.control.input.FloatTextField; import com.ss.rlib.ui.util.FXUtils; import javafx.scene.control.Label; @@ -17,16 +18,14 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.function.BiConsumer; - /** * The implementation of the {@link PropertyControl} to edit {@link Vector3f} values. * - * @param the type of a {@link ChangeConsumer} - * @param the type of an editing object. + * @param the type of a change consumer. + * @param the type of an editing object. * @author JavaSaBr */ -public class Vector3FPropertyControl extends PropertyControl { +public class Vector3FPropertyControl extends PropertyControl { /** * The field X. @@ -58,7 +57,7 @@ public Vector3FPropertyControl( @Nullable Vector3f propertyValue, @NotNull String propertyName, @NotNull C changeConsumer, - @Nullable SixObjectConsumer> changeHandler + @Nullable ChangeHandler changeHandler ) { super(propertyValue, propertyName, changeConsumer, changeHandler); } @@ -105,7 +104,8 @@ protected void createComponents(@NotNull HBox container) { FXUtils.addClassesTo(xField, yField, zField, CssClasses.ABSTRACT_PARAM_CONTROL_VECTOR3F_FIELD, CssClasses.TRANSPARENT_TEXT_FIELD); - UiUtils.addFocusBinding(container, xField, yField, zField); + UiUtils.addFocusBinding(container, xField, yField, zField) + .addListener((observable, oldValue, newValue) -> applyOnLostFocus(newValue)); } @Override @@ -173,6 +173,19 @@ protected void reload() { zField.positionCaret(xField.getText().length()); } + @Override + @FxThread + public boolean isDirty() { + + var x = getXField().getValue(); + var y = getYFiled().getValue(); + var z = getZField().getValue(); + + var storedValue = getPropertyValue(); + + return GeomUtils.equals(storedValue, x, y, z); + } + /** * Update the vector. * @@ -185,19 +198,20 @@ protected void updateVector(@Nullable KeyEvent event) { return; } - var xField = getXField(); - var x = xField.getValue(); + apply(); + } - var yFiled = getYFiled(); - var y = yFiled.getValue(); + @Override + @FxThread + protected void apply() { + super.apply(); - var zField = getZField(); - var z = zField.getValue(); + var x = getXField().getValue(); + var y = getYFiled().getValue(); + var z = getZField().getValue(); - var oldValue = getPropertyValue() == null ? Vector3f.ZERO : getPropertyValue(); - var newValue = new Vector3f(); - newValue.set(x, y, z); + var storedValue = zeroIfNull(getPropertyValue()); - changed(newValue, oldValue.clone()); + changed(new Vector3f(x, y, z), storedValue.clone()); } } diff --git a/src/main/java/com/ss/editor/ui/util/UiUtils.java b/src/main/java/com/ss/editor/ui/util/UiUtils.java index c4d3e927..2572c525 100644 --- a/src/main/java/com/ss/editor/ui/util/UiUtils.java +++ b/src/main/java/com/ss/editor/ui/util/UiUtils.java @@ -17,6 +17,7 @@ import com.ss.rlib.util.StringUtils; import com.ss.rlib.util.array.Array; import com.ss.rlib.util.array.ArrayFactory; +import javafx.beans.property.BooleanProperty; import javafx.beans.property.BooleanPropertyBase; import javafx.beans.value.ChangeListener; import javafx.collections.ObservableList; @@ -75,7 +76,7 @@ public abstract class UiUtils { * @param controls the controls. */ @FxThread - public static void addFocusBinding(@NotNull Pane pane, @NotNull Control... controls) { + public static @NotNull BooleanProperty addFocusBinding(@NotNull Pane pane, @NotNull Control... controls) { var focused = new BooleanPropertyBase(true) { @@ -103,6 +104,8 @@ public String getName() { for (var control : controls) { control.focusedProperty().addListener(listener); } + + return focused; } /** diff --git a/src/main/java/com/ss/editor/util/GeomUtils.java b/src/main/java/com/ss/editor/util/GeomUtils.java index ed9c5054..8d514cc1 100644 --- a/src/main/java/com/ss/editor/util/GeomUtils.java +++ b/src/main/java/com/ss/editor/util/GeomUtils.java @@ -377,4 +377,37 @@ public static boolean canAttach(@NotNull final Node node, @NotNull final Spatial return results; } + + /** + * Compare the vector with coordinates. + * + * @param vector the vector. + * @param x the X coordinate. + * @param y the Y coordinate. + * @param z the Z coordinate. + * @return true if the vector is equal for the coordinates. + */ + @FromAnyThread + public static boolean equals(@Nullable Vector3f vector, float x, float y, float z) { + + if (vector == null) { + return false; + } else if (Float.compare(x, x) != 0) { + return false; + } else if (Float.compare(y, y) != 0) { + return false; + } else { + return Float.compare(z, z) == 0; + } + } + + /** + * Return {@link Vector3f#ZERO} if the vector is null or the same vector. + * + * @param vector the vector. + * @return {@link Vector3f#ZERO} if the vector is null or the same vector. + */ + public static @NotNull Vector3f zeroIfNull(@Nullable Vector3f vector) { + return vector == null ? Vector3f.ZERO : vector; + } } From 70beef10790304fa9216f638cd71c60dc7413ed1 Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Thu, 12 Apr 2018 17:57:05 +0300 Subject: [PATCH 28/49] refactoring controls. --- build.gradle | 3 +- .../impl/AudioNodePropertyBuilder.java | 6 +- .../impl/EditableObjectPropertyBuilder.java | 9 +- .../impl/EmitterShapePropertyBuilder.java | 18 ++-- .../builder/impl/LightPropertyBuilder.java | 10 +-- .../impl/ParticleEmitterPropertyBuilder.java | 8 +- .../ParticleInfluencerPropertyBuilder.java | 10 +-- .../impl/PrimitivePropertyBuilder.java | 6 +- .../impl/DirectionLightPropertyControl.java | 4 +- .../property/impl/FloatPropertyControl.java | 12 +-- .../property/impl/IntegerPropertyControl.java | 11 ++- .../property/impl/MinMaxPropertyControl.java | 4 +- .../property/impl/StringPropertyControl.java | 16 ++-- ...trol.java => Vector2fPropertyControl.java} | 48 +++++++---- ...trol.java => Vector3fPropertyControl.java} | 29 +++---- ... => Vector3fSingleRowPropertyControl.java} | 82 ++++++++++++------- .../WheelElementModelPropertyControl.java | 22 +++-- ...icleEmitterImagesModelPropertyControl.java | 6 +- .../java/com/ss/editor/util/GeomUtils.java | 36 +++++++- 19 files changed, 199 insertions(+), 141 deletions(-) rename src/main/java/com/ss/editor/ui/control/property/impl/{Vector2FPropertyControl.java => Vector2fPropertyControl.java} (79%) rename src/main/java/com/ss/editor/ui/control/property/impl/{Vector3FPropertyControl.java => Vector3fPropertyControl.java} (88%) rename src/main/java/com/ss/editor/ui/control/property/impl/{Vector3FSingleRowPropertyControl.java => Vector3fSingleRowPropertyControl.java} (72%) diff --git a/build.gradle b/build.gradle index dd2b42f1..9f19a922 100644 --- a/build.gradle +++ b/build.gradle @@ -76,6 +76,7 @@ junitPlatform { repositories { mavenCentral() jcenter() + mavenLocal() maven { url 'https://jitpack.io' } @@ -131,7 +132,7 @@ dependencies { compile group: 'org.fxmisc.richtext', name: 'richtextfx', version: '1.0.0-SNAPSHOT' compile 'org.controlsfx:controlsfx:9.0.0' compile 'com.spaceshift:rlib.fx:4.2.1-Final' - compile 'com.spaceshift:rlib:6.8.5-Final' + compile 'com.spaceshift:rlib:6.9.1.Final' compile ('com.jme3x:jme-jfx:1.7.5-Final') { exclude group: 'org.jmonkeyengine' } diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/AudioNodePropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/AudioNodePropertyBuilder.java index 169b230b..f2fabdea 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/AudioNodePropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/AudioNodePropertyBuilder.java @@ -13,7 +13,7 @@ import com.ss.editor.ui.control.property.impl.AudioKeyPropertyControl; import com.ss.editor.ui.control.property.impl.BooleanPropertyControl; import com.ss.editor.ui.control.property.impl.FloatPropertyControl; -import com.ss.editor.ui.control.property.impl.Vector3FPropertyControl; +import com.ss.editor.ui.control.property.impl.Vector3fPropertyControl; import com.ss.editor.util.AudioNodeUtils; import com.ss.editor.util.EditorUtil; import com.ss.rlib.ui.util.FXUtils; @@ -189,14 +189,14 @@ protected void buildForImpl(@NotNull final Object object, @Nullable final Object audioKeyControl.setSyncHandler(AudioNodeUtils::getAudioKey); audioKeyControl.setEditObject(audioNode); - final Vector3FPropertyControl velocityControl = new Vector3FPropertyControl<>(velocity, + final Vector3fPropertyControl velocityControl = new Vector3fPropertyControl<>(velocity, Messages.MODEL_PROPERTY_VELOCITY, changeConsumer); velocityControl.setApplyHandler(AudioNode::setVelocity); velocityControl.setSyncHandler(AudioNode::getVelocity); velocityControl.setEditObject(audioNode); - final Vector3FPropertyControl directionControl = new Vector3FPropertyControl<>(direction, + final Vector3fPropertyControl directionControl = new Vector3fPropertyControl<>(direction, Messages.MODEL_PROPERTY_DIRECTION, changeConsumer); directionControl.setApplyHandler(AudioNode::setDirection); diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/EditableObjectPropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/EditableObjectPropertyBuilder.java index 9865d820..8dafee87 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/EditableObjectPropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/EditableObjectPropertyBuilder.java @@ -6,7 +6,6 @@ import com.jme3.texture.Texture2D; import com.ss.editor.annotation.FxThread; import com.ss.editor.extension.property.EditableProperty; -import com.ss.editor.extension.property.EditablePropertyType; import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.control.property.impl.*; @@ -146,8 +145,8 @@ protected void buildFor( final EditableProperty property = cast(description); final Vector2f currentValue = property.getValue(); - final Vector2FPropertyControl> propertyControl = - new Vector2FPropertyControl<>(currentValue, property.getName(), changeConsumer); + final Vector2fPropertyControl> propertyControl = + new Vector2fPropertyControl<>(currentValue, property.getName(), changeConsumer); addControl(container, property, propertyControl); break; @@ -157,8 +156,8 @@ protected void buildFor( final EditableProperty property = cast(description); final Vector3f currentValue = property.getValue(); - final Vector3FPropertyControl> propertyControl = - new Vector3FPropertyControl<>(currentValue, property.getName(), changeConsumer); + final Vector3fPropertyControl> propertyControl = + new Vector3fPropertyControl<>(currentValue, property.getName(), changeConsumer); addControl(container, property, propertyControl); break; diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/EmitterShapePropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/EmitterShapePropertyBuilder.java index b0614fa9..9666339d 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/EmitterShapePropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/EmitterShapePropertyBuilder.java @@ -11,7 +11,7 @@ import com.ss.editor.model.undo.editor.ModelChangeConsumer; import com.ss.editor.ui.control.property.builder.PropertyBuilder; import com.ss.editor.ui.control.property.impl.FloatPropertyControl; -import com.ss.editor.ui.control.property.impl.Vector3FPropertyControl; +import com.ss.editor.ui.control.property.impl.Vector3fPropertyControl; import com.ss.rlib.ui.util.FXUtils; import javafx.scene.layout.VBox; import org.jetbrains.annotations.NotNull; @@ -72,8 +72,8 @@ private void createControls(@NotNull final VBox container, @NotNull final ModelC final Vector3f point = shape.getPoint(); - final Vector3FPropertyControl pointControl = - new Vector3FPropertyControl<>(point, Messages.MODEL_PROPERTY_POINT, changeConsumer); + final Vector3fPropertyControl pointControl = + new Vector3fPropertyControl<>(point, Messages.MODEL_PROPERTY_POINT, changeConsumer); pointControl.setSyncHandler(EmitterPointShape::getPoint); pointControl.setApplyHandler(EmitterPointShape::setPoint); @@ -96,15 +96,15 @@ private void createControls(@NotNull final VBox container, @NotNull final ModelC final Vector3f length = shape.getLen(); final Vector3f min = shape.getMin(); - final Vector3FPropertyControl lengthControl = - new Vector3FPropertyControl<>(length, Messages.MODEL_PROPERTY_LENGTH, changeConsumer); + final Vector3fPropertyControl lengthControl = + new Vector3fPropertyControl<>(length, Messages.MODEL_PROPERTY_LENGTH, changeConsumer); lengthControl.setSyncHandler(EmitterBoxShape::getLen); lengthControl.setApplyHandler(EmitterBoxShape::setLen); lengthControl.setEditObject(shape); - final Vector3FPropertyControl minControl = - new Vector3FPropertyControl<>(min, Messages.MODEL_PROPERTY_MIN, changeConsumer); + final Vector3fPropertyControl minControl = + new Vector3fPropertyControl<>(min, Messages.MODEL_PROPERTY_MIN, changeConsumer); minControl.setSyncHandler(EmitterBoxShape::getMin); minControl.setApplyHandler(EmitterBoxShape::setMin); @@ -135,8 +135,8 @@ private void createControls(@NotNull final VBox container, @NotNull final ModelC radiusControl.setApplyHandler(EmitterSphereShape::setRadius); radiusControl.setEditObject(shape); - final Vector3FPropertyControl centerControl = - new Vector3FPropertyControl<>(center, Messages.MODEL_PROPERTY_CENTER, changeConsumer); + final Vector3fPropertyControl centerControl = + new Vector3fPropertyControl<>(center, Messages.MODEL_PROPERTY_CENTER, changeConsumer); centerControl.setSyncHandler(EmitterSphereShape::getCenter); centerControl.setApplyHandler(EmitterSphereShape::setCenter); diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/LightPropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/LightPropertyBuilder.java index 30753d02..2df587fb 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/LightPropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/LightPropertyBuilder.java @@ -15,7 +15,7 @@ import com.ss.editor.ui.control.property.builder.PropertyBuilder; import com.ss.editor.ui.control.property.impl.ColorPropertyControl; import com.ss.editor.ui.control.property.impl.FloatPropertyControl; -import com.ss.editor.ui.control.property.impl.Vector3FPropertyControl; +import com.ss.editor.ui.control.property.impl.Vector3fPropertyControl; import com.ss.rlib.ui.util.FXUtils; import javafx.scene.layout.VBox; import org.jetbrains.annotations.NotNull; @@ -87,8 +87,8 @@ private void buildForPointLight(@NotNull final PointLight light, @NotNull final final Vector3f position = light.getPosition().clone(); final float radius = light.getRadius(); - final Vector3FPropertyControl positionControl = - new Vector3FPropertyControl<>(position, Messages.MODEL_PROPERTY_LOCATION, changeConsumer); + final Vector3fPropertyControl positionControl = + new Vector3fPropertyControl<>(position, Messages.MODEL_PROPERTY_LOCATION, changeConsumer); positionControl.setApplyHandler(PointLight::setPosition); positionControl.setSyncHandler(PointLight::getPosition); positionControl.setEditObject(light); @@ -122,8 +122,8 @@ private void buildForSpotLight(@NotNull final SpotLight light, @NotNull final VB directionControl.setSyncHandler(SpotLight::getDirection); directionControl.setEditObject(light); - final Vector3FPropertyControl positionControl = - new Vector3FPropertyControl<>(position, Messages.MODEL_PROPERTY_LOCATION, changeConsumer); + final Vector3fPropertyControl positionControl = + new Vector3fPropertyControl<>(position, Messages.MODEL_PROPERTY_LOCATION, changeConsumer); positionControl.setApplyHandler(SpotLight::setPosition); positionControl.setSyncHandler(SpotLight::getPosition); positionControl.setEditObject(light); diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/ParticleEmitterPropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/ParticleEmitterPropertyBuilder.java index cb00393a..94d4ad4b 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/ParticleEmitterPropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/ParticleEmitterPropertyBuilder.java @@ -202,14 +202,14 @@ private void buildFor(@NotNull final VBox container, @NotNull final ModelChangeC imagesControl.setSyncHandler(SYNC_IMAGES_HANDLER); imagesControl.setEditObject(emitter); - final Vector3FPropertyControl gravityControl = - new Vector3FPropertyControl<>(gravity, Messages.MODEL_PROPERTY_GRAVITY, changeConsumer); + final Vector3fPropertyControl gravityControl = + new Vector3fPropertyControl<>(gravity, Messages.MODEL_PROPERTY_GRAVITY, changeConsumer); gravityControl.setApplyHandler(ParticleEmitter::setGravity); gravityControl.setSyncHandler(ParticleEmitter::getGravity); gravityControl.setEditObject(emitter); - final Vector3FPropertyControl faceNormalControl = - new Vector3FPropertyControl<>(faceNormal, Messages.MODEL_PROPERTY_FACE_NORMAL, changeConsumer); + final Vector3fPropertyControl faceNormalControl = + new Vector3fPropertyControl<>(faceNormal, Messages.MODEL_PROPERTY_FACE_NORMAL, changeConsumer); faceNormalControl.setApplyHandler(ParticleEmitter::setFaceNormal); faceNormalControl.setSyncHandler(SYNC_FACE_NORMAL_HANDLER); faceNormalControl.setEditObject(emitter); diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/ParticleInfluencerPropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/ParticleInfluencerPropertyBuilder.java index 5810a6c8..3eb85874 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/ParticleInfluencerPropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/ParticleInfluencerPropertyBuilder.java @@ -11,7 +11,7 @@ import com.ss.editor.ui.control.property.builder.PropertyBuilder; import com.ss.editor.ui.control.property.impl.BooleanPropertyControl; import com.ss.editor.ui.control.property.impl.FloatPropertyControl; -import com.ss.editor.ui.control.property.impl.Vector3FPropertyControl; +import com.ss.editor.ui.control.property.impl.Vector3fPropertyControl; import com.ss.rlib.ui.util.FXUtils; import javafx.scene.layout.VBox; import org.jetbrains.annotations.NotNull; @@ -48,8 +48,8 @@ protected void buildForImpl(@NotNull final Object object, @Nullable final Object final float velocityVariation = influencer.getVelocityVariation(); - final Vector3FPropertyControl initialVelocityControl = - new Vector3FPropertyControl<>(initialVelocity, Messages.MODEL_PROPERTY_INITIAL_VELOCITY, changeConsumer); + final Vector3fPropertyControl initialVelocityControl = + new Vector3fPropertyControl<>(initialVelocity, Messages.MODEL_PROPERTY_INITIAL_VELOCITY, changeConsumer); initialVelocityControl.setSyncHandler(ParticleInfluencer::getInitialVelocity); initialVelocityControl.setApplyHandler(ParticleInfluencer::setInitialVelocity); @@ -106,8 +106,8 @@ private void createControls(@NotNull final VBox container, final @NotNull ModelC horizontalControl.setApplyHandler(RadialParticleInfluencer::setHorizontal); horizontalControl.setEditObject(influencer); - final Vector3FPropertyControl originControl = - new Vector3FPropertyControl<>(origin, Messages.MODEL_PROPERTY_ORIGIN, changeConsumer); + final Vector3fPropertyControl originControl = + new Vector3fPropertyControl<>(origin, Messages.MODEL_PROPERTY_ORIGIN, changeConsumer); originControl.setSyncHandler(RadialParticleInfluencer::getOrigin); originControl.setApplyHandler(RadialParticleInfluencer::setOrigin); diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/PrimitivePropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/PrimitivePropertyBuilder.java index 3b7d6860..204045f8 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/PrimitivePropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/PrimitivePropertyBuilder.java @@ -7,7 +7,7 @@ import com.ss.editor.model.undo.editor.ModelChangeConsumer; import com.ss.editor.ui.control.property.builder.PropertyBuilder; import com.ss.editor.ui.control.property.impl.DefaultSinglePropertyControl; -import com.ss.editor.ui.control.property.impl.Vector3FPropertyControl; +import com.ss.editor.ui.control.property.impl.Vector3fPropertyControl; import com.ss.rlib.ui.util.FXUtils; import javafx.scene.layout.VBox; import org.jetbrains.annotations.NotNull; @@ -48,8 +48,8 @@ protected void buildForImpl(@NotNull final Object object, @Nullable final Object final Vector3f position = (Vector3f) object; final Vector3f value = position.clone(); - final Vector3FPropertyControl control = - new Vector3FPropertyControl<>(value, Messages.MODEL_PROPERTY_VALUE, changeConsumer); + final Vector3fPropertyControl control = + new Vector3fPropertyControl<>(value, Messages.MODEL_PROPERTY_VALUE, changeConsumer); control.setApplyHandler(Vector3f::set); control.setSyncHandler(Vector3f::clone); control.setEditObject(position); diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/DirectionLightPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/DirectionLightPropertyControl.java index bdf9af67..86a504ba 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/DirectionLightPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/DirectionLightPropertyControl.java @@ -6,12 +6,12 @@ import org.jetbrains.annotations.NotNull; /** - * The implementation of the {@link Vector3FPropertyControl} to edit direction's vector of the {@link Light}. + * The implementation of the {@link Vector3fPropertyControl} to edit direction's vector of the {@link Light}. * * @param the light's type. * @author JavaSaBr */ -public class DirectionLightPropertyControl extends Vector3FPropertyControl { +public class DirectionLightPropertyControl extends Vector3fPropertyControl { public DirectionLightPropertyControl(@NotNull final Vector3f element, @NotNull final String paramName, @NotNull final ModelChangeConsumer modelChangeConsumer) { diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/FloatPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/FloatPropertyControl.java index a28b23fb..a2528f59 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/FloatPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/FloatPropertyControl.java @@ -1,5 +1,6 @@ package com.ss.editor.ui.control.property.impl; +import static com.ss.rlib.util.NumberUtils.zeroIfNull; import static com.ss.rlib.util.ObjectUtils.notNull; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; @@ -8,6 +9,7 @@ import com.ss.editor.ui.css.CssClasses; import com.ss.rlib.ui.control.input.FloatTextField; import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.util.NumberUtils; import javafx.scene.layout.HBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -124,19 +126,16 @@ protected boolean isSingleRow() { @Override @FxThread protected void reload() { - var value = getPropertyValue(); var valueField = getValueField(); var caretPosition = valueField.getCaretPosition(); - valueField.setValue(value == null ? 0F : value); + valueField.setValue(zeroIfNull(getPropertyValue())); valueField.positionCaret(caretPosition); } - @FxThread @Override + @FxThread public boolean isDirty() { - var currentValue = getValueField().getValue(); - var storedValue = getPropertyValue(); - return !Objects.equals(storedValue, currentValue); + return !Objects.equals(getValueField().getValue(), getPropertyValue()); } /** @@ -150,6 +149,7 @@ private void updateValue() { } @Override + @FxThread protected void apply() { super.apply(); diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/IntegerPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/IntegerPropertyControl.java index 8dddc68b..a41a4433 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/IntegerPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/IntegerPropertyControl.java @@ -1,5 +1,6 @@ package com.ss.editor.ui.control.property.impl; +import static com.ss.rlib.util.NumberUtils.zeroIfNull; import static com.ss.rlib.util.ObjectUtils.notNull; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; @@ -113,19 +114,16 @@ public int getScrollPower() { @Override @FxThread protected void reload() { - var element = getPropertyValue(); var valueField = getValueField(); var caretPosition = valueField.getCaretPosition(); - valueField.setText(String.valueOf(element)); + valueField.setValue(zeroIfNull(getPropertyValue())); valueField.positionCaret(caretPosition); } - @FxThread @Override + @FxThread public boolean isDirty() { - var currentValue = getValueField().getValue(); - var storedValue = getPropertyValue(); - return !Objects.equals(storedValue, currentValue); + return !Objects.equals(getValueField().getValue(), getPropertyValue()); } /** @@ -139,6 +137,7 @@ private void updateValue() { } @Override + @FxThread protected void apply() { super.apply(); diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/MinMaxPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/MinMaxPropertyControl.java index c8ab5a82..6f9aa7ed 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/MinMaxPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/MinMaxPropertyControl.java @@ -10,13 +10,13 @@ import org.jetbrains.annotations.Nullable; /** - * The implementation of the {@link Vector2FPropertyControl} to edit min-max value range. + * The implementation of the {@link Vector2fPropertyControl} to edit min-max value range. * * @param the type of a {@link ChangeConsumer} * @param the type of an editing object. * @author JavaSaBr */ -public class MinMaxPropertyControl extends Vector2FPropertyControl { +public class MinMaxPropertyControl extends Vector2fPropertyControl { public MinMaxPropertyControl( @Nullable Vector2f propertyValue, diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/StringPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/StringPropertyControl.java index 48f7c0ce..64056117 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/StringPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/StringPropertyControl.java @@ -1,6 +1,8 @@ package com.ss.editor.ui.control.property.impl; import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.util.StringUtils.emptyIfNull; + import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; import com.ss.editor.model.undo.editor.ChangeConsumer; @@ -73,10 +75,9 @@ protected boolean isSingleRow() { @Override @FxThread protected void reload() { - var storedValue = getPropertyValue(); var valueField = getValueField(); var caretPosition = valueField.getCaretPosition(); - valueField.setText(storedValue == null ? "" : storedValue); + valueField.setText(emptyIfNull(getPropertyValue())); valueField.positionCaret(caretPosition); } @@ -85,20 +86,15 @@ protected void reload() { */ @FxThread private void updateValue(@NotNull KeyEvent event) { - - if (isIgnoreListener() || event.getCode() != KeyCode.ENTER) { - return; + if (!isIgnoreListener() && event.getCode() == KeyCode.ENTER) { + apply(); } - - apply(); } @FxThread @Override public boolean isDirty() { - var storedValue = getPropertyValue(); - var currentValue = getValueField().getText(); - return !StringUtils.equals(storedValue, currentValue); + return !StringUtils.equals(getPropertyValue(), getValueField().getText()); } @Override diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/Vector2FPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/Vector2fPropertyControl.java similarity index 79% rename from src/main/java/com/ss/editor/ui/control/property/impl/Vector2FPropertyControl.java rename to src/main/java/com/ss/editor/ui/control/property/impl/Vector2fPropertyControl.java index e9fc4e01..3083e8ca 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/Vector2FPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/Vector2fPropertyControl.java @@ -1,5 +1,6 @@ package com.ss.editor.ui.control.property.impl; +import static com.ss.editor.util.GeomUtils.zeroIfNull; import static com.ss.rlib.util.ObjectUtils.notNull; import com.jme3.math.Vector2f; import com.ss.editor.annotation.FromAnyThread; @@ -8,6 +9,7 @@ import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.util.UiUtils; +import com.ss.editor.util.GeomUtils; import com.ss.rlib.ui.control.input.FloatTextField; import com.ss.rlib.ui.util.FXUtils; import javafx.scene.input.KeyCode; @@ -19,11 +21,11 @@ /** * The implementation of the {@link PropertyControl} to edit {@link Vector2f} values. * - * @param the type of a {@link ChangeConsumer} - * @param the type of an editing object. + * @param the type of a change consumer. + * @param the type of an editing object. * @author JavaSaBr */ -public class Vector2FPropertyControl extends PropertyControl { +public class Vector2fPropertyControl extends PropertyControl { /** * The field X. @@ -43,7 +45,7 @@ public class Vector2FPropertyControl extends Proper @Nullable private HBox fieldContainer; - public Vector2FPropertyControl( + public Vector2fPropertyControl( @Nullable Vector2f propertyValue, @NotNull String propertyName, @NotNull C changeConsumer @@ -91,7 +93,8 @@ protected void createComponents(@NotNull HBox container) { FXUtils.addClassesTo(xField, yField, CssClasses.TRANSPARENT_TEXT_FIELD); - UiUtils.addFocusBinding(fieldContainer, xField, yField); + UiUtils.addFocusBinding(fieldContainer, xField, yField) + .addListener((observable, oldValue, newValue) -> applyOnLostFocus(newValue)); } /** @@ -107,7 +110,7 @@ protected void createComponents(@NotNull HBox container) { @Override @FxThread protected void setPropertyValue(@Nullable Vector2f vector) { - super.setPropertyValue(vector == null ? null : vector.clone()); + super.setPropertyValue(zeroIfNull(vector).clone()); } @Override @@ -164,7 +167,7 @@ protected float checkResultYValue(float x, float y) { @FxThread protected void reload() { - var vector = getPropertyValue() == null ? Vector2f.ZERO : getPropertyValue(); + var vector = zeroIfNull(getPropertyValue()); var xField = getXField(); xField.setValue(vector.getX()); @@ -175,6 +178,16 @@ protected void reload() { yField.positionCaret(yField.getText().length()); } + @Override + @FxThread + public boolean isDirty() { + + var x = getXField().getValue(); + var y = getYField().getValue(); + + return GeomUtils.equals(getPropertyValue(), x, y); + } + /** * Update the vector. * @@ -182,20 +195,21 @@ protected void reload() { */ @FxThread private void updateVector(@Nullable KeyEvent event) { - - if (isIgnoreListener() || (event != null && event.getCode() != KeyCode.ENTER)) { - return; + if (!isIgnoreListener() && (event == null || event.getCode() == KeyCode.ENTER)) { + apply(); } + } - var xField = getXField(); - var x = xField.getValue(); + @Override + @FxThread + protected void apply() { + super.apply(); - var yField = getYField(); - var y = yField.getValue(); + var x = getXField().getValue(); + var y = getYField().getValue(); - var oldValue = getPropertyValue() == null ? Vector2f.ZERO : getPropertyValue(); - var newValue = new Vector2f(); - newValue.set(checkResultXValue(x, y), checkResultYValue(x, y)); + var oldValue = zeroIfNull(getPropertyValue()); + var newValue = new Vector2f(checkResultXValue(x, y), checkResultYValue(x, y)); changed(newValue, oldValue.clone()); } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/Vector3FPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/Vector3fPropertyControl.java similarity index 88% rename from src/main/java/com/ss/editor/ui/control/property/impl/Vector3FPropertyControl.java rename to src/main/java/com/ss/editor/ui/control/property/impl/Vector3fPropertyControl.java index da10f612..209613ed 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/Vector3FPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/Vector3fPropertyControl.java @@ -25,7 +25,7 @@ * @param the type of an editing object. * @author JavaSaBr */ -public class Vector3FPropertyControl extends PropertyControl { +public class Vector3fPropertyControl extends PropertyControl { /** * The field X. @@ -45,7 +45,7 @@ public class Vector3FPropertyControl extends Proper @Nullable private FloatTextField zField; - public Vector3FPropertyControl( + public Vector3fPropertyControl( @Nullable Vector3f propertyValue, @NotNull String propertyName, @NotNull C changeConsumer @@ -53,7 +53,7 @@ public Vector3FPropertyControl( super(propertyValue, propertyName, changeConsumer); } - public Vector3FPropertyControl( + public Vector3fPropertyControl( @Nullable Vector3f propertyValue, @NotNull String propertyName, @NotNull C changeConsumer, @@ -111,7 +111,7 @@ protected void createComponents(@NotNull HBox container) { @Override @FxThread protected void setPropertyValue(@Nullable Vector3f vector) { - super.setPropertyValue(vector == null ? null : vector.clone()); + super.setPropertyValue(zeroIfNull(vector).clone()); } /** @@ -140,7 +140,7 @@ protected float getScrollPower() { * @return the field Y. */ @FxThread - protected @NotNull FloatTextField getYFiled() { + protected @NotNull FloatTextField getYField() { return notNull(yField); } @@ -158,13 +158,13 @@ protected float getScrollPower() { @FxThread protected void reload() { - var vector = getPropertyValue() == null ? Vector3f.ZERO : getPropertyValue(); + var vector = zeroIfNull(getPropertyValue()); var xField = getXField(); xField.setValue(vector.getX()); xField.positionCaret(xField.getText().length()); - var yFiled = getYFiled(); + var yFiled = getYField(); yFiled.setValue(vector.getY()); yFiled.positionCaret(xField.getText().length()); @@ -178,12 +178,10 @@ protected void reload() { public boolean isDirty() { var x = getXField().getValue(); - var y = getYFiled().getValue(); + var y = getYField().getValue(); var z = getZField().getValue(); - var storedValue = getPropertyValue(); - - return GeomUtils.equals(storedValue, x, y, z); + return GeomUtils.equals(getPropertyValue(), x, y, z); } /** @@ -193,12 +191,9 @@ public boolean isDirty() { */ @FxThread protected void updateVector(@Nullable KeyEvent event) { - - if (isIgnoreListener() || (event != null && event.getCode() != KeyCode.ENTER)) { - return; + if (!isIgnoreListener() && (event == null || event.getCode() == KeyCode.ENTER)) { + apply(); } - - apply(); } @Override @@ -207,7 +202,7 @@ protected void apply() { super.apply(); var x = getXField().getValue(); - var y = getYFiled().getValue(); + var y = getYField().getValue(); var z = getZField().getValue(); var storedValue = zeroIfNull(getPropertyValue()); diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/Vector3FSingleRowPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/Vector3fSingleRowPropertyControl.java similarity index 72% rename from src/main/java/com/ss/editor/ui/control/property/impl/Vector3FSingleRowPropertyControl.java rename to src/main/java/com/ss/editor/ui/control/property/impl/Vector3fSingleRowPropertyControl.java index 9df5a1b9..ef63821b 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/Vector3FSingleRowPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/Vector3fSingleRowPropertyControl.java @@ -1,5 +1,6 @@ package com.ss.editor.ui.control.property.impl; +import static com.ss.editor.util.GeomUtils.zeroIfNull; import static com.ss.rlib.util.ObjectUtils.notNull; import com.jme3.math.Vector3f; import com.ss.editor.annotation.FxThread; @@ -8,6 +9,7 @@ import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.util.UiUtils; +import com.ss.editor.util.GeomUtils; import com.ss.rlib.ui.control.input.FloatTextField; import com.ss.rlib.ui.util.FXUtils; import javafx.scene.input.KeyCode; @@ -19,11 +21,11 @@ /** * The implementation of the {@link PropertyControl} to edit {@link com.jme3.math.Vector3f} values. * - * @param the change consumer's type. - * @param the edited object's type. + * @param the type of a change consumer. + * @param the type of an editing object. * @author JavaSaBr. */ -public class Vector3FSingleRowPropertyControl extends PropertyControl { +public class Vector3fSingleRowPropertyControl extends PropertyControl { /** * The field X. @@ -49,24 +51,28 @@ public class Vector3FSingleRowPropertyControl exten @Nullable private HBox fieldContainer; - public Vector3FSingleRowPropertyControl(@Nullable final Vector3f propertyValue, @NotNull final String propertyName, - @NotNull final C changeConsumer) { + public Vector3fSingleRowPropertyControl( + @Nullable Vector3f propertyValue, + @NotNull String propertyName, + @NotNull C changeConsumer + ) { + super(propertyValue, propertyName, changeConsumer); } @Override @FxThread - public void changeControlWidthPercent(final double controlWidthPercent) { + public void changeControlWidthPercent(double controlWidthPercent) { super.changeControlWidthPercent(controlWidthPercent); - final HBox valueField = getFieldContainer(); + var valueField = getFieldContainer(); valueField.prefWidthProperty().unbind(); valueField.prefWidthProperty().bind(widthProperty().multiply(controlWidthPercent)); } @Override @FxThread - protected void createComponents(@NotNull final HBox container) { + protected void createComponents(@NotNull HBox container) { super.createComponents(container); fieldContainer = new HBox(); @@ -99,10 +105,13 @@ protected void createComponents(@NotNull final HBox container) { CssClasses.ABSTRACT_PARAM_CONTROL_SHORT_INPUT_CONTAINER); FXUtils.addClassesTo(xField, yField, zField, CssClasses.TRANSPARENT_TEXT_FIELD); - UiUtils.addFocusBinding(fieldContainer, xField, yField, zField); + UiUtils.addFocusBinding(fieldContainer, xField, yField, zField) + .addListener((observable, oldValue, newValue) -> applyOnLostFocus(newValue)); } /** + * Get the field container. + * * @return the field container. */ @FxThread @@ -112,8 +121,8 @@ protected void createComponents(@NotNull final HBox container) { @Override @FxThread - protected void setPropertyValue(@Nullable final Vector3f vector) { - super.setPropertyValue(vector == null ? null : vector.clone()); + protected void setPropertyValue(@Nullable Vector3f vector) { + super.setPropertyValue(zeroIfNull(vector).clone()); } @Override @@ -131,7 +140,7 @@ protected boolean isSingleRow() { * @return the result x value. */ @FxThread - protected float checkResultXValue(final float x, final float y, final float z) { + protected float checkResultXValue(float x, float y, float z) { return x; } @@ -144,7 +153,7 @@ protected float checkResultXValue(final float x, final float y, final float z) { * @return the result y value. */ @FxThread - protected float checkResultYValue(final float x, final float y, final float z) { + protected float checkResultYValue(float x, float y, float z) { return y; } @@ -157,7 +166,7 @@ protected float checkResultYValue(final float x, final float y, final float z) { * @return the result z value. */ @FxThread - protected float checkResultZValue(final float x, final float y, final float z) { + protected float checkResultZValue(float x, float y, float z) { return z; } @@ -195,44 +204,55 @@ protected float checkResultZValue(final float x, final float y, final float z) { @FxThread protected void reload() { - final Vector3f vector = getPropertyValue() == null ? Vector3f.ZERO : getPropertyValue(); + var vector = zeroIfNull(getPropertyValue()); - final FloatTextField xField = getXField(); + var xField = getXField(); xField.setValue(vector.getX()); xField.positionCaret(xField.getText().length()); - final FloatTextField yField = getYField(); + var yField = getYField(); yField.setValue(vector.getY()); yField.positionCaret(yField.getText().length()); - final FloatTextField zField = getZField(); + var zField = getZField(); zField.setValue(vector.getZ()); zField.positionCaret(zField.getText().length()); } + @Override + @FxThread + public boolean isDirty() { + + var x = getXField().getValue(); + var y = getYField().getValue(); + var z = getZField().getValue(); + + return !GeomUtils.equals(getPropertyValue(), x, y, z); + } + /** * Update the current value. * * @param event the change event. */ @FxThread - private void updateVector(@Nullable final KeyEvent event) { - - if (isIgnoreListener() || (event != null && event.getCode() != KeyCode.ENTER)) { - return; + private void updateVector(@Nullable KeyEvent event) { + if (!isIgnoreListener() && (event == null || event.getCode() == KeyCode.ENTER)) { + apply(); } + } - final FloatTextField xField = getXField(); - final float x = xField.getValue(); - - final FloatTextField yField = getYField(); - final float y = yField.getValue(); + @Override + @FxThread + protected void apply() { + super.apply(); - final FloatTextField zField = getZField(); - final float z = zField.getValue(); + var x = getXField().getValue(); + var y = getYField().getValue(); + var z = getZField().getValue(); - final Vector3f oldValue = getPropertyValue() == null ? Vector3f.ZERO : getPropertyValue(); - final Vector3f newValue = new Vector3f(); + var oldValue = zeroIfNull(getPropertyValue()); + var newValue = new Vector3f(); newValue.set(checkResultXValue(x, y, z), checkResultYValue(x, y, z), checkResultZValue(x, y, z)); changed(newValue, oldValue.clone()); diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/WheelElementModelPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/WheelElementModelPropertyControl.java index bda07a2c..132253a0 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/WheelElementModelPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/WheelElementModelPropertyControl.java @@ -18,17 +18,21 @@ */ public class WheelElementModelPropertyControl extends SpatialElementModelPropertyControl { - public WheelElementModelPropertyControl(@Nullable final Spatial propertyValue, @NotNull final String propertyName, - @NotNull final ModelChangeConsumer changeConsumer) { + public WheelElementModelPropertyControl( + @Nullable Spatial propertyValue, + @NotNull String propertyName, + @NotNull ModelChangeConsumer changeConsumer + ) { + super(Spatial.class, propertyValue, propertyName, changeConsumer); } @Override @FxThread protected @NotNull NodeSelectorDialog createNodeSelectorDialog() { - final ModelChangeConsumer changeConsumer = getChangeConsumer(); - final Spatial currentModel = changeConsumer.getCurrentModel(); - final Spatial root = NodeUtils.findSpatial(currentModel, this::checkSpatial); + var changeConsumer = getChangeConsumer(); + var currentModel = changeConsumer.getCurrentModel(); + var root = NodeUtils.findSpatial(currentModel, this::checkSpatial); return new NodeSelectorDialog<>(notNull(root), type, this::processAdd); } @@ -38,17 +42,17 @@ public WheelElementModelPropertyControl(@Nullable final Spatial propertyValue, @ * @param spatial the spatial. * @return true if the spatial has this wheel. */ - private boolean checkSpatial(@NotNull final Spatial spatial) { + private boolean checkSpatial(@NotNull Spatial spatial) { - final VehicleControl control = spatial.getControl(VehicleControl.class); + var control = spatial.getControl(VehicleControl.class); if (control == null) { return false; } - final int numWheels = control.getNumWheels(); + var numWheels = control.getNumWheels(); for (int i = 0; i < numWheels; i++) { - final VehicleWheel wheel = control.getWheel(i); + var wheel = control.getWheel(i); if (wheel == getEditObject()) { return true; } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/particle/ParticleEmitterImagesModelPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/particle/ParticleEmitterImagesModelPropertyControl.java index 3143e705..917c4039 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/particle/ParticleEmitterImagesModelPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/particle/ParticleEmitterImagesModelPropertyControl.java @@ -3,17 +3,17 @@ import com.jme3.effect.ParticleEmitter; import com.jme3.math.Vector2f; import com.ss.editor.model.undo.editor.ModelChangeConsumer; -import com.ss.editor.ui.control.property.impl.Vector2FPropertyControl; +import com.ss.editor.ui.control.property.impl.Vector2fPropertyControl; import org.jetbrains.annotations.NotNull; /** - * The implementation of the {@link Vector2FPropertyControl} to edit images count of the {@link + * The implementation of the {@link Vector2fPropertyControl} to edit images count of the {@link * ParticleEmitter}*. * * @author JavaSaBr. */ public class ParticleEmitterImagesModelPropertyControl extends - Vector2FPropertyControl { + Vector2fPropertyControl { public ParticleEmitterImagesModelPropertyControl(@NotNull final Vector2f element, @NotNull final String paramName, diff --git a/src/main/java/com/ss/editor/util/GeomUtils.java b/src/main/java/com/ss/editor/util/GeomUtils.java index 8d514cc1..76213fac 100644 --- a/src/main/java/com/ss/editor/util/GeomUtils.java +++ b/src/main/java/com/ss/editor/util/GeomUtils.java @@ -392,12 +392,32 @@ public static boolean equals(@Nullable Vector3f vector, float x, float y, float if (vector == null) { return false; - } else if (Float.compare(x, x) != 0) { + } else if (Float.compare(vector.getX(), x) != 0) { return false; - } else if (Float.compare(y, y) != 0) { + } else if (Float.compare(vector.getY(), y) != 0) { return false; } else { - return Float.compare(z, z) == 0; + return Float.compare(vector.getZ(), z) == 0; + } + } + + /** + * Compare the vector with coordinates. + * + * @param vector the vector. + * @param x the X coordinate. + * @param y the Y coordinate. + * @return true if the vector is equal for the coordinates. + */ + @FromAnyThread + public static boolean equals(@Nullable Vector2f vector, float x, float y) { + + if (vector == null) { + return false; + } else if (Float.compare(vector.getX(), x) != 0) { + return false; + } else { + return Float.compare(vector.getY(), y) == 0; } } @@ -410,4 +430,14 @@ public static boolean equals(@Nullable Vector3f vector, float x, float y, float public static @NotNull Vector3f zeroIfNull(@Nullable Vector3f vector) { return vector == null ? Vector3f.ZERO : vector; } + + /** + * Return {@link Vector2f#ZERO} if the vector is null or the same vector. + * + * @param vector the vector. + * @return {@link Vector2f#ZERO} if the vector is null or the same vector. + */ + public static @NotNull Vector2f zeroIfNull(@Nullable Vector2f vector) { + return vector == null ? Vector2f.ZERO : vector; + } } From 6c3e77c74d12978f35f95956902689d5ffa0c311 Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Fri, 13 Apr 2018 09:47:38 +0300 Subject: [PATCH 29/49] continue refactoring property controls. --- build.gradle | 2 +- .../ui/control/property/PropertyControl.java | 21 ++-- .../impl/AudioKeyPropertyControl.java | 70 +++++------ .../property/impl/EnumPropertyControl.java | 66 ++++++----- .../impl/FloatArrayPropertyControl.java | 111 ++++++------------ .../impl/IntArrayPropertyControl.java | 79 ++++++++----- .../impl/LayerModelPropertyControl.java | 48 ++++---- .../impl/StringBasedArrayPropertyControl.java | 95 +++++++++++++++ .../property/impl/StringPropertyControl.java | 7 +- 9 files changed, 291 insertions(+), 208 deletions(-) create mode 100644 src/main/java/com/ss/editor/ui/control/property/impl/StringBasedArrayPropertyControl.java diff --git a/build.gradle b/build.gradle index 9f19a922..ae70131b 100644 --- a/build.gradle +++ b/build.gradle @@ -131,7 +131,7 @@ dependencies { // base compile group: 'org.fxmisc.richtext', name: 'richtextfx', version: '1.0.0-SNAPSHOT' compile 'org.controlsfx:controlsfx:9.0.0' - compile 'com.spaceshift:rlib.fx:4.2.1-Final' + compile 'com.spaceshift:rlib.fx:4.3.0.Final' compile 'com.spaceshift:rlib:6.9.1.Final' compile ('com.jme3x:jme-jfx:1.7.5-Final') { exclude group: 'org.jmonkeyengine' diff --git a/src/main/java/com/ss/editor/ui/control/property/PropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/PropertyControl.java index 30f51905..e95510fc 100644 --- a/src/main/java/com/ss/editor/ui/control/property/PropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/PropertyControl.java @@ -17,7 +17,7 @@ import com.ss.rlib.function.SixObjectConsumer; import com.ss.rlib.logging.Logger; import com.ss.rlib.logging.LoggerManager; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.ui.util.FxUtils; import javafx.geometry.Pos; import javafx.scene.control.Label; import javafx.scene.layout.HBox; @@ -173,7 +173,7 @@ public PropertyControl( setIgnoreListener(false); } - FXUtils.addClassTo(this, CssClasses.ABSTRACT_PARAM_CONTROL); + FxUtils.addClass(this, CssClasses.ABSTRACT_PARAM_CONTROL); } /** @@ -350,15 +350,20 @@ protected void createComponents() { propertyNameLabel.maxWidthProperty().bind(widthProperty().multiply(1F - CONTROL_WIDTH_PERCENT)); } - FXUtils.addClassTo(container, CssClasses.DEF_HBOX); - FXUtils.addClassTo(propertyNameLabel, isSingleRow() ? CssClasses.ABSTRACT_PARAM_CONTROL_PARAM_NAME_SINGLE_ROW : - CssClasses.ABSTRACT_PARAM_CONTROL_PARAM_NAME); + FxUtils.addClass(container, CssClasses.DEF_HBOX) + .addClass(propertyNameLabel, getLabelCssClass()); - FXUtils.addToPane(propertyNameLabel, isSingleRow() ? container : this); + FxUtils.addChild(isSingleRow() ? container : this, propertyNameLabel); createComponents(container); - FXUtils.addToPane(container, this); + FxUtils.addChild(this, container); + } + + @FromAnyThread + protected @NotNull String getLabelCssClass() { + return isSingleRow() ? CssClasses.ABSTRACT_PARAM_CONTROL_PARAM_NAME_SINGLE_ROW : + CssClasses.ABSTRACT_PARAM_CONTROL_PARAM_NAME; } /** @@ -404,7 +409,7 @@ protected boolean isSingleRow() { * @param container the container. */ @FxThread - protected void createComponents(@NotNull final HBox container) { + protected void createComponents(@NotNull HBox container) { } /** diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/AudioKeyPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/AudioKeyPropertyControl.java index d50094b8..71c918c0 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/AudioKeyPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/AudioKeyPropertyControl.java @@ -15,7 +15,7 @@ import com.ss.editor.ui.event.impl.RequestedOpenFileEvent; import com.ss.editor.ui.util.DynamicIconSupport; import com.ss.editor.ui.util.UiUtils; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.ui.util.FxUtils; import com.ss.rlib.util.StringUtils; import javafx.scene.control.Button; import javafx.scene.control.Label; @@ -32,7 +32,7 @@ /** * The implementation of the {@link PropertyControl} to edit the {@link AudioData}. * - * @param the change consumer's type. + * @param the type of a change consumer. * @author JavaSaBr */ public class AudioKeyPropertyControl extends PropertyControl { @@ -46,8 +46,11 @@ public class AudioKeyPropertyControl extends PropertyC @Nullable private Label audioKeyLabel; - public AudioKeyPropertyControl(@Nullable final AudioKey element, @NotNull final String paramName, - @NotNull final C changeConsumer) { + public AudioKeyPropertyControl( + @Nullable AudioKey element, + @NotNull String paramName, + @NotNull C changeConsumer + ) { super(element, paramName, changeConsumer); setOnDragOver(this::handleDragOverEvent); setOnDragDropped(this::handleDragDroppedEvent); @@ -55,20 +58,19 @@ public AudioKeyPropertyControl(@Nullable final AudioKey element, @NotNull final } /** - * Handle grad exited events. + * Handle drag exited events. * * @param dragEvent the drag exited event. */ - private void handleDragExitedEvent(@NotNull final DragEvent dragEvent) { - + private void handleDragExitedEvent(@NotNull DragEvent dragEvent) { } /** - * Handle dropped event. + * Handle dropped events. * * @param dragEvent the dropped event. */ - private void handleDragDroppedEvent(@NotNull final DragEvent dragEvent) { + private void handleDragDroppedEvent(@NotNull DragEvent dragEvent) { UiUtils.handleDroppedFile(dragEvent, AUDIO_EXTENSIONS, this, AudioKeyPropertyControl::addAudioData); } @@ -77,22 +79,22 @@ private void handleDragDroppedEvent(@NotNull final DragEvent dragEvent) { * * @param dragEvent the drag over events. */ - private void handleDragOverEvent(@NotNull final DragEvent dragEvent) { + private void handleDragOverEvent(@NotNull DragEvent dragEvent) { UiUtils.acceptIfHasFile(dragEvent, AUDIO_EXTENSIONS); } @Override @FxThread - protected void createComponents(@NotNull final HBox container) { + protected void createComponents(@NotNull HBox container) { super.createComponents(container); audioKeyLabel = new Label(NO_AUDIO); - final Button changeButton = new Button(); + var changeButton = new Button(); changeButton.setGraphic(new ImageView(Icons.ADD_16)); changeButton.setOnAction(event -> processChange()); - final Button openButton = new Button(); + var openButton = new Button(); openButton.setGraphic(new ImageView(Icons.EDIT_16)); openButton.disableProperty().bind(audioKeyLabel.textProperty().isEqualTo(NO_AUDIO)); openButton.setOnAction(event -> processOpen()); @@ -101,15 +103,11 @@ protected void createComponents(@NotNull final HBox container) { .subtract(changeButton.widthProperty()) .subtract(openButton.widthProperty())); - FXUtils.addToPane(audioKeyLabel, container); - FXUtils.addToPane(changeButton, container); - FXUtils.addToPane(openButton, container); - - FXUtils.addClassesTo(container, CssClasses.TEXT_INPUT_CONTAINER, - CssClasses.ABSTRACT_PARAM_CONTROL_INPUT_CONTAINER); - FXUtils.addClassTo(audioKeyLabel, CssClasses.ABSTRACT_PARAM_CONTROL_ELEMENT_LABEL); - FXUtils.addClassesTo(changeButton, openButton, CssClasses.FLAT_BUTTON, - CssClasses.INPUT_CONTROL_TOOLBAR_BUTTON); + FxUtils.addChild(container, audioKeyLabel, changeButton, openButton); + FxUtils.addClass(container, CssClasses.TEXT_INPUT_CONTAINER, CssClasses.ABSTRACT_PARAM_CONTROL_INPUT_CONTAINER) + .addClass(audioKeyLabel, CssClasses.ABSTRACT_PARAM_CONTROL_ELEMENT_LABEL) + .addClass(changeButton, CssClasses.FLAT_BUTTON, CssClasses.INPUT_CONTROL_TOOLBAR_BUTTON) + .addClass(openButton, CssClasses.FLAT_BUTTON, CssClasses.INPUT_CONTROL_TOOLBAR_BUTTON); DynamicIconSupport.addSupport(changeButton, openButton); } @@ -128,10 +126,10 @@ protected void processChange() { * @param file the audio file. */ @FxThread - private void addAudioData(@NotNull final Path file) { + private void addAudioData(@NotNull Path file) { - final Path assetFile = notNull(getAssetFile(file)); - final AudioKey audioKey = new AudioKey(toAssetPath(assetFile)); + var assetFile = notNull(getAssetFile(file)); + var audioKey = new AudioKey(toAssetPath(assetFile)); changed(audioKey, getPropertyValue()); setIgnoreListener(true); @@ -148,30 +146,32 @@ private void addAudioData(@NotNull final Path file) { @FxThread protected void processOpen() { - final AudioKey element = getPropertyValue(); + var element = getPropertyValue(); if (element == null) { return; } - final String assetPath = element.getName(); - if (StringUtils.isEmpty(assetPath)) return; + var assetPath = element.getName(); + if (StringUtils.isEmpty(assetPath)) { + return; + } - final Path assetFile = Paths.get(assetPath); - final Path realFile = notNull(getRealFile(assetFile)); + var assetFile = Paths.get(assetPath); + var realFile = notNull(getRealFile(assetFile)); if (!Files.exists(realFile)) { return; } - final RequestedOpenFileEvent event = new RequestedOpenFileEvent(); + var event = new RequestedOpenFileEvent(); event.setFile(realFile); FX_EVENT_MANAGER.notify(event); } /** - * Gets audio key label. + * Get the audio key label. * - * @return the label with name of the audio key. + * @return the audio key label. */ @FxThread private @NotNull Label getAudioKeyLabel() { @@ -181,8 +181,8 @@ protected void processOpen() { @Override @FxThread protected void reload() { - final AudioKey element = getPropertyValue(); - final Label audioKeyLabel = getAudioKeyLabel(); + var element = getPropertyValue(); + var audioKeyLabel = getAudioKeyLabel(); audioKeyLabel.setText(element == null || StringUtils.isEmpty(element.getName()) ? NO_AUDIO : element.getName()); } } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/EnumPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/EnumPropertyControl.java index c8f5ac45..7b0fb3e8 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/EnumPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/EnumPropertyControl.java @@ -2,31 +2,26 @@ import static com.ss.editor.util.EditorUtil.getAvailableValues; import static com.ss.rlib.util.ObjectUtils.notNull; -import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; +import com.ss.editor.annotation.FxThread; import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.function.SixObjectConsumer; -import com.ss.rlib.ui.util.FXUtils; -import javafx.collections.ObservableList; +import com.ss.rlib.ui.util.FxUtils; import javafx.scene.control.ComboBox; -import javafx.scene.control.SingleSelectionModel; import javafx.scene.layout.HBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.function.BiConsumer; - /** * The implementation of the {@link PropertyControl} to edit {@link Enum} values. * * @param the type of a {@link ChangeConsumer} - * @param the type of an editing object. + * @param the type of an editing object. * @param the type of editing enum. * @author JavaSaBr */ -public class EnumPropertyControl> extends PropertyControl { +public class EnumPropertyControl> extends PropertyControl { /** * The list of available options of the {@link Enum} value. @@ -34,29 +29,40 @@ public class EnumPropertyControl> @Nullable private ComboBox enumComboBox; - public EnumPropertyControl(@Nullable final E propertyValue, @NotNull final String propertyName, - @NotNull final C changeConsumer, @NotNull final E[] availableValues) { + public EnumPropertyControl( + @Nullable E propertyValue, + @NotNull String propertyName, + @NotNull C changeConsumer, + @NotNull E[] availableValues + ) { super(propertyValue, propertyName, changeConsumer); - final ObservableList items = getEnumComboBox().getItems(); - items.addAll(availableValues); + getEnumComboBox().getItems() + .addAll(availableValues); } - public EnumPropertyControl(@NotNull final E propertyValue, @NotNull final String propertyName, - @NotNull final C changeConsumer) { + public EnumPropertyControl( + @NotNull E propertyValue, + @NotNull String propertyName, + @NotNull C changeConsumer + ) { this(propertyValue, propertyName, changeConsumer, getAvailableValues(propertyValue)); } - public EnumPropertyControl(@Nullable final E propertyValue, @NotNull final String propertyName, - @NotNull final C changeConsumer, @NotNull final E[] availableValues, - @Nullable final SixObjectConsumer> changeHandler) { + public EnumPropertyControl( + @Nullable E propertyValue, + @NotNull String propertyName, + @NotNull C changeConsumer, + @NotNull E[] availableValues, + @Nullable ChangeHandler changeHandler + ) { super(propertyValue, propertyName, changeConsumer, changeHandler); - final ObservableList items = getEnumComboBox().getItems(); - items.addAll(availableValues); + getEnumComboBox().getItems() + .addAll(availableValues); } @Override @FxThread - protected void createComponents(@NotNull final HBox container) { + protected void createComponents(@NotNull HBox container) { super.createComponents(container); enumComboBox = new ComboBox<>(); @@ -66,11 +72,13 @@ protected void createComponents(@NotNull final HBox container) { enumComboBox.prefWidthProperty() .bind(widthProperty().multiply(CONTROL_WIDTH_PERCENT)); - FXUtils.addToPane(enumComboBox, container); - FXUtils.addClassTo(enumComboBox, CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); + FxUtils.addChild(container, enumComboBox); + FxUtils.addClass(enumComboBox, CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); } /** + * Get the list of available options of the {@link Enum} value. + * * @return the list of available options of the {@link Enum} value. */ @FxThread @@ -88,9 +96,9 @@ private void change() { return; } - final ComboBox enumComboBox = getEnumComboBox(); - final SingleSelectionModel selectionModel = enumComboBox.getSelectionModel(); - final E newValue = selectionModel.getSelectedItem(); + var enumComboBox = getEnumComboBox(); + var selectionModel = enumComboBox.getSelectionModel(); + var newValue = selectionModel.getSelectedItem(); changed(newValue, getPropertyValue()); } @@ -98,10 +106,8 @@ private void change() { @Override @FxThread protected void reload() { - final E element = getPropertyValue(); - final ComboBox enumComboBox = getEnumComboBox(); - final SingleSelectionModel selectionModel = enumComboBox.getSelectionModel(); - selectionModel.select(element); + getEnumComboBox().getSelectionModel() + .select(getPropertyValue()); } @Override diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/FloatArrayPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/FloatArrayPropertyControl.java index cc48b5ec..6cc69b17 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/FloatArrayPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/FloatArrayPropertyControl.java @@ -1,88 +1,43 @@ package com.ss.editor.ui.control.property.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; import com.ss.editor.annotation.FxThread; -import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.control.property.PropertyControl; -import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.function.SixObjectConsumer; -import com.ss.rlib.ui.util.FXUtils; import com.ss.rlib.util.ArrayUtils; import com.ss.rlib.util.StringUtils; import javafx.scene.control.TextField; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; -import javafx.scene.layout.HBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.function.BiConsumer; - /** * The implementation of the {@link PropertyControl} to edit float array values. * * @param the change consumer's type. - * @param the edited object's type. + * @param the type of an editing object. * @author JavaSaBr */ -public class FloatArrayPropertyControl extends PropertyControl { - - /** - * The filed with current value. - */ - @Nullable - private TextField valueField; - - public FloatArrayPropertyControl(@Nullable final float[] propertyValue, @NotNull final String propertyName, - @NotNull final C changeConsumer) { +public class FloatArrayPropertyControl + extends StringBasedArrayPropertyControl { + + public FloatArrayPropertyControl( + @Nullable float[] propertyValue, + @NotNull String propertyName, + @NotNull C changeConsumer + ) { super(propertyValue, propertyName, changeConsumer); } - public FloatArrayPropertyControl(@Nullable final float[] propertyValue, @NotNull final String propertyName, - @NotNull final C changeConsumer, - @Nullable final SixObjectConsumer> changeHandler) { + public FloatArrayPropertyControl( + @Nullable float[] propertyValue, + @NotNull String propertyName, + @NotNull C changeConsumer, + @Nullable ChangeHandler changeHandler + ) { super(propertyValue, propertyName, changeConsumer, changeHandler); } - @Override - @FxThread - public void changeControlWidthPercent(final double controlWidthPercent) { - super.changeControlWidthPercent(controlWidthPercent); - - final TextField valueField = getValueField(); - valueField.prefWidthProperty().unbind(); - valueField.prefWidthProperty().bind(widthProperty().multiply(controlWidthPercent)); - } - - @Override - @FxThread - protected void createComponents(@NotNull final HBox container) { - super.createComponents(container); - - valueField = new TextField(); - valueField.setOnKeyReleased(this::updateValue); - valueField.prefWidthProperty() - .bind(widthProperty().multiply(CONTROL_WIDTH_PERCENT)); - - FXUtils.addClassTo(valueField, CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); - FXUtils.addToPane(valueField, container); - } - - @Override - @FromAnyThread - protected boolean isSingleRow() { - return true; - } - - /** - * @return the filed with current value. - */ - @FxThread - private @NotNull TextField getValueField() { - return notNull(valueField); - } - @Override @FxThread protected void reload() { @@ -101,30 +56,40 @@ protected void reload() { valueField.positionCaret(caretPosition); } - /** - * Update the value. - */ + @Override @FxThread - private void updateValue(@Nullable final KeyEvent event) { + public boolean isDirty() { + return super.isDirty(); + } - if (isIgnoreListener() || (event != null && event.getCode() != KeyCode.ENTER)) { - return; + @Override + @FxThread + protected void updateValue(@Nullable KeyEvent event) { + if (!isIgnoreListener() && (event == null || event.getCode() == KeyCode.ENTER)) { + apply(); } + } + + @Override + @FxThread + protected void apply() { + super.apply(); + + var textValue = getValueField().getText(); - final String textValue = getValueField().getText(); float[] newValue = null; if (!StringUtils.isEmpty(textValue)) { - final String splitter = textValue.contains(" ") ? " " : ","; - final String[] splited = textValue.split(splitter); + var splitter = textValue.contains(" ") ? " " : ","; + var split = textValue.split(splitter); - newValue = new float[splited.length]; + newValue = new float[split.length]; - for (int i = 0; i < splited.length; i++) { + for (var i = 0; i < split.length; i++) { try { - newValue[i] = Float.parseFloat(splited[i]); - } catch (final NumberFormatException e) { + newValue[i] = Float.parseFloat(split[i]); + } catch (NumberFormatException e) { LOGGER.warning(this, e); newValue = getPropertyValue(); break; diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/IntArrayPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/IntArrayPropertyControl.java index b5c6c46b..3a0594ef 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/IntArrayPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/IntArrayPropertyControl.java @@ -1,13 +1,12 @@ package com.ss.editor.ui.control.property.impl; import static com.ss.rlib.util.ObjectUtils.notNull; -import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; +import com.ss.editor.annotation.FxThread; import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.function.SixObjectConsumer; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.ui.util.FxUtils; import com.ss.rlib.util.ArrayUtils; import com.ss.rlib.util.StringUtils; import javafx.scene.control.TextField; @@ -17,16 +16,14 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.function.BiConsumer; - /** * The implementation of the {@link PropertyControl} to edit int array values. * * @param the change consumer's type. - * @param the edited object's type. + * @param the type of an editing object. * @author JavaSaBr */ -public class IntArrayPropertyControl extends PropertyControl { +public class IntArrayPropertyControl extends PropertyControl { /** * The filed with current value. @@ -34,30 +31,36 @@ public class IntArrayPropertyControl extends Proper @Nullable private TextField valueField; - public IntArrayPropertyControl(@Nullable final int[] propertyValue, @NotNull final String propertyName, - @NotNull final C changeConsumer) { + public IntArrayPropertyControl( + @Nullable int[] propertyValue, + @NotNull String propertyName, + @NotNull C changeConsumer + ) { super(propertyValue, propertyName, changeConsumer); } - public IntArrayPropertyControl(@Nullable final int[] propertyValue, @NotNull final String propertyName, - @NotNull final C changeConsumer, - @Nullable final SixObjectConsumer> changeHandler) { + public IntArrayPropertyControl( + @Nullable int[] propertyValue, + @NotNull String propertyName, + @NotNull C changeConsumer, + @Nullable ChangeHandler changeHandler + ) { super(propertyValue, propertyName, changeConsumer, changeHandler); } @Override @FxThread - public void changeControlWidthPercent(final double controlWidthPercent) { + public void changeControlWidthPercent(double controlWidthPercent) { super.changeControlWidthPercent(controlWidthPercent); - final TextField valueField = getValueField(); + var valueField = getValueField(); valueField.prefWidthProperty().unbind(); valueField.prefWidthProperty().bind(widthProperty().multiply(controlWidthPercent)); } @Override @FxThread - protected void createComponents(@NotNull final HBox container) { + protected void createComponents(@NotNull HBox container) { super.createComponents(container); valueField = new TextField(); @@ -65,8 +68,8 @@ protected void createComponents(@NotNull final HBox container) { valueField.prefWidthProperty() .bind(widthProperty().multiply(CONTROL_WIDTH_PERCENT)); - FXUtils.addClassTo(valueField, CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); - FXUtils.addToPane(valueField, container); + FxUtils.addClass(valueField, CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); + FxUtils.addChild(container, valueField); } @Override @@ -76,6 +79,8 @@ protected boolean isSingleRow() { } /** + * Get the filed with current value. + * * @return the filed with current value. */ @FxThread @@ -87,10 +92,10 @@ protected boolean isSingleRow() { @FxThread protected void reload() { - final int[] element = getPropertyValue(); + var element = getPropertyValue(); - final TextField valueField = getValueField(); - final int caretPosition = valueField.getCaretPosition(); + var valueField = getValueField(); + var caretPosition = valueField.getCaretPosition(); if (element == null) { valueField.setText(StringUtils.EMPTY); @@ -101,30 +106,42 @@ protected void reload() { valueField.positionCaret(caretPosition); } + @Override + @FxThread + public boolean isDirty() { + return super.isDirty(); + } + /** * Update the value. */ @FxThread - private void updateValue(@Nullable final KeyEvent event) { - - if (isIgnoreListener() || (event != null && event.getCode() != KeyCode.ENTER)) { - return; + private void updateValue(@Nullable KeyEvent event) { + if (!isIgnoreListener() && (event == null || event.getCode() == KeyCode.ENTER)) { + apply(); } + } + + @Override + @FxThread + protected void apply() { + super.apply(); + + var textValue = getValueField().getText(); - final String textValue = getValueField().getText(); int[] newValue = null; if (!StringUtils.isEmpty(textValue)) { - final String splitter = textValue.contains(" ") ? " " : ","; - final String[] splited = textValue.split(splitter); + var splitter = textValue.contains(" ") ? " " : ","; + var split = textValue.split(splitter); - newValue = new int[splited.length]; + newValue = new int[split.length]; - for (int i = 0; i < splited.length; i++) { + for (int i = 0; i < split.length; i++) { try { - newValue[i] = Integer.parseInt(splited[i]); - } catch (final NumberFormatException e) { + newValue[i] = Integer.parseInt(split[i]); + } catch (NumberFormatException e) { LOGGER.warning(this, e); newValue = getPropertyValue(); break; diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/LayerModelPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/LayerModelPropertyControl.java index 6d69982f..ddacce04 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/LayerModelPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/LayerModelPropertyControl.java @@ -3,28 +3,23 @@ import static com.ss.rlib.util.ObjectUtils.notNull; import com.jme3.scene.Spatial; import com.ss.editor.Messages; -import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; +import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.JmeThread; import com.ss.editor.extension.scene.SceneLayer; -import com.ss.editor.extension.scene.SceneNode; import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.model.undo.editor.ModelChangeConsumer; import com.ss.editor.model.undo.editor.SceneChangeConsumer; import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.control.property.operation.PropertyOperation; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.function.SixObjectConsumer; -import com.ss.rlib.ui.util.FXUtils; -import javafx.collections.ObservableList; +import com.ss.rlib.ui.util.FxUtils; import javafx.scene.control.ComboBox; import javafx.scene.control.ListCell; import javafx.scene.layout.HBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.function.BiConsumer; - /** * The implementation of the {@link PropertyControl} to edit layers. * @@ -36,7 +31,7 @@ public class LayerModelPropertyControl extends PropertyControl { @Override - protected void updateItem(@Nullable final SceneLayer layer, final boolean empty) { + protected void updateItem(@Nullable SceneLayer layer, boolean empty) { super.updateItem(layer, empty); if (layer == null || layer == SceneLayer.NO_LAYER) { @@ -54,7 +49,7 @@ protected void updateItem(@Nullable final SceneLayer layer, final boolean empty) @Nullable private ComboBox layerComboBox; - public LayerModelPropertyControl(@Nullable final SceneLayer layer, @NotNull final SceneChangeConsumer changeConsumer) { + public LayerModelPropertyControl(@Nullable SceneLayer layer, @NotNull SceneChangeConsumer changeConsumer) { super(layer == null ? SceneLayer.NO_LAYER : layer, Messages.MODEL_PROPERTY_LAYER, changeConsumer); setApplyHandler(this::setLayer); setSyncHandler(this::getLayer); @@ -62,11 +57,11 @@ public LayerModelPropertyControl(@Nullable final SceneLayer layer, @NotNull fina @Override @FromAnyThread - public @NotNull SixObjectConsumer> newChangeHandler() { + public @NotNull ChangeHandler newChangeHandler() { return (changeConsumer, object, propName, newValue, oldValue, handler) -> { - final PropertyOperation operation = - new PropertyOperation<>(object, SceneLayer.KEY, newValue, oldValue); + var operation = new PropertyOperation( + object, SceneLayer.KEY, newValue, oldValue); operation.setApplyHandler(handler); changeConsumer.execute(operation); @@ -74,13 +69,13 @@ public LayerModelPropertyControl(@Nullable final SceneLayer layer, @NotNull fina } @JmeThread - private void setLayer(@NotNull final Spatial spatial, @NotNull final SceneLayer newLayer) { + private void setLayer(@NotNull Spatial spatial, @NotNull SceneLayer newLayer) { SceneLayer.setLayer(newLayer, spatial); } @JmeThread - private SceneLayer getLayer(@NotNull final Spatial spatial) { - final SceneLayer sceneLayer = SceneLayer.getLayer(spatial); + private SceneLayer getLayer(@NotNull Spatial spatial) { + var sceneLayer = SceneLayer.getLayer(spatial); return sceneLayer == null ? SceneLayer.NO_LAYER : sceneLayer; } @@ -92,7 +87,7 @@ protected boolean isSingleRow() { @Override @FxThread - protected void createComponents(@NotNull final HBox container) { + protected void createComponents(@NotNull HBox container) { super.createComponents(container); layerComboBox = new ComboBox<>(); @@ -103,18 +98,18 @@ protected void createComponents(@NotNull final HBox container) { layerComboBox.getSelectionModel().selectedItemProperty() .addListener((observable, oldValue, newValue) -> updateLevel(newValue)); - FXUtils.addToPane(layerComboBox, container); - FXUtils.addClassTo(layerComboBox, CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); + FxUtils.addChild(container, layerComboBox); + FxUtils.addClass(layerComboBox, CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); } @FxThread - private void updateLevel(@Nullable final SceneLayer layer) { + private void updateLevel(@Nullable SceneLayer layer) { if (isIgnoreListener()) return; changed(layer, getPropertyValue()); } /** - * Gets layer combo box. + * Get the layers combo box. * * @return the layers combo box. */ @@ -127,16 +122,17 @@ private void updateLevel(@Nullable final SceneLayer layer) { @FxThread protected void reload() { - final SceneChangeConsumer changeConsumer = (SceneChangeConsumer) getChangeConsumer(); - final SceneNode currentModel = changeConsumer.getCurrentModel(); - final SceneLayer sceneLayer = getPropertyValue(); + var changeConsumer = (SceneChangeConsumer) getChangeConsumer(); + var currentModel = changeConsumer.getCurrentModel(); + var sceneLayer = getPropertyValue(); - final ComboBox levelComboBox = getLayerComboBox(); - final ObservableList items = levelComboBox.getItems(); + var levelComboBox = getLayerComboBox(); + var items = levelComboBox.getItems(); items.clear(); items.add(SceneLayer.NO_LAYER); items.addAll(currentModel.getLayers()); - levelComboBox.getSelectionModel().select(sceneLayer == null ? SceneLayer.NO_LAYER : sceneLayer); + levelComboBox.getSelectionModel() + .select(sceneLayer == null ? SceneLayer.NO_LAYER : sceneLayer); } } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/StringBasedArrayPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/StringBasedArrayPropertyControl.java new file mode 100644 index 00000000..562cdd6a --- /dev/null +++ b/src/main/java/com/ss/editor/ui/control/property/impl/StringBasedArrayPropertyControl.java @@ -0,0 +1,95 @@ +package com.ss.editor.ui.control.property.impl; + +import static com.ss.rlib.util.ObjectUtils.notNull; +import com.ss.editor.annotation.FromAnyThread; +import com.ss.editor.annotation.FxThread; +import com.ss.editor.model.undo.editor.ChangeConsumer; +import com.ss.editor.ui.control.property.PropertyControl; +import com.ss.editor.ui.css.CssClasses; +import com.ss.rlib.ui.util.FxUtils; +import javafx.scene.control.TextField; +import javafx.scene.input.KeyEvent; +import javafx.scene.layout.HBox; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * The implementation of the {@link PropertyControl} to edit array values. + * + * @param the change consumer's type. + * @param the type of an editing object. + * @param the type of an editing property. + * @author JavaSaBr + */ +public class StringBasedArrayPropertyControl extends PropertyControl { + + /** + * The filed with current value. + */ + @Nullable + private TextField valueField; + + public StringBasedArrayPropertyControl( + @Nullable T propertyValue, + @NotNull String propertyName, + @NotNull C changeConsumer + ) { + super(propertyValue, propertyName, changeConsumer); + } + + public StringBasedArrayPropertyControl( + @Nullable T propertyValue, + @NotNull String propertyName, + @NotNull C changeConsumer, + @Nullable ChangeHandler changeHandler + ) { + super(propertyValue, propertyName, changeConsumer, changeHandler); + } + + @Override + @FxThread + public void changeControlWidthPercent(double controlWidthPercent) { + super.changeControlWidthPercent(controlWidthPercent); + + var valueField = getValueField(); + valueField.prefWidthProperty().unbind(); + valueField.prefWidthProperty().bind(widthProperty().multiply(controlWidthPercent)); + } + + @Override + @FxThread + protected void createComponents(@NotNull HBox container) { + super.createComponents(container); + + valueField = new TextField(); + valueField.setOnKeyReleased(this::updateValue); + valueField.prefWidthProperty() + .bind(widthProperty().multiply(CONTROL_WIDTH_PERCENT)); + + FxUtils.addClass(valueField, CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); + FxUtils.addChild(container, valueField); + } + + @Override + @FromAnyThread + protected boolean isSingleRow() { + return true; + } + + /** + * Get the filed with current value. + * + * @return the filed with current value. + */ + @FxThread + protected @NotNull TextField getValueField() { + return notNull(valueField); + } + + /** + * Update the value. + */ + @FxThread + protected void updateValue(@Nullable KeyEvent event) { + } +} diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/StringPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/StringPropertyControl.java index 64056117..9a9ea651 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/StringPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/StringPropertyControl.java @@ -2,13 +2,12 @@ import static com.ss.rlib.util.ObjectUtils.notNull; import static com.ss.rlib.util.StringUtils.emptyIfNull; - import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.ui.util.FxUtils; import com.ss.rlib.util.StringUtils; import javafx.scene.control.TextField; import javafx.scene.input.KeyCode; @@ -52,8 +51,8 @@ protected void createComponents(@NotNull HBox container) { valueField.focusedProperty() .addListener((observable, oldValue, newValue) -> applyOnLostFocus(newValue)); - FXUtils.addClassTo(valueField, CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); - FXUtils.addToPane(valueField, container); + FxUtils.addClass(valueField, CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); + FxUtils.addChild(container, valueField); } @Override From f56f5193d3054f6e18e40007375a7d95a2a78f9f Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Fri, 13 Apr 2018 17:49:58 +0300 Subject: [PATCH 30/49] refactoring. --- .../com/ss/editor/manager/PluginManager.java | 67 ++--- .../context/menu/action/OpenFileAction.java | 14 +- .../menu/action/OpenFileByEditorAction.java | 10 +- .../editor/area/EditorAreaComponent.java | 3 +- .../impl/AudioKeyPropertyControl.java | 27 +- .../property/impl/BooleanPropertyControl.java | 10 +- .../impl/MaterialKeyPropertyControl.java | 5 +- .../WheelElementModelPropertyControl.java | 2 +- ...icleEmitterImagesModelPropertyControl.java | 11 +- .../ui/event/impl/RequestedOpenFileEvent.java | 23 +- .../java/com/ss/editor/util/EditorUtil.java | 276 +++++++++++------- 11 files changed, 246 insertions(+), 202 deletions(-) diff --git a/src/main/java/com/ss/editor/manager/PluginManager.java b/src/main/java/com/ss/editor/manager/PluginManager.java index 83ad2dc3..42c3138b 100644 --- a/src/main/java/com/ss/editor/manager/PluginManager.java +++ b/src/main/java/com/ss/editor/manager/PluginManager.java @@ -59,16 +59,16 @@ private PluginManager() { this.pluginSystem = newBasePluginSystem(getClass().getClassLoader()); this.pluginSystem.setAppVersion(Config.APP_VERSION); - final Path folderInUserHome = Config.getAppFolderInUserHome(); - final String embeddedPath = System.getProperty("editor.embedded.plugins.path"); + var folderInUserHome = Config.getAppFolderInUserHome(); + var embeddedPath = System.getProperty("editor.embedded.plugins.path"); - if (embeddedPath != null) { - final Path embeddedPluginPath = Paths.get(embeddedPath); + if (embeddedPath != null && Files.exists(Paths.get(embeddedPath))) { + var embeddedPluginPath = Paths.get(embeddedPath); LOGGER.debug(this, "embedded plugin path: " + embeddedPluginPath); pluginSystem.configureEmbeddedPluginPath(embeddedPluginPath); } else { - final Path rootFolder = Utils.getRootFolderFromClass(JmeApplication.class); - final Path embeddedPluginPath = rootFolder.resolve("embedded-plugins"); + var rootFolder = Utils.getRootFolderFromClass(JmeApplication.class); + var embeddedPluginPath = rootFolder.resolve("embedded-plugins"); LOGGER.debug(this, "embedded plugin path: " + embeddedPluginPath); if (Files.exists(embeddedPluginPath)) { pluginSystem.configureEmbeddedPluginPath(embeddedPluginPath); @@ -77,31 +77,31 @@ private PluginManager() { } } - final Path userPluginsFolder = folderInUserHome.resolve("plugins"); + var userPluginsFolder = folderInUserHome.resolve("plugins"); LOGGER.debug(this, "installation plugin path: " + userPluginsFolder); if (!Files.exists(userPluginsFolder)) { - Utils.run(() -> Files.createDirectories(userPluginsFolder)); + FileUtils.createDirectories(userPluginsFolder); } pluginSystem.configureInstallationPluginsPath(userPluginsFolder); try { pluginSystem.preLoad(); - } catch (final PreloadPluginException e) { + } catch (PreloadPluginException e) { FileUtils.delete(e.getPath()); throw e; } pluginSystem.initialize(); - final InitializationManager initializationManager = InitializationManager.getInstance(); - initializationManager.addOnBeforeCreateJmeContext(this::onBeforeCreateJmeContext); - initializationManager.addOnAfterCreateJmeContext(this::onAfterCreateJmeContext); - initializationManager.addOnBeforeCreateJavaFxContext(this::onBeforeCreateJavaFxContext); - initializationManager.addOnAfterCreateJavaFxContext(this::onAfterCreateJavaFxContext); - initializationManager.addOnFinishLoading(this::onFinishLoading); + var initManager = InitializationManager.getInstance(); + initManager.addOnBeforeCreateJmeContext(this::onBeforeCreateJmeContext); + initManager.addOnAfterCreateJmeContext(this::onAfterCreateJmeContext); + initManager.addOnBeforeCreateJavaFxContext(this::onBeforeCreateJavaFxContext); + initManager.addOnAfterCreateJavaFxContext(this::onAfterCreateJavaFxContext); + initManager.addOnFinishLoading(this::onFinishLoading); } /** @@ -109,7 +109,7 @@ private PluginManager() { * * @param path the path to the plugin. */ - public void installPlugin(@NotNull final Path path) { + public void installPlugin(@NotNull Path path) { pluginSystem.installPlugin(path, false); } @@ -118,7 +118,7 @@ public void installPlugin(@NotNull final Path path) { * * @param plugin the plugin. */ - public void removePlugin(@NotNull final EditorPlugin plugin) { + public void removePlugin(@NotNull EditorPlugin plugin) { pluginSystem.removePlugin(plugin); } @@ -127,8 +127,8 @@ public void removePlugin(@NotNull final EditorPlugin plugin) { */ @JmeThread private void onBeforeCreateJmeContext() { - final Array plugins = pluginSystem.getPlugins(); - plugins.stream().filter(EditorPlugin.class::isInstance) + pluginSystem.getPlugins().stream() + .filter(EditorPlugin.class::isInstance) .map(EditorPlugin.class::cast) .forEach(editorPlugin -> editorPlugin.onBeforeCreateJmeContext(pluginSystem)); } @@ -138,15 +138,16 @@ private void onBeforeCreateJmeContext() { */ @JmeThread private void onAfterCreateJmeContext() { - final Array plugins = pluginSystem.getPlugins(); - plugins.stream().filter(EditorPlugin.class::isInstance) + pluginSystem.getPlugins().stream() + .filter(EditorPlugin.class::isInstance) .map(EditorPlugin.class::cast) .forEach(editorPlugin -> { + editorPlugin.onAfterCreateJmeContext(pluginSystem); - final PluginContainer container = editorPlugin.getContainer(); - final URLClassLoader classLoader = container.getClassLoader(); - final AssetManager assetManager = EditorUtil.getAssetManager(); + var container = editorPlugin.getContainer(); + var classLoader = container.getClassLoader(); + var assetManager = EditorUtil.getAssetManager(); assetManager.addClassLoader(classLoader); }); } @@ -156,8 +157,8 @@ private void onAfterCreateJmeContext() { */ @FxThread private void onBeforeCreateJavaFxContext() { - final Array plugins = pluginSystem.getPlugins(); - plugins.stream().filter(EditorPlugin.class::isInstance) + pluginSystem.getPlugins().stream() + .filter(EditorPlugin.class::isInstance) .map(EditorPlugin.class::cast) .forEach(editorPlugin -> editorPlugin.onBeforeCreateJavaFxContext(pluginSystem)); } @@ -167,8 +168,8 @@ private void onBeforeCreateJavaFxContext() { */ @FxThread private void onAfterCreateJavaFxContext() { - final Array plugins = pluginSystem.getPlugins(); - plugins.stream().filter(EditorPlugin.class::isInstance) + pluginSystem.getPlugins().stream() + .filter(EditorPlugin.class::isInstance) .map(EditorPlugin.class::cast) .forEach(editorPlugin -> editorPlugin.onAfterCreateJavaFxContext(pluginSystem)); } @@ -178,8 +179,8 @@ private void onAfterCreateJavaFxContext() { */ @FxThread private void onFinishLoading() { - final Array plugins = pluginSystem.getPlugins(); - plugins.stream().filter(EditorPlugin.class::isInstance) + pluginSystem.getPlugins().stream() + .filter(EditorPlugin.class::isInstance) .map(EditorPlugin.class::cast) .forEach(editorPlugin -> editorPlugin.onFinishLoading(pluginSystem)); } @@ -190,9 +191,9 @@ private void onFinishLoading() { * @param consumer the consumer. */ @FromAnyThread - public void handlePlugins(@NotNull final Consumer consumer) { - final Array plugins = pluginSystem.getPlugins(); - plugins.stream().filter(EditorPlugin.class::isInstance) + public void handlePlugins(@NotNull Consumer consumer) { + pluginSystem.getPlugins().stream() + .filter(EditorPlugin.class::isInstance) .map(EditorPlugin.class::cast) .forEach(consumer); } diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/OpenFileAction.java b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/OpenFileAction.java index 07296e75..481714b1 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/OpenFileAction.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/OpenFileAction.java @@ -15,24 +15,20 @@ */ public class OpenFileAction extends FileAction { - public OpenFileAction(@NotNull final ResourceElement element) { + public OpenFileAction(@NotNull ResourceElement element) { super(element); } - @FxThread @Override + @FxThread protected @NotNull String getName() { return Messages.ASSET_COMPONENT_RESOURCE_TREE_CONTEXT_MENU_OPEN_FILE; } - @FxThread @Override - protected void execute(@Nullable final ActionEvent event) { + @FxThread + protected void execute(@Nullable ActionEvent event) { super.execute(event); - - final RequestedOpenFileEvent newEvent = new RequestedOpenFileEvent(); - newEvent.setFile(getElement().getFile()); - - FX_EVENT_MANAGER.notify(newEvent); + FX_EVENT_MANAGER.notify(new RequestedOpenFileEvent(getElement().getFile())); } } diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/OpenFileByEditorAction.java b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/OpenFileByEditorAction.java index 175f56c2..614bbaaa 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/OpenFileByEditorAction.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/OpenFileByEditorAction.java @@ -24,14 +24,13 @@ class OpenFileByEditorAction extends FileAction { @NotNull private final EditorDescription description; - public OpenFileByEditorAction(@NotNull final ResourceElement element, - @NotNull final EditorDescription description) { + public OpenFileByEditorAction(@NotNull ResourceElement element, @NotNull EditorDescription description) { super(element); this.description = description; setText(description.getEditorName()); - final Image icon = description.getIcon(); + var icon = description.getIcon(); if (icon != null) { setGraphic(new ImageView(icon)); @@ -46,11 +45,10 @@ public OpenFileByEditorAction(@NotNull final ResourceElement element, @FxThread @Override - protected void execute(@Nullable final ActionEvent event) { + protected void execute(@Nullable ActionEvent event) { super.execute(event); - final RequestedOpenFileEvent newEvent = new RequestedOpenFileEvent(); - newEvent.setFile(getElement().getFile()); + var newEvent = new RequestedOpenFileEvent(getElement().getFile()); newEvent.setDescription(description); FX_EVENT_MANAGER.notify(newEvent); diff --git a/src/main/java/com/ss/editor/ui/component/editor/area/EditorAreaComponent.java b/src/main/java/com/ss/editor/ui/component/editor/area/EditorAreaComponent.java index 7c99c8ce..1a8b71f9 100644 --- a/src/main/java/com/ss/editor/ui/component/editor/area/EditorAreaComponent.java +++ b/src/main/java/com/ss/editor/ui/component/editor/area/EditorAreaComponent.java @@ -644,8 +644,7 @@ private void loadOpenedFiles() { return; } - final RequestedOpenFileEvent event = new RequestedOpenFileEvent(); - event.setFile(file); + var event = new RequestedOpenFileEvent(file); event.setDescription(description); event.setNeedShow(StringUtils.equals(assetPath, editFile)); diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/AudioKeyPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/AudioKeyPropertyControl.java index 71c918c0..6b4bcb4a 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/AudioKeyPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/AudioKeyPropertyControl.java @@ -15,8 +15,10 @@ import com.ss.editor.ui.event.impl.RequestedOpenFileEvent; import com.ss.editor.ui.util.DynamicIconSupport; import com.ss.editor.ui.util.UiUtils; +import com.ss.editor.util.EditorUtil; import com.ss.rlib.ui.util.FxUtils; import com.ss.rlib.util.StringUtils; +import javafx.event.ActionEvent; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.image.ImageView; @@ -92,12 +94,12 @@ protected void createComponents(@NotNull HBox container) { var changeButton = new Button(); changeButton.setGraphic(new ImageView(Icons.ADD_16)); - changeButton.setOnAction(event -> processChange()); + changeButton.setOnAction(this::processChange); var openButton = new Button(); openButton.setGraphic(new ImageView(Icons.EDIT_16)); openButton.disableProperty().bind(audioKeyLabel.textProperty().isEqualTo(NO_AUDIO)); - openButton.setOnAction(event -> processOpen()); + openButton.setOnAction(this::processOpen); audioKeyLabel.prefWidthProperty().bind(widthProperty() .subtract(changeButton.widthProperty()) @@ -114,9 +116,11 @@ protected void createComponents(@NotNull HBox container) { /** * Show dialog for choosing another audio key. + * + * @param event the action event. */ @FxThread - protected void processChange() { + protected void processChange(@Nullable ActionEvent event) { UiUtils.openFileAssetDialog(this::addAudioData, AUDIO_EXTENSIONS, DEFAULT_ACTION_TESTER); } @@ -142,9 +146,11 @@ private void addAudioData(@NotNull Path file) { /** * Open this audio data in the audio viewer. + * + * @param event the action event. */ @FxThread - protected void processOpen() { + protected void processOpen(@Nullable ActionEvent event) { var element = getPropertyValue(); if (element == null) { @@ -162,10 +168,7 @@ protected void processOpen() { return; } - var event = new RequestedOpenFileEvent(); - event.setFile(realFile); - - FX_EVENT_MANAGER.notify(event); + FX_EVENT_MANAGER.notify(new RequestedOpenFileEvent(realFile)); } /** @@ -181,8 +184,10 @@ protected void processOpen() { @Override @FxThread protected void reload() { - var element = getPropertyValue(); - var audioKeyLabel = getAudioKeyLabel(); - audioKeyLabel.setText(element == null || StringUtils.isEmpty(element.getName()) ? NO_AUDIO : element.getName()); + getAudioKeyLabel().setText(getKeyLabel(getPropertyValue())); + } + + private @NotNull String getKeyLabel(@Nullable AudioKey assetKey) { + return EditorUtil.isEmpty(assetKey) ? NO_AUDIO : assetKey.getName(); } } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/BooleanPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/BooleanPropertyControl.java index 1610fcd4..af10ce82 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/BooleanPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/BooleanPropertyControl.java @@ -7,6 +7,7 @@ import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; import com.ss.rlib.ui.util.FXUtils; +import javafx.beans.value.ObservableValue; import javafx.scene.control.CheckBox; import javafx.scene.layout.HBox; import javafx.scene.layout.Region; @@ -53,8 +54,7 @@ protected void createComponents(@NotNull HBox container) { super.createComponents(container); checkBox = new CheckBox(); - checkBox.selectedProperty() - .addListener((observable, oldValue, newValue) -> updateValue()); + checkBox.selectedProperty().addListener(this::updateValue); checkBox.prefWidthProperty() .bind(widthProperty().multiply(CONTROL_WIDTH_PERCENT)); @@ -129,7 +129,11 @@ public boolean isDirty() { * Update the value. */ @FxThread - private void updateValue() { + private void updateValue( + @NotNull ObservableValue observable, + @NotNull Boolean oldValue, + @NotNull Boolean newValue + ) { if (!isIgnoreListener()) { apply(); } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/MaterialKeyPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/MaterialKeyPropertyControl.java index 4e4d933c..2e50450a 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/MaterialKeyPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/MaterialKeyPropertyControl.java @@ -71,10 +71,7 @@ protected void processEdit() { return; } - final RequestedOpenFileEvent event = new RequestedOpenFileEvent(); - event.setFile(realFile); - - FX_EVENT_MANAGER.notify(event); + FX_EVENT_MANAGER.notify(new RequestedOpenFileEvent(realFile)); } @FxThread diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/WheelElementModelPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/WheelElementModelPropertyControl.java index 132253a0..3f15790b 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/WheelElementModelPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/WheelElementModelPropertyControl.java @@ -51,7 +51,7 @@ private boolean checkSpatial(@NotNull Spatial spatial) { var numWheels = control.getNumWheels(); - for (int i = 0; i < numWheels; i++) { + for (var i = 0; i < numWheels; i++) { var wheel = control.getWheel(i); if (wheel == getEditObject()) { return true; diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/particle/ParticleEmitterImagesModelPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/particle/ParticleEmitterImagesModelPropertyControl.java index 917c4039..9b5f73f6 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/particle/ParticleEmitterImagesModelPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/particle/ParticleEmitterImagesModelPropertyControl.java @@ -15,10 +15,13 @@ public class ParticleEmitterImagesModelPropertyControl extends Vector2fPropertyControl { - public ParticleEmitterImagesModelPropertyControl(@NotNull final Vector2f element, - @NotNull final String paramName, - @NotNull final ModelChangeConsumer modelChangeConsumer) { - super(element, paramName, modelChangeConsumer); + public ParticleEmitterImagesModelPropertyControl( + @NotNull Vector2f element, + @NotNull String paramName, + @NotNull ModelChangeConsumer changeConsumer + ) { + + super(element, paramName, changeConsumer); getXField().setMinMax(1, Integer.MAX_VALUE); getYField().setMinMax(1, Integer.MAX_VALUE); } diff --git a/src/main/java/com/ss/editor/ui/event/impl/RequestedOpenFileEvent.java b/src/main/java/com/ss/editor/ui/event/impl/RequestedOpenFileEvent.java index 022732e6..0be73eda 100644 --- a/src/main/java/com/ss/editor/ui/event/impl/RequestedOpenFileEvent.java +++ b/src/main/java/com/ss/editor/ui/event/impl/RequestedOpenFileEvent.java @@ -28,20 +28,11 @@ public class RequestedOpenFileEvent extends SceneEvent { } } - /** - * The constant EDITOR. - */ - public static final String EDITOR = "editor"; - + private static final String EDITOR = "editor"; private static final String FILE = "file"; private static final String NEED_SHOW = "need_show"; - public RequestedOpenFileEvent() { - super(EVENT_TYPE); - setNeedShow(true); - } - - public RequestedOpenFileEvent(@NotNull final Path file) { + public RequestedOpenFileEvent(@NotNull Path file) { super(EVENT_TYPE); setNeedShow(true); setFile(file); @@ -61,7 +52,7 @@ public RequestedOpenFileEvent(@NotNull final Path file) { * * @param description the editor descriptor. */ - public void setDescription(@Nullable final EditorDescription description) { + public void setDescription(@Nullable EditorDescription description) { if (description == null) { remove(EDITOR); } else { @@ -83,12 +74,12 @@ public void setDescription(@Nullable final EditorDescription description) { * * @param file the file to open. */ - public void setFile(final Path file) { + public void setFile(@NotNull Path file) { set(FILE, file); } /** - * Is need show boolean. + * Return true if need to show the editor. * * @return true if need to show the editor. */ @@ -97,11 +88,11 @@ public boolean isNeedShow() { } /** - * Set the need show. + * Set true if need to show the editor. * * @param needShow true if need to show the editor. */ - public void setNeedShow(final boolean needShow) { + public void setNeedShow(boolean needShow) { set(NEED_SHOW, needShow); } } diff --git a/src/main/java/com/ss/editor/util/EditorUtil.java b/src/main/java/com/ss/editor/util/EditorUtil.java index 905c4467..2c04dd34 100644 --- a/src/main/java/com/ss/editor/util/EditorUtil.java +++ b/src/main/java/com/ss/editor/util/EditorUtil.java @@ -7,6 +7,7 @@ import static java.lang.ThreadLocal.withInitial; import static java.util.stream.Collectors.toList; import com.jme3.app.state.AppStateManager; +import com.jme3.asset.AssetKey; import com.jme3.asset.AssetManager; import com.jme3.environment.generation.JobProgressAdapter; import com.jme3.input.InputManager; @@ -40,6 +41,7 @@ import com.ss.rlib.logging.Logger; import com.ss.rlib.logging.LoggerManager; import com.ss.rlib.util.ClassUtils; +import com.ss.rlib.util.StringUtils; import com.ss.rlib.util.array.Array; import javafx.scene.control.Alert; import javafx.scene.input.ClipboardContent; @@ -92,11 +94,11 @@ public abstract class EditorUtil { @NotNull private static JfxApplication jfxApplication; - public static void setJmeApplication(@NotNull final JmeApplication jmeApplication) { + public static void setJmeApplication(@NotNull JmeApplication jmeApplication) { EditorUtil.jmeApplication = jmeApplication; } - public static void setJfxApplication(@NotNull final JfxApplication jfxApplication) { + public static void setJfxApplication(@NotNull JfxApplication jfxApplication) { EditorUtil.jfxApplication = jfxApplication; } @@ -222,7 +224,7 @@ public static void enableGlobalLightProbe() { * @param progressAdapter the progress adapter */ @JmeThread - public static void updateGlobalLightProbe(@NotNull final JobProgressAdapter progressAdapter) { + public static void updateGlobalLightProbe(@NotNull JobProgressAdapter progressAdapter) { jmeApplication.updateLightProbe(progressAdapter); } @@ -272,7 +274,7 @@ public static void updateGlobalLightProbe(@NotNull final JobProgressAdapter cs = EditorUtil.class; + public static boolean checkExists(@NotNull String path) { + var cs = EditorUtil.class; return cs.getResource(path) != null || cs.getResource("/" + path) != null; } @@ -358,7 +360,7 @@ public static boolean checkExists(@NotNull final String path) { * @return true if the resource is exists. */ @FromAnyThread - public static boolean checkExists(@NotNull final String path, @NotNull final ClassLoader classLoader) { + public static boolean checkExists(@NotNull String path, @NotNull ClassLoader classLoader) { return classLoader.getResource(path) != null || classLoader.getResource("/" + path) != null; } @@ -370,13 +372,13 @@ public static boolean checkExists(@NotNull final String path, @NotNull final Cla * @return the external form or null. */ @FromAnyThread - public static @Nullable String toExternal(@NotNull final String path, @NotNull final ClassLoader classLoader) { + public static @Nullable String toExternal(@NotNull String path, @NotNull ClassLoader classLoader) { if (!checkExists(path, classLoader)) { return null; } - URL resource = classLoader.getResource(path); + var resource = classLoader.getResource(path); if (resource == null) { resource = classLoader.getResource("/" + path); } @@ -393,18 +395,21 @@ public static boolean checkExists(@NotNull final String path, @NotNull final Cla * @return the angle between these points. */ @FromAnyThread - public static float getAngle(@NotNull final Vector2f center, @NotNull final Vector2f first, - @NotNull final Vector2f second) { + public static float getAngle( + @NotNull Vector2f center, + @NotNull Vector2f first, + @NotNull Vector2f second + ) { - final float x = center.getX(); - final float y = center.getY(); + var x = center.getX(); + var y = center.getY(); - final float ax = first.getX() - x; - final float ay = first.getY() - y; - final float bx = second.getX() - x; - final float by = second.getY() - y; + var ax = first.getX() - x; + var ay = first.getY() - y; + var bx = second.getX() - x; + var by = second.getY() - y; - final float delta = (float) ((ax * bx + ay * by) / Math.sqrt((ax * ax + ay * ay) * (bx * bx + by * by))); + var delta = (float) ((ax * bx + ay * by) / Math.sqrt((ax * ax + ay * ay) * (bx * bx + by * by))); if (delta > 1.0) { return 0.0F; @@ -422,19 +427,19 @@ public static float getAngle(@NotNull final Vector2f center, @NotNull final Vect * @return the input stream of the resource or null. */ @FromAnyThread - public static @Nullable InputStream getInputStream(@NotNull final String path) { + public static @Nullable InputStream getInputStream(@NotNull String path) { return JfxApplication.class.getResourceAsStream(path); } /** - * Gets input stream. + * Get the input stream. * * @param path the path to resource. * @param classLoader the class loader. * @return the input stream of the resource or null. */ @FromAnyThread - public static @Nullable InputStream getInputStream(@NotNull final String path, @NotNull final ClassLoader classLoader) { + public static @Nullable InputStream getInputStream(@NotNull String path, @NotNull ClassLoader classLoader) { return classLoader.getResourceAsStream(path); } @@ -456,15 +461,15 @@ public static float getAngle(@NotNull final Vector2f center, @NotNull final Vect * @return true of we can see the position on the screen. */ @FromAnyThread - public static boolean isVisibleOnScreen(@NotNull final Vector3f position, @NotNull final Camera camera) { + public static boolean isVisibleOnScreen(@NotNull Vector3f position, @NotNull Camera camera) { - final int maxHeight = camera.getHeight(); - final int maxWidth = camera.getWidth(); + var maxHeight = camera.getHeight(); + var maxWidth = camera.getWidth(); - final boolean isBottom = position.getY() < 0; - final boolean isTop = position.getY() > maxHeight; - final boolean isLeft = position.getX() < 0; - final boolean isRight = position.getX() > maxWidth; + var isBottom = position.getY() < 0; + var isTop = position.getY() > maxHeight; + var isLeft = position.getX() < 0; + var isRight = position.getX() > maxWidth; return !isBottom && !isLeft && !isTop && !isRight && position.getZ() < 1F; } @@ -478,8 +483,12 @@ public static boolean isVisibleOnScreen(@NotNull final Vector3f position, @NotNu * @param length the distance. */ @FromAnyThread - public static void movePoint(@NotNull final Vector3f first, @NotNull final Vector3f second, - @NotNull final Vector3f store, final int length) { + public static void movePoint( + @NotNull Vector3f first, + @NotNull Vector3f second, + @NotNull Vector3f store, + int length + ) { store.x = first.x + (second.x - first.x) * length; store.y = first.y + (second.y - first.y) * length; store.z = first.z + (second.z - first.z) * length; @@ -492,8 +501,8 @@ public static void movePoint(@NotNull final Vector3f first, @NotNull final Vecto * @return the string presentation. */ @FromAnyThread - public static @NotNull String timeFormat(final long time) { - final SimpleDateFormat format = LOCATE_DATE_FORMAT.get(); + public static @NotNull String timeFormat(long time) { + var format = LOCATE_DATE_FORMAT.get(); return format.format(new Date(time)); } @@ -505,7 +514,7 @@ public static void movePoint(@NotNull final Vector3f first, @NotNull final Vecto * @return the relative path. */ @FromAnyThread - public static @NotNull Path getAssetFile(@NotNull final Path assetFolder, @NotNull final Path file) { + public static @NotNull Path getAssetFile(@NotNull Path assetFolder, @NotNull Path file) { return assetFolder.relativize(file); } @@ -516,10 +525,10 @@ public static void movePoint(@NotNull final Vector3f first, @NotNull final Vecto * @return the relative path. */ @FromAnyThread - public static @Nullable Path getAssetFile(@NotNull final Path file) { + public static @Nullable Path getAssetFile(@NotNull Path file) { - final EditorConfig editorConfig = EditorConfig.getInstance(); - final Path currentAsset = editorConfig.getCurrentAsset(); + var editorConfig = EditorConfig.getInstance(); + var currentAsset = editorConfig.getCurrentAsset(); if (currentAsset == null) { return null; } @@ -540,10 +549,14 @@ public static void movePoint(@NotNull final Vector3f first, @NotNull final Vecto * @return the absolute path to the file. */ @FromAnyThread - public static @Nullable Path getRealFile(@NotNull final Path assetFile) { - final EditorConfig editorConfig = EditorConfig.getInstance(); - final Path currentAsset = editorConfig.getCurrentAsset(); - if (currentAsset == null) return null; + public static @Nullable Path getRealFile(@NotNull Path assetFile) { + + var editorConfig = EditorConfig.getInstance(); + var currentAsset = editorConfig.getCurrentAsset(); + if (currentAsset == null) { + return null; + } + return currentAsset.resolve(assetFile); } @@ -554,10 +567,14 @@ public static void movePoint(@NotNull final Vector3f first, @NotNull final Vecto * @return the absolute path to the file. */ @FromAnyThread - public static @Nullable Path getRealFile(@NotNull final String assetFile) { - final EditorConfig editorConfig = EditorConfig.getInstance(); - final Path currentAsset = editorConfig.getCurrentAsset(); - if (currentAsset == null) return null; + public static @Nullable Path getRealFile(@NotNull String assetFile) { + + var editorConfig = EditorConfig.getInstance(); + var currentAsset = editorConfig.getCurrentAsset(); + if (currentAsset == null) { + return null; + } + return currentAsset.resolve(assetFile); } @@ -568,35 +585,43 @@ public static void movePoint(@NotNull final Vector3f first, @NotNull final Vecto * @return the valid asset path for the file. */ @FromAnyThread - public static @NotNull String toAssetPath(@NotNull final Path path) { - if (File.separatorChar == '/') return path.toString(); + public static @NotNull String toAssetPath(@NotNull Path path) { + + if (File.separatorChar == '/') { + return path.toString(); + } + return path.toString().replace("\\", "/"); } /** * Handle exception. * - * @param logger the logger - * @param owner the owner - * @param e the e + * @param logger the logger. + * @param owner the owner. + * @param e the exception. */ @FromAnyThread - public static void handleException(@Nullable final Logger logger, @Nullable final Object owner, - @NotNull final Exception e) { + public static void handleException(@Nullable Logger logger, @Nullable Object owner, @NotNull Exception e) { handleException(logger, owner, e, null); } /** * Handle exception. * - * @param logger the logger - * @param owner the owner - * @param e the e - * @param callback the callback + * @param logger the logger. + * @param owner the owner. + * @param e the exception. + * @param callback the callback. */ @FromAnyThread - public static void handleException(@Nullable Logger logger, @Nullable final Object owner, - @NotNull final Exception e, @Nullable final Runnable callback) { + public static void handleException( + @Nullable Logger logger, + @Nullable Object owner, + @NotNull Exception e, + @Nullable Runnable callback + ) { + if (logger == null) { logger = LOGGER; } @@ -607,15 +632,15 @@ public static void handleException(@Nullable Logger logger, @Nullable final Obje logger.warning(owner, e); } - final ExecutorManager executorManager = ExecutorManager.getInstance(); + var executorManager = ExecutorManager.getInstance(); executorManager.addFxTask(() -> { GAnalytics.sendException(e, false); - final String localizedMessage = e.getLocalizedMessage(); - final String stackTrace = buildStackTrace(e); + var localizedMessage = e.getLocalizedMessage(); + var stackTrace = buildStackTrace(e); - final Alert alert = UiUtils.createErrorAlert(e, localizedMessage, stackTrace); + var alert = UiUtils.createErrorAlert(e, localizedMessage, stackTrace); alert.show(); alert.setWidth(500); alert.setHeight(220); @@ -633,18 +658,18 @@ public static void handleException(@Nullable Logger logger, @Nullable final Obje * @return the built stack trace. */ @FromAnyThread - public static String buildStackTrace(@NotNull final Exception exception) { + public static String buildStackTrace(@NotNull Exception exception) { - StringWriter writer = new StringWriter(); - PrintWriter printWriter = new PrintWriter(writer); + var writer = new StringWriter(); + var printWriter = new PrintWriter(writer); exception.printStackTrace(printWriter); - String stackTrace = writer.toString(); + var stackTrace = writer.toString(); - int level = 0; + var level = 0; - for (Throwable cause = exception.getCause(); cause != null && level < 6; cause = cause.getCause(), level++) { + for (var cause = exception.getCause(); cause != null && level < 6; cause = cause.getCause(), level++) { writer = new StringWriter(); printWriter = new PrintWriter(writer); @@ -663,10 +688,10 @@ public static String buildStackTrace(@NotNull final Exception exception) { * @param path the path */ @FromAnyThread - public static void openFileInExternalEditor(@NotNull final Path path) { + public static void openFileInExternalEditor(@NotNull Path path) { - final Platform platform = JmeSystem.getPlatform(); - final List commands = new ArrayList<>(); + var platform = JmeSystem.getPlatform(); + var commands = new ArrayList(); if (platform == Platform.MacOSX64 || platform == Platform.MacOSX_PPC64) { commands.add("open"); @@ -678,24 +703,26 @@ public static void openFileInExternalEditor(@NotNull final Path path) { commands.add("xdg-open"); } - if (commands.isEmpty()) return; + if (commands.isEmpty()) { + return; + } - final String url; + String url; try { url = path.toUri().toURL().toString(); - } catch (final MalformedURLException e) { + } catch (MalformedURLException e) { handleException(LOGGER, null, e); return; } commands.add(url); - final ProcessBuilder processBuilder = new ProcessBuilder(); + var processBuilder = new ProcessBuilder(); processBuilder.command(commands); try { processBuilder.start(); - } catch (final IOException e) { + } catch (IOException e) { handleException(LOGGER, null, e); } } @@ -708,8 +735,8 @@ public static void openFileInExternalEditor(@NotNull final Path path) { @FromAnyThread public static void openFileInSystemExplorer(@NotNull Path path) { - final Platform platform = JmeSystem.getPlatform(); - final List commands = new ArrayList<>(); + var platform = JmeSystem.getPlatform(); + var commands = new ArrayList(); if (platform == Platform.MacOSX64 || platform == Platform.MacOSX_PPC64) { commands.add("open"); @@ -735,34 +762,34 @@ public static void openFileInSystemExplorer(@NotNull Path path) { return; } - final String url; + String url; try { url = path.toUri().toURL().toString(); - } catch (final MalformedURLException e) { + } catch (MalformedURLException e) { handleException(LOGGER, null, e); return; } commands.add(url); - final ProcessBuilder processBuilder = new ProcessBuilder(); + var processBuilder = new ProcessBuilder(); processBuilder.command(commands); try { processBuilder.start(); - } catch (final IOException e) { + } catch (IOException e) { handleException(LOGGER, null, e); } } @FromAnyThread - private static boolean isAppExists(@NotNull final String command) { + private static boolean isAppExists(@NotNull String command) { - final Runtime runtime = Runtime.getRuntime(); - final int result; + var runtime = Runtime.getRuntime(); + int result; try { - final Process exec = runtime.exec(command); + var exec = runtime.exec(command); result = exec.waitFor(); - } catch (final InterruptedException | IOException e) { + } catch (InterruptedException | IOException e) { return false; } @@ -776,13 +803,16 @@ private static boolean isAppExists(@NotNull final String command) { * @return the byte array. */ @FromAnyThread - public static @NotNull byte[] serialize(@NotNull final Serializable object) { - final ByteArrayOutputStream bout = new ByteArrayOutputStream(); - try (final ObjectOutputStream out = new ObjectOutputStream(bout)) { + public static @NotNull byte[] serialize(@NotNull Serializable object) { + + var bout = new ByteArrayOutputStream(); + + try (var out = new ObjectOutputStream(bout)) { out.writeObject(object); - } catch (final IOException e) { + } catch (IOException e) { LOGGER.warning(e); } + return bout.toByteArray(); } @@ -794,11 +824,13 @@ private static boolean isAppExists(@NotNull final String command) { * @return the result object. */ @FromAnyThread - public static @NotNull T deserialize(@NotNull final byte[] bytes) { - final ByteArrayInputStream bin = new ByteArrayInputStream(bytes); - try (final ObjectInputStream in = new ExtObjectInputStream(bin)) { + public static @NotNull T deserialize(@NotNull byte[] bytes) { + + var bin = new ByteArrayInputStream(bytes); + + try (var in = new ExtObjectInputStream(bin)) { return unsafeCast(in.readObject()); - } catch (final ClassNotFoundException | IOException e) { + } catch (ClassNotFoundException | IOException e) { throw new RuntimeException(e); } } @@ -823,10 +855,15 @@ public static float clipNumber(float value, float mod) { * @return the array of enum values. */ @FromAnyThread - public static > @NotNull E[] getAvailableValues(@NotNull final E value) { - final Class valueClass = value.getClass(); - if (!valueClass.isEnum()) throw new RuntimeException("The class " + valueClass + " isn't enum."); - final Enum[] enumConstants = valueClass.getEnumConstants(); + public static > @NotNull E[] getAvailableValues(@NotNull E value) { + + var valueClass = value.getClass(); + if (!valueClass.isEnum()) { + throw new RuntimeException("The class " + valueClass + " isn't enum."); + } + + var enumConstants = valueClass.getEnumConstants(); + return ClassUtils.unsafeCast(enumConstants); } @@ -840,32 +877,35 @@ public static float clipNumber(float value, float mod) { * @return the new instance or null. */ @FromAnyThread - public static @Nullable T tryToCreateUserObject(@NotNull final Object owner, @NotNull final String className, - @NotNull final Class resultType) { + public static @Nullable T tryToCreateUserObject( + @NotNull Object owner, + @NotNull String className, + @NotNull Class resultType + ) { - final ResourceManager resourceManager = ResourceManager.getInstance(); - final ClasspathManager classpathManager = ClasspathManager.getInstance(); + var resourceManager = ResourceManager.getInstance(); + var classpathManager = ClasspathManager.getInstance(); Object newExample = null; try { newExample = ClassUtils.newInstance(className); } catch (final RuntimeException e) { - final Array classLoaders = resourceManager.getClassLoaders(); + var classLoaders = resourceManager.getClassLoaders(); - for (final URLClassLoader classLoader : classLoaders) { + for (var classLoader : classLoaders) { try { - final Class targetClass = classLoader.loadClass(className); + var targetClass = classLoader.loadClass(className); newExample = ClassUtils.newInstance(targetClass); - } catch (final ClassNotFoundException ex) { + } catch (ClassNotFoundException ex) { LOGGER.warning(owner, e); } } - final URLClassLoader librariesLoader = classpathManager.getLibrariesLoader(); + var librariesLoader = classpathManager.getLibrariesLoader(); if (librariesLoader != null) { try { - final Class targetClass = librariesLoader.loadClass(className); + var targetClass = librariesLoader.loadClass(className); newExample = ClassUtils.newInstance(targetClass); } catch (final ClassNotFoundException ex) { LOGGER.warning(owner, e); @@ -883,14 +923,14 @@ public static float clipNumber(float value, float mod) { * @return the default layer or null. */ @FromAnyThread - public static @Nullable SceneLayer getDefaultLayer(@NotNull final ChangeConsumer consumer) { + public static @Nullable SceneLayer getDefaultLayer(@NotNull ChangeConsumer consumer) { if (!(consumer instanceof SceneChangeConsumer)) { return null; } - final SceneNode sceneNode = ((SceneChangeConsumer) consumer).getCurrentModel(); - final List layers = sceneNode.getLayers(); + var sceneNode = ((SceneChangeConsumer) consumer).getCurrentModel(); + var layers = sceneNode.getLayers(); if (layers.isEmpty()) { return null; @@ -898,4 +938,14 @@ public static float clipNumber(float value, float mod) { return layers.get(0); } + + /** + * Return true if the asset key is null or empty. + * + * @param assetKey the asset key. + * @return true if the asset key is null or empty. + */ + public static boolean isEmpty(@Nullable AssetKey assetKey) { + return assetKey == null || StringUtils.isEmpty(assetKey.getName()); + } } From 106b5ab43fa5173ebd93a626656e91823049852c Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Sun, 15 Apr 2018 16:19:49 +0300 Subject: [PATCH 31/49] refactoring. --- build.gradle | 6 +- .../java/com/ss/editor/FileExtensions.java | 4 +- .../java/com/ss/editor/JfxApplication.java | 24 ++++---- .../java/com/ss/editor/JmeApplication.java | 8 +-- src/main/java/com/ss/editor/Messages.java | 2 +- .../editor/analytics/google/GAnalytics.java | 18 +++--- .../asset/locator/FileSystemAssetLocator.java | 6 +- .../java/com/ss/editor/config/Config.java | 8 +-- .../config/DefaultSettingsProvider.java | 6 +- .../com/ss/editor/config/EditorConfig.java | 16 +++--- .../painting/spawn/SpawnToolControl.java | 8 +-- .../ChangeHeightTerrainToolControl.java | 12 ++-- .../terrain/LevelTerrainToolControl.java | 2 +- .../terrain/PaintTerrainToolControl.java | 8 +-- .../terrain/RaiseLowerTerrainToolControl.java | 2 +- .../terrain/RoughTerrainToolControl.java | 2 +- .../terrain/SlopeTerrainToolControl.java | 2 +- .../terrain/SmoothTerrainToolControl.java | 2 +- .../transform/AbstractTransformControl.java | 6 +- .../control/transform/MoveToolControl.java | 2 +- .../transform/RotationToolControl.java | 2 +- .../control/transform/ScaleToolControl.java | 2 +- .../ss/editor/document/DocumentConfig.java | 4 +- .../impl/AbstractEditorTaskExecutor.java | 14 ++--- .../impl/BackgroundEditorTaskExecutor.java | 2 +- .../executor/impl/FxEditorTaskExecutor.java | 4 +- .../executor/impl/JmeThreadExecutor.java | 12 ++-- .../converter/FileConverterDescription.java | 4 +- .../file/converter/FileConverterRegistry.java | 12 ++-- .../converter/impl/AbstractFileConverter.java | 12 ++-- .../impl/AbstractModelFileConverter.java | 20 +++---- .../impl/BlendToJ3oFileConverter.java | 4 +- .../converter/impl/FbxToJ3oFileConverter.java | 4 +- .../impl/GltfToJ3oFileConverter.java | 4 +- .../impl/MeshXmlToJ3oFileConverter.java | 6 +- .../converter/impl/ObjToJ3oFileConverter.java | 4 +- .../impl/SceneToJ3oFileConverter.java | 4 +- .../impl/XbufToJ3oFileConverter.java | 4 +- .../handler/FileDeleteHandlerFactory.java | 4 +- .../impl/AbstractFileDeleteHandler.java | 4 +- ...DeleteMaterialsModelFileDeleteHandler.java | 10 ++-- .../ss/editor/manager/ClasspathManager.java | 18 +++--- .../ss/editor/manager/ExecutorManager.java | 6 +- .../ss/editor/manager/FileIconManager.java | 20 +++---- .../editor/manager/InitializationManager.java | 4 +- .../ss/editor/manager/JavaFxImageManager.java | 26 ++++----- .../editor/manager/JmeFilePreviewManager.java | 16 +++--- .../com/ss/editor/manager/PluginManager.java | 22 ++++---- .../editor/manager/RemoteControlManager.java | 12 ++-- .../ss/editor/manager/ResourceManager.java | 42 +++++++------- .../ss/editor/manager/WorkspaceManager.java | 10 ++-- .../com/ss/editor/model/EditorCamera.java | 8 +-- .../editor/model/scene/EditorAudioNode.java | 2 +- .../editor/model/scene/EditorLightNode.java | 2 +- .../model/scene/EditorPresentableNode.java | 2 +- .../model/undo/EditorOperationControl.java | 4 +- .../undo/impl/AbstractEditorOperation.java | 6 +- .../undo/impl/AddVehicleWheelOperation.java | 2 +- .../undo/impl/ChangeControlsOperation.java | 2 +- .../undo/impl/DisableControlsOperation.java | 2 +- .../undo/impl/EnableControlsOperation.java | 2 +- .../undo/impl/RemoveElementsOperation.java | 4 +- .../impl/RemoveVehicleWheelOperation.java | 2 +- .../impl/scene/RemoveSceneLayerOperation.java | 4 +- .../ss/editor/model/workspace/Workspace.java | 14 ++--- .../editor/impl/AbstractEditor3DPart.java | 4 +- .../impl/AdvancedAbstractEditor3DPart.java | 14 ++--- .../part3d/editor/impl/Stats3DPart.java | 6 +- .../editor/impl/audio/AudioViewer3DPart.java | 2 +- .../editor/impl/model/ModelEditor3DPart.java | 4 +- .../impl/scene/AbstractSceneEditor3DPart.java | 16 +++--- .../ApplyScaleToPhysicsControlsHandler.java | 4 +- .../DisableControlsTransformationHandler.java | 8 +-- .../com/ss/editor/plugin/EditorPlugin.java | 6 +- .../plugin/api/RenderFilterExtension.java | 10 ++-- .../api/dialog/GenericFactoryDialog.java | 6 +- .../Advanced3DFileEditorWithRightTool.java | 4 +- ...dvanced3DFileEditorWithSplitRightTool.java | 2 +- .../plugin/api/editor/BaseFileEditor.java | 2 +- .../editor/BaseFileEditorWithRightTool.java | 4 +- .../BaseFileEditorWithSplitRightTool.java | 2 +- .../material/BaseMaterialEditor3DPart.java | 8 +-- .../material/BaseMaterialFileEditor.java | 8 +-- .../editor/part3d/Advanced3DEditorPart.java | 2 +- .../api/file/creator/GenericFileCreator.java | 8 +-- .../api/messages/MessagesPluginFactory.java | 2 +- .../api/property/PropertyDefinition.java | 4 +- .../AssetResourcePropertyEditorControl.java | 6 +- .../control/AwtFontPropertyEditorControl.java | 8 +-- .../control/BooleanPropertyEditorControl.java | 6 +- .../ClasspathResourcePropertyControl.java | 10 ++-- .../control/ColorPropertyEditorControl.java | 6 +- .../control/EnumPropertyEditorControl.java | 8 +-- .../ExternalFileResourcePropertyControl.java | 2 +- .../FileAssetResourcePropertyControl.java | 8 +-- .../control/FloatPropertyEditorControl.java | 8 +-- .../FolderAssetResourcePropertyControl.java | 6 +- .../GeometryAssetResourcePropertyControl.java | 2 +- .../control/IntegerPropertyEditorControl.java | 8 +-- .../ObjectFromListPropertyEditorControl.java | 8 +-- .../control/PropertyEditorControl.java | 6 +- .../control/PropertyEditorControlFactory.java | 2 +- .../ResourcePropertyEditorControl.java | 8 +-- .../SpatialAssetResourcePropertyControl.java | 12 ++-- .../StringFromListPropertyEditorControl.java | 8 +-- .../control/StringPropertyEditorControl.java | 6 +- .../Vector3fPropertyEditorControl.java | 6 +- .../settings/SettingsPropertyDefinition.java | 2 +- .../plugin/api/settings/SettingsProvider.java | 2 +- .../settings/SettingsProviderRegistry.java | 4 +- .../remote/control/client/ClientCommand.java | 4 +- .../InitLocalClasspathClientCommand.java | 10 ++-- .../client/LoadLocalClassesClientCommand.java | 6 +- .../LoadLocalLibrariesClientCommand.java | 8 +-- .../control/client/OpenFileClientCommand.java | 4 +- .../ss/editor/task/CheckNewVersionTask.java | 6 +- .../ui/builder/EditorFxSceneBuilder.java | 2 +- .../ui/component/asset/AssetBarComponent.java | 2 +- .../ui/component/asset/AssetComponent.java | 8 +-- .../AssetTreeContextMenuFillerRegistry.java | 4 +- .../ui/component/asset/tree/ResourceTree.java | 18 +++--- .../asset/tree/ResourceTreeCell.java | 2 +- .../menu/action/ConvertFileAction.java | 2 +- .../context/menu/action/CopyFileAction.java | 4 +- .../context/menu/action/CutFileAction.java | 2 +- .../context/menu/action/DeleteFileAction.java | 4 +- .../tree/context/menu/action/FileAction.java | 8 +-- .../context/menu/action/NewFileAction.java | 2 +- .../menu/action/OpenWithFileAction.java | 2 +- .../context/menu/action/PasteFileAction.java | 8 +-- .../context/menu/action/RenameFileAction.java | 4 +- .../AssetTreeMultiContextMenuFiller.java | 2 +- .../FileAssetTreeSingleContextMenuFiller.java | 2 +- ...ourceAssetTreeSingleContextMenuFiller.java | 2 +- .../tree/resource/FolderResourceElement.java | 6 +- .../tree/resource/FoldersResourceElement.java | 10 ++-- .../asset/tree/resource/ResourceElement.java | 6 +- .../creator/FileCreatorDescription.java | 2 +- .../creator/FileCreatorRegistry.java | 8 +-- .../creator/impl/AbstractFileCreator.java | 12 ++-- .../creator/impl/EmptyFileCreator.java | 2 +- .../component/creator/impl/FolderCreator.java | 4 +- .../impl/material/MaterialFileCreator.java | 10 ++-- .../MaterialDefinitionFileCreator.java | 12 ++-- .../SingleColorTextureFileCreator.java | 8 +-- .../component/editor/EditorDescription.java | 4 +- .../ui/component/editor/EditorRegistry.java | 16 +++--- .../ui/component/editor/FileEditor.java | 4 +- .../editor/area/EditorAreaComponent.java | 26 ++++----- .../editor/impl/AbstractFileEditor.java | 16 +++--- .../editor/impl/AudioViewerEditor.java | 4 +- .../editor/impl/CodeAreaFileEditor.java | 6 +- .../editor/impl/ImageViewerEditor.java | 4 +- .../component/editor/impl/TextFileEditor.java | 6 +- .../impl/material/MaterialFileEditor.java | 4 +- .../editor/impl/model/ModelFileEditor.java | 8 +-- .../impl/scene/AbstractSceneFileEditor.java | 12 ++-- .../editor/impl/scene/SceneFileEditor.java | 6 +- .../scripting/EditorScriptingComponent.java | 10 ++-- .../state/impl/AbstractEditorState.java | 4 +- .../state/impl/Editor3DEditorState.java | 2 +- .../component/painting/PaintingComponent.java | 2 +- .../painting/PaintingComponentContainer.java | 4 +- .../painting/PaintingComponentListCell.java | 2 +- .../painting/PaintingComponentRegistry.java | 4 +- .../impl/AbstractPaintingComponent.java | 8 +-- .../PropertiesBasedPaintingComponent.java | 12 ++-- .../spawn/SpawnPaintingComponent.java | 6 +- .../terrain/TerrainPaintingComponent.java | 18 +++--- .../terrain/paint/TextureLayerCell.java | 4 +- .../terrain/paint/TextureLayerSettings.java | 8 +-- .../scripting/GroovyEditorComponent.java | 2 +- .../split/pane/TabToolSplitPane.java | 2 +- .../ui/component/tab/EditorToolComponent.java | 2 +- .../tab/ScrollableEditorToolComponent.java | 2 +- .../ui/component/tab/TabToolComponent.java | 2 +- .../virtual/tree/VirtualResourceTree.java | 10 ++-- .../virtual/tree/VirtualResourceTreeCell.java | 2 +- .../FolderVirtualResourceElement.java | 4 +- .../tree/resource/VirtualResourceElement.java | 8 +-- .../VirtualResourceElementFactory.java | 12 ++-- .../control/app/state/list/AppStateList.java | 4 +- .../app/state/list/AppStateListCell.java | 2 +- .../control/choose/ChooseFolderControl.java | 6 +- .../control/choose/ChooseTextureControl.java | 4 +- .../choose/NamedChooseTextureControl.java | 6 +- .../editor/ui/control/code/BaseCodeArea.java | 2 +- .../ui/control/filter/list/FilterList.java | 2 +- .../control/filter/list/FilterListCell.java | 2 +- .../ui/control/layer/LayerNodeTree.java | 2 +- .../ui/control/list/AbstractListCell.java | 4 +- .../ui/control/model/ModelNodeTree.java | 2 +- .../ui/control/model/ModelPropertyEditor.java | 4 +- .../ui/control/property/PropertyControl.java | 16 +++--- .../ui/control/property/PropertyEditor.java | 4 +- .../builder/PropertyBuilderRegistry.java | 4 +- .../builder/impl/AbstractPropertyBuilder.java | 2 +- .../impl/AudioNodePropertyBuilder.java | 2 +- .../impl/CollisionShapePropertyBuilder.java | 2 +- .../impl/EditableObjectPropertyBuilder.java | 6 +- .../impl/EmitterShapePropertyBuilder.java | 2 +- .../builder/impl/GeometryPropertyBuilder.java | 8 +-- .../builder/impl/LightPropertyBuilder.java | 2 +- .../builder/impl/MaterialPropertyBuilder.java | 4 +- .../impl/MaterialSettingsPropertyBuilder.java | 2 +- .../builder/impl/MeshPropertyBuilder.java | 2 +- .../impl/ParticleEmitterPropertyBuilder.java | 2 +- .../ParticleInfluencerPropertyBuilder.java | 2 +- .../impl/PrimitivePropertyBuilder.java | 2 +- .../builder/impl/SpatialPropertyBuilder.java | 6 +- .../impl/AudioKeyPropertyControl.java | 13 +++-- .../property/impl/BooleanPropertyControl.java | 45 ++++++--------- .../property/impl/ColorPropertyControl.java | 46 +++++++++------- .../property/impl/DefaultPropertyControl.java | 34 +++++++----- .../impl/DefaultSinglePropertyControl.java | 9 ++- .../impl/DirectionLightPropertyControl.java | 7 ++- .../impl/ElementModelPropertyControl.java | 21 +++---- .../property/impl/ElementPropertyControl.java | 55 ++++++++++--------- .../property/impl/EnumPropertyControl.java | 4 +- .../FilterElementModelPropertyControl.java | 14 +++-- .../impl/FloatArrayPropertyControl.java | 21 ++++--- .../property/impl/FloatPropertyControl.java | 20 ++++--- .../impl/IntArrayPropertyControl.java | 8 +-- .../property/impl/IntegerPropertyControl.java | 10 ++-- .../impl/LayerModelPropertyControl.java | 4 +- .../LightElementModelPropertyControl.java | 2 +- .../impl/LodLevelPropertyControl.java | 4 +- .../impl/MaterialKeyPropertyControl.java | 4 +- .../impl/MaterialPropertyControl.java | 10 ++-- .../impl/QuaternionPropertyControl.java | 12 ++-- .../impl/SceneElementPropertyControl.java | 2 +- .../SpatialElementModelPropertyControl.java | 2 +- .../impl/StringBasedArrayPropertyControl.java | 4 +- .../property/impl/StringPropertyControl.java | 8 +-- .../impl/Texture2DPropertyControl.java | 10 ++-- .../impl/Vector2fPropertyControl.java | 6 +- .../impl/Vector3fPropertyControl.java | 6 +- .../Vector3fSingleRowPropertyControl.java | 6 +- .../WheelElementModelPropertyControl.java | 4 +- .../ui/control/scene/SceneNodeTree.java | 2 +- .../ss/editor/ui/control/tree/NodeTree.java | 12 ++-- .../editor/ui/control/tree/NodeTreeCell.java | 8 +-- .../tree/action/AbstractNodeAction.java | 12 ++-- .../tree/action/impl/AddUserDataAction.java | 10 ++-- .../tree/action/impl/CreateNodeAction.java | 2 +- .../action/impl/DisableAllControlsAction.java | 6 +- .../action/impl/EnableAllControlsAction.java | 6 +- .../tree/action/impl/LinkModelAction.java | 6 +- .../tree/action/impl/LoadModelAction.java | 6 +- .../impl/MakeAsEmbeddedMaterialAction.java | 2 +- .../action/impl/OptimizeGeometryAction.java | 2 +- .../tree/action/impl/PasteNodeAction.java | 2 +- .../tree/action/impl/RemoveControlAction.java | 2 +- .../tree/action/impl/RemoveLightAction.java | 2 +- .../tree/action/impl/RemoveNodeAction.java | 2 +- .../action/impl/SaveAsMaterialAction.java | 2 +- .../impl/animation/PlayAnimationAction.java | 2 +- .../impl/animation/PlaySettingsAction.java | 4 +- .../impl/animation/RemoveAnimationAction.java | 2 +- .../impl/audio/CreateAudioNodeAction.java | 2 +- .../control/AbstractCreateControlAction.java | 2 +- .../control/CreateCustomControlAction.java | 2 +- .../physics/CreateCharacterControlAction.java | 6 +- .../vehicle/CreateVehicleWheelAction.java | 8 +-- .../vehicle/RemoveVehicleWheelAction.java | 2 +- .../AbstractCreateGeometryAction.java | 2 +- .../impl/geometry/GenerateLoDAction.java | 2 +- .../impl/light/AbstractCreateLightAction.java | 2 +- .../impl/multi/RemoveElementsAction.java | 10 ++-- .../emitter/CreateParticleEmitterAction.java | 2 +- .../emitter/ResetParticleEmittersAction.java | 4 +- ...bstractCreateParticleInfluencerAction.java | 2 +- .../AbstractCreateShapeEmitterAction.java | 6 +- .../shape/CreateBoxShapeEmitterAction.java | 6 +- .../CreateMeshVertexShapeEmitterAction.java | 6 +- .../shape/CreatePointShapeEmitterAction.java | 6 +- .../shape/CreateSphereShapeEmitterAction.java | 6 +- .../shape/AbstractCreateShapeAction.java | 6 +- .../shape/CreateBoxCollisionShapeAction.java | 6 +- .../CreateCapsuleCollisionShapeAction.java | 6 +- .../shape/CreateConeCollisionShapeAction.java | 6 +- .../CreateCylinderCollisionShapeAction.java | 6 +- .../CreateSphereCollisionShapeAction.java | 6 +- .../shape/GenerateCollisionShapeAction.java | 8 +-- .../impl/scene/RemoveSceneLayerAction.java | 2 +- .../editor/ui/control/tree/node/TreeNode.java | 4 +- .../node/factory/TreeNodeFactoryRegistry.java | 6 +- .../impl/AnimationTreeNodeFactory.java | 2 +- .../impl/CollisionTreeNodeFactory.java | 2 +- .../factory/impl/ControlTreeNodeFactory.java | 2 +- .../impl/DefaultParticlesTreeNodeFactory.java | 2 +- .../factory/impl/DefaultTreeNodeFactory.java | 2 +- .../factory/impl/LightTreeNodeFactory.java | 2 +- .../impl/MaterialSettingsTreeNodeFactory.java | 2 +- .../impl/PrimitiveTreeNodeFactory.java | 2 +- .../tree/node/impl/VertexBufferTreeNode.java | 4 +- .../anim/AnimationBoneTrackTreeNode.java | 2 +- .../anim/AnimationControlTreeNode.java | 4 +- .../impl/control/anim/AnimationTreeNode.java | 10 ++-- .../control/motion/MotionEventTreeNode.java | 4 +- .../control/motion/MotionPathTreeNode.java | 6 +- .../physics/PhysicsControlTreeNode.java | 4 +- .../node/impl/layer/LayersRootTreeNode.java | 4 +- .../node/impl/layer/SceneLayerTreeNode.java | 6 +- .../node/impl/light/AmbientLightTreeNode.java | 2 +- .../impl/light/DirectionalLightTreeNode.java | 2 +- .../tree/node/impl/light/LightTreeNode.java | 4 +- .../node/impl/light/PointLightTreeNode.java | 2 +- .../node/impl/light/SpotLightTreeNode.java | 2 +- .../RootMaterialSettingsTreeNode.java | 4 +- .../shape/ChildCollisionShapeTreeNode.java | 4 +- .../shape/ComputedCollisionShapeTreeNode.java | 4 +- .../impl/scene/SceneAppStatesTreeNode.java | 4 +- .../node/impl/scene/SceneFiltersTreeNode.java | 4 +- .../node/impl/scene/SceneNodeTreeNode.java | 4 +- .../node/impl/spatial/GeometryTreeNode.java | 4 +- .../node/impl/spatial/MaterialTreeNode.java | 2 +- .../tree/node/impl/spatial/MeshTreeNode.java | 4 +- .../tree/node/impl/spatial/NodeTreeNode.java | 6 +- .../node/impl/spatial/SpatialTreeNode.java | 8 +-- .../emitter/ParticleEmitterTreeNode.java | 4 +- .../com/ss/editor/ui/css/CssRegistry.java | 6 +- .../ui/dialog/AbstractSimpleEditorDialog.java | 2 +- .../ss/editor/ui/dialog/ConfirmDialog.java | 4 +- .../ui/dialog/CreateCustomControlDialog.java | 16 +++--- .../ui/dialog/CreateSceneAppStateDialog.java | 14 ++--- .../ui/dialog/CreateSceneFilterDialog.java | 14 ++--- .../com/ss/editor/ui/dialog/EditorDialog.java | 8 +-- .../ui/dialog/GenerateTangentsDialog.java | 4 +- .../com/ss/editor/ui/dialog/RenameDialog.java | 4 +- .../ss/editor/ui/dialog/SettingsDialog.java | 20 +++---- .../editor/ui/dialog/about/AboutDialog.java | 4 +- .../animation/ExtractSubAnimationDialog.java | 6 +- .../dialog/asset/BaseAssetEditorDialog.java | 8 +-- .../dialog/asset/file/AssetEditorDialog.java | 6 +- .../StringVirtualAssetEditorDialog.java | 6 +- .../virtual/VirtualAssetEditorDialog.java | 4 +- .../chooser/ExternalFileEditorDialog.java | 8 +-- .../geometry/lod/GenerateLodLevelsDialog.java | 4 +- .../imports/model/ModelImportDialog.java | 14 ++--- .../node/selector/NodeSelectorDialog.java | 6 +- .../ui/dialog/plugin/PluginListCell.java | 4 +- .../ui/dialog/plugin/PluginsDialog.java | 12 ++-- .../ui/dialog/save/SaveAsEditorDialog.java | 12 ++-- .../scene/selector/SceneSelectorDialog.java | 4 +- .../editor/ui/dialog/sky/CreateSkyDialog.java | 8 +-- .../dialog/terrain/CreateTerrainDialog.java | 10 ++-- .../ss/editor/ui/event/EventRedirector.java | 6 +- .../ss/editor/ui/event/FxEventManager.java | 8 +-- .../com/ss/editor/ui/event/SceneEvent.java | 6 +- .../event/impl/AssetComponentLoadedEvent.java | 2 +- .../impl/ChangedCurrentAssetFolderEvent.java | 2 +- .../ui/event/impl/CreatedFileEvent.java | 2 +- .../ui/event/impl/DeletedFileEvent.java | 2 +- .../ui/event/impl/FileChangedEvent.java | 2 +- .../editor/ui/event/impl/MovedFileEvent.java | 2 +- .../ui/event/impl/RenamedFileEvent.java | 2 +- .../ui/event/impl/RequestSelectFileEvent.java | 2 +- .../event/impl/RequestedConvertFileEvent.java | 2 +- .../event/impl/RequestedCreateFileEvent.java | 2 +- .../ui/event/impl/RequestedOpenFileEvent.java | 2 +- .../com/ss/editor/ui/preview/FilePreview.java | 6 +- .../editor/ui/preview/FilePreviewFactory.java | 2 +- .../preview/FilePreviewFactoryRegistry.java | 8 +-- .../ui/preview/impl/AbstractFilePreview.java | 2 +- .../impl/DefaultFilePreviewFactory.java | 2 +- .../ui/preview/impl/TextFilePreview.java | 6 +- .../com/ss/editor/ui/scene/EditorFxScene.java | 10 ++-- .../ss/editor/ui/tooltip/CustomTooltip.java | 2 +- .../ui/tooltip/ImageChannelPreview.java | 4 +- .../ss/editor/ui/tooltip/ImagePreview.java | 4 +- .../java/com/ss/editor/ui/util/UiUtils.java | 10 ++-- .../com/ss/editor/util/AnimationUtils.java | 6 +- .../java/com/ss/editor/util/EditorUtil.java | 14 ++--- .../ss/editor/util/ExtObjectInputStream.java | 6 +- .../java/com/ss/editor/util/GlslType.java | 6 +- .../java/com/ss/editor/util/LocalObjects.java | 8 +-- .../ss/editor/util/MaterialSerializer.java | 2 +- .../com/ss/editor/util/MaterialUtils.java | 8 +-- .../java/com/ss/editor/util/NodeUtils.java | 8 +-- .../editor/util/ReusableCollisionResults.java | 6 +- .../com/ss/editor/util/TangentGenerator.java | 4 +- .../test/external/BaseExternalTest.java | 2 +- .../test/internal/SetUpApplicationTest.java | 4 +- 384 files changed, 1238 insertions(+), 1211 deletions(-) diff --git a/build.gradle b/build.gradle index ae70131b..e5bde43b 100644 --- a/build.gradle +++ b/build.gradle @@ -131,9 +131,9 @@ dependencies { // base compile group: 'org.fxmisc.richtext', name: 'richtextfx', version: '1.0.0-SNAPSHOT' compile 'org.controlsfx:controlsfx:9.0.0' - compile 'com.spaceshift:rlib.fx:4.3.0.Final' - compile 'com.spaceshift:rlib:6.9.1.Final' - compile ('com.jme3x:jme-jfx:1.7.5-Final') { + compile 'com.spaceshift:rlib.fx:5.0.0' + compile 'com.spaceshift:rlib.common:7.0.0' + compile ('com.jme3x:jme-jfx:2.0.0') { exclude group: 'org.jmonkeyengine' } diff --git a/src/main/java/com/ss/editor/FileExtensions.java b/src/main/java/com/ss/editor/FileExtensions.java index 2379c369..5360bc62 100644 --- a/src/main/java/com/ss/editor/FileExtensions.java +++ b/src/main/java/com/ss/editor/FileExtensions.java @@ -1,7 +1,7 @@ package com.ss.editor; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; /** diff --git a/src/main/java/com/ss/editor/JfxApplication.java b/src/main/java/com/ss/editor/JfxApplication.java index 86235e8c..0e4dde5e 100644 --- a/src/main/java/com/ss/editor/JfxApplication.java +++ b/src/main/java/com/ss/editor/JfxApplication.java @@ -5,8 +5,8 @@ import static com.ss.editor.config.DefaultSettingsProvider.Defaults.PREF_DEFAULT_OPEN_GL; import static com.ss.editor.config.DefaultSettingsProvider.Defaults.PREF_DEFAULT_STOP_RENDER_ON_LOST_FOCUS; import static com.ss.editor.config.DefaultSettingsProvider.Preferences.*; -import static com.ss.rlib.util.ObjectUtils.notNull; -import static com.ss.rlib.util.Utils.run; +import static com.ss.rlib.common.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.Utils.run; import static java.nio.file.Files.createDirectories; import static java.nio.file.Files.newOutputStream; import com.jme3.util.LWJGLBufferAllocator; @@ -39,16 +39,16 @@ import com.ss.editor.util.EditorUtil; import com.ss.editor.util.OpenGLVersion; import com.ss.editor.util.svg.SvgImageLoaderFactory; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerLevel; -import com.ss.rlib.logging.LoggerManager; -import com.ss.rlib.logging.impl.FolderFileListener; -import com.ss.rlib.manager.InitializeManager; -import com.ss.rlib.util.ArrayUtils; -import com.ss.rlib.util.Utils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; -import com.ss.rlib.util.array.ConcurrentArray; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerLevel; +import com.ss.rlib.common.logging.LoggerManager; +import com.ss.rlib.common.logging.impl.FolderFileListener; +import com.ss.rlib.common.manager.InitializeManager; +import com.ss.rlib.common.util.ArrayUtils; +import com.ss.rlib.common.util.Utils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.ConcurrentArray; import javafx.application.Application; import javafx.application.Platform; import javafx.beans.value.ChangeListener; diff --git a/src/main/java/com/ss/editor/JmeApplication.java b/src/main/java/com/ss/editor/JmeApplication.java index fc2ed995..67b539cd 100644 --- a/src/main/java/com/ss/editor/JmeApplication.java +++ b/src/main/java/com/ss/editor/JmeApplication.java @@ -3,7 +3,7 @@ import static com.jme3.environment.LightProbeFactory.makeProbe; import static com.ss.editor.config.DefaultSettingsProvider.Defaults.*; import static com.ss.editor.config.DefaultSettingsProvider.Preferences.*; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.app.DebugKeysAppState; import com.jme3.asset.AssetNotFoundException; import com.jme3.asset.plugins.ClasspathLocator; @@ -43,9 +43,9 @@ import com.ss.editor.ui.event.FxEventManager; import com.ss.editor.ui.event.impl.WindowChangeFocusEvent; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerManager; -import com.ss.rlib.util.os.OperatingSystem; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; +import com.ss.rlib.common.util.os.OperatingSystem; import jme3_ext_xbuf.XbufLoader; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/Messages.java b/src/main/java/com/ss/editor/Messages.java index 280a268f..82e7ff49 100644 --- a/src/main/java/com/ss/editor/Messages.java +++ b/src/main/java/com/ss/editor/Messages.java @@ -1,7 +1,7 @@ package com.ss.editor; import static java.util.ResourceBundle.getBundle; -import com.ss.rlib.util.PropertyLoader; +import com.ss.rlib.common.util.PropertyLoader; import java.util.ResourceBundle; diff --git a/src/main/java/com/ss/editor/analytics/google/GAnalytics.java b/src/main/java/com/ss/editor/analytics/google/GAnalytics.java index c7d53340..70c124f9 100644 --- a/src/main/java/com/ss/editor/analytics/google/GAnalytics.java +++ b/src/main/java/com/ss/editor/analytics/google/GAnalytics.java @@ -2,20 +2,20 @@ import static com.ss.editor.config.DefaultSettingsProvider.Defaults.PREF_DEFAULT_ANALYTICS_GOOGLE; import static com.ss.editor.config.DefaultSettingsProvider.Preferences.PREF_ANALYTICS_GOOGLE; -import static com.ss.rlib.util.StringUtils.isEmpty; +import static com.ss.rlib.common.util.StringUtils.isEmpty; import static org.apache.http.impl.client.HttpClients.createMinimal; import com.ss.editor.EditorThread; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.config.Config; import com.ss.editor.config.EditorConfig; -import com.ss.rlib.concurrent.util.ConcurrentUtils; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerManager; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.Utils; -import com.ss.rlib.util.linkedlist.LinkedList; -import com.ss.rlib.util.linkedlist.LinkedListFactory; -import com.ss.rlib.util.os.OperatingSystem; +import com.ss.rlib.common.concurrent.util.ConcurrentUtils; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.Utils; +import com.ss.rlib.common.util.linkedlist.LinkedList; +import com.ss.rlib.common.util.linkedlist.LinkedListFactory; +import com.ss.rlib.common.util.os.OperatingSystem; import org.apache.http.StatusLine; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; diff --git a/src/main/java/com/ss/editor/asset/locator/FileSystemAssetLocator.java b/src/main/java/com/ss/editor/asset/locator/FileSystemAssetLocator.java index b0af2db8..4ee7cde0 100644 --- a/src/main/java/com/ss/editor/asset/locator/FileSystemAssetLocator.java +++ b/src/main/java/com/ss/editor/asset/locator/FileSystemAssetLocator.java @@ -6,9 +6,9 @@ import com.jme3.asset.AssetLocator; import com.jme3.asset.AssetManager; import com.ss.editor.annotation.FromAnyThread; -import com.ss.rlib.util.ArrayUtils; -import com.ss.rlib.util.array.ArrayFactory; -import com.ss.rlib.util.array.ConcurrentArray; +import com.ss.rlib.common.util.ArrayUtils; +import com.ss.rlib.common.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.ConcurrentArray; import org.jetbrains.annotations.NotNull; import java.nio.file.Files; diff --git a/src/main/java/com/ss/editor/config/Config.java b/src/main/java/com/ss/editor/config/Config.java index 82d95fae..c5d7837f 100644 --- a/src/main/java/com/ss/editor/config/Config.java +++ b/src/main/java/com/ss/editor/config/Config.java @@ -3,10 +3,10 @@ import com.ss.editor.JmeApplication; import com.ss.editor.document.DocumentConfig; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.plugin.Version; -import com.ss.rlib.util.Utils; -import com.ss.rlib.util.VarTable; -import com.ss.rlib.util.os.OperatingSystem; +import com.ss.rlib.common.plugin.Version; +import com.ss.rlib.common.util.Utils; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.common.util.os.OperatingSystem; import org.jetbrains.annotations.NotNull; import java.awt.*; diff --git a/src/main/java/com/ss/editor/config/DefaultSettingsProvider.java b/src/main/java/com/ss/editor/config/DefaultSettingsProvider.java index c2b03385..4448686b 100644 --- a/src/main/java/com/ss/editor/config/DefaultSettingsProvider.java +++ b/src/main/java/com/ss/editor/config/DefaultSettingsProvider.java @@ -6,7 +6,7 @@ import static com.ss.editor.config.DefaultSettingsProvider.Defaults.*; import static com.ss.editor.config.DefaultSettingsProvider.Preferences.*; import static com.ss.editor.extension.property.EditablePropertyType.*; -import static com.ss.rlib.util.array.ArrayFactory.asArray; +import static com.ss.rlib.common.util.array.ArrayFactory.asArray; import com.jme3.math.Vector3f; import com.ss.editor.Messages; import com.ss.editor.annotation.FxThread; @@ -15,8 +15,8 @@ import com.ss.editor.plugin.api.settings.SettingsProvider; import com.ss.editor.ui.css.CssColorTheme; import com.ss.editor.util.OpenGLVersion; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; import java.nio.file.Path; diff --git a/src/main/java/com/ss/editor/config/EditorConfig.java b/src/main/java/com/ss/editor/config/EditorConfig.java index e9def413..36b48bc7 100644 --- a/src/main/java/com/ss/editor/config/EditorConfig.java +++ b/src/main/java/com/ss/editor/config/EditorConfig.java @@ -2,8 +2,8 @@ import static com.ss.editor.config.DefaultSettingsProvider.Defaults.*; import static com.ss.editor.config.DefaultSettingsProvider.Preferences.*; -import static com.ss.rlib.util.ClassUtils.unsafeCast; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ClassUtils.unsafeCast; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.asset.AssetEventListener; import com.jme3.asset.AssetKey; import com.jme3.asset.TextureKey; @@ -13,12 +13,12 @@ import com.ss.editor.JmeApplication; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerManager; -import com.ss.rlib.util.Utils; -import com.ss.rlib.util.dictionary.ConcurrentObjectDictionary; -import com.ss.rlib.util.dictionary.DictionaryFactory; -import com.ss.rlib.util.dictionary.DictionaryUtils; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; +import com.ss.rlib.common.util.Utils; +import com.ss.rlib.common.util.dictionary.ConcurrentObjectDictionary; +import com.ss.rlib.common.util.dictionary.DictionaryFactory; +import com.ss.rlib.common.util.dictionary.DictionaryUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/control/painting/spawn/SpawnToolControl.java b/src/main/java/com/ss/editor/control/painting/spawn/SpawnToolControl.java index 849f2618..ff4a34c9 100644 --- a/src/main/java/com/ss/editor/control/painting/spawn/SpawnToolControl.java +++ b/src/main/java/com/ss/editor/control/painting/spawn/SpawnToolControl.java @@ -2,8 +2,8 @@ import static com.ss.editor.part3d.editor.impl.scene.AbstractSceneEditor3DPart.KEY_IGNORE_RAY_CAST; import static com.ss.editor.util.EditorUtil.getAssetManager; -import static com.ss.rlib.util.ObjectUtils.notNull; -import static com.ss.rlib.util.array.ArrayCollectors.toArray; +import static com.ss.rlib.common.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.array.ArrayCollectors.toArray; import com.jme3.asset.ModelKey; import com.jme3.collision.CollisionResult; import com.jme3.collision.CollisionResults; @@ -27,8 +27,8 @@ import com.ss.editor.util.GeomUtils; import com.ss.editor.util.LocalObjects; import com.ss.editor.util.NodeUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import jme3tools.optimize.GeometryBatchFactory; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/control/painting/terrain/ChangeHeightTerrainToolControl.java b/src/main/java/com/ss/editor/control/painting/terrain/ChangeHeightTerrainToolControl.java index 1490423d..578c125f 100644 --- a/src/main/java/com/ss/editor/control/painting/terrain/ChangeHeightTerrainToolControl.java +++ b/src/main/java/com/ss/editor/control/painting/terrain/ChangeHeightTerrainToolControl.java @@ -1,6 +1,6 @@ package com.ss.editor.control.painting.terrain; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.math.Vector2f; import com.jme3.math.Vector3f; import com.jme3.scene.Node; @@ -13,11 +13,11 @@ import com.ss.editor.ui.component.painting.terrain.TerrainPaintingComponent; import com.ss.editor.ui.control.property.operation.PropertyOperation; import com.ss.editor.util.NodeUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; -import com.ss.rlib.util.dictionary.Dictionary; -import com.ss.rlib.util.dictionary.DictionaryFactory; -import com.ss.rlib.util.dictionary.ObjectDictionary; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; +import com.ss.rlib.common.util.dictionary.Dictionary; +import com.ss.rlib.common.util.dictionary.DictionaryFactory; +import com.ss.rlib.common.util.dictionary.ObjectDictionary; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; diff --git a/src/main/java/com/ss/editor/control/painting/terrain/LevelTerrainToolControl.java b/src/main/java/com/ss/editor/control/painting/terrain/LevelTerrainToolControl.java index f99f0883..245b5663 100644 --- a/src/main/java/com/ss/editor/control/painting/terrain/LevelTerrainToolControl.java +++ b/src/main/java/com/ss/editor/control/painting/terrain/LevelTerrainToolControl.java @@ -1,7 +1,7 @@ package com.ss.editor.control.painting.terrain; import static com.ss.editor.util.PaintingUtils.*; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.math.ColorRGBA; import com.jme3.math.Quaternion; import com.jme3.math.Vector2f; diff --git a/src/main/java/com/ss/editor/control/painting/terrain/PaintTerrainToolControl.java b/src/main/java/com/ss/editor/control/painting/terrain/PaintTerrainToolControl.java index 09c2e9cf..b0190ba6 100644 --- a/src/main/java/com/ss/editor/control/painting/terrain/PaintTerrainToolControl.java +++ b/src/main/java/com/ss/editor/control/painting/terrain/PaintTerrainToolControl.java @@ -1,6 +1,6 @@ package com.ss.editor.control.painting.terrain; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.math.ColorRGBA; import com.jme3.math.Quaternion; import com.jme3.math.Vector2f; @@ -18,9 +18,9 @@ import com.ss.editor.ui.component.painting.terrain.TerrainPaintingComponent; import com.ss.editor.ui.control.property.operation.PropertyOperation; import com.ss.editor.util.LocalObjects; -import com.ss.rlib.function.ObjectFloatObjectConsumer; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.function.ObjectFloatObjectConsumer; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/control/painting/terrain/RaiseLowerTerrainToolControl.java b/src/main/java/com/ss/editor/control/painting/terrain/RaiseLowerTerrainToolControl.java index a590fbb9..80af451a 100644 --- a/src/main/java/com/ss/editor/control/painting/terrain/RaiseLowerTerrainToolControl.java +++ b/src/main/java/com/ss/editor/control/painting/terrain/RaiseLowerTerrainToolControl.java @@ -2,7 +2,7 @@ import static com.ss.editor.util.PaintingUtils.calculateHeight; import static com.ss.editor.util.PaintingUtils.isContains; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.math.ColorRGBA; import com.jme3.math.Quaternion; import com.jme3.math.Vector2f; diff --git a/src/main/java/com/ss/editor/control/painting/terrain/RoughTerrainToolControl.java b/src/main/java/com/ss/editor/control/painting/terrain/RoughTerrainToolControl.java index 86534e41..76419d96 100644 --- a/src/main/java/com/ss/editor/control/painting/terrain/RoughTerrainToolControl.java +++ b/src/main/java/com/ss/editor/control/painting/terrain/RoughTerrainToolControl.java @@ -1,7 +1,7 @@ package com.ss.editor.control.painting.terrain; import static com.ss.editor.util.PaintingUtils.isContains; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import static java.lang.Math.max; import static java.lang.Math.min; import com.jme3.math.ColorRGBA; diff --git a/src/main/java/com/ss/editor/control/painting/terrain/SlopeTerrainToolControl.java b/src/main/java/com/ss/editor/control/painting/terrain/SlopeTerrainToolControl.java index ab488379..199102dc 100644 --- a/src/main/java/com/ss/editor/control/painting/terrain/SlopeTerrainToolControl.java +++ b/src/main/java/com/ss/editor/control/painting/terrain/SlopeTerrainToolControl.java @@ -1,7 +1,7 @@ package com.ss.editor.control.painting.terrain; import static com.ss.editor.util.PaintingUtils.*; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import static java.lang.Math.max; import com.jme3.math.*; import com.jme3.scene.Geometry; diff --git a/src/main/java/com/ss/editor/control/painting/terrain/SmoothTerrainToolControl.java b/src/main/java/com/ss/editor/control/painting/terrain/SmoothTerrainToolControl.java index d18e590e..9e801921 100644 --- a/src/main/java/com/ss/editor/control/painting/terrain/SmoothTerrainToolControl.java +++ b/src/main/java/com/ss/editor/control/painting/terrain/SmoothTerrainToolControl.java @@ -1,7 +1,7 @@ package com.ss.editor.control.painting.terrain; import static com.ss.editor.util.PaintingUtils.isContains; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import static java.lang.Float.isNaN; import static java.lang.Math.min; import com.jme3.math.ColorRGBA; diff --git a/src/main/java/com/ss/editor/control/transform/AbstractTransformControl.java b/src/main/java/com/ss/editor/control/transform/AbstractTransformControl.java index 56c1bdc6..5e4ff4ee 100644 --- a/src/main/java/com/ss/editor/control/transform/AbstractTransformControl.java +++ b/src/main/java/com/ss/editor/control/transform/AbstractTransformControl.java @@ -1,6 +1,6 @@ package com.ss.editor.control.transform; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.collision.CollisionResult; import com.jme3.math.Quaternion; import com.jme3.math.Transform; @@ -10,8 +10,8 @@ import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.JmeThread; import com.ss.editor.control.transform.EditorTransformSupport.PickedAxis; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerManager; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; import org.jetbrains.annotations.NotNull; /** diff --git a/src/main/java/com/ss/editor/control/transform/MoveToolControl.java b/src/main/java/com/ss/editor/control/transform/MoveToolControl.java index fa2ff02a..cdcb3f2c 100644 --- a/src/main/java/com/ss/editor/control/transform/MoveToolControl.java +++ b/src/main/java/com/ss/editor/control/transform/MoveToolControl.java @@ -1,7 +1,7 @@ package com.ss.editor.control.transform; import static com.ss.editor.util.GeomUtils.*; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.collision.CollisionResult; import com.jme3.collision.CollisionResults; import com.jme3.input.InputManager; diff --git a/src/main/java/com/ss/editor/control/transform/RotationToolControl.java b/src/main/java/com/ss/editor/control/transform/RotationToolControl.java index b5aa203a..eccba28d 100644 --- a/src/main/java/com/ss/editor/control/transform/RotationToolControl.java +++ b/src/main/java/com/ss/editor/control/transform/RotationToolControl.java @@ -1,6 +1,6 @@ package com.ss.editor.control.transform; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.input.InputManager; import com.jme3.math.*; import com.jme3.renderer.Camera; diff --git a/src/main/java/com/ss/editor/control/transform/ScaleToolControl.java b/src/main/java/com/ss/editor/control/transform/ScaleToolControl.java index f30bc63a..aa7fcae7 100644 --- a/src/main/java/com/ss/editor/control/transform/ScaleToolControl.java +++ b/src/main/java/com/ss/editor/control/transform/ScaleToolControl.java @@ -1,6 +1,6 @@ package com.ss.editor.control.transform; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import static java.lang.Math.abs; import com.jme3.input.InputManager; import com.jme3.math.Transform; diff --git a/src/main/java/com/ss/editor/document/DocumentConfig.java b/src/main/java/com/ss/editor/document/DocumentConfig.java index af1fb687..edf53291 100644 --- a/src/main/java/com/ss/editor/document/DocumentConfig.java +++ b/src/main/java/com/ss/editor/document/DocumentConfig.java @@ -1,7 +1,7 @@ package com.ss.editor.document; -import com.ss.rlib.data.AbstractStreamDocument; -import com.ss.rlib.util.VarTable; +import com.ss.rlib.common.data.AbstractStreamDocument; +import com.ss.rlib.common.util.VarTable; import org.jetbrains.annotations.NotNull; import org.w3c.dom.Document; import org.w3c.dom.Node; diff --git a/src/main/java/com/ss/editor/executor/impl/AbstractEditorTaskExecutor.java b/src/main/java/com/ss/editor/executor/impl/AbstractEditorTaskExecutor.java index 573deb63..87dfe2eb 100644 --- a/src/main/java/com/ss/editor/executor/impl/AbstractEditorTaskExecutor.java +++ b/src/main/java/com/ss/editor/executor/impl/AbstractEditorTaskExecutor.java @@ -3,13 +3,13 @@ import com.ss.editor.EditorThread; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.executor.EditorTaskExecutor; -import com.ss.rlib.concurrent.lock.LockFactory; -import com.ss.rlib.concurrent.lock.Lockable; -import com.ss.rlib.concurrent.util.ConcurrentUtils; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerManager; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.concurrent.lock.LockFactory; +import com.ss.rlib.common.concurrent.lock.Lockable; +import com.ss.rlib.common.concurrent.util.ConcurrentUtils; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; import java.util.concurrent.atomic.AtomicBoolean; diff --git a/src/main/java/com/ss/editor/executor/impl/BackgroundEditorTaskExecutor.java b/src/main/java/com/ss/editor/executor/impl/BackgroundEditorTaskExecutor.java index f8086b36..4f337ab2 100644 --- a/src/main/java/com/ss/editor/executor/impl/BackgroundEditorTaskExecutor.java +++ b/src/main/java/com/ss/editor/executor/impl/BackgroundEditorTaskExecutor.java @@ -1,7 +1,7 @@ package com.ss.editor.executor.impl; import static java.lang.Math.min; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.util.array.Array; import org.jetbrains.annotations.NotNull; /** diff --git a/src/main/java/com/ss/editor/executor/impl/FxEditorTaskExecutor.java b/src/main/java/com/ss/editor/executor/impl/FxEditorTaskExecutor.java index 7dfbad4c..4ea7adbc 100644 --- a/src/main/java/com/ss/editor/executor/impl/FxEditorTaskExecutor.java +++ b/src/main/java/com/ss/editor/executor/impl/FxEditorTaskExecutor.java @@ -3,8 +3,8 @@ import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.concurrent.util.ConcurrentUtils; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.concurrent.util.ConcurrentUtils; +import com.ss.rlib.common.util.array.Array; import javafx.application.Platform; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/ss/editor/executor/impl/JmeThreadExecutor.java b/src/main/java/com/ss/editor/executor/impl/JmeThreadExecutor.java index e62ffc48..db3d2276 100644 --- a/src/main/java/com/ss/editor/executor/impl/JmeThreadExecutor.java +++ b/src/main/java/com/ss/editor/executor/impl/JmeThreadExecutor.java @@ -6,12 +6,12 @@ import org.jetbrains.annotations.NotNull; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerManager; -import com.ss.rlib.util.ArrayUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; -import com.ss.rlib.util.array.ConcurrentArray; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; +import com.ss.rlib.common.util.ArrayUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.ConcurrentArray; /** * The executor to execute tasks in the editor thread. diff --git a/src/main/java/com/ss/editor/file/converter/FileConverterDescription.java b/src/main/java/com/ss/editor/file/converter/FileConverterDescription.java index fa921566..c6f0d22f 100644 --- a/src/main/java/com/ss/editor/file/converter/FileConverterDescription.java +++ b/src/main/java/com/ss/editor/file/converter/FileConverterDescription.java @@ -1,8 +1,8 @@ package com.ss.editor.file.converter; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FxThread; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.util.array.Array; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/file/converter/FileConverterRegistry.java b/src/main/java/com/ss/editor/file/converter/FileConverterRegistry.java index 951c22c0..3ba05f18 100644 --- a/src/main/java/com/ss/editor/file/converter/FileConverterRegistry.java +++ b/src/main/java/com/ss/editor/file/converter/FileConverterRegistry.java @@ -1,13 +1,13 @@ package com.ss.editor.file.converter; -import static com.ss.rlib.util.FileUtils.containsExtensions; -import static com.ss.rlib.util.array.ArrayCollectors.toArray; +import static com.ss.rlib.common.util.FileUtils.containsExtensions; +import static com.ss.rlib.common.util.array.ArrayCollectors.toArray; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.file.converter.impl.*; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerManager; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; import java.nio.file.Path; diff --git a/src/main/java/com/ss/editor/file/converter/impl/AbstractFileConverter.java b/src/main/java/com/ss/editor/file/converter/impl/AbstractFileConverter.java index a4c1b02e..ba3c065d 100644 --- a/src/main/java/com/ss/editor/file/converter/impl/AbstractFileConverter.java +++ b/src/main/java/com/ss/editor/file/converter/impl/AbstractFileConverter.java @@ -1,6 +1,6 @@ package com.ss.editor.file.converter.impl; -import static com.ss.rlib.util.FileUtils.containsExtensions; +import static com.ss.rlib.common.util.FileUtils.containsExtensions; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; import com.ss.editor.config.EditorConfig; @@ -9,11 +9,11 @@ import com.ss.editor.ui.event.FxEventManager; import com.ss.editor.ui.util.UiUtils; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerManager; -import com.ss.rlib.util.FileUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; +import com.ss.rlib.common.util.FileUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/file/converter/impl/AbstractModelFileConverter.java b/src/main/java/com/ss/editor/file/converter/impl/AbstractModelFileConverter.java index 04ff6844..bc1b2e11 100644 --- a/src/main/java/com/ss/editor/file/converter/impl/AbstractModelFileConverter.java +++ b/src/main/java/com/ss/editor/file/converter/impl/AbstractModelFileConverter.java @@ -4,9 +4,9 @@ import static com.ss.editor.config.DefaultSettingsProvider.Preferences.PREF_TANGENT_GENERATION; import static com.ss.editor.extension.property.EditablePropertyType.*; import static com.ss.editor.util.EditorUtil.*; -import static com.ss.rlib.util.FileUtils.containsExtensions; -import static com.ss.rlib.util.FileUtils.normalizeName; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.FileUtils.containsExtensions; +import static com.ss.rlib.common.util.FileUtils.normalizeName; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import static java.nio.file.StandardOpenOption.*; import com.jme3.asset.AssetKey; import com.jme3.asset.AssetManager; @@ -26,13 +26,13 @@ import com.ss.editor.util.MaterialSerializer; import com.ss.editor.util.EditorUtil; import com.ss.editor.util.NodeUtils; -import com.ss.rlib.util.FileUtils; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.VarTable; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; -import com.ss.rlib.util.dictionary.DictionaryFactory; -import com.ss.rlib.util.dictionary.ObjectDictionary; +import com.ss.rlib.common.util.FileUtils; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; +import com.ss.rlib.common.util.dictionary.DictionaryFactory; +import com.ss.rlib.common.util.dictionary.ObjectDictionary; import org.jetbrains.annotations.NotNull; import java.awt.*; diff --git a/src/main/java/com/ss/editor/file/converter/impl/BlendToJ3oFileConverter.java b/src/main/java/com/ss/editor/file/converter/impl/BlendToJ3oFileConverter.java index 4145991b..657803be 100644 --- a/src/main/java/com/ss/editor/file/converter/impl/BlendToJ3oFileConverter.java +++ b/src/main/java/com/ss/editor/file/converter/impl/BlendToJ3oFileConverter.java @@ -6,8 +6,8 @@ import org.jetbrains.annotations.NotNull; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; /** * The implementation of {@link AbstractFileConverter} to convert .blend file to .j3o. diff --git a/src/main/java/com/ss/editor/file/converter/impl/FbxToJ3oFileConverter.java b/src/main/java/com/ss/editor/file/converter/impl/FbxToJ3oFileConverter.java index a6447a45..60dd52e4 100644 --- a/src/main/java/com/ss/editor/file/converter/impl/FbxToJ3oFileConverter.java +++ b/src/main/java/com/ss/editor/file/converter/impl/FbxToJ3oFileConverter.java @@ -6,8 +6,8 @@ import org.jetbrains.annotations.NotNull; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; /** * The implementation of {@link AbstractFileConverter} to convert .fbx file to .j3o. diff --git a/src/main/java/com/ss/editor/file/converter/impl/GltfToJ3oFileConverter.java b/src/main/java/com/ss/editor/file/converter/impl/GltfToJ3oFileConverter.java index d6a2e4f0..c8a3b0ea 100644 --- a/src/main/java/com/ss/editor/file/converter/impl/GltfToJ3oFileConverter.java +++ b/src/main/java/com/ss/editor/file/converter/impl/GltfToJ3oFileConverter.java @@ -3,8 +3,8 @@ import com.ss.editor.FileExtensions; import com.ss.editor.Messages; import com.ss.editor.file.converter.FileConverterDescription; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; /** diff --git a/src/main/java/com/ss/editor/file/converter/impl/MeshXmlToJ3oFileConverter.java b/src/main/java/com/ss/editor/file/converter/impl/MeshXmlToJ3oFileConverter.java index 75b7b6c3..08589330 100644 --- a/src/main/java/com/ss/editor/file/converter/impl/MeshXmlToJ3oFileConverter.java +++ b/src/main/java/com/ss/editor/file/converter/impl/MeshXmlToJ3oFileConverter.java @@ -4,9 +4,9 @@ import com.ss.editor.Messages; import com.ss.editor.file.converter.FileConverterDescription; import org.jetbrains.annotations.NotNull; -import com.ss.rlib.util.FileUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.FileUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import java.nio.file.Path; diff --git a/src/main/java/com/ss/editor/file/converter/impl/ObjToJ3oFileConverter.java b/src/main/java/com/ss/editor/file/converter/impl/ObjToJ3oFileConverter.java index 809166af..b1c4f57b 100644 --- a/src/main/java/com/ss/editor/file/converter/impl/ObjToJ3oFileConverter.java +++ b/src/main/java/com/ss/editor/file/converter/impl/ObjToJ3oFileConverter.java @@ -6,8 +6,8 @@ import org.jetbrains.annotations.NotNull; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; /** * The implementation of {@link AbstractFileConverter} to convert .obj file to .j3o. diff --git a/src/main/java/com/ss/editor/file/converter/impl/SceneToJ3oFileConverter.java b/src/main/java/com/ss/editor/file/converter/impl/SceneToJ3oFileConverter.java index 5ac964f9..de3c1cb4 100644 --- a/src/main/java/com/ss/editor/file/converter/impl/SceneToJ3oFileConverter.java +++ b/src/main/java/com/ss/editor/file/converter/impl/SceneToJ3oFileConverter.java @@ -6,8 +6,8 @@ import org.jetbrains.annotations.NotNull; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; /** * The implementation of {@link AbstractFileConverter} to convert .scene file to .j3o. diff --git a/src/main/java/com/ss/editor/file/converter/impl/XbufToJ3oFileConverter.java b/src/main/java/com/ss/editor/file/converter/impl/XbufToJ3oFileConverter.java index aec3bcbf..bba7187f 100644 --- a/src/main/java/com/ss/editor/file/converter/impl/XbufToJ3oFileConverter.java +++ b/src/main/java/com/ss/editor/file/converter/impl/XbufToJ3oFileConverter.java @@ -6,8 +6,8 @@ import org.jetbrains.annotations.NotNull; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; /** * The implementation of {@link AbstractFileConverter} to convert .xbuf file to .j3o. diff --git a/src/main/java/com/ss/editor/file/delete/handler/FileDeleteHandlerFactory.java b/src/main/java/com/ss/editor/file/delete/handler/FileDeleteHandlerFactory.java index fb5a5a9e..5c940a4f 100644 --- a/src/main/java/com/ss/editor/file/delete/handler/FileDeleteHandlerFactory.java +++ b/src/main/java/com/ss/editor/file/delete/handler/FileDeleteHandlerFactory.java @@ -3,8 +3,8 @@ import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.file.delete.handler.impl.DeleteMaterialsModelFileDeleteHandler; import org.jetbrains.annotations.NotNull; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import java.nio.file.Path; diff --git a/src/main/java/com/ss/editor/file/delete/handler/impl/AbstractFileDeleteHandler.java b/src/main/java/com/ss/editor/file/delete/handler/impl/AbstractFileDeleteHandler.java index 73d35b30..d3f85d33 100644 --- a/src/main/java/com/ss/editor/file/delete/handler/impl/AbstractFileDeleteHandler.java +++ b/src/main/java/com/ss/editor/file/delete/handler/impl/AbstractFileDeleteHandler.java @@ -1,8 +1,8 @@ package com.ss.editor.file.delete.handler.impl; import com.ss.editor.file.delete.handler.FileDeleteHandler; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerManager; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; import org.jetbrains.annotations.NotNull; import java.nio.file.Path; diff --git a/src/main/java/com/ss/editor/file/delete/handler/impl/DeleteMaterialsModelFileDeleteHandler.java b/src/main/java/com/ss/editor/file/delete/handler/impl/DeleteMaterialsModelFileDeleteHandler.java index b78a6ca9..a85515eb 100644 --- a/src/main/java/com/ss/editor/file/delete/handler/impl/DeleteMaterialsModelFileDeleteHandler.java +++ b/src/main/java/com/ss/editor/file/delete/handler/impl/DeleteMaterialsModelFileDeleteHandler.java @@ -3,7 +3,7 @@ import static com.ss.editor.FileExtensions.JME_OBJECT; import static com.ss.editor.util.EditorUtil.getAssetFile; import static com.ss.editor.util.EditorUtil.toAssetPath; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.asset.AssetManager; import com.jme3.material.Material; import com.jme3.scene.Spatial; @@ -11,10 +11,10 @@ import com.ss.editor.ui.dialog.ConfirmDialog; import com.ss.editor.util.EditorUtil; import com.ss.editor.util.NodeUtils; -import com.ss.rlib.util.FileUtils; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.FileUtils; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/manager/ClasspathManager.java b/src/main/java/com/ss/editor/manager/ClasspathManager.java index a2ed4642..0fdb4fd4 100644 --- a/src/main/java/com/ss/editor/manager/ClasspathManager.java +++ b/src/main/java/com/ss/editor/manager/ClasspathManager.java @@ -2,21 +2,21 @@ import static com.ss.editor.config.DefaultSettingsProvider.Preferences.PREF_USER_CLASSES_FOLDER; import static com.ss.editor.config.DefaultSettingsProvider.Preferences.PREF_USER_LIBRARY_FOLDER; -import static com.ss.rlib.util.array.ArrayFactory.toArray; +import static com.ss.rlib.common.util.array.ArrayFactory.toArray; import com.jme3.asset.AssetManager; import com.ss.editor.FileExtensions; import com.ss.editor.JmeApplication; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.config.EditorConfig; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.classpath.ClassPathScanner; -import com.ss.rlib.classpath.ClassPathScannerFactory; -import com.ss.rlib.manager.InitializeManager; -import com.ss.rlib.plugin.PluginContainer; -import com.ss.rlib.util.FileUtils; -import com.ss.rlib.util.Utils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.classpath.ClassPathScanner; +import com.ss.rlib.common.classpath.ClassPathScannerFactory; +import com.ss.rlib.common.manager.InitializeManager; +import com.ss.rlib.common.plugin.PluginContainer; +import com.ss.rlib.common.util.FileUtils; +import com.ss.rlib.common.util.Utils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/manager/ExecutorManager.java b/src/main/java/com/ss/editor/manager/ExecutorManager.java index 060cd332..6625be51 100644 --- a/src/main/java/com/ss/editor/manager/ExecutorManager.java +++ b/src/main/java/com/ss/editor/manager/ExecutorManager.java @@ -5,9 +5,9 @@ import com.ss.editor.executor.impl.BackgroundEditorTaskExecutor; import com.ss.editor.executor.impl.FxEditorTaskExecutor; import com.ss.editor.executor.impl.JmeThreadExecutor; -import com.ss.rlib.concurrent.atomic.AtomicInteger; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerManager; +import com.ss.rlib.common.concurrent.atomic.AtomicInteger; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/manager/FileIconManager.java b/src/main/java/com/ss/editor/manager/FileIconManager.java index 2a50a648..12b8cc1d 100644 --- a/src/main/java/com/ss/editor/manager/FileIconManager.java +++ b/src/main/java/com/ss/editor/manager/FileIconManager.java @@ -3,7 +3,7 @@ import static com.ss.editor.config.DefaultSettingsProvider.Defaults.PREF_DEFAULT_THEME; import static com.ss.editor.config.DefaultSettingsProvider.Preferences.PREF_UI_THEME; import static com.ss.editor.util.EditorUtil.toAssetPath; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.FileExtensions; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; @@ -11,15 +11,15 @@ import com.ss.editor.ui.css.CssColorTheme; import com.ss.editor.util.EditorUtil; import com.ss.editor.util.svg.SvgImageLoader; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerManager; -import com.ss.rlib.manager.InitializeManager; -import com.ss.rlib.util.FileUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; -import com.ss.rlib.util.dictionary.DictionaryFactory; -import com.ss.rlib.util.dictionary.IntegerDictionary; -import com.ss.rlib.util.dictionary.ObjectDictionary; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; +import com.ss.rlib.common.manager.InitializeManager; +import com.ss.rlib.common.util.FileUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; +import com.ss.rlib.common.util.dictionary.DictionaryFactory; +import com.ss.rlib.common.util.dictionary.IntegerDictionary; +import com.ss.rlib.common.util.dictionary.ObjectDictionary; import javafx.scene.image.Image; import javafx.scene.paint.Color; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/ss/editor/manager/InitializationManager.java b/src/main/java/com/ss/editor/manager/InitializationManager.java index ddf3c668..4366c570 100644 --- a/src/main/java/com/ss/editor/manager/InitializationManager.java +++ b/src/main/java/com/ss/editor/manager/InitializationManager.java @@ -3,8 +3,8 @@ import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.JmeThread; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; /** diff --git a/src/main/java/com/ss/editor/manager/JavaFxImageManager.java b/src/main/java/com/ss/editor/manager/JavaFxImageManager.java index b8d8ed37..b45ec551 100644 --- a/src/main/java/com/ss/editor/manager/JavaFxImageManager.java +++ b/src/main/java/com/ss/editor/manager/JavaFxImageManager.java @@ -1,7 +1,7 @@ package com.ss.editor.manager; -import static com.ss.rlib.util.FileUtils.getExtension; -import static com.ss.rlib.util.array.ArrayFactory.asArray; +import static com.ss.rlib.common.util.FileUtils.getExtension; +import static com.ss.rlib.common.util.array.ArrayFactory.asArray; import static java.awt.Image.SCALE_DEFAULT; import static java.nio.file.StandardOpenOption.*; import com.jme3.asset.AssetManager; @@ -17,17 +17,17 @@ import com.ss.editor.ui.event.impl.ChangedCurrentAssetFolderEvent; import com.ss.editor.ui.event.impl.DeletedFileEvent; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerManager; -import com.ss.rlib.manager.InitializeManager; -import com.ss.rlib.util.FileUtils; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.Utils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; -import com.ss.rlib.util.dictionary.DictionaryFactory; -import com.ss.rlib.util.dictionary.IntegerDictionary; -import com.ss.rlib.util.dictionary.ObjectDictionary; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; +import com.ss.rlib.common.manager.InitializeManager; +import com.ss.rlib.common.util.FileUtils; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.Utils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; +import com.ss.rlib.common.util.dictionary.DictionaryFactory; +import com.ss.rlib.common.util.dictionary.IntegerDictionary; +import com.ss.rlib.common.util.dictionary.ObjectDictionary; import javafx.embed.swing.SwingFXUtils; import javafx.scene.image.Image; import jme3tools.converters.ImageToAwt; diff --git a/src/main/java/com/ss/editor/manager/JmeFilePreviewManager.java b/src/main/java/com/ss/editor/manager/JmeFilePreviewManager.java index 88e68241..f93903a0 100644 --- a/src/main/java/com/ss/editor/manager/JmeFilePreviewManager.java +++ b/src/main/java/com/ss/editor/manager/JmeFilePreviewManager.java @@ -6,8 +6,8 @@ import static com.ss.editor.config.DefaultSettingsProvider.Preferences.PREF_TANGENT_GENERATION; import static com.ss.editor.util.EditorUtil.getAssetFile; import static com.ss.editor.util.EditorUtil.toAssetPath; -import static com.ss.rlib.util.FileUtils.getExtension; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.FileUtils.getExtension; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.asset.AssetManager; import com.jme3.asset.AssetNotFoundException; import com.jme3.environment.generation.JobProgressAdapter; @@ -39,12 +39,12 @@ import com.ss.editor.ui.scene.EditorFxScene; import com.ss.editor.util.EditorUtil; import com.ss.editor.util.TangentGenerator; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerManager; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.image.ImageView; import javafx.scene.layout.StackPane; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/ss/editor/manager/PluginManager.java b/src/main/java/com/ss/editor/manager/PluginManager.java index 42c3138b..31f36735 100644 --- a/src/main/java/com/ss/editor/manager/PluginManager.java +++ b/src/main/java/com/ss/editor/manager/PluginManager.java @@ -1,6 +1,6 @@ package com.ss.editor.manager; -import static com.ss.rlib.plugin.impl.PluginSystemFactory.newBasePluginSystem; +import static com.ss.rlib.common.plugin.impl.PluginSystemFactory.newBasePluginSystem; import com.jme3.asset.AssetManager; import com.ss.editor.JmeApplication; import com.ss.editor.annotation.FromAnyThread; @@ -9,16 +9,16 @@ import com.ss.editor.config.Config; import com.ss.editor.plugin.EditorPlugin; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerManager; -import com.ss.rlib.manager.InitializeManager; -import com.ss.rlib.plugin.ConfigurablePluginSystem; -import com.ss.rlib.plugin.Plugin; -import com.ss.rlib.plugin.PluginContainer; -import com.ss.rlib.plugin.exception.PreloadPluginException; -import com.ss.rlib.util.FileUtils; -import com.ss.rlib.util.Utils; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; +import com.ss.rlib.common.manager.InitializeManager; +import com.ss.rlib.common.plugin.ConfigurablePluginSystem; +import com.ss.rlib.common.plugin.Plugin; +import com.ss.rlib.common.plugin.PluginContainer; +import com.ss.rlib.common.plugin.exception.PreloadPluginException; +import com.ss.rlib.common.util.FileUtils; +import com.ss.rlib.common.util.Utils; +import com.ss.rlib.common.util.array.Array; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/manager/RemoteControlManager.java b/src/main/java/com/ss/editor/manager/RemoteControlManager.java index b61f0031..cfccda3f 100644 --- a/src/main/java/com/ss/editor/manager/RemoteControlManager.java +++ b/src/main/java/com/ss/editor/manager/RemoteControlManager.java @@ -3,12 +3,12 @@ import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.config.Config; import com.ss.editor.manager.ClasspathManager.Scope; -import com.ss.rlib.network.NetworkConfig; -import com.ss.rlib.network.NetworkFactory; -import com.ss.rlib.network.packet.ReadablePacket; -import com.ss.rlib.network.packet.ReadablePacketRegistry; -import com.ss.rlib.network.server.AcceptHandler; -import com.ss.rlib.network.server.ServerNetwork; +import com.ss.rlib.common.network.NetworkConfig; +import com.ss.rlib.common.network.NetworkFactory; +import com.ss.rlib.common.network.packet.ReadablePacket; +import com.ss.rlib.common.network.packet.ReadablePacketRegistry; +import com.ss.rlib.common.network.server.AcceptHandler; +import com.ss.rlib.common.network.server.ServerNetwork; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/manager/ResourceManager.java b/src/main/java/com/ss/editor/manager/ResourceManager.java index 9d1ed0cf..f7aa52db 100644 --- a/src/main/java/com/ss/editor/manager/ResourceManager.java +++ b/src/main/java/com/ss/editor/manager/ResourceManager.java @@ -3,13 +3,13 @@ import static com.ss.editor.FileExtensions.*; import static com.ss.editor.config.DefaultSettingsProvider.Preferences.PREF_FAST_SKY_FOLDER; import static com.ss.editor.util.EditorUtil.*; -import static com.ss.rlib.util.ArrayUtils.contains; -import static com.ss.rlib.util.FileUtils.getFiles; -import static com.ss.rlib.util.FileUtils.toUrl; -import static com.ss.rlib.util.ObjectUtils.notNull; -import static com.ss.rlib.util.Utils.get; -import static com.ss.rlib.util.array.ArrayFactory.toArray; -import static com.ss.rlib.util.ref.ReferenceFactory.newRef; +import static com.ss.rlib.common.util.ArrayUtils.contains; +import static com.ss.rlib.common.util.FileUtils.getFiles; +import static com.ss.rlib.common.util.FileUtils.toUrl; +import static com.ss.rlib.common.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.Utils.get; +import static com.ss.rlib.common.util.array.ArrayFactory.toArray; +import static com.ss.rlib.common.util.ref.ReferenceFactory.newRef; import static java.lang.System.currentTimeMillis; import static java.nio.file.StandardWatchEventKinds.*; import com.jme3.asset.AssetEventListener; @@ -24,20 +24,20 @@ import com.ss.editor.util.EditorUtil; import com.ss.editor.util.SimpleFileVisitor; import com.ss.editor.util.SimpleFolderVisitor; -import com.ss.rlib.concurrent.util.ThreadUtils; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerManager; -import com.ss.rlib.manager.InitializeManager; -import com.ss.rlib.util.FileUtils; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.Utils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayComparator; -import com.ss.rlib.util.array.ArrayFactory; -import com.ss.rlib.util.dictionary.DictionaryFactory; -import com.ss.rlib.util.dictionary.ObjectDictionary; -import com.ss.rlib.util.ref.Reference; -import com.ss.rlib.util.ref.ReferenceType; +import com.ss.rlib.common.concurrent.util.ThreadUtils; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; +import com.ss.rlib.common.manager.InitializeManager; +import com.ss.rlib.common.util.FileUtils; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.Utils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayComparator; +import com.ss.rlib.common.util.array.ArrayFactory; +import com.ss.rlib.common.util.dictionary.DictionaryFactory; +import com.ss.rlib.common.util.dictionary.ObjectDictionary; +import com.ss.rlib.common.util.ref.Reference; +import com.ss.rlib.common.util.ref.ReferenceType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/manager/WorkspaceManager.java b/src/main/java/com/ss/editor/manager/WorkspaceManager.java index 00366381..ab3bb7cc 100644 --- a/src/main/java/com/ss/editor/manager/WorkspaceManager.java +++ b/src/main/java/com/ss/editor/manager/WorkspaceManager.java @@ -1,16 +1,16 @@ package com.ss.editor.manager; -import static com.ss.rlib.util.ObjectUtils.notNull; -import static com.ss.rlib.util.Utils.get; +import static com.ss.rlib.common.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.Utils.get; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.config.EditorConfig; import com.ss.editor.model.workspace.Workspace; import com.ss.editor.util.EditorUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import com.ss.rlib.manager.InitializeManager; -import com.ss.rlib.util.dictionary.DictionaryFactory; -import com.ss.rlib.util.dictionary.ObjectDictionary; +import com.ss.rlib.common.manager.InitializeManager; +import com.ss.rlib.common.util.dictionary.DictionaryFactory; +import com.ss.rlib.common.util.dictionary.ObjectDictionary; import java.nio.file.Files; import java.nio.file.Path; diff --git a/src/main/java/com/ss/editor/model/EditorCamera.java b/src/main/java/com/ss/editor/model/EditorCamera.java index 0b42dd04..2514eccf 100644 --- a/src/main/java/com/ss/editor/model/EditorCamera.java +++ b/src/main/java/com/ss/editor/model/EditorCamera.java @@ -1,7 +1,7 @@ package com.ss.editor.model; -import static com.ss.rlib.geom.util.AngleUtils.degreeToRadians; -import static com.ss.rlib.geom.util.AngleUtils.radiansToDegree; +import static com.ss.rlib.common.geom.util.AngleUtils.degreeToRadians; +import static com.ss.rlib.common.geom.util.AngleUtils.radiansToDegree; import static java.lang.Math.*; import com.jme3.export.InputCapsule; import com.jme3.export.JmeExporter; @@ -19,8 +19,8 @@ import com.jme3.scene.Spatial; import com.jme3.scene.control.Control; import com.ss.editor.config.Config; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerManager; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; import org.jetbrains.annotations.NotNull; import java.io.IOException; diff --git a/src/main/java/com/ss/editor/model/scene/EditorAudioNode.java b/src/main/java/com/ss/editor/model/scene/EditorAudioNode.java index 92971044..321b0243 100644 --- a/src/main/java/com/ss/editor/model/scene/EditorAudioNode.java +++ b/src/main/java/com/ss/editor/model/scene/EditorAudioNode.java @@ -1,7 +1,7 @@ package com.ss.editor.model.scene; import static com.ss.editor.util.GeomUtils.getDirection; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.audio.AudioNode; import com.jme3.math.Quaternion; import com.jme3.math.Vector3f; diff --git a/src/main/java/com/ss/editor/model/scene/EditorLightNode.java b/src/main/java/com/ss/editor/model/scene/EditorLightNode.java index 7c97aa6c..a7c735ca 100644 --- a/src/main/java/com/ss/editor/model/scene/EditorLightNode.java +++ b/src/main/java/com/ss/editor/model/scene/EditorLightNode.java @@ -1,7 +1,7 @@ package com.ss.editor.model.scene; import static com.ss.editor.util.GeomUtils.getDirection; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.light.DirectionalLight; import com.jme3.light.Light; import com.jme3.light.PointLight; diff --git a/src/main/java/com/ss/editor/model/scene/EditorPresentableNode.java b/src/main/java/com/ss/editor/model/scene/EditorPresentableNode.java index 0f61eb6d..0c0907b6 100644 --- a/src/main/java/com/ss/editor/model/scene/EditorPresentableNode.java +++ b/src/main/java/com/ss/editor/model/scene/EditorPresentableNode.java @@ -1,6 +1,6 @@ package com.ss.editor.model.scene; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.scene.Geometry; import com.jme3.scene.Node; import com.ss.editor.annotation.FromAnyThread; diff --git a/src/main/java/com/ss/editor/model/undo/EditorOperationControl.java b/src/main/java/com/ss/editor/model/undo/EditorOperationControl.java index e53dcdd3..b8544613 100644 --- a/src/main/java/com/ss/editor/model/undo/EditorOperationControl.java +++ b/src/main/java/com/ss/editor/model/undo/EditorOperationControl.java @@ -3,8 +3,8 @@ import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; import com.ss.editor.manager.ExecutorManager; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.application.Platform; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/ss/editor/model/undo/impl/AbstractEditorOperation.java b/src/main/java/com/ss/editor/model/undo/impl/AbstractEditorOperation.java index 057c17fb..26c71d60 100644 --- a/src/main/java/com/ss/editor/model/undo/impl/AbstractEditorOperation.java +++ b/src/main/java/com/ss/editor/model/undo/impl/AbstractEditorOperation.java @@ -1,12 +1,12 @@ package com.ss.editor.model.undo.impl; -import static com.ss.rlib.util.ClassUtils.unsafeCast; +import static com.ss.rlib.common.util.ClassUtils.unsafeCast; import com.ss.editor.annotation.FxThread; import com.ss.editor.manager.ExecutorManager; import com.ss.editor.model.undo.EditorOperation; import com.ss.editor.model.undo.UndoableEditor; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerManager; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; import org.jetbrains.annotations.NotNull; /** diff --git a/src/main/java/com/ss/editor/model/undo/impl/AddVehicleWheelOperation.java b/src/main/java/com/ss/editor/model/undo/impl/AddVehicleWheelOperation.java index fa304f47..8a0ba5b7 100644 --- a/src/main/java/com/ss/editor/model/undo/impl/AddVehicleWheelOperation.java +++ b/src/main/java/com/ss/editor/model/undo/impl/AddVehicleWheelOperation.java @@ -1,6 +1,6 @@ package com.ss.editor.model.undo.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.bullet.control.VehicleControl; import com.jme3.bullet.objects.VehicleWheel; import com.jme3.math.Vector3f; diff --git a/src/main/java/com/ss/editor/model/undo/impl/ChangeControlsOperation.java b/src/main/java/com/ss/editor/model/undo/impl/ChangeControlsOperation.java index fedfde03..8ed9c8a7 100644 --- a/src/main/java/com/ss/editor/model/undo/impl/ChangeControlsOperation.java +++ b/src/main/java/com/ss/editor/model/undo/impl/ChangeControlsOperation.java @@ -5,7 +5,7 @@ import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.JmeThread; import com.ss.editor.model.undo.editor.ModelChangeConsumer; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.util.array.Array; import org.jetbrains.annotations.NotNull; /** diff --git a/src/main/java/com/ss/editor/model/undo/impl/DisableControlsOperation.java b/src/main/java/com/ss/editor/model/undo/impl/DisableControlsOperation.java index ce3620bb..9005f075 100644 --- a/src/main/java/com/ss/editor/model/undo/impl/DisableControlsOperation.java +++ b/src/main/java/com/ss/editor/model/undo/impl/DisableControlsOperation.java @@ -4,7 +4,7 @@ import com.jme3.scene.control.Control; import com.ss.editor.Messages; import com.ss.editor.util.ControlUtils; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.util.array.Array; import org.jetbrains.annotations.NotNull; /** diff --git a/src/main/java/com/ss/editor/model/undo/impl/EnableControlsOperation.java b/src/main/java/com/ss/editor/model/undo/impl/EnableControlsOperation.java index f7fbf8ee..ec4c92bc 100644 --- a/src/main/java/com/ss/editor/model/undo/impl/EnableControlsOperation.java +++ b/src/main/java/com/ss/editor/model/undo/impl/EnableControlsOperation.java @@ -4,7 +4,7 @@ import com.jme3.scene.control.Control; import com.ss.editor.Messages; import com.ss.editor.util.ControlUtils; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.util.array.Array; import org.jetbrains.annotations.NotNull; /** diff --git a/src/main/java/com/ss/editor/model/undo/impl/RemoveElementsOperation.java b/src/main/java/com/ss/editor/model/undo/impl/RemoveElementsOperation.java index 95079c23..255a2e94 100644 --- a/src/main/java/com/ss/editor/model/undo/impl/RemoveElementsOperation.java +++ b/src/main/java/com/ss/editor/model/undo/impl/RemoveElementsOperation.java @@ -9,8 +9,8 @@ import com.ss.editor.annotation.JmeThread; import com.ss.editor.model.undo.editor.ModelChangeConsumer; import com.ss.editor.model.undo.impl.AbstractEditorOperation; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; /** diff --git a/src/main/java/com/ss/editor/model/undo/impl/RemoveVehicleWheelOperation.java b/src/main/java/com/ss/editor/model/undo/impl/RemoveVehicleWheelOperation.java index 38b52092..d66aaf9c 100644 --- a/src/main/java/com/ss/editor/model/undo/impl/RemoveVehicleWheelOperation.java +++ b/src/main/java/com/ss/editor/model/undo/impl/RemoveVehicleWheelOperation.java @@ -1,6 +1,6 @@ package com.ss.editor.model.undo.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.bullet.control.VehicleControl; import com.jme3.bullet.objects.VehicleWheel; import com.jme3.math.Vector3f; diff --git a/src/main/java/com/ss/editor/model/undo/impl/scene/RemoveSceneLayerOperation.java b/src/main/java/com/ss/editor/model/undo/impl/scene/RemoveSceneLayerOperation.java index 33239f33..b449c297 100644 --- a/src/main/java/com/ss/editor/model/undo/impl/scene/RemoveSceneLayerOperation.java +++ b/src/main/java/com/ss/editor/model/undo/impl/scene/RemoveSceneLayerOperation.java @@ -9,8 +9,8 @@ import org.jetbrains.annotations.NotNull; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; /** * The implementation of the {@link AbstractEditorOperation} to remove a layer from a scene. diff --git a/src/main/java/com/ss/editor/model/workspace/Workspace.java b/src/main/java/com/ss/editor/model/workspace/Workspace.java index bfbf446b..5ee77603 100644 --- a/src/main/java/com/ss/editor/model/workspace/Workspace.java +++ b/src/main/java/com/ss/editor/model/workspace/Workspace.java @@ -2,19 +2,19 @@ import static com.ss.editor.util.EditorUtil.getAssetFile; import static com.ss.editor.util.EditorUtil.toAssetPath; -import static com.ss.rlib.util.ClassUtils.unsafeCast; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ClassUtils.unsafeCast; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.manager.WorkspaceManager; import com.ss.editor.ui.component.editor.EditorDescription; import com.ss.editor.ui.component.editor.FileEditor; import com.ss.editor.ui.component.editor.state.EditorState; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerManager; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/part3d/editor/impl/AbstractEditor3DPart.java b/src/main/java/com/ss/editor/part3d/editor/impl/AbstractEditor3DPart.java index d756061c..3702cea6 100644 --- a/src/main/java/com/ss/editor/part3d/editor/impl/AbstractEditor3DPart.java +++ b/src/main/java/com/ss/editor/part3d/editor/impl/AbstractEditor3DPart.java @@ -6,8 +6,8 @@ import com.ss.editor.manager.ExecutorManager; import com.ss.editor.part3d.editor.Editor3DPart; import com.ss.editor.ui.component.editor.FileEditor; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerManager; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; import org.jetbrains.annotations.NotNull; /** diff --git a/src/main/java/com/ss/editor/part3d/editor/impl/AdvancedAbstractEditor3DPart.java b/src/main/java/com/ss/editor/part3d/editor/impl/AdvancedAbstractEditor3DPart.java index e03d4ceb..f98394e1 100644 --- a/src/main/java/com/ss/editor/part3d/editor/impl/AdvancedAbstractEditor3DPart.java +++ b/src/main/java/com/ss/editor/part3d/editor/impl/AdvancedAbstractEditor3DPart.java @@ -1,7 +1,7 @@ package com.ss.editor.part3d.editor.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; -import static com.ss.rlib.util.array.ArrayFactory.toArray; +import static com.ss.rlib.common.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.array.ArrayFactory.toArray; import com.jme3.app.Application; import com.jme3.app.state.AppStateManager; import com.jme3.input.InputManager; @@ -22,11 +22,11 @@ import com.ss.editor.ui.component.editor.FileEditor; import com.ss.editor.util.EditorUtil; import com.ss.editor.util.LocalObjects; -import com.ss.rlib.function.BooleanFloatConsumer; -import com.ss.rlib.function.FloatFloatConsumer; -import com.ss.rlib.logging.LoggerLevel; -import com.ss.rlib.util.dictionary.DictionaryFactory; -import com.ss.rlib.util.dictionary.ObjectDictionary; +import com.ss.rlib.common.function.BooleanFloatConsumer; +import com.ss.rlib.common.function.FloatFloatConsumer; +import com.ss.rlib.common.logging.LoggerLevel; +import com.ss.rlib.common.util.dictionary.DictionaryFactory; +import com.ss.rlib.common.util.dictionary.ObjectDictionary; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/part3d/editor/impl/Stats3DPart.java b/src/main/java/com/ss/editor/part3d/editor/impl/Stats3DPart.java index 12245d72..24e4e427 100644 --- a/src/main/java/com/ss/editor/part3d/editor/impl/Stats3DPart.java +++ b/src/main/java/com/ss/editor/part3d/editor/impl/Stats3DPart.java @@ -1,6 +1,6 @@ package com.ss.editor.part3d.editor.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.app.Application; import com.jme3.app.state.AbstractAppState; import com.jme3.app.state.AppStateManager; @@ -12,8 +12,8 @@ import com.ss.editor.manager.ExecutorManager; import com.ss.editor.part3d.editor.Editor3DPart; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.ArrayUtils; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.ArrayUtils; import javafx.scene.control.Label; import javafx.scene.layout.GridPane; import javafx.scene.layout.Pane; diff --git a/src/main/java/com/ss/editor/part3d/editor/impl/audio/AudioViewer3DPart.java b/src/main/java/com/ss/editor/part3d/editor/impl/audio/AudioViewer3DPart.java index 03d38c4c..462475a1 100644 --- a/src/main/java/com/ss/editor/part3d/editor/impl/audio/AudioViewer3DPart.java +++ b/src/main/java/com/ss/editor/part3d/editor/impl/audio/AudioViewer3DPart.java @@ -1,6 +1,6 @@ package com.ss.editor.part3d.editor.impl.audio; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.audio.AudioData; import com.jme3.audio.AudioKey; import com.jme3.audio.AudioNode; diff --git a/src/main/java/com/ss/editor/part3d/editor/impl/model/ModelEditor3DPart.java b/src/main/java/com/ss/editor/part3d/editor/impl/model/ModelEditor3DPart.java index 18ebb623..09abef91 100644 --- a/src/main/java/com/ss/editor/part3d/editor/impl/model/ModelEditor3DPart.java +++ b/src/main/java/com/ss/editor/part3d/editor/impl/model/ModelEditor3DPart.java @@ -13,8 +13,8 @@ import com.ss.editor.plugin.api.RenderFilterExtension; import com.ss.editor.ui.component.editor.impl.model.ModelFileEditor; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/part3d/editor/impl/scene/AbstractSceneEditor3DPart.java b/src/main/java/com/ss/editor/part3d/editor/impl/scene/AbstractSceneEditor3DPart.java index e5e2f7ca..28865cf5 100644 --- a/src/main/java/com/ss/editor/part3d/editor/impl/scene/AbstractSceneEditor3DPart.java +++ b/src/main/java/com/ss/editor/part3d/editor/impl/scene/AbstractSceneEditor3DPart.java @@ -1,7 +1,7 @@ package com.ss.editor.part3d.editor.impl.scene; import static com.ss.editor.util.NodeUtils.findParent; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.app.state.AppState; import com.jme3.asset.AssetManager; import com.jme3.asset.AssetNotFoundException; @@ -51,13 +51,13 @@ import com.ss.editor.ui.component.editor.impl.scene.AbstractSceneFileEditor; import com.ss.editor.ui.control.property.operation.PropertyOperation; import com.ss.editor.util.*; -import com.ss.rlib.function.BooleanFloatConsumer; -import com.ss.rlib.geom.util.AngleUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; -import com.ss.rlib.util.array.ArrayIterator; -import com.ss.rlib.util.dictionary.DictionaryFactory; -import com.ss.rlib.util.dictionary.ObjectDictionary; +import com.ss.rlib.common.function.BooleanFloatConsumer; +import com.ss.rlib.common.geom.util.AngleUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.ArrayIterator; +import com.ss.rlib.common.util.dictionary.DictionaryFactory; +import com.ss.rlib.common.util.dictionary.ObjectDictionary; import javafx.scene.input.KeyCode; import javafx.scene.input.MouseButton; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/ss/editor/part3d/editor/impl/scene/handler/ApplyScaleToPhysicsControlsHandler.java b/src/main/java/com/ss/editor/part3d/editor/impl/scene/handler/ApplyScaleToPhysicsControlsHandler.java index 6efdaa68..fcd78de1 100644 --- a/src/main/java/com/ss/editor/part3d/editor/impl/scene/handler/ApplyScaleToPhysicsControlsHandler.java +++ b/src/main/java/com/ss/editor/part3d/editor/impl/scene/handler/ApplyScaleToPhysicsControlsHandler.java @@ -9,8 +9,8 @@ import com.ss.editor.part3d.editor.impl.scene.AbstractSceneEditor3DPart; import com.ss.editor.util.ControlUtils; import com.ss.editor.util.NodeUtils; -import com.ss.rlib.util.dictionary.DictionaryFactory; -import com.ss.rlib.util.dictionary.ObjectDictionary; +import com.ss.rlib.common.util.dictionary.DictionaryFactory; +import com.ss.rlib.common.util.dictionary.ObjectDictionary; import org.jetbrains.annotations.NotNull; /** diff --git a/src/main/java/com/ss/editor/part3d/editor/impl/scene/handler/DisableControlsTransformationHandler.java b/src/main/java/com/ss/editor/part3d/editor/impl/scene/handler/DisableControlsTransformationHandler.java index 5cf51894..0a6d2bf9 100644 --- a/src/main/java/com/ss/editor/part3d/editor/impl/scene/handler/DisableControlsTransformationHandler.java +++ b/src/main/java/com/ss/editor/part3d/editor/impl/scene/handler/DisableControlsTransformationHandler.java @@ -1,6 +1,6 @@ package com.ss.editor.part3d.editor.impl.scene.handler; -import static com.ss.rlib.util.array.ArrayCollectors.toArray; +import static com.ss.rlib.common.util.array.ArrayCollectors.toArray; import com.jme3.bullet.control.PhysicsControl; import com.jme3.bullet.control.RigidBodyControl; @@ -9,9 +9,9 @@ import com.ss.editor.annotation.JmeThread; import com.ss.editor.util.ControlUtils; import com.ss.editor.util.NodeUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.dictionary.DictionaryFactory; -import com.ss.rlib.util.dictionary.ObjectDictionary; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.dictionary.DictionaryFactory; +import com.ss.rlib.common.util.dictionary.ObjectDictionary; import org.jetbrains.annotations.NotNull; /** diff --git a/src/main/java/com/ss/editor/plugin/EditorPlugin.java b/src/main/java/com/ss/editor/plugin/EditorPlugin.java index 3e725545..1d1c4758 100644 --- a/src/main/java/com/ss/editor/plugin/EditorPlugin.java +++ b/src/main/java/com/ss/editor/plugin/EditorPlugin.java @@ -14,9 +14,9 @@ import com.ss.editor.ui.control.tree.node.factory.TreeNodeFactoryRegistry; import com.ss.editor.ui.css.CssRegistry; import com.ss.editor.ui.preview.FilePreviewFactoryRegistry; -import com.ss.rlib.plugin.PluginContainer; -import com.ss.rlib.plugin.PluginSystem; -import com.ss.rlib.plugin.impl.BasePlugin; +import com.ss.rlib.common.plugin.PluginContainer; +import com.ss.rlib.common.plugin.PluginSystem; +import com.ss.rlib.common.plugin.impl.BasePlugin; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/plugin/api/RenderFilterExtension.java b/src/main/java/com/ss/editor/plugin/api/RenderFilterExtension.java index 6d1aad61..5658a54a 100644 --- a/src/main/java/com/ss/editor/plugin/api/RenderFilterExtension.java +++ b/src/main/java/com/ss/editor/plugin/api/RenderFilterExtension.java @@ -4,11 +4,11 @@ import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.JmeThread; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.util.ClassUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; -import com.ss.rlib.util.dictionary.DictionaryFactory; -import com.ss.rlib.util.dictionary.ObjectDictionary; +import com.ss.rlib.common.util.ClassUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; +import com.ss.rlib.common.util.dictionary.DictionaryFactory; +import com.ss.rlib.common.util.dictionary.ObjectDictionary; import org.jetbrains.annotations.NotNull; import java.util.function.Consumer; diff --git a/src/main/java/com/ss/editor/plugin/api/dialog/GenericFactoryDialog.java b/src/main/java/com/ss/editor/plugin/api/dialog/GenericFactoryDialog.java index 0967a242..dfb3f28b 100644 --- a/src/main/java/com/ss/editor/plugin/api/dialog/GenericFactoryDialog.java +++ b/src/main/java/com/ss/editor/plugin/api/dialog/GenericFactoryDialog.java @@ -1,15 +1,15 @@ package com.ss.editor.plugin.api.dialog; import static com.ss.editor.plugin.api.property.control.PropertyEditorControlFactory.build; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.Messages; import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.plugin.api.property.control.PropertyEditorControl; import com.ss.editor.ui.dialog.AbstractSimpleEditorDialog; -import com.ss.rlib.util.VarTable; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.common.util.array.Array; import javafx.collections.ObservableList; import javafx.scene.Node; import javafx.scene.layout.VBox; diff --git a/src/main/java/com/ss/editor/plugin/api/editor/Advanced3DFileEditorWithRightTool.java b/src/main/java/com/ss/editor/plugin/api/editor/Advanced3DFileEditorWithRightTool.java index 87008b41..20d005c7 100644 --- a/src/main/java/com/ss/editor/plugin/api/editor/Advanced3DFileEditorWithRightTool.java +++ b/src/main/java/com/ss/editor/plugin/api/editor/Advanced3DFileEditorWithRightTool.java @@ -1,6 +1,6 @@ package com.ss.editor.plugin.api.editor; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FxThread; import com.ss.editor.plugin.api.editor.part3d.Advanced3DEditorPart; import com.ss.editor.ui.component.editor.state.impl.Editor3DWithEditorToolEditorState; @@ -9,7 +9,7 @@ import com.ss.editor.ui.component.tab.ScrollableEditorToolComponent; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.event.Event; import javafx.scene.input.DragEvent; import javafx.scene.layout.BorderPane; diff --git a/src/main/java/com/ss/editor/plugin/api/editor/Advanced3DFileEditorWithSplitRightTool.java b/src/main/java/com/ss/editor/plugin/api/editor/Advanced3DFileEditorWithSplitRightTool.java index 4d7dad44..fbb272c2 100644 --- a/src/main/java/com/ss/editor/plugin/api/editor/Advanced3DFileEditorWithSplitRightTool.java +++ b/src/main/java/com/ss/editor/plugin/api/editor/Advanced3DFileEditorWithSplitRightTool.java @@ -4,7 +4,7 @@ import com.ss.editor.plugin.api.editor.part3d.Advanced3DEditorPart; import com.ss.editor.ui.component.editor.state.impl.Editor3DWithEditorToolEditorState; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.scene.Node; import javafx.scene.control.SplitPane; import javafx.scene.layout.Region; diff --git a/src/main/java/com/ss/editor/plugin/api/editor/BaseFileEditor.java b/src/main/java/com/ss/editor/plugin/api/editor/BaseFileEditor.java index 1c584ec6..b6688e60 100644 --- a/src/main/java/com/ss/editor/plugin/api/editor/BaseFileEditor.java +++ b/src/main/java/com/ss/editor/plugin/api/editor/BaseFileEditor.java @@ -1,6 +1,6 @@ package com.ss.editor.plugin.api.editor; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.manager.WorkspaceManager; diff --git a/src/main/java/com/ss/editor/plugin/api/editor/BaseFileEditorWithRightTool.java b/src/main/java/com/ss/editor/plugin/api/editor/BaseFileEditorWithRightTool.java index b8877821..aa7b74e8 100644 --- a/src/main/java/com/ss/editor/plugin/api/editor/BaseFileEditorWithRightTool.java +++ b/src/main/java/com/ss/editor/plugin/api/editor/BaseFileEditorWithRightTool.java @@ -1,6 +1,6 @@ package com.ss.editor.plugin.api.editor; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FxThread; import com.ss.editor.ui.component.editor.state.impl.EditorWithEditorToolEditorState; import com.ss.editor.ui.component.split.pane.EditorToolSplitPane; @@ -8,7 +8,7 @@ import com.ss.editor.ui.component.tab.ScrollableEditorToolComponent; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.scene.input.DragEvent; import javafx.scene.layout.StackPane; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/ss/editor/plugin/api/editor/BaseFileEditorWithSplitRightTool.java b/src/main/java/com/ss/editor/plugin/api/editor/BaseFileEditorWithSplitRightTool.java index 738b636c..69fad2f7 100644 --- a/src/main/java/com/ss/editor/plugin/api/editor/BaseFileEditorWithSplitRightTool.java +++ b/src/main/java/com/ss/editor/plugin/api/editor/BaseFileEditorWithSplitRightTool.java @@ -3,7 +3,7 @@ import com.ss.editor.annotation.FxThread; import com.ss.editor.ui.component.editor.state.impl.EditorWithEditorToolEditorState; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.scene.Node; import javafx.scene.control.SplitPane; import javafx.scene.layout.Region; diff --git a/src/main/java/com/ss/editor/plugin/api/editor/material/BaseMaterialEditor3DPart.java b/src/main/java/com/ss/editor/plugin/api/editor/material/BaseMaterialEditor3DPart.java index 1762b6a5..d39831e9 100644 --- a/src/main/java/com/ss/editor/plugin/api/editor/material/BaseMaterialEditor3DPart.java +++ b/src/main/java/com/ss/editor/plugin/api/editor/material/BaseMaterialEditor3DPart.java @@ -1,6 +1,6 @@ package com.ss.editor.plugin.api.editor.material; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.app.Application; import com.jme3.app.state.AppStateManager; import com.jme3.asset.AssetNotFoundException; @@ -26,9 +26,9 @@ import com.ss.editor.plugin.api.editor.part3d.AdvancedPbrWithStudioSky3DEditorPart; import com.ss.editor.ui.component.editor.impl.material.MaterialFileEditor; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.function.BooleanFloatConsumer; -import com.ss.rlib.geom.util.AngleUtils; -import com.ss.rlib.util.dictionary.ObjectDictionary; +import com.ss.rlib.common.function.BooleanFloatConsumer; +import com.ss.rlib.common.geom.util.AngleUtils; +import com.ss.rlib.common.util.dictionary.ObjectDictionary; import javafx.scene.input.KeyCode; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/plugin/api/editor/material/BaseMaterialFileEditor.java b/src/main/java/com/ss/editor/plugin/api/editor/material/BaseMaterialFileEditor.java index 631ae566..00ee97cd 100644 --- a/src/main/java/com/ss/editor/plugin/api/editor/material/BaseMaterialFileEditor.java +++ b/src/main/java/com/ss/editor/plugin/api/editor/material/BaseMaterialFileEditor.java @@ -2,8 +2,8 @@ import static com.jme3.renderer.queue.RenderQueue.Bucket.Inherit; import static com.jme3.renderer.queue.RenderQueue.Bucket.values; -import static com.ss.rlib.util.ClassUtils.unsafeCast; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ClassUtils.unsafeCast; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import static javafx.collections.FXCollections.observableArrayList; import com.jme3.material.Material; import com.jme3.renderer.queue.RenderQueue; @@ -22,8 +22,8 @@ import com.ss.editor.ui.control.tree.node.TreeNode; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.util.DynamicIconSupport; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.array.Array; import javafx.collections.ObservableList; import javafx.scene.control.*; import javafx.scene.image.ImageView; diff --git a/src/main/java/com/ss/editor/plugin/api/editor/part3d/Advanced3DEditorPart.java b/src/main/java/com/ss/editor/plugin/api/editor/part3d/Advanced3DEditorPart.java index 5c9cee98..1a7f7b71 100644 --- a/src/main/java/com/ss/editor/plugin/api/editor/part3d/Advanced3DEditorPart.java +++ b/src/main/java/com/ss/editor/plugin/api/editor/part3d/Advanced3DEditorPart.java @@ -1,6 +1,6 @@ package com.ss.editor.plugin.api.editor.part3d; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.math.Vector3f; import com.jme3.scene.Node; import com.ss.editor.annotation.FromAnyThread; diff --git a/src/main/java/com/ss/editor/plugin/api/file/creator/GenericFileCreator.java b/src/main/java/com/ss/editor/plugin/api/file/creator/GenericFileCreator.java index 0f4b03f4..9584ffa9 100644 --- a/src/main/java/com/ss/editor/plugin/api/file/creator/GenericFileCreator.java +++ b/src/main/java/com/ss/editor/plugin/api/file/creator/GenericFileCreator.java @@ -1,16 +1,16 @@ package com.ss.editor.plugin.api.file.creator; import static com.ss.editor.plugin.api.property.control.PropertyEditorControlFactory.build; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.BackgroundThread; import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.plugin.api.property.control.PropertyEditorControl; import com.ss.editor.ui.component.creator.impl.AbstractFileCreator; -import com.ss.rlib.util.VarTable; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.control.Button; import javafx.scene.layout.GridPane; import javafx.stage.Window; diff --git a/src/main/java/com/ss/editor/plugin/api/messages/MessagesPluginFactory.java b/src/main/java/com/ss/editor/plugin/api/messages/MessagesPluginFactory.java index 540fca86..1e23eac3 100644 --- a/src/main/java/com/ss/editor/plugin/api/messages/MessagesPluginFactory.java +++ b/src/main/java/com/ss/editor/plugin/api/messages/MessagesPluginFactory.java @@ -5,7 +5,7 @@ import com.ss.editor.Messages; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.plugin.EditorPlugin; -import com.ss.rlib.util.PropertyLoader; +import com.ss.rlib.common.util.PropertyLoader; import org.jetbrains.annotations.NotNull; import java.util.Enumeration; diff --git a/src/main/java/com/ss/editor/plugin/api/property/PropertyDefinition.java b/src/main/java/com/ss/editor/plugin/api/property/PropertyDefinition.java index 726d2744..e6c698ee 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/PropertyDefinition.java +++ b/src/main/java/com/ss/editor/plugin/api/property/PropertyDefinition.java @@ -2,8 +2,8 @@ import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.extension.property.EditablePropertyType; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/AssetResourcePropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/AssetResourcePropertyEditorControl.java index 99de0b9b..dd6b3eb8 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/AssetResourcePropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/AssetResourcePropertyEditorControl.java @@ -4,9 +4,9 @@ import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.ui.util.UiUtils; -import com.ss.rlib.util.VarTable; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; import java.nio.file.Path; diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/AwtFontPropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/AwtFontPropertyEditorControl.java index 524ece0a..60daba28 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/AwtFontPropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/AwtFontPropertyEditorControl.java @@ -1,12 +1,12 @@ package com.ss.editor.plugin.api.property.control; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FxThread; import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.VarTable; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.VarTable; import impl.org.controlsfx.autocompletion.AutoCompletionTextFieldBinding; import impl.org.controlsfx.autocompletion.SuggestionProvider; import javafx.scene.control.ComboBox; diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/BooleanPropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/BooleanPropertyEditorControl.java index dd5863e4..bddc2eac 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/BooleanPropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/BooleanPropertyEditorControl.java @@ -1,11 +1,11 @@ package com.ss.editor.plugin.api.property.control; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FxThread; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.plugin.api.property.PropertyDefinition; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.VarTable; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.VarTable; import javafx.scene.control.CheckBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/ClasspathResourcePropertyControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/ClasspathResourcePropertyControl.java index 13c73b21..1682c714 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/ClasspathResourcePropertyControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/ClasspathResourcePropertyControl.java @@ -1,15 +1,15 @@ package com.ss.editor.plugin.api.property.control; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.Messages; import com.ss.editor.annotation.FxThread; import com.ss.editor.manager.ResourceManager; import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.ui.util.UiUtils; -import com.ss.rlib.util.FileUtils; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.VarTable; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.util.FileUtils; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.common.util.array.Array; import javafx.scene.control.Label; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/ColorPropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/ColorPropertyEditorControl.java index 0b2c7292..7fa4be00 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/ColorPropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/ColorPropertyEditorControl.java @@ -1,13 +1,13 @@ package com.ss.editor.plugin.api.property.control; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.math.ColorRGBA; import com.ss.editor.annotation.FxThread; import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.util.UiUtils; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.VarTable; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.VarTable; import javafx.scene.control.ColorPicker; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/EnumPropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/EnumPropertyEditorControl.java index b1ac7662..1380f634 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/EnumPropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/EnumPropertyEditorControl.java @@ -1,12 +1,12 @@ package com.ss.editor.plugin.api.property.control; -import static com.ss.rlib.util.ClassUtils.unsafeCast; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ClassUtils.unsafeCast; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FxThread; import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.VarTable; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.VarTable; import javafx.scene.control.ComboBox; import javafx.scene.control.SingleSelectionModel; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/ExternalFileResourcePropertyControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/ExternalFileResourcePropertyControl.java index 955744e4..6cc0bfa7 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/ExternalFileResourcePropertyControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/ExternalFileResourcePropertyControl.java @@ -4,7 +4,7 @@ import com.ss.editor.annotation.FxThread; import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.ui.dialog.file.chooser.ExternalFileEditorDialog; -import com.ss.rlib.util.VarTable; +import com.ss.rlib.common.util.VarTable; import javafx.scene.control.Label; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/FileAssetResourcePropertyControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/FileAssetResourcePropertyControl.java index c12adcad..8252c777 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/FileAssetResourcePropertyControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/FileAssetResourcePropertyControl.java @@ -2,14 +2,14 @@ import static com.ss.editor.util.EditorUtil.getAssetFile; import static com.ss.editor.util.EditorUtil.toAssetPath; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.ui.component.asset.tree.context.menu.action.NewFileAction; -import com.ss.rlib.util.VarTable; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.control.Label; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/FloatPropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/FloatPropertyEditorControl.java index 38976ec8..1803a972 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/FloatPropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/FloatPropertyEditorControl.java @@ -1,12 +1,12 @@ package com.ss.editor.plugin.api.property.control; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FxThread; import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.control.input.FloatTextField; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.VarTable; +import com.ss.rlib.fx.control.input.FloatTextField; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.VarTable; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/FolderAssetResourcePropertyControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/FolderAssetResourcePropertyControl.java index c393f3d4..25b4c36a 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/FolderAssetResourcePropertyControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/FolderAssetResourcePropertyControl.java @@ -2,14 +2,14 @@ import static com.ss.editor.util.EditorUtil.getAssetFile; import static com.ss.editor.util.EditorUtil.toAssetPath; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.ui.component.asset.tree.context.menu.action.NewFileAction; import com.ss.editor.ui.util.UiUtils; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.VarTable; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.VarTable; import javafx.scene.control.Label; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/GeometryAssetResourcePropertyControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/GeometryAssetResourcePropertyControl.java index 471e1a65..c0d3051a 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/GeometryAssetResourcePropertyControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/GeometryAssetResourcePropertyControl.java @@ -7,7 +7,7 @@ import com.ss.editor.annotation.FxThread; import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.util.NodeUtils; -import com.ss.rlib.util.VarTable; +import com.ss.rlib.common.util.VarTable; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/IntegerPropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/IntegerPropertyEditorControl.java index 87ae30ce..73cd9730 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/IntegerPropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/IntegerPropertyEditorControl.java @@ -1,12 +1,12 @@ package com.ss.editor.plugin.api.property.control; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FxThread; import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.control.input.IntegerTextField; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.VarTable; +import com.ss.rlib.fx.control.input.IntegerTextField; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.VarTable; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/ObjectFromListPropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/ObjectFromListPropertyEditorControl.java index e69877ff..fbb6e21c 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/ObjectFromListPropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/ObjectFromListPropertyEditorControl.java @@ -1,12 +1,12 @@ package com.ss.editor.plugin.api.property.control; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FxThread; import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.VarTable; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.common.util.array.Array; import javafx.scene.control.ComboBox; import javafx.scene.control.SingleSelectionModel; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/PropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/PropertyEditorControl.java index 19019585..c631da19 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/PropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/PropertyEditorControl.java @@ -7,9 +7,9 @@ import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.dialog.AbstractSimpleEditorDialog; import com.ss.editor.ui.util.UiUtils; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.VarTable; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.common.util.array.Array; import javafx.geometry.Pos; import javafx.scene.control.Label; import javafx.scene.layout.HBox; diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/PropertyEditorControlFactory.java b/src/main/java/com/ss/editor/plugin/api/property/control/PropertyEditorControlFactory.java index 5217b215..ed442a5f 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/PropertyEditorControlFactory.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/PropertyEditorControlFactory.java @@ -2,7 +2,7 @@ import com.ss.editor.annotation.FxThread; import com.ss.editor.plugin.api.property.PropertyDefinition; -import com.ss.rlib.util.VarTable; +import com.ss.rlib.common.util.VarTable; import org.jetbrains.annotations.NotNull; /** diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/ResourcePropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/ResourcePropertyEditorControl.java index 79d113d1..be8ab91e 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/ResourcePropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/ResourcePropertyEditorControl.java @@ -1,15 +1,15 @@ package com.ss.editor.plugin.api.property.control; -import static com.ss.rlib.util.ClassUtils.unsafeCast; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ClassUtils.unsafeCast; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.Messages; import com.ss.editor.annotation.FxThread; import com.ss.editor.ui.Icons; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.ui.util.DynamicIconSupport; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.VarTable; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.VarTable; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.image.ImageView; diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/SpatialAssetResourcePropertyControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/SpatialAssetResourcePropertyControl.java index 5eb52ff3..ac2a6aed 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/SpatialAssetResourcePropertyControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/SpatialAssetResourcePropertyControl.java @@ -3,8 +3,8 @@ import static com.ss.editor.util.EditorUtil.getAssetFile; import static com.ss.editor.util.EditorUtil.toAssetPath; import static com.ss.editor.util.NodeUtils.findParent; -import static com.ss.rlib.util.ClassUtils.unsafeCast; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ClassUtils.unsafeCast; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.asset.AssetKey; import com.jme3.asset.AssetManager; import com.jme3.asset.ModelKey; @@ -14,10 +14,10 @@ import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.util.FileUtils; -import com.ss.rlib.util.VarTable; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.FileUtils; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.control.Label; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/StringFromListPropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/StringFromListPropertyEditorControl.java index 7b3077c9..fcc2328e 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/StringFromListPropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/StringFromListPropertyEditorControl.java @@ -1,12 +1,12 @@ package com.ss.editor.plugin.api.property.control; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FxThread; import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.VarTable; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.common.util.array.Array; import javafx.scene.control.ComboBox; import javafx.scene.control.SingleSelectionModel; import javafx.scene.control.TextField; diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/StringPropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/StringPropertyEditorControl.java index d5a58dc6..9a0baada 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/StringPropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/StringPropertyEditorControl.java @@ -1,11 +1,11 @@ package com.ss.editor.plugin.api.property.control; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FxThread; import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.VarTable; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.VarTable; import javafx.scene.control.TextField; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/Vector3fPropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/Vector3fPropertyEditorControl.java index 0985723c..52217f0b 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/Vector3fPropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/Vector3fPropertyEditorControl.java @@ -5,9 +5,9 @@ import com.ss.editor.ui.css.CssClasses; import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.ui.util.UiUtils; -import com.ss.rlib.ui.control.input.FloatTextField; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.VarTable; +import com.ss.rlib.fx.control.input.FloatTextField; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.VarTable; import javafx.scene.layout.GridPane; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/plugin/api/settings/SettingsPropertyDefinition.java b/src/main/java/com/ss/editor/plugin/api/settings/SettingsPropertyDefinition.java index 2e0d141b..d8322888 100644 --- a/src/main/java/com/ss/editor/plugin/api/settings/SettingsPropertyDefinition.java +++ b/src/main/java/com/ss/editor/plugin/api/settings/SettingsPropertyDefinition.java @@ -3,7 +3,7 @@ import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.extension.property.EditablePropertyType; import com.ss.editor.plugin.api.property.PropertyDefinition; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.util.array.Array; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/plugin/api/settings/SettingsProvider.java b/src/main/java/com/ss/editor/plugin/api/settings/SettingsProvider.java index ad2631c1..1a077248 100644 --- a/src/main/java/com/ss/editor/plugin/api/settings/SettingsProvider.java +++ b/src/main/java/com/ss/editor/plugin/api/settings/SettingsProvider.java @@ -1,7 +1,7 @@ package com.ss.editor.plugin.api.settings; import com.ss.editor.annotation.FxThread; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.util.array.Array; import org.jetbrains.annotations.NotNull; /** diff --git a/src/main/java/com/ss/editor/plugin/api/settings/SettingsProviderRegistry.java b/src/main/java/com/ss/editor/plugin/api/settings/SettingsProviderRegistry.java index c0903154..56b8373c 100644 --- a/src/main/java/com/ss/editor/plugin/api/settings/SettingsProviderRegistry.java +++ b/src/main/java/com/ss/editor/plugin/api/settings/SettingsProviderRegistry.java @@ -3,8 +3,8 @@ import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; import com.ss.editor.config.DefaultSettingsProvider; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; /** diff --git a/src/main/java/com/ss/editor/remote/control/client/ClientCommand.java b/src/main/java/com/ss/editor/remote/control/client/ClientCommand.java index 252b0892..079329f6 100644 --- a/src/main/java/com/ss/editor/remote/control/client/ClientCommand.java +++ b/src/main/java/com/ss/editor/remote/control/client/ClientCommand.java @@ -1,8 +1,8 @@ package com.ss.editor.remote.control.client; import com.ss.editor.annotation.BackgroundThread; -import com.ss.rlib.network.ConnectionOwner; -import com.ss.rlib.network.packet.impl.AbstractReadablePacket; +import com.ss.rlib.common.network.ConnectionOwner; +import com.ss.rlib.common.network.packet.impl.AbstractReadablePacket; import org.jetbrains.annotations.NotNull; import java.nio.ByteBuffer; diff --git a/src/main/java/com/ss/editor/remote/control/client/InitLocalClasspathClientCommand.java b/src/main/java/com/ss/editor/remote/control/client/InitLocalClasspathClientCommand.java index 2cd427ef..2fd8561c 100644 --- a/src/main/java/com/ss/editor/remote/control/client/InitLocalClasspathClientCommand.java +++ b/src/main/java/com/ss/editor/remote/control/client/InitLocalClasspathClientCommand.java @@ -2,11 +2,11 @@ import com.ss.editor.annotation.BackgroundThread; import com.ss.editor.manager.ClasspathManager; -import com.ss.rlib.network.ConnectionOwner; -import com.ss.rlib.network.annotation.PacketDescription; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.network.ConnectionOwner; +import com.ss.rlib.common.network.annotation.PacketDescription; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; import java.nio.ByteBuffer; diff --git a/src/main/java/com/ss/editor/remote/control/client/LoadLocalClassesClientCommand.java b/src/main/java/com/ss/editor/remote/control/client/LoadLocalClassesClientCommand.java index c49f4074..f81ea177 100644 --- a/src/main/java/com/ss/editor/remote/control/client/LoadLocalClassesClientCommand.java +++ b/src/main/java/com/ss/editor/remote/control/client/LoadLocalClassesClientCommand.java @@ -4,9 +4,9 @@ import com.ss.editor.manager.ClasspathManager; import com.ss.editor.manager.ExecutorManager; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.network.ConnectionOwner; -import com.ss.rlib.network.annotation.PacketDescription; -import com.ss.rlib.util.StringUtils; +import com.ss.rlib.common.network.ConnectionOwner; +import com.ss.rlib.common.network.annotation.PacketDescription; +import com.ss.rlib.common.util.StringUtils; import org.jetbrains.annotations.NotNull; import java.nio.ByteBuffer; diff --git a/src/main/java/com/ss/editor/remote/control/client/LoadLocalLibrariesClientCommand.java b/src/main/java/com/ss/editor/remote/control/client/LoadLocalLibrariesClientCommand.java index 2fe66d42..a265dc40 100644 --- a/src/main/java/com/ss/editor/remote/control/client/LoadLocalLibrariesClientCommand.java +++ b/src/main/java/com/ss/editor/remote/control/client/LoadLocalLibrariesClientCommand.java @@ -2,10 +2,10 @@ import com.ss.editor.annotation.BackgroundThread; import com.ss.editor.manager.ClasspathManager; -import com.ss.rlib.network.ConnectionOwner; -import com.ss.rlib.network.annotation.PacketDescription; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.network.ConnectionOwner; +import com.ss.rlib.common.network.annotation.PacketDescription; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; import java.nio.ByteBuffer; diff --git a/src/main/java/com/ss/editor/remote/control/client/OpenFileClientCommand.java b/src/main/java/com/ss/editor/remote/control/client/OpenFileClientCommand.java index 1fa91e98..ee27df43 100644 --- a/src/main/java/com/ss/editor/remote/control/client/OpenFileClientCommand.java +++ b/src/main/java/com/ss/editor/remote/control/client/OpenFileClientCommand.java @@ -8,8 +8,8 @@ import com.ss.editor.ui.event.impl.AssetComponentLoadedEvent; import com.ss.editor.ui.event.impl.RequestedOpenFileEvent; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.network.ConnectionOwner; -import com.ss.rlib.network.annotation.PacketDescription; +import com.ss.rlib.common.network.ConnectionOwner; +import com.ss.rlib.common.network.annotation.PacketDescription; import javafx.event.Event; import javafx.event.EventHandler; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/ss/editor/task/CheckNewVersionTask.java b/src/main/java/com/ss/editor/task/CheckNewVersionTask.java index d6fdefa2..245dae00 100644 --- a/src/main/java/com/ss/editor/task/CheckNewVersionTask.java +++ b/src/main/java/com/ss/editor/task/CheckNewVersionTask.java @@ -4,9 +4,9 @@ import com.ss.editor.JfxApplication; import com.ss.editor.Messages; import com.ss.editor.config.Config; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerManager; -import com.ss.rlib.plugin.Version; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; +import com.ss.rlib.common.plugin.Version; import javafx.application.HostServices; import javafx.application.Platform; import javafx.scene.control.Alert; diff --git a/src/main/java/com/ss/editor/ui/builder/EditorFxSceneBuilder.java b/src/main/java/com/ss/editor/ui/builder/EditorFxSceneBuilder.java index 2258be64..4a11b80f 100644 --- a/src/main/java/com/ss/editor/ui/builder/EditorFxSceneBuilder.java +++ b/src/main/java/com/ss/editor/ui/builder/EditorFxSceneBuilder.java @@ -20,7 +20,7 @@ import com.ss.editor.ui.css.CssRegistry; import com.ss.editor.ui.event.EventRedirector; import com.ss.editor.ui.scene.EditorFxScene; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.collections.ObservableList; import javafx.scene.Group; import javafx.scene.image.ImageView; diff --git a/src/main/java/com/ss/editor/ui/component/asset/AssetBarComponent.java b/src/main/java/com/ss/editor/ui/component/asset/AssetBarComponent.java index 6888ec92..44e43f04 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/AssetBarComponent.java +++ b/src/main/java/com/ss/editor/ui/component/asset/AssetBarComponent.java @@ -3,7 +3,7 @@ import com.ss.editor.ui.Icons; import com.ss.editor.ui.event.FxEventManager; import com.ss.editor.ui.event.impl.RequestedRefreshAssetEvent; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.scene.control.Button; import javafx.scene.image.ImageView; import javafx.scene.layout.HBox; diff --git a/src/main/java/com/ss/editor/ui/component/asset/AssetComponent.java b/src/main/java/com/ss/editor/ui/component/asset/AssetComponent.java index bf590d5e..7d8fe2fb 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/AssetComponent.java +++ b/src/main/java/com/ss/editor/ui/component/asset/AssetComponent.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.component.asset; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.config.EditorConfig; @@ -17,9 +17,9 @@ import com.ss.editor.ui.event.FxEventManager; import com.ss.editor.ui.event.impl.*; import com.ss.editor.ui.util.UiUtils; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.control.TreeItem; import javafx.scene.layout.VBox; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/AssetTreeContextMenuFillerRegistry.java b/src/main/java/com/ss/editor/ui/component/asset/tree/AssetTreeContextMenuFillerRegistry.java index c845a7d6..9abb9172 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/AssetTreeContextMenuFillerRegistry.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/AssetTreeContextMenuFillerRegistry.java @@ -5,8 +5,8 @@ import com.ss.editor.ui.component.asset.tree.context.menu.filler.AssetTreeSingleContextMenuFiller; import com.ss.editor.ui.component.asset.tree.context.menu.filler.impl.FileAssetTreeSingleContextMenuFiller; import com.ss.editor.ui.component.asset.tree.context.menu.filler.impl.ResourceAssetTreeSingleContextMenuFiller; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; /** diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java b/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java index a06f1a7f..6a0ea272 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java @@ -3,7 +3,7 @@ import static com.ss.editor.ui.component.asset.tree.resource.ResourceElementFactory.createFor; import static com.ss.editor.ui.util.UiUtils.findItemForValue; import static com.ss.editor.ui.util.UiUtils.hasFileInClipboard; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.BackgroundThread; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; @@ -13,14 +13,14 @@ import com.ss.editor.ui.component.asset.tree.context.menu.action.*; import com.ss.editor.ui.component.asset.tree.resource.*; import com.ss.editor.ui.util.UiUtils; -import com.ss.rlib.concurrent.barrier.Barrier; -import com.ss.rlib.concurrent.barrier.BarrierFactory; -import com.ss.rlib.function.IntObjectConsumer; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayComparator; -import com.ss.rlib.util.array.ArrayFactory; -import com.ss.rlib.util.array.ConcurrentArray; +import com.ss.rlib.common.concurrent.barrier.Barrier; +import com.ss.rlib.common.concurrent.barrier.BarrierFactory; +import com.ss.rlib.common.function.IntObjectConsumer; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayComparator; +import com.ss.rlib.common.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.ConcurrentArray; import javafx.collections.FXCollections; import javafx.scene.control.ContextMenu; import javafx.scene.control.SelectionMode; diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTreeCell.java b/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTreeCell.java index 4fdd5b26..f7d2bea6 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTreeCell.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTreeCell.java @@ -8,7 +8,7 @@ import com.ss.editor.ui.component.asset.tree.resource.FolderResourceElement; import com.ss.editor.ui.component.asset.tree.resource.LoadingResourceElement; import com.ss.editor.ui.component.asset.tree.resource.ResourceElement; -import com.ss.rlib.util.StringUtils; +import com.ss.rlib.common.util.StringUtils; import javafx.geometry.Side; import javafx.scene.Cursor; import javafx.scene.control.ProgressIndicator; diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/ConvertFileAction.java b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/ConvertFileAction.java index 72acd820..4bdc6a35 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/ConvertFileAction.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/ConvertFileAction.java @@ -9,7 +9,7 @@ import javafx.scene.control.MenuItem; import javafx.scene.image.ImageView; import org.jetbrains.annotations.NotNull; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.util.array.Array; /** * The action to transformation a file. diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/CopyFileAction.java b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/CopyFileAction.java index 338f7294..33bf2425 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/CopyFileAction.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/CopyFileAction.java @@ -1,12 +1,12 @@ package com.ss.editor.ui.component.asset.tree.context.menu.action; -import static com.ss.rlib.util.array.ArrayCollectors.toArray; +import static com.ss.rlib.common.util.array.ArrayCollectors.toArray; import com.ss.editor.Messages; import com.ss.editor.annotation.FxThread; import com.ss.editor.ui.Icons; import com.ss.editor.ui.component.asset.tree.resource.ResourceElement; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.util.array.Array; import javafx.event.ActionEvent; import javafx.scene.image.Image; import javafx.scene.input.Clipboard; diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/CutFileAction.java b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/CutFileAction.java index 08c0fd4a..b551b4e7 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/CutFileAction.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/CutFileAction.java @@ -6,7 +6,7 @@ import com.ss.editor.ui.Icons; import com.ss.editor.ui.component.asset.tree.resource.ResourceElement; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.util.array.Array; import javafx.event.ActionEvent; import javafx.scene.image.Image; import javafx.scene.input.Clipboard; diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/DeleteFileAction.java b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/DeleteFileAction.java index 7000ffc6..29306937 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/DeleteFileAction.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/DeleteFileAction.java @@ -8,8 +8,8 @@ import com.ss.editor.ui.Icons; import com.ss.editor.ui.component.asset.tree.resource.ResourceElement; import com.ss.editor.ui.dialog.ConfirmDialog; -import com.ss.rlib.util.FileUtils; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.util.FileUtils; +import com.ss.rlib.common.util.array.Array; import javafx.event.ActionEvent; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/FileAction.java b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/FileAction.java index 0e5a731c..4bae4a02 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/FileAction.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/FileAction.java @@ -1,12 +1,12 @@ package com.ss.editor.ui.component.asset.tree.context.menu.action; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FxThread; import com.ss.editor.ui.component.asset.tree.resource.ResourceElement; import com.ss.editor.ui.event.FxEventManager; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerManager; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; +import com.ss.rlib.common.util.array.Array; import javafx.event.ActionEvent; import javafx.scene.control.MenuItem; import javafx.scene.image.Image; diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/NewFileAction.java b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/NewFileAction.java index 685853a5..ceaae590 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/NewFileAction.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/NewFileAction.java @@ -11,7 +11,7 @@ import javafx.scene.control.MenuItem; import javafx.scene.image.ImageView; import org.jetbrains.annotations.NotNull; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.util.array.Array; /** * The action to create a new file. diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/OpenWithFileAction.java b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/OpenWithFileAction.java index 9aa7106f..9fd402fc 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/OpenWithFileAction.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/OpenWithFileAction.java @@ -10,7 +10,7 @@ import javafx.collections.ObservableList; import javafx.scene.control.Menu; import javafx.scene.control.MenuItem; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.util.array.Array; /** * The action to choose an editor to open a file. diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/PasteFileAction.java b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/PasteFileAction.java index 71dac007..1638f246 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/PasteFileAction.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/PasteFileAction.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.component.asset.tree.context.menu.action; -import static com.ss.rlib.util.ClassUtils.unsafeCast; +import static com.ss.rlib.common.util.ClassUtils.unsafeCast; import com.ss.editor.Messages; import com.ss.editor.annotation.FxThread; import com.ss.editor.ui.Icons; @@ -8,9 +8,9 @@ import com.ss.editor.ui.event.impl.MovedFileEvent; import com.ss.editor.ui.event.impl.RequestSelectFileEvent; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.util.FileUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.FileUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.event.ActionEvent; import javafx.scene.image.Image; import javafx.scene.input.Clipboard; diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/RenameFileAction.java b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/RenameFileAction.java index 562727f3..8805b2ca 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/RenameFileAction.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/action/RenameFileAction.java @@ -7,8 +7,8 @@ import com.ss.editor.ui.dialog.RenameDialog; import com.ss.editor.ui.event.impl.RenamedFileEvent; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.util.FileUtils; -import com.ss.rlib.util.StringUtils; +import com.ss.rlib.common.util.FileUtils; +import com.ss.rlib.common.util.StringUtils; import javafx.event.ActionEvent; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/filler/AssetTreeMultiContextMenuFiller.java b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/filler/AssetTreeMultiContextMenuFiller.java index 72bf20e7..ed07549b 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/filler/AssetTreeMultiContextMenuFiller.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/filler/AssetTreeMultiContextMenuFiller.java @@ -2,7 +2,7 @@ import com.ss.editor.annotation.FxThread; import com.ss.editor.ui.component.asset.tree.resource.ResourceElement; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.util.array.Array; import javafx.scene.control.MenuItem; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/filler/impl/FileAssetTreeSingleContextMenuFiller.java b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/filler/impl/FileAssetTreeSingleContextMenuFiller.java index 22c38832..34046b41 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/filler/impl/FileAssetTreeSingleContextMenuFiller.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/filler/impl/FileAssetTreeSingleContextMenuFiller.java @@ -8,7 +8,7 @@ import com.ss.editor.ui.component.asset.tree.context.menu.filler.AssetTreeSingleContextMenuFiller; import com.ss.editor.ui.component.asset.tree.resource.FileResourceElement; import com.ss.editor.ui.component.asset.tree.resource.ResourceElement; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.util.array.Array; import javafx.scene.control.MenuItem; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/filler/impl/ResourceAssetTreeSingleContextMenuFiller.java b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/filler/impl/ResourceAssetTreeSingleContextMenuFiller.java index 0d426cd2..685436c6 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/filler/impl/ResourceAssetTreeSingleContextMenuFiller.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/context/menu/filler/impl/ResourceAssetTreeSingleContextMenuFiller.java @@ -9,7 +9,7 @@ import com.ss.editor.ui.component.asset.tree.resource.FileResourceElement; import com.ss.editor.ui.component.asset.tree.resource.FolderResourceElement; import com.ss.editor.ui.component.asset.tree.resource.ResourceElement; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.util.array.Array; import javafx.scene.control.MenuItem; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/resource/FolderResourceElement.java b/src/main/java/com/ss/editor/ui/component/asset/tree/resource/FolderResourceElement.java index 44371a45..507bf414 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/resource/FolderResourceElement.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/resource/FolderResourceElement.java @@ -2,9 +2,9 @@ import static com.ss.editor.ui.component.asset.tree.resource.ResourceElementFactory.createFor; import com.ss.editor.annotation.FromAnyThread; -import com.ss.rlib.util.FileUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.FileUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/resource/FoldersResourceElement.java b/src/main/java/com/ss/editor/ui/component/asset/tree/resource/FoldersResourceElement.java index 35d954e2..6fda9d18 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/resource/FoldersResourceElement.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/resource/FoldersResourceElement.java @@ -1,10 +1,10 @@ package com.ss.editor.ui.component.asset.tree.resource; import com.ss.editor.annotation.FromAnyThread; -import com.ss.rlib.util.FileUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayCollectors; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.FileUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayCollectors; +import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -17,7 +17,7 @@ import java.util.stream.Collectors; import static com.ss.editor.ui.component.asset.tree.resource.ResourceElementFactory.createFor; -import static com.ss.rlib.util.array.ArrayCollectors.toArray; +import static com.ss.rlib.common.util.array.ArrayCollectors.toArray; /** * The presentation of list of folders. diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/resource/ResourceElement.java b/src/main/java/com/ss/editor/ui/component/asset/tree/resource/ResourceElement.java index c29ad0ec..aa9c865e 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/resource/ResourceElement.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/resource/ResourceElement.java @@ -2,9 +2,9 @@ import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerManager; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; +import com.ss.rlib.common.util.array.Array; import javafx.scene.control.Tooltip; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/component/creator/FileCreatorDescription.java b/src/main/java/com/ss/editor/ui/component/creator/FileCreatorDescription.java index cfd75b54..47dc1000 100644 --- a/src/main/java/com/ss/editor/ui/component/creator/FileCreatorDescription.java +++ b/src/main/java/com/ss/editor/ui/component/creator/FileCreatorDescription.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.component.creator; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/component/creator/FileCreatorRegistry.java b/src/main/java/com/ss/editor/ui/component/creator/FileCreatorRegistry.java index 4afa74f1..4c8f3a9d 100644 --- a/src/main/java/com/ss/editor/ui/component/creator/FileCreatorRegistry.java +++ b/src/main/java/com/ss/editor/ui/component/creator/FileCreatorRegistry.java @@ -5,10 +5,10 @@ import com.ss.editor.ui.component.creator.impl.material.MaterialFileCreator; import com.ss.editor.ui.component.creator.impl.material.definition.MaterialDefinitionFileCreator; import com.ss.editor.ui.component.creator.impl.texture.SingleColorTextureFileCreator; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerManager; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/component/creator/impl/AbstractFileCreator.java b/src/main/java/com/ss/editor/ui/component/creator/impl/AbstractFileCreator.java index 7d022012..97e3dc42 100644 --- a/src/main/java/com/ss/editor/ui/component/creator/impl/AbstractFileCreator.java +++ b/src/main/java/com/ss/editor/ui/component/creator/impl/AbstractFileCreator.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.component.creator.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import static java.nio.file.StandardCopyOption.ATOMIC_MOVE; import static java.nio.file.StandardCopyOption.REPLACE_EXISTING; import com.ss.editor.Messages; @@ -18,11 +18,11 @@ import com.ss.editor.ui.event.impl.RequestSelectFileEvent; import com.ss.editor.ui.util.UiUtils; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerManager; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.Utils; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.Utils; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.*; diff --git a/src/main/java/com/ss/editor/ui/component/creator/impl/EmptyFileCreator.java b/src/main/java/com/ss/editor/ui/component/creator/impl/EmptyFileCreator.java index a6994462..fa1f24aa 100644 --- a/src/main/java/com/ss/editor/ui/component/creator/impl/EmptyFileCreator.java +++ b/src/main/java/com/ss/editor/ui/component/creator/impl/EmptyFileCreator.java @@ -3,7 +3,7 @@ import com.ss.editor.Messages; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.ui.component.creator.FileCreatorDescription; -import com.ss.rlib.util.StringUtils; +import com.ss.rlib.common.util.StringUtils; import org.jetbrains.annotations.NotNull; /** diff --git a/src/main/java/com/ss/editor/ui/component/creator/impl/FolderCreator.java b/src/main/java/com/ss/editor/ui/component/creator/impl/FolderCreator.java index 72b4ac92..8d4d52ae 100644 --- a/src/main/java/com/ss/editor/ui/component/creator/impl/FolderCreator.java +++ b/src/main/java/com/ss/editor/ui/component/creator/impl/FolderCreator.java @@ -1,13 +1,13 @@ package com.ss.editor.ui.component.creator.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.Messages; import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.ui.component.creator.FileCreatorDescription; import com.ss.editor.util.EditorUtil; import org.jetbrains.annotations.NotNull; -import com.ss.rlib.util.StringUtils; +import com.ss.rlib.common.util.StringUtils; import java.io.IOException; import java.nio.file.Files; diff --git a/src/main/java/com/ss/editor/ui/component/creator/impl/material/MaterialFileCreator.java b/src/main/java/com/ss/editor/ui/component/creator/impl/material/MaterialFileCreator.java index 335114a0..99d5bb5d 100644 --- a/src/main/java/com/ss/editor/ui/component/creator/impl/material/MaterialFileCreator.java +++ b/src/main/java/com/ss/editor/ui/component/creator/impl/material/MaterialFileCreator.java @@ -1,7 +1,7 @@ package com.ss.editor.ui.component.creator.impl.material; import static com.ss.editor.FileExtensions.JME_MATERIAL; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import static java.nio.file.StandardOpenOption.*; import com.jme3.asset.AssetManager; import com.jme3.material.Material; @@ -17,10 +17,10 @@ import com.ss.editor.util.EditorUtil; import com.ss.editor.util.MaterialSerializer; import com.ss.editor.ui.component.creator.FileCreatorDescription; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.VarTable; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/component/creator/impl/material/definition/MaterialDefinitionFileCreator.java b/src/main/java/com/ss/editor/ui/component/creator/impl/material/definition/MaterialDefinitionFileCreator.java index 29aa7573..68a3555f 100644 --- a/src/main/java/com/ss/editor/ui/component/creator/impl/material/definition/MaterialDefinitionFileCreator.java +++ b/src/main/java/com/ss/editor/ui/component/creator/impl/material/definition/MaterialDefinitionFileCreator.java @@ -1,7 +1,7 @@ package com.ss.editor.ui.component.creator.impl.material.definition; import static com.ss.editor.FileExtensions.JME_MATERIAL_DEFINITION; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import static java.lang.Character.toUpperCase; import static java.nio.file.StandardOpenOption.CREATE; import static java.nio.file.StandardOpenOption.TRUNCATE_EXISTING; @@ -20,11 +20,11 @@ import com.ss.editor.ui.component.creator.FileCreator; import com.ss.editor.ui.component.creator.FileCreatorDescription; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.util.FileUtils; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.VarTable; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.FileUtils; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; import java.io.IOException; diff --git a/src/main/java/com/ss/editor/ui/component/creator/impl/texture/SingleColorTextureFileCreator.java b/src/main/java/com/ss/editor/ui/component/creator/impl/texture/SingleColorTextureFileCreator.java index 3fa76034..5f504e95 100644 --- a/src/main/java/com/ss/editor/ui/component/creator/impl/texture/SingleColorTextureFileCreator.java +++ b/src/main/java/com/ss/editor/ui/component/creator/impl/texture/SingleColorTextureFileCreator.java @@ -2,7 +2,7 @@ import static com.ss.editor.extension.property.EditablePropertyType.COLOR; import static com.ss.editor.extension.property.EditablePropertyType.INTEGER; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.math.ColorRGBA; import com.ss.editor.FileExtensions; import com.ss.editor.Messages; @@ -13,9 +13,9 @@ import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.ui.component.creator.FileCreatorDescription; import com.ss.editor.ui.util.UiUtils; -import com.ss.rlib.util.VarTable; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.embed.swing.SwingFXUtils; import javafx.scene.image.ImageView; import javafx.scene.image.PixelWriter; diff --git a/src/main/java/com/ss/editor/ui/component/editor/EditorDescription.java b/src/main/java/com/ss/editor/ui/component/editor/EditorDescription.java index 0822edec..dd5593b7 100644 --- a/src/main/java/com/ss/editor/ui/component/editor/EditorDescription.java +++ b/src/main/java/com/ss/editor/ui/component/editor/EditorDescription.java @@ -1,7 +1,7 @@ package com.ss.editor.ui.component.editor; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/component/editor/EditorRegistry.java b/src/main/java/com/ss/editor/ui/component/editor/EditorRegistry.java index ec97dbbc..17364b74 100644 --- a/src/main/java/com/ss/editor/ui/component/editor/EditorRegistry.java +++ b/src/main/java/com/ss/editor/ui/component/editor/EditorRegistry.java @@ -1,18 +1,18 @@ package com.ss.editor.ui.component.editor; -import static com.ss.rlib.util.ObjectUtils.notNull; -import static com.ss.rlib.util.array.ArrayFactory.newArray; +import static com.ss.rlib.common.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.array.ArrayFactory.newArray; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.ui.component.editor.impl.*; import com.ss.editor.ui.component.editor.impl.material.MaterialFileEditor; import com.ss.editor.ui.component.editor.impl.model.ModelFileEditor; import com.ss.editor.ui.component.editor.impl.scene.SceneFileEditor; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerManager; -import com.ss.rlib.util.FileUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.dictionary.DictionaryFactory; -import com.ss.rlib.util.dictionary.ObjectDictionary; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; +import com.ss.rlib.common.util.FileUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.dictionary.DictionaryFactory; +import com.ss.rlib.common.util.dictionary.ObjectDictionary; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/component/editor/FileEditor.java b/src/main/java/com/ss/editor/ui/component/editor/FileEditor.java index 9572961c..34a45d47 100644 --- a/src/main/java/com/ss/editor/ui/component/editor/FileEditor.java +++ b/src/main/java/com/ss/editor/ui/component/editor/FileEditor.java @@ -3,8 +3,8 @@ import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.part3d.editor.Editor3DPart; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.beans.property.BooleanProperty; import javafx.event.Event; import javafx.scene.Parent; diff --git a/src/main/java/com/ss/editor/ui/component/editor/area/EditorAreaComponent.java b/src/main/java/com/ss/editor/ui/component/editor/area/EditorAreaComponent.java index 1a8b71f9..104eeda4 100644 --- a/src/main/java/com/ss/editor/ui/component/editor/area/EditorAreaComponent.java +++ b/src/main/java/com/ss/editor/ui/component/editor/area/EditorAreaComponent.java @@ -1,7 +1,7 @@ package com.ss.editor.ui.component.editor.area; import static com.ss.editor.manager.FileIconManager.DEFAULT_FILE_ICON_SIZE; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.app.state.AppStateManager; import com.jme3x.jfx.injfx.processor.FrameTransferSceneProcessor; import com.ss.editor.JfxApplication; @@ -33,18 +33,18 @@ import com.ss.editor.ui.scene.EditorFxScene; import com.ss.editor.ui.util.UiUtils; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.concurrent.util.ThreadUtils; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerManager; -import com.ss.rlib.util.ArrayUtils; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; -import com.ss.rlib.util.array.ConcurrentArray; -import com.ss.rlib.util.dictionary.ConcurrentObjectDictionary; -import com.ss.rlib.util.dictionary.DictionaryFactory; -import com.ss.rlib.util.dictionary.DictionaryUtils; -import com.ss.rlib.util.dictionary.ObjectDictionary; +import com.ss.rlib.common.concurrent.util.ThreadUtils; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; +import com.ss.rlib.common.util.ArrayUtils; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.ConcurrentArray; +import com.ss.rlib.common.util.dictionary.ConcurrentObjectDictionary; +import com.ss.rlib.common.util.dictionary.DictionaryFactory; +import com.ss.rlib.common.util.dictionary.DictionaryUtils; +import com.ss.rlib.common.util.dictionary.ObjectDictionary; import javafx.beans.value.ObservableValue; import javafx.collections.ListChangeListener; import javafx.collections.ObservableList; diff --git a/src/main/java/com/ss/editor/ui/component/editor/impl/AbstractFileEditor.java b/src/main/java/com/ss/editor/ui/component/editor/impl/AbstractFileEditor.java index d87920b0..b4cbbfad 100644 --- a/src/main/java/com/ss/editor/ui/component/editor/impl/AbstractFileEditor.java +++ b/src/main/java/com/ss/editor/ui/component/editor/impl/AbstractFileEditor.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.component.editor.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import static java.nio.file.StandardOpenOption.TRUNCATE_EXISTING; import com.jme3.asset.AssetKey; @@ -25,13 +25,13 @@ import com.ss.editor.ui.util.DynamicIconSupport; import com.ss.editor.ui.util.UiUtils; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerManager; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.FileUtils; -import com.ss.rlib.util.Utils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.FileUtils; +import com.ss.rlib.common.util.Utils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.beans.property.BooleanProperty; import javafx.beans.property.SimpleBooleanProperty; import javafx.event.Event; diff --git a/src/main/java/com/ss/editor/ui/component/editor/impl/AudioViewerEditor.java b/src/main/java/com/ss/editor/ui/component/editor/impl/AudioViewerEditor.java index ded53a86..a40961da 100644 --- a/src/main/java/com/ss/editor/ui/component/editor/impl/AudioViewerEditor.java +++ b/src/main/java/com/ss/editor/ui/component/editor/impl/AudioViewerEditor.java @@ -1,7 +1,7 @@ package com.ss.editor.ui.component.editor.impl; import static com.jme3.audio.AudioSource.Status.Playing; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.asset.AssetManager; import com.jme3.audio.AudioData; import com.jme3.audio.AudioKey; @@ -17,7 +17,7 @@ import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.util.DynamicIconSupport; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.TextField; diff --git a/src/main/java/com/ss/editor/ui/component/editor/impl/CodeAreaFileEditor.java b/src/main/java/com/ss/editor/ui/component/editor/impl/CodeAreaFileEditor.java index 206b07ab..a53b0ae3 100644 --- a/src/main/java/com/ss/editor/ui/component/editor/impl/CodeAreaFileEditor.java +++ b/src/main/java/com/ss/editor/ui/component/editor/impl/CodeAreaFileEditor.java @@ -1,12 +1,12 @@ package com.ss.editor.ui.component.editor.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.BackgroundThread; import com.ss.editor.annotation.FxThread; import com.ss.editor.ui.control.code.BaseCodeArea; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.FileUtils; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.FileUtils; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import org.fxmisc.richtext.CodeArea; diff --git a/src/main/java/com/ss/editor/ui/component/editor/impl/ImageViewerEditor.java b/src/main/java/com/ss/editor/ui/component/editor/impl/ImageViewerEditor.java index f54cb340..45e84c1b 100644 --- a/src/main/java/com/ss/editor/ui/component/editor/impl/ImageViewerEditor.java +++ b/src/main/java/com/ss/editor/ui/component/editor/impl/ImageViewerEditor.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.component.editor.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.JmeApplication; import com.ss.editor.FileExtensions; import com.ss.editor.Messages; @@ -10,7 +10,7 @@ import com.ss.editor.ui.component.editor.EditorDescription; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.event.impl.FileChangedEvent; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.VBox; diff --git a/src/main/java/com/ss/editor/ui/component/editor/impl/TextFileEditor.java b/src/main/java/com/ss/editor/ui/component/editor/impl/TextFileEditor.java index 42f3577f..555bf520 100644 --- a/src/main/java/com/ss/editor/ui/component/editor/impl/TextFileEditor.java +++ b/src/main/java/com/ss/editor/ui/component/editor/impl/TextFileEditor.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.component.editor.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.Messages; import com.ss.editor.annotation.BackgroundThread; import com.ss.editor.annotation.FxThread; @@ -8,8 +8,8 @@ import com.ss.editor.ui.component.editor.EditorDescription; import com.ss.editor.ui.component.editor.EditorRegistry; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.FileUtils; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.FileUtils; import javafx.scene.control.TextArea; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; diff --git a/src/main/java/com/ss/editor/ui/component/editor/impl/material/MaterialFileEditor.java b/src/main/java/com/ss/editor/ui/component/editor/impl/material/MaterialFileEditor.java index 73d6f423..293a9230 100644 --- a/src/main/java/com/ss/editor/ui/component/editor/impl/material/MaterialFileEditor.java +++ b/src/main/java/com/ss/editor/ui/component/editor/impl/material/MaterialFileEditor.java @@ -6,7 +6,7 @@ import static com.ss.editor.util.EditorUtil.getAssetFile; import static com.ss.editor.util.EditorUtil.toAssetPath; import static com.ss.editor.util.MaterialUtils.updateMaterialIdNeed; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.asset.AssetKey; import com.jme3.asset.AssetManager; @@ -41,7 +41,7 @@ import com.ss.editor.util.EditorUtil; import com.ss.editor.util.MaterialSerializer; import com.ss.editor.util.MaterialUtils; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.collections.ObservableList; import javafx.scene.control.ComboBox; import javafx.scene.control.Label; diff --git a/src/main/java/com/ss/editor/ui/component/editor/impl/model/ModelFileEditor.java b/src/main/java/com/ss/editor/ui/component/editor/impl/model/ModelFileEditor.java index 884b8a34..b221006d 100644 --- a/src/main/java/com/ss/editor/ui/component/editor/impl/model/ModelFileEditor.java +++ b/src/main/java/com/ss/editor/ui/component/editor/impl/model/ModelFileEditor.java @@ -2,7 +2,7 @@ import static com.ss.editor.util.EditorUtil.getAssetFile; import static com.ss.editor.util.EditorUtil.toAssetPath; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.asset.AssetManager; import com.jme3.asset.ModelKey; import com.jme3.asset.TextureKey; @@ -30,9 +30,9 @@ import com.ss.editor.util.EditorUtil; import com.ss.editor.util.MaterialUtils; import com.ss.editor.util.NodeUtils; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.collections.ObservableList; import javafx.scene.control.*; import javafx.scene.image.ImageView; diff --git a/src/main/java/com/ss/editor/ui/component/editor/impl/scene/AbstractSceneFileEditor.java b/src/main/java/com/ss/editor/ui/component/editor/impl/scene/AbstractSceneFileEditor.java index f68227e4..4e7bd713 100644 --- a/src/main/java/com/ss/editor/ui/component/editor/impl/scene/AbstractSceneFileEditor.java +++ b/src/main/java/com/ss/editor/ui/component/editor/impl/scene/AbstractSceneFileEditor.java @@ -5,8 +5,8 @@ import static com.ss.editor.util.MaterialUtils.saveIfNeedTextures; import static com.ss.editor.util.MaterialUtils.updateMaterialIdNeed; import static com.ss.editor.util.NodeUtils.findParent; -import static com.ss.rlib.util.ClassUtils.unsafeCast; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ClassUtils.unsafeCast; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import static javafx.collections.FXCollections.observableArrayList; import com.jme3.asset.AssetManager; import com.jme3.asset.MaterialKey; @@ -70,10 +70,10 @@ import com.ss.editor.ui.util.UiUtils; import com.ss.editor.util.ControlUtils; import com.ss.editor.util.*; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.FileUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.FileUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.collections.ObservableList; import javafx.event.Event; import javafx.geometry.Point2D; diff --git a/src/main/java/com/ss/editor/ui/component/editor/impl/scene/SceneFileEditor.java b/src/main/java/com/ss/editor/ui/component/editor/impl/scene/SceneFileEditor.java index 78820c86..d9b659ce 100644 --- a/src/main/java/com/ss/editor/ui/component/editor/impl/scene/SceneFileEditor.java +++ b/src/main/java/com/ss/editor/ui/component/editor/impl/scene/SceneFileEditor.java @@ -2,7 +2,7 @@ import static com.ss.editor.util.EditorUtil.getAssetFile; import static com.ss.editor.util.EditorUtil.toAssetPath; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.asset.AssetManager; import com.jme3.asset.ModelKey; import com.jme3.scene.Spatial; @@ -37,8 +37,8 @@ import com.ss.editor.ui.util.DynamicIconSupport; import com.ss.editor.util.EditorUtil; import com.ss.editor.util.MaterialUtils; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.array.Array; import javafx.scene.control.ToggleButton; import javafx.scene.control.Tooltip; import javafx.scene.image.ImageView; diff --git a/src/main/java/com/ss/editor/ui/component/editor/scripting/EditorScriptingComponent.java b/src/main/java/com/ss/editor/ui/component/editor/scripting/EditorScriptingComponent.java index ccdd4130..b114d9b5 100644 --- a/src/main/java/com/ss/editor/ui/component/editor/scripting/EditorScriptingComponent.java +++ b/src/main/java/com/ss/editor/ui/component/editor/scripting/EditorScriptingComponent.java @@ -4,11 +4,11 @@ import com.ss.editor.ui.component.scripting.GroovyEditorComponent; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; -import com.ss.rlib.util.dictionary.DictionaryFactory; -import com.ss.rlib.util.dictionary.ObjectDictionary; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; +import com.ss.rlib.common.util.dictionary.DictionaryFactory; +import com.ss.rlib.common.util.dictionary.ObjectDictionary; import groovy.lang.GroovyShell; import javafx.scene.control.Button; import javafx.scene.control.Label; diff --git a/src/main/java/com/ss/editor/ui/component/editor/state/impl/AbstractEditorState.java b/src/main/java/com/ss/editor/ui/component/editor/state/impl/AbstractEditorState.java index e92ef4a7..a84bdccb 100644 --- a/src/main/java/com/ss/editor/ui/component/editor/state/impl/AbstractEditorState.java +++ b/src/main/java/com/ss/editor/ui/component/editor/state/impl/AbstractEditorState.java @@ -1,10 +1,10 @@ package com.ss.editor.ui.component.editor.state.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FxThread; import com.ss.editor.config.EditorConfig; import com.ss.editor.ui.component.editor.state.EditorState; -import com.ss.rlib.util.ArrayUtils; +import com.ss.rlib.common.util.ArrayUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/component/editor/state/impl/Editor3DEditorState.java b/src/main/java/com/ss/editor/ui/component/editor/state/impl/Editor3DEditorState.java index f2deeb69..2598e8ef 100644 --- a/src/main/java/com/ss/editor/ui/component/editor/state/impl/Editor3DEditorState.java +++ b/src/main/java/com/ss/editor/ui/component/editor/state/impl/Editor3DEditorState.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.component.editor.state.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.math.FastMath; import com.jme3.math.Vector3f; import com.ss.editor.annotation.FxThread; diff --git a/src/main/java/com/ss/editor/ui/component/painting/PaintingComponent.java b/src/main/java/com/ss/editor/ui/component/painting/PaintingComponent.java index 089ca5da..438ba401 100644 --- a/src/main/java/com/ss/editor/ui/component/painting/PaintingComponent.java +++ b/src/main/java/com/ss/editor/ui/component/painting/PaintingComponent.java @@ -3,7 +3,7 @@ import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; import com.ss.editor.ui.component.editor.state.EditorState; -import com.ss.rlib.util.HasName; +import com.ss.rlib.common.util.HasName; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/component/painting/PaintingComponentContainer.java b/src/main/java/com/ss/editor/ui/component/painting/PaintingComponentContainer.java index b929f03b..f6b7d7f0 100644 --- a/src/main/java/com/ss/editor/ui/component/painting/PaintingComponentContainer.java +++ b/src/main/java/com/ss/editor/ui/component/painting/PaintingComponentContainer.java @@ -9,8 +9,8 @@ import com.ss.editor.ui.FXConstants; import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.array.Array; import javafx.beans.value.ObservableValue; import javafx.collections.ObservableList; import javafx.scene.Node; diff --git a/src/main/java/com/ss/editor/ui/component/painting/PaintingComponentListCell.java b/src/main/java/com/ss/editor/ui/component/painting/PaintingComponentListCell.java index 42fca06a..263d3a16 100644 --- a/src/main/java/com/ss/editor/ui/component/painting/PaintingComponentListCell.java +++ b/src/main/java/com/ss/editor/ui/component/painting/PaintingComponentListCell.java @@ -1,7 +1,7 @@ package com.ss.editor.ui.component.painting; import com.ss.editor.annotation.FxThread; -import com.ss.rlib.util.StringUtils; +import com.ss.rlib.common.util.StringUtils; import javafx.scene.control.ListCell; import javafx.scene.control.ListView; import javafx.scene.image.ImageView; diff --git a/src/main/java/com/ss/editor/ui/component/painting/PaintingComponentRegistry.java b/src/main/java/com/ss/editor/ui/component/painting/PaintingComponentRegistry.java index 4ba5ec32..082c5d22 100644 --- a/src/main/java/com/ss/editor/ui/component/painting/PaintingComponentRegistry.java +++ b/src/main/java/com/ss/editor/ui/component/painting/PaintingComponentRegistry.java @@ -4,8 +4,8 @@ import com.ss.editor.annotation.FxThread; import com.ss.editor.ui.component.painting.spawn.SpawnPaintingComponent; import com.ss.editor.ui.component.painting.terrain.TerrainPaintingComponent; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; import java.util.function.Function; diff --git a/src/main/java/com/ss/editor/ui/component/painting/impl/AbstractPaintingComponent.java b/src/main/java/com/ss/editor/ui/component/painting/impl/AbstractPaintingComponent.java index c010f151..98c7899e 100644 --- a/src/main/java/com/ss/editor/ui/component/painting/impl/AbstractPaintingComponent.java +++ b/src/main/java/com/ss/editor/ui/component/painting/impl/AbstractPaintingComponent.java @@ -2,8 +2,8 @@ import static com.ss.editor.ui.component.painting.PaintingComponentContainer.FIELD_PERCENT; import static com.ss.editor.ui.component.painting.PaintingComponentContainer.LABEL_PERCENT; -import static com.ss.rlib.util.ClassUtils.unsafeCast; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ClassUtils.unsafeCast; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.scene.Node; import com.ss.editor.Messages; import com.ss.editor.annotation.FromAnyThread; @@ -17,8 +17,8 @@ import com.ss.editor.ui.component.painting.PaintingComponent; import com.ss.editor.ui.component.painting.PaintingComponentContainer; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.control.input.FloatTextField; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.control.input.FloatTextField; +import com.ss.rlib.fx.util.FXUtils; import javafx.scene.control.Label; import javafx.scene.layout.GridPane; import javafx.scene.layout.VBox; diff --git a/src/main/java/com/ss/editor/ui/component/painting/property/PropertiesBasedPaintingComponent.java b/src/main/java/com/ss/editor/ui/component/painting/property/PropertiesBasedPaintingComponent.java index 3c851590..5f857a40 100644 --- a/src/main/java/com/ss/editor/ui/component/painting/property/PropertiesBasedPaintingComponent.java +++ b/src/main/java/com/ss/editor/ui/component/painting/property/PropertiesBasedPaintingComponent.java @@ -7,12 +7,12 @@ import com.ss.editor.ui.component.painting.PaintingComponentContainer; import com.ss.editor.ui.component.painting.impl.AbstractPaintingComponent; import com.ss.editor.ui.component.painting.impl.AbstractPaintingStateWithEditorTool; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.VarTable; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; -import com.ss.rlib.util.dictionary.DictionaryFactory; -import com.ss.rlib.util.dictionary.ObjectDictionary; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; +import com.ss.rlib.common.util.dictionary.DictionaryFactory; +import com.ss.rlib.common.util.dictionary.ObjectDictionary; import javafx.collections.ObservableList; import javafx.scene.Node; import javafx.scene.layout.GridPane; diff --git a/src/main/java/com/ss/editor/ui/component/painting/spawn/SpawnPaintingComponent.java b/src/main/java/com/ss/editor/ui/component/painting/spawn/SpawnPaintingComponent.java index 6cb3cabb..7cba0e75 100644 --- a/src/main/java/com/ss/editor/ui/component/painting/spawn/SpawnPaintingComponent.java +++ b/src/main/java/com/ss/editor/ui/component/painting/spawn/SpawnPaintingComponent.java @@ -16,9 +16,9 @@ import com.ss.editor.ui.component.painting.property.PropertiesBasedPaintingComponent; import com.ss.editor.util.EditorUtil; import com.ss.editor.util.NodeUtils; -import com.ss.rlib.util.VarTable; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/component/painting/terrain/TerrainPaintingComponent.java b/src/main/java/com/ss/editor/ui/component/painting/terrain/TerrainPaintingComponent.java index b616dd26..00bdd8c7 100644 --- a/src/main/java/com/ss/editor/ui/component/painting/terrain/TerrainPaintingComponent.java +++ b/src/main/java/com/ss/editor/ui/component/painting/terrain/TerrainPaintingComponent.java @@ -2,8 +2,8 @@ import static com.ss.editor.ui.component.painting.PaintingComponentContainer.FIELD_PERCENT; import static com.ss.editor.ui.component.painting.PaintingComponentContainer.LABEL_PERCENT; -import static com.ss.rlib.util.ObjectUtils.notNull; -import static com.ss.rlib.util.array.ArrayFactory.toArray; +import static com.ss.rlib.common.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.array.ArrayFactory.toArray; import com.jme3.material.MatParam; import com.jme3.material.Material; import com.jme3.material.MaterialDef; @@ -26,13 +26,13 @@ import com.ss.editor.ui.css.CssClasses; import com.ss.editor.util.MaterialUtils; import com.ss.editor.util.NodeUtils; -import com.ss.rlib.ui.control.input.FloatTextField; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; -import com.ss.rlib.util.dictionary.DictionaryFactory; -import com.ss.rlib.util.dictionary.ObjectDictionary; +import com.ss.rlib.fx.control.input.FloatTextField; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; +import com.ss.rlib.common.util.dictionary.DictionaryFactory; +import com.ss.rlib.common.util.dictionary.ObjectDictionary; import javafx.collections.ObservableList; import javafx.geometry.Insets; import javafx.geometry.Pos; diff --git a/src/main/java/com/ss/editor/ui/component/painting/terrain/paint/TextureLayerCell.java b/src/main/java/com/ss/editor/ui/component/painting/terrain/paint/TextureLayerCell.java index f89991f9..604513bb 100644 --- a/src/main/java/com/ss/editor/ui/component/painting/terrain/paint/TextureLayerCell.java +++ b/src/main/java/com/ss/editor/ui/component/painting/terrain/paint/TextureLayerCell.java @@ -6,8 +6,8 @@ import com.ss.editor.ui.control.choose.NamedChooseTextureControl; import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.control.input.FloatTextField; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.control.input.FloatTextField; +import com.ss.rlib.fx.util.FXUtils; import javafx.beans.binding.DoubleBinding; import javafx.scene.control.Label; import javafx.scene.control.ListCell; diff --git a/src/main/java/com/ss/editor/ui/component/painting/terrain/paint/TextureLayerSettings.java b/src/main/java/com/ss/editor/ui/component/painting/terrain/paint/TextureLayerSettings.java index 186082ca..893a34c2 100644 --- a/src/main/java/com/ss/editor/ui/component/painting/terrain/paint/TextureLayerSettings.java +++ b/src/main/java/com/ss/editor/ui/component/painting/terrain/paint/TextureLayerSettings.java @@ -1,7 +1,7 @@ package com.ss.editor.ui.component.painting.terrain.paint; import static com.ss.editor.ui.component.painting.terrain.TerrainPaintingComponent.TERRAIN_PARAM; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.material.MatParam; import com.jme3.material.Material; import com.jme3.scene.Geometry; @@ -21,9 +21,9 @@ import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.util.DynamicIconSupport; import com.ss.editor.util.NodeUtils; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.beans.binding.DoubleBinding; import javafx.collections.ObservableList; import javafx.scene.control.*; diff --git a/src/main/java/com/ss/editor/ui/component/scripting/GroovyEditorComponent.java b/src/main/java/com/ss/editor/ui/component/scripting/GroovyEditorComponent.java index f818fdde..454058d8 100644 --- a/src/main/java/com/ss/editor/ui/component/scripting/GroovyEditorComponent.java +++ b/src/main/java/com/ss/editor/ui/component/scripting/GroovyEditorComponent.java @@ -3,7 +3,7 @@ import static java.util.Collections.singleton; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.util.UiUtils; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.scene.layout.VBox; import org.fxmisc.richtext.CodeArea; import org.fxmisc.richtext.model.StyleSpans; diff --git a/src/main/java/com/ss/editor/ui/component/split/pane/TabToolSplitPane.java b/src/main/java/com/ss/editor/ui/component/split/pane/TabToolSplitPane.java index 26a0e2b2..c12fac3f 100644 --- a/src/main/java/com/ss/editor/ui/component/split/pane/TabToolSplitPane.java +++ b/src/main/java/com/ss/editor/ui/component/split/pane/TabToolSplitPane.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.component.split.pane; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import static java.lang.Math.max; import static java.lang.Math.min; import com.ss.editor.ui.component.tab.TabToolComponent; diff --git a/src/main/java/com/ss/editor/ui/component/tab/EditorToolComponent.java b/src/main/java/com/ss/editor/ui/component/tab/EditorToolComponent.java index f041898d..5a8fe71d 100644 --- a/src/main/java/com/ss/editor/ui/component/tab/EditorToolComponent.java +++ b/src/main/java/com/ss/editor/ui/component/tab/EditorToolComponent.java @@ -1,7 +1,7 @@ package com.ss.editor.ui.component.tab; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.geometry.Side; import javafx.scene.control.SplitPane; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/ss/editor/ui/component/tab/ScrollableEditorToolComponent.java b/src/main/java/com/ss/editor/ui/component/tab/ScrollableEditorToolComponent.java index e045b917..d88eac4d 100644 --- a/src/main/java/com/ss/editor/ui/component/tab/ScrollableEditorToolComponent.java +++ b/src/main/java/com/ss/editor/ui/component/tab/ScrollableEditorToolComponent.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.component.tab; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.scene.control.ScrollPane; import javafx.scene.control.SplitPane; import javafx.scene.control.Tab; diff --git a/src/main/java/com/ss/editor/ui/component/tab/TabToolComponent.java b/src/main/java/com/ss/editor/ui/component/tab/TabToolComponent.java index 5c75aa6b..33988a67 100644 --- a/src/main/java/com/ss/editor/ui/component/tab/TabToolComponent.java +++ b/src/main/java/com/ss/editor/ui/component/tab/TabToolComponent.java @@ -1,7 +1,7 @@ package com.ss.editor.ui.component.tab; import com.ss.editor.ui.component.ScreenComponent; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.beans.property.BooleanProperty; import javafx.beans.property.BooleanPropertyBase; import javafx.beans.value.ChangeListener; diff --git a/src/main/java/com/ss/editor/ui/component/virtual/tree/VirtualResourceTree.java b/src/main/java/com/ss/editor/ui/component/virtual/tree/VirtualResourceTree.java index c415d34a..476a8b6f 100644 --- a/src/main/java/com/ss/editor/ui/component/virtual/tree/VirtualResourceTree.java +++ b/src/main/java/com/ss/editor/ui/component/virtual/tree/VirtualResourceTree.java @@ -1,16 +1,16 @@ package com.ss.editor.ui.component.virtual.tree; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.ui.FXConstants; import com.ss.editor.ui.component.virtual.tree.resource.FolderVirtualResourceElement; import com.ss.editor.ui.component.virtual.tree.resource.VirtualResourceElement; import com.ss.editor.ui.util.UiUtils; -import com.ss.rlib.util.FileUtils; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayComparator; +import com.ss.rlib.common.util.FileUtils; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayComparator; import javafx.collections.ObservableList; import javafx.scene.control.SelectionMode; import javafx.scene.control.TreeItem; diff --git a/src/main/java/com/ss/editor/ui/component/virtual/tree/VirtualResourceTreeCell.java b/src/main/java/com/ss/editor/ui/component/virtual/tree/VirtualResourceTreeCell.java index 8384775a..51b5f321 100644 --- a/src/main/java/com/ss/editor/ui/component/virtual/tree/VirtualResourceTreeCell.java +++ b/src/main/java/com/ss/editor/ui/component/virtual/tree/VirtualResourceTreeCell.java @@ -4,7 +4,7 @@ import com.ss.editor.manager.FileIconManager; import com.ss.editor.ui.component.virtual.tree.resource.FolderVirtualResourceElement; import com.ss.editor.ui.component.virtual.tree.resource.VirtualResourceElement; -import com.ss.rlib.util.StringUtils; +import com.ss.rlib.common.util.StringUtils; import javafx.scene.control.TreeCell; import javafx.scene.control.TreeView; import javafx.scene.image.ImageView; diff --git a/src/main/java/com/ss/editor/ui/component/virtual/tree/resource/FolderVirtualResourceElement.java b/src/main/java/com/ss/editor/ui/component/virtual/tree/resource/FolderVirtualResourceElement.java index ce41fce9..f6fdd224 100644 --- a/src/main/java/com/ss/editor/ui/component/virtual/tree/resource/FolderVirtualResourceElement.java +++ b/src/main/java/com/ss/editor/ui/component/virtual/tree/resource/FolderVirtualResourceElement.java @@ -2,8 +2,8 @@ import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.ui.component.virtual.tree.VirtualResourceTree; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/component/virtual/tree/resource/VirtualResourceElement.java b/src/main/java/com/ss/editor/ui/component/virtual/tree/resource/VirtualResourceElement.java index f3d1a2fd..54eb11cb 100644 --- a/src/main/java/com/ss/editor/ui/component/virtual/tree/resource/VirtualResourceElement.java +++ b/src/main/java/com/ss/editor/ui/component/virtual/tree/resource/VirtualResourceElement.java @@ -1,11 +1,11 @@ package com.ss.editor.ui.component.virtual.tree.resource; -import static com.ss.rlib.util.ClassUtils.unsafeCast; +import static com.ss.rlib.common.util.ClassUtils.unsafeCast; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.ui.component.virtual.tree.VirtualResourceTree; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerManager; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; +import com.ss.rlib.common.util.array.Array; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/component/virtual/tree/resource/VirtualResourceElementFactory.java b/src/main/java/com/ss/editor/ui/component/virtual/tree/resource/VirtualResourceElementFactory.java index cac89a73..d44dfd6b 100644 --- a/src/main/java/com/ss/editor/ui/component/virtual/tree/resource/VirtualResourceElementFactory.java +++ b/src/main/java/com/ss/editor/ui/component/virtual/tree/resource/VirtualResourceElementFactory.java @@ -2,12 +2,12 @@ import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.ui.component.virtual.tree.VirtualResourceTree; -import com.ss.rlib.util.FileUtils; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; -import com.ss.rlib.util.dictionary.DictionaryFactory; -import com.ss.rlib.util.dictionary.ObjectDictionary; +import com.ss.rlib.common.util.FileUtils; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; +import com.ss.rlib.common.util.dictionary.DictionaryFactory; +import com.ss.rlib.common.util.dictionary.ObjectDictionary; import org.jetbrains.annotations.NotNull; /** diff --git a/src/main/java/com/ss/editor/ui/control/app/state/list/AppStateList.java b/src/main/java/com/ss/editor/ui/control/app/state/list/AppStateList.java index 3be3c621..e16a0de3 100644 --- a/src/main/java/com/ss/editor/ui/control/app/state/list/AppStateList.java +++ b/src/main/java/com/ss/editor/ui/control/app/state/list/AppStateList.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.app.state.list; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; import com.ss.editor.extension.scene.SceneNode; @@ -13,7 +13,7 @@ import com.ss.editor.model.undo.impl.RemoveAppStateOperation; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.util.DynamicIconSupport; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.collections.ObservableList; import javafx.scene.control.Button; import javafx.scene.control.ListView; diff --git a/src/main/java/com/ss/editor/ui/control/app/state/list/AppStateListCell.java b/src/main/java/com/ss/editor/ui/control/app/state/list/AppStateListCell.java index bd17be61..2ff41d0d 100644 --- a/src/main/java/com/ss/editor/ui/control/app/state/list/AppStateListCell.java +++ b/src/main/java/com/ss/editor/ui/control/app/state/list/AppStateListCell.java @@ -7,7 +7,7 @@ import com.ss.editor.model.undo.impl.EnableAppStateOperation; import com.ss.editor.ui.control.list.AbstractListCell; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/choose/ChooseFolderControl.java b/src/main/java/com/ss/editor/ui/control/choose/ChooseFolderControl.java index ed65acaa..88190a6c 100644 --- a/src/main/java/com/ss/editor/ui/control/choose/ChooseFolderControl.java +++ b/src/main/java/com/ss/editor/ui/control/choose/ChooseFolderControl.java @@ -1,7 +1,7 @@ package com.ss.editor.ui.control.choose; import static com.ss.editor.util.EditorUtil.getAssetFile; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.Messages; import com.ss.editor.annotation.FxThread; import com.ss.editor.ui.Icons; @@ -11,8 +11,8 @@ import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.util.DynamicIconSupport; import com.ss.editor.ui.util.UiUtils; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.StringUtils; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.StringUtils; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.image.ImageView; diff --git a/src/main/java/com/ss/editor/ui/control/choose/ChooseTextureControl.java b/src/main/java/com/ss/editor/ui/control/choose/ChooseTextureControl.java index 4cfebf3e..c0eb701d 100644 --- a/src/main/java/com/ss/editor/ui/control/choose/ChooseTextureControl.java +++ b/src/main/java/com/ss/editor/ui/control/choose/ChooseTextureControl.java @@ -2,7 +2,7 @@ import static com.ss.editor.FileExtensions.TEXTURE_EXTENSIONS; import static com.ss.editor.util.EditorUtil.getAssetFile; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.Messages; import com.ss.editor.annotation.FxThread; import com.ss.editor.manager.JavaFxImageManager; @@ -14,7 +14,7 @@ import com.ss.editor.ui.tooltip.ImageChannelPreview; import com.ss.editor.ui.util.DynamicIconSupport; import com.ss.editor.ui.util.UiUtils; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.Tooltip; diff --git a/src/main/java/com/ss/editor/ui/control/choose/NamedChooseTextureControl.java b/src/main/java/com/ss/editor/ui/control/choose/NamedChooseTextureControl.java index 75dcd01b..7e1a587a 100644 --- a/src/main/java/com/ss/editor/ui/control/choose/NamedChooseTextureControl.java +++ b/src/main/java/com/ss/editor/ui/control/choose/NamedChooseTextureControl.java @@ -1,10 +1,10 @@ package com.ss.editor.ui.control.choose; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FxThread; import com.ss.editor.ui.control.property.PropertyControl; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.StringUtils; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.StringUtils; import javafx.scene.control.Label; import javafx.scene.layout.HBox; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/ss/editor/ui/control/code/BaseCodeArea.java b/src/main/java/com/ss/editor/ui/control/code/BaseCodeArea.java index 8c291c29..9be7b032 100644 --- a/src/main/java/com/ss/editor/ui/control/code/BaseCodeArea.java +++ b/src/main/java/com/ss/editor/ui/control/code/BaseCodeArea.java @@ -2,7 +2,7 @@ import static java.util.Collections.singleton; import com.ss.editor.annotation.FxThread; -import com.ss.rlib.util.StringUtils; +import com.ss.rlib.common.util.StringUtils; import org.fxmisc.richtext.CodeArea; import org.fxmisc.richtext.model.StyleSpans; import org.fxmisc.richtext.model.StyleSpansBuilder; diff --git a/src/main/java/com/ss/editor/ui/control/filter/list/FilterList.java b/src/main/java/com/ss/editor/ui/control/filter/list/FilterList.java index 94d0440e..b62fb296 100644 --- a/src/main/java/com/ss/editor/ui/control/filter/list/FilterList.java +++ b/src/main/java/com/ss/editor/ui/control/filter/list/FilterList.java @@ -11,7 +11,7 @@ import com.ss.editor.model.undo.impl.RemoveSceneFilterOperation; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.util.DynamicIconSupport; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.collections.ObservableList; import javafx.scene.control.Button; import javafx.scene.control.ListView; diff --git a/src/main/java/com/ss/editor/ui/control/filter/list/FilterListCell.java b/src/main/java/com/ss/editor/ui/control/filter/list/FilterListCell.java index a88cbfd4..eb951fac 100644 --- a/src/main/java/com/ss/editor/ui/control/filter/list/FilterListCell.java +++ b/src/main/java/com/ss/editor/ui/control/filter/list/FilterListCell.java @@ -7,7 +7,7 @@ import com.ss.editor.model.undo.impl.EnableSceneFilterOperation; import com.ss.editor.ui.control.list.AbstractListCell; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/layer/LayerNodeTree.java b/src/main/java/com/ss/editor/ui/control/layer/LayerNodeTree.java index 6673ffc2..ffae22fa 100644 --- a/src/main/java/com/ss/editor/ui/control/layer/LayerNodeTree.java +++ b/src/main/java/com/ss/editor/ui/control/layer/LayerNodeTree.java @@ -8,7 +8,7 @@ import com.ss.editor.ui.control.tree.NodeTree; import com.ss.editor.ui.control.tree.NodeTreeCell; import com.ss.editor.ui.control.tree.node.TreeNode; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.util.array.Array; import javafx.scene.control.SelectionMode; import javafx.scene.control.TreeItem; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/ss/editor/ui/control/list/AbstractListCell.java b/src/main/java/com/ss/editor/ui/control/list/AbstractListCell.java index 6f71d1a4..420bfd68 100644 --- a/src/main/java/com/ss/editor/ui/control/list/AbstractListCell.java +++ b/src/main/java/com/ss/editor/ui/control/list/AbstractListCell.java @@ -4,8 +4,8 @@ import com.ss.editor.ui.Icons; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.util.DynamicIconSupport; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.StringUtils; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.StringUtils; import javafx.scene.control.Label; import javafx.scene.control.cell.TextFieldListCell; import javafx.scene.image.ImageView; diff --git a/src/main/java/com/ss/editor/ui/control/model/ModelNodeTree.java b/src/main/java/com/ss/editor/ui/control/model/ModelNodeTree.java index 3c256d38..98502acd 100644 --- a/src/main/java/com/ss/editor/ui/control/model/ModelNodeTree.java +++ b/src/main/java/com/ss/editor/ui/control/model/ModelNodeTree.java @@ -3,7 +3,7 @@ import com.ss.editor.model.undo.editor.ModelChangeConsumer; import com.ss.editor.ui.control.tree.NodeTree; import com.ss.editor.ui.control.tree.action.impl.multi.RemoveElementsAction; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.util.array.Array; import javafx.scene.control.SelectionMode; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/model/ModelPropertyEditor.java b/src/main/java/com/ss/editor/ui/control/model/ModelPropertyEditor.java index 3152cc23..8a14fc5d 100644 --- a/src/main/java/com/ss/editor/ui/control/model/ModelPropertyEditor.java +++ b/src/main/java/com/ss/editor/ui/control/model/ModelPropertyEditor.java @@ -8,8 +8,8 @@ import com.ss.editor.annotation.FxThread; import com.ss.editor.model.undo.editor.ModelChangeConsumer; import com.ss.editor.ui.control.property.PropertyEditor; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/property/PropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/PropertyControl.java index e95510fc..5d7261b9 100644 --- a/src/main/java/com/ss/editor/ui/control/property/PropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/PropertyControl.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.property; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; import com.ss.editor.manager.ExecutorManager; @@ -14,10 +14,10 @@ import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.event.FxEventManager; import com.ss.editor.ui.util.UiUtils; -import com.ss.rlib.function.SixObjectConsumer; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerManager; -import com.ss.rlib.ui.util.FxUtils; +import com.ss.rlib.common.function.SixObjectConsumer; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; +import com.ss.rlib.fx.util.FxUtils; import javafx.geometry.Pos; import javafx.scene.control.Label; import javafx.scene.layout.HBox; @@ -347,7 +347,8 @@ protected void createComponents() { propertyNameLabel = new Label(getPropertyName() + ":"); if (isSingleRow()) { - propertyNameLabel.maxWidthProperty().bind(widthProperty().multiply(1F - CONTROL_WIDTH_PERCENT)); + propertyNameLabel.maxWidthProperty() + .bind(widthProperty().multiply(1F - CONTROL_WIDTH_PERCENT)); } FxUtils.addClass(container, CssClasses.DEF_HBOX) @@ -390,7 +391,8 @@ public void changeControlWidthPercent(double controlWidthPercent) { var propertyNameLabel = getPropertyNameLabel(); propertyNameLabel.maxWidthProperty().unbind(); - propertyNameLabel.maxWidthProperty().bind(widthProperty().multiply(1D - controlWidthPercent)); + propertyNameLabel.maxWidthProperty() + .bind(widthProperty().multiply(1D - controlWidthPercent)); } /** diff --git a/src/main/java/com/ss/editor/ui/control/property/PropertyEditor.java b/src/main/java/com/ss/editor/ui/control/property/PropertyEditor.java index 857cd240..badaf50a 100644 --- a/src/main/java/com/ss/editor/ui/control/property/PropertyEditor.java +++ b/src/main/java/com/ss/editor/ui/control/property/PropertyEditor.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.property; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FxThread; import com.ss.editor.extension.property.EditableProperty; import com.ss.editor.model.undo.editor.ChangeConsumer; @@ -8,7 +8,7 @@ import com.ss.editor.ui.control.UpdatableControl; import com.ss.editor.ui.control.property.builder.PropertyBuilderRegistry; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.scene.control.ScrollPane; import javafx.scene.layout.VBox; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/PropertyBuilderRegistry.java b/src/main/java/com/ss/editor/ui/control/property/builder/PropertyBuilderRegistry.java index 1d9bc820..39bb600f 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/PropertyBuilderRegistry.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/PropertyBuilderRegistry.java @@ -4,8 +4,8 @@ import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.control.property.builder.impl.*; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.layout.VBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/AbstractPropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/AbstractPropertyBuilder.java index 10784e17..84238528 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/AbstractPropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/AbstractPropertyBuilder.java @@ -4,7 +4,7 @@ import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.control.property.builder.PropertyBuilder; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.scene.layout.HBox; import javafx.scene.layout.Pane; import javafx.scene.layout.VBox; diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/AudioNodePropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/AudioNodePropertyBuilder.java index f2fabdea..905e7f00 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/AudioNodePropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/AudioNodePropertyBuilder.java @@ -16,7 +16,7 @@ import com.ss.editor.ui.control.property.impl.Vector3fPropertyControl; import com.ss.editor.util.AudioNodeUtils; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.scene.layout.VBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/CollisionShapePropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/CollisionShapePropertyBuilder.java index c3ae4278..72a63bce 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/CollisionShapePropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/CollisionShapePropertyBuilder.java @@ -11,7 +11,7 @@ import com.ss.editor.model.undo.editor.ModelChangeConsumer; import com.ss.editor.ui.control.property.builder.PropertyBuilder; import com.ss.editor.ui.control.property.impl.DefaultSinglePropertyControl; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.scene.layout.VBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/EditableObjectPropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/EditableObjectPropertyBuilder.java index 8dafee87..0890beb6 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/EditableObjectPropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/EditableObjectPropertyBuilder.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.property.builder.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.math.*; import com.jme3.texture.Texture2D; @@ -10,8 +10,8 @@ import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.control.property.impl.*; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.ClassUtils; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.ClassUtils; import javafx.scene.layout.VBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/EmitterShapePropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/EmitterShapePropertyBuilder.java index 9666339d..21ddf608 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/EmitterShapePropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/EmitterShapePropertyBuilder.java @@ -12,7 +12,7 @@ import com.ss.editor.ui.control.property.builder.PropertyBuilder; import com.ss.editor.ui.control.property.impl.FloatPropertyControl; import com.ss.editor.ui.control.property.impl.Vector3fPropertyControl; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.scene.layout.VBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/GeometryPropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/GeometryPropertyBuilder.java index 3c3f30bf..652fb86b 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/GeometryPropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/GeometryPropertyBuilder.java @@ -18,10 +18,10 @@ import com.ss.editor.ui.control.property.impl.LodLevelPropertyControl; import com.ss.editor.ui.control.property.impl.MaterialKeyPropertyControl; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.layout.VBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/LightPropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/LightPropertyBuilder.java index 2df587fb..27a85a81 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/LightPropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/LightPropertyBuilder.java @@ -16,7 +16,7 @@ import com.ss.editor.ui.control.property.impl.ColorPropertyControl; import com.ss.editor.ui.control.property.impl.FloatPropertyControl; import com.ss.editor.ui.control.property.impl.Vector3fPropertyControl; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.scene.layout.VBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/MaterialPropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/MaterialPropertyBuilder.java index 3e81954f..8749d25d 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/MaterialPropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/MaterialPropertyBuilder.java @@ -12,8 +12,8 @@ import com.ss.editor.extension.property.SimpleProperty; import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.control.property.builder.PropertyBuilder; -import com.ss.rlib.util.dictionary.DictionaryFactory; -import com.ss.rlib.util.dictionary.ObjectDictionary; +import com.ss.rlib.common.util.dictionary.DictionaryFactory; +import com.ss.rlib.common.util.dictionary.ObjectDictionary; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/MaterialSettingsPropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/MaterialSettingsPropertyBuilder.java index 1775898f..24d5e442 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/MaterialSettingsPropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/MaterialSettingsPropertyBuilder.java @@ -14,7 +14,7 @@ import com.ss.editor.extension.property.SimpleProperty; import com.ss.editor.model.node.material.*; import com.ss.editor.ui.control.property.builder.PropertyBuilder; -import com.ss.rlib.util.StringUtils; +import com.ss.rlib.common.util.StringUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/MeshPropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/MeshPropertyBuilder.java index c1d6f2dc..580941fd 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/MeshPropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/MeshPropertyBuilder.java @@ -8,7 +8,7 @@ import com.ss.editor.ui.control.property.builder.PropertyBuilder; import com.ss.editor.ui.control.property.impl.DefaultSinglePropertyControl; import com.ss.editor.ui.control.property.impl.EnumPropertyControl; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.scene.layout.VBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/ParticleEmitterPropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/ParticleEmitterPropertyBuilder.java index 94d4ad4b..5f627295 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/ParticleEmitterPropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/ParticleEmitterPropertyBuilder.java @@ -12,7 +12,7 @@ import com.ss.editor.ui.control.property.impl.particle.ParticleEmitterImagesModelPropertyControl; import com.ss.editor.ui.control.property.builder.PropertyBuilder; import com.ss.editor.ui.control.property.impl.*; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.scene.layout.VBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/ParticleInfluencerPropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/ParticleInfluencerPropertyBuilder.java index 3eb85874..11dad8cd 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/ParticleInfluencerPropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/ParticleInfluencerPropertyBuilder.java @@ -12,7 +12,7 @@ import com.ss.editor.ui.control.property.impl.BooleanPropertyControl; import com.ss.editor.ui.control.property.impl.FloatPropertyControl; import com.ss.editor.ui.control.property.impl.Vector3fPropertyControl; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.scene.layout.VBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/PrimitivePropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/PrimitivePropertyBuilder.java index 204045f8..b2273a5f 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/PrimitivePropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/PrimitivePropertyBuilder.java @@ -8,7 +8,7 @@ import com.ss.editor.ui.control.property.builder.PropertyBuilder; import com.ss.editor.ui.control.property.impl.DefaultSinglePropertyControl; import com.ss.editor.ui.control.property.impl.Vector3fPropertyControl; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.scene.layout.VBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/SpatialPropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/SpatialPropertyBuilder.java index 77f01526..a62f2020 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/SpatialPropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/SpatialPropertyBuilder.java @@ -24,9 +24,9 @@ import com.ss.editor.model.undo.editor.SceneChangeConsumer; import com.ss.editor.ui.control.property.builder.PropertyBuilder; import com.ss.editor.ui.control.property.impl.*; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.layout.VBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/AudioKeyPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/AudioKeyPropertyControl.java index 6b4bcb4a..a3f06d58 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/AudioKeyPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/AudioKeyPropertyControl.java @@ -2,7 +2,7 @@ import static com.ss.editor.FileExtensions.AUDIO_EXTENSIONS; import static com.ss.editor.util.EditorUtil.*; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.audio.AudioData; import com.jme3.audio.AudioKey; import com.jme3.audio.AudioNode; @@ -16,8 +16,8 @@ import com.ss.editor.ui.util.DynamicIconSupport; import com.ss.editor.ui.util.UiUtils; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.ui.util.FxUtils; -import com.ss.rlib.util.StringUtils; +import com.ss.rlib.fx.util.FxUtils; +import com.ss.rlib.common.util.StringUtils; import javafx.event.ActionEvent; import javafx.scene.control.Button; import javafx.scene.control.Label; @@ -98,8 +98,9 @@ protected void createComponents(@NotNull HBox container) { var openButton = new Button(); openButton.setGraphic(new ImageView(Icons.EDIT_16)); - openButton.disableProperty().bind(audioKeyLabel.textProperty().isEqualTo(NO_AUDIO)); - openButton.setOnAction(this::processOpen); + openButton.setOnAction(this::openAudio); + openButton.disableProperty() + .bind(audioKeyLabel.textProperty().isEqualTo(NO_AUDIO)); audioKeyLabel.prefWidthProperty().bind(widthProperty() .subtract(changeButton.widthProperty()) @@ -150,7 +151,7 @@ private void addAudioData(@NotNull Path file) { * @param event the action event. */ @FxThread - protected void processOpen(@Nullable ActionEvent event) { + protected void openAudio(@Nullable ActionEvent event) { var element = getPropertyValue(); if (element == null) { diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/BooleanPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/BooleanPropertyControl.java index af10ce82..87ef04e2 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/BooleanPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/BooleanPropertyControl.java @@ -1,12 +1,16 @@ package com.ss.editor.ui.control.property.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; +import static java.lang.Boolean.TRUE; + import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.fx.util.FxControlUtils; +import com.ss.rlib.fx.util.FxUtils; import javafx.beans.value.ObservableValue; import javafx.scene.control.CheckBox; import javafx.scene.layout.HBox; @@ -54,12 +58,13 @@ protected void createComponents(@NotNull HBox container) { super.createComponents(container); checkBox = new CheckBox(); - checkBox.selectedProperty().addListener(this::updateValue); checkBox.prefWidthProperty() .bind(widthProperty().multiply(CONTROL_WIDTH_PERCENT)); - FXUtils.addToPane(checkBox, container); - FXUtils.addClassTo(checkBox, CssClasses.ABSTRACT_PARAM_CONTROL_CHECK_BOX); + FxControlUtils.onSelectedChange(checkBox, this::updateValue); + + FxUtils.addChild(container, checkBox); + FxUtils.addClass(checkBox, CssClasses.ABSTRACT_PARAM_CONTROL_CHECK_BOX); } @Override @@ -81,16 +86,9 @@ public void changeControlWidthPercent(double controlWidthPercent) { */ @FxThread public void disableCheckboxOffset() { - - var checkBox = getCheckBox(); - checkBox.prefWidthProperty().unbind(); - - var propertyNameLabel = getPropertyNameLabel(); - propertyNameLabel.maxWidthProperty().unbind(); - propertyNameLabel.setMaxWidth(Region.USE_COMPUTED_SIZE); - propertyNameLabel.prefWidthProperty().bind(widthProperty()); - propertyNameLabel.minWidthProperty().unbind(); - propertyNameLabel.setMinWidth(Region.USE_COMPUTED_SIZE); + FxUtils.resetPrefWidth(getCheckBox()); + FxUtils.resetMinMaxWidth(getPropertyNameLabel()) + .prefWidthProperty().bind(widthProperty()); } @Override @@ -112,28 +110,20 @@ protected boolean isSingleRow() { @Override @FxThread protected void reload() { - var value = getPropertyValue(); - var checkBox = getCheckBox(); - checkBox.setSelected(Boolean.TRUE.equals(value)); + getCheckBox().setSelected(TRUE.equals(getPropertyValue())); } @FxThread @Override public boolean isDirty() { - var currentValue = getCheckBox().isSelected(); - var storedValue = getPropertyValue(); - return !Objects.equals(storedValue, currentValue); + return !Objects.equals(getPropertyValue(), getCheckBox().isSelected()); } /** * Update the value. */ @FxThread - private void updateValue( - @NotNull ObservableValue observable, - @NotNull Boolean oldValue, - @NotNull Boolean newValue - ) { + private void updateValue() { if (!isIgnoreListener()) { apply(); } @@ -142,7 +132,6 @@ private void updateValue( @Override protected void apply() { super.apply(); - var checkBox = getCheckBox(); - changed(checkBox.isSelected(), getPropertyValue()); + changed(getCheckBox().isSelected(), getPropertyValue()); } } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/ColorPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/ColorPropertyControl.java index e9af5a9f..7d2d115d 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/ColorPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/ColorPropertyControl.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.property.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.math.ColorRGBA; import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; @@ -8,7 +8,9 @@ import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.util.UiUtils; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.fx.util.FxControlUtils; +import com.ss.rlib.fx.util.FxUtils; import javafx.scene.control.ColorPicker; import javafx.scene.layout.HBox; import org.jetbrains.annotations.NotNull; @@ -29,37 +31,42 @@ public class ColorPropertyControl extends PropertyC @Nullable private ColorPicker colorPicker; - public ColorPropertyControl(@Nullable final ColorRGBA propertyValue, @NotNull final String propertyName, - @NotNull final C changeConsumer) { + public ColorPropertyControl( + @Nullable ColorRGBA propertyValue, + @NotNull String propertyName, + @NotNull C changeConsumer + ) { super(propertyValue, propertyName, changeConsumer); } @Override @FxThread - protected void createComponents(@NotNull final HBox container) { + protected void createComponents(@NotNull HBox container) { super.createComponents(container); colorPicker = new ColorPicker(); - colorPicker.valueProperty().addListener((observable, oldValue, newValue) -> updateValue()); - colorPicker.prefWidthProperty().bind(widthProperty().multiply(CONTROL_WIDTH_PERCENT)); + colorPicker.prefWidthProperty() + .bind(widthProperty().multiply(CONTROL_WIDTH_PERCENT)); - FXUtils.addToPane(colorPicker, container); - FXUtils.addClassTo(colorPicker, CssClasses.ABSTRACT_PARAM_CONTROL_COLOR_PICKER); + FxControlUtils.onColorChange(colorPicker, this::updateValue); + + FxUtils.addChild(container, colorPicker); + FxUtils.addClass(colorPicker, CssClasses.ABSTRACT_PARAM_CONTROL_COLOR_PICKER); } @Override @FxThread - public void changeControlWidthPercent(final double controlWidthPercent) { + public void changeControlWidthPercent(double controlWidthPercent) { super.changeControlWidthPercent(controlWidthPercent); - final ColorPicker colorPicker = getColorPicker(); - colorPicker.prefWidthProperty().unbind(); - colorPicker.prefWidthProperty().bind(widthProperty().multiply(controlWidthPercent)); + var width = getColorPicker().prefWidthProperty(); + width.unbind(); + width.bind(widthProperty().multiply(controlWidthPercent)); } @Override @FxThread - protected void setPropertyValue(@Nullable final ColorRGBA color) { + protected void setPropertyValue(@Nullable ColorRGBA color) { super.setPropertyValue(color == null ? null : color.clone()); } @@ -70,6 +77,8 @@ protected boolean isSingleRow() { } /** + * Get the color picker. + * * @return the color picker. */ @FxThread @@ -80,8 +89,7 @@ protected boolean isSingleRow() { @Override @FxThread protected void reload() { - final ColorPicker colorPicker = getColorPicker(); - colorPicker.setValue(UiUtils.from(getPropertyValue())); + getColorPicker().setValue(UiUtils.from(getPropertyValue())); } /** @@ -94,9 +102,9 @@ private void updateValue() { return; } - final ColorPicker colorPicker = getColorPicker(); - final ColorRGBA newColor = UiUtils.from(colorPicker.getValue()); - final ColorRGBA oldValue = getPropertyValue(); + var colorPicker = getColorPicker(); + var newColor = UiUtils.from(colorPicker.getValue()); + var oldValue = getPropertyValue(); changed(newColor, oldValue == null ? null : oldValue.clone()); } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/DefaultPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/DefaultPropertyControl.java index b520ec12..90b81cd7 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/DefaultPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/DefaultPropertyControl.java @@ -1,12 +1,13 @@ package com.ss.editor.ui.control.property.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.fx.util.FxUtils; import javafx.scene.control.Label; import javafx.scene.layout.HBox; import org.jetbrains.annotations.NotNull; @@ -36,22 +37,27 @@ public class DefaultPropertyControl extends Prop @Nullable private Function toStringFunction; - public DefaultPropertyControl(@Nullable final T propertyValue, @NotNull final String propertyName, - @NotNull final C changeConsumer) { + public DefaultPropertyControl( + @Nullable T propertyValue, + @NotNull String propertyName, + @NotNull C changeConsumer + ) { super(propertyValue, propertyName, changeConsumer); } /** - * Sets to string function. + * Set the string function. * * @param toStringFunction the string function. */ @FromAnyThread - public void setToStringFunction(@Nullable final Function toStringFunction) { + public void setToStringFunction(@Nullable Function toStringFunction) { this.toStringFunction = toStringFunction; } /** + * Get the string function. + * * @return the string function. */ @FromAnyThread @@ -60,6 +66,8 @@ public void setToStringFunction(@Nullable final Function toStringFunc } /** + * Get the label with value of the property. + * * @return the label with value of the property. */ protected @NotNull Label getPropertyValueLabel() { @@ -68,15 +76,16 @@ public void setToStringFunction(@Nullable final Function toStringFunc @Override @FxThread - protected void createComponents(@NotNull final HBox container) { + protected void createComponents(@NotNull HBox container) { super.createComponents(container); propertyValueLabel = new Label(); - propertyValueLabel.prefWidthProperty().bind(container.widthProperty()); + propertyValueLabel.prefWidthProperty() + .bind(container.widthProperty()); - FXUtils.addClassesTo(propertyValueLabel, CssClasses.ABSTRACT_PARAM_CONTROL_LABEL_VALUE, + FxUtils.addClass(propertyValueLabel, CssClasses.ABSTRACT_PARAM_CONTROL_LABEL_VALUE, CssClasses.TEXT_INPUT_CONTAINER); - FXUtils.addToPane(propertyValueLabel, container); + FxUtils.addChild(container, propertyValueLabel); } @Override @@ -84,9 +93,8 @@ protected void createComponents(@NotNull final HBox container) { public void reload() { super.reload(); - final Function function = getToStringFunction(); - - final Label propertyValueLabel = getPropertyValueLabel(); + var function = getToStringFunction(); + var propertyValueLabel = getPropertyValueLabel(); propertyValueLabel.setText(function == null ? String.valueOf(getPropertyValue()) : function.apply(getPropertyValue())); } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/DefaultSinglePropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/DefaultSinglePropertyControl.java index d9dd6c88..9cf091b9 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/DefaultSinglePropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/DefaultSinglePropertyControl.java @@ -17,14 +17,17 @@ */ public class DefaultSinglePropertyControl extends DefaultPropertyControl { - public DefaultSinglePropertyControl(@Nullable final T propertyValue, @NotNull final String propertyName, - @NotNull final C changeConsumer) { + public DefaultSinglePropertyControl( + @Nullable T propertyValue, + @NotNull String propertyName, + @NotNull C changeConsumer + ) { super(propertyValue, propertyName, changeConsumer); } @Override @FxThread - protected void createComponents(@NotNull final HBox container) { + protected void createComponents(@NotNull HBox container) { super.createComponents(container); getPropertyValueLabel().prefWidthProperty() .bind(widthProperty().multiply(CONTROL_WIDTH_PERCENT)); diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/DirectionLightPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/DirectionLightPropertyControl.java index 86a504ba..f9e626a5 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/DirectionLightPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/DirectionLightPropertyControl.java @@ -13,8 +13,11 @@ */ public class DirectionLightPropertyControl extends Vector3fPropertyControl { - public DirectionLightPropertyControl(@NotNull final Vector3f element, @NotNull final String paramName, - @NotNull final ModelChangeConsumer modelChangeConsumer) { + public DirectionLightPropertyControl( + @NotNull Vector3f element, + @NotNull String paramName, + @NotNull ModelChangeConsumer modelChangeConsumer + ) { super(element, paramName, modelChangeConsumer); } } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/ElementModelPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/ElementModelPropertyControl.java index 7b1ebfa5..14f9d24a 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/ElementModelPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/ElementModelPropertyControl.java @@ -14,28 +14,29 @@ */ public abstract class ElementModelPropertyControl extends ElementPropertyControl { - public ElementModelPropertyControl(@NotNull final Class type, @Nullable final T propertyValue, - @NotNull final String propertyName, - @NotNull final ModelChangeConsumer changeConsumer) { + public ElementModelPropertyControl( + @NotNull Class type, + @Nullable T propertyValue, + @NotNull String propertyName, + @NotNull ModelChangeConsumer changeConsumer + ) { super(type, propertyValue, propertyName, changeConsumer); } @Override @FxThread - protected void processAdd() { - final NodeSelectorDialog dialog = createNodeSelectorDialog(); - dialog.show(this); + protected void addElement() { + createNodeSelectorDialog().show(this); } /** * Create node selector dialog node selector dialog. * - * @return the node selector dialog + * @return the node selector dialog. */ @FxThread protected @NotNull NodeSelectorDialog createNodeSelectorDialog() { - final ModelChangeConsumer changeConsumer = getChangeConsumer(); - return new NodeSelectorDialog<>(changeConsumer.getCurrentModel(), type, this::processAdd); + return new NodeSelectorDialog<>(getChangeConsumer().getCurrentModel(), type, this::addElement); } /** @@ -44,7 +45,7 @@ protected void processAdd() { * @param newElement the new element. */ @FxThread - protected void processAdd(@NotNull final T newElement) { + protected void addElement(@NotNull T newElement) { changed(newElement, getPropertyValue()); } } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/ElementPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/ElementPropertyControl.java index 3ba4bacc..2adb2cef 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/ElementPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/ElementPropertyControl.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.property.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.Messages; import com.ss.editor.annotation.FxThread; import com.ss.editor.model.undo.editor.ChangeConsumer; @@ -8,7 +8,8 @@ import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.util.DynamicIconSupport; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.fx.util.FxUtils; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.image.ImageView; @@ -44,61 +45,63 @@ public class ElementPropertyControl extends Prop @Nullable private Label elementLabel; - public ElementPropertyControl(@NotNull final Class type, @Nullable final T propertyValue, - @NotNull final String propertyName, @NotNull final C changeConsumer) { + public ElementPropertyControl( + @NotNull Class type, + @Nullable T propertyValue, + @NotNull String propertyName, + @NotNull C changeConsumer + ) { super(propertyValue, propertyName, changeConsumer); this.type = type; } @Override @FxThread - protected void createComponents(@NotNull final HBox container) { + protected void createComponents(@NotNull HBox container) { super.createComponents(container); elementLabel = new Label(NO_ELEMENT); - elementLabel.prefWidthProperty().bind(container.widthProperty()); + elementLabel.prefWidthProperty() + .bind(container.widthProperty()); - final Button changeButton = new Button(); + var changeButton = new Button(); changeButton.setGraphic(new ImageView(Icons.ADD_16)); - changeButton.setOnAction(event -> processAdd()); + changeButton.setOnAction(event -> addElement()); - final Button editButton = new Button(); + var editButton = new Button(); editButton.setGraphic(new ImageView(Icons.REMOVE_12)); - editButton.disableProperty().bind(elementLabel.textProperty().isEqualTo(NO_ELEMENT)); - editButton.setOnAction(event -> processRemove()); + editButton.setOnAction(event -> removeElement()); + editButton.disableProperty() + .bind(elementLabel.textProperty().isEqualTo(NO_ELEMENT)); - FXUtils.addToPane(elementLabel, container); - FXUtils.addToPane(changeButton, container); - FXUtils.addToPane(editButton, container); - - FXUtils.addClassesTo(container, CssClasses.TEXT_INPUT_CONTAINER, - CssClasses.ABSTRACT_PARAM_CONTROL_INPUT_CONTAINER); - FXUtils.addClassTo(elementLabel, CssClasses.ABSTRACT_PARAM_CONTROL_ELEMENT_LABEL); - FXUtils.addClassesTo(changeButton, editButton, CssClasses.FLAT_BUTTON, - CssClasses.INPUT_CONTROL_TOOLBAR_BUTTON); + FxUtils.addChild(container, elementLabel, changeButton, editButton); + FxUtils.addClass(container, CssClasses.TEXT_INPUT_CONTAINER, CssClasses.ABSTRACT_PARAM_CONTROL_INPUT_CONTAINER) + .addClass(elementLabel, CssClasses.ABSTRACT_PARAM_CONTROL_ELEMENT_LABEL) + .addClass(changeButton, CssClasses.FLAT_BUTTON, CssClasses.INPUT_CONTROL_TOOLBAR_BUTTON) + .addClass(editButton, CssClasses.FLAT_BUTTON, CssClasses.INPUT_CONTROL_TOOLBAR_BUTTON); DynamicIconSupport.addSupport(changeButton, editButton); } /** - * Show dialog to choose an element. + * Show a dialog to choose an element. */ @FxThread - protected void processAdd() { + protected void addElement() { } /** - * Open this material in the material editor. + * Remove the current element. */ @FxThread - protected void processRemove() { + protected void removeElement() { changed(null, getPropertyValue()); } /** - * Gets element label. + * Get the element label. * - * @return the label with name of the material. + * @return the element label. */ @FxThread protected @NotNull Label getElementLabel() { diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/EnumPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/EnumPropertyControl.java index 7b0fb3e8..ef0a502d 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/EnumPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/EnumPropertyControl.java @@ -1,13 +1,13 @@ package com.ss.editor.ui.control.property.impl; import static com.ss.editor.util.EditorUtil.getAvailableValues; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.util.FxUtils; +import com.ss.rlib.fx.util.FxUtils; import javafx.scene.control.ComboBox; import javafx.scene.layout.HBox; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/FilterElementModelPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/FilterElementModelPropertyControl.java index 4bacf770..ca7d07e3 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/FilterElementModelPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/FilterElementModelPropertyControl.java @@ -17,23 +17,25 @@ */ public class FilterElementModelPropertyControl extends SceneElementPropertyControl { - public FilterElementModelPropertyControl(@Nullable final Filter propertyValue, @NotNull final String propertyName, - @NotNull final SceneChangeConsumer changeConsumer) { + public FilterElementModelPropertyControl( + @Nullable Filter propertyValue, + @NotNull String propertyName, + @NotNull SceneChangeConsumer changeConsumer + ) { super(Filter.class, propertyValue, propertyName, changeConsumer); } @Override @FxThread protected @NotNull SceneSelectorDialog createSceneSelectorDialog() { - final SceneChangeConsumer changeConsumer = getChangeConsumer(); - return new FilterSceneSelectorDialog(changeConsumer.getCurrentModel(), this::processAdd); + return new FilterSceneSelectorDialog(getChangeConsumer().getCurrentModel(), this::processAdd); } @Override @FxThread protected void reload() { - final Filter filter = getPropertyValue(); - final Label elementLabel = getElementLabel(); + var filter = getPropertyValue(); + var elementLabel = getElementLabel(); String name = filter == null ? null : filter.getName(); name = name == null && filter != null ? filter.getClass().getSimpleName() : name; elementLabel.setText(name == null ? NO_ELEMENT : name); diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/FloatArrayPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/FloatArrayPropertyControl.java index 6cc69b17..3ef04744 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/FloatArrayPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/FloatArrayPropertyControl.java @@ -3,14 +3,16 @@ import com.ss.editor.annotation.FxThread; import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.control.property.PropertyControl; -import com.ss.rlib.util.ArrayUtils; -import com.ss.rlib.util.StringUtils; +import com.ss.rlib.common.util.ArrayUtils; +import com.ss.rlib.common.util.StringUtils; import javafx.scene.control.TextField; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Arrays; + /** * The implementation of the {@link PropertyControl} to edit float array values. * @@ -42,10 +44,9 @@ public FloatArrayPropertyControl( @FxThread protected void reload() { - final float[] element = getPropertyValue(); - - final TextField valueField = getValueField(); - final int caretPosition = valueField.getCaretPosition(); + var element = getPropertyValue(); + var valueField = getValueField(); + var caretPosition = valueField.getCaretPosition(); if (element == null) { valueField.setText(StringUtils.EMPTY); @@ -59,7 +60,7 @@ protected void reload() { @Override @FxThread public boolean isDirty() { - return super.isDirty(); + return !Arrays.equals(getCurrentValue(), getPropertyValue()); } @Override @@ -74,6 +75,10 @@ protected void updateValue(@Nullable KeyEvent event) { @FxThread protected void apply() { super.apply(); + changed(getCurrentValue(), getPropertyValue()); + } + + private @Nullable float[] getCurrentValue() { var textValue = getValueField().getText(); @@ -97,6 +102,6 @@ protected void apply() { } } - changed(newValue, getPropertyValue()); + return newValue; } } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/FloatPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/FloatPropertyControl.java index a2528f59..2ae0ea52 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/FloatPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/FloatPropertyControl.java @@ -1,15 +1,17 @@ package com.ss.editor.ui.control.property.impl; -import static com.ss.rlib.util.NumberUtils.zeroIfNull; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.NumberUtils.zeroIfNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.control.input.FloatTextField; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.NumberUtils; +import com.ss.rlib.fx.control.input.FloatTextField; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.NumberUtils; +import com.ss.rlib.fx.util.FxControlUtils; +import com.ss.rlib.fx.util.FxUtils; import javafx.scene.layout.HBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -55,9 +57,8 @@ public FloatPropertyControl( public void changeControlWidthPercent(double controlWidthPercent) { super.changeControlWidthPercent(controlWidthPercent); - var valueField = getValueField(); - valueField.prefWidthProperty().unbind(); - valueField.prefWidthProperty().bind(widthProperty().multiply(controlWidthPercent)); + FxUtils.rebindPrefWidth(getValueField(), + widthProperty().multiply(controlWidthPercent)); } @Override @@ -66,12 +67,13 @@ protected void createComponents(@NotNull HBox container) { super.createComponents(container); valueField = new FloatTextField(); - valueField.addChangeListener((observable, oldValue, newValue) -> updateValue()); valueField.prefWidthProperty() .bind(widthProperty().multiply(CONTROL_WIDTH_PERCENT)); valueField.focusedProperty() .addListener((observable, oldValue, newValue) -> applyOnLostFocus(newValue)); + FxControlUtils.onValueChange(valueField, this::updateValue); + FXUtils.addClassTo(valueField, CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); FXUtils.addToPane(valueField, container); } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/IntArrayPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/IntArrayPropertyControl.java index 3a0594ef..45a171cb 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/IntArrayPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/IntArrayPropertyControl.java @@ -1,14 +1,14 @@ package com.ss.editor.ui.control.property.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.util.FxUtils; -import com.ss.rlib.util.ArrayUtils; -import com.ss.rlib.util.StringUtils; +import com.ss.rlib.fx.util.FxUtils; +import com.ss.rlib.common.util.ArrayUtils; +import com.ss.rlib.common.util.StringUtils; import javafx.scene.control.TextField; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/IntegerPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/IntegerPropertyControl.java index a41a4433..895097f8 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/IntegerPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/IntegerPropertyControl.java @@ -1,14 +1,14 @@ package com.ss.editor.ui.control.property.impl; -import static com.ss.rlib.util.NumberUtils.zeroIfNull; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.NumberUtils.zeroIfNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.control.input.IntegerTextField; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.control.input.IntegerTextField; +import com.ss.rlib.fx.util.FXUtils; import javafx.scene.layout.HBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -108,7 +108,7 @@ public void setScrollPower(int scrollPower) { */ @FxThread public int getScrollPower() { - return getValueField().getScrollPower(); + return (int) getValueField().getScrollPower(); } @Override diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/LayerModelPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/LayerModelPropertyControl.java index ddacce04..48e1725e 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/LayerModelPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/LayerModelPropertyControl.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.property.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.scene.Spatial; import com.ss.editor.Messages; import com.ss.editor.annotation.FromAnyThread; @@ -13,7 +13,7 @@ import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.control.property.operation.PropertyOperation; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.util.FxUtils; +import com.ss.rlib.fx.util.FxUtils; import javafx.scene.control.ComboBox; import javafx.scene.control.ListCell; import javafx.scene.layout.HBox; diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/LightElementModelPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/LightElementModelPropertyControl.java index c35c999c..b8c56c8b 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/LightElementModelPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/LightElementModelPropertyControl.java @@ -27,7 +27,7 @@ public LightElementModelPropertyControl(@NotNull final Class type, @Nullable @FxThread protected @NotNull NodeSelectorDialog createNodeSelectorDialog() { final ModelChangeConsumer changeConsumer = getChangeConsumer(); - return new LightSelectorDialog<>(changeConsumer.getCurrentModel(), type, this::processAdd); + return new LightSelectorDialog<>(changeConsumer.getCurrentModel(), type, this::addElement); } @Override diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/LodLevelPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/LodLevelPropertyControl.java index 9d3e34e3..a58a36d9 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/LodLevelPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/LodLevelPropertyControl.java @@ -9,8 +9,8 @@ import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.ObjectUtils; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.ObjectUtils; import javafx.collections.ObservableList; import javafx.scene.control.ComboBox; import javafx.scene.control.ListCell; diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/MaterialKeyPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/MaterialKeyPropertyControl.java index 2e50450a..bb08d92e 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/MaterialKeyPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/MaterialKeyPropertyControl.java @@ -1,13 +1,13 @@ package com.ss.editor.ui.control.property.impl; import static com.ss.editor.util.EditorUtil.*; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.asset.MaterialKey; import com.ss.editor.annotation.FxThread; import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.event.impl.RequestedOpenFileEvent; import com.ss.editor.ui.util.UiUtils; -import com.ss.rlib.util.StringUtils; +import com.ss.rlib.common.util.StringUtils; import javafx.scene.control.Label; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/MaterialPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/MaterialPropertyControl.java index 721cee8e..63d07c36 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/MaterialPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/MaterialPropertyControl.java @@ -1,7 +1,7 @@ package com.ss.editor.ui.control.property.impl; -import static com.ss.rlib.util.ClassUtils.unsafeCast; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ClassUtils.unsafeCast; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.material.Material; import com.jme3.scene.Spatial; import com.ss.editor.FileExtensions; @@ -12,9 +12,9 @@ import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.util.DynamicIconSupport; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.image.ImageView; diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/QuaternionPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/QuaternionPropertyControl.java index 085c46b7..f85e8f8b 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/QuaternionPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/QuaternionPropertyControl.java @@ -1,17 +1,17 @@ package com.ss.editor.ui.control.property.impl; -import static com.ss.rlib.geom.util.AngleUtils.degreeToRadians; -import static com.ss.rlib.geom.util.AngleUtils.radiansToDegree; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.geom.util.AngleUtils.degreeToRadians; +import static com.ss.rlib.common.geom.util.AngleUtils.radiansToDegree; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.math.Quaternion; import com.ss.editor.annotation.FxThread; import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.util.UiUtils; -import com.ss.rlib.ui.control.input.FloatTextField; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.fx.control.input.FloatTextField; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.control.Label; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/SceneElementPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/SceneElementPropertyControl.java index c0dbfb1d..cae68a68 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/SceneElementPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/SceneElementPropertyControl.java @@ -22,7 +22,7 @@ public SceneElementPropertyControl(@NotNull final Class type, @Nullable final @Override @FxThread - protected void processAdd() { + protected void addElement() { final SceneSelectorDialog dialog = createSceneSelectorDialog(); dialog.show(this); } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/SpatialElementModelPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/SpatialElementModelPropertyControl.java index 54a821dc..3dc396ad 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/SpatialElementModelPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/SpatialElementModelPropertyControl.java @@ -27,7 +27,7 @@ public SpatialElementModelPropertyControl(@NotNull Class type, @Nullable fina @FxThread protected @NotNull NodeSelectorDialog createNodeSelectorDialog() { final ModelChangeConsumer changeConsumer = getChangeConsumer(); - return new SpatialSelectorDialog<>(changeConsumer.getCurrentModel(), type, this::processAdd); + return new SpatialSelectorDialog<>(changeConsumer.getCurrentModel(), type, this::addElement); } @Override diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/StringBasedArrayPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/StringBasedArrayPropertyControl.java index 562cdd6a..b82145bb 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/StringBasedArrayPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/StringBasedArrayPropertyControl.java @@ -1,12 +1,12 @@ package com.ss.editor.ui.control.property.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.util.FxUtils; +import com.ss.rlib.fx.util.FxUtils; import javafx.scene.control.TextField; import javafx.scene.input.KeyEvent; import javafx.scene.layout.HBox; diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/StringPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/StringPropertyControl.java index 9a9ea651..0834332b 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/StringPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/StringPropertyControl.java @@ -1,14 +1,14 @@ package com.ss.editor.ui.control.property.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; -import static com.ss.rlib.util.StringUtils.emptyIfNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.StringUtils.emptyIfNull; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.util.FxUtils; -import com.ss.rlib.util.StringUtils; +import com.ss.rlib.fx.util.FxUtils; +import com.ss.rlib.common.util.StringUtils; import javafx.scene.control.TextField; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/Texture2DPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/Texture2DPropertyControl.java index cbd9ff5d..69cb84f9 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/Texture2DPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/Texture2DPropertyControl.java @@ -4,7 +4,7 @@ import static com.ss.editor.config.DefaultSettingsProvider.Defaults.PREF_DEFAULT_FLIPPED_TEXTURES; import static com.ss.editor.config.DefaultSettingsProvider.Preferences.PREF_FLIPPED_TEXTURES; import static com.ss.editor.util.EditorUtil.*; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.asset.AssetKey; import com.jme3.asset.AssetManager; import com.jme3.asset.TextureKey; @@ -23,10 +23,10 @@ import com.ss.editor.ui.tooltip.ImageChannelPreview; import com.ss.editor.ui.util.UiUtils; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.VarTable; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.beans.binding.BooleanBinding; import javafx.scene.control.Button; import javafx.scene.control.Label; diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/Vector2fPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/Vector2fPropertyControl.java index 3083e8ca..28f9fe7a 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/Vector2fPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/Vector2fPropertyControl.java @@ -1,7 +1,7 @@ package com.ss.editor.ui.control.property.impl; import static com.ss.editor.util.GeomUtils.zeroIfNull; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.math.Vector2f; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; @@ -10,8 +10,8 @@ import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.util.UiUtils; import com.ss.editor.util.GeomUtils; -import com.ss.rlib.ui.control.input.FloatTextField; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.control.input.FloatTextField; +import com.ss.rlib.fx.util.FXUtils; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import javafx.scene.layout.HBox; diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/Vector3fPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/Vector3fPropertyControl.java index 209613ed..26753895 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/Vector3fPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/Vector3fPropertyControl.java @@ -1,7 +1,7 @@ package com.ss.editor.ui.control.property.impl; import static com.ss.editor.util.GeomUtils.zeroIfNull; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.math.Vector3f; import com.ss.editor.annotation.FxThread; import com.ss.editor.model.undo.editor.ChangeConsumer; @@ -9,8 +9,8 @@ import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.util.UiUtils; import com.ss.editor.util.GeomUtils; -import com.ss.rlib.ui.control.input.FloatTextField; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.control.input.FloatTextField; +import com.ss.rlib.fx.util.FXUtils; import javafx.scene.control.Label; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/Vector3fSingleRowPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/Vector3fSingleRowPropertyControl.java index ef63821b..a0332d38 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/Vector3fSingleRowPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/Vector3fSingleRowPropertyControl.java @@ -1,7 +1,7 @@ package com.ss.editor.ui.control.property.impl; import static com.ss.editor.util.GeomUtils.zeroIfNull; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.math.Vector3f; import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; @@ -10,8 +10,8 @@ import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.util.UiUtils; import com.ss.editor.util.GeomUtils; -import com.ss.rlib.ui.control.input.FloatTextField; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.control.input.FloatTextField; +import com.ss.rlib.fx.util.FXUtils; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import javafx.scene.layout.HBox; diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/WheelElementModelPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/WheelElementModelPropertyControl.java index 3f15790b..ca29a3a6 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/WheelElementModelPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/WheelElementModelPropertyControl.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.property.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.bullet.control.VehicleControl; import com.jme3.bullet.objects.VehicleWheel; import com.jme3.scene.Spatial; @@ -33,7 +33,7 @@ public WheelElementModelPropertyControl( var changeConsumer = getChangeConsumer(); var currentModel = changeConsumer.getCurrentModel(); var root = NodeUtils.findSpatial(currentModel, this::checkSpatial); - return new NodeSelectorDialog<>(notNull(root), type, this::processAdd); + return new NodeSelectorDialog<>(notNull(root), type, this::addElement); } /** diff --git a/src/main/java/com/ss/editor/ui/control/scene/SceneNodeTree.java b/src/main/java/com/ss/editor/ui/control/scene/SceneNodeTree.java index 170aaffa..b5f0634b 100644 --- a/src/main/java/com/ss/editor/ui/control/scene/SceneNodeTree.java +++ b/src/main/java/com/ss/editor/ui/control/scene/SceneNodeTree.java @@ -2,7 +2,7 @@ import com.ss.editor.model.undo.editor.SceneChangeConsumer; import com.ss.editor.ui.control.tree.NodeTree; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.util.array.Array; import javafx.scene.control.SelectionMode; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/tree/NodeTree.java b/src/main/java/com/ss/editor/ui/control/tree/NodeTree.java index 6c474f60..20a73b48 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/NodeTree.java +++ b/src/main/java/com/ss/editor/ui/control/tree/NodeTree.java @@ -1,7 +1,7 @@ package com.ss.editor.ui.control.tree; import static com.ss.editor.ui.util.UiUtils.findItemForValue; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FxThread; import com.ss.editor.manager.ExecutorManager; import com.ss.editor.model.undo.editor.ChangeConsumer; @@ -9,11 +9,11 @@ import com.ss.editor.ui.control.tree.node.factory.TreeNodeFactoryRegistry; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.util.LocalObjects; -import com.ss.rlib.function.TripleConsumer; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayCollectors; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.function.TripleConsumer; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayCollectors; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.beans.value.ObservableValue; import javafx.collections.ObservableList; import javafx.scene.control.*; diff --git a/src/main/java/com/ss/editor/ui/control/tree/NodeTreeCell.java b/src/main/java/com/ss/editor/ui/control/tree/NodeTreeCell.java index 0bb3a203..8f92d8cf 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/NodeTreeCell.java +++ b/src/main/java/com/ss/editor/ui/control/tree/NodeTreeCell.java @@ -2,8 +2,8 @@ import static com.ss.editor.ui.util.UiUtils.findItem; import static com.ss.editor.ui.util.UiUtils.findItemForValue; -import static com.ss.rlib.util.ClassUtils.unsafeCast; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ClassUtils.unsafeCast; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FxThread; import com.ss.editor.manager.ExecutorManager; import com.ss.editor.model.undo.editor.ChangeConsumer; @@ -13,8 +13,8 @@ import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.util.DynamicIconSupport; import com.ss.editor.ui.util.UiUtils; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.StringUtils; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.StringUtils; import javafx.beans.property.BooleanProperty; import javafx.beans.property.BooleanPropertyBase; import javafx.css.PseudoClass; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/AbstractNodeAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/AbstractNodeAction.java index cd9cb88d..ce54e05a 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/AbstractNodeAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/AbstractNodeAction.java @@ -1,7 +1,7 @@ package com.ss.editor.ui.control.tree.action; -import static com.ss.rlib.util.ClassUtils.unsafeCast; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ClassUtils.unsafeCast; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.analytics.google.GAEvent; import com.ss.editor.analytics.google.GAnalytics; import com.ss.editor.annotation.FxThread; @@ -9,10 +9,10 @@ import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.control.tree.NodeTree; import com.ss.editor.ui.control.tree.node.TreeNode; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerManager; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.control.MenuItem; import javafx.scene.image.Image; import javafx.scene.image.ImageView; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/AddUserDataAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/AddUserDataAction.java index c44f453e..45c7cb23 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/AddUserDataAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/AddUserDataAction.java @@ -2,7 +2,7 @@ import static com.ss.editor.extension.property.EditablePropertyType.ENUM; import static com.ss.editor.extension.property.EditablePropertyType.STRING; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.math.ColorRGBA; import com.jme3.math.Vector2f; import com.jme3.math.Vector3f; @@ -18,10 +18,10 @@ import com.ss.editor.ui.control.tree.NodeTree; import com.ss.editor.ui.control.tree.action.AbstractNodeAction; import com.ss.editor.ui.control.tree.node.TreeNode; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.VarTable; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/CreateNodeAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/CreateNodeAction.java index aa4d023e..c6cad750 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/CreateNodeAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/CreateNodeAction.java @@ -1,7 +1,7 @@ package com.ss.editor.ui.control.tree.action.impl; import static com.ss.editor.util.EditorUtil.getDefaultLayer; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.scene.Node; import com.ss.editor.Messages; import com.ss.editor.annotation.FxThread; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/DisableAllControlsAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/DisableAllControlsAction.java index e2ab3da9..fc09fce6 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/DisableAllControlsAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/DisableAllControlsAction.java @@ -1,7 +1,7 @@ package com.ss.editor.ui.control.tree.action.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; -import static com.ss.rlib.util.array.ArrayCollectors.toArray; +import static com.ss.rlib.common.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.array.ArrayCollectors.toArray; import com.jme3.scene.Spatial; import com.jme3.scene.control.Control; import com.ss.editor.Messages; @@ -14,7 +14,7 @@ import com.ss.editor.ui.control.tree.node.TreeNode; import com.ss.editor.util.ControlUtils; import com.ss.editor.util.NodeUtils; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.util.array.Array; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/EnableAllControlsAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/EnableAllControlsAction.java index 6d8ee425..a24d0936 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/EnableAllControlsAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/EnableAllControlsAction.java @@ -1,7 +1,7 @@ package com.ss.editor.ui.control.tree.action.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; -import static com.ss.rlib.util.array.ArrayCollectors.toArray; +import static com.ss.rlib.common.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.array.ArrayCollectors.toArray; import com.jme3.scene.Spatial; import com.jme3.scene.control.Control; import com.ss.editor.Messages; @@ -14,7 +14,7 @@ import com.ss.editor.ui.control.tree.node.TreeNode; import com.ss.editor.util.ControlUtils; import com.ss.editor.util.NodeUtils; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.util.array.Array; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/LinkModelAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/LinkModelAction.java index f48fb56e..065bf0dd 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/LinkModelAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/LinkModelAction.java @@ -3,7 +3,7 @@ import static com.ss.editor.part3d.editor.impl.scene.AbstractSceneEditor3DPart.KEY_LOADED_MODEL; import static com.ss.editor.util.EditorUtil.getAssetFile; import static com.ss.editor.util.EditorUtil.toAssetPath; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.asset.AssetManager; import com.jme3.asset.ModelKey; import com.jme3.scene.AssetLinkNode; @@ -25,8 +25,8 @@ import com.ss.editor.ui.control.tree.node.TreeNode; import com.ss.editor.ui.util.UiUtils; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/LoadModelAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/LoadModelAction.java index c227b869..2f27d980 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/LoadModelAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/LoadModelAction.java @@ -2,7 +2,7 @@ import static com.ss.editor.part3d.editor.impl.scene.AbstractSceneEditor3DPart.KEY_LOADED_MODEL; import static com.ss.editor.util.EditorUtil.*; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.asset.AssetManager; import com.jme3.asset.ModelKey; import com.jme3.scene.Node; @@ -23,8 +23,8 @@ import com.ss.editor.ui.control.tree.node.TreeNode; import com.ss.editor.ui.util.UiUtils; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/MakeAsEmbeddedMaterialAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/MakeAsEmbeddedMaterialAction.java index 586cc6bc..839b90f4 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/MakeAsEmbeddedMaterialAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/MakeAsEmbeddedMaterialAction.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.tree.action.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.asset.AssetKey; import com.jme3.material.Material; import com.ss.editor.Messages; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/OptimizeGeometryAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/OptimizeGeometryAction.java index 37847e12..8fe4747d 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/OptimizeGeometryAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/OptimizeGeometryAction.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.tree.action.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.scene.Node; import com.ss.editor.Messages; import com.ss.editor.annotation.FxThread; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/PasteNodeAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/PasteNodeAction.java index e51cb7f9..b13a4c52 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/PasteNodeAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/PasteNodeAction.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.tree.action.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.Messages; import com.ss.editor.annotation.FxThread; import com.ss.editor.model.undo.editor.ModelChangeConsumer; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/RemoveControlAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/RemoveControlAction.java index 503ebb6e..42f94151 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/RemoveControlAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/RemoveControlAction.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.tree.action.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.scene.Spatial; import com.jme3.scene.control.Control; import com.ss.editor.Messages; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/RemoveLightAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/RemoveLightAction.java index 27d4006f..17a07391 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/RemoveLightAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/RemoveLightAction.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.tree.action.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.light.Light; import com.jme3.scene.Node; import com.ss.editor.Messages; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/RemoveNodeAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/RemoveNodeAction.java index 0644769e..c0ef1371 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/RemoveNodeAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/RemoveNodeAction.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.tree.action.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.scene.Spatial; import com.ss.editor.Messages; import com.ss.editor.annotation.FxThread; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/SaveAsMaterialAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/SaveAsMaterialAction.java index ee69b8fc..4d588e15 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/SaveAsMaterialAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/SaveAsMaterialAction.java @@ -2,7 +2,7 @@ import static com.ss.editor.util.EditorUtil.getAssetFile; import static com.ss.editor.util.EditorUtil.toAssetPath; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import static java.nio.file.StandardOpenOption.*; import com.jme3.asset.AssetKey; import com.jme3.asset.AssetManager; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/animation/PlayAnimationAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/animation/PlayAnimationAction.java index d9eb1d3a..92d2bcb5 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/animation/PlayAnimationAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/animation/PlayAnimationAction.java @@ -11,7 +11,7 @@ import com.ss.editor.ui.control.tree.NodeTree; import com.ss.editor.ui.control.tree.action.AbstractNodeAction; import com.ss.editor.ui.control.tree.node.TreeNode; -import com.ss.rlib.util.StringUtils; +import com.ss.rlib.common.util.StringUtils; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/animation/PlaySettingsAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/animation/PlaySettingsAction.java index 948a1692..6ca266c3 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/animation/PlaySettingsAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/animation/PlaySettingsAction.java @@ -12,8 +12,8 @@ import com.ss.editor.ui.control.tree.node.impl.control.anim.AnimationControlTreeNode; import com.ss.editor.ui.control.tree.action.AbstractNodeAction; import com.ss.editor.ui.control.tree.NodeTree; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/animation/RemoveAnimationAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/animation/RemoveAnimationAction.java index 6e1dbe5c..6760d9fa 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/animation/RemoveAnimationAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/animation/RemoveAnimationAction.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.tree.action.impl.animation; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.animation.AnimControl; import com.jme3.animation.Animation; import com.ss.editor.Messages; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/audio/CreateAudioNodeAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/audio/CreateAudioNodeAction.java index dc7b23d8..a27293fc 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/audio/CreateAudioNodeAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/audio/CreateAudioNodeAction.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.tree.action.impl.audio; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.audio.AudioNode; import com.jme3.scene.Node; import com.ss.editor.Messages; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/control/AbstractCreateControlAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/control/AbstractCreateControlAction.java index fe47c72b..84da4962 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/control/AbstractCreateControlAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/control/AbstractCreateControlAction.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.tree.action.impl.control; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.scene.Spatial; import com.jme3.scene.control.Control; import com.ss.editor.annotation.FxThread; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/control/CreateCustomControlAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/control/CreateCustomControlAction.java index 9461bbe6..03d93ed7 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/control/CreateCustomControlAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/control/CreateCustomControlAction.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.tree.action.impl.control; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.scene.Spatial; import com.jme3.scene.control.Control; import com.ss.editor.Messages; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/control/physics/CreateCharacterControlAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/control/physics/CreateCharacterControlAction.java index 0dad78cc..69a6a549 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/control/physics/CreateCharacterControlAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/control/physics/CreateCharacterControlAction.java @@ -1,7 +1,7 @@ package com.ss.editor.ui.control.tree.action.impl.control.physics; import static com.ss.editor.extension.property.EditablePropertyType.FLOAT; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.bullet.control.BetterCharacterControl; import com.jme3.bullet.control.CharacterControl; import com.jme3.scene.Spatial; @@ -15,8 +15,8 @@ import com.ss.editor.ui.control.tree.NodeTree; import com.ss.editor.ui.control.tree.action.impl.control.AbstractCreateControlAction; import com.ss.editor.ui.control.tree.node.TreeNode; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/control/physics/vehicle/CreateVehicleWheelAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/control/physics/vehicle/CreateVehicleWheelAction.java index 69c49c2b..b83e8673 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/control/physics/vehicle/CreateVehicleWheelAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/control/physics/vehicle/CreateVehicleWheelAction.java @@ -1,7 +1,7 @@ package com.ss.editor.ui.control.tree.action.impl.control.physics.vehicle; import static com.ss.editor.extension.property.EditablePropertyType.*; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.bullet.control.VehicleControl; import com.jme3.bullet.objects.VehicleWheel; import com.jme3.math.Vector3f; @@ -16,9 +16,9 @@ import com.ss.editor.model.undo.impl.AddVehicleWheelOperation; import com.ss.editor.ui.control.tree.NodeTree; import com.ss.editor.ui.control.tree.node.TreeNode; -import com.ss.rlib.util.VarTable; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/control/physics/vehicle/RemoveVehicleWheelAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/control/physics/vehicle/RemoveVehicleWheelAction.java index ce9ce8c6..b89e6e04 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/control/physics/vehicle/RemoveVehicleWheelAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/control/physics/vehicle/RemoveVehicleWheelAction.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.tree.action.impl.control.physics.vehicle; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.bullet.control.VehicleControl; import com.jme3.bullet.objects.VehicleWheel; import com.ss.editor.Messages; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/geometry/AbstractCreateGeometryAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/geometry/AbstractCreateGeometryAction.java index 84a00b7a..8a553fd0 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/geometry/AbstractCreateGeometryAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/geometry/AbstractCreateGeometryAction.java @@ -1,7 +1,7 @@ package com.ss.editor.ui.control.tree.action.impl.geometry; import static com.ss.editor.util.EditorUtil.getDefaultLayer; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.asset.AssetManager; import com.jme3.material.Material; import com.jme3.scene.Geometry; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/geometry/GenerateLoDAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/geometry/GenerateLoDAction.java index 57274a9e..6a7d4643 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/geometry/GenerateLoDAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/geometry/GenerateLoDAction.java @@ -10,7 +10,7 @@ import com.ss.editor.ui.dialog.geometry.lod.GenerateLodLevelsDialog; import com.ss.editor.ui.control.tree.NodeTree; import com.ss.editor.ui.control.tree.node.TreeNode; -import com.ss.rlib.util.ClassUtils; +import com.ss.rlib.common.util.ClassUtils; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/light/AbstractCreateLightAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/light/AbstractCreateLightAction.java index a59c33c8..f61368a0 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/light/AbstractCreateLightAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/light/AbstractCreateLightAction.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.tree.action.impl.light; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.light.Light; import com.jme3.scene.Node; import com.ss.editor.annotation.FxThread; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/multi/RemoveElementsAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/multi/RemoveElementsAction.java index aedecfc5..b67c89b4 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/multi/RemoveElementsAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/multi/RemoveElementsAction.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.tree.action.impl.multi; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.Messages; import com.ss.editor.annotation.FxThread; import com.ss.editor.model.undo.editor.ChangeConsumer; @@ -15,10 +15,10 @@ import com.ss.editor.ui.control.tree.node.impl.control.anim.AnimationTreeNode; import com.ss.editor.ui.control.tree.node.impl.light.LightTreeNode; import com.ss.editor.ui.control.tree.node.impl.spatial.SpatialTreeNode; -import com.ss.rlib.function.TripleConsumer; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayCollectors; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.function.TripleConsumer; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayCollectors; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.control.MenuItem; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/particle/emitter/CreateParticleEmitterAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/particle/emitter/CreateParticleEmitterAction.java index 9914118e..00006d1a 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/particle/emitter/CreateParticleEmitterAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/particle/emitter/CreateParticleEmitterAction.java @@ -1,7 +1,7 @@ package com.ss.editor.ui.control.tree.action.impl.particle.emitter; import static com.ss.editor.util.EditorUtil.getDefaultLayer; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.asset.AssetManager; import com.jme3.effect.ParticleEmitter; import com.jme3.effect.ParticleMesh; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/particle/emitter/ResetParticleEmittersAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/particle/emitter/ResetParticleEmittersAction.java index f377e47b..55593102 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/particle/emitter/ResetParticleEmittersAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/particle/emitter/ResetParticleEmittersAction.java @@ -10,8 +10,8 @@ import com.ss.editor.ui.control.tree.NodeTree; import com.ss.editor.ui.control.tree.action.AbstractNodeAction; import com.ss.editor.ui.control.tree.node.TreeNode; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/particle/emitter/influencer/AbstractCreateParticleInfluencerAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/particle/emitter/influencer/AbstractCreateParticleInfluencerAction.java index 75e3e1e9..4be166b5 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/particle/emitter/influencer/AbstractCreateParticleInfluencerAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/particle/emitter/influencer/AbstractCreateParticleInfluencerAction.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.tree.action.impl.particle.emitter.influencer; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.effect.ParticleEmitter; import com.jme3.effect.influencers.ParticleInfluencer; import com.ss.editor.annotation.FxThread; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/particle/emitter/shape/AbstractCreateShapeEmitterAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/particle/emitter/shape/AbstractCreateShapeEmitterAction.java index ae06bbcf..321ed491 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/particle/emitter/shape/AbstractCreateShapeEmitterAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/particle/emitter/shape/AbstractCreateShapeEmitterAction.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.tree.action.impl.particle.emitter.shape; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.effect.ParticleEmitter; import com.jme3.effect.shapes.EmitterShape; import com.ss.editor.annotation.FxThread; @@ -13,8 +13,8 @@ import com.ss.editor.ui.control.tree.NodeTree; import com.ss.editor.ui.control.tree.action.AbstractNodeAction; import com.ss.editor.ui.control.tree.node.TreeNode; -import com.ss.rlib.util.VarTable; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.common.util.array.Array; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/particle/emitter/shape/CreateBoxShapeEmitterAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/particle/emitter/shape/CreateBoxShapeEmitterAction.java index 5f1ef153..10579d71 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/particle/emitter/shape/CreateBoxShapeEmitterAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/particle/emitter/shape/CreateBoxShapeEmitterAction.java @@ -11,9 +11,9 @@ import com.ss.editor.ui.control.tree.NodeTree; import com.ss.editor.ui.control.tree.node.TreeNode; import com.ss.editor.plugin.api.property.PropertyDefinition; -import com.ss.rlib.util.VarTable; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/particle/emitter/shape/CreateMeshVertexShapeEmitterAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/particle/emitter/shape/CreateMeshVertexShapeEmitterAction.java index 2762f774..90db14d5 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/particle/emitter/shape/CreateMeshVertexShapeEmitterAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/particle/emitter/shape/CreateMeshVertexShapeEmitterAction.java @@ -13,9 +13,9 @@ import com.ss.editor.ui.Icons; import com.ss.editor.ui.control.tree.NodeTree; import com.ss.editor.ui.control.tree.node.TreeNode; -import com.ss.rlib.util.VarTable; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/particle/emitter/shape/CreatePointShapeEmitterAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/particle/emitter/shape/CreatePointShapeEmitterAction.java index 5509b99e..e647b481 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/particle/emitter/shape/CreatePointShapeEmitterAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/particle/emitter/shape/CreatePointShapeEmitterAction.java @@ -11,9 +11,9 @@ import com.ss.editor.ui.Icons; import com.ss.editor.ui.control.tree.NodeTree; import com.ss.editor.ui.control.tree.node.TreeNode; -import com.ss.rlib.util.VarTable; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/particle/emitter/shape/CreateSphereShapeEmitterAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/particle/emitter/shape/CreateSphereShapeEmitterAction.java index d475a5ce..aba170d1 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/particle/emitter/shape/CreateSphereShapeEmitterAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/particle/emitter/shape/CreateSphereShapeEmitterAction.java @@ -12,9 +12,9 @@ import com.ss.editor.ui.Icons; import com.ss.editor.ui.control.tree.NodeTree; import com.ss.editor.ui.control.tree.node.TreeNode; -import com.ss.rlib.util.VarTable; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/physics/shape/AbstractCreateShapeAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/physics/shape/AbstractCreateShapeAction.java index 4dbd0978..da69e460 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/physics/shape/AbstractCreateShapeAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/physics/shape/AbstractCreateShapeAction.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.tree.action.impl.physics.shape; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.bullet.collision.PhysicsCollisionObject; import com.jme3.bullet.collision.shapes.CollisionShape; import com.ss.editor.annotation.FxThread; @@ -13,8 +13,8 @@ import com.ss.editor.ui.control.tree.NodeTree; import com.ss.editor.ui.control.tree.action.AbstractNodeAction; import com.ss.editor.ui.control.tree.node.TreeNode; -import com.ss.rlib.util.VarTable; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.common.util.array.Array; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/physics/shape/CreateBoxCollisionShapeAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/physics/shape/CreateBoxCollisionShapeAction.java index babfea5c..947b99af 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/physics/shape/CreateBoxCollisionShapeAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/physics/shape/CreateBoxCollisionShapeAction.java @@ -9,9 +9,9 @@ import com.ss.editor.ui.control.tree.NodeTree; import com.ss.editor.ui.control.tree.node.TreeNode; import com.ss.editor.plugin.api.property.PropertyDefinition; -import com.ss.rlib.util.VarTable; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; /** diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/physics/shape/CreateCapsuleCollisionShapeAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/physics/shape/CreateCapsuleCollisionShapeAction.java index 4da72ab7..671f2d1d 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/physics/shape/CreateCapsuleCollisionShapeAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/physics/shape/CreateCapsuleCollisionShapeAction.java @@ -9,9 +9,9 @@ import com.ss.editor.ui.control.tree.NodeTree; import com.ss.editor.ui.control.tree.node.TreeNode; import com.ss.editor.plugin.api.property.PropertyDefinition; -import com.ss.rlib.util.VarTable; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/physics/shape/CreateConeCollisionShapeAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/physics/shape/CreateConeCollisionShapeAction.java index 75c15c0f..34a60478 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/physics/shape/CreateConeCollisionShapeAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/physics/shape/CreateConeCollisionShapeAction.java @@ -10,9 +10,9 @@ import com.ss.editor.ui.Icons; import com.ss.editor.ui.control.tree.NodeTree; import com.ss.editor.ui.control.tree.node.TreeNode; -import com.ss.rlib.util.VarTable; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/physics/shape/CreateCylinderCollisionShapeAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/physics/shape/CreateCylinderCollisionShapeAction.java index d6da6ae7..034c0518 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/physics/shape/CreateCylinderCollisionShapeAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/physics/shape/CreateCylinderCollisionShapeAction.java @@ -12,9 +12,9 @@ import com.ss.editor.ui.control.tree.action.impl.physics.shape.CreateConeCollisionShapeAction.Axis; import com.ss.editor.ui.control.tree.NodeTree; import com.ss.editor.ui.control.tree.node.TreeNode; -import com.ss.rlib.util.VarTable; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/physics/shape/CreateSphereCollisionShapeAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/physics/shape/CreateSphereCollisionShapeAction.java index dc9a3a35..316607d8 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/physics/shape/CreateSphereCollisionShapeAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/physics/shape/CreateSphereCollisionShapeAction.java @@ -9,9 +9,9 @@ import com.ss.editor.ui.Icons; import com.ss.editor.ui.control.tree.NodeTree; import com.ss.editor.ui.control.tree.node.TreeNode; -import com.ss.rlib.util.VarTable; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/physics/shape/GenerateCollisionShapeAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/physics/shape/GenerateCollisionShapeAction.java index abf7b77b..9f19a382 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/physics/shape/GenerateCollisionShapeAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/physics/shape/GenerateCollisionShapeAction.java @@ -2,7 +2,7 @@ import static com.jme3.bullet.util.CollisionShapeFactory.createDynamicMeshShape; import static com.jme3.bullet.util.CollisionShapeFactory.createMeshShape; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.bullet.collision.PhysicsCollisionObject; import com.jme3.bullet.collision.shapes.BoxCollisionShape; import com.jme3.bullet.collision.shapes.CollisionShape; @@ -22,9 +22,9 @@ import com.ss.editor.model.undo.impl.ChangeCollisionShapeOperation; import com.ss.editor.ui.control.tree.NodeTree; import com.ss.editor.ui.control.tree.node.TreeNode; -import com.ss.rlib.util.VarTable; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/tree/action/impl/scene/RemoveSceneLayerAction.java b/src/main/java/com/ss/editor/ui/control/tree/action/impl/scene/RemoveSceneLayerAction.java index bd93f13e..c339d43a 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/action/impl/scene/RemoveSceneLayerAction.java +++ b/src/main/java/com/ss/editor/ui/control/tree/action/impl/scene/RemoveSceneLayerAction.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.tree.action.impl.scene; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.Messages; import com.ss.editor.annotation.FxThread; import com.ss.editor.extension.scene.SceneLayer; diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/TreeNode.java b/src/main/java/com/ss/editor/ui/control/tree/node/TreeNode.java index f301515f..e2a86af7 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/TreeNode.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/TreeNode.java @@ -12,8 +12,8 @@ import com.ss.editor.ui.control.tree.action.AbstractNodeAction; import com.ss.editor.ui.control.tree.node.factory.TreeNodeFactoryRegistry; import com.ss.editor.ui.util.UiUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.collections.ObservableList; import javafx.scene.control.Menu; import javafx.scene.control.MenuItem; diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/factory/TreeNodeFactoryRegistry.java b/src/main/java/com/ss/editor/ui/control/tree/node/factory/TreeNodeFactoryRegistry.java index 846de224..0fe06f9f 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/factory/TreeNodeFactoryRegistry.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/factory/TreeNodeFactoryRegistry.java @@ -1,12 +1,12 @@ package com.ss.editor.ui.control.tree.node.factory; -import static com.ss.rlib.util.ClassUtils.unsafeCast; +import static com.ss.rlib.common.util.ClassUtils.unsafeCast; import com.ss.editor.annotation.FxThread; import com.ss.editor.ui.control.tree.node.factory.impl.MaterialSettingsTreeNodeFactory; import com.ss.editor.ui.control.tree.node.TreeNode; import com.ss.editor.ui.control.tree.node.factory.impl.*; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/factory/impl/AnimationTreeNodeFactory.java b/src/main/java/com/ss/editor/ui/control/tree/node/factory/impl/AnimationTreeNodeFactory.java index 76e735e4..c4cd9ee8 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/factory/impl/AnimationTreeNodeFactory.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/factory/impl/AnimationTreeNodeFactory.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.tree.node.factory.impl; -import static com.ss.rlib.util.ClassUtils.unsafeCast; +import static com.ss.rlib.common.util.ClassUtils.unsafeCast; import com.jme3.animation.*; import com.ss.editor.annotation.FxThread; import com.ss.editor.ui.control.tree.node.impl.control.anim.*; diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/factory/impl/CollisionTreeNodeFactory.java b/src/main/java/com/ss/editor/ui/control/tree/node/factory/impl/CollisionTreeNodeFactory.java index 0ba756a8..830c6db5 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/factory/impl/CollisionTreeNodeFactory.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/factory/impl/CollisionTreeNodeFactory.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.tree.node.factory.impl; -import static com.ss.rlib.util.ClassUtils.unsafeCast; +import static com.ss.rlib.common.util.ClassUtils.unsafeCast; import com.jme3.bullet.collision.shapes.*; import com.jme3.bullet.collision.shapes.infos.ChildCollisionShape; import com.ss.editor.annotation.FxThread; diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/factory/impl/ControlTreeNodeFactory.java b/src/main/java/com/ss/editor/ui/control/tree/node/factory/impl/ControlTreeNodeFactory.java index c68571b9..94e14f32 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/factory/impl/ControlTreeNodeFactory.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/factory/impl/ControlTreeNodeFactory.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.tree.node.factory.impl; -import static com.ss.rlib.util.ClassUtils.unsafeCast; +import static com.ss.rlib.common.util.ClassUtils.unsafeCast; import com.jme3.animation.SkeletonControl; import com.jme3.bullet.control.*; import com.jme3.cinematic.events.MotionEvent; diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/factory/impl/DefaultParticlesTreeNodeFactory.java b/src/main/java/com/ss/editor/ui/control/tree/node/factory/impl/DefaultParticlesTreeNodeFactory.java index 25acbc44..2a1658bc 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/factory/impl/DefaultParticlesTreeNodeFactory.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/factory/impl/DefaultParticlesTreeNodeFactory.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.tree.node.factory.impl; -import static com.ss.rlib.util.ClassUtils.unsafeCast; +import static com.ss.rlib.common.util.ClassUtils.unsafeCast; import com.jme3.effect.ParticleEmitter; import com.jme3.effect.influencers.DefaultParticleInfluencer; import com.jme3.effect.influencers.EmptyParticleInfluencer; diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/factory/impl/DefaultTreeNodeFactory.java b/src/main/java/com/ss/editor/ui/control/tree/node/factory/impl/DefaultTreeNodeFactory.java index 77976fb8..1718bb8e 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/factory/impl/DefaultTreeNodeFactory.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/factory/impl/DefaultTreeNodeFactory.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.tree.node.factory.impl; -import static com.ss.rlib.util.ClassUtils.unsafeCast; +import static com.ss.rlib.common.util.ClassUtils.unsafeCast; import com.jme3.audio.AudioNode; import com.jme3.material.Material; import com.jme3.post.Filter; diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/factory/impl/LightTreeNodeFactory.java b/src/main/java/com/ss/editor/ui/control/tree/node/factory/impl/LightTreeNodeFactory.java index 038357bb..d5c846cf 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/factory/impl/LightTreeNodeFactory.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/factory/impl/LightTreeNodeFactory.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.tree.node.factory.impl; -import static com.ss.rlib.util.ClassUtils.unsafeCast; +import static com.ss.rlib.common.util.ClassUtils.unsafeCast; import com.jme3.light.*; import com.ss.editor.annotation.FxThread; import com.ss.editor.ui.control.tree.node.impl.light.*; diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/factory/impl/MaterialSettingsTreeNodeFactory.java b/src/main/java/com/ss/editor/ui/control/tree/node/factory/impl/MaterialSettingsTreeNodeFactory.java index dc6bad9c..410e7780 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/factory/impl/MaterialSettingsTreeNodeFactory.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/factory/impl/MaterialSettingsTreeNodeFactory.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.tree.node.factory.impl; -import static com.ss.rlib.util.ClassUtils.unsafeCast; +import static com.ss.rlib.common.util.ClassUtils.unsafeCast; import com.ss.editor.annotation.FxThread; import com.ss.editor.model.node.material.*; import com.ss.editor.ui.control.tree.node.TreeNode; diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/factory/impl/PrimitiveTreeNodeFactory.java b/src/main/java/com/ss/editor/ui/control/tree/node/factory/impl/PrimitiveTreeNodeFactory.java index f7ce1586..1ba1e698 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/factory/impl/PrimitiveTreeNodeFactory.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/factory/impl/PrimitiveTreeNodeFactory.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.tree.node.factory.impl; -import static com.ss.rlib.util.ClassUtils.unsafeCast; +import static com.ss.rlib.common.util.ClassUtils.unsafeCast; import com.jme3.bullet.objects.VehicleWheel; import com.jme3.cinematic.MotionPath; import com.jme3.math.Vector3f; diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/impl/VertexBufferTreeNode.java b/src/main/java/com/ss/editor/ui/control/tree/node/impl/VertexBufferTreeNode.java index 4b17fee8..cc2c162a 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/impl/VertexBufferTreeNode.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/impl/VertexBufferTreeNode.java @@ -8,8 +8,8 @@ import com.ss.editor.ui.control.model.ModelNodeTree; import com.ss.editor.ui.control.tree.NodeTree; import com.ss.editor.ui.control.tree.node.TreeNode; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/impl/control/anim/AnimationBoneTrackTreeNode.java b/src/main/java/com/ss/editor/ui/control/tree/node/impl/control/anim/AnimationBoneTrackTreeNode.java index 2aeb2d0d..46c3a426 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/impl/control/anim/AnimationBoneTrackTreeNode.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/impl/control/anim/AnimationBoneTrackTreeNode.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.tree.node.impl.control.anim; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.animation.AnimControl; import com.jme3.animation.Bone; import com.jme3.animation.BoneTrack; diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/impl/control/anim/AnimationControlTreeNode.java b/src/main/java/com/ss/editor/ui/control/tree/node/impl/control/anim/AnimationControlTreeNode.java index c3f7c77d..eeb7d5c4 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/impl/control/anim/AnimationControlTreeNode.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/impl/control/anim/AnimationControlTreeNode.java @@ -16,8 +16,8 @@ import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import java.util.Collection; diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/impl/control/anim/AnimationTreeNode.java b/src/main/java/com/ss/editor/ui/control/tree/node/impl/control/anim/AnimationTreeNode.java index fc05907a..556b4da3 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/impl/control/anim/AnimationTreeNode.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/impl/control/anim/AnimationTreeNode.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.tree.node.impl.control.anim; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.animation.AnimControl; import com.jme3.animation.Animation; import com.jme3.animation.Track; @@ -15,10 +15,10 @@ import com.ss.editor.ui.control.tree.NodeTree; import com.ss.editor.ui.control.tree.node.TreeNode; import com.ss.editor.util.AnimationUtils; -import com.ss.rlib.util.ArrayUtils; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.ArrayUtils; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.collections.ObservableList; import javafx.scene.control.MenuItem; import javafx.scene.image.Image; diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/impl/control/motion/MotionEventTreeNode.java b/src/main/java/com/ss/editor/ui/control/tree/node/impl/control/motion/MotionEventTreeNode.java index 37f1dc96..57754868 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/impl/control/motion/MotionEventTreeNode.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/impl/control/motion/MotionEventTreeNode.java @@ -9,8 +9,8 @@ import com.ss.editor.ui.control.tree.node.impl.control.ControlTreeNode; import com.ss.editor.ui.control.tree.NodeTree; import com.ss.editor.ui.control.tree.node.TreeNode; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/impl/control/motion/MotionPathTreeNode.java b/src/main/java/com/ss/editor/ui/control/tree/node/impl/control/motion/MotionPathTreeNode.java index 10969614..0b7cbed8 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/impl/control/motion/MotionPathTreeNode.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/impl/control/motion/MotionPathTreeNode.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.tree.node.impl.control.motion; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.cinematic.MotionPath; import com.ss.editor.Messages; import com.ss.editor.annotation.FxThread; @@ -13,8 +13,8 @@ import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; /** * The implementation of the {@link TreeNode} to show a {@link MotionPath} in the tree. diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/impl/control/physics/PhysicsControlTreeNode.java b/src/main/java/com/ss/editor/ui/control/tree/node/impl/control/physics/PhysicsControlTreeNode.java index 2aecac7f..4db20175 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/impl/control/physics/PhysicsControlTreeNode.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/impl/control/physics/PhysicsControlTreeNode.java @@ -10,8 +10,8 @@ import com.ss.editor.ui.control.tree.action.impl.physics.shape.*; import com.ss.editor.ui.control.tree.node.TreeNode; import com.ss.editor.ui.control.tree.node.impl.control.ControlTreeNode; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.collections.ObservableList; import javafx.scene.control.Menu; import javafx.scene.control.MenuItem; diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/impl/layer/LayersRootTreeNode.java b/src/main/java/com/ss/editor/ui/control/tree/node/impl/layer/LayersRootTreeNode.java index 073e4688..1273e2ec 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/impl/layer/LayersRootTreeNode.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/impl/layer/LayersRootTreeNode.java @@ -11,8 +11,8 @@ import com.ss.editor.ui.control.tree.action.impl.scene.CreateSceneLayerAction; import com.ss.editor.ui.control.tree.NodeTree; import com.ss.editor.ui.control.tree.node.TreeNode; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.collections.ObservableList; import javafx.scene.control.MenuItem; import javafx.scene.image.Image; diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/impl/layer/SceneLayerTreeNode.java b/src/main/java/com/ss/editor/ui/control/tree/node/impl/layer/SceneLayerTreeNode.java index 7ba46a84..f4ed0ea2 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/impl/layer/SceneLayerTreeNode.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/impl/layer/SceneLayerTreeNode.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.tree.node.impl.layer; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.scene.Spatial; import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; @@ -18,8 +18,8 @@ import com.ss.editor.ui.control.tree.NodeTree; import com.ss.editor.ui.control.tree.node.HideableNode; import com.ss.editor.ui.control.tree.node.TreeNode; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.collections.ObservableList; import javafx.scene.control.MenuItem; import javafx.scene.image.Image; diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/impl/light/AmbientLightTreeNode.java b/src/main/java/com/ss/editor/ui/control/tree/node/impl/light/AmbientLightTreeNode.java index 67a59a79..60678152 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/impl/light/AmbientLightTreeNode.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/impl/light/AmbientLightTreeNode.java @@ -10,7 +10,7 @@ import org.jetbrains.annotations.Nullable; import javafx.scene.image.Image; -import com.ss.rlib.util.StringUtils; +import com.ss.rlib.common.util.StringUtils; /** * The implementation of {@link LightTreeNode} to present ambient lights. diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/impl/light/DirectionalLightTreeNode.java b/src/main/java/com/ss/editor/ui/control/tree/node/impl/light/DirectionalLightTreeNode.java index c8e62076..91991fe0 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/impl/light/DirectionalLightTreeNode.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/impl/light/DirectionalLightTreeNode.java @@ -5,7 +5,7 @@ import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.ui.Icons; -import com.ss.rlib.util.StringUtils; +import com.ss.rlib.common.util.StringUtils; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/impl/light/LightTreeNode.java b/src/main/java/com/ss/editor/ui/control/tree/node/impl/light/LightTreeNode.java index 7adb8241..57b403bb 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/impl/light/LightTreeNode.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/impl/light/LightTreeNode.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.tree.node.impl.light; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.light.Light; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; @@ -10,7 +10,7 @@ import com.ss.editor.ui.control.tree.action.impl.RemoveLightAction; import com.ss.editor.model.undo.impl.RenameLightOperation; import com.ss.editor.ui.control.tree.node.TreeNode; -import com.ss.rlib.util.StringUtils; +import com.ss.rlib.common.util.StringUtils; import javafx.collections.ObservableList; import javafx.scene.control.MenuItem; import javafx.scene.image.Image; diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/impl/light/PointLightTreeNode.java b/src/main/java/com/ss/editor/ui/control/tree/node/impl/light/PointLightTreeNode.java index f52ad9e9..dbcd6b42 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/impl/light/PointLightTreeNode.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/impl/light/PointLightTreeNode.java @@ -5,7 +5,7 @@ import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.ui.Icons; -import com.ss.rlib.util.StringUtils; +import com.ss.rlib.common.util.StringUtils; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/impl/light/SpotLightTreeNode.java b/src/main/java/com/ss/editor/ui/control/tree/node/impl/light/SpotLightTreeNode.java index 8c5c8099..6dcbdbc6 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/impl/light/SpotLightTreeNode.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/impl/light/SpotLightTreeNode.java @@ -5,7 +5,7 @@ import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.ui.Icons; -import com.ss.rlib.util.StringUtils; +import com.ss.rlib.common.util.StringUtils; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/impl/material/settings/RootMaterialSettingsTreeNode.java b/src/main/java/com/ss/editor/ui/control/tree/node/impl/material/settings/RootMaterialSettingsTreeNode.java index 182c0fff..a571b627 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/impl/material/settings/RootMaterialSettingsTreeNode.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/impl/material/settings/RootMaterialSettingsTreeNode.java @@ -6,8 +6,8 @@ import com.ss.editor.model.node.material.*; import com.ss.editor.ui.control.tree.NodeTree; import com.ss.editor.ui.control.tree.node.TreeNode; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; /** diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/impl/physics/shape/ChildCollisionShapeTreeNode.java b/src/main/java/com/ss/editor/ui/control/tree/node/impl/physics/shape/ChildCollisionShapeTreeNode.java index bbedbfb7..e9afbe1e 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/impl/physics/shape/ChildCollisionShapeTreeNode.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/impl/physics/shape/ChildCollisionShapeTreeNode.java @@ -8,8 +8,8 @@ import com.ss.editor.ui.Icons; import com.ss.editor.ui.control.tree.NodeTree; import com.ss.editor.ui.control.tree.node.TreeNode; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/impl/physics/shape/ComputedCollisionShapeTreeNode.java b/src/main/java/com/ss/editor/ui/control/tree/node/impl/physics/shape/ComputedCollisionShapeTreeNode.java index b1db873e..09a8b862 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/impl/physics/shape/ComputedCollisionShapeTreeNode.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/impl/physics/shape/ComputedCollisionShapeTreeNode.java @@ -11,8 +11,8 @@ import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import java.util.List; diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/impl/scene/SceneAppStatesTreeNode.java b/src/main/java/com/ss/editor/ui/control/tree/node/impl/scene/SceneAppStatesTreeNode.java index 103cefab..39272db9 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/impl/scene/SceneAppStatesTreeNode.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/impl/scene/SceneAppStatesTreeNode.java @@ -10,8 +10,8 @@ import com.ss.editor.ui.control.scene.SceneNodeTree; import com.ss.editor.ui.control.tree.NodeTree; import com.ss.editor.ui.control.tree.node.TreeNode; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/impl/scene/SceneFiltersTreeNode.java b/src/main/java/com/ss/editor/ui/control/tree/node/impl/scene/SceneFiltersTreeNode.java index 724fad90..fc50d5ca 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/impl/scene/SceneFiltersTreeNode.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/impl/scene/SceneFiltersTreeNode.java @@ -10,8 +10,8 @@ import com.ss.editor.ui.control.scene.SceneNodeTree; import com.ss.editor.ui.control.tree.NodeTree; import com.ss.editor.ui.control.tree.node.TreeNode; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/impl/scene/SceneNodeTreeNode.java b/src/main/java/com/ss/editor/ui/control/tree/node/impl/scene/SceneNodeTreeNode.java index 61d6ec29..9e57bd78 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/impl/scene/SceneNodeTreeNode.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/impl/scene/SceneNodeTreeNode.java @@ -10,8 +10,8 @@ import com.ss.editor.ui.control.tree.action.impl.RenameNodeAction; import com.ss.editor.ui.control.tree.node.TreeNode; import com.ss.editor.ui.control.tree.node.impl.spatial.NodeTreeNode; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.collections.ObservableList; import javafx.scene.control.Menu; import javafx.scene.control.MenuItem; diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/impl/spatial/GeometryTreeNode.java b/src/main/java/com/ss/editor/ui/control/tree/node/impl/spatial/GeometryTreeNode.java index 002c0670..16fec3f5 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/impl/spatial/GeometryTreeNode.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/impl/spatial/GeometryTreeNode.java @@ -12,8 +12,8 @@ import com.ss.editor.ui.control.property.operation.PropertyOperation; import com.ss.editor.ui.control.tree.NodeTree; import com.ss.editor.ui.control.tree.node.TreeNode; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.control.Menu; import javafx.scene.image.Image; import javafx.scene.image.ImageView; diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/impl/spatial/MaterialTreeNode.java b/src/main/java/com/ss/editor/ui/control/tree/node/impl/spatial/MaterialTreeNode.java index ed81c9f4..3338bcab 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/impl/spatial/MaterialTreeNode.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/impl/spatial/MaterialTreeNode.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.control.tree.node.impl.spatial; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.material.Material; import com.jme3.scene.AssetLinkNode; import com.jme3.scene.Spatial; diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/impl/spatial/MeshTreeNode.java b/src/main/java/com/ss/editor/ui/control/tree/node/impl/spatial/MeshTreeNode.java index ada66da9..327b5b2a 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/impl/spatial/MeshTreeNode.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/impl/spatial/MeshTreeNode.java @@ -12,8 +12,8 @@ import javafx.scene.image.Image; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; /** * The implementation of the {@link TreeNode} to represent the {@link Mesh} in the editor. diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/impl/spatial/NodeTreeNode.java b/src/main/java/com/ss/editor/ui/control/tree/node/impl/spatial/NodeTreeNode.java index d5dad40e..94aafe5d 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/impl/spatial/NodeTreeNode.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/impl/spatial/NodeTreeNode.java @@ -1,7 +1,7 @@ package com.ss.editor.ui.control.tree.node.impl.spatial; import static com.ss.editor.util.EditorUtil.*; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.asset.AssetManager; import com.jme3.asset.ModelKey; import com.jme3.effect.ParticleEmitter; @@ -35,8 +35,8 @@ import com.ss.editor.util.EditorUtil; import com.ss.editor.util.GeomUtils; import com.ss.editor.util.NodeUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.collections.ObservableList; import javafx.scene.control.Menu; import javafx.scene.control.MenuItem; diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/impl/spatial/SpatialTreeNode.java b/src/main/java/com/ss/editor/ui/control/tree/node/impl/spatial/SpatialTreeNode.java index a698856e..046b0f6e 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/impl/spatial/SpatialTreeNode.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/impl/spatial/SpatialTreeNode.java @@ -4,7 +4,7 @@ import static com.ss.editor.Messages.MODEL_NODE_TREE_ACTION_CREATE; import static com.ss.editor.part3d.editor.impl.scene.AbstractSceneEditor3DPart.KEY_MODEL_NODE; import static com.ss.editor.util.NodeUtils.findParent; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.bullet.control.CharacterControl; import com.jme3.bullet.control.RigidBodyControl; import com.jme3.bullet.control.VehicleControl; @@ -42,9 +42,9 @@ import com.ss.editor.ui.control.tree.node.impl.light.LightTreeNode; import com.ss.editor.util.ControlUtils; import com.ss.editor.util.NodeUtils; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.collections.ObservableList; import javafx.scene.control.Menu; import javafx.scene.control.MenuItem; diff --git a/src/main/java/com/ss/editor/ui/control/tree/node/impl/spatial/particle/emitter/ParticleEmitterTreeNode.java b/src/main/java/com/ss/editor/ui/control/tree/node/impl/spatial/particle/emitter/ParticleEmitterTreeNode.java index 5f52f76a..105b0e43 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/node/impl/spatial/particle/emitter/ParticleEmitterTreeNode.java +++ b/src/main/java/com/ss/editor/ui/control/tree/node/impl/spatial/particle/emitter/ParticleEmitterTreeNode.java @@ -15,8 +15,8 @@ import com.ss.editor.ui.control.tree.action.impl.particle.emitter.shape.*; import com.ss.editor.ui.control.tree.NodeTree; import com.ss.editor.ui.control.tree.node.TreeNode; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.collections.ObservableList; import javafx.scene.control.Menu; import javafx.scene.control.MenuItem; diff --git a/src/main/java/com/ss/editor/ui/css/CssRegistry.java b/src/main/java/com/ss/editor/ui/css/CssRegistry.java index 98f0ab93..d6cffb83 100644 --- a/src/main/java/com/ss/editor/ui/css/CssRegistry.java +++ b/src/main/java/com/ss/editor/ui/css/CssRegistry.java @@ -1,9 +1,9 @@ package com.ss.editor.ui.css; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FromAnyThread; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; import java.net.URL; diff --git a/src/main/java/com/ss/editor/ui/dialog/AbstractSimpleEditorDialog.java b/src/main/java/com/ss/editor/ui/dialog/AbstractSimpleEditorDialog.java index 8ba2fc8d..37359dcf 100644 --- a/src/main/java/com/ss/editor/ui/dialog/AbstractSimpleEditorDialog.java +++ b/src/main/java/com/ss/editor/ui/dialog/AbstractSimpleEditorDialog.java @@ -6,7 +6,7 @@ import com.ss.editor.manager.ExecutorManager; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.scene.control.Button; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; diff --git a/src/main/java/com/ss/editor/ui/dialog/ConfirmDialog.java b/src/main/java/com/ss/editor/ui/dialog/ConfirmDialog.java index 489f140d..fef03522 100644 --- a/src/main/java/com/ss/editor/ui/dialog/ConfirmDialog.java +++ b/src/main/java/com/ss/editor/ui/dialog/ConfirmDialog.java @@ -1,11 +1,11 @@ package com.ss.editor.ui.dialog; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.Messages; import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.input.KeyCode; diff --git a/src/main/java/com/ss/editor/ui/dialog/CreateCustomControlDialog.java b/src/main/java/com/ss/editor/ui/dialog/CreateCustomControlDialog.java index 1b7db3f1..5e993f7b 100644 --- a/src/main/java/com/ss/editor/ui/dialog/CreateCustomControlDialog.java +++ b/src/main/java/com/ss/editor/ui/dialog/CreateCustomControlDialog.java @@ -1,7 +1,7 @@ package com.ss.editor.ui.dialog; -import static com.ss.rlib.util.ObjectUtils.notNull; -import static com.ss.rlib.util.dictionary.DictionaryFactory.newObjectDictionary; +import static com.ss.rlib.common.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.dictionary.DictionaryFactory.newObjectDictionary; import com.jme3.scene.Spatial; import com.jme3.scene.control.Control; import com.ss.editor.Messages; @@ -14,12 +14,12 @@ import com.ss.editor.model.undo.editor.ModelChangeConsumer; import com.ss.editor.model.undo.impl.AddControlOperation; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.ClassUtils; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; -import com.ss.rlib.util.dictionary.ObjectDictionary; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.ClassUtils; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; +import com.ss.rlib.common.util.dictionary.ObjectDictionary; import javafx.collections.ObservableList; import javafx.scene.control.*; import javafx.scene.control.Label; diff --git a/src/main/java/com/ss/editor/ui/dialog/CreateSceneAppStateDialog.java b/src/main/java/com/ss/editor/ui/dialog/CreateSceneAppStateDialog.java index 6da4c05e..a9085bcb 100644 --- a/src/main/java/com/ss/editor/ui/dialog/CreateSceneAppStateDialog.java +++ b/src/main/java/com/ss/editor/ui/dialog/CreateSceneAppStateDialog.java @@ -1,8 +1,8 @@ package com.ss.editor.ui.dialog; import static com.ss.editor.util.EditorUtil.tryToCreateUserObject; -import static com.ss.rlib.util.ObjectUtils.notNull; -import static com.ss.rlib.util.dictionary.DictionaryFactory.newObjectDictionary; +import static com.ss.rlib.common.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.dictionary.DictionaryFactory.newObjectDictionary; import com.ss.editor.Messages; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; @@ -15,11 +15,11 @@ import com.ss.editor.model.undo.editor.SceneChangeConsumer; import com.ss.editor.model.undo.impl.AddAppStateOperation; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.ClassUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; -import com.ss.rlib.util.dictionary.ObjectDictionary; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.ClassUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; +import com.ss.rlib.common.util.dictionary.ObjectDictionary; import javafx.scene.control.*; import javafx.scene.control.Label; import javafx.scene.control.TextField; diff --git a/src/main/java/com/ss/editor/ui/dialog/CreateSceneFilterDialog.java b/src/main/java/com/ss/editor/ui/dialog/CreateSceneFilterDialog.java index 57b77d3d..c05b0d26 100644 --- a/src/main/java/com/ss/editor/ui/dialog/CreateSceneFilterDialog.java +++ b/src/main/java/com/ss/editor/ui/dialog/CreateSceneFilterDialog.java @@ -1,8 +1,8 @@ package com.ss.editor.ui.dialog; import static com.ss.editor.util.EditorUtil.tryToCreateUserObject; -import static com.ss.rlib.util.ObjectUtils.notNull; -import static com.ss.rlib.util.dictionary.DictionaryFactory.newObjectDictionary; +import static com.ss.rlib.common.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.dictionary.DictionaryFactory.newObjectDictionary; import com.ss.editor.Messages; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; @@ -14,11 +14,11 @@ import com.ss.editor.model.undo.editor.SceneChangeConsumer; import com.ss.editor.model.undo.impl.AddSceneFilterOperation; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.ClassUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; -import com.ss.rlib.util.dictionary.ObjectDictionary; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.ClassUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; +import com.ss.rlib.common.util.dictionary.ObjectDictionary; import javafx.scene.control.*; import javafx.scene.control.Label; import javafx.scene.control.TextField; diff --git a/src/main/java/com/ss/editor/ui/dialog/EditorDialog.java b/src/main/java/com/ss/editor/ui/dialog/EditorDialog.java index 8da00307..f08a0300 100644 --- a/src/main/java/com/ss/editor/ui/dialog/EditorDialog.java +++ b/src/main/java/com/ss/editor/ui/dialog/EditorDialog.java @@ -15,10 +15,10 @@ import com.ss.editor.ui.event.FxEventManager; import com.ss.editor.ui.scene.EditorFxScene; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerManager; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.ui.window.popup.dialog.AbstractPopupDialog; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.fx.window.popup.dialog.AbstractPopupDialog; import javafx.application.Platform; import javafx.beans.property.ReadOnlyDoubleProperty; import javafx.collections.ObservableList; diff --git a/src/main/java/com/ss/editor/ui/dialog/GenerateTangentsDialog.java b/src/main/java/com/ss/editor/ui/dialog/GenerateTangentsDialog.java index ffa628c1..08b67ffc 100644 --- a/src/main/java/com/ss/editor/ui/dialog/GenerateTangentsDialog.java +++ b/src/main/java/com/ss/editor/ui/dialog/GenerateTangentsDialog.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.dialog; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import static javafx.collections.FXCollections.observableArrayList; import com.jme3.scene.Geometry; import com.jme3.scene.Mesh; @@ -13,7 +13,7 @@ import com.ss.editor.ui.control.tree.NodeTree; import com.ss.editor.ui.control.tree.node.TreeNode; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.collections.ObservableList; import javafx.scene.control.CheckBox; import javafx.scene.control.ComboBox; diff --git a/src/main/java/com/ss/editor/ui/dialog/RenameDialog.java b/src/main/java/com/ss/editor/ui/dialog/RenameDialog.java index 3de47aeb..3a34ff3e 100644 --- a/src/main/java/com/ss/editor/ui/dialog/RenameDialog.java +++ b/src/main/java/com/ss/editor/ui/dialog/RenameDialog.java @@ -1,11 +1,11 @@ package com.ss.editor.ui.dialog; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.Messages; import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.TextField; diff --git a/src/main/java/com/ss/editor/ui/dialog/SettingsDialog.java b/src/main/java/com/ss/editor/ui/dialog/SettingsDialog.java index abc9408f..dc05446f 100644 --- a/src/main/java/com/ss/editor/ui/dialog/SettingsDialog.java +++ b/src/main/java/com/ss/editor/ui/dialog/SettingsDialog.java @@ -3,9 +3,9 @@ import static com.ss.editor.config.DefaultSettingsProvider.Defaults.*; import static com.ss.editor.config.DefaultSettingsProvider.Preferences.*; import static com.ss.editor.plugin.api.property.control.PropertyEditorControlFactory.build; -import static com.ss.rlib.util.ClassUtils.unsafeCast; -import static com.ss.rlib.util.ObjectUtils.notNull; -import static com.ss.rlib.util.array.ArrayCollectors.toArray; +import static com.ss.rlib.common.util.ClassUtils.unsafeCast; +import static com.ss.rlib.common.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.array.ArrayCollectors.toArray; import com.jme3.asset.AssetManager; import com.jme3.post.filters.FXAAFilter; import com.jme3.post.filters.ToneMapFilter; @@ -26,13 +26,13 @@ import com.ss.editor.plugin.api.settings.SettingsProviderRegistry; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.VarTable; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; -import com.ss.rlib.util.dictionary.DictionaryFactory; -import com.ss.rlib.util.dictionary.ObjectDictionary; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; +import com.ss.rlib.common.util.dictionary.DictionaryFactory; +import com.ss.rlib.common.util.dictionary.ObjectDictionary; import javafx.application.Platform; import javafx.scene.control.Button; import javafx.scene.control.Label; diff --git a/src/main/java/com/ss/editor/ui/dialog/about/AboutDialog.java b/src/main/java/com/ss/editor/ui/dialog/about/AboutDialog.java index 70663327..f7f23bb5 100644 --- a/src/main/java/com/ss/editor/ui/dialog/about/AboutDialog.java +++ b/src/main/java/com/ss/editor/ui/dialog/about/AboutDialog.java @@ -9,8 +9,8 @@ import com.ss.editor.ui.component.creator.FileCreator; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.dialog.AbstractSimpleEditorDialog; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.FileUtils; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.FileUtils; import javafx.application.HostServices; import javafx.scene.control.Hyperlink; import javafx.scene.control.Label; diff --git a/src/main/java/com/ss/editor/ui/dialog/animation/ExtractSubAnimationDialog.java b/src/main/java/com/ss/editor/ui/dialog/animation/ExtractSubAnimationDialog.java index 5a661990..c50fa195 100644 --- a/src/main/java/com/ss/editor/ui/dialog/animation/ExtractSubAnimationDialog.java +++ b/src/main/java/com/ss/editor/ui/dialog/animation/ExtractSubAnimationDialog.java @@ -1,7 +1,7 @@ package com.ss.editor.ui.dialog.animation; import static com.ss.editor.util.AnimationUtils.extractAnimation; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.animation.AnimControl; import com.jme3.animation.Animation; import com.ss.editor.Messages; @@ -17,8 +17,8 @@ import com.ss.editor.ui.dialog.AbstractSimpleEditorDialog; import com.ss.editor.ui.util.UiUtils; import com.ss.editor.util.AnimationUtils; -import com.ss.rlib.ui.control.input.IntegerTextField; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.control.input.IntegerTextField; +import com.ss.rlib.fx.util.FXUtils; import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.scene.layout.GridPane; diff --git a/src/main/java/com/ss/editor/ui/dialog/asset/BaseAssetEditorDialog.java b/src/main/java/com/ss/editor/ui/dialog/asset/BaseAssetEditorDialog.java index 86eb7322..c0f2e40c 100644 --- a/src/main/java/com/ss/editor/ui/dialog/asset/BaseAssetEditorDialog.java +++ b/src/main/java/com/ss/editor/ui/dialog/asset/BaseAssetEditorDialog.java @@ -1,7 +1,7 @@ package com.ss.editor.ui.dialog.asset; import static com.ss.editor.Messages.ASSET_EDITOR_DIALOG_TITLE; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; import com.ss.editor.ui.Icons; @@ -10,9 +10,9 @@ import com.ss.editor.ui.preview.FilePreview; import com.ss.editor.ui.preview.FilePreviewFactoryRegistry; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.array.Array; import javafx.beans.binding.BooleanBinding; import javafx.beans.value.ObservableBooleanValue; import javafx.scene.control.Button; diff --git a/src/main/java/com/ss/editor/ui/dialog/asset/file/AssetEditorDialog.java b/src/main/java/com/ss/editor/ui/dialog/asset/file/AssetEditorDialog.java index 3f8b0581..37e46d35 100644 --- a/src/main/java/com/ss/editor/ui/dialog/asset/file/AssetEditorDialog.java +++ b/src/main/java/com/ss/editor/ui/dialog/asset/file/AssetEditorDialog.java @@ -2,7 +2,7 @@ import static com.ss.editor.ui.component.asset.tree.resource.ResourceElementFactory.createFor; import static com.ss.editor.ui.util.UiUtils.findItemForValue; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.config.EditorConfig; @@ -15,8 +15,8 @@ import com.ss.editor.ui.event.impl.CreatedFileEvent; import com.ss.editor.ui.event.impl.DeletedFileEvent; import com.ss.editor.ui.event.impl.RequestSelectFileEvent; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.beans.property.ReadOnlyObjectProperty; import javafx.beans.value.ObservableBooleanValue; import javafx.event.Event; diff --git a/src/main/java/com/ss/editor/ui/dialog/asset/virtual/StringVirtualAssetEditorDialog.java b/src/main/java/com/ss/editor/ui/dialog/asset/virtual/StringVirtualAssetEditorDialog.java index 3a612153..38cbf251 100644 --- a/src/main/java/com/ss/editor/ui/dialog/asset/virtual/StringVirtualAssetEditorDialog.java +++ b/src/main/java/com/ss/editor/ui/dialog/asset/virtual/StringVirtualAssetEditorDialog.java @@ -2,9 +2,9 @@ import com.ss.editor.Messages; import com.ss.editor.annotation.FromAnyThread; -import com.ss.rlib.util.FileUtils; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.util.FileUtils; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.array.Array; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/ui/dialog/asset/virtual/VirtualAssetEditorDialog.java b/src/main/java/com/ss/editor/ui/dialog/asset/virtual/VirtualAssetEditorDialog.java index 1d91aeeb..ba5c9890 100644 --- a/src/main/java/com/ss/editor/ui/dialog/asset/virtual/VirtualAssetEditorDialog.java +++ b/src/main/java/com/ss/editor/ui/dialog/asset/virtual/VirtualAssetEditorDialog.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.dialog.asset.virtual; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.ui.component.virtual.tree.VirtualResourceTree; @@ -8,7 +8,7 @@ import com.ss.editor.ui.component.virtual.tree.resource.VirtualResourceElement; import com.ss.editor.ui.component.virtual.tree.resource.VirtualResourceElementFactory; import com.ss.editor.ui.dialog.asset.BaseAssetEditorDialog; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.util.array.Array; import javafx.beans.binding.Bindings; import javafx.beans.binding.BooleanBinding; import javafx.beans.property.ReadOnlyObjectProperty; diff --git a/src/main/java/com/ss/editor/ui/dialog/file/chooser/ExternalFileEditorDialog.java b/src/main/java/com/ss/editor/ui/dialog/file/chooser/ExternalFileEditorDialog.java index 07ba8b38..b67acba0 100644 --- a/src/main/java/com/ss/editor/ui/dialog/file/chooser/ExternalFileEditorDialog.java +++ b/src/main/java/com/ss/editor/ui/dialog/file/chooser/ExternalFileEditorDialog.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.dialog.file.chooser; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.Messages; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; @@ -10,9 +10,9 @@ import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.dialog.AbstractSimpleEditorDialog; import com.ss.editor.ui.dialog.EditorDialog; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.control.Button; import javafx.scene.control.TreeItem; import javafx.scene.layout.VBox; diff --git a/src/main/java/com/ss/editor/ui/dialog/geometry/lod/GenerateLodLevelsDialog.java b/src/main/java/com/ss/editor/ui/dialog/geometry/lod/GenerateLodLevelsDialog.java index 1fecf170..832b9f97 100644 --- a/src/main/java/com/ss/editor/ui/dialog/geometry/lod/GenerateLodLevelsDialog.java +++ b/src/main/java/com/ss/editor/ui/dialog/geometry/lod/GenerateLodLevelsDialog.java @@ -1,7 +1,7 @@ package com.ss.editor.ui.dialog.geometry.lod; import static com.ss.editor.ui.FXConstants.DIALOG_LIST_WIDTH_PERCENT; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import static javafx.collections.FXCollections.observableArrayList; import com.jme3.scene.Geometry; import com.jme3.scene.Mesh; @@ -19,7 +19,7 @@ import com.ss.editor.ui.dialog.AbstractSimpleEditorDialog; import com.ss.editor.ui.util.DynamicIconSupport; import com.ss.editor.ui.util.UiUtils; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.collections.ListChangeListener; import javafx.collections.ObservableList; import javafx.scene.control.Button; diff --git a/src/main/java/com/ss/editor/ui/dialog/imports/model/ModelImportDialog.java b/src/main/java/com/ss/editor/ui/dialog/imports/model/ModelImportDialog.java index 40616995..b376034a 100644 --- a/src/main/java/com/ss/editor/ui/dialog/imports/model/ModelImportDialog.java +++ b/src/main/java/com/ss/editor/ui/dialog/imports/model/ModelImportDialog.java @@ -5,7 +5,7 @@ import static com.ss.editor.extension.property.EditablePropertyType.*; import static com.ss.editor.util.EditorUtil.getAssetFile; import static com.ss.editor.util.EditorUtil.toAssetPath; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import static java.nio.file.StandardOpenOption.*; import com.jme3.asset.AssetKey; import com.jme3.asset.AssetManager; @@ -34,12 +34,12 @@ import com.ss.editor.util.MaterialSerializer; import com.ss.editor.util.EditorUtil; import com.ss.editor.util.NodeUtils; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.VarTable; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; -import com.ss.rlib.util.dictionary.DictionaryFactory; -import com.ss.rlib.util.dictionary.ObjectDictionary; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; +import com.ss.rlib.common.util.dictionary.DictionaryFactory; +import com.ss.rlib.common.util.dictionary.ObjectDictionary; import javafx.beans.property.ObjectProperty; import javafx.scene.image.Image; import javafx.scene.image.ImageView; diff --git a/src/main/java/com/ss/editor/ui/dialog/node/selector/NodeSelectorDialog.java b/src/main/java/com/ss/editor/ui/dialog/node/selector/NodeSelectorDialog.java index 5589c0e1..c70375d9 100644 --- a/src/main/java/com/ss/editor/ui/dialog/node/selector/NodeSelectorDialog.java +++ b/src/main/java/com/ss/editor/ui/dialog/node/selector/NodeSelectorDialog.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.dialog.node.selector; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.scene.Spatial; import com.ss.editor.Messages; import com.ss.editor.annotation.FxThread; @@ -9,8 +9,8 @@ import com.ss.editor.ui.control.tree.node.TreeNode; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.dialog.AbstractSimpleEditorDialog; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.array.Array; import javafx.scene.control.Button; import javafx.scene.control.SelectionMode; import javafx.scene.layout.GridPane; diff --git a/src/main/java/com/ss/editor/ui/dialog/plugin/PluginListCell.java b/src/main/java/com/ss/editor/ui/dialog/plugin/PluginListCell.java index 07212b19..d212b5c7 100644 --- a/src/main/java/com/ss/editor/ui/dialog/plugin/PluginListCell.java +++ b/src/main/java/com/ss/editor/ui/dialog/plugin/PluginListCell.java @@ -4,8 +4,8 @@ import com.ss.editor.ui.Icons; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.util.DynamicIconSupport; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.StringUtils; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.StringUtils; import javafx.scene.control.ListCell; import javafx.scene.image.ImageView; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/ss/editor/ui/dialog/plugin/PluginsDialog.java b/src/main/java/com/ss/editor/ui/dialog/plugin/PluginsDialog.java index 84d6037c..fff66dc2 100644 --- a/src/main/java/com/ss/editor/ui/dialog/plugin/PluginsDialog.java +++ b/src/main/java/com/ss/editor/ui/dialog/plugin/PluginsDialog.java @@ -1,7 +1,7 @@ package com.ss.editor.ui.dialog.plugin; import static com.ss.editor.ui.util.UiUtils.toWeb; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.Messages; import com.ss.editor.analytics.google.GAEvent; import com.ss.editor.analytics.google.GAnalytics; @@ -15,11 +15,11 @@ import com.ss.editor.ui.dialog.AbstractSimpleEditorDialog; import com.ss.editor.ui.dialog.ConfirmDialog; import com.ss.editor.ui.util.DynamicIconSupport; -import com.ss.rlib.plugin.Version; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.plugin.Version; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.application.Platform; import javafx.beans.value.ObservableValue; import javafx.collections.ObservableList; diff --git a/src/main/java/com/ss/editor/ui/dialog/save/SaveAsEditorDialog.java b/src/main/java/com/ss/editor/ui/dialog/save/SaveAsEditorDialog.java index 6669445e..b22e7a28 100644 --- a/src/main/java/com/ss/editor/ui/dialog/save/SaveAsEditorDialog.java +++ b/src/main/java/com/ss/editor/ui/dialog/save/SaveAsEditorDialog.java @@ -4,7 +4,7 @@ import static com.ss.editor.Messages.SAVE_AS_EDITOR_DIALOG_TITLE; import static com.ss.editor.ui.component.asset.tree.resource.ResourceElementFactory.createFor; import static com.ss.editor.ui.util.UiUtils.findItemForValue; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.Messages; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; @@ -18,11 +18,11 @@ import com.ss.editor.ui.event.impl.CreatedFileEvent; import com.ss.editor.ui.event.impl.DeletedFileEvent; import com.ss.editor.ui.event.impl.RequestSelectFileEvent; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.FileUtils; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.FileUtils; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.event.Event; import javafx.event.EventHandler; import javafx.scene.control.Button; diff --git a/src/main/java/com/ss/editor/ui/dialog/scene/selector/SceneSelectorDialog.java b/src/main/java/com/ss/editor/ui/dialog/scene/selector/SceneSelectorDialog.java index 3ce11b0a..c5bdfae4 100644 --- a/src/main/java/com/ss/editor/ui/dialog/scene/selector/SceneSelectorDialog.java +++ b/src/main/java/com/ss/editor/ui/dialog/scene/selector/SceneSelectorDialog.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.dialog.scene.selector; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.scene.Spatial; import com.ss.editor.Messages; import com.ss.editor.annotation.FromAnyThread; @@ -10,7 +10,7 @@ import com.ss.editor.ui.control.tree.node.TreeNode; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.dialog.AbstractSimpleEditorDialog; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.scene.control.Button; import javafx.scene.layout.GridPane; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/ss/editor/ui/dialog/sky/CreateSkyDialog.java b/src/main/java/com/ss/editor/ui/dialog/sky/CreateSkyDialog.java index a19b986a..d27dc031 100644 --- a/src/main/java/com/ss/editor/ui/dialog/sky/CreateSkyDialog.java +++ b/src/main/java/com/ss/editor/ui/dialog/sky/CreateSkyDialog.java @@ -2,7 +2,7 @@ import static com.ss.editor.util.EditorUtil.getAssetFile; import static com.ss.editor.util.EditorUtil.toAssetPath; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import static java.nio.file.StandardOpenOption.*; import static javafx.collections.FXCollections.observableArrayList; import com.jme3.asset.AssetManager; @@ -33,9 +33,9 @@ import com.ss.editor.ui.util.UiUtils; import com.ss.editor.util.EditorUtil; import com.ss.editor.util.MaterialSerializer; -import com.ss.rlib.ui.control.input.FloatTextField; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.StringUtils; +import com.ss.rlib.fx.control.input.FloatTextField; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.StringUtils; import javafx.collections.ObservableList; import javafx.scene.control.Button; import javafx.scene.control.*; diff --git a/src/main/java/com/ss/editor/ui/dialog/terrain/CreateTerrainDialog.java b/src/main/java/com/ss/editor/ui/dialog/terrain/CreateTerrainDialog.java index d38b685f..881d6ec1 100644 --- a/src/main/java/com/ss/editor/ui/dialog/terrain/CreateTerrainDialog.java +++ b/src/main/java/com/ss/editor/ui/dialog/terrain/CreateTerrainDialog.java @@ -3,7 +3,7 @@ import static com.ss.editor.part3d.editor.impl.scene.AbstractSceneEditor3DPart.KEY_LOADED_MODEL; import static com.ss.editor.util.EditorUtil.getAssetFile; import static com.ss.editor.util.EditorUtil.toAssetPath; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import static javafx.collections.FXCollections.observableArrayList; import com.jme3.asset.AssetManager; import com.jme3.asset.TextureKey; @@ -33,10 +33,10 @@ import com.ss.editor.ui.dialog.AbstractSimpleEditorDialog; import com.ss.editor.ui.util.UiUtils; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.ui.control.input.FloatTextField; -import com.ss.rlib.ui.control.input.IntegerTextField; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.FileUtils; +import com.ss.rlib.fx.control.input.FloatTextField; +import com.ss.rlib.fx.control.input.IntegerTextField; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.FileUtils; import javafx.collections.ObservableList; import javafx.scene.Node; import javafx.scene.control.Button; diff --git a/src/main/java/com/ss/editor/ui/event/EventRedirector.java b/src/main/java/com/ss/editor/ui/event/EventRedirector.java index 621cb1f0..c88124d6 100644 --- a/src/main/java/com/ss/editor/ui/event/EventRedirector.java +++ b/src/main/java/com/ss/editor/ui/event/EventRedirector.java @@ -1,12 +1,12 @@ package com.ss.editor.ui.event; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.config.Config; import com.ss.editor.ui.component.editor.FileEditor; import com.ss.editor.ui.component.editor.area.EditorAreaComponent; import com.ss.editor.ui.util.UiUtils; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerManager; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; import javafx.event.Event; import javafx.event.EventTarget; import javafx.event.EventType; diff --git a/src/main/java/com/ss/editor/ui/event/FxEventManager.java b/src/main/java/com/ss/editor/ui/event/FxEventManager.java index 2f75db41..da231af9 100644 --- a/src/main/java/com/ss/editor/ui/event/FxEventManager.java +++ b/src/main/java/com/ss/editor/ui/event/FxEventManager.java @@ -1,12 +1,12 @@ package com.ss.editor.ui.event; -import static com.ss.rlib.util.array.ArrayFactory.newArray; +import static com.ss.rlib.common.util.array.ArrayFactory.newArray; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; import com.ss.editor.manager.ExecutorManager; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.dictionary.DictionaryFactory; -import com.ss.rlib.util.dictionary.ObjectDictionary; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.dictionary.DictionaryFactory; +import com.ss.rlib.common.util.dictionary.ObjectDictionary; import javafx.application.Platform; import javafx.event.Event; import javafx.event.EventHandler; diff --git a/src/main/java/com/ss/editor/ui/event/SceneEvent.java b/src/main/java/com/ss/editor/ui/event/SceneEvent.java index 2b26af3a..4d497b26 100644 --- a/src/main/java/com/ss/editor/ui/event/SceneEvent.java +++ b/src/main/java/com/ss/editor/ui/event/SceneEvent.java @@ -1,8 +1,8 @@ package com.ss.editor.ui.event; -import static com.ss.rlib.util.ClassUtils.unsafeCast; -import com.ss.rlib.util.dictionary.DictionaryFactory; -import com.ss.rlib.util.dictionary.ObjectDictionary; +import static com.ss.rlib.common.util.ClassUtils.unsafeCast; +import com.ss.rlib.common.util.dictionary.DictionaryFactory; +import com.ss.rlib.common.util.dictionary.ObjectDictionary; import javafx.event.Event; import javafx.event.EventType; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/ss/editor/ui/event/impl/AssetComponentLoadedEvent.java b/src/main/java/com/ss/editor/ui/event/impl/AssetComponentLoadedEvent.java index b23e0305..fb55acb9 100644 --- a/src/main/java/com/ss/editor/ui/event/impl/AssetComponentLoadedEvent.java +++ b/src/main/java/com/ss/editor/ui/event/impl/AssetComponentLoadedEvent.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.event.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.ui.event.SceneEvent; import javafx.event.Event; import javafx.event.EventType; diff --git a/src/main/java/com/ss/editor/ui/event/impl/ChangedCurrentAssetFolderEvent.java b/src/main/java/com/ss/editor/ui/event/impl/ChangedCurrentAssetFolderEvent.java index 353b92a4..559d298d 100644 --- a/src/main/java/com/ss/editor/ui/event/impl/ChangedCurrentAssetFolderEvent.java +++ b/src/main/java/com/ss/editor/ui/event/impl/ChangedCurrentAssetFolderEvent.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.event.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.ui.event.SceneEvent; import javafx.event.Event; import javafx.event.EventType; diff --git a/src/main/java/com/ss/editor/ui/event/impl/CreatedFileEvent.java b/src/main/java/com/ss/editor/ui/event/impl/CreatedFileEvent.java index 79a876aa..4b0e6d53 100644 --- a/src/main/java/com/ss/editor/ui/event/impl/CreatedFileEvent.java +++ b/src/main/java/com/ss/editor/ui/event/impl/CreatedFileEvent.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.event.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.ui.event.SceneEvent; import javafx.event.Event; import javafx.event.EventType; diff --git a/src/main/java/com/ss/editor/ui/event/impl/DeletedFileEvent.java b/src/main/java/com/ss/editor/ui/event/impl/DeletedFileEvent.java index 2672f54a..e04e6459 100644 --- a/src/main/java/com/ss/editor/ui/event/impl/DeletedFileEvent.java +++ b/src/main/java/com/ss/editor/ui/event/impl/DeletedFileEvent.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.event.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.ui.event.SceneEvent; import javafx.event.Event; import javafx.event.EventType; diff --git a/src/main/java/com/ss/editor/ui/event/impl/FileChangedEvent.java b/src/main/java/com/ss/editor/ui/event/impl/FileChangedEvent.java index 06b9de3d..83b88611 100644 --- a/src/main/java/com/ss/editor/ui/event/impl/FileChangedEvent.java +++ b/src/main/java/com/ss/editor/ui/event/impl/FileChangedEvent.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.event.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.ui.event.SceneEvent; import javafx.event.Event; import javafx.event.EventType; diff --git a/src/main/java/com/ss/editor/ui/event/impl/MovedFileEvent.java b/src/main/java/com/ss/editor/ui/event/impl/MovedFileEvent.java index 130d0522..7f5b319b 100644 --- a/src/main/java/com/ss/editor/ui/event/impl/MovedFileEvent.java +++ b/src/main/java/com/ss/editor/ui/event/impl/MovedFileEvent.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.event.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.ui.event.SceneEvent; import javafx.event.Event; import javafx.event.EventType; diff --git a/src/main/java/com/ss/editor/ui/event/impl/RenamedFileEvent.java b/src/main/java/com/ss/editor/ui/event/impl/RenamedFileEvent.java index bd7cbdca..3866c167 100644 --- a/src/main/java/com/ss/editor/ui/event/impl/RenamedFileEvent.java +++ b/src/main/java/com/ss/editor/ui/event/impl/RenamedFileEvent.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.event.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.ui.event.SceneEvent; import javafx.event.Event; import javafx.event.EventType; diff --git a/src/main/java/com/ss/editor/ui/event/impl/RequestSelectFileEvent.java b/src/main/java/com/ss/editor/ui/event/impl/RequestSelectFileEvent.java index 55385b83..57274e06 100644 --- a/src/main/java/com/ss/editor/ui/event/impl/RequestSelectFileEvent.java +++ b/src/main/java/com/ss/editor/ui/event/impl/RequestSelectFileEvent.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.event.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.ui.event.SceneEvent; import javafx.event.EventType; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/ss/editor/ui/event/impl/RequestedConvertFileEvent.java b/src/main/java/com/ss/editor/ui/event/impl/RequestedConvertFileEvent.java index 47c99370..d81e37bb 100644 --- a/src/main/java/com/ss/editor/ui/event/impl/RequestedConvertFileEvent.java +++ b/src/main/java/com/ss/editor/ui/event/impl/RequestedConvertFileEvent.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.event.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.file.converter.FileConverterDescription; import com.ss.editor.ui.event.SceneEvent; import javafx.event.Event; diff --git a/src/main/java/com/ss/editor/ui/event/impl/RequestedCreateFileEvent.java b/src/main/java/com/ss/editor/ui/event/impl/RequestedCreateFileEvent.java index 4d22182e..4711522f 100644 --- a/src/main/java/com/ss/editor/ui/event/impl/RequestedCreateFileEvent.java +++ b/src/main/java/com/ss/editor/ui/event/impl/RequestedCreateFileEvent.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.event.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.ui.component.creator.FileCreatorDescription; import com.ss.editor.ui.event.SceneEvent; import javafx.event.Event; diff --git a/src/main/java/com/ss/editor/ui/event/impl/RequestedOpenFileEvent.java b/src/main/java/com/ss/editor/ui/event/impl/RequestedOpenFileEvent.java index 0be73eda..224a5240 100644 --- a/src/main/java/com/ss/editor/ui/event/impl/RequestedOpenFileEvent.java +++ b/src/main/java/com/ss/editor/ui/event/impl/RequestedOpenFileEvent.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.event.impl; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.ui.component.editor.EditorDescription; import com.ss.editor.ui.event.SceneEvent; import javafx.event.Event; diff --git a/src/main/java/com/ss/editor/ui/preview/FilePreview.java b/src/main/java/com/ss/editor/ui/preview/FilePreview.java index 930567b1..f2467736 100644 --- a/src/main/java/com/ss/editor/ui/preview/FilePreview.java +++ b/src/main/java/com/ss/editor/ui/preview/FilePreview.java @@ -1,9 +1,9 @@ package com.ss.editor.ui.preview; import com.ss.editor.annotation.FxThread; -import com.ss.rlib.util.FileUtils; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.pools.Reusable; +import com.ss.rlib.common.util.FileUtils; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.pools.Reusable; import javafx.scene.layout.StackPane; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/ss/editor/ui/preview/FilePreviewFactory.java b/src/main/java/com/ss/editor/ui/preview/FilePreviewFactory.java index 7ba5fe2f..96eb8825 100644 --- a/src/main/java/com/ss/editor/ui/preview/FilePreviewFactory.java +++ b/src/main/java/com/ss/editor/ui/preview/FilePreviewFactory.java @@ -1,7 +1,7 @@ package com.ss.editor.ui.preview; import com.ss.editor.annotation.FxThread; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.util.array.Array; import org.jetbrains.annotations.NotNull; /** diff --git a/src/main/java/com/ss/editor/ui/preview/FilePreviewFactoryRegistry.java b/src/main/java/com/ss/editor/ui/preview/FilePreviewFactoryRegistry.java index 93925d23..159e882c 100644 --- a/src/main/java/com/ss/editor/ui/preview/FilePreviewFactoryRegistry.java +++ b/src/main/java/com/ss/editor/ui/preview/FilePreviewFactoryRegistry.java @@ -3,10 +3,10 @@ import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.ui.preview.impl.DefaultFilePreviewFactory; -import com.ss.rlib.util.ArrayUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; -import com.ss.rlib.util.array.ConcurrentArray; +import com.ss.rlib.common.util.ArrayUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.ConcurrentArray; import org.jetbrains.annotations.NotNull; import java.util.Collection; diff --git a/src/main/java/com/ss/editor/ui/preview/impl/AbstractFilePreview.java b/src/main/java/com/ss/editor/ui/preview/impl/AbstractFilePreview.java index 0a5450bc..7a7f6c1f 100644 --- a/src/main/java/com/ss/editor/ui/preview/impl/AbstractFilePreview.java +++ b/src/main/java/com/ss/editor/ui/preview/impl/AbstractFilePreview.java @@ -2,7 +2,7 @@ import com.ss.editor.annotation.FxThread; import com.ss.editor.ui.preview.FilePreview; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.scene.Node; import javafx.scene.layout.StackPane; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/ss/editor/ui/preview/impl/DefaultFilePreviewFactory.java b/src/main/java/com/ss/editor/ui/preview/impl/DefaultFilePreviewFactory.java index 9ed1f024..d38e7561 100644 --- a/src/main/java/com/ss/editor/ui/preview/impl/DefaultFilePreviewFactory.java +++ b/src/main/java/com/ss/editor/ui/preview/impl/DefaultFilePreviewFactory.java @@ -3,7 +3,7 @@ import com.ss.editor.annotation.FxThread; import com.ss.editor.ui.preview.FilePreview; import com.ss.editor.ui.preview.FilePreviewFactory; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.util.array.Array; import org.jetbrains.annotations.NotNull; /** diff --git a/src/main/java/com/ss/editor/ui/preview/impl/TextFilePreview.java b/src/main/java/com/ss/editor/ui/preview/impl/TextFilePreview.java index 19f80b1b..dac5203a 100644 --- a/src/main/java/com/ss/editor/ui/preview/impl/TextFilePreview.java +++ b/src/main/java/com/ss/editor/ui/preview/impl/TextFilePreview.java @@ -4,9 +4,9 @@ import com.ss.editor.manager.ResourceManager; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.FileUtils; -import com.ss.rlib.util.Utils; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.FileUtils; +import com.ss.rlib.common.util.Utils; import javafx.scene.control.TextArea; import javafx.scene.layout.StackPane; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/ss/editor/ui/scene/EditorFxScene.java b/src/main/java/com/ss/editor/ui/scene/EditorFxScene.java index 5b4c4b14..1446747b 100644 --- a/src/main/java/com/ss/editor/ui/scene/EditorFxScene.java +++ b/src/main/java/com/ss/editor/ui/scene/EditorFxScene.java @@ -1,17 +1,17 @@ package com.ss.editor.ui.scene; import static com.ss.editor.ui.util.UiUtils.fillComponents; -import static com.ss.rlib.util.ClassUtils.unsafeCast; +import static com.ss.rlib.common.util.ClassUtils.unsafeCast; import com.jme3x.jfx.injfx.input.JFXMouseInput; import com.ss.editor.annotation.FxThread; import com.ss.editor.manager.ExecutorManager; import com.ss.editor.manager.InitializationManager; import com.ss.editor.ui.component.ScreenComponent; import com.ss.editor.ui.css.CssIds; -import com.ss.rlib.ui.util.FXUtils; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.collections.ObservableList; import javafx.scene.Group; import javafx.scene.Node; diff --git a/src/main/java/com/ss/editor/ui/tooltip/CustomTooltip.java b/src/main/java/com/ss/editor/ui/tooltip/CustomTooltip.java index 02f42c96..959e16f8 100644 --- a/src/main/java/com/ss/editor/ui/tooltip/CustomTooltip.java +++ b/src/main/java/com/ss/editor/ui/tooltip/CustomTooltip.java @@ -2,7 +2,7 @@ import com.ss.editor.annotation.FxThread; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.scene.Scene; import javafx.scene.control.Tooltip; import javafx.scene.layout.Region; diff --git a/src/main/java/com/ss/editor/ui/tooltip/ImageChannelPreview.java b/src/main/java/com/ss/editor/ui/tooltip/ImageChannelPreview.java index 5e74988d..048a929d 100644 --- a/src/main/java/com/ss/editor/ui/tooltip/ImageChannelPreview.java +++ b/src/main/java/com/ss/editor/ui/tooltip/ImageChannelPreview.java @@ -1,10 +1,10 @@ package com.ss.editor.ui.tooltip; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FxThread; import com.ss.editor.manager.JavaFxImageManager; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.scene.image.*; import javafx.scene.layout.GridPane; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/ss/editor/ui/tooltip/ImagePreview.java b/src/main/java/com/ss/editor/ui/tooltip/ImagePreview.java index d0b8b609..fc6be478 100644 --- a/src/main/java/com/ss/editor/ui/tooltip/ImagePreview.java +++ b/src/main/java/com/ss/editor/ui/tooltip/ImagePreview.java @@ -1,10 +1,10 @@ package com.ss.editor.ui.tooltip; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FxThread; import com.ss.editor.manager.JavaFxImageManager; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.ui.util.FXUtils; +import com.ss.rlib.fx.util.FXUtils; import javafx.scene.image.ImageView; import javafx.scene.layout.BorderPane; import javafx.stage.Window; diff --git a/src/main/java/com/ss/editor/ui/util/UiUtils.java b/src/main/java/com/ss/editor/ui/util/UiUtils.java index 2572c525..f2d332f4 100644 --- a/src/main/java/com/ss/editor/ui/util/UiUtils.java +++ b/src/main/java/com/ss/editor/ui/util/UiUtils.java @@ -1,7 +1,7 @@ package com.ss.editor.ui.util; import static com.ss.editor.util.EditorUtil.getFxScene; -import static com.ss.rlib.util.ClassUtils.unsafeCast; +import static com.ss.rlib.common.util.ClassUtils.unsafeCast; import static java.lang.Math.min; import com.jme3.math.ColorRGBA; import com.ss.editor.annotation.FromAnyThread; @@ -13,10 +13,10 @@ import com.ss.editor.ui.dialog.asset.file.FolderAssetEditorDialog; import com.ss.editor.ui.dialog.asset.virtual.StringVirtualAssetEditorDialog; import com.ss.editor.ui.dialog.save.SaveAsEditorDialog; -import com.ss.rlib.util.FileUtils; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.FileUtils; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import javafx.beans.property.BooleanProperty; import javafx.beans.property.BooleanPropertyBase; import javafx.beans.value.ChangeListener; diff --git a/src/main/java/com/ss/editor/util/AnimationUtils.java b/src/main/java/com/ss/editor/util/AnimationUtils.java index 5529f3c1..057b5508 100644 --- a/src/main/java/com/ss/editor/util/AnimationUtils.java +++ b/src/main/java/com/ss/editor/util/AnimationUtils.java @@ -1,6 +1,6 @@ package com.ss.editor.util; -import static com.ss.rlib.util.ClassUtils.unsafeCast; +import static com.ss.rlib.common.util.ClassUtils.unsafeCast; import com.jme3.animation.AnimControl; import com.jme3.animation.Animation; import com.jme3.animation.BoneTrack; @@ -8,8 +8,8 @@ import com.jme3.math.Quaternion; import com.jme3.math.Vector3f; import com.ss.editor.annotation.FromAnyThread; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; import java.lang.reflect.Field; diff --git a/src/main/java/com/ss/editor/util/EditorUtil.java b/src/main/java/com/ss/editor/util/EditorUtil.java index 2c04dd34..a0bb7fcd 100644 --- a/src/main/java/com/ss/editor/util/EditorUtil.java +++ b/src/main/java/com/ss/editor/util/EditorUtil.java @@ -1,7 +1,7 @@ package com.ss.editor.util; -import static com.ss.rlib.util.ClassUtils.cast; -import static com.ss.rlib.util.ClassUtils.unsafeCast; +import static com.ss.rlib.common.util.ClassUtils.cast; +import static com.ss.rlib.common.util.ClassUtils.unsafeCast; import static java.lang.Math.acos; import static java.lang.Math.toDegrees; import static java.lang.ThreadLocal.withInitial; @@ -38,11 +38,11 @@ import com.ss.editor.model.undo.editor.SceneChangeConsumer; import com.ss.editor.ui.scene.EditorFxScene; import com.ss.editor.ui.util.UiUtils; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerManager; -import com.ss.rlib.util.ClassUtils; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.array.Array; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; +import com.ss.rlib.common.util.ClassUtils; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.array.Array; import javafx.scene.control.Alert; import javafx.scene.input.ClipboardContent; import javafx.scene.input.DataFormat; diff --git a/src/main/java/com/ss/editor/util/ExtObjectInputStream.java b/src/main/java/com/ss/editor/util/ExtObjectInputStream.java index 9eae4452..effbcc91 100644 --- a/src/main/java/com/ss/editor/util/ExtObjectInputStream.java +++ b/src/main/java/com/ss/editor/util/ExtObjectInputStream.java @@ -1,9 +1,9 @@ package com.ss.editor.util; import com.ss.editor.manager.PluginManager; -import com.ss.rlib.util.ref.Reference; -import com.ss.rlib.util.ref.ReferenceFactory; -import com.ss.rlib.util.ref.ReferenceType; +import com.ss.rlib.common.util.ref.Reference; +import com.ss.rlib.common.util.ref.ReferenceFactory; +import com.ss.rlib.common.util.ref.ReferenceType; import org.jetbrains.annotations.NotNull; import java.io.IOException; diff --git a/src/main/java/com/ss/editor/util/GlslType.java b/src/main/java/com/ss/editor/util/GlslType.java index 963e01ea..2f94dc0b 100644 --- a/src/main/java/com/ss/editor/util/GlslType.java +++ b/src/main/java/com/ss/editor/util/GlslType.java @@ -1,9 +1,9 @@ package com.ss.editor.util; -import static com.ss.rlib.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FromAnyThread; -import com.ss.rlib.util.dictionary.DictionaryFactory; -import com.ss.rlib.util.dictionary.ObjectDictionary; +import com.ss.rlib.common.util.dictionary.DictionaryFactory; +import com.ss.rlib.common.util.dictionary.ObjectDictionary; import org.jetbrains.annotations.NotNull; /** diff --git a/src/main/java/com/ss/editor/util/LocalObjects.java b/src/main/java/com/ss/editor/util/LocalObjects.java index 07550ce1..26e3b2f9 100644 --- a/src/main/java/com/ss/editor/util/LocalObjects.java +++ b/src/main/java/com/ss/editor/util/LocalObjects.java @@ -6,10 +6,10 @@ import com.jme3.scene.Spatial; import com.ss.editor.EditorThread; import com.ss.editor.annotation.FromAnyThread; -import com.ss.rlib.util.CycleBuffer; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; -import com.ss.rlib.util.pools.Reusable; +import com.ss.rlib.common.util.CycleBuffer; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; +import com.ss.rlib.common.util.pools.Reusable; import org.jetbrains.annotations.NotNull; import java.util.Collection; diff --git a/src/main/java/com/ss/editor/util/MaterialSerializer.java b/src/main/java/com/ss/editor/util/MaterialSerializer.java index 9d44bc0f..822a70f5 100644 --- a/src/main/java/com/ss/editor/util/MaterialSerializer.java +++ b/src/main/java/com/ss/editor/util/MaterialSerializer.java @@ -14,7 +14,7 @@ import com.jme3.texture.Texture2D; import com.jme3.texture.TextureCubeMap; import com.ss.editor.annotation.FromAnyThread; -import com.ss.rlib.util.StringUtils; +import com.ss.rlib.common.util.StringUtils; import org.jetbrains.annotations.NotNull; import java.util.Collection; diff --git a/src/main/java/com/ss/editor/util/MaterialUtils.java b/src/main/java/com/ss/editor/util/MaterialUtils.java index b91c9f6e..e728a09f 100644 --- a/src/main/java/com/ss/editor/util/MaterialUtils.java +++ b/src/main/java/com/ss/editor/util/MaterialUtils.java @@ -1,8 +1,8 @@ package com.ss.editor.util; import static com.ss.editor.util.EditorUtil.*; -import static com.ss.rlib.util.ObjectUtils.notNull; -import static com.ss.rlib.util.array.ArrayFactory.toArray; +import static com.ss.rlib.common.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.array.ArrayFactory.toArray; import static java.nio.file.StandardOpenOption.*; import com.jme3.asset.AssetKey; import com.jme3.asset.AssetManager; @@ -17,8 +17,8 @@ import com.ss.editor.FileExtensions; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.JmeThread; -import com.ss.rlib.util.FileUtils; -import com.ss.rlib.util.StringUtils; +import com.ss.rlib.common.util.FileUtils; +import com.ss.rlib.common.util.StringUtils; import jme3tools.converters.ImageToAwt; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/util/NodeUtils.java b/src/main/java/com/ss/editor/util/NodeUtils.java index c9a498ad..a85b04be 100644 --- a/src/main/java/com/ss/editor/util/NodeUtils.java +++ b/src/main/java/com/ss/editor/util/NodeUtils.java @@ -1,6 +1,6 @@ package com.ss.editor.util; -import static com.ss.rlib.util.ClassUtils.unsafeCast; +import static com.ss.rlib.common.util.ClassUtils.unsafeCast; import com.jme3.asset.AssetKey; import com.jme3.audio.AudioNode; import com.jme3.light.Light; @@ -11,9 +11,9 @@ import com.jme3.scene.Spatial; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.JmeThread; -import com.ss.rlib.util.StringUtils; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/util/ReusableCollisionResults.java b/src/main/java/com/ss/editor/util/ReusableCollisionResults.java index 3d39e844..39b029ec 100644 --- a/src/main/java/com/ss/editor/util/ReusableCollisionResults.java +++ b/src/main/java/com/ss/editor/util/ReusableCollisionResults.java @@ -3,9 +3,9 @@ import com.jme3.collision.CollisionResult; import com.jme3.collision.CollisionResults; import com.ss.editor.annotation.JmeThread; -import com.ss.rlib.util.array.Array; -import com.ss.rlib.util.array.ArrayFactory; -import com.ss.rlib.util.pools.Reusable; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayFactory; +import com.ss.rlib.common.util.pools.Reusable; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/ss/editor/util/TangentGenerator.java b/src/main/java/com/ss/editor/util/TangentGenerator.java index e9ce5453..77b941a4 100644 --- a/src/main/java/com/ss/editor/util/TangentGenerator.java +++ b/src/main/java/com/ss/editor/util/TangentGenerator.java @@ -5,8 +5,8 @@ import com.jme3.scene.VertexBuffer; import com.jme3.util.TangentBinormalGenerator; import com.jme3.util.mikktspace.MikktspaceTangentGenerator; -import com.ss.rlib.logging.Logger; -import com.ss.rlib.logging.LoggerManager; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; import org.jetbrains.annotations.NotNull; /** diff --git a/src/test/java/com/ss/editor/test/external/BaseExternalTest.java b/src/test/java/com/ss/editor/test/external/BaseExternalTest.java index a4647dab..7e2f2308 100644 --- a/src/test/java/com/ss/editor/test/external/BaseExternalTest.java +++ b/src/test/java/com/ss/editor/test/external/BaseExternalTest.java @@ -5,7 +5,7 @@ import com.jme3.math.ColorRGBA; import com.jme3.post.FilterPostProcessor; import com.jme3.system.AppSettings; -import com.ss.rlib.util.ClassUtils; +import com.ss.rlib.common.util.ClassUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/test/java/com/ss/editor/test/internal/SetUpApplicationTest.java b/src/test/java/com/ss/editor/test/internal/SetUpApplicationTest.java index 57e6705d..6c40c565 100644 --- a/src/test/java/com/ss/editor/test/internal/SetUpApplicationTest.java +++ b/src/test/java/com/ss/editor/test/internal/SetUpApplicationTest.java @@ -3,8 +3,8 @@ import com.ss.editor.JfxApplication; import com.ss.editor.config.CommandLineConfig; import com.ss.editor.manager.InitializationManager; -import com.ss.rlib.concurrent.util.ThreadUtils; -import com.ss.rlib.util.array.ArrayFactory; +import com.ss.rlib.common.concurrent.util.ThreadUtils; +import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.junit.jupiter.api.AfterAll; From 9540d8e78dd9ba30aa8ba2e4dc4641b8985c275f Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Wed, 18 Apr 2018 09:58:35 +0300 Subject: [PATCH 32/49] refactoring of property controls. --- .../ui/control/property/PropertyControl.java | 11 ++ .../impl/EditableObjectPropertyBuilder.java | 4 +- .../impl/AudioKeyPropertyControl.java | 18 +- .../property/impl/BooleanPropertyControl.java | 8 +- .../property/impl/ColorPropertyControl.java | 14 +- .../property/impl/DefaultPropertyControl.java | 9 +- .../impl/ElementModelPropertyControl.java | 3 +- .../property/impl/ElementPropertyControl.java | 20 ++- .../property/impl/EnumPropertyControl.java | 10 +- .../FilterElementModelPropertyControl.java | 12 +- .../impl/FloatArrayPropertyControl.java | 18 +- .../property/impl/FloatPropertyControl.java | 21 +-- .../impl/IntArrayPropertyControl.java | 70 +------- .../property/impl/IntegerPropertyControl.java | 26 ++- .../impl/LayerModelPropertyControl.java | 18 +- .../LightElementModelPropertyControl.java | 20 ++- .../impl/LodLevelPropertyControl.java | 70 ++++---- .../impl/MaterialKeyPropertyControl.java | 59 +++---- .../impl/MaterialPropertyControl.java | 92 +++++----- .../property/impl/MinMaxPropertyControl.java | 6 +- .../impl/QuaternionPropertyControl.java | 166 +++++++++++------- .../impl/SceneElementPropertyControl.java | 24 +-- .../SpatialElementModelPropertyControl.java | 27 +-- .../impl/StringBasedArrayPropertyControl.java | 25 ++- .../property/impl/StringPropertyControl.java | 14 +- .../Texture2DSingleRowPropertyControl.java | 2 +- ...rol.java => Texture2dPropertyControl.java} | 71 +++++--- .../java/com/ss/editor/util/EditorUtil.java | 49 +++++- 28 files changed, 476 insertions(+), 411 deletions(-) rename src/main/java/com/ss/editor/ui/control/property/impl/{Texture2DPropertyControl.java => Texture2dPropertyControl.java} (84%) diff --git a/src/main/java/com/ss/editor/ui/control/property/PropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/PropertyControl.java index 5d7261b9..148e1262 100644 --- a/src/main/java/com/ss/editor/ui/control/property/PropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/PropertyControl.java @@ -26,6 +26,7 @@ import org.jetbrains.annotations.Nullable; import java.util.Objects; +import java.util.Optional; import java.util.function.BiConsumer; import java.util.function.Function; import java.util.function.Predicate; @@ -456,6 +457,16 @@ protected void changed(@Nullable T newValue, @Nullable T oldValue) { return propertyValue; } + /** + * Get the property value. + * + * @return the value of the property. + */ + @FxThread + public @NotNull Optional getPropertyValueOpt() { + return Optional.ofNullable(getPropertyValue()); + } + /** * Get the apply handler. * diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/EditableObjectPropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/EditableObjectPropertyBuilder.java index 0890beb6..e93857a7 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/EditableObjectPropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/EditableObjectPropertyBuilder.java @@ -190,8 +190,8 @@ protected void buildFor( final EditableProperty property = cast(description); final Texture2D value = property.getValue(); - final Texture2DPropertyControl> propertyControl = - new Texture2DPropertyControl<>(value, property.getName(), changeConsumer); + final Texture2dPropertyControl> propertyControl = + new Texture2dPropertyControl<>(value, property.getName(), changeConsumer); addControl(container, property, propertyControl); break; diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/AudioKeyPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/AudioKeyPropertyControl.java index a3f06d58..b608bca3 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/AudioKeyPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/AudioKeyPropertyControl.java @@ -100,17 +100,23 @@ protected void createComponents(@NotNull HBox container) { openButton.setGraphic(new ImageView(Icons.EDIT_16)); openButton.setOnAction(this::openAudio); openButton.disableProperty() - .bind(audioKeyLabel.textProperty().isEqualTo(NO_AUDIO)); + .bind(audioKeyLabel.textProperty().isEqualTo(NO_AUDIO)); audioKeyLabel.prefWidthProperty().bind(widthProperty() .subtract(changeButton.widthProperty()) .subtract(openButton.widthProperty())); - FxUtils.addChild(container, audioKeyLabel, changeButton, openButton); - FxUtils.addClass(container, CssClasses.TEXT_INPUT_CONTAINER, CssClasses.ABSTRACT_PARAM_CONTROL_INPUT_CONTAINER) - .addClass(audioKeyLabel, CssClasses.ABSTRACT_PARAM_CONTROL_ELEMENT_LABEL) - .addClass(changeButton, CssClasses.FLAT_BUTTON, CssClasses.INPUT_CONTROL_TOOLBAR_BUTTON) - .addClass(openButton, CssClasses.FLAT_BUTTON, CssClasses.INPUT_CONTROL_TOOLBAR_BUTTON); + FxUtils.addClass(container, + CssClasses.TEXT_INPUT_CONTAINER, + CssClasses.ABSTRACT_PARAM_CONTROL_INPUT_CONTAINER) + .addClass(audioKeyLabel, + CssClasses.ABSTRACT_PARAM_CONTROL_ELEMENT_LABEL) + .addClass(changeButton, openButton, + CssClasses.FLAT_BUTTON, + CssClasses.INPUT_CONTROL_TOOLBAR_BUTTON); + + FxUtils.addChild(container, + audioKeyLabel, changeButton, openButton); DynamicIconSupport.addSupport(changeButton, openButton); } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/BooleanPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/BooleanPropertyControl.java index 87ef04e2..98dc8719 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/BooleanPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/BooleanPropertyControl.java @@ -2,19 +2,15 @@ import static com.ss.rlib.common.util.ObjectUtils.notNull; import static java.lang.Boolean.TRUE; - import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.fx.util.FXUtils; import com.ss.rlib.fx.util.FxControlUtils; import com.ss.rlib.fx.util.FxUtils; -import javafx.beans.value.ObservableValue; import javafx.scene.control.CheckBox; import javafx.scene.layout.HBox; -import javafx.scene.layout.Region; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -63,8 +59,10 @@ protected void createComponents(@NotNull HBox container) { FxControlUtils.onSelectedChange(checkBox, this::updateValue); + FxUtils.addClass(checkBox, + CssClasses.ABSTRACT_PARAM_CONTROL_CHECK_BOX); + FxUtils.addChild(container, checkBox); - FxUtils.addClass(checkBox, CssClasses.ABSTRACT_PARAM_CONTROL_CHECK_BOX); } @Override diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/ColorPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/ColorPropertyControl.java index 7d2d115d..08fbb707 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/ColorPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/ColorPropertyControl.java @@ -2,13 +2,12 @@ import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.math.ColorRGBA; -import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; +import com.ss.editor.annotation.FxThread; import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.util.UiUtils; -import com.ss.rlib.fx.util.FXUtils; import com.ss.rlib.fx.util.FxControlUtils; import com.ss.rlib.fx.util.FxUtils; import javafx.scene.control.ColorPicker; @@ -46,12 +45,14 @@ protected void createComponents(@NotNull HBox container) { colorPicker = new ColorPicker(); colorPicker.prefWidthProperty() - .bind(widthProperty().multiply(CONTROL_WIDTH_PERCENT)); + .bind(widthProperty().multiply(CONTROL_WIDTH_PERCENT)); FxControlUtils.onColorChange(colorPicker, this::updateValue); + FxUtils.addClass(colorPicker, + CssClasses.ABSTRACT_PARAM_CONTROL_COLOR_PICKER); + FxUtils.addChild(container, colorPicker); - FxUtils.addClass(colorPicker, CssClasses.ABSTRACT_PARAM_CONTROL_COLOR_PICKER); } @Override @@ -59,9 +60,8 @@ protected void createComponents(@NotNull HBox container) { public void changeControlWidthPercent(double controlWidthPercent) { super.changeControlWidthPercent(controlWidthPercent); - var width = getColorPicker().prefWidthProperty(); - width.unbind(); - width.bind(widthProperty().multiply(controlWidthPercent)); + FxUtils.rebindPrefWidth(getColorPicker(), + widthProperty().multiply(controlWidthPercent)); } @Override diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/DefaultPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/DefaultPropertyControl.java index 90b81cd7..b919d17a 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/DefaultPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/DefaultPropertyControl.java @@ -1,12 +1,11 @@ package com.ss.editor.ui.control.property.impl; import static com.ss.rlib.common.util.ObjectUtils.notNull; -import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; +import com.ss.editor.annotation.FxThread; import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.fx.util.FXUtils; import com.ss.rlib.fx.util.FxUtils; import javafx.scene.control.Label; import javafx.scene.layout.HBox; @@ -81,10 +80,12 @@ protected void createComponents(@NotNull HBox container) { propertyValueLabel = new Label(); propertyValueLabel.prefWidthProperty() - .bind(container.widthProperty()); + .bind(container.widthProperty()); - FxUtils.addClass(propertyValueLabel, CssClasses.ABSTRACT_PARAM_CONTROL_LABEL_VALUE, + FxUtils.addClass(propertyValueLabel, + CssClasses.ABSTRACT_PARAM_CONTROL_LABEL_VALUE, CssClasses.TEXT_INPUT_CONTAINER); + FxUtils.addChild(container, propertyValueLabel); } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/ElementModelPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/ElementModelPropertyControl.java index 14f9d24a..69dc98ba 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/ElementModelPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/ElementModelPropertyControl.java @@ -9,7 +9,8 @@ /** * The implementation of the {@link ElementPropertyControl} to edit elements from models. * - * @param the edited object's type. + * @param the type of an editing object. + * @param the type of an editing property. * @author JavaSaBr */ public abstract class ElementModelPropertyControl extends ElementPropertyControl { diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/ElementPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/ElementPropertyControl.java index 2adb2cef..de622f0b 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/ElementPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/ElementPropertyControl.java @@ -8,7 +8,6 @@ import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.util.DynamicIconSupport; -import com.ss.rlib.fx.util.FXUtils; import com.ss.rlib.fx.util.FxUtils; import javafx.scene.control.Button; import javafx.scene.control.Label; @@ -20,9 +19,9 @@ /** * The implementation of the {@link PropertyControl} to edit an elements from scene. * - * @param the change consumer's type. - * @param the edited object's type. - * @param the element's type. + * @param the type of a change consumer. + * @param the type of an editing object. + * @param the type of an editing property. * @author JavaSaBr */ public class ElementPropertyControl extends PropertyControl { @@ -74,11 +73,16 @@ protected void createComponents(@NotNull HBox container) { editButton.disableProperty() .bind(elementLabel.textProperty().isEqualTo(NO_ELEMENT)); + FxUtils.addClass(container, + CssClasses.TEXT_INPUT_CONTAINER, + CssClasses.ABSTRACT_PARAM_CONTROL_INPUT_CONTAINER) + .addClass(elementLabel, + CssClasses.ABSTRACT_PARAM_CONTROL_ELEMENT_LABEL) + .addClass(changeButton, editButton, + CssClasses.FLAT_BUTTON, + CssClasses.INPUT_CONTROL_TOOLBAR_BUTTON); + FxUtils.addChild(container, elementLabel, changeButton, editButton); - FxUtils.addClass(container, CssClasses.TEXT_INPUT_CONTAINER, CssClasses.ABSTRACT_PARAM_CONTROL_INPUT_CONTAINER) - .addClass(elementLabel, CssClasses.ABSTRACT_PARAM_CONTROL_ELEMENT_LABEL) - .addClass(changeButton, CssClasses.FLAT_BUTTON, CssClasses.INPUT_CONTROL_TOOLBAR_BUTTON) - .addClass(editButton, CssClasses.FLAT_BUTTON, CssClasses.INPUT_CONTROL_TOOLBAR_BUTTON); DynamicIconSupport.addSupport(changeButton, editButton); } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/EnumPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/EnumPropertyControl.java index ef0a502d..41bf0faa 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/EnumPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/EnumPropertyControl.java @@ -7,6 +7,7 @@ import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; +import com.ss.rlib.fx.util.FxControlUtils; import com.ss.rlib.fx.util.FxUtils; import javafx.scene.control.ComboBox; import javafx.scene.layout.HBox; @@ -66,14 +67,15 @@ protected void createComponents(@NotNull HBox container) { super.createComponents(container); enumComboBox = new ComboBox<>(); - enumComboBox.getSelectionModel() - .selectedItemProperty() - .addListener((observable, oldValue, newValue) -> change()); enumComboBox.prefWidthProperty() .bind(widthProperty().multiply(CONTROL_WIDTH_PERCENT)); + FxControlUtils.onSelectedItemChange(enumComboBox, this::change); + + FxUtils.addClass(enumComboBox, + CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); + FxUtils.addChild(container, enumComboBox); - FxUtils.addClass(enumComboBox, CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); } /** diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/FilterElementModelPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/FilterElementModelPropertyControl.java index ca7d07e3..812e22b5 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/FilterElementModelPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/FilterElementModelPropertyControl.java @@ -5,7 +5,7 @@ import com.ss.editor.model.undo.editor.SceneChangeConsumer; import com.ss.editor.ui.dialog.scene.selector.FilterSceneSelectorDialog; import com.ss.editor.ui.dialog.scene.selector.SceneSelectorDialog; -import javafx.scene.control.Label; +import com.ss.rlib.common.util.StringUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -28,16 +28,18 @@ public FilterElementModelPropertyControl( @Override @FxThread protected @NotNull SceneSelectorDialog createSceneSelectorDialog() { - return new FilterSceneSelectorDialog(getChangeConsumer().getCurrentModel(), this::processAdd); + return new FilterSceneSelectorDialog(getChangeConsumer().getCurrentModel(), this::addElement); } @Override @FxThread protected void reload() { + var filter = getPropertyValue(); - var elementLabel = getElementLabel(); + String name = filter == null ? null : filter.getName(); - name = name == null && filter != null ? filter.getClass().getSimpleName() : name; - elementLabel.setText(name == null ? NO_ELEMENT : name); + name = StringUtils.isEmpty(name) && filter != null ? filter.getClass().getSimpleName() : name; + + getElementLabel().setText(StringUtils.ifEmpty(name, NO_ELEMENT)); } } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/FloatArrayPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/FloatArrayPropertyControl.java index 3ef04744..c40b9d3e 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/FloatArrayPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/FloatArrayPropertyControl.java @@ -5,9 +5,6 @@ import com.ss.editor.ui.control.property.PropertyControl; import com.ss.rlib.common.util.ArrayUtils; import com.ss.rlib.common.util.StringUtils; -import javafx.scene.control.TextField; -import javafx.scene.input.KeyCode; -import javafx.scene.input.KeyEvent; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -65,20 +62,7 @@ public boolean isDirty() { @Override @FxThread - protected void updateValue(@Nullable KeyEvent event) { - if (!isIgnoreListener() && (event == null || event.getCode() == KeyCode.ENTER)) { - apply(); - } - } - - @Override - @FxThread - protected void apply() { - super.apply(); - changed(getCurrentValue(), getPropertyValue()); - } - - private @Nullable float[] getCurrentValue() { + protected @Nullable float[] getCurrentValue() { var textValue = getValueField().getText(); diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/FloatPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/FloatPropertyControl.java index 2ae0ea52..42affe77 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/FloatPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/FloatPropertyControl.java @@ -8,8 +8,6 @@ import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; import com.ss.rlib.fx.control.input.FloatTextField; -import com.ss.rlib.fx.util.FXUtils; -import com.ss.rlib.common.util.NumberUtils; import com.ss.rlib.fx.util.FxControlUtils; import com.ss.rlib.fx.util.FxUtils; import javafx.scene.layout.HBox; @@ -38,7 +36,6 @@ public FloatPropertyControl( @NotNull String propertyName, @NotNull C changeConsumer ) { - super(propertyValue, propertyName, changeConsumer); } @@ -48,7 +45,6 @@ public FloatPropertyControl( @NotNull C changeConsumer, @Nullable ChangeHandler changeHandler ) { - super(propertyValue, propertyName, changeConsumer, changeHandler); } @@ -58,7 +54,7 @@ public void changeControlWidthPercent(double controlWidthPercent) { super.changeControlWidthPercent(controlWidthPercent); FxUtils.rebindPrefWidth(getValueField(), - widthProperty().multiply(controlWidthPercent)); + widthProperty().multiply(controlWidthPercent)); } @Override @@ -69,13 +65,14 @@ protected void createComponents(@NotNull HBox container) { valueField = new FloatTextField(); valueField.prefWidthProperty() .bind(widthProperty().multiply(CONTROL_WIDTH_PERCENT)); - valueField.focusedProperty() - .addListener((observable, oldValue, newValue) -> applyOnLostFocus(newValue)); FxControlUtils.onValueChange(valueField, this::updateValue); + FxControlUtils.onFocusChange(valueField, this::applyOnLostFocus); + + FxUtils.addClass(valueField, + CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); - FXUtils.addClassTo(valueField, CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); - FXUtils.addToPane(valueField, container); + FxUtils.addChild(container, valueField); } /** @@ -154,10 +151,6 @@ private void updateValue() { @FxThread protected void apply() { super.apply(); - - var currentValue = getValueField().getValue(); - var storedValue = getPropertyValue(); - - changed(currentValue, storedValue); + changed(getValueField().getValue(), getPropertyValue()); } } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/IntArrayPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/IntArrayPropertyControl.java index 45a171cb..5e2ea535 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/IntArrayPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/IntArrayPropertyControl.java @@ -1,21 +1,16 @@ package com.ss.editor.ui.control.property.impl; -import static com.ss.rlib.common.util.ObjectUtils.notNull; -import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.control.property.PropertyControl; -import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.fx.util.FxUtils; import com.ss.rlib.common.util.ArrayUtils; import com.ss.rlib.common.util.StringUtils; import javafx.scene.control.TextField; -import javafx.scene.input.KeyCode; -import javafx.scene.input.KeyEvent; -import javafx.scene.layout.HBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Arrays; + /** * The implementation of the {@link PropertyControl} to edit int array values. * @@ -23,7 +18,7 @@ * @param the type of an editing object. * @author JavaSaBr */ -public class IntArrayPropertyControl extends PropertyControl { +public class IntArrayPropertyControl extends StringBasedArrayPropertyControl { /** * The filed with current value. @@ -48,46 +43,6 @@ public IntArrayPropertyControl( super(propertyValue, propertyName, changeConsumer, changeHandler); } - @Override - @FxThread - public void changeControlWidthPercent(double controlWidthPercent) { - super.changeControlWidthPercent(controlWidthPercent); - - var valueField = getValueField(); - valueField.prefWidthProperty().unbind(); - valueField.prefWidthProperty().bind(widthProperty().multiply(controlWidthPercent)); - } - - @Override - @FxThread - protected void createComponents(@NotNull HBox container) { - super.createComponents(container); - - valueField = new TextField(); - valueField.setOnKeyReleased(this::updateValue); - valueField.prefWidthProperty() - .bind(widthProperty().multiply(CONTROL_WIDTH_PERCENT)); - - FxUtils.addClass(valueField, CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); - FxUtils.addChild(container, valueField); - } - - @Override - @FromAnyThread - protected boolean isSingleRow() { - return true; - } - - /** - * Get the filed with current value. - * - * @return the filed with current value. - */ - @FxThread - private @NotNull TextField getValueField() { - return notNull(valueField); - } - @Override @FxThread protected void reload() { @@ -109,23 +64,12 @@ protected void reload() { @Override @FxThread public boolean isDirty() { - return super.isDirty(); - } - - /** - * Update the value. - */ - @FxThread - private void updateValue(@Nullable KeyEvent event) { - if (!isIgnoreListener() && (event == null || event.getCode() == KeyCode.ENTER)) { - apply(); - } + return !Arrays.equals(getCurrentValue(), getPropertyValue()); } @Override @FxThread - protected void apply() { - super.apply(); + protected @Nullable int[] getCurrentValue() { var textValue = getValueField().getText(); @@ -138,7 +82,7 @@ protected void apply() { newValue = new int[split.length]; - for (int i = 0; i < split.length; i++) { + for (var i = 0; i < split.length; i++) { try { newValue[i] = Integer.parseInt(split[i]); } catch (NumberFormatException e) { @@ -149,6 +93,6 @@ protected void apply() { } } - changed(newValue, getPropertyValue()); + return newValue; } } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/IntegerPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/IntegerPropertyControl.java index 895097f8..700787e6 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/IntegerPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/IntegerPropertyControl.java @@ -8,7 +8,8 @@ import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; import com.ss.rlib.fx.control.input.IntegerTextField; -import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.fx.util.FxControlUtils; +import com.ss.rlib.fx.util.FxUtils; import javafx.scene.layout.HBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -43,9 +44,8 @@ public IntegerPropertyControl( public void changeControlWidthPercent(double controlWidthPercent) { super.changeControlWidthPercent(controlWidthPercent); - var valueField = getValueField(); - valueField.prefWidthProperty().unbind(); - valueField.prefWidthProperty().bind(widthProperty().multiply(controlWidthPercent)); + FxUtils.rebindPrefWidth(getValueField(), + widthProperty().multiply(controlWidthPercent)); } @Override @@ -54,14 +54,16 @@ protected void createComponents(@NotNull HBox container) { super.createComponents(container); valueField = new IntegerTextField(); - valueField.addChangeListener((observable, oldValue, newValue) -> updateValue()); valueField.prefWidthProperty() .bind(widthProperty().multiply(CONTROL_WIDTH_PERCENT)); - valueField.focusedProperty() - .addListener((observable, oldValue, newValue) -> applyOnLostFocus(newValue)); - FXUtils.addClassTo(valueField, CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); - FXUtils.addToPane(valueField, container); + FxControlUtils.onValueChange(valueField, this::updateValue); + FxControlUtils.onFocusChange(valueField, this::applyOnLostFocus); + + FxUtils.addClass(valueField, + CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); + + FxUtils.addChild(container, valueField); } @Override @@ -140,10 +142,6 @@ private void updateValue() { @FxThread protected void apply() { super.apply(); - - var currentValue = getValueField().getValue(); - var storedValue = getPropertyValue(); - - changed(currentValue, storedValue); + changed(getValueField().getValue(), getPropertyValue()); } } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/LayerModelPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/LayerModelPropertyControl.java index 48e1725e..e389e754 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/LayerModelPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/LayerModelPropertyControl.java @@ -1,5 +1,6 @@ package com.ss.editor.ui.control.property.impl; +import static com.ss.rlib.common.util.ObjectUtils.ifNull; import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.scene.Spatial; import com.ss.editor.Messages; @@ -13,6 +14,7 @@ import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.control.property.operation.PropertyOperation; import com.ss.editor.ui.css.CssClasses; +import com.ss.rlib.fx.util.FxControlUtils; import com.ss.rlib.fx.util.FxUtils; import javafx.scene.control.ComboBox; import javafx.scene.control.ListCell; @@ -50,7 +52,7 @@ protected void updateItem(@Nullable SceneLayer layer, boolean empty) { private ComboBox layerComboBox; public LayerModelPropertyControl(@Nullable SceneLayer layer, @NotNull SceneChangeConsumer changeConsumer) { - super(layer == null ? SceneLayer.NO_LAYER : layer, Messages.MODEL_PROPERTY_LAYER, changeConsumer); + super(ifNull(layer, SceneLayer.NO_LAYER), Messages.MODEL_PROPERTY_LAYER, changeConsumer); setApplyHandler(this::setLayer); setSyncHandler(this::getLayer); } @@ -75,8 +77,7 @@ private void setLayer(@NotNull Spatial spatial, @NotNull SceneLayer newLayer) { @JmeThread private SceneLayer getLayer(@NotNull Spatial spatial) { - var sceneLayer = SceneLayer.getLayer(spatial); - return sceneLayer == null ? SceneLayer.NO_LAYER : sceneLayer; + return ifNull(SceneLayer.getLayer(spatial), SceneLayer.NO_LAYER); } @Override @@ -94,12 +95,15 @@ protected void createComponents(@NotNull HBox container) { layerComboBox.setCellFactory(param -> new LayerCell()); layerComboBox.setButtonCell(new LayerCell()); layerComboBox.setEditable(false); - layerComboBox.prefWidthProperty().bind(widthProperty().multiply(CONTROL_WIDTH_PERCENT)); - layerComboBox.getSelectionModel().selectedItemProperty() - .addListener((observable, oldValue, newValue) -> updateLevel(newValue)); + layerComboBox.prefWidthProperty() + .bind(widthProperty().multiply(CONTROL_WIDTH_PERCENT)); + + FxControlUtils.onSelectedItemChange(layerComboBox, this::updateLevel); + + FxUtils.addClass(layerComboBox, + CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); FxUtils.addChild(container, layerComboBox); - FxUtils.addClass(layerComboBox, CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); } @FxThread diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/LightElementModelPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/LightElementModelPropertyControl.java index b8c56c8b..4068fe5d 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/LightElementModelPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/LightElementModelPropertyControl.java @@ -5,7 +5,7 @@ import com.ss.editor.model.undo.editor.ModelChangeConsumer; import com.ss.editor.ui.dialog.node.selector.LightSelectorDialog; import com.ss.editor.ui.dialog.node.selector.NodeSelectorDialog; -import javafx.scene.control.Label; +import com.ss.rlib.common.util.StringUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -17,29 +17,31 @@ */ public class LightElementModelPropertyControl extends ElementModelPropertyControl { - public LightElementModelPropertyControl(@NotNull final Class type, @Nullable final L propertyValue, - @NotNull final String propertyName, - @NotNull final ModelChangeConsumer changeConsumer) { + public LightElementModelPropertyControl( + @NotNull Class type, + @Nullable L propertyValue, + @NotNull String propertyName, + @NotNull ModelChangeConsumer changeConsumer + ) { super(type, propertyValue, propertyName, changeConsumer); } @Override @FxThread protected @NotNull NodeSelectorDialog createNodeSelectorDialog() { - final ModelChangeConsumer changeConsumer = getChangeConsumer(); - return new LightSelectorDialog<>(changeConsumer.getCurrentModel(), type, this::addElement); + return new LightSelectorDialog<>(getChangeConsumer().getCurrentModel(), type, this::addElement); } @Override @FxThread protected void reload() { - final L light = getPropertyValue(); - final Label elementLabel = getElementLabel(); + var light = getPropertyValue(); + var elementLabel = getElementLabel(); String name = light == null ? null : light.getName(); name = name == null && light != null ? light.getClass().getSimpleName() : name; - elementLabel.setText(name == null ? NO_ELEMENT : name); + elementLabel.setText(StringUtils.ifEmpty(name, NO_ELEMENT)); } } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/LodLevelPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/LodLevelPropertyControl.java index a58a36d9..dc7f9c3a 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/LodLevelPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/LodLevelPropertyControl.java @@ -1,17 +1,15 @@ package com.ss.editor.ui.control.property.impl; import com.jme3.scene.Geometry; -import com.jme3.scene.Mesh; -import com.jme3.scene.VertexBuffer; import com.ss.editor.Messages; -import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; +import com.ss.editor.annotation.FxThread; import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.fx.util.FXUtils; import com.ss.rlib.common.util.ObjectUtils; -import javafx.collections.ObservableList; +import com.ss.rlib.fx.util.FxControlUtils; +import com.ss.rlib.fx.util.FxUtils; import javafx.scene.control.ComboBox; import javafx.scene.control.ListCell; import javafx.scene.layout.HBox; @@ -28,11 +26,11 @@ public class LodLevelPropertyControl extends PropertyC private class LodLevelCell extends ListCell { @Override - protected void updateItem(@Nullable final Integer level, final boolean empty) { + protected void updateItem(@Nullable Integer level, boolean empty) { super.updateItem(level, empty); - final Geometry geometry = getEditObject(); - final Mesh mesh = geometry.getMesh(); + var geometry = getEditObject(); + var mesh = geometry.getMesh(); if (level == null || mesh == null) { setText("None"); @@ -42,7 +40,7 @@ protected void updateItem(@Nullable final Integer level, final boolean empty) { int elements; if (level < mesh.getNumLodLevels()) { - final VertexBuffer lodLevel = mesh.getLodLevel(level); + var lodLevel = mesh.getLodLevel(level); elements = lodLevel.getNumElements(); } else { elements = mesh.getTriangleCount(); @@ -59,8 +57,11 @@ protected void updateItem(@Nullable final Integer level, final boolean empty) { @Nullable private ComboBox levelComboBox; - public LodLevelPropertyControl(@Nullable final Integer element, @NotNull final String paramName, - @NotNull final C changeConsumer) { + public LodLevelPropertyControl( + @Nullable Integer element, + @NotNull String paramName, + @NotNull C changeConsumer + ) { super(element, paramName, changeConsumer); } @@ -72,19 +73,22 @@ protected boolean isSingleRow() { @Override @FxThread - protected void createComponents(@NotNull final HBox container) { + protected void createComponents(@NotNull HBox container) { super.createComponents(container); levelComboBox = new ComboBox<>(); levelComboBox.setCellFactory(param -> new LodLevelCell()); levelComboBox.setButtonCell(new LodLevelCell()); levelComboBox.setEditable(false); - levelComboBox.prefWidthProperty().bind(widthProperty().multiply(CONTROL_WIDTH_PERCENT)); - levelComboBox.getSelectionModel().selectedItemProperty() - .addListener((observable, oldValue, newValue) -> updateLevel(newValue)); + levelComboBox.prefWidthProperty() + .bind(widthProperty().multiply(CONTROL_WIDTH_PERCENT)); + + FxControlUtils.onSelectedItemChange(levelComboBox, this::updateLevel); - FXUtils.addToPane(levelComboBox, container); - FXUtils.addClassTo(levelComboBox, CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); + FxUtils.addClass(levelComboBox, + CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); + + FxUtils.addChild(container, levelComboBox); } /** @@ -93,22 +97,21 @@ protected void createComponents(@NotNull final HBox container) { * @param newValue the new level. */ @FxThread - private void updateLevel(@Nullable final Integer newValue) { + private void updateLevel(@Nullable Integer newValue) { if (isIgnoreListener()) return; - changed(newValue == null ? 0 : newValue, getPropertyValue()); + changed(ObjectUtils.ifNull(newValue, 0), getPropertyValue()); } @Override @FxThread public @NotNull Integer getPropertyValue() { - final Integer value = super.getPropertyValue(); - return value == null ? 0 : value; + return ObjectUtils.ifNull(super.getPropertyValue(), 0); } /** - * Gets level combo box. + * Get the level combo box. * - * @return The lod level combobox. + * @return The lod level combo box. */ @FxThread protected @NotNull ComboBox getLevelComboBox() { @@ -123,18 +126,20 @@ protected void reload() { return; } - final Geometry geometry = getEditObject(); - final Mesh mesh = geometry.getMesh(); - if (mesh == null) return; + var geometry = getEditObject(); + var mesh = geometry.getMesh(); + if (mesh == null) { + return; + } - final Integer element = getPropertyValue(); - final ComboBox levelComboBox = getLevelComboBox(); - final ObservableList items = levelComboBox.getItems(); + var element = getPropertyValue(); + var levelComboBox = getLevelComboBox(); + var items = levelComboBox.getItems(); items.clear(); - final int numLodLevels = mesh.getNumLodLevels(); + var numLodLevels = mesh.getNumLodLevels(); - for (int i = 0; i < numLodLevels; i++) { + for (var i = 0; i < numLodLevels; i++) { items.add(i); } @@ -142,6 +147,7 @@ protected void reload() { items.add(0); } - levelComboBox.getSelectionModel().select(element); + levelComboBox.getSelectionModel() + .select(element); } } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/MaterialKeyPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/MaterialKeyPropertyControl.java index bb08d92e..ba1332a9 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/MaterialKeyPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/MaterialKeyPropertyControl.java @@ -1,20 +1,19 @@ package com.ss.editor.ui.control.property.impl; -import static com.ss.editor.util.EditorUtil.*; +import static com.ss.editor.util.EditorUtil.getAssetFile; +import static com.ss.editor.util.EditorUtil.toAssetPath; import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.asset.MaterialKey; import com.ss.editor.annotation.FxThread; import com.ss.editor.model.undo.editor.ChangeConsumer; -import com.ss.editor.ui.event.impl.RequestedOpenFileEvent; import com.ss.editor.ui.util.UiUtils; +import com.ss.editor.util.EditorUtil; import com.ss.rlib.common.util.StringUtils; -import javafx.scene.control.Label; +import javafx.event.ActionEvent; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; /** * The implementation of the {@link MaterialPropertyControl} to edit the {@link MaterialKey}. @@ -24,23 +23,26 @@ */ public class MaterialKeyPropertyControl extends MaterialPropertyControl { - public MaterialKeyPropertyControl(@Nullable final MaterialKey element, @NotNull final String paramName, - @NotNull final C changeConsumer) { + public MaterialKeyPropertyControl( + @Nullable MaterialKey element, + @NotNull String paramName, + @NotNull C changeConsumer + ) { super(element, paramName, changeConsumer); } - @FxThread @Override - protected void processChange() { + @FxThread + protected void change(@Nullable ActionEvent event) { UiUtils.openFileAssetDialog(this::addMaterial, MATERIAL_EXTENSIONS, DEFAULT_ACTION_TESTER); } - @FxThread @Override - protected void addMaterial(@NotNull final Path file) { + @FxThread + protected void addMaterial(@NotNull Path file) { - final Path assetFile = notNull(getAssetFile(file)); - final MaterialKey materialKey = new MaterialKey(toAssetPath(assetFile)); + var assetFile = notNull(getAssetFile(file)); + var materialKey = new MaterialKey(toAssetPath(assetFile)); changed(materialKey, getPropertyValue()); setIgnoreListener(true); @@ -51,34 +53,17 @@ protected void addMaterial(@NotNull final Path file) { } } - @FxThread @Override - protected void processEdit() { - - final MaterialKey element = getPropertyValue(); - if (element == null) { - return; - } - - final String assetPath = element.getName(); - if (StringUtils.isEmpty(assetPath)) { - return; - } - - final Path assetFile = Paths.get(assetPath); - final Path realFile = notNull(getRealFile(assetFile)); - if (!Files.exists(realFile)) { - return; - } - - FX_EVENT_MANAGER.notify(new RequestedOpenFileEvent(realFile)); + @FxThread + protected void openToEdit(@Nullable ActionEvent event) { + EditorUtil.openInEditor(getPropertyValue()); } - @FxThread @Override + @FxThread protected void reload() { - final MaterialKey element = getPropertyValue(); - final Label materialLabel = getMaterialLabel(); - materialLabel.setText(element == null || StringUtils.isEmpty(element.getName()) ? NO_MATERIAL : element.getName()); + var element = getPropertyValue(); + getMaterialLabel().setText(element == null || StringUtils.isEmpty(element.getName()) ? + NO_MATERIAL : element.getName()); } } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/MaterialPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/MaterialPropertyControl.java index 63d07c36..28bb3fa3 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/MaterialPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/MaterialPropertyControl.java @@ -1,6 +1,5 @@ package com.ss.editor.ui.control.property.impl; -import static com.ss.rlib.common.util.ClassUtils.unsafeCast; import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.material.Material; import com.jme3.scene.Spatial; @@ -12,24 +11,21 @@ import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.util.DynamicIconSupport; -import com.ss.rlib.fx.util.FXUtils; +import com.ss.editor.util.EditorUtil; import com.ss.rlib.common.util.array.Array; import com.ss.rlib.common.util.array.ArrayFactory; +import com.ss.rlib.fx.util.FxUtils; +import javafx.event.ActionEvent; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.image.ImageView; -import javafx.scene.input.DataFormat; import javafx.scene.input.DragEvent; -import javafx.scene.input.Dragboard; import javafx.scene.input.TransferMode; import javafx.scene.layout.HBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.io.File; import java.nio.file.Path; -import java.util.List; -import java.util.Set; /** * The implementation of the {@link PropertyControl} to edit the {@link Material}. @@ -53,13 +49,16 @@ public class MaterialPropertyControl extends Pro protected static final Array MATERIAL_EXTENSIONS = ArrayFactory.asArray(FileExtensions.JME_MATERIAL); /** - * The label with name of the material. + * The material name label. */ @Nullable private Label materialLabel; - public MaterialPropertyControl(@Nullable final V element, @NotNull final String paramName, - @NotNull final C changeConsumer) { + public MaterialPropertyControl( + @Nullable V element, + @NotNull String paramName, + @NotNull C changeConsumer + ) { super(element, paramName, changeConsumer); setOnDragOver(this::handleDragOverEvent); setOnDragDropped(this::handleDragDroppedEvent); @@ -67,12 +66,12 @@ public MaterialPropertyControl(@Nullable final V element, @NotNull final String } /** - * Handle grad exited events. + * Handle drag exited events. * * @param dragEvent the drag exited event. */ @FxThread - private void handleDragExitedEvent(@NotNull final DragEvent dragEvent) { + private void handleDragExitedEvent(@NotNull DragEvent dragEvent) { } @@ -82,16 +81,14 @@ private void handleDragExitedEvent(@NotNull final DragEvent dragEvent) { * @param dragEvent the dropped event. */ @FxThread - private void handleDragDroppedEvent(@NotNull final DragEvent dragEvent) { + private void handleDragDroppedEvent(@NotNull DragEvent dragEvent) { - final Dragboard dragboard = dragEvent.getDragboard(); - final List files = unsafeCast(dragboard.getContent(DataFormat.FILES)); - - if (files == null || files.size() != 1) { + var files = EditorUtil.getFiles(dragEvent.getDragboard()); + if (files.size() != 1) { return; } - final File file = files.get(0); + var file = files.get(0); if (!file.getName().endsWith(FileExtensions.JME_MATERIAL)) { return; @@ -106,23 +103,22 @@ private void handleDragDroppedEvent(@NotNull final DragEvent dragEvent) { * @param dragEvent the drag over event. */ @FxThread - private void handleDragOverEvent(@NotNull final DragEvent dragEvent) { - - final Dragboard dragboard = dragEvent.getDragboard(); - final List files = unsafeCast(dragboard.getContent(DataFormat.FILES)); + private void handleDragOverEvent(@NotNull DragEvent dragEvent) { - if (files == null || files.size() != 1) { + var dragboard = dragEvent.getDragboard(); + var files = EditorUtil.getFiles(dragboard); + if (files.size() != 1) { return; } - final File file = files.get(0); + var file = files.get(0); if (!file.getName().endsWith(FileExtensions.JME_MATERIAL)) { return; } - final Set transferModes = dragboard.getTransferModes(); - final boolean isCopy = transferModes.contains(TransferMode.COPY); + var transferModes = dragboard.getTransferModes(); + var isCopy = transferModes.contains(TransferMode.COPY); dragEvent.acceptTransferModes(isCopy ? TransferMode.COPY : TransferMode.MOVE); dragEvent.consume(); @@ -134,60 +130,66 @@ private void handleDragOverEvent(@NotNull final DragEvent dragEvent) { * @param file the file */ @FxThread - protected void addMaterial(@NotNull final Path file) { + protected void addMaterial(@NotNull Path file) { } @Override @FxThread - protected void createComponents(@NotNull final HBox container) { + protected void createComponents(@NotNull HBox container) { super.createComponents(container); materialLabel = new Label(NO_MATERIAL); - final Button changeButton = new Button(); + var changeButton = new Button(); changeButton.setGraphic(new ImageView(Icons.ADD_16)); - changeButton.setOnAction(event -> processChange()); + changeButton.setOnAction(this::change); - final Button editButton = new Button(); + var editButton = new Button(); editButton.setGraphic(new ImageView(Icons.EDIT_16)); editButton.disableProperty().bind(materialLabel.textProperty().isEqualTo(NO_MATERIAL)); - editButton.setOnAction(event -> processEdit()); + editButton.setOnAction(this::openToEdit); materialLabel.prefWidthProperty().bind(widthProperty() .subtract(changeButton.widthProperty()) .subtract(editButton.widthProperty())); - FXUtils.addToPane(materialLabel, container); - FXUtils.addToPane(changeButton, container); - FXUtils.addToPane(editButton, container); + FxUtils.addClass(container, + CssClasses.TEXT_INPUT_CONTAINER, + CssClasses.ABSTRACT_PARAM_CONTROL_INPUT_CONTAINER) + .addClass(materialLabel, + CssClasses.ABSTRACT_PARAM_CONTROL_ELEMENT_LABEL) + .addClass(changeButton, editButton, + CssClasses.FLAT_BUTTON, + CssClasses.INPUT_CONTROL_TOOLBAR_BUTTON); - FXUtils.addClassesTo(container, CssClasses.TEXT_INPUT_CONTAINER, - CssClasses.ABSTRACT_PARAM_CONTROL_INPUT_CONTAINER); - FXUtils.addClassTo(materialLabel, CssClasses.ABSTRACT_PARAM_CONTROL_ELEMENT_LABEL); - FXUtils.addClassesTo(changeButton, editButton, CssClasses.FLAT_BUTTON, - CssClasses.INPUT_CONTROL_TOOLBAR_BUTTON); + FxUtils.addChild(container, + materialLabel, changeButton, editButton); DynamicIconSupport.addSupport(changeButton, editButton); } /** - * Show dialog for choosing another material. + * Show dialog to choose another material. + * + * @param event the action event. */ @FxThread - protected void processChange() { + protected void change(@Nullable ActionEvent event) { } /** * Open this material in the material editor. + * + * @param event the action event. */ @FxThread - protected void processEdit() { + protected void openToEdit(@Nullable ActionEvent event) { } /** - * Gets material label. + * Get the material name label. * - * @return the label with name of the material. + * @return the material name label. */ @FxThread protected @NotNull Label getMaterialLabel() { diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/MinMaxPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/MinMaxPropertyControl.java index 6f9aa7ed..8c6d0588 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/MinMaxPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/MinMaxPropertyControl.java @@ -12,11 +12,11 @@ /** * The implementation of the {@link Vector2fPropertyControl} to edit min-max value range. * - * @param the type of a {@link ChangeConsumer} - * @param the type of an editing object. + * @param the type of a change consumer. + * @param the type of an editing object. * @author JavaSaBr */ -public class MinMaxPropertyControl extends Vector2fPropertyControl { +public class MinMaxPropertyControl extends Vector2fPropertyControl { public MinMaxPropertyControl( @Nullable Vector2f propertyValue, diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/QuaternionPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/QuaternionPropertyControl.java index f85e8f8b..ed2ddc13 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/QuaternionPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/QuaternionPropertyControl.java @@ -9,9 +9,11 @@ import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.util.UiUtils; -import com.ss.rlib.fx.control.input.FloatTextField; -import com.ss.rlib.fx.util.FXUtils; import com.ss.rlib.common.util.array.ArrayFactory; +import com.ss.rlib.fx.control.input.FloatTextField; +import com.ss.rlib.fx.util.FxControlUtils; +import com.ss.rlib.fx.util.FxUtils; +import com.ss.rlib.fx.util.ObservableUtils; import javafx.scene.control.Label; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; @@ -22,11 +24,11 @@ /** * The implementation of the {@link PropertyControl} to edit {@link Quaternion} values. * - * @param the change consumer's type. - * @param the edited object's type. + * @param the type of a change consumer. + * @param the type of an editing object. * @author JavaSaBr */ -public class QuaternionPropertyControl extends PropertyControl { +public class QuaternionPropertyControl extends PropertyControl { /** * The field Y. @@ -46,60 +48,72 @@ public class QuaternionPropertyControl extends Prop @Nullable private FloatTextField zField; - public QuaternionPropertyControl(@Nullable final Quaternion propertyValue, @NotNull final String propertyName, - @NotNull final C changeConsumer) { + public QuaternionPropertyControl( + @Nullable Quaternion propertyValue, + @NotNull String propertyName, + @NotNull C changeConsumer + ) { super(propertyValue, propertyName, changeConsumer); } @Override @FxThread - protected void createComponents(@NotNull final HBox container) { + protected void createComponents(@NotNull HBox container) { super.createComponents(container); - final Label xLabel = new Label("x:"); + var xLabel = new Label("x:"); xField = new FloatTextField(); - xField.setOnKeyReleased(this::updateRotation); - xField.addChangeListener((observable, oldValue, newValue) -> updateRotation(null)); - xField.prefWidthProperty().bind(widthProperty().divide(3)); + xField.setOnKeyReleased(this::keyReleased); + xField.prefWidthProperty() + .bind(widthProperty().divide(3)); - final Label yLabel = new Label("y:"); + var yLabel = new Label("y:"); yField = new FloatTextField(); - yField.setOnKeyReleased(this::updateRotation); - yField.addChangeListener((observable, oldValue, newValue) -> updateRotation(null)); - yField.prefWidthProperty().bind(widthProperty().divide(3)); + yField.setOnKeyReleased(this::keyReleased); + yField.prefWidthProperty() + .bind(widthProperty().divide(3)); - final Label zLabel = new Label("z:"); + var zLabel = new Label("z:"); zField = new FloatTextField(); - zField.setOnKeyReleased(this::updateRotation); - zField.addChangeListener((observable, oldValue, newValue) -> updateRotation(null)); - zField.prefWidthProperty().bind(widthProperty().divide(3)); - - FXUtils.addToPane(xLabel, container); - FXUtils.addToPane(xField, container); - FXUtils.addToPane(yLabel, container); - FXUtils.addToPane(yField, container); - FXUtils.addToPane(zLabel, container); - FXUtils.addToPane(zField, container); - - FXUtils.addClassTo(xLabel, yLabel, zLabel, CssClasses.ABSTRACT_PARAM_CONTROL_NUMBER_LABEL); - FXUtils.addClassesTo(container, CssClasses.DEF_HBOX, CssClasses.TEXT_INPUT_CONTAINER, - CssClasses.ABSTRACT_PARAM_CONTROL_INPUT_CONTAINER); - FXUtils.addClassesTo(xField, yField, zField, CssClasses.ABSTRACT_PARAM_CONTROL_VECTOR3F_FIELD, - CssClasses.TRANSPARENT_TEXT_FIELD); - - UiUtils.addFocusBinding(container, xField, yField, zField); + zField.setOnKeyReleased(this::keyReleased); + zField.prefWidthProperty() + .bind(widthProperty().divide(3)); + + FxControlUtils.onValueChange(xField, this::changeValue); + FxControlUtils.onValueChange(yField, this::changeValue); + FxControlUtils.onValueChange(zField, this::changeValue); + + FxUtils.addClass(xLabel, yLabel, zLabel, + CssClasses.ABSTRACT_PARAM_CONTROL_NUMBER_LABEL) + .addClass(container, + CssClasses.DEF_HBOX, + CssClasses.TEXT_INPUT_CONTAINER, + CssClasses.ABSTRACT_PARAM_CONTROL_INPUT_CONTAINER) + .addClass(xField, yField, zField, + CssClasses.ABSTRACT_PARAM_CONTROL_VECTOR3F_FIELD, + CssClasses.TRANSPARENT_TEXT_FIELD); + + FxUtils.addChild(container, + xLabel, xField, + yLabel, yField, + zLabel, zField); + + ObservableUtils.onChange(UiUtils.addFocusBinding(container, xField, yField, zField), + this::applyOnLostFocus); } @Override @FxThread - protected void setPropertyValue(@Nullable final Quaternion quaternion) { + protected void setPropertyValue(@Nullable Quaternion quaternion) { super.setPropertyValue(quaternion == null ? null : quaternion.clone()); } /** + * Get the field X. + * * @return the field X. */ @FxThread @@ -108,6 +122,8 @@ protected void setPropertyValue(@Nullable final Quaternion quaternion) { } /** + * Get the field Y. + * * @return the field Y. */ @FxThread @@ -116,6 +132,8 @@ protected void setPropertyValue(@Nullable final Quaternion quaternion) { } /** + * Get the field Z. + * * @return the field Z. */ @FxThread @@ -127,50 +145,80 @@ protected void setPropertyValue(@Nullable final Quaternion quaternion) { @FxThread protected void reload() { - final float[] angles = new float[3]; - - final Quaternion element = getPropertyValue(); - notNull(element, "The property value can't be null."); + var angles = new float[3]; + var value = getPropertyValue(); - element.toAngles(angles); + if(value != null) { + value.toAngles(angles); + } - final FloatTextField xField = getXField(); + var xField = getXField(); xField.setValue(radiansToDegree(angles[0])); xField.positionCaret(xField.getText().length()); - final FloatTextField yFiled = getYFiled(); + var yFiled = getYFiled(); yFiled.setValue(radiansToDegree(angles[1])); yFiled.positionCaret(yFiled.getText().length()); - final FloatTextField zField = getZField(); + var zField = getZField(); zField.setValue(radiansToDegree(angles[2])); zField.positionCaret(zField.getText().length()); } + @Override + public boolean isDirty() { + + var angles = new float[3]; + var value = getPropertyValue(); + + if(value != null) { + value.toAngles(angles); + } + + float xValue = getXField().getValue(); + float yValue = getYFiled().getValue(); + float zValue = getZField().getValue(); + + return angles[0] != xValue || angles[1] != yValue || angles[2] != zValue; + } + /** - * Updating rotation. + * Handle of input the enter key. */ @FxThread - private void updateRotation(@Nullable final KeyEvent event) { - - if (isIgnoreListener() || (event != null && event.getCode() != KeyCode.ENTER)) { - return; + private void keyReleased(@NotNull KeyEvent event) { + if (event.getCode() == KeyCode.ENTER) { + changeValue(); } + } - final Quaternion oldValue = notNull(getPropertyValue()); + /** + * Change value of rotation. + */ + @FxThread + private void changeValue() { + if (!isIgnoreListener()) { + apply(); + } + } - final FloatTextField xField = getXField(); - final float x = degreeToRadians(xField.getValue()); + @Override + @FxThread + protected void apply() { + super.apply(); - final FloatTextField yFiled = getYFiled(); - final float y = degreeToRadians(yFiled.getValue()); + var oldValue = getPropertyValue(); + if (oldValue != null) { + oldValue = oldValue.clone(); + } - final FloatTextField zField = getZField(); - final float z = degreeToRadians(zField.getValue()); + var x = degreeToRadians(getXField().getValue()); + var y = degreeToRadians(getYFiled().getValue()); + var z = degreeToRadians(getZField().getValue()); - final Quaternion newValue = new Quaternion(); - newValue.fromAngles(ArrayFactory.toFloatArray(x, y, z)); + var newValue = new Quaternion() + .fromAngles(ArrayFactory.toFloatArray(x, y, z)); - changed(newValue, oldValue.clone()); + changed(newValue, oldValue); } } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/SceneElementPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/SceneElementPropertyControl.java index cae68a68..e352a8c7 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/SceneElementPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/SceneElementPropertyControl.java @@ -9,42 +9,44 @@ /** * The implementation of the {@link ElementPropertyControl} to edit elements from scenes. * - * @param the edited object's type. + * @param the type of an editing object. + * @param the type of an editing property. * @author JavaSaBr */ public abstract class SceneElementPropertyControl extends ElementPropertyControl { - public SceneElementPropertyControl(@NotNull final Class type, @Nullable final T propertyValue, - @NotNull final String propertyName, - @NotNull final SceneChangeConsumer changeConsumer) { + public SceneElementPropertyControl( + @NotNull Class type, + @Nullable T propertyValue, + @NotNull String propertyName, + @NotNull SceneChangeConsumer changeConsumer + ) { super(type, propertyValue, propertyName, changeConsumer); } @Override @FxThread protected void addElement() { - final SceneSelectorDialog dialog = createSceneSelectorDialog(); - dialog.show(this); + createSceneSelectorDialog().show(this); } /** - * Create scene selector dialog node selector dialog. + * Create a scene selector dialog. * * @return the scene selector dialog. */ @FxThread protected @NotNull SceneSelectorDialog createSceneSelectorDialog() { - final SceneChangeConsumer changeConsumer = getChangeConsumer(); - return new SceneSelectorDialog<>(changeConsumer.getCurrentModel(), type, this::processAdd); + return new SceneSelectorDialog<>(getChangeConsumer().getCurrentModel(), type, this::addElement); } /** - * Process adding the new element. + * Add the chosen element. * * @param newElement the new element. */ @FxThread - protected void processAdd(@NotNull final T newElement) { + protected void addElement(@NotNull T newElement) { changed(newElement, getPropertyValue()); } } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/SpatialElementModelPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/SpatialElementModelPropertyControl.java index 3dc396ad..a6ab371f 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/SpatialElementModelPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/SpatialElementModelPropertyControl.java @@ -5,41 +5,42 @@ import com.ss.editor.model.undo.editor.ModelChangeConsumer; import com.ss.editor.ui.dialog.node.selector.NodeSelectorDialog; import com.ss.editor.ui.dialog.node.selector.SpatialSelectorDialog; -import javafx.scene.control.Label; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** * The implementation of the {@link ElementModelPropertyControl} to edit a spatial from a scene. * - * @param the type parameter + * @param the type of an editing object. + * @param the type of an editing property. * @author JavaSaBr */ -public class SpatialElementModelPropertyControl extends ElementModelPropertyControl { - - public SpatialElementModelPropertyControl(@NotNull Class type, @Nullable final S propertyValue, - @NotNull final String propertyName, - @NotNull final ModelChangeConsumer changeConsumer) { +public class SpatialElementModelPropertyControl extends ElementModelPropertyControl { + + public SpatialElementModelPropertyControl( + @NotNull Class type, + @Nullable T propertyValue, + @NotNull String propertyName, + @NotNull ModelChangeConsumer changeConsumer + ) { super(type, propertyValue, propertyName, changeConsumer); } @Override @FxThread - protected @NotNull NodeSelectorDialog createNodeSelectorDialog() { - final ModelChangeConsumer changeConsumer = getChangeConsumer(); - return new SpatialSelectorDialog<>(changeConsumer.getCurrentModel(), type, this::addElement); + protected @NotNull NodeSelectorDialog createNodeSelectorDialog() { + return new SpatialSelectorDialog<>(getChangeConsumer().getCurrentModel(), type, this::addElement); } @Override @FxThread protected void reload() { - final Spatial spatial = getPropertyValue(); - final Label elementLabel = getElementLabel(); + var spatial = getPropertyValue(); String name = spatial == null ? null : spatial.getName(); name = name == null && spatial != null ? spatial.getClass().getSimpleName() : name; - elementLabel.setText(name == null ? NO_ELEMENT : name); + getElementLabel().setText(name == null ? NO_ELEMENT : name); } } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/StringBasedArrayPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/StringBasedArrayPropertyControl.java index b82145bb..bff97214 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/StringBasedArrayPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/StringBasedArrayPropertyControl.java @@ -8,6 +8,7 @@ import com.ss.editor.ui.css.CssClasses; import com.ss.rlib.fx.util.FxUtils; import javafx.scene.control.TextField; +import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import javafx.scene.layout.HBox; import org.jetbrains.annotations.NotNull; @@ -51,9 +52,8 @@ public StringBasedArrayPropertyControl( public void changeControlWidthPercent(double controlWidthPercent) { super.changeControlWidthPercent(controlWidthPercent); - var valueField = getValueField(); - valueField.prefWidthProperty().unbind(); - valueField.prefWidthProperty().bind(widthProperty().multiply(controlWidthPercent)); + FxUtils.rebindPrefWidth(getValueField(), + widthProperty().multiply(controlWidthPercent)); } @Override @@ -66,7 +66,9 @@ protected void createComponents(@NotNull HBox container) { valueField.prefWidthProperty() .bind(widthProperty().multiply(CONTROL_WIDTH_PERCENT)); - FxUtils.addClass(valueField, CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); + FxUtils.addClass(valueField, + CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); + FxUtils.addChild(container, valueField); } @@ -91,5 +93,20 @@ protected boolean isSingleRow() { */ @FxThread protected void updateValue(@Nullable KeyEvent event) { + if (!isIgnoreListener() && (event == null || event.getCode() == KeyCode.ENTER)) { + apply(); + } + } + + @Override + @FxThread + protected void apply() { + super.apply(); + changed(getCurrentValue(), getPropertyValue()); + } + + @FxThread + protected @Nullable T getCurrentValue() { + throw new UnsupportedOperationException(); } } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/StringPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/StringPropertyControl.java index 0834332b..31b0c4cf 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/StringPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/StringPropertyControl.java @@ -7,6 +7,7 @@ import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; +import com.ss.rlib.fx.util.FxControlUtils; import com.ss.rlib.fx.util.FxUtils; import com.ss.rlib.common.util.StringUtils; import javafx.scene.control.TextField; @@ -48,10 +49,11 @@ protected void createComponents(@NotNull HBox container) { valueField.setOnKeyReleased(this::updateValue); valueField.prefWidthProperty() .bind(widthProperty().multiply(CONTROL_WIDTH_PERCENT)); - valueField.focusedProperty() - .addListener((observable, oldValue, newValue) -> applyOnLostFocus(newValue)); - FxUtils.addClass(valueField, CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); + FxControlUtils.onFocusChange(valueField, this::applyOnLostFocus); + FxUtils.addClass(valueField, + CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); + FxUtils.addChild(container, valueField); } @@ -100,10 +102,6 @@ public boolean isDirty() { @FxThread protected void apply() { super.apply(); - - var oldValue = getPropertyValue(); - var newValue = getValueField().getText(); - - changed(newValue, oldValue); + changed(getValueField().getText(), getPropertyValue()); } } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/Texture2DSingleRowPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/Texture2DSingleRowPropertyControl.java index 97ce2c58..4c90b990 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/Texture2DSingleRowPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/Texture2DSingleRowPropertyControl.java @@ -13,7 +13,7 @@ * @param the type of an editing object. * @author JavaSaBr */ -public class Texture2DSingleRowPropertyControl extends Texture2DPropertyControl { +public class Texture2DSingleRowPropertyControl extends Texture2dPropertyControl { public Texture2DSingleRowPropertyControl(@Nullable final Texture2D propertyValue, @NotNull final String propertyName, @NotNull final C changeConsumer) { diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/Texture2DPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/Texture2dPropertyControl.java similarity index 84% rename from src/main/java/com/ss/editor/ui/control/property/impl/Texture2DPropertyControl.java rename to src/main/java/com/ss/editor/ui/control/property/impl/Texture2dPropertyControl.java index 69cb84f9..3f8172e9 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/Texture2DPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/Texture2dPropertyControl.java @@ -3,6 +3,8 @@ import static com.ss.editor.FileExtensions.TEXTURE_EXTENSIONS; import static com.ss.editor.config.DefaultSettingsProvider.Defaults.PREF_DEFAULT_FLIPPED_TEXTURES; import static com.ss.editor.config.DefaultSettingsProvider.Preferences.PREF_FLIPPED_TEXTURES; +import static com.ss.editor.extension.property.EditablePropertyType.BOOLEAN; +import static com.ss.editor.extension.property.EditablePropertyType.ENUM; import static com.ss.editor.util.EditorUtil.*; import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.asset.AssetKey; @@ -13,7 +15,6 @@ import com.ss.editor.Messages; import com.ss.editor.annotation.FxThread; import com.ss.editor.config.EditorConfig; -import com.ss.editor.extension.property.EditablePropertyType; import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.plugin.api.dialog.GenericFactoryDialog; import com.ss.editor.plugin.api.property.PropertyDefinition; @@ -23,10 +24,10 @@ import com.ss.editor.ui.tooltip.ImageChannelPreview; import com.ss.editor.ui.util.UiUtils; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.fx.util.FXUtils; import com.ss.rlib.common.util.VarTable; import com.ss.rlib.common.util.array.Array; import com.ss.rlib.common.util.array.ArrayFactory; +import com.ss.rlib.fx.util.FXUtils; import javafx.beans.binding.BooleanBinding; import javafx.scene.control.Button; import javafx.scene.control.Label; @@ -49,7 +50,7 @@ * @param the type of an editing object. * @author JavaSaBr */ -public class Texture2DPropertyControl extends PropertyControl { +public class Texture2dPropertyControl extends PropertyControl { /** * The constant NO_TEXTURE. @@ -99,8 +100,11 @@ public class Texture2DPropertyControl extends Prope @Nullable private HBox fieldContainer; - public Texture2DPropertyControl(@Nullable final Texture2D propertyValue, @NotNull final String propertyName, - @NotNull final C changeConsumer) { + public Texture2dPropertyControl( + @Nullable Texture2D propertyValue, + @NotNull String propertyName, + @NotNull C changeConsumer + ) { super(propertyValue, propertyName, changeConsumer); setOnDragOver(this::handleDragOverEvent); setOnDragDropped(this::handleDragDroppedEvent); @@ -117,8 +121,8 @@ public void changeControlWidthPercent(final double controlWidthPercent) { * @param dragEvent the drag dropped event. */ @FxThread - protected void handleDragDroppedEvent(@NotNull final DragEvent dragEvent) { - UiUtils.handleDroppedFile(dragEvent, TEXTURE_EXTENSIONS, this, Texture2DPropertyControl::setTexture); + protected void handleDragDroppedEvent(@NotNull DragEvent dragEvent) { + UiUtils.handleDroppedFile(dragEvent, TEXTURE_EXTENSIONS, this, Texture2dPropertyControl::setTexture); } /** @@ -127,43 +131,46 @@ protected void handleDragDroppedEvent(@NotNull final DragEvent dragEvent) { * @param dragEvent the drag over event. */ @FxThread - protected void handleDragOverEvent(@NotNull final DragEvent dragEvent) { + protected void handleDragOverEvent(@NotNull DragEvent dragEvent) { UiUtils.acceptIfHasFile(dragEvent, TEXTURE_EXTENSIONS); } @Override @FxThread - protected void createComponents(@NotNull final HBox container) { + protected void createComponents(@NotNull HBox container) { super.createComponents(container); fieldContainer = new HBox(); if (!isSingleRow()) { - fieldContainer.prefWidthProperty().bind(container.widthProperty()); + fieldContainer.prefWidthProperty() + .bind(container.widthProperty()); } textureTooltip = new ImageChannelPreview(); - final VBox previewContainer = new VBox(); + var previewContainer = new VBox(); texturePreview = new ImageView(); - texturePreview.fitHeightProperty().bind(previewContainer.heightProperty()); - texturePreview.fitWidthProperty().bind(previewContainer.widthProperty()); + texturePreview.fitHeightProperty() + .bind(previewContainer.heightProperty()); + texturePreview.fitWidthProperty() + .bind(previewContainer.widthProperty()); Tooltip.install(texturePreview, textureTooltip); - final Button settingsButton = new Button(); + var settingsButton = new Button(); settingsButton.setGraphic(new ImageView(Icons.SETTINGS_16)); settingsButton.setOnAction(event -> openSettings()); settingsButton.disableProperty().bind(buildDisableRemoveCondition()); - final Button addButton = new Button(); + var addButton = new Button(); addButton.setGraphic(new ImageView(Icons.ADD_12)); - addButton.setOnAction(event -> processAdd()); + addButton.setOnAction(event -> addNewTexture()); - final Button removeButton = new Button(); + var removeButton = new Button(); removeButton.setGraphic(new ImageView(Icons.REMOVE_12)); - removeButton.setOnAction(event -> processRemove()); + removeButton.setOnAction(event -> removeTexture()); removeButton.disableProperty().bind(buildDisableRemoveCondition()); if (!isSingleRow()) { @@ -197,6 +204,8 @@ protected void createComponents(@NotNull final HBox container) { } /** + * Get the disable|remove condition. + * * @return the disable|remove condition. */ @FxThread @@ -205,6 +214,8 @@ protected void createComponents(@NotNull final HBox container) { } /** + * Get the texture label. + * * @return the texture label. */ @FxThread @@ -223,6 +234,8 @@ protected void createComponents(@NotNull final HBox container) { } /** + * Get the texture preview. + * * @return the texture preview. */ @FxThread @@ -231,6 +244,8 @@ protected void createComponents(@NotNull final HBox container) { } /** + * Get the image channels preview. + * * @return the image channels preview. */ @FxThread @@ -239,23 +254,23 @@ protected void createComponents(@NotNull final HBox container) { } /** - * Process to remove the current texture. + * Remove the current texture. */ @FxThread - protected void processRemove() { + protected void removeTexture() { setTexture(null); } /** - * Process to add a new texture. + * Open the dialog to choose a new texture. */ @FxThread - protected void processAdd() { + protected void addNewTexture() { UiUtils.openFileAssetDialog(this::setTexture, TEXTURE_EXTENSIONS, DEFAULT_ACTION_TESTER); } /** - * Process to open texture's settings. + * Open a dialog with texture's settings. */ @FxThread protected void openSettings() { @@ -269,11 +284,11 @@ protected void openSettings() { final Texture.MinFilter minFilter = texture.getMinFilter(); final Array properties = ArrayFactory.newArray(PropertyDefinition.class); - properties.add(new PropertyDefinition(EditablePropertyType.BOOLEAN, Messages.MATERIAL_MODEL_PROPERTY_CONTROL_FLIP_Y, PROP_FLIP, flipY)); - properties.add(new PropertyDefinition(EditablePropertyType.ENUM, Messages.MATERIAL_MODEL_PROPERTY_CONTROL_WRAP_MODE_S, PROP_WRAP_MODE_S, wrapS)); - properties.add(new PropertyDefinition(EditablePropertyType.ENUM, Messages.MATERIAL_MODEL_PROPERTY_CONTROL_WRAP_MODE_T, PROP_WRAP_MODE_T, wrapT)); - properties.add(new PropertyDefinition(EditablePropertyType.ENUM, Messages.MATERIAL_MODEL_PROPERTY_CONTROL_MAG_FILTER, PROP_MAG_FILTER, magFilter)); - properties.add(new PropertyDefinition(EditablePropertyType.ENUM, Messages.MATERIAL_MODEL_PROPERTY_CONTROL_MIN_FILTER, PROP_MIN_FILTER, minFilter)); + properties.add(new PropertyDefinition(BOOLEAN, Messages.MATERIAL_MODEL_PROPERTY_CONTROL_FLIP_Y, PROP_FLIP, flipY)); + properties.add(new PropertyDefinition(ENUM, Messages.MATERIAL_MODEL_PROPERTY_CONTROL_WRAP_MODE_S, PROP_WRAP_MODE_S, wrapS)); + properties.add(new PropertyDefinition(ENUM, Messages.MATERIAL_MODEL_PROPERTY_CONTROL_WRAP_MODE_T, PROP_WRAP_MODE_T, wrapT)); + properties.add(new PropertyDefinition(ENUM, Messages.MATERIAL_MODEL_PROPERTY_CONTROL_MAG_FILTER, PROP_MAG_FILTER, magFilter)); + properties.add(new PropertyDefinition(ENUM, Messages.MATERIAL_MODEL_PROPERTY_CONTROL_MIN_FILTER, PROP_MIN_FILTER, minFilter)); final GenericFactoryDialog dialog = new GenericFactoryDialog(properties, this::applyChanges); dialog.setTitle(Messages.MATERIAL_MODEL_PROPERTY_CONTROL_TEXTURE_SETTINGS); diff --git a/src/main/java/com/ss/editor/util/EditorUtil.java b/src/main/java/com/ss/editor/util/EditorUtil.java index a0bb7fcd..d732fc0a 100644 --- a/src/main/java/com/ss/editor/util/EditorUtil.java +++ b/src/main/java/com/ss/editor/util/EditorUtil.java @@ -2,6 +2,7 @@ import static com.ss.rlib.common.util.ClassUtils.cast; import static com.ss.rlib.common.util.ClassUtils.unsafeCast; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import static java.lang.Math.acos; import static java.lang.Math.toDegrees; import static java.lang.ThreadLocal.withInitial; @@ -30,12 +31,13 @@ import com.ss.editor.annotation.JmeThread; import com.ss.editor.config.EditorConfig; import com.ss.editor.extension.scene.SceneLayer; -import com.ss.editor.extension.scene.SceneNode; import com.ss.editor.manager.ClasspathManager; import com.ss.editor.manager.ExecutorManager; import com.ss.editor.manager.ResourceManager; import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.model.undo.editor.SceneChangeConsumer; +import com.ss.editor.ui.event.FxEventManager; +import com.ss.editor.ui.event.impl.RequestedOpenFileEvent; import com.ss.editor.ui.scene.EditorFxScene; import com.ss.editor.ui.util.UiUtils; import com.ss.rlib.common.logging.Logger; @@ -43,9 +45,9 @@ import com.ss.rlib.common.util.ClassUtils; import com.ss.rlib.common.util.StringUtils; import com.ss.rlib.common.util.array.Array; -import javafx.scene.control.Alert; import javafx.scene.input.ClipboardContent; import javafx.scene.input.DataFormat; +import javafx.scene.input.Dragboard; import javafx.stage.Stage; import javafx.stage.Window; import org.jetbrains.annotations.NotNull; @@ -53,13 +55,13 @@ import java.io.*; import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLClassLoader; import java.nio.ByteBuffer; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Collections; import java.util.Date; import java.util.List; @@ -948,4 +950,43 @@ public static float clipNumber(float value, float mod) { public static boolean isEmpty(@Nullable AssetKey assetKey) { return assetKey == null || StringUtils.isEmpty(assetKey.getName()); } + + /** + * Open the asset resource in an editor. + * + * @param assetKey the asset key. + */ + @FromAnyThread + public static void openInEditor(@Nullable AssetKey assetKey) { + + if (assetKey == null) { + return; + } + + var assetPath = assetKey.getName(); + if (StringUtils.isEmpty(assetPath)) { + return; + } + + var assetFile = Paths.get(assetPath); + var realFile = notNull(getRealFile(assetFile)); + if (!Files.exists(realFile)) { + return; + } + + FxEventManager.getInstance() + .notify(new RequestedOpenFileEvent(realFile)); + } + + /** + * Get the list of files in the current dragboard. + * + * @param dragboard the current dragboard. + * @return the list of files. + */ + @FromAnyThread + public static @NotNull List getFiles(@NotNull Dragboard dragboard) { + List files = unsafeCast(dragboard.getContent(DataFormat.FILES)); + return files == null ? Collections.emptyList() : files; + } } From dc7f7d060fb7227c1ba2085d5691c6ca6349c837 Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Fri, 20 Apr 2018 08:52:57 +0300 Subject: [PATCH 33/49] refactoring. --- README.md | 2 +- app.version | 2 +- build.gradle | 9 +- .../java/com/ss/editor/config/Config.java | 24 +-- .../builder/PropertyBuilderFilter.java | 2 +- .../builder/impl/AbstractPropertyBuilder.java | 11 +- .../impl/AudioNodePropertyBuilder.java | 16 +- .../impl/AudioKeyPropertyControl.java | 3 +- .../property/impl/BooleanPropertyControl.java | 11 +- .../impl/Texture2dPropertyControl.java | 156 +++++++++--------- ...=> Texture2dSingleRowPropertyControl.java} | 13 +- .../impl/Vector2fPropertyControl.java | 22 +-- .../impl/Vector3fPropertyControl.java | 71 ++++---- .../Vector3fSingleRowPropertyControl.java | 65 +++++--- ...icleEmitterImagesModelPropertyControl.java | 4 +- .../java/com/ss/editor/util/EditorUtil.java | 13 +- 16 files changed, 231 insertions(+), 193 deletions(-) rename src/main/java/com/ss/editor/ui/control/property/impl/{Texture2DSingleRowPropertyControl.java => Texture2dSingleRowPropertyControl.java} (56%) diff --git a/README.md b/README.md index beac0d58..cb44a017 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# jMonkeyBuilder 1.7.2 # +# jMonkeyBuilder 1.8.0 # ### It's 3D Editor to prepare/work/create graphics content for jMonkeyEngine 3.2 ### [![Join the chat at https://gitter.im/jME3-SpaceShift-Editor/Lobby](https://badges.gitter.im/jME3-SpaceShift-Editor/Lobby.svg)](https://gitter.im/jME3-SpaceShift-Editor/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) diff --git a/app.version b/app.version index 0a182f2e..afa2b351 100644 --- a/app.version +++ b/app.version @@ -1 +1 @@ -1.7.2 \ No newline at end of file +1.8.0 \ No newline at end of file diff --git a/build.gradle b/build.gradle index e5bde43b..3083c162 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ apply plugin: 'maven-publish' apply plugin: 'application' group = 'com.spaceshift' -version = '1.7.3' +version = '1.8.0' compileJava { options.encoding = "UTF-8" @@ -61,7 +61,7 @@ ext.jme3_xbuf_version = '0.9.1' ext.junitPlatformVersion = "1.0.0" ext.junitJupiterVersion = "5.0.0" ext.log4jVersion = '2.6.2' -ext.bintrayVersion = version + '-4' +ext.bintrayVersion = version junitPlatform { filters { @@ -83,9 +83,6 @@ repositories { maven { url "https://dl.bintray.com/javasabr/maven" } - maven { - url 'https://oss.sonatype.org/content/repositories/snapshots/' - } } publishing { @@ -129,7 +126,7 @@ javadoc { dependencies { // base - compile group: 'org.fxmisc.richtext', name: 'richtextfx', version: '1.0.0-SNAPSHOT' + compile group: 'org.fxmisc.richtext', name: 'richtextfx', version: '0.9.0' compile 'org.controlsfx:controlsfx:9.0.0' compile 'com.spaceshift:rlib.fx:5.0.0' compile 'com.spaceshift:rlib.common:7.0.0' diff --git a/src/main/java/com/ss/editor/config/Config.java b/src/main/java/com/ss/editor/config/Config.java index c5d7837f..f642a0f1 100644 --- a/src/main/java/com/ss/editor/config/Config.java +++ b/src/main/java/com/ss/editor/config/Config.java @@ -5,7 +5,6 @@ import com.ss.editor.util.EditorUtil; import com.ss.rlib.common.plugin.Version; import com.ss.rlib.common.util.Utils; -import com.ss.rlib.common.util.VarTable; import com.ss.rlib.common.util.os.OperatingSystem; import org.jetbrains.annotations.NotNull; @@ -30,7 +29,7 @@ public final class Config { * The name of editor's folder in user home folder. */ @NotNull - private static final String SS_FOLDER_IN_USER_HOME = ".jmonkeybuilder"; + private static final String EDITOR_FOLDER_IN_USER_HOME = ".jmonkeybuilder"; /** * The editor's title. @@ -42,7 +41,7 @@ public final class Config { * The editor's version. */ @NotNull - public static final Version APP_VERSION = new Version("1.7.2"); + public static final Version APP_VERSION = new Version("1.8.0"); /** * The string version. @@ -121,10 +120,11 @@ public final class Config { static { - final GraphicsEnvironment graphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment(); - final GraphicsDevice device = graphicsEnvironment.getDefaultScreenDevice(); + var graphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment(); + var device = graphicsEnvironment.getDefaultScreenDevice(); - final VarTable vars = new DocumentConfig(EditorUtil.getInputStream(CONFIG_RESOURCE_PATH)).parse(); + var vars = new DocumentConfig(EditorUtil.requireInputStream(CONFIG_RESOURCE_PATH)) + .parse(); DEV_DEBUG = vars.getBoolean("Dev.debug", false); DEV_CAMERA_DEBUG = vars.getBoolean("Dev.cameraDebug", false); @@ -142,21 +142,21 @@ public final class Config { } /** - * Gets folder for log. + * Get a folder to store log files. * - * @return the path to the folder for writing log files. + * @return the path to a folder to store log files. */ public static @NotNull Path getFolderForLog() { return getAppFolderInUserHome().resolve("log"); } /** - * The path to the folder for storing data in the user home. + * Get a path to the folder to store data in a user home. * - * @return the app folder in user home + * @return the path to the folder to store data in a user home. */ public static @NotNull Path getAppFolderInUserHome() { - final String userHome = System.getProperty("user.home"); - return Paths.get(userHome, SS_FOLDER_IN_USER_HOME); + var userHome = System.getProperty("user.home"); + return Paths.get(userHome, EDITOR_FOLDER_IN_USER_HOME); } } diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/PropertyBuilderFilter.java b/src/main/java/com/ss/editor/ui/control/property/builder/PropertyBuilderFilter.java index 629865cb..7c7d2cb0 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/PropertyBuilderFilter.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/PropertyBuilderFilter.java @@ -19,5 +19,5 @@ public interface PropertyBuilderFilter { * @param parent the parent. * @return true of we should skip the builder for the object. */ - boolean skip(@NotNull final PropertyBuilder builder, @NotNull final Object object, @Nullable final Object parent); + boolean skip(@NotNull PropertyBuilder builder, @NotNull Object object, @Nullable Object parent); } diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/AbstractPropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/AbstractPropertyBuilder.java index 84238528..e662e23c 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/AbstractPropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/AbstractPropertyBuilder.java @@ -4,7 +4,7 @@ import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.control.property.builder.PropertyBuilder; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.fx.util.FxUtils; import javafx.scene.layout.HBox; import javafx.scene.layout.Pane; import javafx.scene.layout.VBox; @@ -37,7 +37,6 @@ public void buildFor( @NotNull VBox container, @NotNull ChangeConsumer changeConsumer ) { - if (type.isInstance(changeConsumer)) { buildForImpl(object, parent, container, type.cast(changeConsumer)); } @@ -71,8 +70,10 @@ protected void buildSplitLine(@NotNull Pane pane) { var line = new HBox(); var container = new VBox(line); - FXUtils.addClassTo(line, CssClasses.DEF_HBOX); - FXUtils.addClassTo(container, CssClasses.ABSTRACT_PARAM_CONTROL_CONTAINER_SPLIT_LINE); - FXUtils.addToPane(container, pane); + FxUtils.addClass(line, CssClasses.DEF_HBOX) + .addClass(container, + CssClasses.ABSTRACT_PARAM_CONTROL_CONTAINER_SPLIT_LINE); + + FxUtils.addChild(pane, container); } } diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/AudioNodePropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/AudioNodePropertyBuilder.java index 905e7f00..a87b0c7a 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/AudioNodePropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/AudioNodePropertyBuilder.java @@ -1,13 +1,11 @@ package com.ss.editor.ui.control.property.builder.impl; -import com.jme3.asset.AssetManager; -import com.jme3.audio.AudioData; import com.jme3.audio.AudioKey; import com.jme3.audio.AudioNode; import com.jme3.math.Vector3f; import com.ss.editor.Messages; -import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; +import com.ss.editor.annotation.FxThread; import com.ss.editor.model.undo.editor.ModelChangeConsumer; import com.ss.editor.ui.control.property.builder.PropertyBuilder; import com.ss.editor.ui.control.property.impl.AudioKeyPropertyControl; @@ -33,12 +31,12 @@ public class AudioNodePropertyBuilder extends AbstractPropertyBuilder AUDIO_APPLY_HANDLER = (audioNode, audioKey) -> { - final AssetManager assetManager = EditorUtil.getAssetManager(); + var assetManager = EditorUtil.getAssetManager(); if (audioKey == null) { audioNode.setAudioData(null, null); } else { - final AudioData audioData = assetManager.loadAudio(audioKey); + var audioData = assetManager.loadAudio(audioKey); AudioNodeUtils.updateData(audioNode, audioData, audioKey); } }; @@ -62,8 +60,12 @@ private AudioNodePropertyBuilder() { @Override @FxThread - protected void buildForImpl(@NotNull final Object object, @Nullable final Object parent, - @NotNull final VBox container, @NotNull final ModelChangeConsumer changeConsumer) { + protected void buildForImpl( + @NotNull Object object, + @Nullable Object parent, + @NotNull VBox container, + @NotNull ModelChangeConsumer changeConsumer + ) { if (!(object instanceof AudioNode)) return; diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/AudioKeyPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/AudioKeyPropertyControl.java index b608bca3..87c141c6 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/AudioKeyPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/AudioKeyPropertyControl.java @@ -102,7 +102,8 @@ protected void createComponents(@NotNull HBox container) { openButton.disableProperty() .bind(audioKeyLabel.textProperty().isEqualTo(NO_AUDIO)); - audioKeyLabel.prefWidthProperty().bind(widthProperty() + audioKeyLabel.prefWidthProperty() + .bind(widthProperty() .subtract(changeButton.widthProperty()) .subtract(openButton.widthProperty())); diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/BooleanPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/BooleanPropertyControl.java index 98dc8719..439363c8 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/BooleanPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/BooleanPropertyControl.java @@ -68,15 +68,10 @@ protected void createComponents(@NotNull HBox container) { @Override @FxThread public void changeControlWidthPercent(double controlWidthPercent) { + super.changeControlWidthPercent(controlWidthPercent); - var checkBox = getCheckBox(); - var widthProperty = checkBox.prefWidthProperty(); - - if (widthProperty.isBound()) { - super.changeControlWidthPercent(controlWidthPercent); - widthProperty.unbind(); - widthProperty.bind(widthProperty().multiply(controlWidthPercent)); - } + FxUtils.rebindPrefWidth(getCheckBox(), + widthProperty().multiply(controlWidthPercent)); } /** diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/Texture2dPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/Texture2dPropertyControl.java index 3f8172e9..e4f38a6c 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/Texture2dPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/Texture2dPropertyControl.java @@ -7,8 +7,6 @@ import static com.ss.editor.extension.property.EditablePropertyType.ENUM; import static com.ss.editor.util.EditorUtil.*; import static com.ss.rlib.common.util.ObjectUtils.notNull; -import com.jme3.asset.AssetKey; -import com.jme3.asset.AssetManager; import com.jme3.asset.TextureKey; import com.jme3.texture.Texture; import com.jme3.texture.Texture2D; @@ -25,9 +23,8 @@ import com.ss.editor.ui.util.UiUtils; import com.ss.editor.util.EditorUtil; import com.ss.rlib.common.util.VarTable; -import com.ss.rlib.common.util.array.Array; import com.ss.rlib.common.util.array.ArrayFactory; -import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.fx.util.FxUtils; import javafx.beans.binding.BooleanBinding; import javafx.scene.control.Button; import javafx.scene.control.Label; @@ -46,11 +43,11 @@ /** * The implementation of the {@link PropertyControl} to edit {@link com.jme3.texture.Texture2D} values. * - * @param the type of a {@link ChangeConsumer} - * @param the type of an editing object. + * @param the type of a change consumer. + * @param the type of an editing object. * @author JavaSaBr */ -public class Texture2dPropertyControl extends PropertyControl { +public class Texture2dPropertyControl extends PropertyControl { /** * The constant NO_TEXTURE. @@ -112,7 +109,7 @@ public Texture2dPropertyControl( @Override @FxThread - public void changeControlWidthPercent(final double controlWidthPercent) { + public void changeControlWidthPercent(double controlWidthPercent) { } /** @@ -122,7 +119,7 @@ public void changeControlWidthPercent(final double controlWidthPercent) { */ @FxThread protected void handleDragDroppedEvent(@NotNull DragEvent dragEvent) { - UiUtils.handleDroppedFile(dragEvent, TEXTURE_EXTENSIONS, this, Texture2dPropertyControl::setTexture); + UiUtils.handleDroppedFile(dragEvent, TEXTURE_EXTENSIONS, this, Texture2dPropertyControl::changeTexture); } /** @@ -176,31 +173,35 @@ protected void createComponents(@NotNull HBox container) { if (!isSingleRow()) { textureLabel = new Label(NO_TEXTURE); - textureLabel.prefWidthProperty().bind(widthProperty() - .subtract(removeButton.widthProperty()) - .subtract(previewContainer.widthProperty()) - .subtract(settingsButton.widthProperty()) - .subtract(addButton.widthProperty())); + textureLabel.prefWidthProperty() + .bind(widthProperty() + .subtract(removeButton.widthProperty()) + .subtract(previewContainer.widthProperty()) + .subtract(settingsButton.widthProperty()) + .subtract(addButton.widthProperty())); - FXUtils.addToPane(textureLabel, fieldContainer); - FXUtils.addClassTo(textureLabel, CssClasses.ABSTRACT_PARAM_CONTROL_ELEMENT_LABEL); - FXUtils.addClassesTo(fieldContainer, CssClasses.TEXT_INPUT_CONTAINER, - CssClasses.ABSTRACT_PARAM_CONTROL_INPUT_CONTAINER); + FxUtils.addClass(textureLabel, + CssClasses.ABSTRACT_PARAM_CONTROL_ELEMENT_LABEL) + .addClass(fieldContainer, + CssClasses.TEXT_INPUT_CONTAINER, + CssClasses.ABSTRACT_PARAM_CONTROL_INPUT_CONTAINER); + + FxUtils.addChild(fieldContainer, textureLabel); } else { - FXUtils.addClassesTo(fieldContainer, CssClasses.TEXT_INPUT_CONTAINER_WITHOUT_PADDING); + FxUtils.addClass(fieldContainer, + CssClasses.TEXT_INPUT_CONTAINER_WITHOUT_PADDING); } - FXUtils.addToPane(previewContainer, fieldContainer); - FXUtils.addToPane(addButton, fieldContainer); - FXUtils.addToPane(settingsButton, fieldContainer); - FXUtils.addToPane(removeButton, fieldContainer); - FXUtils.addToPane(fieldContainer, container); - FXUtils.addToPane(texturePreview, previewContainer); + FxUtils.addClass(previewContainer, + CssClasses.ABSTRACT_PARAM_CONTROL_PREVIEW_CONTAINER) + .addClass(settingsButton, addButton, removeButton, + CssClasses.FLAT_BUTTON, + CssClasses.INPUT_CONTROL_TOOLBAR_BUTTON); - FXUtils.addClassTo(previewContainer, CssClasses.ABSTRACT_PARAM_CONTROL_PREVIEW_CONTAINER); - FXUtils.addClassesTo(settingsButton, addButton, removeButton, CssClasses.FLAT_BUTTON, - CssClasses.INPUT_CONTROL_TOOLBAR_BUTTON); + FxUtils.addChild(fieldContainer, previewContainer, addButton, settingsButton, removeButton) + .addChild(container, fieldContainer) + .addChild(previewContainer, texturePreview); } /** @@ -258,7 +259,7 @@ protected void createComponents(@NotNull HBox container) { */ @FxThread protected void removeTexture() { - setTexture(null); + changeTexture(null); } /** @@ -266,7 +267,7 @@ protected void removeTexture() { */ @FxThread protected void addNewTexture() { - UiUtils.openFileAssetDialog(this::setTexture, TEXTURE_EXTENSIONS, DEFAULT_ACTION_TESTER); + UiUtils.openFileAssetDialog(this::changeTexture, TEXTURE_EXTENSIONS, DEFAULT_ACTION_TESTER); } /** @@ -275,22 +276,22 @@ protected void addNewTexture() { @FxThread protected void openSettings() { - final Texture2D texture = notNull(getPropertyValue()); - final TextureKey key = (TextureKey) texture.getKey(); - final boolean flipY = key.isFlipY(); - final Texture.WrapMode wrapS = texture.getWrap(Texture.WrapAxis.S); - final Texture.WrapMode wrapT = texture.getWrap(Texture.WrapAxis.T); - final Texture.MagFilter magFilter = texture.getMagFilter(); - final Texture.MinFilter minFilter = texture.getMinFilter(); + var texture = notNull(getPropertyValue()); + var key = (TextureKey) texture.getKey(); + var flipY = key.isFlipY(); + var wrapS = texture.getWrap(Texture.WrapAxis.S); + var wrapT = texture.getWrap(Texture.WrapAxis.T); + var magFilter = texture.getMagFilter(); + var minFilter = texture.getMinFilter(); - final Array properties = ArrayFactory.newArray(PropertyDefinition.class); + var properties = ArrayFactory.newArray(PropertyDefinition.class); properties.add(new PropertyDefinition(BOOLEAN, Messages.MATERIAL_MODEL_PROPERTY_CONTROL_FLIP_Y, PROP_FLIP, flipY)); properties.add(new PropertyDefinition(ENUM, Messages.MATERIAL_MODEL_PROPERTY_CONTROL_WRAP_MODE_S, PROP_WRAP_MODE_S, wrapS)); properties.add(new PropertyDefinition(ENUM, Messages.MATERIAL_MODEL_PROPERTY_CONTROL_WRAP_MODE_T, PROP_WRAP_MODE_T, wrapT)); properties.add(new PropertyDefinition(ENUM, Messages.MATERIAL_MODEL_PROPERTY_CONTROL_MAG_FILTER, PROP_MAG_FILTER, magFilter)); properties.add(new PropertyDefinition(ENUM, Messages.MATERIAL_MODEL_PROPERTY_CONTROL_MIN_FILTER, PROP_MIN_FILTER, minFilter)); - final GenericFactoryDialog dialog = new GenericFactoryDialog(properties, this::applyChanges); + var dialog = new GenericFactoryDialog(properties, this::applyChanges); dialog.setTitle(Messages.MATERIAL_MODEL_PROPERTY_CONTROL_TEXTURE_SETTINGS); dialog.setButtonOkText(Messages.SIMPLE_DIALOG_BUTTON_APPLY); dialog.setButtonCloseText(Messages.SIMPLE_DIALOG_BUTTON_CANCEL); @@ -299,39 +300,42 @@ protected void openSettings() { } /** - * Apple new changes if need. + * Apply new changes if need. * - * @param varTable the var table. + * @param vars the vars table. */ @FxThread - private void applyChanges(@NotNull final VarTable varTable) { - - final Texture2D texture = notNull(getPropertyValue()); - final TextureKey key = (TextureKey) texture.getKey(); - final boolean flipY = key.isFlipY(); - final Texture.WrapMode wrapS = texture.getWrap(Texture.WrapAxis.S); - final Texture.WrapMode wrapT = texture.getWrap(Texture.WrapAxis.T); - final Texture.MagFilter magFilter = texture.getMagFilter(); - final Texture.MinFilter minFilter = texture.getMinFilter(); - - final boolean needFlipY = varTable.getBoolean(PROP_FLIP); - final Texture.WrapMode needWrapS = varTable.getEnum(PROP_WRAP_MODE_S, Texture.WrapMode.class); - final Texture.WrapMode needWrapT = varTable.getEnum(PROP_WRAP_MODE_T, Texture.WrapMode.class); - final Texture.MagFilter needMagFilter = varTable.getEnum(PROP_MAG_FILTER, Texture.MagFilter.class); - final Texture.MinFilter needMinFilter = varTable.getEnum(PROP_MIN_FILTER, Texture.MinFilter.class); - - if (flipY == needFlipY && wrapS == needWrapS && wrapT == needWrapT && magFilter == needMagFilter && + private void applyChanges(@NotNull VarTable vars) { + + var texture = notNull(getPropertyValue()); + var key = (TextureKey) texture.getKey(); + var flipY = key.isFlipY(); + var wrapS = texture.getWrap(Texture.WrapAxis.S); + var wrapT = texture.getWrap(Texture.WrapAxis.T); + var magFilter = texture.getMagFilter(); + var minFilter = texture.getMinFilter(); + + var needFlipY = vars.getBoolean(PROP_FLIP); + var needWrapS = vars.getEnum(PROP_WRAP_MODE_S, Texture.WrapMode.class); + var needWrapT = vars.getEnum(PROP_WRAP_MODE_T, Texture.WrapMode.class); + var needMagFilter = vars.getEnum(PROP_MAG_FILTER, Texture.MagFilter.class); + var needMinFilter = vars.getEnum(PROP_MIN_FILTER, Texture.MinFilter.class); + + if (flipY == needFlipY && + wrapS == needWrapS && + wrapT == needWrapT && + magFilter == needMagFilter && minFilter == needMinFilter) { return; } - final TextureKey newKey = new TextureKey(key.getName()); + var newKey = new TextureKey(key.getName()); newKey.setFlipY(needFlipY); - final AssetManager assetManager = EditorUtil.getAssetManager(); + var assetManager = EditorUtil.getAssetManager(); assetManager.deleteFromCache(key); - final Texture2D loadedTexture = (Texture2D) assetManager.loadTexture(newKey); + var loadedTexture = (Texture2D) assetManager.loadTexture(newKey); loadedTexture.setWrap(Texture.WrapAxis.S, needWrapS); loadedTexture.setWrap(Texture.WrapAxis.T, needWrapT); loadedTexture.setMagFilter(needMagFilter); @@ -340,26 +344,25 @@ private void applyChanges(@NotNull final VarTable varTable) { changed(loadedTexture, texture); } - /** - * Sets new texture to this property. + * Change a texture to the file. * - * @param file the file to new texture. + * @param file the file of a new texture. */ @FxThread - protected void setTexture(@Nullable final Path file) { + protected void changeTexture(@Nullable Path file) { if (file == null) { changed(null, getPropertyValue()); } else { - final EditorConfig config = EditorConfig.getInstance(); - final Path assetFile = notNull(getAssetFile(file)); - final TextureKey textureKey = new TextureKey(toAssetPath(assetFile)); + var config = EditorConfig.getInstance(); + var assetFile = notNull(getAssetFile(file)); + var textureKey = new TextureKey(toAssetPath(assetFile)); textureKey.setFlipY(config.getBoolean(PREF_FLIPPED_TEXTURES, PREF_DEFAULT_FLIPPED_TEXTURES)); - final AssetManager assetManager = EditorUtil.getAssetManager(); - final Texture2D texture = (Texture2D) assetManager.loadTexture(textureKey); + var texture = (Texture2D) EditorUtil.getAssetManager() + .loadTexture(textureKey); texture.setWrap(Texture.WrapMode.Repeat); changed(texture, getPropertyValue()); @@ -370,16 +373,15 @@ protected void setTexture(@Nullable final Path file) { @FxThread protected void reload() { - final Texture2D texture2D = getPropertyValue(); - final AssetKey key = texture2D == null ? null : texture2D.getKey(); + var texture2D = getPropertyValue(); + var key = texture2D == null ? null : texture2D.getKey(); if (!isSingleRow()) { - final Label textureLabel = getTextureLabel(); - textureLabel.setText(key == null ? NO_TEXTURE : key.getName()); + getTextureLabel().setText(key == null ? NO_TEXTURE : key.getName()); } - final ImageChannelPreview textureTooltip = getTextureTooltip(); - final ImageView preview = getTexturePreview(); + var textureTooltip = getTextureTooltip(); + var preview = getTexturePreview(); if (key == null) { preview.setImage(null); @@ -391,7 +393,7 @@ protected void reload() { preview.setDisable(false); preview.setMouseTransparent(false); - final Path realFile = notNull(getRealFile(key.getName())); + var realFile = notNull(getRealFile(key.getName())); if (Files.exists(realFile)) { preview.setImage(IMAGE_MANAGER.getImagePreview(realFile, 24, 24)); diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/Texture2DSingleRowPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/Texture2dSingleRowPropertyControl.java similarity index 56% rename from src/main/java/com/ss/editor/ui/control/property/impl/Texture2DSingleRowPropertyControl.java rename to src/main/java/com/ss/editor/ui/control/property/impl/Texture2dSingleRowPropertyControl.java index 4c90b990..4242ca02 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/Texture2DSingleRowPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/Texture2dSingleRowPropertyControl.java @@ -9,14 +9,17 @@ /** * The single row implementation of the control to edit textures. * - * @param the type of a {@link ChangeConsumer} - * @param the type of an editing object. + * @param the type of a change consumer. + * @param the type of an editing object. * @author JavaSaBr */ -public class Texture2DSingleRowPropertyControl extends Texture2dPropertyControl { +public class Texture2dSingleRowPropertyControl extends Texture2dPropertyControl { - public Texture2DSingleRowPropertyControl(@Nullable final Texture2D propertyValue, - @NotNull final String propertyName, @NotNull final C changeConsumer) { + public Texture2dSingleRowPropertyControl( + @Nullable Texture2D propertyValue, + @NotNull String propertyName, + @NotNull C changeConsumer + ) { super(propertyValue, propertyName, changeConsumer); } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/Vector2fPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/Vector2fPropertyControl.java index 28f9fe7a..a6dd396d 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/Vector2fPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/Vector2fPropertyControl.java @@ -11,7 +11,7 @@ import com.ss.editor.ui.util.UiUtils; import com.ss.editor.util.GeomUtils; import com.ss.rlib.fx.control.input.FloatTextField; -import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.fx.util.FxUtils; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import javafx.scene.layout.HBox; @@ -58,9 +58,8 @@ public Vector2fPropertyControl( public void changeControlWidthPercent(double controlWidthPercent) { super.changeControlWidthPercent(controlWidthPercent); - var valueField = getFieldContainer(); - valueField.prefWidthProperty().unbind(); - valueField.prefWidthProperty().bind(widthProperty().multiply(controlWidthPercent)); + FxUtils.rebindPrefWidth(getFieldContainer(), + widthProperty().multiply(controlWidthPercent)); } @Override @@ -84,14 +83,15 @@ protected void createComponents(@NotNull HBox container) { yField.prefWidthProperty().bind(fieldContainer.widthProperty().multiply(0.5)); yField.setScrollPower(10F); - FXUtils.addToPane(xField, fieldContainer); - FXUtils.addToPane(yField, fieldContainer); - FXUtils.addToPane(fieldContainer, container); + FxUtils.addClass(fieldContainer, + CssClasses.DEF_HBOX, + CssClasses.TEXT_INPUT_CONTAINER, + CssClasses.ABSTRACT_PARAM_CONTROL_SHORT_INPUT_CONTAINER) + .addClass(xField, yField, + CssClasses.TRANSPARENT_TEXT_FIELD); - FXUtils.addClassesTo(fieldContainer, CssClasses.DEF_HBOX, CssClasses.TEXT_INPUT_CONTAINER, - CssClasses.ABSTRACT_PARAM_CONTROL_SHORT_INPUT_CONTAINER); - - FXUtils.addClassesTo(xField, yField, CssClasses.TRANSPARENT_TEXT_FIELD); + FxUtils.addChild(fieldContainer, xField, yField) + .addChild(container, fieldContainer); UiUtils.addFocusBinding(fieldContainer, xField, yField) .addListener((observable, oldValue, newValue) -> applyOnLostFocus(newValue)); diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/Vector3fPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/Vector3fPropertyControl.java index 26753895..4786998f 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/Vector3fPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/Vector3fPropertyControl.java @@ -10,7 +10,8 @@ import com.ss.editor.ui.util.UiUtils; import com.ss.editor.util.GeomUtils; import com.ss.rlib.fx.control.input.FloatTextField; -import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.fx.util.FxControlUtils; +import com.ss.rlib.fx.util.FxUtils; import javafx.scene.control.Label; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; @@ -70,39 +71,45 @@ protected void createComponents(@NotNull HBox container) { var xLabel = new Label("x:"); xField = new FloatTextField(); - xField.setOnKeyReleased(this::updateVector); - xField.addChangeListener((observable, oldValue, newValue) -> updateVector(null)); - xField.prefWidthProperty().bind(widthProperty().divide(3)); + xField.setOnKeyReleased(this::keyReleased); xField.setScrollPower(getScrollPower()); + xField.prefWidthProperty(). + bind(widthProperty().divide(3)); var yLabel = new Label("y:"); yField = new FloatTextField(); - yField.setOnKeyReleased(this::updateVector); - yField.addChangeListener((observable, oldValue, newValue) -> updateVector(null)); - yField.prefWidthProperty().bind(widthProperty().divide(3)); + yField.setOnKeyReleased(this::keyReleased); yField.setScrollPower(getScrollPower()); + yField.prefWidthProperty() + .bind(widthProperty().divide(3)); var zLabel = new Label("z:"); zField = new FloatTextField(); - zField.setOnKeyReleased(this::updateVector); - zField.addChangeListener((observable, oldValue, newValue) -> updateVector(null)); - zField.prefWidthProperty().bind(widthProperty().divide(3)); + zField.setOnKeyReleased(this::keyReleased); zField.setScrollPower(getScrollPower()); - - FXUtils.addToPane(xLabel, container); - FXUtils.addToPane(xField, container); - FXUtils.addToPane(yLabel, container); - FXUtils.addToPane(yField, container); - FXUtils.addToPane(zLabel, container); - FXUtils.addToPane(zField, container); - - FXUtils.addClassTo(xLabel, yLabel, zLabel, CssClasses.ABSTRACT_PARAM_CONTROL_NUMBER_LABEL); - FXUtils.addClassesTo(container, CssClasses.DEF_HBOX, CssClasses.TEXT_INPUT_CONTAINER, - CssClasses.ABSTRACT_PARAM_CONTROL_INPUT_CONTAINER); - FXUtils.addClassesTo(xField, yField, zField, CssClasses.ABSTRACT_PARAM_CONTROL_VECTOR3F_FIELD, - CssClasses.TRANSPARENT_TEXT_FIELD); + zField.prefWidthProperty() + .bind(widthProperty().divide(3)); + + FxControlUtils.onValueChange(xField, this::changeValue); + FxControlUtils.onValueChange(yField, this::changeValue); + FxControlUtils.onValueChange(zField, this::changeValue); + + FxUtils.addClass(xLabel, yLabel, zLabel, + CssClasses.ABSTRACT_PARAM_CONTROL_NUMBER_LABEL) + .addClass(container, + CssClasses.DEF_HBOX, + CssClasses.TEXT_INPUT_CONTAINER, + CssClasses.ABSTRACT_PARAM_CONTROL_INPUT_CONTAINER) + .addClass(xField, yField, zField, + CssClasses.ABSTRACT_PARAM_CONTROL_VECTOR3F_FIELD, + CssClasses.TRANSPARENT_TEXT_FIELD); + + FxUtils.addChild(container, + xLabel, xField, + yLabel, yField, + zLabel, zField); UiUtils.addFocusBinding(container, xField, yField, zField) .addListener((observable, oldValue, newValue) -> applyOnLostFocus(newValue)); @@ -185,13 +192,21 @@ public boolean isDirty() { } /** - * Update the vector. - * - * @param event the event. + * Handle of input the enter key. + */ + @FxThread + private void keyReleased(@NotNull KeyEvent event) { + if (event.getCode() == KeyCode.ENTER) { + changeValue(); + } + } + + /** + * Change value of vector. */ @FxThread - protected void updateVector(@Nullable KeyEvent event) { - if (!isIgnoreListener() && (event == null || event.getCode() == KeyCode.ENTER)) { + private void changeValue() { + if (!isIgnoreListener()) { apply(); } } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/Vector3fSingleRowPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/Vector3fSingleRowPropertyControl.java index a0332d38..786d6704 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/Vector3fSingleRowPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/Vector3fSingleRowPropertyControl.java @@ -3,15 +3,16 @@ import static com.ss.editor.util.GeomUtils.zeroIfNull; import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.math.Vector3f; -import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; +import com.ss.editor.annotation.FxThread; import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.util.UiUtils; import com.ss.editor.util.GeomUtils; import com.ss.rlib.fx.control.input.FloatTextField; -import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.fx.util.FxControlUtils; +import com.ss.rlib.fx.util.FxUtils; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import javafx.scene.layout.HBox; @@ -65,9 +66,8 @@ public Vector3fSingleRowPropertyControl( public void changeControlWidthPercent(double controlWidthPercent) { super.changeControlWidthPercent(controlWidthPercent); - var valueField = getFieldContainer(); - valueField.prefWidthProperty().unbind(); - valueField.prefWidthProperty().bind(widthProperty().multiply(controlWidthPercent)); + FxUtils.rebindPrefWidth(getFieldContainer(), + widthProperty().multiply(controlWidthPercent)); } @Override @@ -79,31 +79,36 @@ protected void createComponents(@NotNull HBox container) { fieldContainer.prefWidthProperty().bind(widthProperty().multiply(CONTROL_WIDTH_PERCENT)); xField = new FloatTextField(); - xField.setOnKeyReleased(this::updateVector); - xField.addChangeListener((observable, oldValue, newValue) -> updateVector(null)); - xField.prefWidthProperty().bind(fieldContainer.widthProperty().multiply(0.33)); + xField.setOnKeyReleased(this::keyReleased); xField.setScrollPower(10F); + xField.prefWidthProperty(). + bind(fieldContainer.widthProperty().multiply(0.33)); yField = new FloatTextField(); - yField.setOnKeyReleased(this::updateVector); - yField.addChangeListener((observable, oldValue, newValue) -> updateVector(null)); - yField.prefWidthProperty().bind(fieldContainer.widthProperty().multiply(0.33)); + yField.setOnKeyReleased(this::keyReleased); yField.setScrollPower(10F); + yField.prefWidthProperty() + .bind(fieldContainer.widthProperty().multiply(0.33)); zField = new FloatTextField(); - zField.setOnKeyReleased(this::updateVector); - zField.addChangeListener((observable, oldValue, newValue) -> updateVector(null)); - zField.prefWidthProperty().bind(fieldContainer.widthProperty().multiply(0.33)); + zField.setOnKeyReleased(this::keyReleased); zField.setScrollPower(10F); + zField.prefWidthProperty() + .bind(fieldContainer.widthProperty().multiply(0.33)); + + FxControlUtils.onValueChange(xField, this::changeValue); + FxControlUtils.onValueChange(yField, this::changeValue); + FxControlUtils.onValueChange(zField, this::changeValue); - FXUtils.addToPane(xField, fieldContainer); - FXUtils.addToPane(yField, fieldContainer); - FXUtils.addToPane(zField, fieldContainer); - FXUtils.addToPane(fieldContainer, container); + FxUtils.addClass(fieldContainer, + CssClasses.DEF_HBOX, + CssClasses.TEXT_INPUT_CONTAINER, + CssClasses.ABSTRACT_PARAM_CONTROL_SHORT_INPUT_CONTAINER) + .addClass(xField, yField, zField, + CssClasses.TRANSPARENT_TEXT_FIELD); - FXUtils.addClassesTo(fieldContainer, CssClasses.DEF_HBOX, CssClasses.TEXT_INPUT_CONTAINER, - CssClasses.ABSTRACT_PARAM_CONTROL_SHORT_INPUT_CONTAINER); - FXUtils.addClassesTo(xField, yField, zField, CssClasses.TRANSPARENT_TEXT_FIELD); + FxUtils.addChild(fieldContainer, xField, yField, zField) + .addChild(container, fieldContainer); UiUtils.addFocusBinding(fieldContainer, xField, yField, zField) .addListener((observable, oldValue, newValue) -> applyOnLostFocus(newValue)); @@ -231,13 +236,21 @@ public boolean isDirty() { } /** - * Update the current value. - * - * @param event the change event. + * Handle of input the enter key. + */ + @FxThread + private void keyReleased(@NotNull KeyEvent event) { + if (event.getCode() == KeyCode.ENTER) { + changeValue(); + } + } + + /** + * Change value of vector. */ @FxThread - private void updateVector(@Nullable KeyEvent event) { - if (!isIgnoreListener() && (event == null || event.getCode() == KeyCode.ENTER)) { + private void changeValue() { + if (!isIgnoreListener()) { apply(); } } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/particle/ParticleEmitterImagesModelPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/particle/ParticleEmitterImagesModelPropertyControl.java index 9b5f73f6..9d9d2a9e 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/particle/ParticleEmitterImagesModelPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/particle/ParticleEmitterImagesModelPropertyControl.java @@ -12,15 +12,13 @@ * * @author JavaSaBr. */ -public class ParticleEmitterImagesModelPropertyControl extends - Vector2fPropertyControl { +public class ParticleEmitterImagesModelPropertyControl extends Vector2fPropertyControl { public ParticleEmitterImagesModelPropertyControl( @NotNull Vector2f element, @NotNull String paramName, @NotNull ModelChangeConsumer changeConsumer ) { - super(element, paramName, changeConsumer); getXField().setMinMax(1, Integer.MAX_VALUE); getYField().setMinMax(1, Integer.MAX_VALUE); diff --git a/src/main/java/com/ss/editor/util/EditorUtil.java b/src/main/java/com/ss/editor/util/EditorUtil.java index d732fc0a..f64a9cd1 100644 --- a/src/main/java/com/ss/editor/util/EditorUtil.java +++ b/src/main/java/com/ss/editor/util/EditorUtil.java @@ -423,7 +423,7 @@ public static float getAngle( } /** - * Gets input stream. + * Get an input stream. * * @param path the path to resource. * @return the input stream of the resource or null. @@ -433,6 +433,17 @@ public static float getAngle( return JfxApplication.class.getResourceAsStream(path); } + /** + * Get an input stream or throw an exception. + * + * @param path the path to resource. + * @return the input stream of the resource or null. + */ + @FromAnyThread + public static @NotNull InputStream requireInputStream(@NotNull String path) { + return notNull(JfxApplication.class.getResourceAsStream(path)); + } + /** * Get the input stream. * From 7b2f9b2354e6ab8aa06b0c3883a37cae1698885d Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Wed, 2 May 2018 09:51:17 +0300 Subject: [PATCH 34/49] updated plugins, refactoring, updated property controls for default particle emitter. --- build.gradle | 12 +- .../jmb-font-generator-1.0.6.jar | Bin 13533 -> 0 bytes .../jmb-font-generator-1.1.0.jar | Bin 0 -> 13532 bytes .../jmb-sky-control/jmb-sky-control-1.1.1.jar | Bin 25633 -> 0 bytes .../jmb-sky-control/jmb-sky-control-1.2.0.jar | Bin 0 -> 25657 bytes ...ntrol-0.9.11.jar => SkyControl-0.9.12.jar} | Bin 1957079 -> 1959608 bytes ...0.0.jar => jme3-utilities-heart-2.4.0.jar} | Bin 131341 -> 134700 bytes .../jmb-tonegod-emitter-1.0.2.jar | Bin 140495 -> 0 bytes .../jmb-tonegod-emitter-1.1.0.jar | Bin 0 -> 140147 bytes .../libs/emitter-3.0.0.jar | Bin 0 -> 157909 bytes .../libs/tonegodemitter-2.6.3.jar | Bin 156244 -> 0 bytes .../jmb-tree-generator-1.1.1.jar | Bin 85728 -> 0 bytes .../jmb-tree-generator-1.2.1.jar | Bin 0 -> 85879 bytes gradle/wrapper/gradle-wrapper.jar | Bin 54329 -> 54413 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- .../EditableModelObjectPropertyBuilder.java | 18 +- .../impl/EditableObjectPropertyBuilder.java | 116 +++++--- .../impl/ParticleEmitterPropertyBuilder.java | 270 +++++------------- .../builder/impl/SpatialPropertyBuilder.java | 53 +--- .../impl/LayerModelPropertyControl.java | 40 +-- .../property/impl/MinMaxPropertyControl.java | 3 +- .../impl/Vector2fPropertyControl.java | 33 +++ 22 files changed, 222 insertions(+), 325 deletions(-) delete mode 100644 embedded-plugins/jmb-font-generator/jmb-font-generator-1.0.6.jar create mode 100644 embedded-plugins/jmb-font-generator/jmb-font-generator-1.1.0.jar delete mode 100644 embedded-plugins/jmb-sky-control/jmb-sky-control-1.1.1.jar create mode 100644 embedded-plugins/jmb-sky-control/jmb-sky-control-1.2.0.jar rename embedded-plugins/jmb-sky-control/libs/{SkyControl-0.9.11.jar => SkyControl-0.9.12.jar} (98%) rename embedded-plugins/jmb-sky-control/libs/{jme3-utilities-heart-2.0.0.jar => jme3-utilities-heart-2.4.0.jar} (64%) delete mode 100644 embedded-plugins/jmb-tonegod-emitter/jmb-tonegod-emitter-1.0.2.jar create mode 100644 embedded-plugins/jmb-tonegod-emitter/jmb-tonegod-emitter-1.1.0.jar create mode 100644 embedded-plugins/jmb-tonegod-emitter/libs/emitter-3.0.0.jar delete mode 100644 embedded-plugins/jmb-tonegod-emitter/libs/tonegodemitter-2.6.3.jar delete mode 100644 embedded-plugins/jmb-tree-generator/jmb-tree-generator-1.1.1.jar create mode 100644 embedded-plugins/jmb-tree-generator/jmb-tree-generator-1.2.1.jar diff --git a/build.gradle b/build.gradle index 3083c162..cc45256b 100644 --- a/build.gradle +++ b/build.gradle @@ -56,7 +56,7 @@ ext.applicationMainClass = "com.ss.editor.JfxApplication" ext.applicationVendor = "javasabr@gmail.com" ext.applicationTitle = "jMonkeyBuilder" ext.jmeVersion = "develop-SNAPSHOT" -ext.jmbExtVersion = "2.1.1" +ext.jmbExtVersion = "2.2.0" ext.jme3_xbuf_version = '0.9.1' ext.junitPlatformVersion = "1.0.0" ext.junitJupiterVersion = "5.0.0" @@ -74,14 +74,14 @@ junitPlatform { } repositories { - mavenCentral() jcenter() + mavenCentral() mavenLocal() maven { url 'https://jitpack.io' } maven { - url "https://dl.bintray.com/javasabr/maven" + url 'https://dl.bintray.com/javasabr/maven' } } @@ -169,7 +169,7 @@ dependencies { compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.3' // extensions - compile ("com.github.JavaSaBr:jmonkeybuilder-extension:$jmbExtVersion") { + compile ("com.spaceshift:jmonkeybuilder-extension:$jmbExtVersion") { exclude group: 'org.jmonkeyengine' } @@ -182,7 +182,7 @@ dependencies { // TESTS testRuntime "com.github.JavaSaBr.jmonkeyengine:jme3-lwjgl3:$jmeVersion" - testCompile ("com.github.JavaSaBr:jmonkeybuilder-extension:$jmbExtVersion") { + testCompile ("com.spaceshift:jmonkeybuilder-extension:$jmbExtVersion") { exclude group: 'org.jmonkeyengine' exclude group: 'com.github.JavaSaB.jmonkeyengine' } @@ -232,5 +232,5 @@ task javadocJar(type: Jar, dependsOn: javadoc) { } task wrapper(type: Wrapper) { - gradleVersion = '4.6' + gradleVersion = '4.7' } \ No newline at end of file diff --git a/embedded-plugins/jmb-font-generator/jmb-font-generator-1.0.6.jar b/embedded-plugins/jmb-font-generator/jmb-font-generator-1.0.6.jar deleted file mode 100644 index 098de3403f8f0a2905a40136e4966fff2ef52479..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13533 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 AlmGw# literal 0 HcmV?d00001 diff --git a/embedded-plugins/jmb-sky-control/jmb-sky-control-1.1.1.jar b/embedded-plugins/jmb-sky-control/jmb-sky-control-1.1.1.jar deleted file mode 100644 index 65b22f9d572520d21d33dfb477ef3fc181a5af86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25633 zcmbTe1C(V;)-9Zsw#`c0wrv|HZJSkT+pM&0+qPY4+gY!=Z~xtWzkdJydb~ZxKI4pW zR;;~uthr~*6|v$dNP~bv0|7xo0^Mb*$N>F5fdBUK`+)j=%8IH8(n`vS(Sraf{K>G+ z5BL)2w*l7g6ZPK>Wd-FV#YB}==w!w2WGBXDq-p79;iPG)rY5HAl^7P7cMkRrfd7ZH z-|hc-RnXtxjqGgxzp`f7#L;U~6n`@}GBGw7x>L3D)vc6K)G>YGp{yYzh%nI_wa{#0$Nh;K{gndqW)Ww;E^M7kI(~)8*mQOan0wo7 z;?K=_hiPDTKamOXJ(Vf$F6hp^xaV!h>GMJDa>ksx^qBVY*&1JczqzW{|8l<*LSfia zW+2gPk7{Q?5{_6Usu*Y^8>v0)?8J%9=zy%IIzYM*|uTBN!Q0G%0DoME2!r-_5(^G%f7Q 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 RR#xE0oDdByOB4Cm{{WxrGDiRa diff --git a/embedded-plugins/jmb-sky-control/jmb-sky-control-1.2.0.jar b/embedded-plugins/jmb-sky-control/jmb-sky-control-1.2.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..56a86368877c635599281cdefd933b3c5e7a5d00 GIT binary patch literal 25657 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 literal 0 HcmV?d00001 diff --git a/embedded-plugins/jmb-sky-control/libs/SkyControl-0.9.11.jar b/embedded-plugins/jmb-sky-control/libs/SkyControl-0.9.12.jar similarity index 98% rename from embedded-plugins/jmb-sky-control/libs/SkyControl-0.9.11.jar rename to embedded-plugins/jmb-sky-control/libs/SkyControl-0.9.12.jar index 41429cee3539dcfc9d67dd497ae11578af85d06f..5f81fd4408c2da816e4a170523b099e98fc95a55 100644 GIT binary patch delta 23480 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 delta 39493 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

)TH0{$43HxPV^ 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%0A*J(`{_1q`03P# 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 KQ48-lApZldreS^n diff --git a/embedded-plugins/jmb-tonegod-emitter/jmb-tonegod-emitter-1.1.0.jar b/embedded-plugins/jmb-tonegod-emitter/jmb-tonegod-emitter-1.1.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..00f4690fc9340679b2ba1cbe2acf988941134e0f GIT binary patch literal 140147 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

6m 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 z

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 A&j0`b literal 0 HcmV?d00001 diff --git a/embedded-plugins/jmb-tonegod-emitter/libs/tonegodemitter-2.6.3.jar b/embedded-plugins/jmb-tonegod-emitter/libs/tonegodemitter-2.6.3.jar deleted file mode 100644 index e1ecfd6b63cf70406e4260ead06ffe707e8d5edb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156244 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 diff --git a/embedded-plugins/jmb-tree-generator/jmb-tree-generator-1.1.1.jar b/embedded-plugins/jmb-tree-generator/jmb-tree-generator-1.1.1.jar deleted file mode 100644 index 1a96a3df3bc7ac6034685193db9a9a7fe7793b6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85728 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

oSJil8aQiUX3yx+kD{k-8+AxwdTNM zY-@A$mI+sI9Kny5G7gE3HjjbVjr15eZ~^PW2I6CV76A>slP(js zV-Zk-fN}|VLvf;LiET4stzj_OI~b-OpgpxSVKYP>i2-jT6q<-_IRGQPY>+eK;L&U(PF(+ zHf8hl+DrDk?)^7Sx37sE46*#z+B%(-N*vfwgpFJQG|)1Qnbr1HtHOHOu_}Hd;hd9o z1meMWje8E5o3$1goBnQ~29*Q?OK!hbCa9y&UH1Axbs?avK~<^4|K$JeR+IWx_L_y_ zZ+XQ?du-*b}An4fwLLe~O2A)AMy$!fQaBBxJhoEu?2!sH& z3)n-Dw+qDo*YCr+90EwJ#U9`R1;_V*mk>Dq0iqxP_kkD)683>u2t*HnBnSo$&O-Kw z0OnMQ{d*?F{RN^Si_pYoTM{gi_U|t(A`DE zS;kicmj<=Tu2zK6zuOz|8{c zLEy~-xIXSVb>~f HGT8qCDl|hX diff --git a/embedded-plugins/jmb-tonegod-emitter/libs/emitter-3.0.0.jar b/embedded-plugins/jmb-tonegod-emitter/libs/emitter-3.0.1.jar similarity index 59% rename from embedded-plugins/jmb-tonegod-emitter/libs/emitter-3.0.0.jar rename to embedded-plugins/jmb-tonegod-emitter/libs/emitter-3.0.1.jar index a4804a7aeed96bc22b0940ba3bc6024ffb30d65c..6d83986d53b379c4cbea6cf694d2ea9096d2faa2 100644 GIT binary patch delta 58017 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≀PZ$@a;H_Y`CZ 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 Zwj`>ck0)>jkWvL7c>+B6gT`2r{{#1Tya)gQ delta 53965 zcmZ6yb8x4@5-uD&8{65~Ha50x+jf4NY;4=MZQHhO8{eKi->tgmR=rizHPijqJTq@U zPxoZsKrhZh!^=y7g24a*K|ulK)~3e7r-S}yD5w3;kc>+KLX`YV0R$2c6zG5aq;pE` zJNRIMfLgGCfVkrw7*PJ>MqRH9EDrmh$of(^2BiNO@f&zd|0a;|tH6-{PDtMf1qAN{ z0|6<40s)czC$fH@7!>56&nbxn=)WKfE~5Bo3g~z}3b=m@wiGwOKmHTEmtF3k`#1Ow zB>6S~82z79I28sUcG7nK7i!@2!88j?11kwpAUG8ItH1>Dc#b$4GDTb{qR6J)Ml5$M z@6Sl`#5eT{;@TbHH+eKS>*hp3^p&~HbFXRdW6z_ft7ifrr4HNt&@KdeA51U~_?xiY zM+u9=Be=)i6aU=XRc*<*S{FZ6k3Ei!7E|lk6yN zT$+=dR<2;Qpq~Asy+(Gh^g|QP6mHX?0e#uOSdjc%9T|IfUFAkZ)yO+S=1RK*{-NyI#baNs#YFbFC0XN{G&#^Gyp zxl&%9;JIpLRQ}UhyCLGk36Q=)@i4fmJK!>!&y%+d2mR=eI(NSdiosuHD7^?F(N@i- zZ~Ygx@|C=9D2$qcp1wf-2S0ydK@?v|_YWfVt#rk}|F+qPA@-jU|9AhB`BXrl5&j?8 z)iW>^fcH%ETa9VF3c?w8 zAs!ZaiRjeX7FVTyY3r)SB#ZM#NK0a2A&G;`4GkTT*Hjb=zl1I5S3v6#Gbgqt`1V6) zTjouizyhk^^LV3tbJ6m1?%CohgVV|MXksFj(@gJc7DE@PMk6X<77(yq+Dp|@urp5N zO&USiRraSk@Wv67$Xf@pyFA6fTcr1z^2G-nkh6n;<}K7qK>1<>4nQ6%cc+c8+mjP| zsb~1Y1t5{V(xZK-(0*ZWD_*#O1M*e9xdXZvNdd*--@2pUIsJfzU4F`!W6clPuKX1@ zmp#43Jb=>8HO!X~z+!uT^&4)#`(~T#gJ7_$y5W0q7eV<1C+t(cH@)qmlEF9NdtW~1 z*9Z+TT|5l90C?g-Jk_9JmyV)<+4guNz z13C%!G`*(ya;ha0^L)e2x-ZnE8CDar7+J$@?o>v)9qU2WYFJ`*K=>S#)Wn|o`u@}PI!)g_jk z!_dq|pflYbP+x_&ojuV)B|4*6cLH=NS;QXg7@63F@^f_5CqEyHTnY*6*(WN;b1jtI z$o459hv-t8`!s^tkx;Ho_K;M~A>YA8>`*yOQDTHEz7#ZF0#l~Q2$hsK0ozS1bji5R zm22JXMzW2Fk+{SKMT0zZ?J)AJ&SF{oLMDRa+1`O3VDaVpmNB62nn8W(Zn>dqQQDC1 za`KypFNJ5yV_8efWVr6CLDN3v4<40CF(LBlI2p>6x?{n7s&oCqW^1-+Yi&#YFb)EV zSjOe~kC`)DLua$>bbE**vS`jzgLGBq2cOXtJbwLo)hHiB2JWjlgk@U9?7P9^#|zVh zlUL1RK#p9^QQZV`L-G;w>V-rw+a^f-Yv}AtLVO6L$Q}Cgk;Qsx{YEHMIntK+ zrbbjgp}Kv4Vi_9CWb|z4f_4T~P%x*@JeuSNpjU;vwaRn^Pikegl!X-j3UjMz<{?w< z?57+Ho(UZ6EvDy`ZP)`{LKPBRapvej13{erfG{hItr-j$nYX#M?9`n2D`rK@@7FG( z#9EGKB6SQ6w^d5KEho7NiC0Q>)klp^B#mXGJNqlRnNrQ+x6J`u)A|YJ zbS|?HzA|N(Znu)8c>qR57pw949kn^_tze{1-|UY6SUFE%oo+SH{g_)JzL#%#Y2|wO zwn}W>EQV|)Z5qRdHM@{fsWMZhi|Ac0U}I`Xe3A^$Q=6PmP>Wp@#w%^C?N*lg99qJT zKD$XJD7e^TaBykv$#@OV359LkvoZbjE}SFZLH(TP^H9k@wx6oWQ;guG2YZZpSKBc(5yrUMp|1{e4>oqk4sltN951MJL(ia@}`qTU|WO|wM`;8(em z;!iR})1g)SOc6qfsj#y%6{Br5+E~X$a+y>S+bG?w7#(=PB}H5})hD+@PWyrE%Soaj z#dXsVsMjM#;5dfZYmZ!!AlzSY-~=7K(-RFMpiu8k+FPeYQKv_XhNyCD;1 z9XFY@LBXzZ$JV+UM;m67XoJ27NI7t*HRi^zGlm2oTX$F!6vVhxZtnVxLE8!*t>swm zk5foZ(oS=_)N2dw1;tSIu|7II-fNSzA&YhKpj@X`>qc>+bmTh-VcbaiZrn|JozNQt zr@>SazEubZ={zfd<_y^yGgLqte1o`taA?eiVCFY@UH&Q&d1(NPWxO~IAon1a685|- zsMMyrew51|cHA@pFY) z)?HF_=)1l!AVF(;L^aEu+-SP3bK2k|8174x%2jKp9PXQ1ZhzfY_q-3Uw#2YXiad3@ zDZ(Bi%FbM%mc4@OWLlL6n6@IzG|^lgT$dO|t2v)!Nes)L8C%G&%%8RT4c>2|GJM#! z9njo|dM^_T%Ni5zk|d#fIe`~qA>u_hpAo2PmkP&Q$1mY_>&t%R0C!&+n|iOpOkaL=657g}o_A$po^s&>aPnc}pXt!DnEUGE zrYxP~btOA5wDIvj<6ZaMli)sQoy+pxr;AXIG@ZKnaD(E8z4xKaM7SvFOo4eRUl5yVo8SF?pJa6cFq0#)MvsYNF}$h*ll8@w;{e18s4r|PD7vtc#R*4xilML z?5*ivk=-|$yteLpwUR0-;{^@RkM3*!(g>|VDxV1e+6onD&~J6MgZcqdviJPM7pGAn zc?M){2jixel0K)i81B*>YfZ<*+!brBmZ?Dk_b< zJ;}Zs9sk9CIKO=km_Ndqxf-&ArBq5edf^bWBNT>nXYj;F_JQ%!P!`S>x``R=zAwoT zK?}|mGF9dc$7be=zM-*%Em8S(p0`AUjyCiN-jMs74ZC5fj8zZ=gDlBe*s0~LqV^fT zFSCUFgTtQ#5UQDB$mR`#qtMK;B__kB;&W}F~`hxbslhp%V zWqaou^1M3?^yibq1MC?YL1OE&!wacQiBH-E?X6z>0hj6|p4?u=S;Xq5%B<$WgJo8T zS$(U_iJoUHlfsZJoijg44RbtQUgE_gzyYGNBd~EFKxy5_X{3-&&Sy7k`hjXh0`YEP z2)rT26Y|RnrIes&Iz|tkd%Rjw2S=xtDLCmQ3^ysWZ!XHLR=b84Q>T_DMd-Y42P;#< zVQ55ND~Y-NcQRDBzsL)f%{#X0p2^y6SnaW>q)lESfB1W=|J{93Wg$7gIgOT;H5{h2 zO+`;Izpg;?AW~pPp3gi(M{AcGXK1%$?Ma)10h80HoM zC$gGRs$1ir^{m5Z(PLWW{$pFtRz(?w0j8tnix~fI-}864OVR8=)uTf|Bp())uuW|2 zH|@fX3(L;B$m@K{^6JU?!}H3o1T|N^VF4!Uzxc|Cg2*?TPey{7B2>RM)>TPleCHOS z(!8V63{zGno^dWOqSOQS#kYP=4B%NcySutG_U#rorJ!d%7=IwXtBuR+*Q%!XMj3FT zkm?(wH&iKoV2^YjcWWd6Opss|&r^u5qlA%~&f@FHReWkxK4S}=UlNz9#63G`H}g-7L!OQD zB|9L~7mB*I5QmSQ-?uK8!Z)!?(xCN0OK=Bxh*DTFZE6h@K5LkaIQxB*2Roj%-u-NRL{Hk&tl3Rd=#x>sI&c4gMt}9v;36FT@@5CAc#DaYiBnB$9Bf+N zr0`_i5#h3Rrom16s+Dw2lL~G5n1Pn^?vsXgH6yo4pLTJ9EWM_s$e$>;6Au1Uk%vpZ zN>vMP&XHa8AI)i~w|9q28XLbV09kYG30m({RmC%tw^z7N)*Ln&X{=p;ZdJ;opDq2- zp!rV74P<`s7IJd@flr?F(NdV>oj~=o7Laes4YIoy@%E(ORca5Uzg(1X;ak<}Ohw;KSrugm%S{qP6RNbucHN3i0R#Yl>hPAwe{XXdj(A-_U6H}Pu)J4p&!PnwO5=RW=kK(u6sk% zr4I(1#oUb1Yq$5xq~g6DPYR+(x&QL}i};v+>y*2lYK<%0hZKX#BeC7PawJ>DBfe~c zSpd83;aT)sRGxt(nE$hI*{{$9juL=ZGK6tUy4}InFQ*A^w;=b^e(5ELurZL!cijBV z1`eklT&OK4_w5__f4FS@hye`BKZ3dF%mMY!K=i2w`NuSAViUeyK!AXBz>;G^|I13D zOp@8|5x*f^!NHN3x-WV0R0!U@Ss{~1px#k_~W0(@gF9O1)wvsHgIx^R9kgJ zQNjHpOLa|SC{$b%)HJ39pRWlRj1-|jE$eL{)5H71*ow(RxUeoll;Cil6; zZ4`6h9>$oy?fsUB-tJ_UF$`%WCx4#m?0$T=iT`+grtbz`i7uCTFeLUvB|BtF9Pnx3 z_p9efKDhNGS+n2j0sL_UQ1}Jkii4mR9o75Nj#Ylig5+IZ}=e z#)eaunt&$5xnrw_#^HhW;W(KE1lhdyxC~@)$46Gx7t_+$z=}B34Y`W{F-Wf9+}*Ag z7*~-qV|7->eODBb4hb|^el+!-o3=3LwdQuU7Z&2-XPG^jFEKm*Q>FSDKDG=b;wMQqkct0ADJ(p`Yo#sv{T2DAw8jVZF?$o0^Fx zTwd%n_s8ACSF=Cz)n98&mnQU6qni*nHWOKw5M5B0YS!l+2G2Y*D!}Uwqtb)=e8twa z;6zg(aW2P9h<92=$>+<77^@5F7vy3{ zbWTPiHSo$^nRA2S+xjTG_m#Cn$u2G*}~63ls{ zsC|eeILx12tk<4StKq~cPc-Yd^{SC6cus$6C2Pe^Bmk+J>r`d(@I`9M{8W%dN|dxn z7B-3W{@Uuw75PcdvWzaOW6Z)j*#__kMFi>^jJRdsJt$KVHzOR<1-iV2#^4xr`Kmjs zuzYS8Y zFDQ9^WC3rjLr>K|Yx_&uGogmYv+zbNVeOnAo6R6 z&&jrW(#f{^*2%VFVYU+ko@3Z&gW<`pM7Mh0$pCyk!DM`Wlqdw_#c~IASX%0i)cCO2 zOKhi*@H&%iX%jM@ib7>&dB`h+*6zHcVtQrIVBxG|x+?xZkGmm;k4y~N7#vz@hV@!f zIfs$9>}T(MR%vad{>TV@J1R+2=H`Mabsx;sorWxh3FGCU+J*w*Rf2G7f;-3j zwpIE4#0u<;0}LN??HWW_1hkpw2xH!O&{Rf}rAFo@Xt)?73L4yke^lR#Z8UOth~$ZQ z)*kMqO*MM)0-VWOC{ZXr)2~tJ?lhvJvQY-3tRyEifUHD@TssoL;s`gKPXlm|jop&Y zu9$?cnB@C}ZLpc)7t;y?*42Wwj~+`NZ_>fWB z^-6~s#t8&i65|?8kGkNhDN_!-E?2=P2P=MDF9#jBYHjG@OMZgNOJV(AH3DgrEER~U zzasqF-ya)oe61n{fQ0e?|34|}*v&Jb^4iW9O)@P-Mkn^JtSBaRArj#W@YI-?=jl*2 zVk3C{vNdd^E9E6UeUab+MHYm*guKZ|Tvi~R!3P>$?i%ho)_&LhetErw=}~gV+vqh# zVOx{AyTWcU+0O!gwy|DcF}Ug6_0kxa=j*d{2V|v;=OLzIOqpa!RYGW%`R6+N z_RYBC7b}kLfeS5OXECY=b0NW5@sKfN_BprGC^wbLum2&KX19$ zIEBueomsL%Q>f-%>1l&5&mESjw7L&Y`wmv_+mAcDA^45dp`&#J?es+R6&B1^Ud=ix z>xHSZlJJ;mX{iM#RaK0(IA z_~XTe<7Xo z;X{nT#Zl3Zh;3YF-p*gd9Kwn)N4`jb6b(5O0;HCNT(T8C`2 zi2&xJ3p!_1v|jP$Z&~OSYajf$cJYd%y!dg7OJ=^V%ef7rNK;`$f^thc$FrO zn4v6*EKUoJqT>K&<~=6WrLlnW?B5CHFT{K78cn|BHm~k|Hyw=Zi@xKTlV0BuxvvQN zK|3qbakpmM`|iUH~a$U=|PfXPeSUn1SI;%3uHqLSxiZ@p_*4J_i&kaf+yg(zX^d4`wWrGZhEt*B1+wy4S{7;fB4Sg^S zPaFCd8YRim-N0D!_6G>@StYmt#dS$gMnvAy&UVep=l4qy>NH3JFp(QsgVLP2=Y~jD zQW;}*tq)poB<~y04+;lYH02u+(9u-p_`l!ga`Q0;kd`_fad;^RQwp6vM13u5a=-Tv zSUAuz4y+AL+Kjp&gMPQAktQ35Rh1~gk701#&nZ_dQ##^(Wi?e9xj;Z!?x7#!66tJ= z!CK&sNQ?!kpf4~&nRHDMA-@V51Ekxt;N%@32oxGp@o0=_VRbUs zAXJSW`$Oo8JzioJk6+tA=bjIw4FaYdiEG4|LmrVLM6Exj5br>dkuxNy+-1?%CCykTomTNp@h;gAjx_bVt#=Dzrj#rx<|GobKo!~46cI0x?!lk zMAQTrUL3i4n_9qQFT4qgB)kDdX>MG{Q^vxd8Zw+7GW=#m*NPtG<4k&oGnJx5THwVG zA~vSL#W;t53cz8s{_rvkn*2UFN|4gz2pq??56jWjT3oYzr#a)vEuiPmTXz5Y9(H4e z1Og&L{11)A{LkS{*3tpNsMoIHhx|uc=TE)l`Tth*3!vh2zR2Ten&|+vQsX};b=3P5 zmjo@KDO+SN5Xo~*kQ_5}T^ugQ9Da2W^>QP3{OpC56PGW5AsT?ZQ3&C-ko2eEL6zF~ zx@u*1I-1IK&$#CA@&>iXo_D|%1;DK{ApW$IpCN)41LMRVX2iwtDaG_42g5_&k}!~k zcH)XM$UqXB8XDmyKZya{Ou;${q=X}jl4zS!kUtJ5*-afs6c$`_c~4c6yyhLgZ%AoQ zfwm9f#d|FlG`1L%!-@_vT`)E4%->~GbhqK)6&5%lg>BcjuV(b!NVnC^;tCcVKo`k2A4MuYFwd3YNP{*Gc}e;bo%ST?7-O1 zyA1dWI?ghtB8aNmS*H(Bl1{eoo2{ehF{9x$$@Wv4v>G#7ai5Pj!vYkb)r=$d%OZ3y z5@Lr~v9P2W9>ORo*X@rK%gUE0UZKO+6C;jWvm(x0$aaHLI4JYQq%#CnMP)HnFyS?z zJs5Kcje;?A@+koMB+?owS`o3p)iB>Vu*BhdnS_ZN+HiDD0gj4JA@?%b zeBqxiZ&(0DANBV-^IEilhI9ZnYB(y0zH}bz1=RX9s1*8@B}9#zO-*a)1qBu{l~Ty{M9621bOxc}={nP< z{j=S>^tA#u(fGWd7twbd_0|?4w|`jQiI}H5nVqszxw+H%zuz7afCzTNN%CGe0$DfY zb`(KcQR#Mo>5nwLMl=Qbq>*u6NJRAG)s&&{JMM@>dW(_KG0owcNNAWSm?&z6IQ^!< z3N}DH3vAS2LE_Pjw&N>?aRJY0^)|1@x$0AXo2;2dr!J`FpOuvv10|_V>kS{*i}RO- zy*tz(rH&G6<(8!@E2of;zBSZ{)rSq2{&Y2u?hVIcc=uKkW2}1MR_i*E<6hq@Og@BVc5w1W(k|bS* zXacN(Ke$q$-R*kxMU~bDLGmEbKI0 z0fB(~&LJA(j{f<>xCodBuriQnQ87_b^mV4KgPUcA_*-;3@|)HOJnf@I941qH1<}l1 z9;@~W+M1`7Mvvzsu(yJ}D;zZuqS z>U{rO486B$%tX@aDJE?eq}y1lq{^gKV36iUj)uYn234fwRc_imcB8-QSoxx7en+K6 zq<5}*VQ2FG+ZMp(GP|kzO8c9Cs{Ne(WZcQG%Rcl`qs#mEfj0$)VCx97(*_60{03W2 zs+4EO0Wt&UFu(?9hvXTu(iEx|jlUFsfF9E;Y9u-UEJ;XCKmMY=1$k||PrW8hQmlR& z(JP8#Jvy@%knMYjQvMs#A4+XB?58%u&jGKH=}p`R+b54<2Y8s#E}D^~Ens1P@pO`W z>&#B3Z`9C>#cU#8&PaCI_TM5|!5qPM{w?zj!?Sh}ivYvOSCNx$P_NBCo2ojfXyg|} zfQw z+^UJhrIE?Zkt87ZI9MzuB`G2cYA;)em<+!BT%cseA5@57s#}OXgtOo2@!N&L*y#b} z{Fsr&O38XvfNKxK#a+f7SqZ+ldgp6@zvw!5`FeX_%?8>UB6kS5^#v(^Aq=}$Fh=GG zU-wQix%^?(idnR;KD-GAz4IbxfFy?(*Kw|Vzyl49x?+F%x$VlX*#WhDS$vNfh+NdUpw@%oD&+5 zLREZTqpQupUBLIJdz$_w;AUZ15@ghmc%LCe?#EnODA13pRjLI%FCX@E*;AggeN!9D zGG3L^B=4YMv#r+lj(Orc`QD_6XxBxT`j`||AuNx^9uQ&;ASqCYy@46-_LqUK-V;P6 zkaGVG>+Pu0$1){RQpY*GhHiCV!E0>e*T{ZT)U$G1G)uEUOT4!I6nV*;Kb7xzK41d1 zagqrQxTHmR`+;XB%vlT}L(Ko`%%9pZYk3N<3&ReZYN#<<)|!@AIo~%^*J@aq(wc9) zux2W|IYM;^u&h)pF;PCON}9Gf)O1t&225XN@#dO64rFOrshuVt(R}8KEStWJ0>?S| zWgr}YNKM?e#7N)O{9d9xMT!gW8K99Xw;T4LI$;q(&wq(O`SlSLdkpm{oz$ba1AT$Q z7a0!x#U=VNFU*wT8#a3k#q4{4`9=FijhE+*fAdotK#VHZf-D^3jF{TFbp2@)?FN=i z6n|0bU&HbW^%{E>3&+gm<8TF?cPiCQ{PaSxg}Di`9e<3#5lHaaqU1b0Tm8EE_s9pH z0KlKxqHs1$kP499A=yFam;&T1SUzD5KQjPlyFAzfSBJR$?JZ~z*W7|PX3uT`<)iK; ze+Ezh8C<^)*69PeG4C%OwzDuVcN*--ecnwh*RZy;BEAG559kuh4p?-{kXba!koD`F zfo@TiAVYZgJjXQ*LB0K;y(N@x&|Geg=RDTzs-(gyTAXdx5ym$!u(sB zx*9SOToVrlZYg1qQMN&8*U7x_I2O=ksmbap4Y`)>lLp!?g`ryu$_;Xf29 zxW)6Wjh2RR4My%8Rdes){i>ijO^C60U?xo>V|e97MS=qs#w`EDRK2msF{rAEX1S~Z zWU#bDi;iS#ue=1=g>&}WmZim>sYs-CHu!_bVC5z%uf+F9cf^JLWB3_GAyjDllu%j|?s%AWqXzW*BU&U?0*KzUMy0JgmvcG8r?3E1rY06U($2Ft1_ zeL<1*Nt2Y~3FG;zo2V1welM>C2uiyG8X4TKJnBh1Lu!~u-~uYU*J}pG6OVZ7e~l21 zWA%#CovPoqXd{q&jkFIk)<40VleSLXpW1^hVJY-NnY~s)S*i;t)tCIqMy;g>S$Jt#_M9OVaLIkv3W<0M48WMhRC3a zXh}&MfCYOn=YkN!<^#x5){uV;IzSOwn9nsB%cZk8lb1?Chf{mpF()90%Y_Y=GCZ21pr6DH&%%U1<58) z$4noA`G53~qDcH=jAoUb~mK62(?g%e+6QsJlXjwg`#Z&q)) zJ-Ugzb^$NjV~qgv5deKZKa?N9d7giCk5%JC+>{@^0+6)YJ#temc(M)lbS=0~4)Pu? z`9}E(kWTuh><6gKO`mp~Jn=Jq2*%KR^o-Jjzq(*;^+2GQPB7K)vNetGAf_mp(xtYV zr~(78fKq9nn$TN;lsnFwQJ;v?Pw$<@Klj=8|^Af$}uiJiP_By-NvemMvFZh zG}&`a97qF)OoH>q4yfOpq;!#`NQfEre%*v@#YzXsJqRnE(n@E2otX1vOp&-0!O!pN zW^Urb7Dt02oWwd4x0)JDahI?>o9vyQV773e%ZLOUdW!L6i3iWm3ghxLJdniY_vU*7 zJSniEhLn2kU71(X#h*N>Ou@|zHLzBF7T))?Gqo0%yMp~=by7!;1U>vCAYMTu z{g;?ztYbm6FwtaLmNRixG+EG}H+7awz*2l~N#VOP0~gzm!9y%CYi_Z;QRTEzSEvt_ z$Kw82E!W^-G>?^S8Hu8D7?l?G47ljioa|z$cDWa~=(AJZ3#Q3i+G|d1KJ*_$eYdmv z04}V^=)JzO7TTVr64wYERD6u$ECi!#&WqCy_u$?1`l!BkW-3*rfaHpKYh@mpN(C#|K;f|(h5B` zWZ^1A2_E0d`ZAN&e4PIe{Fk zD?uD^!#NXEZUJlJ&xEjdRB1(kqTH#4kf58p`-(k!u-u@0eYG}n(xyt+71pZg)CGl< z!%zWL%-37wTN6~M%^OU!g=d7tdD?o1_ydxrZWj$_{;k0$N105Bg|7xDK&a2lM3F!W zcfL5GQXe052`OCTo!6igLxn+JPnOl`1p-_zyvQ-P1iHi#-lK(+wbr0v0%9r`m(xy0 zbY7iyYFCS&FH5}W5BKl`9jg$MlIQZIimsjl2v%Bnz_1b)^sR_UiWk%At#sS`uNdP+ z7oNQ6a^>Bl!WgE~;NWpa02pABX+b$)7J;8YQJFf=Xr9Rm$xu_hfgtSI;RGp4Iy&90 z4IEcw3ulf4bu*)l&w1YnEj7yzcQMmJJ-=bZIw-&bI(_}14`aUZlpWFJ^P$`0{9 zat3Ic+`>t!=R8%%0^QHISp_}S zm!DC}A7UuIGx*f~$D(o$bfS+LbSV3Y2{M$KaYnb^7t;~t{r#M76St2C#Cy3FV}l!l zLvH7#%I?Z_fVYiKJfC;LOkSN}q0UX-_jXV2_O~C;!4T~gN0i@wjlM^`k5u_VWi6cO zQKfI;zPW}R@ht7$X71iRu6-xH1x)!x0}4>Qr7RDY3!dzRLltB=zuPRUQ(Y77YR7uo zi!Cfo^X;I}SngbVQqBsos1))yW|fy$+_90B^RQ0C08$EnUye+nATjE}N4bebpZBlR zq{8od=KY+DDF}EwyQ?(wFvY;o{8_xb8BOW_tnMQ(8%t{*I?PntP{?L1a0X%eK2 znYO|jxbTZ6%C>_$2}-C4=3$xa2t?2A**QUnH+QQlito`%q`7R2l>>JSfKWwq=sV9o zdG9^14X_+WGh9X{#i=}G(kmGdr9>!UZd(Si)qy}=zwx)Pn<>qJ(d1%w*1$6(oiID} zn;h)iRYqz0ka?GJw(=(?KaF@@Jeq1qaNf1<|oCW7s znJysHll^cdGh|ek@OUGv%;R+iMdBPKyF?#Kuc@0gXv5OO$ekQ)R&8ULxHsq*VMu>4 zKMOws-X46=ZSWVX?E)_+zjfJPKg%Y0YL<>>7?+o<%={G6*4}~sV zECU&_w#UZp5C^_$*L4CDY1>M!ZzS~cLyS!W^ONx}tutT>);iZ?iUeTNAqi3w`fq;Y za{gH2A|G{$+EC{}kX0PyyfZFN{L;MU1k6oQBpL^v04Hv;qpv!kO_~qc)xWpnW%`E7EWM0xCnIcgZcya zKxwF9pCNlkX*eOKH!VH?b zEUic|K~KJkv&PGjTBUH15W1~Me51}1nCZ=}92*YPWH(&m zyfp-p{n7HG`@s1jf_?lgPo87jvI<-t{=N>#&e3^5ecY}5*;mE7QX6pDjN7>FxZpdl zpff^jC>UG_1nP)DnD^TyZVx>cg>p*fx&8EyttZeK;gFi6-Yf+2E+~Mlu!74A8licV zds#lirZJbJOI3QCy6PRu1O&My35T29{1vF_v)KGW1IF65=att#Z^tZGtAcSDl5U=g zF#0!niHuEnm)e0H800~RhwToF$~ZFM-guR)>j^9q6=K2rh0!u*lFchAd!9wj4}^-U z_|R!f>%d8uFZ;eoI2nM-&N|IC$|y`QOOoJ;U*!G6)eAq$30UDqL-EzSez8=2!n^NGtFo7XA#hWPd& z`Wrrd;q|@c8&UIoxvDE%4jivIf?v8?1=a-jVMt0U78r9sQYN57V^ELn4`xiiDMTsR zGHDy0@1YLcF@|$|vojkfCt7&SL~fmGCWZKX&UqrJC{5*<>Wl^zR!0!W8xqgUFz0C1 zR9Gq(wdq+!N-48ZQH4|ehptJ|>kq;)qUi2JEKObktGZ{kvdC;=mrv=I<{I;m1q$CN=Wle8z!LBrF z$2p5g7m>)(+KGad)i9i#;M4vi7xoma?xkp{B`H=|>6swtH4b@w;w*T(lEPK(WG9PC z7mG^DY9>p; znpJVIKg8Ek>FgGA1-Tg`#aB*Ts~ z>~U-*8Hjv$9*ehAI;9{>ey|m5n7YCdR2+ja85Y>yRJ7u?w%Rq+V1=pTw+&aNb?mvl zMbT+T86v>q`A9F`!C@um*mA|x<34)jU-ejnCNYmZCk<>k^|$2A^2_m`+nx`~sz~J) z`7CH$kY#R(eI4b&PL|+jMHD@`@D_S8yYR{PjD-qCqm!wdP&KOI7RSV(lSLA zd0+L016I`2JNE4SCqXNC|9BzJHYbfXr_$i4lQTek$*%T6>7^W+yK+H5aoxv+#(=og zR)4QP354j-7(-sV#j(=EDRP8)HkCe!Qe15DX#|!XLO*)muC2vd75vNeybIgfCRLaI zQ_Zy0?nR5ZmKFCakBw7|bat4@k6*-!E)XcXTU{n+M117NFh1 zZ7+Z*+;&$jf0z7{Pb7}=JQ-(n1TY*K3VwrxG5>-W8mi*n4^l#LJ1nFlp}r4U16{_p zaoJ8AdW9OB`utG`gUmX8QVp4YuuLkK(&+dFI7_2Xgs(E zquhZtTI$Lji9R>Mx^}|V_mbG_B2!=f%0qxx3F!8vH~r=QyLrfUGgoJ047F^w!t`DU zsT0`YcXZ+eB;oyiOe>Pz5Ue>^L|@ylx3qp>F6r{@H16aO8;2yFutr&I3lc zbNKm;!b50lI1NR07>tH<@Px|}$) ztS+NZXO>X z)2>KOgFzsSiCGFyLl;=01sXBoJJfe zfqcuQ(*m?@CbDj`Ueaai*gV;6Utop#h?{yPDKyy(FR#Ykb>wo{s_`*=@T#%f$Sr;I zCs;-4ook`LiqmA-M-iL}2f!uv%^jSmW%%Ur|IJJk&Yz#)nhQ}B!f=Gk`7vH;eZehBJt%l5&t2}C^cH$Lk|}`cCeyp)xfmP+K^>)opUcp(cxn4YrTxdo-zC8KSYgO zS3Vq4f&M1Ln~b(ci3;d)@YD0{AEwnTV=`$PmM&_gHgj5XKkHl9S1he0Mb;}9R8(dY zJZ+jaXw@`3I8w{TF&bbY_y54A1v)i2M+1)DaDABe3US?_2vcEAvPgML%So6wl%Tu^ z%;N|^>pi+;{QfpA&0P^&EKA(c^ZtGTRk}ueO=R(t6Oz(Ty;9gwip;PtIX^b)zVUt4+{@aMrYidy$|J!--%dcTEi! zn1uXRta!nR%g^X0*u#bOL2!~)lu_+_>m&jD#s(0rO%)J>7U=EIAr<@r&~x=T=S+jW zSzG@e_sa_Xmcao_Zea5>ZTSDFItLg{nlIe%?AW$#+qP}n=FZGJwr$(CZQHgzvpX|) z@3*-(`FA?$lT+2HbgI*-K6ReoVZ$|T;vx=X_xOgmS1;9_1Vh9#LbFEc7SW^?&i@7@ z*W~L<_4f{g4}hDmA~k7A`VId-n@p`J1VASLspV6D5d(eym#9a>>Pqwm|Ko=x&5s}a zsrxKIq^WfzK!gD8<>apz8tsNZS8FkcYwPI291Y09K?n(HEHTFD{>I#T4GV1zf2zjj z(atHMtto&Bixnmo(4brbnSxVNSk#d6l8P5W&A5uQ8M3RVWXwyl(_7|z@;5ned97O$ z!KQE70cSU_Temc?S-)~VAMkU0;rgsTl7I!f>;`+e4Eh0=#~35MlJ~dATc0^mpP??_ z$`RiQ2fvm6^o4x82{5jF%X1#Q>05r*;eg)}TYk3TAa)T}vlqXGqwv#?&fYm=`|b+> z>$&fxz9pmdy4`Kr7rj*j+wZ$Oo!l0`1-g8X(f*u8lAI(Gg~XRtD-kL__K2J?nIa3$ z_RN293K|0ta#P`i#SukP7neEBu~eA#l!--XX|n6CEOR>ep%AhPlU)Qa$yl;VR4QsU z7O`r(O~vCn4u#3Cd|5VqG7HnMA5T zBG~{k*soSgu{*ru<9^W;)wqRrZScLiEtiTKRf@ACn7xt?Xb}{74S)mR_cS&VCcorAivZBbl=W-|D!ICL6 z#7A}o7n;xG)<(!#YHIY`dIJ$>A=ML7R~*A$N^=t>%JBEO+$75}BnaS1;ffc?w$Ui* z;3j6w4dXh2jTI5n{>iA;LT9xhOJNNg1iT?8B)QmdT~+lm7FKl)6|{UKVxbWY>#+_1 zTg&Sp;tM&51}(CO(`xnsVvB%9pMgAVc~`C8#5Qtrm7VMu=>qS*ApmxNwXPRfqnCoO z3?1_O6*7v!nV*{4tvhe32NSPL#5G`cvY#Ckn)xvH>Se6ehpxgM<;xCDnR{N=PSLDI zuBTI$T~GwY3L98=)HT<@DZ*@kn34k^_g#4i>&fq26QZ9lD1@0TTIrp|HnlrB$u@GT zSB<_!Hin46E!hrcUe#svU?ba!J8rcqtPhiq9tCH%Hy8z_;zEu;D{Rnz{CKf{7Mr$K zw8UfE7t?t^MM-H!sAOh8<#^hAU!Z`KRy{z~F!i^dlD?n&K9nZ(n}oR~i;)7j6GGAw zh?v*}Mt7_i53AY|OcH8kK5ep0=W_Sg#BH1N+EZX?|9%j?e<_H`qj)WWFME}DdT1f? z=-KjP=Z&0(OuVLqi#0o2L_K1blz&C%s_T@fDh{wUMbqDUHGjQSder30f4yeT!AyC^ zzNYt3l1Jp2@daACpg9Kdv|a?*0VyJfoyyi{KSJj{DbVEAFVkB{^>!@{&P&KR>tiZ$ zKc$olcUrv+$;&sV6?V*GN0Sd>&&+DCC(ac>R&Q$%%(oua$wy!0Y>4r~aF%$9lK~Ii zPyj0su#o0084YxGdCGG@i6zPAJ`L?jsro@^5_Bn0YYT0i?d;Dm^1+vY}N~LdEIS})YHj?~|2kE?<@x$2J z8h5Kj07LD9cdx6Z&4Qrh2or{?*$-%uyrg-iY*W)(m2~VzVc$b2RZ1+ThO!${4F0&s z17&v<1b%}CWq0mJu~!8+M52s3WCk3zO^XFW*_PsFIio03ux*sj(QQ=E;dN;Bm)^Gp zjNYZPd8G>dN+-rDaHl>>USa6Ti;ERQ;Rz5&RWdbFf#SbbrVucOx<<|jz6Tn9~OsvE+apJcMaY?743Y9ac48=!3EEz@35m<`K6N@fVfsa;| ztLT8wCt*Q9AbJRMJrI3iG@vR9qZ~vXiGIQvPIuuPrjY&HknJsR)zL-ieFadU-z&+_&H}b5V)ztMBC6C;T+NHESHNLPZmz;pUfnH*jXd_XDwa!nhFZ^YV>0O%@x7m56H^Yx z%C#Q9%)kr4r^bH10r69_|BGC(%&FZfUv zJw92u+_HIc$YspHWy*eB-#F|>>xcX5W+ZG#5R;sMKPksw#qCZr3{8}_3XHwNa%Y}U z*yfRO^lBaZGCFtJ$gsZh@M!UeGV12BB{sRjlvOr1-ZZ$38Q$~fScT&lZfKaoAzRez z!FAN}Z%hSDa7e6o<=YpAvJJ4YT}0+GCfGEs9$Ad9Vn093Eqm)7{2HG<=3L+x{~%jR z&z_Y5e1ne?^9V1}(`$%lD2p!GKBu034$_e9v~wmvIDhO-ZE?{UUwv$4PLI4uFd!zF ze+M{MGd}U=2R|Kat0vI{aq7Rmz0i)4rXxm!wPUjXkPRwb3gmr^1m~V)i1c(OK~m|a zIapUFv7So2V~?+?o}KOZNdLodDls{eK0ckzCmme(OUZJ# zgCE>ZZiL;u!ZW3zC_lSDOr39>1$AJ0qhXv#-Xnn&&rzx+F!hrb2m@e17=j3*5UwRz zCBQM&%~TWXpiAwkwzJj@I#NT;;O66Bj|~;&$d%wuOK`yj>ck5?S))vW8Opj%jTwUt@V#c2Z%6(+tp&#TU<(#vFyAyvSWZ?9QEhE<1P#tve7;3&A%=+wnuTABfJq z+mfI6&&@~YABFq#^Vhv}*&FJ}owdjv_SP^rDlk8vUuQenR^YGnhP#%4Urgq_{^_~$ z+3F>+pM1u(%UhY0ya`7mMU4^Gn&tp7*eP9OINAo2xd!w+(_}!>c%JB}A{2IP_d?cC z)pN1VjGq39m8BgGZ!l*~igMZ|SNK8-$q6YVe>mut))+DKNP-5-;>0jqYL6Qu{D!F| zl3WdrB+dSEwCRb1C=&Yp6r5d3srq`fDwCCLYzlVa->8n|MO;dvMS?1f(O*ds1I)r? zf&*hr$}w|w=^P+S?O1Qh1dUozOjV%_%T*;%ECY^wIX~RY0Cw3Jm(>7yS_pr71Yx?L zVtUXpBlgmQ(5_UpEfMX|&glS1Dl_c8}O2 zE?(l2kY_4{wmP=qURx6t5FERINaGEvKS2Igki4JB!w(qDSa9z^al`8`EP2`8yB4}Q zgKTO`(8w8zK#g_QUtEoJ^KbvNInm4e2f8k*LZnu*Em4DVz-=sUscJeBHea6NjIqt+ z07MP5n^UZI>P!{0dwBtwG4;&It-oKq)-b+iSgQjjunCU49F?ylYq%W}ybKo0wm;e> zn63d7>bPrh*;;ntRX!TP%AsAr(rODkYsFLh~Ryk~G?=6B!pOw}+H6nn6Oh zd_12^91Hp}4b;LDB0cP#A#Zdosgp9qWj2+Lrx!L#Xs;c1_)iMN2E4d7iDLjhRo&ZmgL9j9Yzh^G?6|;9Rz|(bCxrLua;R z7jrl@l%-1)y%Yp3O21V^K{A{H^D16MV+edhNUT9r&8ns=rh;vDN9Ioif6>aQwN|)_e z%kurvDN^uaV!eHomJ-cQh-2@uYMLkGvXV^&;nu>On?9ZnWV#OM)H&WYf!7NgU8Af_ zqe@oOvg-2AZL6JYuaZBSJmVU{g5XkCzM%jxY(8~9&P0;j#;LZ}`KAM=)q^Svl5c$w zFNESJg%HK$VuIxJc@>y5kRF2tr%XpN9+S^R&i?)Rs6B-YC?#@6J1K71qVz#ix;S#o zu~Rajgr!_CO)%L9!3C16@Cq(=lWZzKD(*ko{fof}DASRLQ>XVrgo?|@Ki~O)-}^}f zqF%LQ%Jhb$K}A$ksVmrLDJ$rm-zHI)uN+-YiT=c}_0GPnvGMJPsq|HUqM22|4$J#W}fU_NOQW`Asaxs+yPJ6-?ar)lR4 z6f~|&0amzn^EGqI#;Q7`(CrMw&(^sNw3K^xFsd(HI@n`S_t!)Nm8MO$XjU=IG{q95 zUB*;g%uVpar+;(~;1FJm?j6}>Xto!?A>aS2Kz@%sNvlWB z9NZv{Ik$g;uoH3<8@pqN(GU zH_;48PKjiSa!H0C}@yP$ngCqQ1+Y7q%%NJc8o5fAKgeJwUsF#~&V+E>dc zA_q`0eUjhdCVpX|MS+|^CHf-ymzSxVDA1$SRcvxVzK8O_#|>%Nu`McbG=m!mnWrmA z;^lvy3R?*6f2SR*NZrZ*&Eg&DJ$rUX4B?THLR>gDIt8)Cn3s*_=yQ#_UFpT}A*QL>5$xT78M1_5-G;zVkb^j-77b#Y6fW6(AoeCm78cn|mLf?ANlS}_ z5Tw9gGr#P2qRbG}+Wsal37>91Z#jQA?l9K+K24(oO_kQ75eK|xy#eUSebr&0ef5I~ zz7#;HzdF;#@r!@=H0>m=d_%kojO7Mp(F}yXjfE=@Q;?!C5}pX6S!xEa1+7IQl7u#8 z*-eq4-xd*_qd_||J1a$$1&v5ls*Gu%MU0HI#l|ra9tJzNCz6e|4y>?%#ub~7>l9b< zYip?vlxb-pM_MAu(g8{+SyW@v$xJ%pFdJ-3Xwv@%TH>$>o0;}e)%Xw{W3H;57dTr? zYm>et#4dufsHIPt1X$$9ya}OA7ClA1+aFEc^5dXIW<(dP;#Q0-bt$Szg|Lb{Ra$7B zm62&v>&?i0Z-k~~smq3gvmb0-_o?1%T=uchU)t(cgMH|(QUTGGTSujlTP}>vkeakb zx@0RHmeqHiA~RKmo*jc@=_sjP=#z8~VM~`q}#YX%NAe+`!#d$~0(e%V-hgXpN#S zAs)`Y8F99R#Pp@Wj#OUc;-K{a53NA3>aE0EBSR43Z;cdfaN+d=S zW6Y9PQDdLy%_R|c8ia_UOW^bIj~9yq9|jyVJUiK=6~8*tEY&lP0Nxo|v{n|hFp$De zY9YoPV>1xJvFcbiDCQnL243!+G)WMna1=Z2M|k&Re1O?Y476~(LP5Mib-Av59jkaC zk(4$?K@0qgdu6>VP!C`KBHA@%&?>kQ;W>6-%g_qKp`)HQ5ticbf_|@N{v?UA`j5Es z9uJ=~0D(?!rFu_Wqr7Yr_(%HuTgFCOe3OpPLFy!*=Z;02`BL@9RgJ7=#tH>RDa|g6j8Y~91^h(wfbEP>o zMOjIT0UNM_eZQKo4jyt7nzC2(m!ld-#co4!I#wi>3_DgI&VecUARz7=fe};4Mt(vn z8)iXU;mvf_B38z^$*+Y8hT$mIk!Pv3gI_f|xB!efn-pa@L$Mb3#xR=@njr{w{6cK; z3z>lo9pHE7Ahhfa;rP6cM9|kqN8%;&eutvTYb=R&-OV${YnLgZ09{Rc3N-mQPMDyd z`*U`K*j??Z)3r+NqiG5&H^0AjKN7+&=Zy13SZOaTDBLWJBiozyOiqd>vs^e=DT18T zgaES!8Z?61^C;)g(ltc$n{;2B*G1G2heQ{0%yn2Tt#KB*H$SQEm*yTRWfYBnrn_(AYxTU7Ua%Z_`K8f zSU$sL<32Vo;Xh-0TO0!DurVQ`c$Y!@7XUXJRlD`H2&Y5GhTASC=I+|lWSSgwD6{DY zCR6R6QSH>IlSZprZnfrfr_*bFQA@dsj9}q7%0tm@G&X#C6b&% z8|kS%DiYbaEuoD!kj=nJr+%kFQKG7eFBuY7(s!>N?B6hB4?6$-JIv_&z9($H%pN)( z;l;-f%j`G|$56jK*C+vV-k(U-;|I8kq*|zKVd6$TmsJxoZbxhdpN=J?=tN#}$V4MO ztYJTf67NWFLm7opF9qsC?UdvNWG`&c9#QF3?_m-Ca%fIe3HBdgmj%+aYdXq$6TU( z6vP3$ga#Z&f&2QgXS$&qoNkwwzck4hnWLrjEookse-Sr|Uk z4`l1ia2R#ZYMTxXeBYKbYLltOwc=n_j#+%gN&UO0a@m7tj=b6ad7~u8_3NZ1W%}!7 zrA1nMBU77;&Am!<70@)(Te3}4Db9C-&8N%Aqn^q>BM)6o_aI$>%DslScQKEO6NOpJ z{L8?Api6q9Vnxdre1nr$jH5hOwzIc_w+sRuoz59Lsx{_kBC!Dvgw1E5A>81jwHEZs zMsRyun;H91rh1zieb+8#1pDm;;$U3BM(%S`(*s7YNzue~BH+x^Uiw=gpx$|@sm01t z)9PqtPL8#0U?{cTTqCkcA8|vdTdB|Vl6mli{+JA3XDPLUjd>z!>J$w<^ua+3FFIuT zM=q1vubxV?_BKZMGHUlQX*uh^+jokc0)}Z3M|CR>EPd9vwqGwPC2*hJNBHlD6YcL& zu21N($?Xs$o&c*j*^^%sml&aZ6N^%9Yv>~yl!-1v0MEfy9Wtwo$FjYs|Np)hi`nqVo0)t9q#Lz ztuaJ}DF81IQQBcdMMsv=x3Ds${lhNY&YS*@G@huFoRP)P^)9Cml&AGB><>_){IK8- zalJvAcbq2#30Z@@>5aUBjPmK;xEpITd{rAA1*ZxdqJtQj(^n%f zW}=>H>qQca>5Al6U0`k9HxwhRYu)08@&m@dKmgr53T7_&0hKdcK@A->g&6vVmv{pn zImx{boj1mB7a@%P+^Dc{_Qk}k$ebaKG#Emp?lX1{Ox0EnsvFeV$#iDg=_1b|oZ^i2 z3wnl!zK%$V329yZmzm1yhS(!0f;$zu6^O+|1d#x6VgNeXq1{v;;nE==&B&+5h<%ir zFTl-aK)nu>h7C)C$Q2?KQw03-h;PT*9J2|)!xN4v$D_cCuYcg%KCPmg5s~vI zSd>Y&%!G^`yM1J=GijrZVQ7z}3|}~r3K-cz^F~PY4){Wp8N&b|(Ah3sCJKIW|H4@G z#>ypKKEdjA4PRBC9#rL-oGNYoePN=A#2jOMf(Oas`iJHkCW9 z;+wg2;7KzC-G;CmfWJGU)fF^($5hiteKrUg^p5I)+Uo#!zzXYJ>&uC}oXG+b4tS+a z5GN8w91&U3%u@6jV$kq8Qp7`)(XCtYk~4xz)qn6{z5-Aa(_^Jq?K-Uxda!`Ib@Dcb zDkh3lud>6~Z}{bpD zRWQzKlgFr+UMgoPWk^o##<|JH_KdU?(^acSo9mXCdAjr)Mjg(2hO*Yr@DIh?&M=_i z^<&)gv~Fe(fo6=t8Y^nOUQ-xrG841D4|-a)T?(yy=Xm~DSU0dU`7*$#De z!grl4JY!!!bGrB8uiybg${xA2C%`Rn@bA%|@nEjRmo|i>Q?-rq5lnJvdASTe*Fopj z9fec>(XEHV|gZs3yRhq+&J&wDBX-QkpbsJ$Z|a6z;z7uOEcV%waD_Ek*uOA znvWbsqI!=Zx}OS{lCj^IbpU~SGbB1jf|l{n~`%x3Q%aL@o z*_(WDg1K@&2(K6t#iZjn>iL0j6bW7iIQw*HD4I#oD$}EtX$f(1dW?!0hmzoL@^{mz zxT0|Mi4vmPTg)bs`3ye&FL}JVV2AmHs4-2G99@#$Z^lMMfE!s?F1v^QQSFgjY^ttl z@mfZ#bS;UR?O2Zq^;Hwnp+&OW9Ewk>XWS@V)?Xw!` zern+RFU6U1>-QyTh7c~M8g;82t%~)Ct;^b}j)wWN6BM@3$mg}KlxbID?qBHCw#s6H zC27g~jx&X7fN1sZerf97h6>J$nKc`Bw#(xuee>k7-H}}k2YP0^Y7BI=+L;sVnYIce zJypgUu7pSFtP|InN=*~RaP3I+s-b1K4^EYLpJhtbi*Rcs0J=*aZ`DM%f(5?R8CO&(wt^(P z5fknhf@K6@Lbh@Ok3tx<&@cjJvei?&U?HA^zg$63BjjuEAgKHVgi99g4wWyP39uuz zw39a21ROF%=t~h|aqq-q{?7m%V~B_Ct^kVl z0B_z}0730BdJ&;^oP8aEI5b4VD#Fq2LjSg zHM@roJ-q~TPFBk}a zjP(Si8bIH5^#pzUl3Vd^c1!`N^gI-C)Q8AVjFn5>R`bAX47Lm0;l<>eBoDS?ZrGg3DznmgXU~qtCFkHBNnuAgaI(4I zFvH+Dyk8*n+@C}ragkB6bCRWX!SUy<2yV`1{08-AB1wT{I^gfF_rg8)kiXyf55=e6 z0s2i4qHn8Lf8LD$h=c~woq|4q`6v;*M+r1&63o~14oAFnq$=vK8dNrQd-QC3^%QO? z+5ysbXIh*_yTD5Q)XtZnT2--Y+~?wz?ICrXS-Lo;@r3&#RCL+J1FJWo-m{Hkz%o}9 z+ZrjCDfeUgN?ftpoINWR$FixFvWqoi0WLM3S1Cktqr+u&6lD!b2L7fn8E>5n2Zm1* z7~S_#dYpyqK<-*pcX7uwJci{glP#c8o6c|S;YS_|Lr;>vFDd}xPOw@zO+^`rrI#XTK)rjMsHpso%CB_NB0vl zV$?_ay0Bu<(dL5TDg~p8TK&UcfR<8mLk%Manm?1^kKb7QSgv2En4-0td$~i&g^qve z472JZOtpDC81LO$-JF*87NoV_|vf_cS~v z7*Jn=&zNY~xOz^XcoYGSJTX*=&RKl6aoXq{O@ya`eQ;JMAeM0}8vP;BLYeZsk{;vzeX!hfqdF<5 zx`~sQI$_2a#3Bh*A3Fo~#e}KmaXf4hz4w-Ag=_ZR+cppUSzZ8h=?kX`8?*SZoz<1f z?gT30AfYF+D5$F8S$A1qmBj?PKeX?QsLe@QCsQSo00f>+;Y;i?(MwMf%@ZJ) zz>8oF`otaDLDXXiHw3}#OG9+;J4U#_D2(yp;O=l(X_QriaM1^Cw*t=_1VW>+Jw=%W zog%Odi4RQG2e5B)ee7u4#oimOHMFWaP<#5Z8r977|v*$o@h`TzG#GnpJ}@%*dU z_5O>^QTqQWSm=p2BjBk~(m==nrT-+nyor1ZBNo;^+SFlmOTpnC2@%-E3KXc7F8g*F zFvM% z+Rm<&Ni`t(w+E`Ll%*3bNfLz@&76EyP?()`(n6x^KGqJcwd3 zS6gp0vvkY!9=2^h>HP;ejRwDn&48*m#=C+)Qvt8THu@W|Y1D*uqz5?cLX*5Q$(rtQzOyCF1BSuaU-=DwU5_K@*N*Q?nCch#D zR<*Z#ef`1qY0+OOeeFuevqL~yoiz-o5={p|V}$#S{NF_V6=(k|iX^k<_|rEPRsqNm zaB07&hVs3Ag4@*sGWK_B@o=RF2M-n5EY7TipmuP`rG$#D7KqrpgS0tU6Ax7md$F$B z=1OF}cko%SbykyDg6JtUq-Jh$Uq%~tN{4$D?dIo534{kG`* zORSo+alTZbKr^ZF&xlJHFz-Hv)}QhZIjx0{JrF-{E`|79Lv`HR`R7Ex&DHr`8pm~O zsRK?==ARcpzAHmHHm_L0t zcsqVqaVGhnIV<0U`>(mR6BeU$_}`I``i?*R$?2I4wB1E?%Hy`Dcin`xffC_UlD6+7 zf5iz93Yk855FaZ%xK_Y(PKn#XdueUob%S68f*4%MWpatUC2Qw#CE%RAOz1d-M&&%Izpbm z|Hi_eG+ZAq0lt%uICy^WP!unf+G!WWqNb9QjaXfQ^D?PSw}=Hg-O`o6dyFmAe6aO< zs+O7nYo=VZA@;ZA(ILZ7TwV5O+}RA;1_HpMbTX#7&IuU=1SZk027vV_+4RX5cjI<>v0d$QAt<;Iu6A|!bp6JmAiqUiO6gD4_Bm&LPU82Zq_%A3K# z%L)|(ws4(|TCLf51G|ar3aYxhn8)Gcr|=@E*&tnBQ3j5dPIHT#W!O1h1cv@^I&R zMA#l{vVYR{JQ3!KlzNXkA5SBZS^`%;w`g48SghOO^g^msY~4!?_&gZfrP=;jX`(p- zxds1uaxUjdAH1wY9!wuXoxiNAL!4oxND*>5M?A-+0YRzw0ekK^H3D%Wa`X$uIm4+3 zaru^fL1DJL7h!k8)adtE&rmq91>v`(H+~}_f9hK%h)Z>Iiv-6i*N4)67p~s za_M>j39O=Kg$Pk4nv?>?2vVi2gT3Oesf{(Wv1JnDN!+a|TBurwIV(L%4sFwARVMEW zgeFOMS3E82A`R+cuK63wpMP`Su7wr|s~3yc2mr%k!Lte;iGgg)EG{KW=92fI+_|*R zoN!#B?2&K!DEZq;E>ipP^;$p+$+KAQo98RuH~V_r+h(QM#plVfKJVUizaQ3TfhYqC zQsTTh-h@a%Wj;D9;`}iFXVP zx&bFIB8tq(RhQd%_g+NR{&xB@&>l^9PVP&vu~+i}zO+~`R){5sn>>QOm9w?euEEU$ zsc0($HIGJGGS1ZuWi73q#Ph*2$Ct+bWvjK#U@ZpOa=9%m2oPf14Jd0e*3copbbPd$ zn6F;Ii0IrO3aw=sI>=5Q{YTTvPT;F0Gy&UQdQ;n=JCX>9v1oHT@p|qO&e_Tz<32vmp0@MS%@EcM6(>+rcue|Lm{Zy&l9-gaYsl z9#5^{c(bOMRp1RzKnL4^d;gB6XdWTf>fL%TzG*8!}cy|#K_?beWdoaeBvp9h4<@q$tMbP(oRCTcV` z*Gn_2tIba4%ZM-KkO61&1=d@>eK_zVJ~y;>sqnsMR-xbEUPGA1`E(vS)N4%F72_Je zvbk}dy}Y#==kUKB!c_86BxIPy!U4Eu*9+uT zTq!GcBEs7Yp4>#k?Umbvi~bdhz}RtpCK}cfLBdN>HTY5B%m&l*qCt$?I|AxPILg=B zEc$bY(RSt&^DTr@rEQ{*Y_Vue?upw`3wg%$zSSH=C|?N!`XlMlX|<&opkoAaxO*f+ zQVrooU2>E~I-p$3ZN^}mH(Qn~I1z6<=B2aJA5#i@H%wCt zrXKxA8HTaw`v(x#UwdfP)3}0hbz*tOB|^qD$&tpD+zU8yYymjA<#+0JNI2xrQ z+3~YmjELK(3GoYBg_A5LuE3Oe7(L+*2Ym4Mk20W+*r`U;_A5TnyGGL2pl}~ z(K{BkRjK7IqN8*~Y!T?q;KqirD+j2hnQ?;b(nU(=ZWp8BtQmLy0?at;8*$jtC3*N6 zuEf-!+C2)z(q~G^bfwbqR`8iI(C4C5x`MkV85}ZwD(6xkXaJ_YeJ1PV9^u{LWJ472 zGAZ>%Rt51F9j)Tq`B&8rwTR22HPYc{iZ^SQL@9PDN9ygW1zQ(qu+)BPf2rM)N|l{) zef4*v3-x!T`TGfDQ=R#>Vkm&{@#LFRa&6vj#S_D|;(O*#8}?7-;@0z6s?V4mg>&<# zIH}slWGX;pFQEEC)lZmyo?i6}4xoNq`HqG2O@)g9**hBd4EEtavHIXjb$dXK+M{=j zjX}(Rgss{W4k&t<_KuX|ACNlRsd%vU?wt5k+9D)zFUZqAqYb`QdLMmCaS`xh{{~49 znRvbHmKoMuKu*3zHld#zrMg99_!YD%Ur*3Yv)w&l3J{2BL;3yYn~c8)uDUbJALuRg z5a)tl@~!gjSJp|>9+4hHiWXQ{Og=Mdq^F-MG93`3S8c_hSfTWe_|=Zm`{RnrzG&h) zQK73_YBK~DF}?Vq&?R^6kTDs*R9*Fh70NdtSLL13SF4zRQ6I%u?AZK0Z(ufmc2@d6 zKni~@6advrp|7Weaq@=RTlGL4wO)IFN#!H*EwK0b$}3j9yNIvig>04QUbF@~>Zhfz za!&37ue`_zq1=Xr8%#ZGrsYcm=VJ4yIOM%WE{6IP>Ot(}x2HyY%_P<>sD8PD(poOJ zz&5_#MuuS<8~lXaOdUL>>OAB^gGu!)Ox9W=3gDl!nOw=~DJjQX|LK&tEFppL#IzuR zxoUolO?lg3K;w6nH+NPY^2FzC(XV)H+30$bxL|Iy9@Z)TF#X^vz3Se?*34>er@Oe| z=EaOqyW3@VT=KF~;?}Ng-ky9yO4M*f0d%)XM2|Ygq^(FKnCRW^dIAB@G$zL4z9!+z z4geeMp;I2YSUPG|9;qv^PG4U`cpCnbFm-hKql3lKx&)PVP_N~w>(_qSjZr|iMuN0H zL%>!$CFQ|=VaGJk%ErY@^-ftSdg`c^^8RwkK&7&bDs9OG4{XDAOje_x6l4ftw}r<= zyrBRmg3;Ywg13EJX-)cIumACQXVCkX3P3GUF6~1N717wdDn1Xx(kitJG#Q>Bl|2RO zswf4~L*uh!s4~RV38n2SUZWI`IbSjjAyWaMHc&m`5kI&+gCil0q2=(deT^21gFV+G zy4ne>D+q|BKLab}0kV>#uEmrjdDf|&Wye@b%SzAW`_)6;>1_jn%~H{;?-KOv4v_mr zfpL#jL()@Cd?wL-x8XR;>Uhug=ZMn~ykYvrVXk+n3tHW*aUd>r?m&WVhj-d8Nn2KvRr6v3uxXt94UdBYfPb1OfNjIgAKjJe3Pr#qc; zXn^ITzj6rT>BV9WV<4MlQz>rnC!lzcylcGmN6-v&zUx>jM#D-LWz#XSj!3k6X-R*j zh44vq1MZ|d-1g<*mJ+oXi9mwtVghB9@04tn<@BEgE}WN@p=7uIUSRfXHg3gyEogcakbAi>djw~n~5h&y<9DuB@km>1hp z>Um+RIp$z6l`%|fSrns=D$|HV<^;xIGo>+1YH?J(bz_uns;P~7O8q7Ch|`f!0@I7I z56tRcHj0kq(+65(&vKRh;-%8ueo5p59Fd+xy9FZe&6fDpmON+XOQPu_U&Bq|7Eps} z6a_}Tz0$Hz61xDL%fr1SE+FqG%V-{_n;+CXPN>=Z57a_Vyy*m>j5r%P88&j#%;Isg zbZ7Wv_&F1E#o-^aj%ccI3aCAJp|#5378%a;DVx$U9IDvME|}qq_noecw<7I1BZb~c zRZkeQd86eaIeDH>B-ujp^W{%0wt41bva<=Xa0_Z)F?0o|`y}*zO#u1<9D2d>-Xi?P zT8bF%RpBS7wk|1m|3WJY=-nH!X{W@#2=_7l((wYoqfs*Ck#?`poGx3f~Hica_sT>xaLn4 z-Cj%jW!WY-I0f9E6@Xx{a!q><)CDc@QPu3|8G&PW*>VAKnv`1-fH3$=YWQiFC3uIJ zyjz~`13O#d`!DV4ma79fT2uAiRdEZ)bWeI|%7)aHW5!~fdc~0CjjKuOhX{q#6H6`2?A_oylh=Y+_6fMj zWhwvCb#Wp#jvS^Yg8=L=3qwo0EVOB)AaIv`iB%Cw-`BlY0u0tYc3Qbe_JSOfChWr| zlfuTlB|>3GEt8{!@Oohb>q)L zRZ-M!pV!5Sf)zfGL8@$*pJxiy5sT&6m(>p8zF7JfW3#j9U!Nwm)sf2D{G3=g1E$k* z+^>L_%xwj8Sl2rnEm>^O6g})1XH1+qESsA zTg}iPs;L|?^GBD96HFIM?sKb}V(qq=7YAP6embv2`Mg$z-e}gH<93^4Po06s_9*!S zD7(EwPr}(FF$0T}^(~NyV{ayOW0T+;H10hNbK_imfi%}U9gZ>LCugT0@`Rs1#f9;b z?_`EzM*&0op5uAMg{E9gS|$H3A;g;={&;E5gqJ#>X$^u0UY~mkF6{Osqo*oDo>06s zbI4G<<#WoMP`uT1%uu}0U!mnn`GKRjCCDgVH^?1a-w2wiluv&M8*qQ_BC>_4?r==O zE=1?3&Lrk{df`{ghD;FU@3|&TmI|U?vjAeaT~Ilr)5CdnlGX-A|6WWY=o}(wHTRCj zpfe#)Y6~!zcn=cR5HI(PnjN`lY+x218Fvgn3GIBZb>bQH}a=P=9< z=p&YiER5$<9NDDP=Z+r%^}lCkIAF}qe{BLAyUcsslrY^CuU{2|-4vSfrLNS+0%i>O zZBKsS(3MH=S_sHW>?X$bkQ4gE+Sx(JWVqp=?uL4pI=rRMGr_Q|B$#21NIq1QM|TR) zY5NwN-kT7t0K-ftu9%3VZERX@_;P`Z-C-rkmLqpOpt$BElH20D;;*F-e&+HM zGT#-GV-`(6B+>tBp3Pj861_bpAQNR7vZK9exCQylVkHnxx7OGkD$#sQyjXP#I zzWXC+ugpO>WgWN<{7$M@Si?Z7p<);Oed{LGx&>9`e6W-$!X_94+LLzW4LPSPW&Gxp zF{OT1Murh3L*r%>v+6(F7ZB&8@%4%}Sy+(Ip97!cG?o=>aIJgQG*k{>2_Wjrv9_#| zpin^q(GI3~Vxvm94fL_FDFyxbHBG=uPWeF+p3Zh&jP$hw+4=OWEEuS2pR5Hh(dMi` zAN+$@#ITzUL{}`>&x7@4iFHkR)kyxjfYO_n^BpYB7=6kSx%qB-X{J?y{6g=BoPSr4 za7kP7c8?qR)PiyOyriLz2cT*OZA2dB)??YEvk`!E*xE-zl_@b%sxrlc`@#(qj9)N; z3iTROGv9%1PyyY7(oOqbA;u0k`i=efgu^ih>*qqB3p9IfO`lLi_B?YNJ zhpg~>qxYITN`|Vq$YD{4H3J%cxUiN=0#S-I`MXCb_`}l~ar5yj4@41&C3Z&wJ{ciWQR1Z1@~iy7CEp z;b>Kp2aEa_M1WIREGrLH6euW~7KHlLm7Vb%U6kSH)tTf35=0R^(Ft^gR)6s&KkizP z0R*D|7!pAkwu6+B0yyw?K#P861a>{}I(X(D(HNVgSh~IW@lAzr5tS7RTvss@jM9*_ zhH?Qn>{JTT`@2Viny;?>MeOE%L6m(%F5v?|6Xtz^l)=LXegNX0;R?QfOO){!07&3W z2kn&O4eWjewX`l{RcsNus%FikdP!yVsARg(@;aTYjm41U0~ki-5}h8(s7B+BcFV)Z zG((zi@VqE#bm#yu%&Yw4T_`9LRCf^5X<>=alaja?>&~VTkEm%?q4HdP-=H6BNBpxg zTo1Bejvo^eTaU_Z=97d_sRt>p6vn5+=K)Vqy-r8j;9~gx@uY$C>f(bIb9K2e>r-eX zR!pzTA2PN4WTmy|b|(GNN>4_m*-hC!zEYIa0zQo8-~UUGY_0GE;`|T&*?JNLr1zhd zDjp8R{eO|4t-;|y#o+(fN~Mhl68O*M5D!HB6ZSt$xEqsr&fiUi+EmA4Agb1hM4;aP zN~*U;B?Bq^2N7-EO$B=V=UYw((gOXD9$IeN8ny8Ew#%RYYR=_3{6uTD%mq6B*HJMa z==z@}Son9O|Hd>g1_J+QIhF#A{A=YZ2b%rogQ)^~{pSO#0TTP?ldl8n{^x^l0HXfq z<81;8`ezNb0L}etO>G1ES5~IAsRM}MU+ZcYP~|@>xEJWz`1heRO20s0x>w;BgSm@$dt_j>JhdE@2Jj^`06K}HnO*5OfgS+7@l=~MmcRo(i~ zt**QH_dqrPe9z{VUsTk1J^wu~RG;sjZsBi!`ps|nbTm+n&8WkzCKCtbQHU$;Q|NML z03H}fD+8~jjva){+3FR9C5IGN<}$UYs)~zd6k_uKXegJfV+EwKDAh~i>MJOU%1>V; z{T7ccDLs@a7PTxcWmC3PUzuO@O8gXE7my##ys|k4@#2aX;|R}@D>*{ZXNlDcdm=u=VDE-CiSyQy9BwSLo z=OkcLw8zgOwArYY@j zd9Xl;Y1aP^#`wTM#b-$xEkCI(X%P1eXnQ3=%`G^xl=>1IXD)&SkW0)eJ>ZbeUQR%V zJj4=YRb@#Yqf>f@C#057QinWH0Z_jzDQb)R{|^9OK%u|S%Il``FXfG(@}}~Zsl2Vc zLr?D#mG7C#`^pDI;D?laq$~dp!llZ`lzc+Tr$Oa2<#S#6g1~*LEC11zuXN?>AZ%2= z2`b+z-_daY4Z`Kh_tfHtpz@>gldk+6gd3D!OiX^Ir{Ac-@6=!~CMsZ2Wyl7VV|P`5 zQ71q1%-;=FrGiEc0`#O)Vo+jI5~L)J5-SK%HJy@fy4s!c3`~^6sb>!=W}=AIEJ}J( zT{b1XD9K4vd#kx=Y9BR^l6+45PXbQmPhHQbNgaN=8tBQcB54YIhKI8>O?Wk*n%xO2$yngDDwH$v8?5 z(be%mcn@d4IstQaA|;ayb+VyOp~tBxIdxi4EmNnXAk`T`b*5TQ$*dqS1cAwHO6Cx- z3gXyYD$XMX+eO9slq@jRN|ctmP*)dGc`?dVt)ebVC|OF$q4Z)|P+hJbMo%k$g6c|j z6(wX3)FUV%%cUMgPe)Tiwo6@2Ni|LYwT7M|l&qn*wK!eWwW!Z(9VN%mi(`p9^^`PF zlSZm*qNJIUPhO!rh1BcDm|4O>S@HN z(@ELRAXqe0)U&9|+4OWyn)(NS^<0w3dAc&wV4Dfz`Dy9}>V*comGX-WwukbI4YrN) zOAK~D<(C?)(_jx6Y=^-fG}umqJrq=0)IS>R;h@rvx%#Id`wNvHHQ2odLo;$Im0mR1 z%Ovza8|+nrbD6L8$-}xz)=+&!S9ha-Nm3srI{u=ok5T@3Q2ndAheYv&&aNjV8ApayynB**J!Pm* z8|vSJ>ND!!gX**DbGrJxuD+nF|6tIge8HlnD~_tDoHhT@^2!Vtvr8mP5IY>Zu5lgmAyOqp&Y*XknGNB#wWSNf zZ7p>hMz2AZbZ@0b)iIu-l(JgFjWtaTu^|>U)it&;=+%mRL4uG4u{X2A)i_#q{Kb-E z>zWsZi4YurGjm;}zNxyd?f4~aEs?hBwRMfP*w|BvAljN*kR7ddxokt7&|a^2XEn7{ zM{1VD8zJWDkwgspCG|=mfqK-SV5^BGOOJ1k=<17DHPc;%lBj5GjI_+C54W}wFN*zO zQobP4x^_@P--&TCE?FBUSOr~mCf3X9rIFUQ%BC8B>@gy#M|c z&vBBIwqvv2Zo~-M>_}5Xq^$*Ytu$%KTKO)9t>_f%Kvc#w&c-=eSOVuou0|7GY8oFo znYYf!i#(0p0OH*0>8^^yOFx#yyO%SyW;NB@(`e(XvO!iBBC zG}6#qFN|4s+z_-@M;argvUwKH!@6~m7@!$V?KGpThVTZLVKCOvEL;%Y;5^phJlE^d zpt+vtb$T6{z2>HRX@7?M*lSmV(h7HpRE(y7U)zFkW4M;Y;957ti_$XJYiw?yQH!+H zk(JF)uymr5tetqE1)vR81q+dCz8o(ZmDaFEU&9+L+My{X-qm8BO)APNAx4eQSKumo?Tk*lL`A zBojGhdPL$=y&O$mTWfqVqTVx_8rxc$kmmj__F%ouQdf(Ko_=f5N<_NsXSbN>!B+4h z!&S4SIYNtJPgm9S`beW()UsUF^P8HQ?b%r1H)!lNQSD5*IES*FIyWzRCbV?8;i--h z>w#;_HK9&Y(<`CUMNf9Zi#SDTq*IQ6$w+T=8EeEcFsTk5hbhSIqAs;~*fIv{3<0qF z{JO?SWqZSFTpGxLlL9tXhwGPxQH!xGE7i8Ov{(*Knp-KB3a`T`6g(mXt7NT1kGncYV$vSuRRg{)QCo$NEPs?T$WTV%NdQs{L6zb6h5l4Lp5Vx;MYCe0C%!-}Lnpagyx#VTyS1jQ zkdrXpMOK)t0?`PqSG|jTO(~&&5NMWdx{EpIUe?s23Tlx~vW@8$nHRUL<2u)`sH+u* z0O@i8!R=AJsjNd+PUN)YdO0j4dXSG!q?8m+lP00oXyj@m$-qV>>t@%mgb~6C+2rRJ z?hB1!MM=8ot0*)GL+sqmt0HUaBfh?-f{iRD$qjmKq21iU6;R*bhjp> zX6Lk~n%l_}$N`e&V}#JLI}mk6L9#kWUERA28<^T4GMBZG8>xOiqa<#nvTZw&v}w++ z^{;ocAaOtKHhhV1&}LPC;1Ym6J$ptU38&sA5-&4qlVJEUva79TCZe&#yK`5IRthz2 zZ;d3q>rvO5REHF;w0XD8Z?BGE{OWtwwfa@}P6iX(-S@6d`Kl-OO4{7}uByo)0Aa1d zqJ7U=Uod_vtY0W0!=*klnlR8;sIG8AOpu;_1N;S<5QoThYoBL-%h|iGHPx$L*saPp zHiMG#eUV+)>RV3;EJ+d1$tCSc@eYwo`6>ZqLL{hn0>p$@Ic|UnZ%8B+iMz;=$s*}$ z8yORj2TG}rfV$p|rXwoz?M<%O-D*X%gjl$8yooL73^b(n@+sc+@_)r(p6`qQZO^K!FEgn0$Krp3NT`oFU@Z`vn?QY}v6kXg zTAh7pp^__&_R)o&+`yN6s{Tjnm78_-6$az}7nuu`Gg=}IP3t0VB@|mS`wYfi?F6LB z(PS`mzmKnfdi%k%fn+9*ZC7eV6#_N2#%|-<9xPma42qV{u$o&U>*UFh(HL1Dd#sVi zGrIbiuKbMtbSqlEq!BFV*vLLw63ds%2&5-ehz){w&*iteb*Uh_`YMAZxHU@N8|{ar zQ|yt3VTuCtK@a(-;7eV(g~8(g>ru&o*?Ln}U!TZ-IeXW!G`2U-E=msSQuj0`{7ciN zpeXegURY`JdSs|qgv`@g-6hK%OQxd|-_U`08xIV`I#o1;YZD!a7zW}Ew$#?!!RNqQ z8FqGW(&7gqetV0qj#^0T5{VK^ax4PU*W-dD1=)ML-P?G-(qvQM^iFCnxLa}{9qdhj z&$uIhe8}$-PFky*+)-Tye3F$&Y{7cCSXeK)7_X~pS}*I+p)N~x4uM!qPdv%;*^?w5 zWyM@xPd~psiT4bQe8=+G>9|?f>O51xtSsR;hCH;ynuM^h?-31d8q0mo(X-5I88pwdtLHb>)>Y#U%&yd`ZS7Rrn%5wYYA9w~(OMM=*Pu1&7P}A8T2^0w zw~kIgZ4e38ws=1SR}*m~rK@k?`Y1MC!n+*eia{OUihfF|>wscVtQ{@2O^q`|oE{Y> zw7&z2(+$6Mzg4&#t)2z9H*zH&GD*C7K?7ByNshf1mLuF!y;iQ?CJiH>)%vEUX4waq zCYRW4FzpSlDqZlOv?b$MoTiEGEvkxt4;g4{nuisri8L$yPH}UPd39@!kJXAcHq&ww z-^`4J;01ZAMFbqdc&)PiPoSb4_9U zSO-ODzl=>|p9ah7BI_45wb;=ZRxQwVbwSg&PpGJS>m-zf0Gj2^dvW2Mnskp&PIJ2qgAY4TUTEb(=Iw_l+Su~ zxEXiPiHBek#KQKr=JvK3b^`+9*v?j6eG4@cr%+8QOe-2(nC2$6Sb}!hzG2eW>yXU| zqtSDP@QnuNSYn{JZDmv2EY#J1nuPXs4PCOu!3<^I>^O;n8-0`7S2QNDpwFrBPpbhy?v-1LH*HW@4r)Kaf4^zs^aa@O6LQu zrAx6*V{LuHkpguYWbsNq7yZcnS{e`vc>xw5$0u6+OOAd8SnMbEg~d7h0_~jy-=Ao( z)c5#P7Q2pJZ?RX{^*9B8r2}uV&)FBc`o5)pz@nD=q56@Vws#YFv_eQ2={FyTFTro}e1n=JM!`zM3EE=~z7 zwue2zVAy^;`?z?=s`|(3h;c~SbL@Gvp8GtW#@XjU5PV^OXU|%H>KE#l7VpFJEcOnO z{VpZ%QSv?|_p=)<_BOjwSN~(FU$K`g_97);(z~zd-Pe@-hl<~^Ef)Kko_-x}dIqwYv1sMpV?ANX>|2MmN+T6!lw+eab$;Wde5xO)a|mou&R){oYc4 zP=B=4pVXgq^%qP1P5oV0_gWfg%+feN+~S||&n(`Po4D9JOeYU7E<5%Q_PoXC@%fgf z_-cMvt|NMbiC}GkzQCTc_*;CG#TW6#xSKqn`+_Kf*t8LU^l@Fwg(XyRu z=qK4zx)!iBLo+QcsHIu#4fdwR?jwD;my)d{{bF8X@sIgY7XLSKX&4E9VBAJk)YnI9 z!}Vn?we1a&#`vOyi>3R1TmR~CZI?cg^eM~|d>|=#$ z+!`ard=MXhh2~Q3*;`9%B5T6!^=%`X8*44i($aOUo26xFJ#d?0X_;DHjp3g!~HH#bOhigB z7N5yyqkG`uXJczym=0_bPU#byNS0SuM_OB5P5PvN-pC=U+7MkEYH3A?Eqk5)%hHDN zxt5Z{GjuIvX~kNJ5AS{PCRoEQzD3vqdiqjBS-!)US^Qm0v{Js^(ne|rS?o5p1-Dpj zYa{(5u~Xvy&8UN|;+#0H5~v@o{oB@t8~cwOanJ~hZ9~0N29Qd0l7ZSu$;*^HK*hd{8^woM+Gsw6PQ86kK1f2RSo~7{M@t){9c*c1wQ-hq2%)---(vB5DY=Yau505h zZGuKoWlNicTB%J|mRo!m&%{+c9k5Ys97m5|LP;T%IxzfqDy zYIQq}bSyq83MDE*`I5w5Pf3H;Xt8^LNCyX!)H0EHC5xamXib*Zj1oexd`go!dzImpsZ)=ts2Q!VW@?Q}~!Lp#%Ao7mO5b{4+Y&Zgvl97_H` z$+?uAXKCm2WvF}N~MC*DBO=d zjHN767VFw==<}jUKx1~hr5sASTd6E$Fh)WcAt8+L+ZQw^1q#?0UAx17((cr5(zUxR z?QZR!WUkn*OMkyT&s@0?v#*9_xjF9CCM|_2uiY>hvVS+$(26ekkyMJC~>K-cbNFlc|GYHsMBz($OJbxoxe3tgnf_QPNd;2I_nfQXJKF?A!m8D<_dxVjEI5dpeG(PRDgQA=Z-`pTHh3|aqN?yy10a%d`Ws> zs&|7H)HTkks~0xLbUkO|T&hFU-cpHw^szu)^MY_QeJHnYNE2;QxS$P9ef;a{Ms#+8 zXt*|xX#ClTA=))=u?{iZ;sCnD&FLm?K2ek}CW6u~XRP0U8TZhx)meNYW2?UDdQLB^ zZ(bX=r#hV$>|<`n!AMG7pi1^NqvCyI(`hEIPHQQUAP=vd*fW*l_np(k1r6HHR@=9q z1&EO3s-1(}Y6(|6fM>NdHP|z_M|{b*`?bbDJFaYMq)#-( zW!L0@u3wOUwJ7ijE8%SF2YnN}b?>(Vfe+;Z{1dLRgI= zQ)&sT?4k-^j-z`arf2}sDkE8?yjHf7j>hQxVd0v86!=$&OOA9mg~6izPY1;Rt z>RJzNjnq&@OhvoJ&pGYuMY9h4_Lx6kh>bQ#`g#Uw589O3b+m5TPu=PCu*I%lQs2~O zuWt6cUPTrD2N~(&YE+CEd!~uN1~GQnDnERJb*=GvtX79<;s?Ub%@MlnKiqfKNfDly zNGe)?(ba3CttsZKCLV@3pN4j?bqub&`7^HTg|Ca-KrUFz!ooGnFY0p1ByP#8Lw)>O z#x4(0JNfadiI1@_R}b+~-LBc^2%&p3zH1Yo(xKNuk_e!s6Zb6ocKxNPtrk>4YLPsg zxNa>Bll_gRycp(=Lhu7ysW*QUNn) ze_3cNcAsQtYMFBsO+tz7yb?t2J#dys?=4No*tW>t_@v$vjaf4>#olTRnl7bb14 z6!+C;r>46rchPr@St;gkPJ+FcZ^Y82H?`E*2hy~1*qi_HetznH)QFRCgd$Gw^HSVP zqr-bK#QqE0bA=#-ZcWJ6Qs{GhFz!Ns9$nr+An4PZn$Y=Z^tXsBY0*t{At4s`0}xdg zqr1MswPR~0jU&y0zj>a8qN7F?jVYRliOA3y)J5Q*oTMSN%^mPsNHBBwHf)Cz@R}%Z0+oT<|&|2Yt$)r+e z-xWE&z$9G+p$(*;|K$h99iWK!3W+y6582yFS3`C`o1h_eI-ebD&2{3OS?U`%KdJIr}0B?w4}R|H%9+iR0HY z|Au`l^6w;!|FZ8z{sa3_^G7BF8lAb`_oCK$eG=rZa#@zvHQ_= z8!D&5OU8X9 zJf4PWFVGOyGo)6Kfr^#Go`b&Zd2We!0u)c@-GKhZekFGEJ1r=y7_;>VO%P%*3|k9WaZYXHzoAuBgClZU@Yhqt0KB$S(+G zRz_iAocZ@aF>>o4$ovZ+$hM&XUW8sa8w=RWP{>|^;p|lyjk9e$dkv z9EvmQ2=*3Kv$vs}&XpeFLP~Kd|rMSJY{Reb0iZ(^>3CmV-K7zCzO1W*gh%1hy?$Pk)UP+m9?tOTkRDfyNn3@~K+n_ZHZE?v4sh&^4A*Z^) z8jd6ld#Uu=t9<084Z0LLN4(Q$l6sYOwu`x%R93f=GTxW>ldA6qG{_5Rkq;nS>-&2E z4nV0UW7h5kxS|Wpo)&-#`5-CzDUy4EP+12HTJJ|@h;%-E+AYeM1l|ILnJIW zQtR&VAa!gqQrK;%Z|C*i&TYP(i~Olr@1^2o>~l&AD()3jsB}Zo57q`RtaA|7A5y^D zDq)3uiQ3>L>JlHKRJu7SWxQ4*k{2rOgyV~!fbKXQPuK`XNQuIUp|mKR6rWyVo#vN+ zA)qTDgI@{Rd=px;t6iApIhf}0;b_R6>69Ix0Je6F;H47(Q}8|Y9h7$sr0;~2S7e^j z38y|1%A-ZF6HeO%>V1gR>G*es*D&3T#N2{b^)|@jcOWiz;<)#qw{R~M@~tks203^Q z67HUj7uut47BXU_W225n3W-$%ke6qFJ^}f{-jkimJWH7TGifP3GYV(N5y?a_z|pPY zozR;<0R8!cE}joaw21u?--Gxl$^6Y&g`EYNM`oV01OC8)7LaqJa2{soN8y6v%pN6C zxDc)3%F5yP(t_DVQMhL9RO)JK<7V{RWYh=!8Fd4aLhY zZe;kHuyOnl3A0?PLV5@Z{uBQF8Tsm+9d99xZ@Xlh?$D9W$MXrvwsst!C{5&zlHq*_ z{$;!2@{&%tVhf~K?u3mi&|TYq^vHbzqy^pKN||4UB8w~kr#Sc*xVC(Tw0sV^{7Z+S z8DR2Be6m=``#31|;Zx9eV&Z8kdQ6;8bGU);c$rj19r!|>PdBAeo*`&R=P?@Oq?yUf zC8wrJPN6f+kOnW0zDJw!gNsMHgOJW=(e@~jN1QJEO2{8#2cqFf;?dQAkgsOqi|&VTO_pbCqsTsq}ydwYm&=7Z(joLndmkw3 zY|h(!*81k_!ES#1<#eZiQ)w_PLT!~kcEuDQsyxY z3ZZa7DF9vR3x+ZfvXsF{X(8k&gP^}M6b30pP@)WjgOp-Nt8!dgHOirFl%rLnlC)}+ zORG#!jRmAu8C~fWr(1^@G#tfdpc!O9u+pDVs3|wyq$0ZneH2x zh|(xrPBz<5sDC$|#n_g;FOs^>FBTx8a5L%iE%f%hLT6qp_iO`wq!`%+0VFo_n?oJB$tkr z)4DIBG?Y~CHu87vX-6(`Gj05C_pHduVPGmNk^WWCTR9R6l%rfC>g$N8FJCA`B$uMz zUNgCfFZOZ#hI*w`yHA(2%5if}lH?36%)H}@*y?_#Sl!Wo@3|{v6*khYI|_Gu=<16T z6_n#}s zWwx9YY2=fPcTlxKbfdYcT!1s2wT@x%Ric8@R5?ngAYBhNbgdB%@m zTLjOJ>e-A9`@zg(f%0S>x3cY$rZjfqxH9gm>>F@hu6ya-sr1;|)6;lMv52Mc!qc0GnFH`WS zmLk$#1zXGOd=xCtt6<;nQ^Ahm$NHgK;EU>B&~Ob8sw@TbM4;S@YCUi8LAAhxs%q{N z)kc5K+v%4c8}sDhKq4d zmE$avEa^qg(smjO^Nv)bodJe=CS<5*LAH9fi$lGf(R%UI_~}AsXE^X+`8Gl9m+Lntdm zGpG|Dh{6ufX4b zhLGkCH55A}74s|jl{oY?2OX-p3hA+992*k}Je_aiS4$l4MNqi0gd&=QkCapn-!)cM z#%kGGwz?Uzhi7Y}CImvc0ep9Vmd3X1{ge=NMgO!i(6kwlr_F=`m=D!vIdPgi++F_T)i0>^ay51YLu?4q@-yrF_ z6d_Wys<3zm>}If_WCuLTU?XJX!(SNehQ*bk;Yih%y&uO(5>`N~gg)ATLg=S0f`Qs% z$Gr7H5feFN=n5Tj3fX3UV*=-?X0zOLr%^~l*ZEC9Lm!Fw&0bx*jNf9T%UbDCw_c+vk>h%#k=u(ar`{ zI|pTb9%O45z##2HD8YP`b_q<>E`@2@A6-$}JRvU*{UA%oi@09qP**0T6q_cB_8a69 zV{r!34?Rc@-Xv!PQIL^nnsRN^RE)MMe+N9Tf>6|tymNVf6Xa@FLm}qFv}+yYav{jK z^817eg&dSZjtYfr6>_mYWV1eQkSv{DOa>`Gl_se4s}+)t2P7S1ak9R^K%4_4QIuy> zlp83{M+5MWD7G#NnGF5#NE%g+seimO4cNGC#K7UtN>EKJFbEwP*Fg80M+k7 zTx=e~)$m~$sqKQ%+M}p`e?e387|hikheh~)nYKrNaAXSdVIpMn4ju&q20*Fc4as7; z!<*&2QwFA&^9Q8qsNy?FWd%?AgSr>8$c{hA7!#}k_!au;eCN-Qk6swE;~_`ZQ7P*& zUCBC8dtXb|UR%=7qoiLzNxy`Wei?>iK3aR#CF!^pk8!9O<4Af8f7m1GF)1aTQjHn? zu!_%rb&5i-v-Nh$>l9fYFYXb(8>u9KFH7fR60LX(N}}-kZunOsrv^$+kqh$1M)ddS z;Z3w;TLsJBWLrHv`waEt3)GJ*#I;~S4gL1lEbq}^6*H5arQM> z!86++PqGh>Q<6uaw4M+^ozVHCv`mnHe*(}C)j^W|7x(3lWLy21Wa@cx)766< zu(uYJJV6SBta#h&Y5fiXZ7&27^R$2h83EO`^XlP{(nFFGz^wog>L#U!B*lLBxFp2@ z_ABZE|Et7%j~CY`oFk^Gw2>nVXfGg7`)x}CLC^zfU1xh1$2TO(b6 zxWVs)BNvnui?e<@(WkTi;r3ZS>cu-`O>n$S^g%A9gHORuB5*j!&gJL?M)#uk1@U>uHnh|BNj?u^x)|J`pl{fuMq z*8=@R@Bo+RsW*a=kCU{7PO)~vd+4yfpZP%)K1B2VQRct#A)g*T#)l|;61&2GGBuP> zw>IMk;_p-rCw4{QQ<8NQKAWKBq6hjpErwC}VysTtmt&1kww_mi4&D9CHuCAAj7}>j zn7L*ijY1l4Tl8gz~sPOm>HM{<$+3=8(0WS1B+l)pbAz8mOx!# zDKrO`!SR9Ra7JJSoEumPmjn)fhsy#-2tKW`iFWvOxwwJM#M9Se*_aFSgme^GivG>B z{5fRQDwrT-r@?9%&7bElpycbIg#QD3=+F#<`HT2uz`2kvPUlTACp9$AMRZ*E5`Wnz z4q5CmzJbU-;p{u+N>f~$~QXJHlpgMVM)-`7$2#;eDtp(Q-srN=Hy$Uf#t*E$$~gTE=qsFVlh zy+{S;?*z7j_T!oO_iZP9x79Pyd1zkF_X$5~G*H4-c6*$+_}g-v=deAkH`6IbeP*bj z1HPqe5t%dtHo}17l0?OSw~Yzq!kTP{QY8Jq9_1FkP+%kCvXlmu>sF@c+5Qs5RS3*74XLIsc`6>|_|NX10V9Hvc|_nzp9F5z?WMA!0_*eUWD z!O`wY!q%H8e#bXzGSw3`3EblwHF?*!^E7YgPT$V&`5q>G>+QUM+qd)k`~$zkgh{@O z+f&H#r;+1-OA&JuA8mM5?nC~O&m^AYogXjma}xjCIf*$;qS~Dd>i2ncJ2CNMqS*cf z-a>TW1~c#uTKo6>t-biR$GIZV4Ie-D<>vQZZhq>+O-{cC=XW6ggLmG3i zIfH#6=TrWf1U$}v<%Rr^`Qrod({A|L%go=By^jQDa{56_A2NUOkf{fJ$^62RM4U{N z#4jE)_3ohQ87auTLmY*v^ka4sR-3eXy~Rav@kxk!*LG9xaI%?=7{vXk|x9jpH(l=j!=U)j7zP5SG>Ha15V`a8+ zqDx+#@LN7zQR{@?3pS#{#V+KtTu`dGXx_!cn z*ya0>+R60zOxy%RP(-D;e;f&hJ{m=IFp6j_Wb5N0SDyfb^~o?yp9-b=G?<{5L76@S z=IAqFpMP(S zeHFZ^9|0feN5U6+7{1e2GteW<)N5IezLpKtk7XnEdNxsSV$<|yp&}>P0*@&sE0Z5u zP~A7EqFg+EOG^NhvP|16h6zj;3yB7048%ebfI09J{|-GI9Tvhj!ox9O8GI%@921^} zR^j1)1mPuU5MLIg2{kMQ)3Cblg?3b8+D-iz_t^Yy4$o z4i!5k74s0;bcYHPsVE@bx2Yg)rw_Pl=>smC5IIL`V}#UF680tJb|mBuB;;-+=5BG6W!R=ENEwxs4%R)? z$$EJ10qQTK`FI8L^?yR4{u+ezH_&{4yp6nj$A!-rm#xPQMRrg0`|0OXj^8K`v(Q5atuVcq3dgRX7?Rhfbqld?dWQc!|~^eibrItq5MJQdDTkc!W}RP;wG1|SuM zkYx;lzL*a(hBz_8bSX)H3c(C^s2D7%NJAVqi-SuC_jDWgUP-ve_W(-9fnYAqGkh^0 ziI^XRn2$!x#~|jT5%aPCe=+ZIKs?V+h50nZybLj)ftb%k%x56xv;Kc#uF{V|OVc}1 zn%*8U+e05zjz8y^3p|UwQQ@+mu}}h|AC#7Wevl_?VFXmbuP48MkCEw~aHEX#Q+X7c zroQwriIU066#J6BFp`7M!U;{~U24tEU?`K2TY336?0vgHyN3c7|UUZaTpXED`2>>3dS3U!zAMfm~9*h6~<98-w4ApV>KLRRKqHx7LGR7 zx;}9VOQMFrM5U*Hh+h@MSS4G;uZF`IrI&N;VS$zfze8`dBzLEEr*&4F?(L!dT-x6u{{))wl>|8W+1R zKlByo(;86j=ySPP7tn;m3?)~b%@9fb=zOW0I7@IHFAWsOOS(;CABXoROWqGjKV?ok4j@l#Qt5p*i5r6^lSj z4HlH_nj)5xg3ZvU1XmK;2o~Q8MzKJN7L$*BQMv(gj2lq}Za}`?geq{e69CV_4FaL0 z#Z`cwlzg%Yab>WNuzDe*yq2rLFQ&x$dFT9HevZ9=(id57(>Y$=T}mTAqn~UIO+AHNqm(I=YevAM4HTeH|a7Y>7>YgS!_9z=+JCAEH-+s z7G*24*h&{R-)6B@E`p|JvBO=+P0M0O*v0r{ilQomSqP>%2nx(0FvKi^VsjXbF-u^) zIRa*wBVmqt5LB6CV3j!*PBO>A1?B|UWKM+J%}MZpIT@ZXr@$-bRQS+;oCe>SWw`yE z&N9szY>+vVjWx^J9CH?1Zq8=X49FP;Bb*^~xw^G)`TU zH!5RsU-s zJ~qDV8DV6!?=oD?e_BZ`w_#bZTrN~~Bf zic@3722q?QM`w+qIDH#y!uc#ldw?}Z*>R$J<~Bh4HA7aTWos4Hv$nA|oY}IvJ<8UJ z>e(@v>qT)+thhmc6z6V(i8#Gwr{kmS1W`RNhS!Nyip}hksLja}(EIN`L8ounb9MTN zoti9+arE*DI+Yj6GCP%StnGo!P_7f8WbU(>~Ci(?EuLlmoQ6zOqE z4BIoso2BtLhsNHVCEnNuK#X{Hl$}FWD`P19VS-6zG6qP0!GvJ0`2_T&n!{p9FWCa! zN^;E|>|9Qz32F3pmCb{(Rwy?uH<)cj;Ttj3;WoDPc!Wfp?u>A_5^jat*&22?dz3xS zPLVf~-UFN)<{Hq=TCmJI$Tp9KzGedynoYRs9tUI17AQB{;3%^l)?(ghZh(``6X6o` zB)HN%1#UHe&p?B5D%@$F4m-`W;A!)0c+ETqJ~saVKbYsTfO#IvHqS?+aRHlXUdXD< zi&&j`F&d0Z&|v(DU1$E8-ECgQwwoJSC+3fu*RaRUO>B>OHGAH?j=f`E&%QEmWdAic zvtP`cxN6?QE%P>>XWq^aHt*mI%{zIuc@J+j@8zd|nOpfr^FDr)c|YH3cJK$yD1XVc z51Q}7)%++lAy+7q&_%ivJ>f~pWcp+n6ou|t1sHnHST~itA^x&sd|p*KW9gzcURAQsT7ra>sBI~ zLX9RGa`Q|nH}CYOZXS)Rke~7R$tfEl36n=5JtmJBYGOpic;u~*pTSTbeM}+!*4gLO zox}a-oU`_Keb?G+t+UQKf84!W&a2l>&pUbS@%L|ak#_vrn}HSXx^IW;8Nco@@sFXSHDl1S6L+6zQJX}q8lNHWLYln9A6x@$_r9G zj8j!QB*ir+wI9iNl<3(Z4ZQy7{uniuooE(4iI1=uwM%K33tXO{yD%PysFNwURUMTVG?no-^Lo1f9s9p>N3lk z**YCdcMrc~6d(!gHN?^F^#}aQ*E(dR>imwd`q7HpL;PSF-QB9t)E{TWWWrn&iKk){|;m)$`Yi1)iSc;;PaMwAHQmQg>RXFIu@~ zWX-woKDO!%m;8-iZWiuez1{H>6Of}!y^S4u?EPP7uT|$221^#^xReF9UX(o#epF|0 z;Z??`ycK4jmYAJ>MXTDiUj6(j(xu@_6Lwd+TWyFM`$^)ss^WaM>6*0Stv&{=d3o2q zq>Dy;JP}n9xbvgD+G_UTuLG&ohKtFay4TziXdJ!@fw|5kcq_5TwYMOD-Px$P}bUgr``ctqZewCAauZQ;M|5y zTU3nqI12-c^01~TslZ62f*?I+A`^nFyi;)YR}+eQ?L<+Y0_24V7Rh{xG{I-5^TukY zgR#0qra|qF#UaRqxaArG!amCZEoQuaGQ+U<7W>_- zf*-Lp(b{F%IY8ZnS0~WY;9#8zVM&Efos1yLZw?IXAKdZv*DG+0? znMlu?EfjM~mfaJOjo`GG0NsrDhM|F2KaMuS;yFUvK~pcR7tTle4a<>ql5n_2@ElA0+731V$21*oca$!glC-;( zEQcR1jX)A&&hCMH>V1Gt0%&j-4vr;hmKRy*EP{Id@RuV8VW)-1a0d(%pyt+q>EW78 z1hhEBctU&w0Xl933wD8c*BjjZ=f!f9iyR-(SdpuDesFEi*1 zDocu*AfQp-=V_$GD4{Wq1RClumS$^V}Tr)YtpH^5U9Q+a^~53eZ2~XuY!vtr2|7v<$a;{d&0dW?4({Q zoVyVD5Pu%ABst459gA$RB#O_hGzz4RymaLyS|2AzAxol=$quEZvkC*hc>qQ>ew=U{ z^6deo;iN_}$bw*{F(5s#m6OKC zAafGU&lSI)Y6N4AU`!az>?{s?83+ipSof!ZVu02IRM>Y?*{Jkz&%PZXXS1VKl&&w(cmw%u1jqLyd@-L zhyWj&%i+C>XrpgJ>#f)EW`WJT>AUw{jdg%tOl^KSS$)SP7;=mGFk`TW(BWiI57cC z|9yyqUHO&P#gz$s;ap{hdLQj(Fekn`C4y91#7RjJ?n~x-%;NTK7jwan(r+f)c$~vm zoP*}nU72rKs_Vtvko#i3m=th=M5UZ`>tgiP z5pr9$v1ryEq$p_Z-M^Bw*xzXER8J4qyvx=Djn>_s2>Y5MNAhY$D0ZYys~Q1wX@LaT zbrY~X%~l8Dy$ex4tW4tjzTg``fX&gxOcMWKgqL_RU5$M~i~9g*OXA-#G@l1w=kW8t z;PAaLh@0JjdHzArlT4u}30(`YLAXc`J+UAe4Mw-@aiR)Y;b!*2U?6+pfPGcS1sOZC z7gJH)U=A_S3+dw)6~M+jV{r=d*IMh0@GEcRjJKqK^fy<0CIw#gU%Db3JQ|r|ou$Y~ KJ7YA&hx$LUEX|Vu diff --git a/src/main/java/com/ss/editor/DevelopPluginStarter.java b/src/main/java/com/ss/editor/DevelopPluginStarter.java index dc90a1f0..94809b62 100644 --- a/src/main/java/com/ss/editor/DevelopPluginStarter.java +++ b/src/main/java/com/ss/editor/DevelopPluginStarter.java @@ -3,7 +3,6 @@ import org.jetbrains.annotations.NotNull; import java.io.IOException; -import java.nio.file.Path; import java.nio.file.Paths; /** @@ -13,8 +12,8 @@ */ public class DevelopPluginStarter { - public static void main(@NotNull final String[] args) throws IOException { - final Path embeddedFolder = Paths.get("./embedded-plugins"); + public static void main(@NotNull String[] args) throws IOException { + var embeddedFolder = Paths.get("./embedded-plugins"); System.setProperty("editor.embedded.plugins.path", embeddedFolder.toAbsolutePath().toString()); JfxApplication.main(args); } diff --git a/src/main/java/com/ss/editor/JfxApplication.java b/src/main/java/com/ss/editor/JfxApplication.java index 0e4dde5e..ddda1888 100644 --- a/src/main/java/com/ss/editor/JfxApplication.java +++ b/src/main/java/com/ss/editor/JfxApplication.java @@ -1,7 +1,7 @@ package com.ss.editor; -import static com.jme3x.jfx.injfx.JmeToJFXIntegrator.bind; -import static com.jme3x.jfx.injfx.processor.FrameTransferSceneProcessor.TransferMode.ON_CHANGES; +import static com.jme3.jfx.injfx.JmeToJfxIntegrator.bind; +import static com.jme3.jfx.injfx.processor.FrameTransferSceneProcessor.TransferMode.ON_CHANGES; import static com.ss.editor.config.DefaultSettingsProvider.Defaults.PREF_DEFAULT_OPEN_GL; import static com.ss.editor.config.DefaultSettingsProvider.Defaults.PREF_DEFAULT_STOP_RENDER_ON_LOST_FOCUS; import static com.ss.editor.config.DefaultSettingsProvider.Preferences.*; @@ -9,9 +9,9 @@ import static com.ss.rlib.common.util.Utils.run; import static java.nio.file.Files.createDirectories; import static java.nio.file.Files.newOutputStream; +import com.jme3.jfx.injfx.JmeToJfxApplication; +import com.jme3.jfx.injfx.processor.FrameTransferSceneProcessor; import com.jme3.util.LWJGLBufferAllocator; -import com.jme3x.jfx.injfx.JmeToJFXApplication; -import com.jme3x.jfx.injfx.processor.FrameTransferSceneProcessor; import com.ss.editor.analytics.google.GAEvent; import com.ss.editor.analytics.google.GAnalytics; import com.ss.editor.annotation.FromAnyThread; @@ -121,7 +121,7 @@ public static void main(@NotNull String[] args) { CommandLineConfig.args(args); - JmeToJFXApplication application; + JmeToJfxApplication application; try { application = JmeApplication.prepareToStart(); } catch (final Throwable e) { @@ -176,7 +176,7 @@ private static void configureLogger() { * @param application the new jME application. */ @JmeThread - private static void startJmeApplication(@NotNull JmeToJFXApplication application) { + private static void startJmeApplication(@NotNull JmeToJfxApplication application) { var initializationManager = InitializationManager.getInstance(); initializationManager.onBeforeCreateJmeContext(); diff --git a/src/main/java/com/ss/editor/JmeApplication.java b/src/main/java/com/ss/editor/JmeApplication.java index 67b539cd..ada9f2cf 100644 --- a/src/main/java/com/ss/editor/JmeApplication.java +++ b/src/main/java/com/ss/editor/JmeApplication.java @@ -14,6 +14,7 @@ import com.jme3.environment.generation.JobProgressAdapter; import com.jme3.environment.util.EnvMapUtils; import com.jme3.font.BitmapFont; +import com.jme3.jfx.injfx.JmeToJfxApplication; import com.jme3.light.LightProbe; import com.jme3.material.Material; import com.jme3.material.TechniqueDef; @@ -26,7 +27,6 @@ import com.jme3.renderer.RendererException; import com.jme3.renderer.ViewPort; import com.jme3.scene.Node; -import com.jme3x.jfx.injfx.JmeToJFXApplication; import com.ss.editor.analytics.google.GAnalytics; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.JmeThread; @@ -57,7 +57,7 @@ * * @author JavaSaBr */ -public class JmeApplication extends JmeToJFXApplication { +public class JmeApplication extends JmeToJfxApplication { @NotNull private static final Logger LOGGER = LoggerManager.getLogger(JmeApplication.class); diff --git a/src/main/java/com/ss/editor/config/EditorConfig.java b/src/main/java/com/ss/editor/config/EditorConfig.java index 36b48bc7..ce20fa8f 100644 --- a/src/main/java/com/ss/editor/config/EditorConfig.java +++ b/src/main/java/com/ss/editor/config/EditorConfig.java @@ -7,9 +7,9 @@ import com.jme3.asset.AssetEventListener; import com.jme3.asset.AssetKey; import com.jme3.asset.TextureKey; +import com.jme3.jfx.injfx.JmeToJfxIntegrator; import com.jme3.math.Vector3f; import com.jme3.system.AppSettings; -import com.jme3x.jfx.injfx.JmeToJFXIntegrator; import com.ss.editor.JmeApplication; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.util.EditorUtil; @@ -29,7 +29,6 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import java.util.prefs.BackingStoreException; import java.util.prefs.Preferences; @@ -41,7 +40,6 @@ */ public final class EditorConfig implements AssetEventListener { - @NotNull private static final Logger LOGGER = LoggerManager.getLogger(EditorConfig.class); private static final String SCREEN_ALIAS = "screen"; @@ -70,8 +68,7 @@ public final class EditorConfig implements AssetEventListener { if (instance == null) { synchronized (EditorConfig.class) { if (instance == null) { - final EditorConfig config = new EditorConfig(); - instance = config; + instance = new EditorConfig(); } } } @@ -152,9 +149,9 @@ public EditorConfig() { * @return the setting's value or default. */ @FromAnyThread - private @Nullable T get(@NotNull final String id, @NotNull final Class type, @Nullable T def) { + private @Nullable T get(@NotNull String id, @NotNull Class type, @Nullable T def) { - final Object value = DictionaryUtils.getInReadLock(settings, id, (objects, s) -> objects.get(id)); + var value = DictionaryUtils.getInReadLock(settings, id, (objects, s) -> objects.get(id)); if (value == null) { return def; } else if (type.isInstance(value)) { @@ -173,21 +170,21 @@ public EditorConfig() { } } else if (type == Vector3f.class) { if (value instanceof String) { - final String[] values = value.toString().split(","); - final float x = Float.parseFloat(values[0]); - final float y = Float.parseFloat(values[1]); - final float z = Float.parseFloat(values[2]); + var values = value.toString().split(","); + var x = Float.parseFloat(values[0]); + var y = Float.parseFloat(values[1]); + var z = Float.parseFloat(values[2]); result = unsafeCast(new Vector3f(x, y, z)); } } else if (Enum.class.isAssignableFrom(type)) { final Class enumType = unsafeCast(type); if (value instanceof String) { - final Enum enumValue = Enum.valueOf(enumType, value.toString()); + var enumValue = Enum.valueOf(enumType, value.toString()); result = unsafeCast(enumValue); } } else if (Path.class.isAssignableFrom(type)) { if (value instanceof String) { - final URI uri = Utils.get(value.toString(), URI::new); + var uri = Utils.get(value.toString(), URI::new); result = unsafeCast(Paths.get(uri)); } } @@ -207,8 +204,8 @@ public EditorConfig() { * @param value the setting's value. */ @FromAnyThread - public void set(@NotNull final String id, @Nullable final Object value) { - final long stamp = settings.writeLock(); + public void set(@NotNull String id, @Nullable Object value) { + var stamp = settings.writeLock(); try { if (value == null) { @@ -223,47 +220,47 @@ public void set(@NotNull final String id, @Nullable final Object value) { } @FromAnyThread - public boolean getBoolean(@NotNull final String id, final boolean def) { + public boolean getBoolean(@NotNull String id, boolean def) { return Boolean.TRUE.equals(get(id, Boolean.class, def)); } @FromAnyThread - public @Nullable Boolean getBoolean(@NotNull final String id) { + public @Nullable Boolean getBoolean(@NotNull String id) { return get(id, Boolean.class, null); } @FromAnyThread - public int getInteger(@NotNull final String id, final int def) { + public int getInteger(@NotNull String id, int def) { return notNull(get(id, Integer.class, def)); } @FromAnyThread - public @Nullable Integer getInteger(@NotNull final String id) { + public @Nullable Integer getInteger(@NotNull String id) { return get(id, Integer.class, null); } @FromAnyThread - public > @Nullable T getEnum(@NotNull final String id, @NotNull final Class type) { + public > @Nullable T getEnum(@NotNull String id, @NotNull Class type) { return get(id, type, null); } @FromAnyThread - public > @NotNull T getEnum(@NotNull final String id, @NotNull final T def) { + public > @NotNull T getEnum(@NotNull String id, @NotNull T def) { return notNull(get(id, unsafeCast(def.getClass()), def)); } @FromAnyThread - public @NotNull Vector3f getVector3f(@NotNull final String id, @NotNull final Vector3f def) { + public @NotNull Vector3f getVector3f(@NotNull String id, @NotNull Vector3f def) { return notNull(get(id, Vector3f.class, def)); } @FromAnyThread - public @Nullable Path getFile(@NotNull final String id) { + public @Nullable Path getFile(@NotNull String id) { return get(id, Path.class, null); } @FromAnyThread - public @Nullable String getString(@NotNull final String id) { + public @Nullable String getString(@NotNull String id) { return get(id, String.class, null); } @@ -283,10 +280,10 @@ public int getInteger(@NotNull final String id, final int def) { * @param currentAsset the current asset */ @FromAnyThread - public synchronized void addOpenedAsset(@NotNull final Path currentAsset) { + public synchronized void addOpenedAsset(@NotNull Path currentAsset) { - final String filePath = currentAsset.toString(); - final List lastOpenedAssets = getLastOpenedAssets(); + var filePath = currentAsset.toString(); + var lastOpenedAssets = getLastOpenedAssets(); lastOpenedAssets.remove(filePath); lastOpenedAssets.add(0, filePath); @@ -296,15 +293,15 @@ public synchronized void addOpenedAsset(@NotNull final Path currentAsset) { } @Override - public void assetDependencyNotFound(@Nullable final AssetKey parentKey, @Nullable final AssetKey dependentAssetKey) { + public void assetDependencyNotFound(@Nullable AssetKey parentKey, @Nullable AssetKey dependentAssetKey) { } @Override - public void assetLoaded(@NotNull final AssetKey key) { + public void assetLoaded(@NotNull AssetKey key) { } @Override - public void assetRequested(@NotNull final AssetKey key) { + public void assetRequested(@NotNull AssetKey key) { if (key instanceof TextureKey) { ((TextureKey) key).setAnisotropy(getInteger(PREF_ANISOTROPY, PREF_DEFAULT_ANISOTROPY)); } @@ -326,7 +323,7 @@ public void assetRequested(@NotNull final AssetKey key) { * @param currentAsset the current asset folder. */ @FromAnyThread - public void setCurrentAsset(@Nullable final Path currentAsset) { + public void setCurrentAsset(@Nullable Path currentAsset) { this.currentAsset = currentAsset; } @@ -336,7 +333,7 @@ public void setCurrentAsset(@Nullable final Path currentAsset) { * @param screenHeight the height of this screen. */ @FromAnyThread - public void setScreenHeight(final int screenHeight) { + public void setScreenHeight(int screenHeight) { this.screenHeight = screenHeight; } @@ -346,7 +343,7 @@ public void setScreenHeight(final int screenHeight) { * @param screenWidth the width of this screen. */ @FromAnyThread - public void setScreenWidth(final int screenWidth) { + public void setScreenWidth(int screenWidth) { this.screenWidth = screenWidth; } @@ -386,7 +383,7 @@ public boolean isMaximized() { * @param maximized true is the editor's window is maximized. */ @FromAnyThread - public void setMaximized(final boolean maximized) { + public void setMaximized(boolean maximized) { this.maximized = maximized; } @@ -416,7 +413,7 @@ public int getGlobalBottomToolHeight() { * @param globalLeftToolWidth the global left tool width. */ @FromAnyThread - public void setGlobalLeftToolWidth(final int globalLeftToolWidth) { + public void setGlobalLeftToolWidth(int globalLeftToolWidth) { this.globalLeftToolWidth = globalLeftToolWidth; } @@ -426,7 +423,7 @@ public void setGlobalLeftToolWidth(final int globalLeftToolWidth) { * @param globalBottomToolHeight the global bottom tool height. */ @FromAnyThread - public void setGlobalBottomToolHeight(final int globalBottomToolHeight) { + public void setGlobalBottomToolHeight(int globalBottomToolHeight) { this.globalBottomToolHeight = globalBottomToolHeight; } @@ -436,7 +433,7 @@ public void setGlobalBottomToolHeight(final int globalBottomToolHeight) { * @param globalLeftToolCollapsed flag is for collapsing the global left tool. */ @FromAnyThread - public void setGlobalLeftToolCollapsed(final boolean globalLeftToolCollapsed) { + public void setGlobalLeftToolCollapsed(boolean globalLeftToolCollapsed) { this.globalLeftToolCollapsed = globalLeftToolCollapsed; } @@ -446,7 +443,7 @@ public void setGlobalLeftToolCollapsed(final boolean globalLeftToolCollapsed) { * @param globalBottomToolCollapsed flag is for collapsing the global bottom tool. */ @FromAnyThread - public void setGlobalBottomToolCollapsed(final boolean globalBottomToolCollapsed) { + public void setGlobalBottomToolCollapsed(boolean globalBottomToolCollapsed) { this.globalBottomToolCollapsed = globalBottomToolCollapsed; } @@ -484,7 +481,7 @@ public boolean isAnalyticsQuestion() { * * @param analyticsQuestion true if the question was showed. */ - public void setAnalyticsQuestion(final boolean analyticsQuestion) { + public void setAnalyticsQuestion(boolean analyticsQuestion) { this.analyticsQuestion = analyticsQuestion; } @@ -496,17 +493,17 @@ public void setAnalyticsQuestion(final boolean analyticsQuestion) { @FromAnyThread public AppSettings getSettings() { - final GraphicsEnvironment graphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment(); - final GraphicsDevice device = graphicsEnvironment.getDefaultScreenDevice(); - final DisplayMode displayMode = device.getDisplayMode(); + var graphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment(); + var device = graphicsEnvironment.getDefaultScreenDevice(); + var displayMode = device.getDisplayMode(); - final AppSettings settings = new AppSettings(true); + var settings = new AppSettings(true); settings.setFrequency(displayMode.getRefreshRate()); settings.setGammaCorrection(getBoolean(PREF_GAMMA_CORRECTION, PREF_DEFAULT_GAMMA_CORRECTION)); settings.setResizable(true); // settings.putBoolean("GraphicsDebug", true); - JmeToJFXIntegrator.prepareSettings(settings, getInteger(PREF_FRAME_RATE, PREF_DEFAULT_FRAME_RATE)); + JmeToJfxIntegrator.prepareSettings(settings, getInteger(PREF_FRAME_RATE, PREF_DEFAULT_FRAME_RATE)); return settings; } @@ -516,15 +513,15 @@ public AppSettings getSettings() { */ private void init() { - final Preferences prefs = Preferences.userNodeForPackage(JmeApplication.class); - final long stamp = settings.writeLock(); + var prefs = Preferences.userNodeForPackage(JmeApplication.class); + var stamp = settings.writeLock(); try { - for (final String key : prefs.keys()) { + for (var key : prefs.keys()) { settings.put(key, prefs.get(key, null)); } - } catch (final BackingStoreException e) { + } catch (BackingStoreException e) { throw new RuntimeException(e); } finally { settings.writeUnlock(stamp); @@ -539,7 +536,7 @@ private void init() { this.globalBottomToolCollapsed = prefs.getBoolean(PREF_OTHER_GLOBAL_BOTTOM_TOOL_COLLAPSED, true); this.analyticsQuestion = prefs.getBoolean(PREF_OTHER_ANALYTICS_QUESTION, false); - final String currentAssetUri = prefs.get(PREF_ASSET_CURRENT_ASSET, null); + var currentAssetUri = prefs.get(PREF_ASSET_CURRENT_ASSET, null); if (currentAssetUri != null) { this.currentAsset = Utils.get(currentAssetUri, uri -> Paths.get(new URI(uri))); @@ -549,31 +546,31 @@ private void init() { this.currentAsset = null; } - final int cameraAngle = getInteger(PREF_CAMERA_ANGLE, PREF_DEFAULT_CAMERA_ANGLE); + var cameraAngle = getInteger(PREF_CAMERA_ANGLE, PREF_DEFAULT_CAMERA_ANGLE); System.setProperty("jfx.frame.transfer.camera.angle", String.valueOf(cameraAngle)); - final byte[] byteArray = prefs.getByteArray(PREF_ASSET_LAST_OPENED_ASSETS, null); + var byteArray = prefs.getByteArray(PREF_ASSET_LAST_OPENED_ASSETS, null); if (byteArray == null) { return; } - final List lastOpenedAssets = getLastOpenedAssets(); + var lastOpenedAssets = getLastOpenedAssets(); try { lastOpenedAssets.addAll(EditorUtil.deserialize(byteArray)); - for (Iterator iterator = lastOpenedAssets.iterator(); iterator.hasNext(); ) { + for (var iterator = lastOpenedAssets.iterator(); iterator.hasNext(); ) { - final String assetUrl = iterator.next(); - final Path assetPath = Utils.get(assetUrl, uri -> Paths.get(uri)); + var assetUrl = iterator.next(); + var assetPath = Utils.get(assetUrl, uri -> Paths.get(uri)); if (!Files.exists(assetPath)) { iterator.remove(); } } - } catch (final RuntimeException e) { + } catch (RuntimeException e) { LOGGER.warning(e); } } @@ -584,9 +581,9 @@ private void init() { @FromAnyThread public synchronized void save() { - final Preferences prefs = Preferences.userNodeForPackage(JmeApplication.class); + var prefs = Preferences.userNodeForPackage(JmeApplication.class); - final long stamp = settings.readLock(); + var stamp = settings.readLock(); try { settings.forEach((key, value) -> { @@ -629,12 +626,12 @@ public synchronized void save() { prefs.remove(PREF_ASSET_CURRENT_ASSET); } - final List lastOpenedAssets = getLastOpenedAssets(); + prefs.putByteArray(PREF_ASSET_LAST_OPENED_ASSETS, + EditorUtil.serialize((Serializable) getLastOpenedAssets())); - prefs.putByteArray(PREF_ASSET_LAST_OPENED_ASSETS, EditorUtil.serialize((Serializable) lastOpenedAssets)); try { prefs.flush(); - } catch (final BackingStoreException e) { + } catch (BackingStoreException e) { throw new RuntimeException(e); } } diff --git a/src/main/java/com/ss/editor/manager/JmeFilePreviewManager.java b/src/main/java/com/ss/editor/manager/JmeFilePreviewManager.java index f93903a0..058d9076 100644 --- a/src/main/java/com/ss/editor/manager/JmeFilePreviewManager.java +++ b/src/main/java/com/ss/editor/manager/JmeFilePreviewManager.java @@ -1,22 +1,20 @@ package com.ss.editor.manager; -import static com.jme3x.jfx.injfx.JmeToJFXIntegrator.bind; -import static com.jme3x.jfx.injfx.processor.FrameTransferSceneProcessor.TransferMode.ON_CHANGES; +import static com.jme3.jfx.injfx.JmeToJfxIntegrator.bind; +import static com.jme3.jfx.injfx.processor.FrameTransferSceneProcessor.TransferMode.ON_CHANGES; import static com.ss.editor.config.DefaultSettingsProvider.Defaults.PREF_DEFAULT_TANGENT_GENERATION; import static com.ss.editor.config.DefaultSettingsProvider.Preferences.PREF_TANGENT_GENERATION; import static com.ss.editor.util.EditorUtil.getAssetFile; import static com.ss.editor.util.EditorUtil.toAssetPath; import static com.ss.rlib.common.util.FileUtils.getExtension; import static com.ss.rlib.common.util.ObjectUtils.notNull; -import com.jme3.asset.AssetManager; import com.jme3.asset.AssetNotFoundException; import com.jme3.environment.generation.JobProgressAdapter; +import com.jme3.jfx.injfx.processor.FrameTransferSceneProcessor; import com.jme3.light.DirectionalLight; import com.jme3.light.LightProbe; -import com.jme3.material.Material; import com.jme3.math.Quaternion; import com.jme3.math.Vector3f; -import com.jme3.renderer.Camera; import com.jme3.renderer.RenderManager; import com.jme3.renderer.RendererException; import com.jme3.renderer.ViewPort; @@ -26,7 +24,6 @@ import com.jme3.scene.control.AbstractControl; import com.jme3.scene.shape.Box; import com.jme3.util.SkyFactory; -import com.jme3x.jfx.injfx.processor.FrameTransferSceneProcessor; import com.ss.editor.FileExtensions; import com.ss.editor.JmeApplication; import com.ss.editor.annotation.FromAnyThread; @@ -36,17 +33,15 @@ import com.ss.editor.config.EditorConfig; import com.ss.editor.executor.impl.JmeThreadExecutor; import com.ss.editor.model.EditorCamera; -import com.ss.editor.ui.scene.EditorFxScene; import com.ss.editor.util.EditorUtil; import com.ss.editor.util.TangentGenerator; import com.ss.rlib.common.logging.Logger; import com.ss.rlib.common.logging.LoggerManager; -import com.ss.rlib.fx.util.FXUtils; import com.ss.rlib.common.util.StringUtils; import com.ss.rlib.common.util.array.Array; import com.ss.rlib.common.util.array.ArrayFactory; +import com.ss.rlib.fx.util.FxUtils; import javafx.scene.image.ImageView; -import javafx.scene.layout.StackPane; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -59,29 +54,21 @@ */ public class JmeFilePreviewManager extends AbstractControl { - @NotNull private static final Logger LOGGER = LoggerManager.getLogger(JmeFilePreviewManager.class); - @NotNull - private static final Vector3f LIGHT_DIRECTION = new Vector3f(0.007654993F, 0.39636374F, 0.9180617F).negate(); + private static final Vector3f LIGHT_DIRECTION = + new Vector3f(0.007654993F, 0.39636374F, 0.9180617F).negate(); - @NotNull - private static final Vector3f CAMERA_LOCATION = new Vector3f(13.660254F, 5.176381F, 13.660254F); + private static final Vector3f CAMERA_LOCATION = + new Vector3f(13.660254F, 5.176381F, 13.660254F); - @NotNull - private static final Quaternion CAMERA_ROTATION = new Quaternion(0.9159756F, 0.04995022F, -0.37940952F, - 0.12059049F); + private static final Quaternion CAMERA_ROTATION = + new Quaternion(0.9159756F, 0.04995022F, -0.37940952F, 0.12059049F); - @NotNull private static final Array JME_FORMATS = ArrayFactory.newArray(String.class); - - @NotNull private static final Array MODELS_FORMATS = ArrayFactory.newArray(String.class); - - @NotNull private static final Array AUDIO_FORMATS = ArrayFactory.newArray(String.class); - @NotNull private static final EditorConfig EDITOR_CONFIG = EditorConfig.getInstance(); static { @@ -95,7 +82,6 @@ public class JmeFilePreviewManager extends AbstractControl { MODELS_FORMATS.add(FileExtensions.MODEL_GLTF); } - @NotNull private static final JmeThreadExecutor EDITOR_THREAD_EXECUTOR = JmeThreadExecutor.getInstance(); @Nullable @@ -120,10 +106,8 @@ public class JmeFilePreviewManager extends AbstractControl { * @return true is the file is a file of a model. */ @FromAnyThread - public static boolean isModelFile(@Nullable final Path file) { - if (file == null) return false; - final String extension = getExtension(file); - return MODELS_FORMATS.contains(extension); + public static boolean isModelFile(@Nullable Path file) { + return file != null && MODELS_FORMATS.contains(getExtension(file)); } /** @@ -133,10 +117,9 @@ public static boolean isModelFile(@Nullable final Path file) { * @return true is the file is a file of a model. */ @FromAnyThread - public static boolean isModelFile(@Nullable final String assetPath) { - if (StringUtils.isEmpty(assetPath)) return false; - final String extension = getExtension(assetPath); - return MODELS_FORMATS.contains(extension); + public static boolean isModelFile(@Nullable String assetPath) { + return !StringUtils.isEmpty(assetPath) && + MODELS_FORMATS.contains(getExtension(assetPath)); } /** @@ -146,10 +129,8 @@ public static boolean isModelFile(@Nullable final String assetPath) { * @return true is the file is a JME file. */ @FromAnyThread - public static boolean isJmeFile(@Nullable final Path file) { - if (file == null) return false; - final String extension = getExtension(file); - return JME_FORMATS.contains(extension); + public static boolean isJmeFile(@Nullable Path file) { + return file != null && JME_FORMATS.contains(getExtension(file)); } /** @@ -159,10 +140,9 @@ public static boolean isJmeFile(@Nullable final Path file) { * @return true is the file is a JME file. */ @FromAnyThread - public static boolean isJmeFile(@Nullable final String assetPath) { - if (StringUtils.isEmpty(assetPath)) return false; - final String extension = getExtension(assetPath); - return JME_FORMATS.contains(extension); + public static boolean isJmeFile(@Nullable String assetPath) { + return !StringUtils.isEmpty(assetPath) && + JME_FORMATS.contains(getExtension(assetPath)); } /** @@ -172,10 +152,8 @@ public static boolean isJmeFile(@Nullable final String assetPath) { * @return true is the file is an audio file. */ @FromAnyThread - public static boolean isAudioFile(@Nullable final Path file) { - if (file == null) return false; - final String extension = getExtension(file); - return AUDIO_FORMATS.contains(extension); + public static boolean isAudioFile(@Nullable Path file) { + return file != null && AUDIO_FORMATS.contains(getExtension(file)); } /** @@ -185,13 +163,10 @@ public static boolean isAudioFile(@Nullable final Path file) { * @return true is the asset path is an audio file. */ @FromAnyThread - public static boolean isAudioFile(@Nullable final String assetPath) { - if (assetPath == null) return false; - final String extension = getExtension(assetPath); - return AUDIO_FORMATS.contains(extension); + public static boolean isAudioFile(@Nullable String assetPath) { + return assetPath != null && AUDIO_FORMATS.contains(getExtension(assetPath)); } - @NotNull private final JobProgressAdapter probeHandler = new JobProgressAdapter() { @Override @@ -234,27 +209,26 @@ private JmeFilePreviewManager() { this.testBox = new Geometry("Box", new Box(2, 2, 2)); this.modelNode = new Node("Model Node"); - final ExecutorManager executorManager = ExecutorManager.getInstance(); + var executorManager = ExecutorManager.getInstance(); executorManager.addFxTask(() -> { - final EditorFxScene scene = EditorUtil.getFxScene(); - final StackPane container = scene.getHideLayer(); - - FXUtils.addToPane(imageView, container); + var scene = EditorUtil.getFxScene(); + var container = scene.getHideLayer(); + FxUtils.addChild(container, imageView); TangentGenerator.useMikktspaceGenerator(testBox); - final JmeThreadExecutor executor = JmeThreadExecutor.getInstance(); + var executor = JmeThreadExecutor.getInstance(); executor.addToExecute(this::prepareScene); }); } @Override @JmeThread - protected void controlUpdate(final float tpf) { + protected void controlUpdate(float tpf) { if (frame == 2) { - final JmeApplication jmeApplication = JmeApplication.getInstance(); + var jmeApplication = JmeApplication.getInstance(); jmeApplication.updatePreviewLightProbe(probeHandler); } @@ -263,13 +237,13 @@ protected void controlUpdate(final float tpf) { @JmeThread private void notifyProbeComplete() { - final Node rootNode = EditorUtil.getPreviewNode(); + var rootNode = EditorUtil.getPreviewNode(); rootNode.attachChild(modelNode); } @Override @JmeThread - protected void controlRender(@NotNull final RenderManager renderManager, @NotNull final ViewPort viewPort) { + protected void controlRender(@NotNull RenderManager renderManager, @NotNull ViewPort viewPort) { } /** @@ -280,12 +254,13 @@ protected void controlRender(@NotNull final RenderManager renderManager, @NotNul * @param fitHeight the target height of preview. */ @FromAnyThread - public void show(@NotNull final Path file, final int fitWidth, final int fitHeight) { + public void show(@NotNull Path file, int fitWidth, int fitHeight) { + imageView.setFitHeight(fitHeight); imageView.setFitWidth(fitWidth); - final Path assetFile = notNull(getAssetFile(file), "File can't be null."); - final String path = toAssetPath(assetFile); + var assetFile = notNull(getAssetFile(file), "File can't be null."); + var path = toAssetPath(assetFile); showPreview(path, getExtension(assetFile), false); } @@ -298,7 +273,7 @@ public void show(@NotNull final Path file, final int fitWidth, final int fitHeig * @param fitHeight the target height of preview. */ @FromAnyThread - public void showExternal(@NotNull final Path file, final int fitWidth, final int fitHeight) { + public void showExternal(@NotNull Path file, int fitWidth, int fitHeight) { imageView.setFitHeight(fitHeight); imageView.setFitWidth(fitWidth); showPreview(file.toString(), getExtension(file), true); @@ -312,7 +287,7 @@ public void showExternal(@NotNull final Path file, final int fitWidth, final int * @param external true if the path is external path. */ @FromAnyThread - private void showPreview(@NotNull final String path, @NotNull final String extension, final boolean external) { + private void showPreview(@NotNull String path, @NotNull String extension, boolean external) { if (FileExtensions.JME_MATERIAL.equals(extension)) { EDITOR_THREAD_EXECUTOR.addToExecute(() -> showMaterial(path)); } else if (isModelFile(path)) { @@ -330,7 +305,7 @@ private void showPreview(@NotNull final String path, @NotNull final String exten * @param fitHeight the target height of preview. */ @FromAnyThread - public void show(@NotNull final String assetPath, final int fitWidth, final int fitHeight) { + public void show(@NotNull String assetPath, int fitWidth, int fitHeight) { imageView.setFitHeight(fitHeight); imageView.setFitWidth(fitWidth); showPreview(assetPath, getExtension(assetPath), false); @@ -343,11 +318,12 @@ public void show(@NotNull final String assetPath, final int fitWidth, final int * @param external true if the object is external object. */ @JmeThread - private void showObject(@NotNull final String path, final boolean external) { + private void showObject(@NotNull String path, boolean external) { prepareProcessor(); - final AssetManager assetManager = EditorUtil.getAssetManager(); - final Spatial model; + var assetManager = EditorUtil.getAssetManager(); + + Spatial model; FolderAssetLocator.setIgnore(external); try { @@ -364,7 +340,7 @@ private void showObject(@NotNull final String path, final boolean external) { tryToLoad(model); - final Node rootNode = EditorUtil.getPreviewNode(); + var rootNode = EditorUtil.getPreviewNode(); rootNode.detachChild(modelNode); } @@ -374,16 +350,15 @@ private void showObject(@NotNull final String path, final boolean external) { * @param model the model. */ @JmeThread - private void tryToLoad(@NotNull final Spatial model) { + private void tryToLoad(@NotNull Spatial model) { try { - final JmeApplication jmeApplication = JmeApplication.getInstance(); - final RenderManager renderManager = jmeApplication.getRenderManager(); + var renderManager = EditorUtil.getRenderManager(); renderManager.preloadScene(model); modelNode.attachChild(model); - } catch (final RendererException | AssetNotFoundException | UnsupportedOperationException e) { + } catch (RendererException | AssetNotFoundException | UnsupportedOperationException e) { EditorUtil.handleException(LOGGER, this, e); } } @@ -400,7 +375,7 @@ private void prepareProcessor() { frame = 0; - final Camera camera = EditorUtil.getPreviewCamera(); + var camera = EditorUtil.getPreviewCamera(); camera.setLocation(CAMERA_LOCATION); camera.setRotation(CAMERA_ROTATION); @@ -413,16 +388,16 @@ private void prepareProcessor() { * @param path the path to material. */ @JmeThread - private void showMaterial(@NotNull final String path) { + private void showMaterial(@NotNull String path) { prepareProcessor(); - final AssetManager assetManager = EditorUtil.getAssetManager(); - final Material material = assetManager.loadMaterial(path); + var assetManager = EditorUtil.getAssetManager(); + var material = assetManager.loadMaterial(path); testBox.setMaterial(material); tryToLoad(testBox); - final Node rootNode = EditorUtil.getPreviewNode(); + var rootNode = EditorUtil.getPreviewNode(); rootNode.detachChild(modelNode); } @@ -437,8 +412,8 @@ public void clear() { @JmeThread private void clearImpl() { - final JmeApplication jmeApplication = JmeApplication.getInstance(); - final Node rootNode = jmeApplication.getPreviewNode(); + var jmeApplication = JmeApplication.getInstance(); + var rootNode = jmeApplication.getPreviewNode(); rootNode.detachChild(modelNode); if (processor != null) { @@ -447,7 +422,7 @@ private void clearImpl() { } /** - * Gets image view. + * Gets the image view with a preview. * * @return the image view with a preview. */ @@ -464,24 +439,24 @@ private void clearImpl() { @JmeThread private @NotNull FrameTransferSceneProcessor prepareScene() { - final JmeApplication jmeApplication = JmeApplication.getInstance(); - final AssetManager assetManager = jmeApplication.getAssetManager(); - final Spatial sky = SkyFactory.createSky(assetManager, "graphics/textures/sky/studio.hdr", + var jmeApplication = JmeApplication.getInstance(); + var assetManager = jmeApplication.getAssetManager(); + var sky = SkyFactory.createSky(assetManager, "graphics/textures/sky/studio.hdr", SkyFactory.EnvMapType.EquirectMap); - final DirectionalLight light = new DirectionalLight(); + var light = new DirectionalLight(); light.setDirection(LIGHT_DIRECTION); - final Node cameraNode = new Node("Camera node"); - final Node rootNode = jmeApplication.getPreviewNode(); + var cameraNode = new Node("Camera node"); + var rootNode = jmeApplication.getPreviewNode(); rootNode.addControl(this); rootNode.attachChild(sky); rootNode.addLight(light); rootNode.attachChild(cameraNode); rootNode.attachChild(modelNode); - final Camera camera = jmeApplication.getPreviewCamera(); - final EditorCamera editorCamera = new EditorCamera(camera, cameraNode); + var camera = jmeApplication.getPreviewCamera(); + var editorCamera = new EditorCamera(camera, cameraNode); editorCamera.setMaxDistance(10000); editorCamera.setMinDistance(0.01F); editorCamera.setSmoothMotion(false); diff --git a/src/main/java/com/ss/editor/ui/FXConstants.java b/src/main/java/com/ss/editor/ui/FxConstants.java similarity index 88% rename from src/main/java/com/ss/editor/ui/FXConstants.java rename to src/main/java/com/ss/editor/ui/FxConstants.java index 5708eb41..6dfe52f7 100644 --- a/src/main/java/com/ss/editor/ui/FXConstants.java +++ b/src/main/java/com/ss/editor/ui/FxConstants.java @@ -5,7 +5,7 @@ * * @author JavaSaBr */ -public interface FXConstants { +public interface FxConstants { int PROPERTY_LIST_OFFSET = 17; diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java b/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java index 6a0ea272..5e0b29b4 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java @@ -9,7 +9,7 @@ import com.ss.editor.annotation.FxThread; import com.ss.editor.config.EditorConfig; import com.ss.editor.manager.ExecutorManager; -import com.ss.editor.ui.FXConstants; +import com.ss.editor.ui.FxConstants; import com.ss.editor.ui.component.asset.tree.context.menu.action.*; import com.ss.editor.ui.component.asset.tree.resource.*; import com.ss.editor.ui.util.UiUtils; @@ -194,7 +194,7 @@ public ResourceTree(@Nullable Consumer openFunction, boolean re .addListener((observable, oldValue, newValue) -> processChangedExpands(newValue)); getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); - setFixedCellSize(FXConstants.RESOURCE_TREE_CELL_HEIGHT); + setFixedCellSize(FxConstants.RESOURCE_TREE_CELL_HEIGHT); setCellFactory(param -> new ResourceTreeCell()); setOnKeyPressed(this::processKey); setShowRoot(true); @@ -616,6 +616,8 @@ private void showLoading() { @BackgroundThread private void startBackgroundFill(@NotNull Path path) { + barrier.loadChanges(); + var rootElement = createFor(path); var newRoot = new TreeItem(rootElement); newRoot.setExpanded(true); @@ -626,6 +628,8 @@ private void startBackgroundFill(@NotNull Path path) { cleanup(newRoot); } + barrier.commitChanges(); + EXECUTOR_MANAGER.addFxTask(() -> applyNewRoot(newRoot)); } @@ -636,12 +640,18 @@ private void startBackgroundFill(@NotNull Path path) { */ @FxThread private void applyNewRoot(@NotNull TreeItem newRoot) { + barrier.loadChanges(); + try { - setRoot(newRoot); + setRoot(newRoot); - var onLoadHandler = getOnLoadHandler(); - if (onLoadHandler != null) { - onLoadHandler.accept(Boolean.TRUE); + var onLoadHandler = getOnLoadHandler(); + if (onLoadHandler != null) { + onLoadHandler.accept(Boolean.TRUE); + } + + } finally { + barrier.commitChanges(); } } diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTreeCell.java b/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTreeCell.java index f7d2bea6..e0957416 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTreeCell.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTreeCell.java @@ -4,7 +4,7 @@ import static java.util.Collections.singletonList; import com.ss.editor.annotation.FxThread; import com.ss.editor.manager.FileIconManager; -import com.ss.editor.ui.FXConstants; +import com.ss.editor.ui.FxConstants; import com.ss.editor.ui.component.asset.tree.resource.FolderResourceElement; import com.ss.editor.ui.component.asset.tree.resource.LoadingResourceElement; import com.ss.editor.ui.component.asset.tree.resource.ResourceElement; @@ -161,8 +161,8 @@ protected void updateItem(@Nullable ResourceElement item, boolean empty) { @FxThread private @NotNull ProgressIndicator createIndicator() { var indicator = new ProgressIndicator(); - indicator.setMaxHeight(FXConstants.RESOURCE_TREE_CELL_HEIGHT - 2); - indicator.setMaxWidth(FXConstants.RESOURCE_TREE_CELL_HEIGHT - 2); + indicator.setMaxHeight(FxConstants.RESOURCE_TREE_CELL_HEIGHT - 2); + indicator.setMaxWidth(FxConstants.RESOURCE_TREE_CELL_HEIGHT - 2); return indicator; } diff --git a/src/main/java/com/ss/editor/ui/component/editor/area/EditorAreaComponent.java b/src/main/java/com/ss/editor/ui/component/editor/area/EditorAreaComponent.java index 104eeda4..b09b32c4 100644 --- a/src/main/java/com/ss/editor/ui/component/editor/area/EditorAreaComponent.java +++ b/src/main/java/com/ss/editor/ui/component/editor/area/EditorAreaComponent.java @@ -2,8 +2,6 @@ import static com.ss.editor.manager.FileIconManager.DEFAULT_FILE_ICON_SIZE; import static com.ss.rlib.common.util.ObjectUtils.notNull; -import com.jme3.app.state.AppStateManager; -import com.jme3x.jfx.injfx.processor.FrameTransferSceneProcessor; import com.ss.editor.JfxApplication; import com.ss.editor.JmeApplication; import com.ss.editor.Messages; @@ -11,19 +9,12 @@ import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.JmeThread; -import com.ss.editor.file.converter.FileConverter; -import com.ss.editor.file.converter.FileConverterDescription; import com.ss.editor.file.converter.FileConverterRegistry; import com.ss.editor.manager.ExecutorManager; import com.ss.editor.manager.FileIconManager; import com.ss.editor.manager.WorkspaceManager; -import com.ss.editor.model.workspace.Workspace; -import com.ss.editor.part3d.editor.Editor3DPart; import com.ss.editor.ui.component.ScreenComponent; -import com.ss.editor.ui.component.creator.FileCreator; -import com.ss.editor.ui.component.creator.FileCreatorDescription; import com.ss.editor.ui.component.creator.FileCreatorRegistry; -import com.ss.editor.ui.component.editor.EditorDescription; import com.ss.editor.ui.component.editor.EditorRegistry; import com.ss.editor.ui.component.editor.FileEditor; import com.ss.editor.ui.css.CssIds; @@ -47,10 +38,7 @@ import com.ss.rlib.common.util.dictionary.ObjectDictionary; import javafx.beans.value.ObservableValue; import javafx.collections.ListChangeListener; -import javafx.collections.ObservableList; -import javafx.collections.ObservableMap; import javafx.event.Event; -import javafx.scene.control.SingleSelectionModel; import javafx.scene.control.Tab; import javafx.scene.control.TabPane; import javafx.scene.image.ImageView; @@ -60,8 +48,6 @@ import java.nio.file.Files; import java.nio.file.Path; -import java.util.List; -import java.util.Map; /** * The component for containing editors. @@ -70,40 +56,17 @@ */ public class EditorAreaComponent extends TabPane implements ScreenComponent { - @NotNull private static final Logger LOGGER = LoggerManager.getLogger(EditorAreaComponent.class); - /** - * The constant COMPONENT_ID. - */ - @NotNull private static final String COMPONENT_ID = "EditorAreaComponent"; - - /** - * The constant KEY_EDITOR. - */ - @NotNull private static final String KEY_EDITOR = "editor"; - @NotNull private static final FileConverterRegistry FILE_CONVERTER_REGISTRY = FileConverterRegistry.getInstance(); - - @NotNull private static final FileCreatorRegistry CREATOR_REGISTRY = FileCreatorRegistry.getInstance(); - - @NotNull private static final WorkspaceManager WORKSPACE_MANAGER = WorkspaceManager.getInstance(); - - @NotNull private static final ExecutorManager EXECUTOR_MANAGER = ExecutorManager.getInstance(); - - @NotNull private static final FxEventManager FX_EVENT_MANAGER = FxEventManager.getInstance(); - - @NotNull private static final EditorRegistry EDITOR_REGISTRY = EditorRegistry.getInstance(); - - @NotNull private static final FileIconManager ICON_MANAGER = FileIconManager.getInstance(); /** @@ -113,13 +76,13 @@ public class EditorAreaComponent extends TabPane implements ScreenComponent { private final ConcurrentObjectDictionary openedEditors; /** - * The list of opening files now. + * The list of opened files. */ @NotNull private final ConcurrentArray openingFiles; /** - * The flag for ignoring changing the list of opened editors. + * True if need to ignore change events. */ private boolean ignoreOpenedFiles; @@ -133,17 +96,26 @@ public EditorAreaComponent() { getSelectionModel().selectedItemProperty() .addListener(this::switchEditor); - FX_EVENT_MANAGER.addEventHandler(RequestedOpenFileEvent.EVENT_TYPE, event -> processOpenFile((RequestedOpenFileEvent) event)); - FX_EVENT_MANAGER.addEventHandler(RequestedCreateFileEvent.EVENT_TYPE, event -> processCreateFile((RequestedCreateFileEvent) event)); - FX_EVENT_MANAGER.addEventHandler(RequestedConvertFileEvent.EVENT_TYPE, event -> processConvertFile((RequestedConvertFileEvent) event)); - FX_EVENT_MANAGER.addEventHandler(RenamedFileEvent.EVENT_TYPE, event -> processEvent((RenamedFileEvent) event)); - FX_EVENT_MANAGER.addEventHandler(MovedFileEvent.EVENT_TYPE, event -> processEvent((MovedFileEvent) event)); - FX_EVENT_MANAGER.addEventHandler(ChangedCurrentAssetFolderEvent.EVENT_TYPE, event -> processEvent((ChangedCurrentAssetFolderEvent) event)); + FX_EVENT_MANAGER.addEventHandler(RequestedOpenFileEvent.EVENT_TYPE, + event -> processOpenFile((RequestedOpenFileEvent) event)); + FX_EVENT_MANAGER.addEventHandler(RequestedCreateFileEvent.EVENT_TYPE, + event -> processCreateFile((RequestedCreateFileEvent) event)); + FX_EVENT_MANAGER.addEventHandler(RequestedConvertFileEvent.EVENT_TYPE, + event -> processConvertFile((RequestedConvertFileEvent) event)); + FX_EVENT_MANAGER.addEventHandler(RenamedFileEvent.EVENT_TYPE, + event -> processEvent((RenamedFileEvent) event)); + FX_EVENT_MANAGER.addEventHandler(MovedFileEvent.EVENT_TYPE, + event -> processEvent((MovedFileEvent) event)); + FX_EVENT_MANAGER.addEventHandler(ChangedCurrentAssetFolderEvent.EVENT_TYPE, + event -> processEvent((ChangedCurrentAssetFolderEvent) event)); } @FxThread - private void switchEditor(@NotNull final ObservableValue observable, @Nullable final Tab oldValue, - @Nullable final Tab newValue) { + private void switchEditor( + @NotNull ObservableValue observable, + @Nullable Tab oldValue, + @Nullable Tab newValue + ) { BorderPane current3DArea = null; BorderPane new3DArea = null; @@ -152,8 +124,8 @@ private void switchEditor(@NotNull final ObservableValue observab if (newValue != null) { - final ObservableMap properties = newValue.getProperties(); - final FileEditor fileEditor = (FileEditor) properties.get(KEY_EDITOR); + var properties = newValue.getProperties(); + var fileEditor = (FileEditor) properties.get(KEY_EDITOR); fileEditor.notifyShowed(); newCurrentFile = fileEditor.getEditFile(); @@ -161,14 +133,16 @@ private void switchEditor(@NotNull final ObservableValue observab } if (oldValue != null) { - final ObservableMap properties = oldValue.getProperties(); - final FileEditor fileEditor = (FileEditor) properties.get(KEY_EDITOR); + + var properties = oldValue.getProperties(); + var fileEditor = (FileEditor) properties.get(KEY_EDITOR); fileEditor.notifyHided(); + current3DArea = fileEditor.get3DArea(); } - final EditorFxScene scene = (EditorFxScene) getScene(); - final ImageView canvas = scene.getCanvas(); + var scene = (EditorFxScene) getScene(); + var canvas = scene.getCanvas(); if (new3DArea != null) { new3DArea.setCenter(canvas); @@ -177,40 +151,40 @@ private void switchEditor(@NotNull final ObservableValue observab scene.hideCanvas(); } - final Workspace workspace = notNull(WORKSPACE_MANAGER.getCurrentWorkspace()); + var workspace = notNull(WORKSPACE_MANAGER.getCurrentWorkspace()); workspace.updateCurrentEditedFile(newCurrentFile); EXECUTOR_MANAGER.addJmeTask(() -> processShowEditor(oldValue, newValue)); } /** - * Handle changing the current asset folder. + * Handle the event of changing a current asset folder. */ @FxThread - private void processEvent(@NotNull final ChangedCurrentAssetFolderEvent event) { + private void processEvent(@NotNull ChangedCurrentAssetFolderEvent event) { setIgnoreOpenedFiles(true); try { - - final ObservableList tabs = getTabs(); - tabs.clear(); - + getTabs().clear(); loadOpenedFiles(); - } finally { setIgnoreOpenedFiles(false); } } /** - * @param ignoreOpenedFiles the flag for ignoring changing the list of opened editors. + * Set true if need to ignore change events. + * + * @param ignoreOpenedFiles true if need to ignore change events. */ @FromAnyThread - private void setIgnoreOpenedFiles(final boolean ignoreOpenedFiles) { + private void setIgnoreOpenedFiles(boolean ignoreOpenedFiles) { this.ignoreOpenedFiles = ignoreOpenedFiles; } /** - * @return the flag for ignoring changing the list of opened editors. + * Return true if need to ignore change events. + * + * @return true if need to ignore change events. */ @FromAnyThread private boolean isIgnoreOpenedFiles() { @@ -218,27 +192,19 @@ private boolean isIgnoreOpenedFiles() { } /** - * Handle a renamed file. + * Handle the event of renamed file. */ @FxThread - private void processEvent(@NotNull final RenamedFileEvent event) { - - final Path prevFile = event.getPrevFile(); - final Path newFile = event.getNewFile(); - - handleMovedFiles(prevFile, newFile); + private void processEvent(@NotNull RenamedFileEvent event) { + handleMovedFiles(event.getPrevFile(), event.getNewFile()); } /** - * Handle a moved file. + * Handle the event of moved file. */ @FxThread private void processEvent(@NotNull final MovedFileEvent event) { - - final Path prevFile = event.getPrevFile(); - final Path newFile = event.getNewFile(); - - handleMovedFiles(prevFile, newFile); + handleMovedFiles(event.getPrevFile(), event.getNewFile()); } /** @@ -248,22 +214,23 @@ private void processEvent(@NotNull final MovedFileEvent event) { * @param newFile the new version of the file. */ @FxThread - private void handleMovedFiles(@NotNull final Path prevFile, @NotNull final Path newFile) { + private void handleMovedFiles(@NotNull Path prevFile, @NotNull Path newFile) { - final ConcurrentObjectDictionary openedEditors = getOpenedEditors(); - final long stamp = openedEditors.writeLock(); + var openedEditors = getOpenedEditors(); + var stamp = openedEditors.writeLock(); try { - final Array files = openedEditors.keyArray(Path.class); - for (final Path file : files) { + var files = openedEditors.keyArray(Path.class); + + for (var file : files) { if (!file.startsWith(prevFile)) { continue; } - final Tab tab = openedEditors.get(file); - final ObservableMap properties = tab.getProperties(); - final FileEditor fileEditor = (FileEditor) properties.get(KEY_EDITOR); + var tab = openedEditors.get(file); + var properties = tab.getProperties(); + var fileEditor = (FileEditor) properties.get(KEY_EDITOR); fileEditor.notifyRenamed(prevFile, newFile); if (fileEditor.isDirty()) { @@ -272,12 +239,12 @@ private void handleMovedFiles(@NotNull final Path prevFile, @NotNull final Path tab.setText(fileEditor.getFileName()); } - final Path editFile = fileEditor.getEditFile(); + var editFile = fileEditor.getEditFile(); openedEditors.remove(file); openedEditors.put(editFile, tab); - final Workspace workspace = WORKSPACE_MANAGER.getCurrentWorkspace(); + var workspace = WORKSPACE_MANAGER.getCurrentWorkspace(); if (workspace != null) { workspace.removeOpenedFile(file); @@ -294,17 +261,15 @@ private void handleMovedFiles(@NotNull final Path prevFile, @NotNull final Path * Handle the request to convert a file. */ @FxThread - private void processConvertFile(@NotNull final RequestedConvertFileEvent event) { + private void processConvertFile(@NotNull RequestedConvertFileEvent event) { - final Path file = event.getFile(); - final FileConverterDescription description = event.getDescription(); + var file = event.getFile(); + var description = event.getDescription(); + var converter = FILE_CONVERTER_REGISTRY.newCreator(description, file); - final FileConverter converter = FILE_CONVERTER_REGISTRY.newCreator(description, file); - if (converter == null) { - return; + if (converter != null) { + converter.convert(file); } - - converter.convert(file); } /** @@ -318,9 +283,9 @@ private void processConvertFile(@NotNull final RequestedConvertFileEvent event) } /** - * Get the list of opening files now. + * Get the list of opened files. * - * @return the list of opening files now. + * @return the list of opened files. */ @FromAnyThread private @NotNull ConcurrentArray getOpeningFiles() { @@ -331,39 +296,37 @@ private void processConvertFile(@NotNull final RequestedConvertFileEvent event) * Handle the request to create a file. */ @FxThread - private void processCreateFile(@NotNull final RequestedCreateFileEvent event) { + private void processCreateFile(@NotNull RequestedCreateFileEvent event) { - final Path file = event.getFile(); - final FileCreatorDescription description = event.getDescription(); + var file = event.getFile(); + var description = event.getDescription(); + var fileCreator = CREATOR_REGISTRY.newCreator(description, file); - final FileCreator fileCreator = CREATOR_REGISTRY.newCreator(description, file); - if (fileCreator == null) { - return; + if (fileCreator != null) { + fileCreator.start(file); } - - fileCreator.start(file); } /** * Handle the request to close a file editor. */ @FxThread - private void processChangeTabs(@NotNull final ListChangeListener.Change change) { + private void processChangeTabs(@NotNull ListChangeListener.Change change) { if (!change.next()) { return; } - final List removed = change.getRemoved(); + var removed = change.getRemoved(); if (removed == null || removed.isEmpty()) { return; } removed.forEach(tab -> { - final ObservableMap properties = tab.getProperties(); - final FileEditor fileEditor = (FileEditor) properties.get(KEY_EDITOR); - final Path editFile = fileEditor.getEditFile(); + var properties = tab.getProperties(); + var fileEditor = (FileEditor) properties.get(KEY_EDITOR); + var editFile = fileEditor.getEditFile(); DictionaryUtils.runInWriteLock(getOpenedEditors(), editFile, ObjectDictionary::remove); @@ -373,7 +336,7 @@ private void processChangeTabs(@NotNull final ListChangeListener.Change properties = selectedTab.getProperties(); - return (FileEditor) properties.get(KEY_EDITOR); + + var selectedTab = getSelectionModel() + .getSelectedItem(); + + if (selectedTab == null) { + return null; + } + + return (FileEditor) selectedTab.getProperties() + .get(KEY_EDITOR); } /** @@ -400,36 +369,37 @@ private void processChangeTabs(@NotNull final ListChangeListener.Change properties = prevTab.getProperties(); - final FileEditor fileEditor = (FileEditor) properties.get(KEY_EDITOR); + var fileEditor = (FileEditor) prevTab.getProperties() + .get(KEY_EDITOR); - final Array states = fileEditor.get3DStates(); + var states = fileEditor.get3DStates(); states.forEach(stateManager::detach); } if (newTab != null) { - final ObservableMap properties = newTab.getProperties(); - final FileEditor fileEditor = (FileEditor) properties.get(KEY_EDITOR); + var fileEditor = (FileEditor) newTab.getProperties() + .get(KEY_EDITOR); - final Array states = fileEditor.get3DStates(); + var states = fileEditor.get3DStates(); states.forEach(stateManager::attach); enabled = states.size() > 0; } if (sceneProcessor.isEnabled() != enabled) { - final boolean result = enabled; + var result = enabled; EXECUTOR_MANAGER.addFxTask(() -> { ThreadUtils.sleep(100); canvas.setOpacity(result ? 1D : 0D); @@ -442,21 +412,20 @@ private void processShowEditor(@Nullable final Tab prevTab, @Nullable final Tab * Handle the request to open a file. */ @FxThread - private void processOpenFile(@NotNull final RequestedOpenFileEvent event) { + private void processOpenFile(@NotNull RequestedOpenFileEvent event) { - final Path file = event.getFile(); + var file = event.getFile(); - final ConcurrentObjectDictionary openedEditors = getOpenedEditors(); - final Tab tab = DictionaryUtils.getInReadLock(openedEditors, file, ObjectDictionary::get); + var openedEditors = getOpenedEditors(); + var tab = DictionaryUtils.getInReadLock(openedEditors, file, ObjectDictionary::get); if (tab != null) { - final SingleSelectionModel selectionModel = getSelectionModel(); - selectionModel.select(tab); + getSelectionModel().select(tab); return; } - final ConcurrentArray openingFiles = getOpeningFiles(); - final long stamp = openingFiles.writeLock(); + var openingFiles = getOpeningFiles(); + var stamp = openingFiles.writeLock(); try { if (openingFiles.contains(file)) { @@ -475,19 +444,19 @@ private void processOpenFile(@NotNull final RequestedOpenFileEvent event) { } @BackgroundThread - private void processOpenFileImpl(@NotNull final RequestedOpenFileEvent event, @NotNull final Path file) { + private void processOpenFileImpl(@NotNull RequestedOpenFileEvent event, @NotNull Path file) { - final EditorFxScene scene = EditorUtil.getFxScene(); + var scene = EditorUtil.getFxScene(); FileEditor editor; try { - final EditorDescription description = event.getDescription(); + var description = event.getDescription(); editor = description == null ? EDITOR_REGISTRY.createEditorFor(file) : EDITOR_REGISTRY.createEditorFor(description, file); - } catch (final Throwable e) { + } catch (Throwable e) { EditorUtil.handleException(null, this, new Exception(e)); EXECUTOR_MANAGER.addFxTask(scene::decrementLoading); ArrayUtils.runInWriteLock(getOpeningFiles(), file, Array::fastRemove); @@ -500,17 +469,17 @@ private void processOpenFileImpl(@NotNull final RequestedOpenFileEvent event, @N return; } - final FileEditor resultEditor = editor; + var resultEditor = editor; - final JmeApplication jmeApplication = JmeApplication.getInstance(); - final long stamp = jmeApplication.asyncLock(); + var jmeApplication = JmeApplication.getInstance(); + var stamp = jmeApplication.asyncLock(); try { editor.openFile(file); - } catch (final Throwable e) { + } catch (Throwable e) { EditorUtil.handleException(null, this, new Exception(e)); ArrayUtils.runInWriteLock(getOpeningFiles(), file, Array::fastRemove); - final Workspace workspace = WORKSPACE_MANAGER.getCurrentWorkspace(); + var workspace = WORKSPACE_MANAGER.getCurrentWorkspace(); if (workspace != null) { workspace.removeOpenedFile(file); } @@ -536,28 +505,23 @@ private void processOpenFileImpl(@NotNull final RequestedOpenFileEvent event, @N * @param needShow the need show */ @FxThread - private void addEditor(@NotNull final FileEditor editor, final boolean needShow) { + private void addEditor(@NotNull FileEditor editor, boolean needShow) { - final Path editFile = editor.getEditFile(); + var editFile = editor.getEditFile(); - final Tab tab = new Tab(editor.getFileName()); + var tab = new Tab(editor.getFileName()); tab.setGraphic(new ImageView(ICON_MANAGER.getIcon(editFile, DEFAULT_FILE_ICON_SIZE))); tab.setContent(editor.getPage()); tab.setOnCloseRequest(event -> handleRequestToCloseEditor(editor, tab, event)); + tab.getProperties().put(KEY_EDITOR, editor); - final ObservableMap properties = tab.getProperties(); - properties.put(KEY_EDITOR, editor); - - editor.dirtyProperty().addListener((observable, oldValue, newValue) -> { - tab.setText(newValue == Boolean.TRUE ? "*" + editor.getFileName() : editor.getFileName()); - }); + editor.dirtyProperty().addListener((observable, oldValue, newValue) -> + tab.setText(newValue == Boolean.TRUE ? "*" + editor.getFileName() : editor.getFileName())); - final ObservableList tabs = getTabs(); - tabs.add(tab); + getTabs().add(tab); if (needShow) { - final SingleSelectionModel selectionModel = getSelectionModel(); - selectionModel.select(tab); + getSelectionModel().select(tab); } DictionaryUtils.runInWriteLock(getOpenedEditors(), editFile, tab, ObjectDictionary::put); @@ -569,24 +533,27 @@ private void addEditor(@NotNull final FileEditor editor, final boolean needShow) return; } - final Workspace workspace = WORKSPACE_MANAGER.getCurrentWorkspace(); - + var workspace = WORKSPACE_MANAGER.getCurrentWorkspace(); if (workspace != null) { workspace.addOpenedFile(editFile, editor); } } @FxThread - private void handleRequestToCloseEditor(@NotNull final FileEditor editor, @NotNull final Tab tab, - @NotNull final Event event) { + private void handleRequestToCloseEditor(@NotNull FileEditor editor, @NotNull Tab tab, @NotNull Event event) { + if (!editor.isDirty()) { return; } - final String question = Messages.EDITOR_AREA_SAVE_FILE_QUESTION.replace("%file_name%", editor.getFileName()); + var question = Messages.EDITOR_AREA_SAVE_FILE_QUESTION + .replace("%file_name%", editor.getFileName()); - final ConfirmDialog dialog = new ConfirmDialog(result -> { - if (result == null) return; + var dialog = new ConfirmDialog(result -> { + + if (result == null) { + return; + } if (result) { editor.save(fileEditor -> getTabs().remove(tab)); @@ -623,23 +590,23 @@ public void notifyFinishBuild() { @FxThread private void loadOpenedFiles() { - final Workspace workspace = WORKSPACE_MANAGER.getCurrentWorkspace(); + var workspace = WORKSPACE_MANAGER.getCurrentWorkspace(); if (workspace == null) { return; } - final Path assetFolder = workspace.getAssetFolder(); - final String editFile = workspace.getCurrentEditedFile(); + var assetFolder = workspace.getAssetFolder(); + var editFile = workspace.getCurrentEditedFile(); - final Map openedFiles = workspace.getOpenedFiles(); + var openedFiles = workspace.getOpenedFiles(); openedFiles.forEach((assetPath, editorId) -> { - final EditorDescription description = EDITOR_REGISTRY.getDescription(editorId); + var description = EDITOR_REGISTRY.getDescription(editorId); if (description == null) { return; } - final Path file = assetFolder.resolve(assetPath); + var file = assetFolder.resolve(assetPath); if (!Files.exists(file)) { return; } diff --git a/src/main/java/com/ss/editor/ui/component/editor/impl/model/ModelFileEditor.java b/src/main/java/com/ss/editor/ui/component/editor/impl/model/ModelFileEditor.java index b221006d..5fcf77ce 100644 --- a/src/main/java/com/ss/editor/ui/component/editor/impl/model/ModelFileEditor.java +++ b/src/main/java/com/ss/editor/ui/component/editor/impl/model/ModelFileEditor.java @@ -168,18 +168,18 @@ private ModelFileEditor() { @Override @FxThread - protected void doOpenFile(@NotNull final Path file) throws IOException { + protected void doOpenFile(@NotNull Path file) throws IOException { super.doOpenFile(file); - final Path assetFile = notNull(getAssetFile(file), "Asset file for " + file + " can't be null."); - final ModelKey modelKey = new ModelKey(toAssetPath(assetFile)); + var assetFile = notNull(getAssetFile(file), "Asset file for " + file + " can't be null."); + var modelKey = new ModelKey(toAssetPath(assetFile)); - final AssetManager assetManager = EditorUtil.getAssetManager(); - final Spatial model = assetManager.loadAsset(modelKey); + var assetManager = EditorUtil.getAssetManager(); + var model = assetManager.loadAsset(modelKey); MaterialUtils.cleanUpMaterialParams(model); - final ModelEditor3DPart editor3DPart = getEditor3DPart(); + var editor3DPart = getEditor3DPart(); editor3DPart.openModel(model); handleAddedObject(model); @@ -188,8 +188,8 @@ protected void doOpenFile(@NotNull final Path file) throws IOException { setIgnoreListeners(true); try { - final ComboBox fastSkyComboBox = getFastSkyComboBox(); - fastSkyComboBox.getSelectionModel().select(FAST_SKY_LIST.first()); + getFastSkyComboBox().getSelectionModel() + .select(FAST_SKY_LIST.first()); refreshTree(); diff --git a/src/main/java/com/ss/editor/ui/component/editor/impl/scene/AbstractSceneFileEditor.java b/src/main/java/com/ss/editor/ui/component/editor/impl/scene/AbstractSceneFileEditor.java index 4e7bd713..03f35805 100644 --- a/src/main/java/com/ss/editor/ui/component/editor/impl/scene/AbstractSceneFileEditor.java +++ b/src/main/java/com/ss/editor/ui/component/editor/impl/scene/AbstractSceneFileEditor.java @@ -1170,11 +1170,7 @@ protected void createToolComponents(@NotNull final EditorToolComponent container */ @FxThread protected void refreshTree() { - - final M currentModel = getCurrentModel(); - - final ModelNodeTree modelNodeTree = getModelNodeTree(); - modelNodeTree.fill(currentModel); + getModelNodeTree().fill(notNull(getCurrentModel())); } /** diff --git a/src/main/java/com/ss/editor/ui/component/painting/PaintingComponentContainer.java b/src/main/java/com/ss/editor/ui/component/painting/PaintingComponentContainer.java index f6b7d7f0..9faab248 100644 --- a/src/main/java/com/ss/editor/ui/component/painting/PaintingComponentContainer.java +++ b/src/main/java/com/ss/editor/ui/component/painting/PaintingComponentContainer.java @@ -6,7 +6,7 @@ import com.ss.editor.annotation.JmeThread; import com.ss.editor.model.editor.Editor3DProvider; import com.ss.editor.model.undo.editor.ModelChangeConsumer; -import com.ss.editor.ui.FXConstants; +import com.ss.editor.ui.FxConstants; import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; import com.ss.rlib.fx.util.FXUtils; @@ -90,11 +90,11 @@ public PaintingComponentContainer(@NotNull final ModelChangeConsumer changeConsu this.provider = provider; this.container = new VBox(); this.container.prefWidthProperty() - .bind(widthProperty().subtract(FXConstants.PROPERTY_LIST_OFFSET)); + .bind(widthProperty().subtract(FxConstants.PROPERTY_LIST_OFFSET)); final HBox horContainer = new HBox(); horContainer.prefWidthProperty() - .bind(widthProperty().subtract(FXConstants.PROPERTY_LIST_OFFSET)); + .bind(widthProperty().subtract(FxConstants.PROPERTY_LIST_OFFSET)); final Label label = new Label(Messages.PAINTING_COMPONENT_CONTAINER_TOOL + ":"); label.maxWidthProperty().bind(horContainer.widthProperty() diff --git a/src/main/java/com/ss/editor/ui/component/virtual/tree/VirtualResourceTree.java b/src/main/java/com/ss/editor/ui/component/virtual/tree/VirtualResourceTree.java index 476a8b6f..bbd3edb0 100644 --- a/src/main/java/com/ss/editor/ui/component/virtual/tree/VirtualResourceTree.java +++ b/src/main/java/com/ss/editor/ui/component/virtual/tree/VirtualResourceTree.java @@ -3,7 +3,7 @@ import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; -import com.ss.editor.ui.FXConstants; +import com.ss.editor.ui.FxConstants; import com.ss.editor.ui.component.virtual.tree.resource.FolderVirtualResourceElement; import com.ss.editor.ui.component.virtual.tree.resource.VirtualResourceElement; import com.ss.editor.ui.util.UiUtils; @@ -75,7 +75,7 @@ public VirtualResourceTree(@NotNull final Class objectsType) { this.objectsType = objectsType; getSelectionModel().setSelectionMode(SelectionMode.SINGLE); - setFixedCellSize(FXConstants.RESOURCE_TREE_CELL_HEIGHT); + setFixedCellSize(FxConstants.RESOURCE_TREE_CELL_HEIGHT); setCellFactory(param -> new VirtualResourceTreeCell()); setShowRoot(false); setFocusTraversable(true); diff --git a/src/main/java/com/ss/editor/ui/control/app/state/list/AppStateList.java b/src/main/java/com/ss/editor/ui/control/app/state/list/AppStateList.java index e16a0de3..92058467 100644 --- a/src/main/java/com/ss/editor/ui/control/app/state/list/AppStateList.java +++ b/src/main/java/com/ss/editor/ui/control/app/state/list/AppStateList.java @@ -7,7 +7,7 @@ import com.ss.editor.extension.scene.app.state.EditableSceneAppState; import com.ss.editor.extension.scene.app.state.SceneAppState; import com.ss.editor.model.undo.editor.SceneChangeConsumer; -import com.ss.editor.ui.FXConstants; +import com.ss.editor.ui.FxConstants; import com.ss.editor.ui.Icons; import com.ss.editor.ui.dialog.CreateSceneAppStateDialog; import com.ss.editor.model.undo.impl.RemoveAppStateOperation; @@ -72,7 +72,7 @@ private void createComponents() { listView.setFocusTraversable(true); listView.prefHeightProperty().bind(heightProperty()); listView.prefWidthProperty().bind(widthProperty()); - listView.setFixedCellSize(FXConstants.LIST_CELL_HEIGHT); + listView.setFixedCellSize(FxConstants.LIST_CELL_HEIGHT); final MultipleSelectionModel selectionModel = listView.getSelectionModel(); selectionModel.selectedItemProperty().addListener((observable, oldValue, newValue) -> diff --git a/src/main/java/com/ss/editor/ui/control/filter/list/FilterList.java b/src/main/java/com/ss/editor/ui/control/filter/list/FilterList.java index b62fb296..49ddd6ce 100644 --- a/src/main/java/com/ss/editor/ui/control/filter/list/FilterList.java +++ b/src/main/java/com/ss/editor/ui/control/filter/list/FilterList.java @@ -5,7 +5,7 @@ import com.ss.editor.extension.scene.filter.EditableSceneFilter; import com.ss.editor.extension.scene.filter.SceneFilter; import com.ss.editor.model.undo.editor.SceneChangeConsumer; -import com.ss.editor.ui.FXConstants; +import com.ss.editor.ui.FxConstants; import com.ss.editor.ui.Icons; import com.ss.editor.ui.dialog.CreateSceneFilterDialog; import com.ss.editor.model.undo.impl.RemoveSceneFilterOperation; @@ -70,7 +70,7 @@ private void createComponents() { listView.setFocusTraversable(true); listView.prefHeightProperty().bind(heightProperty()); listView.prefWidthProperty().bind(widthProperty()); - listView.setFixedCellSize(FXConstants.LIST_CELL_HEIGHT); + listView.setFixedCellSize(FxConstants.LIST_CELL_HEIGHT); final MultipleSelectionModel selectionModel = listView.getSelectionModel(); selectionModel.selectedItemProperty().addListener((observable, oldValue, newValue) -> diff --git a/src/main/java/com/ss/editor/ui/control/property/PropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/PropertyControl.java index 148e1262..928cd23c 100644 --- a/src/main/java/com/ss/editor/ui/control/property/PropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/PropertyControl.java @@ -173,8 +173,6 @@ public PropertyControl( } finally { setIgnoreListener(false); } - - FxUtils.addClass(this, CssClasses.ABSTRACT_PARAM_CONTROL); } /** @@ -183,7 +181,7 @@ public PropertyControl( * @return the six object consumer */ @FromAnyThread - public @NotNull ChangeHandler newChangeHandler() { + protected @NotNull ChangeHandler newChangeHandler() { return (changeConsumer, object, propName, newValue, oldValue, handler) -> { var operation = new PropertyOperation(object, propName, newValue, oldValue); @@ -506,12 +504,4 @@ protected void setIgnoreListener(boolean ignoreListener) { protected boolean isIgnoreListener() { return ignoreListener; } - - @Override - public String toString() { - return "PropertyControl{" + - "propertyName='" + propertyName + '\'' + - ", propertyValue=" + propertyValue + - "} " + super.toString(); - } } diff --git a/src/main/java/com/ss/editor/ui/control/property/PropertyEditor.java b/src/main/java/com/ss/editor/ui/control/property/PropertyEditor.java index badaf50a..9045a133 100644 --- a/src/main/java/com/ss/editor/ui/control/property/PropertyEditor.java +++ b/src/main/java/com/ss/editor/ui/control/property/PropertyEditor.java @@ -4,11 +4,11 @@ import com.ss.editor.annotation.FxThread; import com.ss.editor.extension.property.EditableProperty; import com.ss.editor.model.undo.editor.ChangeConsumer; -import com.ss.editor.ui.FXConstants; +import com.ss.editor.ui.FxConstants; import com.ss.editor.ui.control.UpdatableControl; import com.ss.editor.ui.control.property.builder.PropertyBuilderRegistry; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.fx.util.FxUtils; import javafx.scene.control.ScrollPane; import javafx.scene.layout.VBox; import org.jetbrains.annotations.NotNull; @@ -22,7 +22,6 @@ */ public class PropertyEditor extends ScrollPane { - @NotNull private static final PropertyBuilderRegistry BUILDER_REGISTRY = PropertyBuilderRegistry.getInstance(); /** @@ -71,12 +70,14 @@ public PropertyEditor(@NotNull C changeConsumer) { private void createComponents() { this.container = new VBox(); this.container.prefWidthProperty() - .bind(widthProperty().subtract(FXConstants.PROPERTY_LIST_OFFSET)); + .bind(widthProperty().subtract(FxConstants.PROPERTY_LIST_OFFSET)); var wrapper = new VBox(container); - FXUtils.addClassTo(this, CssClasses.ABSTRACT_PARAM_CONTROL_CONTAINER); - FXUtils.addClassesTo(wrapper, container, CssClasses.DEF_VBOX); + FxUtils.addClass(this, + CssClasses.PROPERTY_EDITOR) + .addClass(wrapper, container, + CssClasses.DEF_VBOX, CssClasses.PROPERTY_EDITOR_CONTAINER); setContent(wrapper); } @@ -214,7 +215,7 @@ protected boolean isNeedUpdate(@Nullable Object object) { * @param currentObject the current editable object. */ @FxThread - private void setCurrentObject(@Nullable final Object currentObject) { + private void setCurrentObject(@Nullable Object currentObject) { this.currentObject = currentObject; } diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/AbstractPropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/AbstractPropertyBuilder.java index e662e23c..abe83444 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/AbstractPropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/AbstractPropertyBuilder.java @@ -72,7 +72,7 @@ protected void buildSplitLine(@NotNull Pane pane) { FxUtils.addClass(line, CssClasses.DEF_HBOX) .addClass(container, - CssClasses.ABSTRACT_PARAM_CONTROL_CONTAINER_SPLIT_LINE); + CssClasses.PROPERTY_EDITOR_CONTAINER_SPLIT_LINE); FxUtils.addChild(pane, container); } diff --git a/src/main/java/com/ss/editor/ui/control/tree/NodeTree.java b/src/main/java/com/ss/editor/ui/control/tree/NodeTree.java index 20a73b48..fc6d54be 100644 --- a/src/main/java/com/ss/editor/ui/control/tree/NodeTree.java +++ b/src/main/java/com/ss/editor/ui/control/tree/NodeTree.java @@ -169,17 +169,17 @@ private void updateSelection(@NotNull final ObservableValue> treeView = getTreeView(); - final TreeItem> currentRoot = treeView.getRoot(); + var treeView = getTreeView(); + var currentRoot = treeView.getRoot(); if (currentRoot != null) { treeView.setRoot(null); } - final TreeNode rootElement = FACTORY_REGISTRY.createFor(object); - final TreeItem> newRoot = new TreeItem<>(rootElement); + var rootElement = FACTORY_REGISTRY.createFor(object); + var newRoot = new TreeItem>(rootElement); newRoot.setExpanded(true); fill(newRoot, false, 1); @@ -191,16 +191,16 @@ public void fill(@NotNull final Object object) { * Fill the item. */ @FxThread - private void fill(@NotNull final TreeItem> treeItem, final boolean expanded, final int level) { + private void fill(@NotNull TreeItem> treeItem, boolean expanded, int level) { treeItem.setExpanded(expanded || level == 1); - final TreeNode element = treeItem.getValue(); + var element = treeItem.getValue(); if (!element.hasChildren(this)) { return; } - final ObservableList>> items = treeItem.getChildren(); - final Array> children = element.getChildren(this); + var items = treeItem.getChildren(); + var children = element.getChildren(this); children.forEach(child -> { element.notifyChildPreAdd(child); items.add(new TreeItem<>(child)); diff --git a/src/main/java/com/ss/editor/ui/css/CssClasses.java b/src/main/java/com/ss/editor/ui/css/CssClasses.java index 6d09dee3..b35d9f76 100644 --- a/src/main/java/com/ss/editor/ui/css/CssClasses.java +++ b/src/main/java/com/ss/editor/ui/css/CssClasses.java @@ -87,9 +87,6 @@ public interface CssClasses { @NotNull String ABSTRACT_NODE_TREE_CONTAINER = "abstract-node-tree-container"; @NotNull String ABSTRACT_NODE_TREE_CELL = "abstract-node-tree-cell"; - @NotNull String ABSTRACT_PARAM_CONTROL_CONTAINER = "abstract-param-control-container"; - @NotNull String ABSTRACT_PARAM_CONTROL_CONTAINER_SPLIT_LINE = "abstract-param-control-container-split-line"; - @NotNull String ABSTRACT_PARAM_CONTROL = "abstract-param-control"; @NotNull String ABSTRACT_PARAM_EDITOR_CONTROL = "abstract-param-editor-control"; @NotNull String ABSTRACT_PARAM_CONTROL_PARAM_NAME_SINGLE_ROW = "abstract-param-control-param-name-single-row"; @NotNull String ABSTRACT_PARAM_CONTROL_PARAM_NAME = "abstract-param-control-param-name"; @@ -104,10 +101,12 @@ public interface CssClasses { @NotNull String ABSTRACT_PARAM_CONTROL_VECTOR3F_FIELD = "abstract-param-control-vector3f-field"; @NotNull String ABSTRACT_PARAM_CONTROL_LABEL_VALUE = "abstract-param-control-label-value"; @NotNull String ABSTRACT_PARAM_CONTROL_NUMBER_LABEL = "abstract-param-control-number-label"; - @NotNull String ABSTRACT_PARAM_CONTROL_INFLUENCER = "abstract-param-control-influencer"; - @NotNull String ABSTRACT_PARAM_CONTROL_INFLUENCER_ELEMENT = "abstract-param-control-influencer-element"; @NotNull String ABSTRACT_RESOURCE_PROPERTY_CONTROL = "abstract-resource-property-control"; + @NotNull String PROPERTY_EDITOR = "property-editor"; + @NotNull String PROPERTY_EDITOR_CONTAINER = "property-editor-container"; + @NotNull String PROPERTY_EDITOR_CONTAINER_SPLIT_LINE = "property-editor-container-split-line"; + @NotNull String EDITOR_SCRIPTING_COMPONENT = "editor-scripting-component"; @NotNull String GROOVY_EDITOR_COMPONENT = "groovy-editor-component"; diff --git a/src/main/java/com/ss/editor/ui/dialog/EditorDialog.java b/src/main/java/com/ss/editor/ui/dialog/EditorDialog.java index f08a0300..a7f19009 100644 --- a/src/main/java/com/ss/editor/ui/dialog/EditorDialog.java +++ b/src/main/java/com/ss/editor/ui/dialog/EditorDialog.java @@ -10,7 +10,6 @@ import com.ss.editor.annotation.FxThread; import com.ss.editor.config.EditorConfig; import com.ss.editor.ui.css.CssClasses; -import com.ss.editor.ui.css.CssColorTheme; import com.ss.editor.ui.css.CssRegistry; import com.ss.editor.ui.event.FxEventManager; import com.ss.editor.ui.scene.EditorFxScene; @@ -18,17 +17,15 @@ import com.ss.rlib.common.logging.Logger; import com.ss.rlib.common.logging.LoggerManager; import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.fx.util.FxUtils; import com.ss.rlib.fx.window.popup.dialog.AbstractPopupDialog; import javafx.application.Platform; import javafx.beans.property.ReadOnlyDoubleProperty; -import javafx.collections.ObservableList; import javafx.scene.Node; import javafx.scene.Scene; -import javafx.scene.image.Image; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import javafx.scene.layout.GridPane; -import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; import javafx.stage.Modality; import javafx.stage.Stage; @@ -48,28 +45,14 @@ */ public class EditorDialog { - /** - * The constant LOGGER. - */ - @NotNull protected static final Logger LOGGER = LoggerManager.getLogger(EditorDialog.class); - /** - * The constant FX_EVENT_MANAGER. - */ - @NotNull protected static final FxEventManager FX_EVENT_MANAGER = FxEventManager.getInstance(); - - /** - * The CSS registry. - */ - @NotNull - private static final CssRegistry CSS_REGISTRY = CssRegistry.getInstance(); + protected static final CssRegistry CSS_REGISTRY = CssRegistry.getInstance(); /** * The default dialog size. */ - @NotNull private static final Point DEFAULT_SIZE = new Point(0, 0); /** @@ -102,11 +85,11 @@ public EditorDialog() { container = new VBox(); container.setAlignment(CENTER); - final EditorConfig editorConfig = EditorConfig.getInstance(); - final CssColorTheme theme = editorConfig.getEnum(PREF_UI_THEME, PREF_DEFAULT_THEME); + var editorConfig = EditorConfig.getInstance(); + var theme = editorConfig.getEnum(PREF_UI_THEME, PREF_DEFAULT_THEME); - final Scene scene = new Scene(container); - final ObservableList stylesheets = scene.getStylesheets(); + var scene = new Scene(container); + var stylesheets = scene.getStylesheets(); stylesheets.addAll(CSS_REGISTRY.getAvailableCssFiles()); stylesheets.add(theme.getCssFile()); @@ -119,14 +102,16 @@ public EditorDialog() { dialog.setResizable(isResizable()); dialog.setScene(scene); - final Stage fxStage = EditorUtil.getFxStage(); - final ObservableList icons = dialog.getIcons(); + var fxStage = EditorUtil.getFxStage(); + var icons = dialog.getIcons(); icons.addAll(fxStage.getIcons()); configureSize(container); } /** + * Returns true if this dialog should be resizable. + * * @return true if this dialog should be resizable. */ @FromAnyThread @@ -140,28 +125,28 @@ protected boolean isResizable() { * @param root the root container. */ @FxThread - protected void createControls(@NotNull final VBox root) { - - final VBox actionsContainer = new VBox(); + protected void createControls(@NotNull VBox root) { - FXUtils.addClassTo(actionsContainer, CssClasses.DIALOG_ACTIONS_ROOT); + var actionsContainer = new VBox(); if (isGridStructure()) { - final GridPane container = new GridPane(); - FXUtils.addClassesTo(container, CssClasses.DEF_GRID_PANE, CssClasses.DIALOG_CONTENT_ROOT); + var container = new GridPane(); + FxUtils.addClass(container, CssClasses.DEF_GRID_PANE, CssClasses.DIALOG_CONTENT_ROOT); createContent(container); - FXUtils.addToPane(container, root); + FxUtils.addChild(root, container); } else { - final VBox container = new VBox(); - FXUtils.addClassesTo(container, CssClasses.DEF_VBOX, CssClasses.DIALOG_CONTENT_ROOT); + var container = new VBox(); + FxUtils.addClass(container, CssClasses.DEF_VBOX, CssClasses.DIALOG_CONTENT_ROOT); createContent(container); - FXUtils.addToPane(container, root); + FxUtils.addChild(root, container); } createActions(actionsContainer); - FXUtils.addToPane(actionsContainer, root); - FXUtils.addClassTo(root, CssClasses.DIALOG_ROOT); + FxUtils.addClass(actionsContainer, CssClasses.DIALOG_ACTIONS_ROOT) + .addClass(root, CssClasses.DIALOG_ROOT); + + FxUtils.addChild(root, actionsContainer); root.addEventHandler(KeyEvent.KEY_RELEASED, this::processKey); } @@ -202,7 +187,7 @@ protected void createControls(@NotNull final VBox root) { * @param container the root container. */ @FxThread - protected void configureSize(@NotNull final VBox container) { + protected void configureSize(@NotNull VBox container) { configureSize(container, getSize()); } @@ -212,7 +197,7 @@ protected void configureSize(@NotNull final VBox container) { * @param size the size. */ @FxThread - public void configureSize(@NotNull final Point size) { + public void configureSize(@NotNull Point size) { configureSize(container, size); } @@ -223,12 +208,12 @@ public void configureSize(@NotNull final Point size) { * @param size the size. */ @FxThread - private void configureSize(@NotNull final VBox container, @NotNull final Point size) { + private void configureSize(@NotNull VBox container, @NotNull Point size) { - final Stage dialog = getDialog(); + var dialog = getDialog(); - final double width = size.getX(); - final double height = size.getY(); + var width = size.getX(); + var height = size.getY(); if (width >= 1D) { FXUtils.setFixedWidth(container, width); @@ -244,9 +229,9 @@ private void configureSize(@NotNull final VBox container, @NotNull final Point s } /** - * Gets container. + * Get the content container. * - * @return The content container. + * @return the content container. */ @FromAnyThread protected @NotNull VBox getContainer() { @@ -259,7 +244,7 @@ private void configureSize(@NotNull final VBox container, @NotNull final Point s * @param size the size of the dialog. */ @FxThread - public void updateSize(@NotNull final Point size) { + public void updateSize(@NotNull Point size) { configureSize(getContainer(), size); } @@ -274,7 +259,7 @@ public void updateSize(@NotNull final Point size) { * @param event the event */ @FxThread - protected void processKey(@NotNull final KeyEvent event) { + protected void processKey(@NotNull KeyEvent event) { event.consume(); if (event.getCode() == KeyCode.ESCAPE) { hide(); @@ -287,7 +272,7 @@ protected void processKey(@NotNull final KeyEvent event) { * @param owner the owner. */ @FxThread - public void show(@NotNull final Node owner) { + public void show(@NotNull Node owner) { show(owner.getScene().getWindow()); } @@ -305,13 +290,13 @@ public void show() { * @param owner the owner. */ @FxThread - public void show(@NotNull final Window owner) { + public void show(@NotNull Window owner) { - final Scene scene = owner.getScene(); + var scene = owner.getScene(); if (scene instanceof EditorFxScene) { - final EditorFxScene editorFxScene = (EditorFxScene) scene; - final StackPane container = editorFxScene.getContainer(); + var editorFxScene = (EditorFxScene) scene; + var container = editorFxScene.getContainer(); container.setFocusTraversable(false); } @@ -344,15 +329,15 @@ public void show(@NotNull final Window owner) { @FxThread public void hide() { - final Duration duration = Duration.between(showedTime, LocalTime.now()); - final int seconds = (int) duration.getSeconds(); + var duration = Duration.between(showedTime, LocalTime.now()); + var seconds = (int) duration.getSeconds(); - final Window window = dialog.getOwner(); - final Scene scene = window.getScene(); + var window = dialog.getOwner(); + var scene = window.getScene(); if (scene instanceof EditorFxScene) { - final EditorFxScene editorFxScene = (EditorFxScene) scene; - final StackPane container = editorFxScene.getContainer(); + var editorFxScene = (EditorFxScene) scene; + var container = editorFxScene.getContainer(); container.setFocusTraversable(true); } @@ -374,7 +359,7 @@ public void hide() { * @param root the root */ @FxThread - protected void createContent(@NotNull final VBox root) { + protected void createContent(@NotNull VBox root) { } /** @@ -383,7 +368,7 @@ protected void createContent(@NotNull final VBox root) { * @param root the root */ @FxThread - protected void createContent(@NotNull final GridPane root) { + protected void createContent(@NotNull GridPane root) { } /** @@ -402,7 +387,7 @@ protected boolean isGridStructure() { * @param root the root */ @FxThread - protected void createActions(@NotNull final VBox root) { + protected void createActions(@NotNull VBox root) { } /** @@ -421,7 +406,7 @@ protected void createActions(@NotNull final VBox root) { * @param title the new title. */ @FxThread - public void setTitleText(@NotNull final String title) { + public void setTitleText(@NotNull String title) { dialog.setTitle(title); } } diff --git a/src/main/java/com/ss/editor/ui/dialog/SettingsDialog.java b/src/main/java/com/ss/editor/ui/dialog/SettingsDialog.java index dc05446f..2c943fe1 100644 --- a/src/main/java/com/ss/editor/ui/dialog/SettingsDialog.java +++ b/src/main/java/com/ss/editor/ui/dialog/SettingsDialog.java @@ -6,10 +6,6 @@ import static com.ss.rlib.common.util.ClassUtils.unsafeCast; import static com.ss.rlib.common.util.ObjectUtils.notNull; import static com.ss.rlib.common.util.array.ArrayCollectors.toArray; -import com.jme3.asset.AssetManager; -import com.jme3.post.filters.FXAAFilter; -import com.jme3.post.filters.ToneMapFilter; -import com.jme3x.jfx.injfx.processor.FrameTransferSceneProcessor; import com.ss.editor.JfxApplication; import com.ss.editor.JmeApplication; import com.ss.editor.Messages; @@ -26,13 +22,13 @@ import com.ss.editor.plugin.api.settings.SettingsProviderRegistry; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.fx.util.FXUtils; import com.ss.rlib.common.util.StringUtils; import com.ss.rlib.common.util.VarTable; import com.ss.rlib.common.util.array.Array; import com.ss.rlib.common.util.array.ArrayFactory; import com.ss.rlib.common.util.dictionary.DictionaryFactory; -import com.ss.rlib.common.util.dictionary.ObjectDictionary; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.fx.util.FxUtils; import javafx.application.Platform; import javafx.scene.control.Button; import javafx.scene.control.Label; @@ -52,13 +48,9 @@ */ public class SettingsDialog extends EditorDialog { - @NotNull private static final Point DIALOG_SIZE = new Point(-1, -1); - @NotNull private static final ExecutorManager EXECUTOR_MANAGER = ExecutorManager.getInstance(); - - @NotNull private static final SettingsProviderRegistry SETTINGS_REGISTRY = SettingsProviderRegistry.getInstance(); /** @@ -86,7 +78,7 @@ public SettingsDialog() { @Override @FxThread - protected void createContent(@NotNull final VBox root) { + protected void createContent(@NotNull VBox root) { super.createContent(root); vars = VarTable.newInstance(); @@ -94,49 +86,59 @@ protected void createContent(@NotNull final VBox root) { messageLabel = new Label(); - final ObjectDictionary> categoryToSettings = DictionaryFactory.newObjectDictionary(); - final Array definitions = SETTINGS_REGISTRY.getDefinitions(); - final Array categories = definitions.stream() + var categoryToSettings = DictionaryFactory.>newObjectDictionary(); + + var definitions = SETTINGS_REGISTRY.getDefinitions(); + var categories = definitions.stream() .map(SettingsPropertyDefinition::getCategory) - .distinct().sorted() + .distinct() + .sorted() .collect(toArray(SettingsCategory.class)); - for (final SettingsPropertyDefinition definition : definitions) { - categoryToSettings.get(definition.getCategory(), cat -> ArrayFactory.newArray(SettingsPropertyDefinition.class)) + for (var definition : definitions) { + categoryToSettings.get(definition.getCategory(), cat -> newCategoryArray()) .add(definition); } - final TabPane tabPane = new TabPane(); + var tabPane = new TabPane(); tabPane.prefWidthProperty().bind(root.widthProperty()); tabPane.prefHeightProperty().bind(heightProperty()); - messageLabel.prefWidthProperty().bind(tabPane.widthProperty()); + messageLabel.prefWidthProperty() + .bind(tabPane.widthProperty()); + + for (var category : categories) { - for (final SettingsCategory category : categories) { + var properties = notNull(categoryToSettings.get(category)); - final Array properties = notNull(categoryToSettings.get(category)); - final Array> tabControls = properties.stream() + Array> tabControls = properties.stream() .map(definition -> build(vars, definition, this::validate)) .collect(unsafeCast(toArray(PropertyEditorControl.class))); controls.addAll(tabControls); - final VBox container = new VBox(); - container.prefWidthProperty().bind(tabPane.widthProperty()); + var container = new VBox(); + container.prefWidthProperty() + .bind(tabPane.widthProperty()); - final Tab tab = new Tab(category.getLabel()); + var tab = new Tab(category.getLabel()); tab.setClosable(false); tab.setContent(container); - tabControls.forEach(container.getChildren(), (control, nodes) -> nodes.add(control)); + tabControls.forEach(container.getChildren(), + (control, nodes) -> nodes.add(control)); - FXUtils.addClassesTo(container, CssClasses.SETTINGS_DIALOG_CONTAINER); + FxUtils.addClass(container, CssClasses.SETTINGS_DIALOG_CONTAINER); tabPane.getTabs().add(tab); } - FXUtils.addClassTo(messageLabel, CssClasses.SETTINGS_DIALOG_MESSAGE_LABEL); - FXUtils.addToPane(tabPane, messageLabel, root); + FxUtils.addClass(messageLabel, CssClasses.SETTINGS_DIALOG_MESSAGE_LABEL); + FxUtils.addChild(root, tabPane, messageLabel); + } + + private @NotNull Array newCategoryArray() { + return ArrayFactory.newArray(SettingsPropertyDefinition.class); } /** @@ -175,18 +177,18 @@ protected void createContent(@NotNull final VBox root) { @FxThread private void validate() { - final Array> controls = getControls(); + var controls = getControls(); if (controls != null) { controls.forEach(PropertyEditorControl::checkDependency); } - final PropertyEditorControl requiredRestart = controls == null ? null : controls.search(control -> { - final String propertyId = control.getPropertyId(); - final SettingsProviderRegistry registry = SettingsProviderRegistry.getInstance(); + var requiredRestart = controls == null ? null : controls.search(control -> { + var propertyId = control.getPropertyId(); + var registry = SettingsProviderRegistry.getInstance(); return registry.isRequiredRestart(propertyId) && control.isNotDefault(); }); - final Label messageLabel = getMessageLabel(); + var messageLabel = getMessageLabel(); if (requiredRestart != null) { messageLabel.setText(Messages.SETTINGS_DIALOG_MESSAGE); @@ -197,23 +199,22 @@ private void validate() { @Override @FxThread - protected void createActions(@NotNull final VBox root) { + protected void createActions(@NotNull VBox root) { super.createActions(root); - final HBox container = new HBox(); + var container = new HBox(); - final Button okButton = new Button(Messages.SIMPLE_DIALOG_BUTTON_OK); + var okButton = new Button(Messages.SIMPLE_DIALOG_BUTTON_OK); okButton.setOnAction(event -> processOk()); - final Button cancelButton = new Button(Messages.SIMPLE_DIALOG_BUTTON_CLOSE); + var cancelButton = new Button(Messages.SIMPLE_DIALOG_BUTTON_CLOSE); cancelButton.setOnAction(event -> hide()); - FXUtils.addClassTo(okButton, cancelButton, CssClasses.DIALOG_BUTTON); - FXUtils.addClassTo(container, CssClasses.DEF_HBOX); + FxUtils.addClass(okButton, cancelButton, CssClasses.DIALOG_BUTTON) + .addClass(container, CssClasses.DEF_HBOX); - FXUtils.addToPane(okButton, container); - FXUtils.addToPane(cancelButton, container); - FXUtils.addToPane(container, root); + FxUtils.addChild(container, okButton, cancelButton) + .addChild(root, container); } /** @@ -222,48 +223,51 @@ protected void createActions(@NotNull final VBox root) { @FxThread private void processOk() { - final Array> controls = getControls(); + var controls = getControls(); if (controls == null) { throw new RuntimeException("Controls weren't initialized."); } - final EditorConfig editorConfig = EditorConfig.getInstance(); - final ObjectDictionary values = getVars().getValues(); + var editorConfig = EditorConfig.getInstance(); + + var values = getVars().getValues(); values.forEach(editorConfig::set); + editorConfig.save(); - final PropertyEditorControl requiredRestart = controls.search(control -> { - final String propertyId = control.getPropertyId(); - final SettingsProviderRegistry registry = SettingsProviderRegistry.getInstance(); + var requiredRestart = controls.search(control -> { + var propertyId = control.getPropertyId(); + var registry = SettingsProviderRegistry.getInstance(); return registry.isRequiredRestart(propertyId) && control.isNotDefault(); }); - final PropertyEditorControl requiredUpdateClasspath = controls.search(control -> { - final String propertyId = control.getPropertyId(); - final SettingsProviderRegistry registry = SettingsProviderRegistry.getInstance(); + var requiredUpdateClasspath = controls.search(control -> { + var propertyId = control.getPropertyId(); + var registry = SettingsProviderRegistry.getInstance(); return registry.isRequiredUpdateClasspath(propertyId) && control.isNotDefault(); }); - final PropertyEditorControl reshape3DView = controls.search(control -> { - final String propertyId = control.getPropertyId(); - final SettingsProviderRegistry registry = SettingsProviderRegistry.getInstance(); + var reshape3DView = controls.search(control -> { + var propertyId = control.getPropertyId(); + var registry = SettingsProviderRegistry.getInstance(); return registry.isRequiredReshape3DView(propertyId) && control.isNotDefault(); }); if (reshape3DView != null) { - final JfxApplication jfxApplication = JfxApplication.getInstance(); - final FrameTransferSceneProcessor sceneProcessor = jfxApplication.getSceneProcessor(); + var jfxApplication = JfxApplication.getInstance(); + var sceneProcessor = jfxApplication.getSceneProcessor(); sceneProcessor.reshape(); } EXECUTOR_MANAGER.addJmeTask(() -> { - final JmeApplication jmeApplication = JmeApplication.getInstance(); - final SceneEditor3DPart sceneEditor3DPart = jmeApplication.getStateManager() + var jmeApplication = JmeApplication.getInstance(); + var sceneEditor3DPart = jmeApplication.getStateManager() .getState(SceneEditor3DPart.class); - final ToneMapFilter filter = jmeApplication.getToneMapFilter(); - filter.setWhitePoint(editorConfig.getVector3f(PREF_FILTER_TONEMAP_WHITE_POINT, PREF_DEFAULT_TONEMAP_WHITE_POINT)); + var filter = jmeApplication.getToneMapFilter(); + filter.setWhitePoint(editorConfig.getVector3f(PREF_FILTER_TONEMAP_WHITE_POINT, + PREF_DEFAULT_TONEMAP_WHITE_POINT)); if (sceneEditor3DPart != null) { return; @@ -271,20 +275,20 @@ private void processOk() { filter.setEnabled(editorConfig.getBoolean(PREF_FILTER_TONEMAP, PREF_DEFAULT_TONEMAP_FILTER)); - final FXAAFilter fxaaFilter = jmeApplication.getFXAAFilter(); + var fxaaFilter = jmeApplication.getFXAAFilter(); fxaaFilter.setEnabled(editorConfig.getBoolean(PREF_FILTER_FXAA, PREF_DEFAULT_FXAA_FILTER)); }); if (requiredUpdateClasspath != null) { - final ClasspathManager classpathManager = ClasspathManager.getInstance(); + var classpathManager = ClasspathManager.getInstance(); classpathManager.reload(); - final AssetManager assetManager = EditorUtil.getAssetManager(); + var assetManager = EditorUtil.getAssetManager(); assetManager.clearCache(); } - final ResourceManager resourceManager = ResourceManager.getInstance(); + var resourceManager = ResourceManager.getInstance(); resourceManager.updateAdditionalEnvs(); if (requiredRestart != null) { diff --git a/src/main/java/com/ss/editor/ui/dialog/geometry/lod/GenerateLodLevelsDialog.java b/src/main/java/com/ss/editor/ui/dialog/geometry/lod/GenerateLodLevelsDialog.java index 832b9f97..70068aff 100644 --- a/src/main/java/com/ss/editor/ui/dialog/geometry/lod/GenerateLodLevelsDialog.java +++ b/src/main/java/com/ss/editor/ui/dialog/geometry/lod/GenerateLodLevelsDialog.java @@ -1,6 +1,6 @@ package com.ss.editor.ui.dialog.geometry.lod; -import static com.ss.editor.ui.FXConstants.DIALOG_LIST_WIDTH_PERCENT; +import static com.ss.editor.ui.FxConstants.DIALOG_LIST_WIDTH_PERCENT; import static com.ss.rlib.common.util.ObjectUtils.notNull; import static javafx.collections.FXCollections.observableArrayList; import com.jme3.scene.Geometry; @@ -11,7 +11,7 @@ import com.ss.editor.annotation.FxThread; import com.ss.editor.manager.ExecutorManager; import com.ss.editor.model.undo.editor.ChangeConsumer; -import com.ss.editor.ui.FXConstants; +import com.ss.editor.ui.FxConstants; import com.ss.editor.ui.Icons; import com.ss.editor.ui.control.property.operation.PropertyOperation; import com.ss.editor.ui.control.tree.NodeTree; @@ -193,7 +193,7 @@ protected void createContent(@NotNull final VBox root) { levelsList.prefWidthProperty().bind(widthProperty().multiply(DIALOG_LIST_WIDTH_PERCENT)); levelsList.maxWidthProperty().bind(widthProperty().multiply(DIALOG_LIST_WIDTH_PERCENT)); levelsList.getItems().addListener((ListChangeListener) c -> updateButtonOk()); - levelsList.setFixedCellSize(FXConstants.LIST_CELL_HEIGHT); + levelsList.setFixedCellSize(FxConstants.LIST_CELL_HEIGHT); FXUtils.addToPane(levelsList, root); diff --git a/src/main/java/com/ss/editor/ui/dialog/plugin/PluginsDialog.java b/src/main/java/com/ss/editor/ui/dialog/plugin/PluginsDialog.java index fff66dc2..74f7cb6b 100644 --- a/src/main/java/com/ss/editor/ui/dialog/plugin/PluginsDialog.java +++ b/src/main/java/com/ss/editor/ui/dialog/plugin/PluginsDialog.java @@ -9,7 +9,7 @@ import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.manager.PluginManager; import com.ss.editor.plugin.EditorPlugin; -import com.ss.editor.ui.FXConstants; +import com.ss.editor.ui.FxConstants; import com.ss.editor.ui.Icons; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.dialog.AbstractSimpleEditorDialog; @@ -109,7 +109,7 @@ protected void createContent(@NotNull final GridPane root) { pluginListView = new ListView<>(); pluginListView.setCellFactory(param -> new PluginListCell()); - pluginListView.setFixedCellSize(FXConstants.LIST_CELL_HEIGHT); + pluginListView.setFixedCellSize(FxConstants.LIST_CELL_HEIGHT); pluginListView.prefWidthProperty().bind(root.widthProperty().divide(2)); pluginListView.prefHeightProperty().bind(root.heightProperty()); diff --git a/src/main/java/com/ss/editor/ui/scene/EditorFxScene.java b/src/main/java/com/ss/editor/ui/scene/EditorFxScene.java index 1446747b..4cfd7c6e 100644 --- a/src/main/java/com/ss/editor/ui/scene/EditorFxScene.java +++ b/src/main/java/com/ss/editor/ui/scene/EditorFxScene.java @@ -2,17 +2,17 @@ import static com.ss.editor.ui.util.UiUtils.fillComponents; import static com.ss.rlib.common.util.ClassUtils.unsafeCast; -import com.jme3x.jfx.injfx.input.JFXMouseInput; +import com.jme3.jfx.injfx.input.JfxMouseInput; import com.ss.editor.annotation.FxThread; import com.ss.editor.manager.ExecutorManager; import com.ss.editor.manager.InitializationManager; import com.ss.editor.ui.component.ScreenComponent; import com.ss.editor.ui.css.CssIds; -import com.ss.rlib.fx.util.FXUtils; import com.ss.rlib.common.util.StringUtils; import com.ss.rlib.common.util.array.Array; import com.ss.rlib.common.util.array.ArrayFactory; -import javafx.collections.ObservableList; +import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.fx.util.FxUtils; import javafx.scene.Group; import javafx.scene.Node; import javafx.scene.Scene; @@ -33,7 +33,6 @@ */ public class EditorFxScene extends Scene { - @NotNull private static final ExecutorManager EXECUTOR_MANAGER = ExecutorManager.getInstance(); /** @@ -90,7 +89,7 @@ public EditorFxScene(@NotNull final Group root) { this.canvas = new EditorFxImageView(); this.canvas.setMouseTransparent(true); this.canvas.getProperties() - .put(JFXMouseInput.PROP_USE_LOCAL_COORDS, true); + .put(JfxMouseInput.PROP_USE_LOCAL_COORDS, true); this.loadingCount = new AtomicInteger(); this.components = ArrayFactory.newArraySet(ScreenComponent.class); @@ -103,12 +102,12 @@ public EditorFxScene(@NotNull final Group root) { this.loadingLayer.setId(CssIds.EDITOR_LOADING_LAYER); this.loadingLayer.setVisible(false); - final Pane background = new Pane(); + var background = new Pane(); background.setId(CssIds.ROOT); - FXUtils.addDebugBorderTo(canvas); + // FxUtils.addDebugBorderTo(canvas); - root.getChildren().addAll(hideLayer, background, container, loadingLayer); + FxUtils.addChild(root, hideLayer, background, container, loadingLayer); FXUtils.bindFixedWidth(background, widthProperty()); FXUtils.bindFixedHeight(background, heightProperty()); @@ -137,8 +136,10 @@ public EditorFxScene(@NotNull final Group root) { @FxThread public void hideCanvas() { - final ObservableList children = hideLayer.getChildren(); - if (children.contains(canvas)) return; + var children = hideLayer.getChildren(); + if (children.contains(canvas)) { + return; + } children.add(canvas); } @@ -151,14 +152,14 @@ public void hideCanvas() { * @return the component or null. */ @FxThread - public @Nullable T findComponent(@NotNull final String id) { - final Array components = getComponents(); + public @Nullable T findComponent(@NotNull String id) { + var components = getComponents(); return unsafeCast(components.search(id, (component, toCheck) -> StringUtils.equals(toCheck, component.getComponentId()))); } /** - * Gets components. + * Gets the list of components. * * @return the list of components. */ @@ -168,7 +169,7 @@ public void hideCanvas() { } /** - * Get the container. + * Get the container of this scene. * * @return the container of this scene. */ @@ -224,16 +225,16 @@ public synchronized void decrementLoading() { private void showLoading() { focused = getFocusOwner(); - final VBox loadingLayer = getLoadingLayer(); + var loadingLayer = getLoadingLayer(); loadingLayer.setVisible(true); loadingLayer.toFront(); progressIndicator = new ProgressIndicator(ProgressIndicator.INDETERMINATE_PROGRESS); progressIndicator.setId(CssIds.EDITOR_LOADING_PROGRESS); - FXUtils.addToPane(progressIndicator, loadingLayer); + FxUtils.addChild(loadingLayer, progressIndicator); - final StackPane container = getContainer(); + var container = getContainer(); container.setDisable(true); } @@ -243,13 +244,13 @@ private void showLoading() { @FxThread private void hideLoading() { - final VBox loadingLayer = getLoadingLayer(); + var loadingLayer = getLoadingLayer(); loadingLayer.setVisible(false); loadingLayer.getChildren().clear(); progressIndicator = null; - final StackPane container = getContainer(); + var container = getContainer(); container.setDisable(false); if (focused != null) { @@ -266,11 +267,11 @@ private void hideLoading() { @FxThread public void notifyFinishBuild() { - final Array components = getComponents(); + var components = getComponents(); fillComponents(components, getContainer()); components.forEach(ScreenComponent::notifyFinishBuild); - final InitializationManager initializationManager = InitializationManager.getInstance(); + var initializationManager = InitializationManager.getInstance(); initializationManager.onFinishLoading(); } } diff --git a/src/main/java/com/ss/editor/ui/util/UiUtils.java b/src/main/java/com/ss/editor/ui/util/UiUtils.java index f2d332f4..ef4d2d39 100644 --- a/src/main/java/com/ss/editor/ui/util/UiUtils.java +++ b/src/main/java/com/ss/editor/ui/util/UiUtils.java @@ -103,8 +103,12 @@ public String getName() { for (var control : controls) { control.focusedProperty().addListener(listener); + control.addEventHandler(MouseEvent.MOUSE_RELEASED, event -> control.requestFocus()); } + focused.setValue(Arrays.stream(controls) + .anyMatch(Node::isFocused)); + return focused; } diff --git a/src/main/resources/ui/css/custom_classes.css b/src/main/resources/ui/css/custom_classes.css index 0c775295..efecd8bb 100644 --- a/src/main/resources/ui/css/custom_classes.css +++ b/src/main/resources/ui/css/custom_classes.css @@ -699,27 +699,40 @@ /******************************************************************************* * * - * Abstract Property Component * + * Property Editor * * * ******************************************************************************/ -.abstract-param-control-container { +.property-editor { +} + +.property-editor-container { -fx-alignment: top-center; - -fx-padding: 2px 6px 4px 4px; + -fx-padding: 2px 2px 2px 2px; + -fx-spacing: 2px; } -.abstract-param-control-container-split-line { +.property-editor-container-split-line { -fx-padding: 6px 0px 6px 0px; } -.abstract-param-control-container-split-line > .hbox { +.property-editor-container-split-line > .hbox { + -fx-border-color: -var-border-color transparent transparent transparent, transparent transparent transparent transparent; + -fx-border-insets: 0, 1 0 0 0; -fx-border-style: none; -fx-padding: 0px; } + +/******************************************************************************* + * * + * Abstract Property Component * + * * + ******************************************************************************/ + .abstract-param-control { -fx-padding: 1px 0px 1px 0px; -fx-spacing: 2px; @@ -811,39 +824,6 @@ -fx-max-width: -fx-min-width; } -.abstract-param-control-influencer-element { - -fx-spacing: 2px; - -fx-padding: 0px; -} - -.abstract-param-control-influencer-element > .hbox { - -fx-spacing: 2px; -} - -.abstract-param-control-influencer { - -fx-padding: 4px 0px 0px 0px; - -fx-alignment: top-center; - -fx-spacing: 4px; -} - -.abstract-param-control-influencer > .vbox { - -fx-spacing: 2px; -} - -.abstract-param-control-influencer > .hbox { - -fx-alignment: center; - -fx-padding: 4px 0px 0px 0px; -} - -.abstract-param-control-influencer > .hbox > .button { - -fx-min-height: -var-default-toolbar-button-size; - -fx-pref-height: -fx-min-height; - -fx-max-height: -fx-min-height; - -fx-min-width: -var-default-toolbar-button-size; - -fx-pref-width: -fx-min-width; - -fx-max-width: -fx-min-width; -} - /******************************************************************************* * * * Editor Scripting Component * From f92bad78dbf7510b511ef68ecb329a7d0b5a9340 Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Tue, 15 May 2018 08:00:12 +0300 Subject: [PATCH 36/49] updated spawn tool control. --- build.gradle | 2 +- src/main/java/com/ss/editor/Messages.java | 67 +++-- .../painting/spawn/SpawnToolControl.java | 273 +++++++++++++----- .../api/property/PropertyDefinition.java | 64 ++-- .../AssetResourcePropertyEditorControl.java | 22 +- .../control/AwtFontPropertyEditorControl.java | 2 +- .../ClasspathResourcePropertyControl.java | 29 +- .../control/EnumPropertyEditorControl.java | 48 +-- .../ExternalFileResourcePropertyControl.java | 4 +- .../FileAssetResourcePropertyControl.java | 4 +- .../control/FloatPropertyEditorControl.java | 2 +- .../FolderAssetResourcePropertyControl.java | 8 +- .../control/IntegerPropertyEditorControl.java | 2 +- .../ObjectFromListPropertyEditorControl.java | 2 +- .../control/PropertyEditorControl.java | 48 +-- .../control/PropertyEditorControlFactory.java | 8 +- .../ResourcePropertyEditorControl.java | 93 +++--- .../SpatialAssetResourcePropertyControl.java | 41 +-- .../StringFromListPropertyEditorControl.java | 2 +- .../control/StringPropertyEditorControl.java | 2 +- .../Vector3fPropertyEditorControl.java | 76 +++-- .../component/painting/PaintingComponent.java | 3 +- .../impl/AbstractPaintingComponent.java | 82 +++--- .../AbstractPaintingStateWithEditorTool.java | 8 +- .../property/PaintingPropertyDefinition.java | 10 +- .../PropertiesBasedPaintingComponent.java | 115 ++++++-- .../spawn/SpawnPaintingComponent.java | 96 +++--- .../SpawnPaintingStateWithEditorTool.java | 88 +++++- .../terrain/TerrainPaintingComponent.java | 30 +- .../terrain/paint/TextureLayerCell.java | 6 +- .../property/impl/EnumPropertyControl.java | 2 +- .../property/impl/FloatPropertyControl.java | 2 +- .../property/impl/IntegerPropertyControl.java | 2 +- .../impl/LayerModelPropertyControl.java | 2 +- .../impl/LodLevelPropertyControl.java | 2 +- .../impl/QuaternionPropertyControl.java | 2 +- .../impl/StringBasedArrayPropertyControl.java | 2 +- .../property/impl/StringPropertyControl.java | 2 +- .../impl/Vector2fPropertyControl.java | 2 +- .../impl/Vector3fPropertyControl.java | 4 +- .../java/com/ss/editor/ui/css/CssClasses.java | 10 +- .../editor/ui/dialog/sky/CreateSkyDialog.java | 2 +- .../java/com/ss/editor/util/EditorUtil.java | 37 ++- .../resources/messages/messages.properties | 33 +-- .../resources/messages/messages_de.properties | 33 +-- .../resources/messages/messages_fr.properties | 34 +-- .../resources/messages/messages_ru.properties | 33 +-- .../messages/messages_zh_CN.properties | 33 +-- src/main/resources/ui/css/base.css | 1 + src/main/resources/ui/css/custom_classes.css | 52 ++-- 50 files changed, 950 insertions(+), 577 deletions(-) diff --git a/build.gradle b/build.gradle index 31a4ffdc..cd47cc20 100644 --- a/build.gradle +++ b/build.gradle @@ -56,7 +56,7 @@ ext.applicationMainClass = "com.ss.editor.JfxApplication" ext.applicationVendor = "javasabr@gmail.com" ext.applicationTitle = "jMonkeyBuilder" ext.jmeVersion = "develop-SNAPSHOT" -ext.jmbExtVersion = "2.2.0" +ext.jmbExtVersion = "2.3.1" ext.jme3_xbuf_version = '0.9.1' ext.junitPlatformVersion = "1.0.0" ext.junitJupiterVersion = "5.0.0" diff --git a/src/main/java/com/ss/editor/Messages.java b/src/main/java/com/ss/editor/Messages.java index 82e7ff49..22305037 100644 --- a/src/main/java/com/ss/editor/Messages.java +++ b/src/main/java/com/ss/editor/Messages.java @@ -475,6 +475,23 @@ public class Messages { public static final String MODEL_PROPERTY_COLOR_SPACE; public static final String MODEL_PROPERTY_LANGUAGE; public static final String MODEL_PROPERTY_TEXTURE; + public static final String MODEL_PROPERTY_BRUSH_SIZE; + public static final String MODEL_PROPERTY_BRUSH_POWER; + public static final String MODEL_PROPERTY_SMOOTHLY; + public static final String MODEL_PROPERTY_LIMITED; + public static final String MODEL_PROPERTY_USE_MARKER; + public static final String MODEL_PROPERTY_ROUGHNESS; + public static final String MODEL_PROPERTY_FREQUENCY; + public static final String MODEL_PROPERTY_LACUNARITY; + public static final String MODEL_PROPERTY_OCTAVES; + public static final String MODEL_PROPERTY_MIN_SCALE; + public static final String MODEL_PROPERTY_MAX_SCALE; + public static final String MODEL_PROPERTY_PADDING; + public static final String MODEL_PROPERTY_TRI_PLANAR; + public static final String MODEL_PROPERTY_SHININESS; + public static final String MODEL_PROPERTY_MODEL; + public static final String MODEL_PROPERTY_METHOD; + public static final String MATERIAL_MODEL_PROPERTY_CONTROL_NO_TEXTURE; public static final String MATERIAL_MODEL_PROPERTY_CONTROL_TEXTURE_SETTINGS; @@ -636,23 +653,6 @@ public class Messages { public static final String CREATE_PARTICLE_EMITTER_TORUS_SHAPE_DIALOG_TITLE; public static final String CREATE_PARTICLE_EMITTER_TRIANGLE_SHAPE_DIALOG_TITLE; - public static final String PAINTING_COMPONENT_BRUSH_SIZE; - public static final String PAINTING_COMPONENT_BRUSH_POWER; - public static final String PAINTING_COMPONENT_SMOOTHLY; - public static final String PAINTING_COMPONENT_LIMITED; - public static final String PAINTING_COMPONENT_USE_MARKER; - public static final String PAINTING_COMPONENT_LEVEL; - public static final String PAINTING_COMPONENT_ROUGHNESS; - public static final String PAINTING_COMPONENT_FREQUENCY; - public static final String PAINTING_COMPONENT_LACUNARITY; - public static final String PAINTING_COMPONENT_OCTAVES; - public static final String PAINTING_COMPONENT_SCALE; - public static final String PAINTING_COMPONENT_TRI_PLANAR; - public static final String PAINTING_COMPONENT_SHININESS; - public static final String PAINTING_COMPONENT_LAYER; - public static final String PAINTING_COMPONENT_MODEL; - public static final String PAINTING_COMPONENT_METHOD; - public static final String MODEL_CONVERTER_DIALOG_TITLE; public static final String MODEL_CONVERTER_DIALOG_RESULT_NAME; public static final String MODEL_CONVERTER_DIALOG_DESTINATION_FOLDER; @@ -1164,6 +1164,22 @@ public class Messages { MODEL_PROPERTY_COLOR_SPACE = bundle.getString("ModelPropertyColorSpace"); MODEL_PROPERTY_LANGUAGE = bundle.getString("ModelPropertyLanguage"); MODEL_PROPERTY_TEXTURE = bundle.getString("ModelPropertyTexture"); + MODEL_PROPERTY_BRUSH_SIZE = bundle.getString("ModelPropertyBrushSize"); + MODEL_PROPERTY_BRUSH_POWER = bundle.getString("ModelPropertyBrushPower"); + MODEL_PROPERTY_SMOOTHLY = bundle.getString("ModelPropertySmoothly"); + MODEL_PROPERTY_LIMITED = bundle.getString("ModelPropertyLimited"); + MODEL_PROPERTY_USE_MARKER = bundle.getString("ModelPropertyUseMarker"); + MODEL_PROPERTY_ROUGHNESS = bundle.getString("ModelPropertyRoughness"); + MODEL_PROPERTY_FREQUENCY = bundle.getString("ModelPropertyFrequency"); + MODEL_PROPERTY_LACUNARITY = bundle.getString("ModelPropertyLacunarity"); + MODEL_PROPERTY_OCTAVES = bundle.getString("ModelPropertyOctaves"); + MODEL_PROPERTY_MIN_SCALE = bundle.getString("ModelPropertyMinScale"); + MODEL_PROPERTY_MAX_SCALE = bundle.getString("ModelPropertyMaxScale"); + MODEL_PROPERTY_PADDING = bundle.getString("ModelPropertyPadding"); + MODEL_PROPERTY_TRI_PLANAR = bundle.getString("ModelPropertyTriPlanar"); + MODEL_PROPERTY_SHININESS = bundle.getString("ModelPropertyShininess"); + MODEL_PROPERTY_MODEL = bundle.getString("ModelPropertyModel"); + MODEL_PROPERTY_METHOD = bundle.getString("ModelPropertyMethod"); MATERIAL_MODEL_PROPERTY_CONTROL_NO_TEXTURE = bundle.getString("MaterialModelPropertyControlNoTexture"); MATERIAL_MODEL_PROPERTY_CONTROL_TEXTURE_SETTINGS = bundle.getString("MaterialModelPropertyControlTextureSettings"); @@ -1326,23 +1342,6 @@ public class Messages { CREATE_PARTICLE_EMITTER_TORUS_SHAPE_DIALOG_TITLE = bundle.getString("CreateParticleEmitterTorusShapeDialogTitle"); CREATE_PARTICLE_EMITTER_TRIANGLE_SHAPE_DIALOG_TITLE = bundle.getString("CreateParticleEmitterTriangleShapeDialogTitle"); - PAINTING_COMPONENT_BRUSH_SIZE = bundle.getString("PaintingComponentBrushSize"); - PAINTING_COMPONENT_BRUSH_POWER = bundle.getString("PaintingComponentBrushPower"); - PAINTING_COMPONENT_SMOOTHLY = bundle.getString("PaintingComponentSmoothly"); - PAINTING_COMPONENT_LIMITED = bundle.getString("PaintingComponentLimited"); - PAINTING_COMPONENT_USE_MARKER = bundle.getString("PaintingComponentUseMarker"); - PAINTING_COMPONENT_LEVEL = bundle.getString("PaintingComponentLevel"); - PAINTING_COMPONENT_ROUGHNESS = bundle.getString("PaintingComponentRoughness"); - PAINTING_COMPONENT_FREQUENCY = bundle.getString("PaintingComponentFrequency"); - PAINTING_COMPONENT_LACUNARITY = bundle.getString("PaintingComponentLacunarity"); - PAINTING_COMPONENT_OCTAVES = bundle.getString("PaintingComponentOctaves"); - PAINTING_COMPONENT_SCALE = bundle.getString("PaintingComponentScale"); - PAINTING_COMPONENT_TRI_PLANAR = bundle.getString("PaintingComponentTriPlanar"); - PAINTING_COMPONENT_SHININESS = bundle.getString("PaintingComponentShininess"); - PAINTING_COMPONENT_LAYER = bundle.getString("PaintingComponentLayer"); - PAINTING_COMPONENT_MODEL = bundle.getString("PaintingComponentModel"); - PAINTING_COMPONENT_METHOD = bundle.getString("PaintingComponentMethod"); - MODEL_CONVERTER_DIALOG_TITLE = bundle.getString("ModelConverterDialogTitle"); MODEL_CONVERTER_DIALOG_RESULT_NAME = bundle.getString("ModelConverterDialogResultName"); MODEL_CONVERTER_DIALOG_DESTINATION_FOLDER = bundle.getString("ModelConverterDialogDestinationFolder"); diff --git a/src/main/java/com/ss/editor/control/painting/spawn/SpawnToolControl.java b/src/main/java/com/ss/editor/control/painting/spawn/SpawnToolControl.java index ff4a34c9..ed8226de 100644 --- a/src/main/java/com/ss/editor/control/painting/spawn/SpawnToolControl.java +++ b/src/main/java/com/ss/editor/control/painting/spawn/SpawnToolControl.java @@ -5,11 +5,10 @@ import static com.ss.rlib.common.util.ObjectUtils.notNull; import static com.ss.rlib.common.util.array.ArrayCollectors.toArray; import com.jme3.asset.ModelKey; -import com.jme3.collision.CollisionResult; -import com.jme3.collision.CollisionResults; +import com.jme3.bounding.BoundingBox; +import com.jme3.bounding.BoundingVolume; import com.jme3.math.ColorRGBA; import com.jme3.math.Quaternion; -import com.jme3.math.Ray; import com.jme3.math.Vector3f; import com.jme3.scene.AssetLinkNode; import com.jme3.scene.Geometry; @@ -22,10 +21,9 @@ import com.ss.editor.control.painting.PaintingInput; import com.ss.editor.control.painting.impl.AbstractPaintingControl; import com.ss.editor.model.undo.editor.ModelChangeConsumer; -import com.ss.editor.ui.component.painting.spawn.SpawnPaintingComponent; import com.ss.editor.model.undo.impl.AddChildOperation; +import com.ss.editor.ui.component.painting.spawn.SpawnPaintingComponent; import com.ss.editor.util.GeomUtils; -import com.ss.editor.util.LocalObjects; import com.ss.editor.util.NodeUtils; import com.ss.rlib.common.util.array.Array; import com.ss.rlib.common.util.array.ArrayFactory; @@ -33,6 +31,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Random; import java.util.concurrent.ThreadLocalRandom; /** @@ -73,10 +72,22 @@ public String toString() { private final Array examples; /** - * The models scale. + * The models min minScale. + */ + @NotNull + private final Vector3f minScale; + + /** + * The models max minScale. */ @NotNull - private final Vector3f scale; + private final Vector3f maxScale; + + /** + * The models padding. + */ + @NotNull + private final Vector3f padding; /** * The spawn method. @@ -89,12 +100,14 @@ public String toString() { */ private float time; - public SpawnToolControl(@NotNull final SpawnPaintingComponent component) { + public SpawnToolControl(@NotNull SpawnPaintingComponent component) { super(component); this.spawnedModels = ArrayFactory.newArray(Spatial.class); this.examples = ArrayFactory.newArray(Spatial.class); this.method = SpawnMethod.BATCH; - this.scale = new Vector3f(1F, 1F, 1F); + this.minScale = Vector3f.UNIT_XYZ.clone(); + this.maxScale = Vector3f.UNIT_XYZ.clone(); + this.padding = Vector3f.ZERO.clone(); } /** @@ -113,28 +126,68 @@ public SpawnToolControl(@NotNull final SpawnPaintingComponent component) { * @param method the spawn method. */ @JmeThread - public void setMethod(@NotNull final SpawnMethod method) { + public void setMethod(@NotNull SpawnMethod method) { this.method = method; } /** - * Get the models scale. + * Get the models min scale. + * + * @return the models min scale. + */ + @JmeThread + private @NotNull Vector3f getMinScale() { + return minScale; + } + + /** + * Get the models max scale. + * + * @return the models max scale. + */ + @JmeThread + private @NotNull Vector3f getMaxScale() { + return maxScale; + } + + /** + * Get the models padding. + * + * @return the models padding. + */ + @JmeThread + private @NotNull Vector3f getPadding() { + return minScale; + } + + /** + * Set the models min scale. + * + * @param minScale the models min scale. + */ + @JmeThread + public void setMinScale(@NotNull Vector3f minScale) { + this.minScale.set(minScale); + } + + /** + * Set the models min scale. * - * @return the models scale. + * @param minScale the models min scale. */ @JmeThread - private @NotNull Vector3f getScale() { - return scale; + public void setMaxScale(@NotNull Vector3f minScale) { + this.maxScale.set(minScale); } /** - * Set the models scale. + * Set the models min scale. * - * @param scale the models scale. + * @param padding the models padding. */ @JmeThread - public void setScale(@NotNull final Vector3f scale) { - this.scale.set(scale); + public void setPadding(@NotNull Vector3f padding) { + this.padding.set(padding); } @Override @@ -159,7 +212,7 @@ public void setScale(@NotNull final Vector3f scale) { * @param examples the list of available examples. */ @JmeThread - public void updateExamples(@NotNull final Array examples) { + public void updateExamples(@NotNull Array examples) { this.examples.clear(); this.examples.addAll(examples); } @@ -191,10 +244,13 @@ public void updateExamples(@NotNull final Array examples) { } @Override - public void startPainting(@NotNull final PaintingInput input, @NotNull final Quaternion brushRotation, - @NotNull final Vector3f contactPoint) { + public void startPainting( + @NotNull PaintingInput input, + @NotNull Quaternion brushRotation, + @NotNull Vector3f contactPoint + ) { - final Array spawnedModel = getExamples(); + var spawnedModel = getExamples(); if (spawnedModel.isEmpty()) { return; } @@ -207,8 +263,7 @@ public void startPainting(@NotNull final PaintingInput input, @NotNull final Qua @Override @JmeThread - public void updatePainting(@NotNull final Quaternion brushRotation, @NotNull final Vector3f contactPoint, - final float tpf) { + public void updatePainting(@NotNull Quaternion brushRotation, @NotNull Vector3f contactPoint, float tpf) { time += (tpf * 10F); @@ -217,7 +272,7 @@ public void updatePainting(@NotNull final Quaternion brushRotation, @NotNull fin return; } - final PaintingInput currentInput = notNull(getCurrentInput()); + var currentInput = notNull(getCurrentInput()); switch (currentInput) { case MOUSE_PRIMARY: { @@ -234,38 +289,45 @@ public void updatePainting(@NotNull final Quaternion brushRotation, @NotNull fin * @param contactPoint the contact point. */ @JmeThread - protected void spawn(@NotNull final Quaternion brushRotation, @NotNull final Vector3f contactPoint) { + protected void spawn(@NotNull Quaternion brushRotation, @NotNull Vector3f contactPoint) { - final float brushSize = getBrushSize(); + var brushSize = getBrushSize(); - final ThreadLocalRandom random = ThreadLocalRandom.current(); - final LocalObjects local = getLocalObjects(); - final Vector3f spawnPosition = local.nextVector(); + var random = ThreadLocalRandom.current(); + var local = getLocalObjects(); + var spawnPosition = local.nextVector(); - final Node paintedModel = getPaintedModel(); - final Vector3f direction = GeomUtils.getDirection(brushRotation, local.nextVector()) + var paintedModel = getPaintedModel(); + var direction = GeomUtils.getDirection(brushRotation, local.nextVector()) .negateLocal() .multLocal(10); - final Vector3f sourcePoint = contactPoint.subtract(direction, local.nextVector()); - final Ray ray = local.nextRay(); + var sourcePoint = contactPoint.subtract(direction, local.nextVector()); + var ray = local.nextRay(); ray.setOrigin(sourcePoint); - final Vector3f scale = getScale(); - final Vector3f resultPosition = local.nextVector(); - final CollisionResults collisions = local.nextCollisionResults(); - final CollisionResults spawnedCollisions = local.nextCollisionResults(); + var minScale = getMinScale(); + var maxScale = getMaxScale(); + var padding = getPadding(); - final int maxCount = (int) Math.max(getBrushPower() / 2F, 1F); + var resultPosition = local.nextVector(); + var collisions = local.nextCollisionResults(); + var spawnedCollisions = local.nextCollisionResults(); + var resultScale = local.nextVector(); + var needCalculateScale = !minScale.equals(maxScale); + + var maxCount = (int) Math.max(getBrushPower() / 2F, 1F); + var spawnedModels = getSpawnedModels(); + + for(var count = 0; count < maxCount; count++) { + for (var attempts = 0; attempts < 10; attempts++, attempts++) { - for(int count = 0; count < maxCount; count++) { - for (int attempts = 0; attempts < 10; attempts++, attempts++) { collisions.clear(); spawnedCollisions.clear(); - final float x = nextOffset(brushSize, random); - final float y = nextOffset(brushSize, random); - final float z = nextOffset(brushSize, random); + var x = nextOffset(brushSize, random); + var y = nextOffset(brushSize, random); + var z = nextOffset(brushSize, random); spawnPosition.set(x, y, z) .addLocal(contactPoint) @@ -276,7 +338,7 @@ protected void spawn(@NotNull final Quaternion brushRotation, @NotNull final Vec paintedModel.collideWith(ray, collisions); - final CollisionResult closest = collisions.getClosestCollision(); + var closest = collisions.getClosestCollision(); if (closest == null || contactPoint.distance(closest.getContactPoint()) > brushSize / 2) { continue; } @@ -284,23 +346,78 @@ protected void spawn(@NotNull final Quaternion brushRotation, @NotNull final Vec resultPosition.set(closest.getContactPoint()) .subtractLocal(paintedModel.getWorldTranslation()); - final Spatial clone = examples.get(random.nextInt(0, examples.size())).clone(); + Spatial clone = examples.get(random.nextInt(0, examples.size())).clone(); clone.setUserData(KEY_IGNORE_RAY_CAST, Boolean.TRUE); clone.setLocalTranslation(resultPosition); - clone.setLocalScale(scale); + + if (needCalculateScale) { + clone.setLocalScale(nextScale(minScale, maxScale, resultScale, random)); + } else { + clone.setLocalScale(minScale); + } + clone.updateModelBound(); - if (paintedModel.collideWith(clone.getWorldBound(), spawnedCollisions) > 2) { + var worldBound = clone.getWorldBound(); + + if (!Vector3f.ZERO.equals(padding)) { + worldBound = addPadding(worldBound, padding); + } + + if (paintedModel.collideWith(worldBound, spawnedCollisions) > 2) { continue; } - getSpawnedModels().add(clone); + spawnedModels.add(clone); paintedModel.attachChild(clone); break; } } } + protected BoundingVolume addPadding(@NotNull BoundingVolume boundingVolume, @NotNull Vector3f padding) { + + if (boundingVolume instanceof BoundingBox) { + var box = (BoundingBox) boundingVolume; + var xExtent = box.getXExtent() + padding.getX(); + var yExtent = box.getYExtent() + padding.getY(); + var zExtent = box.getZExtent() + padding.getZ(); + return new BoundingBox(box.getCenter(), xExtent, yExtent, zExtent); + } + + return boundingVolume; + } + + /** + * Calculate a new random scale. + * + * @param minScale the min scale. + * @param maxScale the max scale. + * @param result the result vector. + * @param random the random. + * @return the result vector. + */ + protected Vector3f nextScale( + @NotNull Vector3f minScale, + @NotNull Vector3f maxScale, + @NotNull Vector3f result, + @NotNull Random random + ) { + + float newX = nextScale(random, minScale.getX(), maxScale.getX()); + float newY = nextScale(random, minScale.getX(), maxScale.getX()); + float newZ = nextScale(random, minScale.getX(), maxScale.getX()); + + return result.set(newX, newY, newZ); + } + + protected float nextScale(@NotNull Random random, float min, float max) { + int minInt = (int) (Math.min(min, max) * 1000); + int maxInt = (int) (Math.max(max, min) * 1000); + int added = random.nextInt(maxInt - minInt); + return Math.min(min, max) + (added / 1000F); + } + /** * Calculate next random offset. * @@ -309,7 +426,7 @@ protected void spawn(@NotNull final Quaternion brushRotation, @NotNull final Vec * @return the new coordinate. */ @JmeThread - protected float nextOffset(final float brushSize, @NotNull final ThreadLocalRandom random) { + protected float nextOffset(float brushSize, @NotNull ThreadLocalRandom random) { float result = random.nextInt(0, (int) (brushSize * 100)) / 100F; result /= 2F; return random.nextBoolean() ? result * -1 : result; @@ -317,38 +434,43 @@ protected float nextOffset(final float brushSize, @NotNull final ThreadLocalRand @Override @JmeThread - public void finishPainting(@NotNull final Quaternion brushRotation, @NotNull final Vector3f contactPoint) { + public void finishPainting(@NotNull Quaternion brushRotation, @NotNull Vector3f contactPoint) { super.finishPainting(brushRotation, contactPoint); - final Array spawnedModels = getSpawnedModels(); + var spawnedModels = getSpawnedModels(); if (spawnedModels.isEmpty()) { return; } - final LocalObjects local = getLocalObjects(); - final Vector3f location = local.nextVector(); - final Vector3f offset = local.nextVector(); - offset.set(contactPoint); + var local = getLocalObjects(); + var location = local.nextVector(); + var offset = local.nextVector() + .set(contactPoint); spawnedModels.stream().peek(Spatial::removeFromParent) .forEach(sp -> sp.setUserData(KEY_IGNORE_RAY_CAST, null)); - final Node paintedModel = notNull(getPaintedModel()); - final Node parent = paintedModel instanceof Terrain ? + var paintedModel = notNull(getPaintedModel()); + + Node parent = paintedModel instanceof Terrain ? NodeUtils.findParent(paintedModel, sp -> !(sp instanceof Terrain)) : paintedModel; if (parent != paintedModel) { - final Vector3f diff = local.nextVector(); - diff.set(parent.getWorldTranslation()).subtractLocal(paintedModel.getWorldTranslation()); + + var diff = local.nextVector(); + diff.set(parent.getWorldTranslation()) + .subtractLocal(paintedModel.getWorldTranslation()); + offset.addLocal(diff); } - final ModelChangeConsumer changeConsumer = getChangeConsumer(); + var changeConsumer = getChangeConsumer(); + + var method = getMethod(); - final SpawnMethod method = getMethod(); switch (method) { case AS_IS: { - final Node spawnedNode = new Node("Spawned"); + var spawnedNode = new Node("Spawned"); spawnedNode.setLocalTranslation(contactPoint); spawnedModels.forEach(geom -> updatePositionAndAttach(offset, location, spawnedNode, geom)); spawnedNode.updateModelBound(); @@ -357,7 +479,7 @@ public void finishPainting(@NotNull final Quaternion brushRotation, @NotNull fin } case LINK: { - final Node spawnedNode = new Node("Spawned"); + var spawnedNode = new Node("Spawned"); spawnedNode.setLocalTranslation(contactPoint); spawnedModels.stream().map(this::linkSpatial) .forEach(geom -> updatePositionAndAttach(offset, location, spawnedNode, geom)); @@ -369,9 +491,10 @@ public void finishPainting(@NotNull final Quaternion brushRotation, @NotNull fin } case BATCH: { - final Node spawnedNode = new Node("Spawned"); + var spawnedNode = new Node("Spawned"); spawnedNode.setLocalTranslation(contactPoint); - final Array geometries = spawnedModels.stream() + + var geometries = spawnedModels.stream() .flatMap(NodeUtils::children) .filter(Geometry.class::isInstance) .map(Geometry.class::cast) @@ -389,10 +512,14 @@ public void finishPainting(@NotNull final Quaternion brushRotation, @NotNull fin } @JmeThread - protected void updatePositionAndAttach(@NotNull final Vector3f contactPoint, @NotNull final Vector3f location, - @NotNull final Node spawnedNode, @NotNull final Spatial geom) { - - final Vector3f newPosition = location.set(geom.getLocalTranslation()) + protected void updatePositionAndAttach( + @NotNull Vector3f contactPoint, + @NotNull Vector3f location, + @NotNull Node spawnedNode, + @NotNull Spatial geom + ) { + + var newPosition = location.set(geom.getLocalTranslation()) .subtractLocal(contactPoint); geom.setLocalTranslation(newPosition); @@ -406,11 +533,11 @@ protected void updatePositionAndAttach(@NotNull final Vector3f contactPoint, @No * @return the asset link node. */ @JmeThread - protected @NotNull AssetLinkNode linkSpatial(@NotNull final Spatial spatial) { - final AssetLinkNode linkNode = new AssetLinkNode(); + protected @NotNull AssetLinkNode linkSpatial(@NotNull Spatial spatial) { + var linkNode = new AssetLinkNode(); linkNode.setLocalTranslation(spatial.getLocalTranslation()); linkNode.setName(spatial.getName()); - linkNode.setLocalScale(getScale()); + linkNode.setLocalScale(getMinScale()); linkNode.attachLinkedChild(getAssetManager(), (ModelKey) spatial.getKey()); return linkNode; } diff --git a/src/main/java/com/ss/editor/plugin/api/property/PropertyDefinition.java b/src/main/java/com/ss/editor/plugin/api/property/PropertyDefinition.java index e6c698ee..5dc57ef3 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/PropertyDefinition.java +++ b/src/main/java/com/ss/editor/plugin/api/property/PropertyDefinition.java @@ -14,10 +14,7 @@ */ public class PropertyDefinition { - @NotNull private static final Array EMPTY_OPTIONS = ArrayFactory.asArray(); - - @NotNull private static final Array EMPTY_DEPENDENCIES = ArrayFactory.newArray(String.class); /** @@ -72,14 +69,22 @@ public class PropertyDefinition { */ private final float max; - public PropertyDefinition(@NotNull final EditablePropertyType propertyType, @NotNull final String name, - @NotNull final String id, @Nullable final Object defaultValue) { + public PropertyDefinition( + @NotNull EditablePropertyType propertyType, + @NotNull String name, + @NotNull String id, + @Nullable Object defaultValue + ) { this(propertyType, null, name, id, defaultValue); } - public PropertyDefinition(@NotNull final EditablePropertyType propertyType, - @Nullable final Array dependencies, @NotNull final String name, - @NotNull final String id, @Nullable final Object defaultValue) { + public PropertyDefinition( + @NotNull EditablePropertyType propertyType, + @Nullable Array dependencies, + @NotNull String name, + @NotNull String id, + @Nullable Object defaultValue + ) { this.propertyType = propertyType; this.name = name; this.id = id; @@ -91,16 +96,24 @@ public PropertyDefinition(@NotNull final EditablePropertyType propertyType, this.dependencies = dependencies == null ? EMPTY_DEPENDENCIES : dependencies; } - public PropertyDefinition(@NotNull final EditablePropertyType propertyType, @NotNull final String name, - @NotNull final String id, @Nullable final Object defaultValue, - @Nullable final String extension) { + public PropertyDefinition( + @NotNull EditablePropertyType propertyType, + @NotNull String name, + @NotNull String id, + @Nullable Object defaultValue, + @Nullable String extension + ) { this(propertyType, null, name, id, defaultValue, extension); } - public PropertyDefinition(@NotNull final EditablePropertyType propertyType, - @Nullable final Array dependencies, @NotNull final String name, - @NotNull final String id, @Nullable final Object defaultValue, - @Nullable final String extension) { + public PropertyDefinition( + @NotNull EditablePropertyType propertyType, + @Nullable Array dependencies, + @NotNull String name, + @NotNull String id, + @Nullable Object defaultValue, + @Nullable String extension + ) { this.propertyType = propertyType; this.name = name; this.id = id; @@ -112,9 +125,13 @@ public PropertyDefinition(@NotNull final EditablePropertyType propertyType, this.dependencies = dependencies == null ? EMPTY_DEPENDENCIES : dependencies; } - public PropertyDefinition(@NotNull final EditablePropertyType propertyType, @NotNull final String name, - @NotNull final String id, @Nullable final Object defaultValue, - @NotNull final Array options) { + public PropertyDefinition( + @NotNull EditablePropertyType propertyType, + @NotNull final String name, + @NotNull String id, + @Nullable Object defaultValue, + @NotNull Array options + ) { this.propertyType = propertyType; this.name = name; this.id = id; @@ -126,9 +143,14 @@ public PropertyDefinition(@NotNull final EditablePropertyType propertyType, @Not this.dependencies = EMPTY_DEPENDENCIES; } - public PropertyDefinition(@NotNull final EditablePropertyType propertyType, @NotNull final String name, - @NotNull final String id, @Nullable final Object defaultValue, final float min, - final float max) { + public PropertyDefinition( + @NotNull EditablePropertyType propertyType, + @NotNull String name, + @NotNull String id, + @Nullable Object defaultValue, + float min, + float max + ) { this.propertyType = propertyType; this.name = name; this.id = id; diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/AssetResourcePropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/AssetResourcePropertyEditorControl.java index dd6b3eb8..6988a677 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/AssetResourcePropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/AssetResourcePropertyEditorControl.java @@ -1,7 +1,7 @@ package com.ss.editor.plugin.api.property.control; -import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; +import com.ss.editor.annotation.FxThread; import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.ui.util.UiUtils; import com.ss.rlib.common.util.VarTable; @@ -19,15 +19,15 @@ */ public abstract class AssetResourcePropertyEditorControl extends ResourcePropertyEditorControl { - @NotNull private static final Predicate> DEFAULT_ACTION_TESTER = type -> false; - @NotNull private static final Array DEFAULT_EXTENSIONS = ArrayFactory.newArray(String.class); - protected AssetResourcePropertyEditorControl(@NotNull final VarTable vars, - @NotNull final PropertyDefinition definition, - @NotNull final Runnable validationCallback) { + protected AssetResourcePropertyEditorControl( + @NotNull final VarTable vars, + @NotNull final PropertyDefinition definition, + @NotNull final Runnable validationCallback + ) { super(vars, definition, validationCallback); } @@ -53,18 +53,18 @@ protected AssetResourcePropertyEditorControl(@NotNull final VarTable vars, @Override @FxThread - protected void processSelect() { - super.processSelect(); - UiUtils.openFileAssetDialog(this::processSelect, getExtensions(), getActionTester()); + protected void chooseNew() { + super.chooseNew(); + UiUtils.openFileAssetDialog(this::chooseNew, getExtensions(), getActionTester()); } /** - * Handles the selected file. + * Choose the new resource by the file. * * @param file the selected file. */ @FxThread - protected void processSelect(@NotNull final Path file) { + protected void chooseNew(@NotNull Path file) { change(); reload(); } diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/AwtFontPropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/AwtFontPropertyEditorControl.java index 60daba28..f2fc5f70 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/AwtFontPropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/AwtFontPropertyEditorControl.java @@ -79,7 +79,7 @@ protected void createComponents() { binding.setOnAutoCompleted(event -> selectionModel.select(event.getCompletion())); FXUtils.addClassesTo(comboBox.getEditor(), CssClasses.TRANSPARENT_TEXT_FIELD, CssClasses.TEXT_FIELD_IN_COMBO_BOX); - FXUtils.addClassTo(comboBox, CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); + FXUtils.addClassTo(comboBox, CssClasses.PROPERTY_CONTROL_COMBO_BOX); FXUtils.addToPane(comboBox, this); } diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/ClasspathResourcePropertyControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/ClasspathResourcePropertyControl.java index 1682c714..b95ac5a4 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/ClasspathResourcePropertyControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/ClasspathResourcePropertyControl.java @@ -9,8 +9,6 @@ import com.ss.rlib.common.util.FileUtils; import com.ss.rlib.common.util.StringUtils; import com.ss.rlib.common.util.VarTable; -import com.ss.rlib.common.util.array.Array; -import javafx.scene.control.Label; import org.jetbrains.annotations.NotNull; /** @@ -26,30 +24,33 @@ public class ClasspathResourcePropertyControl extends ResourcePropertyEditorCont @NotNull private final String extension; - public ClasspathResourcePropertyControl(@NotNull final VarTable vars, @NotNull final PropertyDefinition definition, - @NotNull final Runnable validationCallback) { + public ClasspathResourcePropertyControl( + @NotNull VarTable vars, + @NotNull PropertyDefinition definition, + @NotNull Runnable validationCallback + ) { super(vars, definition, validationCallback); this.extension = notNull(definition.getExtension()); } @Override @FxThread - protected void processSelect() { - super.processSelect(); + protected void chooseNew() { + super.chooseNew(); - final ResourceManager resourceManager = ResourceManager.getInstance(); - final Array resources = resourceManager.getAvailableResources(extension); + var resourceManager = ResourceManager.getInstance(); + var resources = resourceManager.getAvailableResources(extension); - UiUtils.openResourceAssetDialog(this::processSelect, this::validate, resources); + UiUtils.openResourceAssetDialog(this::chooseNew, this::validate, resources); } /** - * Handle selected resource. + * Choose the new resource by the path * * @param resource the selected resource. */ @FxThread - private void processSelect(@NotNull final String resource) { + private void chooseNew(@NotNull String resource) { setPropertyValue(resource); change(); reload(); @@ -64,7 +65,7 @@ private void processSelect(@NotNull final String resource) { @FxThread private String validate(@NotNull final String resource) { - final String extension = FileUtils.getExtension(resource); + var extension = FileUtils.getExtension(resource); if (StringUtils.isEmpty(extension)) { return Messages.ASSET_EDITOR_DIALOG_WARNING_SELECT_FILE; } @@ -76,8 +77,8 @@ private String validate(@NotNull final String resource) { @FxThread public void reload() { - final String resource = getPropertyValue(); - final Label resourceLabel = getResourceLabel(); + var resource = getPropertyValue(); + var resourceLabel = getResourceLabel(); resourceLabel.setText(resource == null ? NOT_SELECTED : resource); super.reload(); diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/EnumPropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/EnumPropertyEditorControl.java index 1380f634..589244ae 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/EnumPropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/EnumPropertyEditorControl.java @@ -1,14 +1,15 @@ package com.ss.editor.plugin.api.property.control; -import static com.ss.rlib.common.util.ClassUtils.unsafeCast; import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FxThread; import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.fx.util.FXUtils; +import com.ss.editor.util.EditorUtil; +import com.ss.rlib.common.util.ClassUtils; import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.fx.util.FxControlUtils; +import com.ss.rlib.fx.util.FxUtils; import javafx.scene.control.ComboBox; -import javafx.scene.control.SingleSelectionModel; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -25,15 +26,18 @@ public class EnumPropertyEditorControl> extends PropertyEditor @Nullable private ComboBox enumComboBox; - protected EnumPropertyEditorControl(@NotNull final VarTable vars, @NotNull final PropertyDefinition definition, - @NotNull final Runnable validationCallback) { + protected EnumPropertyEditorControl( + @NotNull VarTable vars, + @NotNull PropertyDefinition definition, + @NotNull Runnable validationCallback + ) { super(vars, definition, validationCallback); - final T defaultValue = unsafeCast(notNull(definition.getDefaultValue())); - final T[] enumConstants = unsafeCast(defaultValue.getClass().getEnumConstants()); + var defaultValue = ClassUtils.unsafeCast(notNull(definition.getDefaultValue())); + var enumConstants = EditorUtil.getEnumValues(defaultValue.getClass()); - final ComboBox enumComboBox = getEnumComboBox(); - enumComboBox.getItems().addAll(enumConstants); + getEnumComboBox().getItems() + .addAll(enumConstants); } @Override @@ -42,12 +46,15 @@ protected void createComponents() { super.createComponents(); enumComboBox = new ComboBox<>(); - enumComboBox.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> change()); - enumComboBox.prefWidthProperty().bind(widthProperty().multiply(DEFAULT_FIELD_W_PERCENT)); + enumComboBox.prefWidthProperty() + .bind(widthProperty().multiply(DEFAULT_FIELD_W_PERCENT)); + enumComboBox.setVisibleRowCount(20); - FXUtils.addClassTo(enumComboBox, CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); - FXUtils.addToPane(enumComboBox, this); + FxControlUtils.onSelectedItemChange(enumComboBox, this::change); + + FxUtils.addClass(enumComboBox, CssClasses.PROPERTY_CONTROL_COMBO_BOX); + FxUtils.addChild(this, enumComboBox); } /** @@ -62,17 +69,20 @@ protected void createComponents() { @FxThread public void reload() { super.reload(); - final T value = getPropertyValue(); - final ComboBox enumComboBox = getEnumComboBox(); - enumComboBox.getSelectionModel().select(value); + getEnumComboBox().getSelectionModel() + .select(getPropertyValue()); } @Override @FxThread protected void changeImpl() { - final ComboBox enumComboBox = getEnumComboBox(); - final SingleSelectionModel selectionModel = enumComboBox.getSelectionModel(); - setPropertyValue(selectionModel.getSelectedItem()); + + var currentValue = getEnumComboBox() + .getSelectionModel() + .getSelectedItem(); + + setPropertyValue(currentValue); + super.changeImpl(); } } diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/ExternalFileResourcePropertyControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/ExternalFileResourcePropertyControl.java index 6cc0bfa7..b8c7b770 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/ExternalFileResourcePropertyControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/ExternalFileResourcePropertyControl.java @@ -34,8 +34,8 @@ public ExternalFileResourcePropertyControl(@NotNull final VarTable vars, @Override @FxThread - protected void processSelect() { - super.processSelect(); + protected void chooseNew() { + super.chooseNew(); final ExternalFileEditorDialog dialog = new ExternalFileEditorDialog(this::openExternalFile); dialog.setTitleText(Messages.ASSET_EDITOR_DIALOG_TITLE); diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/FileAssetResourcePropertyControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/FileAssetResourcePropertyControl.java index 8252c777..8d24633c 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/FileAssetResourcePropertyControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/FileAssetResourcePropertyControl.java @@ -52,9 +52,9 @@ public FileAssetResourcePropertyControl(@NotNull final VarTable vars, @NotNull f @Override @FxThread - protected void processSelect(@NotNull final Path file) { + protected void chooseNew(@NotNull final Path file) { setPropertyValue(notNull(getAssetFile(file))); - super.processSelect(file); + super.chooseNew(file); } @Override diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/FloatPropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/FloatPropertyEditorControl.java index 1803a972..e1202be8 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/FloatPropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/FloatPropertyEditorControl.java @@ -37,7 +37,7 @@ protected void createComponents() { valueField.addChangeListener((observable, oldValue, newValue) -> change()); valueField.prefWidthProperty().bind(widthProperty().multiply(DEFAULT_FIELD_W_PERCENT)); - FXUtils.addClassTo(valueField, CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); + FXUtils.addClassTo(valueField, CssClasses.PROPERTY_CONTROL_COMBO_BOX); FXUtils.addToPane(valueField, this); } diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/FolderAssetResourcePropertyControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/FolderAssetResourcePropertyControl.java index 25b4c36a..f7295e26 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/FolderAssetResourcePropertyControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/FolderAssetResourcePropertyControl.java @@ -40,15 +40,15 @@ public FolderAssetResourcePropertyControl(@NotNull final VarTable vars, @Override @FxThread - protected void processSelect() { - UiUtils.openFolderAssetDialog(this::processSelect, getActionTester()); + protected void chooseNew() { + UiUtils.openFolderAssetDialog(this::chooseNew, getActionTester()); } @Override @FxThread - protected void processSelect(@NotNull final Path file) { + protected void chooseNew(@NotNull final Path file) { setPropertyValue(notNull(getAssetFile(file))); - super.processSelect(file); + super.chooseNew(file); } @Override diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/IntegerPropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/IntegerPropertyEditorControl.java index 73cd9730..37997fda 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/IntegerPropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/IntegerPropertyEditorControl.java @@ -37,7 +37,7 @@ protected void createComponents() { valueField.addChangeListener((observable, oldValue, newValue) -> change()); valueField.prefWidthProperty().bind(widthProperty().multiply(DEFAULT_FIELD_W_PERCENT)); - FXUtils.addClassTo(valueField, CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); + FXUtils.addClassTo(valueField, CssClasses.PROPERTY_CONTROL_COMBO_BOX); FXUtils.addToPane(valueField, this); } diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/ObjectFromListPropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/ObjectFromListPropertyEditorControl.java index fbb6e21c..82db6351 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/ObjectFromListPropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/ObjectFromListPropertyEditorControl.java @@ -42,7 +42,7 @@ protected void createComponents() { comboBox.prefWidthProperty().bind(widthProperty().multiply(DEFAULT_FIELD_W_PERCENT)); comboBox.setVisibleRowCount(20); - FXUtils.addClassTo(comboBox, CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); + FXUtils.addClassTo(comboBox, CssClasses.PROPERTY_CONTROL_COMBO_BOX); FXUtils.addToPane(comboBox, this); } diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/PropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/PropertyEditorControl.java index c631da19..222888d3 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/PropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/PropertyEditorControl.java @@ -7,9 +7,9 @@ import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.dialog.AbstractSimpleEditorDialog; import com.ss.editor.ui.util.UiUtils; -import com.ss.rlib.fx.util.FXUtils; import com.ss.rlib.common.util.VarTable; import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.fx.util.FxUtils; import javafx.geometry.Pos; import javafx.scene.control.Label; import javafx.scene.layout.HBox; @@ -25,15 +25,11 @@ */ public class PropertyEditorControl extends HBox { - /** - * The constant DEFAULT_LABEL_W_PERCENT. - */ - public static final double DEFAULT_LABEL_W_PERCENT = AbstractSimpleEditorDialog.DEFAULT_LABEL_W_PERCENT; + public static final double DEFAULT_LABEL_W_PERCENT = + AbstractSimpleEditorDialog.DEFAULT_LABEL_W_PERCENT; - /** - * The constant DEFAULT_FIELD_W_PERCENT. - */ - public static final double DEFAULT_FIELD_W_PERCENT = AbstractSimpleEditorDialog.DEFAULT_FIELD_W_PERCENT; + public static final double DEFAULT_FIELD_W_PERCENT = + AbstractSimpleEditorDialog.DEFAULT_FIELD_W_PERCENT; /** * The validation callback to call re-validating. @@ -88,8 +84,11 @@ public class PropertyEditorControl extends HBox { */ private boolean ignoreListener; - protected PropertyEditorControl(@NotNull final VarTable vars, @NotNull final PropertyDefinition definition, - @NotNull final Runnable validationCallback) { + protected PropertyEditorControl( + @NotNull VarTable vars, + @NotNull PropertyDefinition definition, + @NotNull Runnable validationCallback + ) { this.vars = vars; this.id = definition.getId(); this.name = definition.getName(); @@ -98,7 +97,7 @@ protected PropertyEditorControl(@NotNull final VarTable vars, @NotNull final Pro this.dependencies = definition.getDependencies(); this.defaultValue = definition.getDefaultValue(); - final Object defaultValue = definition.getDefaultValue(); + var defaultValue = definition.getDefaultValue(); if (defaultValue != null) { vars.set(id, defaultValue); @@ -107,6 +106,7 @@ protected PropertyEditorControl(@NotNull final VarTable vars, @NotNull final Pro setOnKeyReleased(UiUtils::consumeIfIsNotHotKey); setOnKeyPressed(UiUtils::consumeIfIsNotHotKey); createComponents(); + setIgnoreListener(true); try { reload(); @@ -114,7 +114,7 @@ protected PropertyEditorControl(@NotNull final VarTable vars, @NotNull final Pro setIgnoreListener(false); } - FXUtils.addClassTo(this, CssClasses.ABSTRACT_PARAM_EDITOR_CONTROL); + FxUtils.addClass(this, CssClasses.PROPERTY_EDITOR_CONTROL); } /** @@ -123,19 +123,21 @@ protected PropertyEditorControl(@NotNull final VarTable vars, @NotNull final Pro @FxThread public void checkDependency() { - final Array dependencies = getDependencies(); - if (dependencies.isEmpty()) return; + var dependencies = getDependencies(); + if (dependencies.isEmpty()) { + return; + } setDisable(false); - for (final String dependency : dependencies) { + for (var dependency : dependencies) { if (!vars.has(dependency)) { setDisable(true); return; } - final Object value = vars.get(dependency); + var value = vars.get(dependency); if (value instanceof Boolean) { setDisable(!(Boolean) value); @@ -212,8 +214,8 @@ protected void createComponents() { propertyNameLabel = new Label(getName() + ":"); propertyNameLabel.prefWidthProperty().bind(widthProperty().multiply(DEFAULT_LABEL_W_PERCENT)); - FXUtils.addClassTo(propertyNameLabel, CssClasses.ABSTRACT_PARAM_CONTROL_PARAM_NAME_SINGLE_ROW); - FXUtils.addToPane(propertyNameLabel, this); + FxUtils.addClass(propertyNameLabel, CssClasses.ABSTRACT_PARAM_CONTROL_PARAM_NAME_SINGLE_ROW); + FxUtils.addChild(this, propertyNameLabel); } /** @@ -243,7 +245,7 @@ protected void createComponents() { * @param propertyValue the new current property value. */ @FxThread - protected void setPropertyValue(@Nullable final T propertyValue) { + protected void setPropertyValue(@Nullable T propertyValue) { if (propertyValue == null) { vars.clear(id); } else { @@ -257,7 +259,7 @@ protected void setPropertyValue(@Nullable final T propertyValue) { * @param ignoreListener the flag for ignoring listeners. */ @FxThread - protected void setIgnoreListener(final boolean ignoreListener) { + protected void setIgnoreListener(boolean ignoreListener) { this.ignoreListener = ignoreListener; } @@ -278,8 +280,8 @@ protected boolean isIgnoreListener() { */ @FxThread public boolean isNotDefault() { - final T propertyValue = getPropertyValue(); - final Object defaultValue = getDefaultValue(); + var propertyValue = getPropertyValue(); + var defaultValue = getDefaultValue(); return !Objects.equals(defaultValue, propertyValue); } } diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/PropertyEditorControlFactory.java b/src/main/java/com/ss/editor/plugin/api/property/control/PropertyEditorControlFactory.java index ed442a5f..f2d08cc6 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/PropertyEditorControlFactory.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/PropertyEditorControlFactory.java @@ -21,9 +21,11 @@ public class PropertyEditorControlFactory { * @return the new property control. */ @FxThread - public static @NotNull PropertyEditorControl build(@NotNull final VarTable vars, - @NotNull final PropertyDefinition definition, - @NotNull final Runnable validation) { + public static @NotNull PropertyEditorControl build( + @NotNull VarTable vars, + @NotNull PropertyDefinition definition, + @NotNull Runnable validation + ) { switch (definition.getPropertyType()) { case FLOAT: { diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/ResourcePropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/ResourcePropertyEditorControl.java index be8ab91e..d07f2c66 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/ResourcePropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/ResourcePropertyEditorControl.java @@ -1,21 +1,20 @@ package com.ss.editor.plugin.api.property.control; -import static com.ss.rlib.common.util.ClassUtils.unsafeCast; import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.Messages; import com.ss.editor.annotation.FxThread; +import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.ui.Icons; import com.ss.editor.ui.css.CssClasses; -import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.ui.util.DynamicIconSupport; -import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.common.util.ClassUtils; import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.fx.util.FxUtils; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.image.ImageView; import javafx.scene.input.DataFormat; import javafx.scene.input.DragEvent; -import javafx.scene.input.Dragboard; import javafx.scene.input.TransferMode; import javafx.scene.layout.HBox; import org.jetbrains.annotations.NotNull; @@ -23,7 +22,6 @@ import java.io.File; import java.util.List; -import java.util.Set; /** * The control to edit resource values. @@ -32,11 +30,8 @@ */ public abstract class ResourcePropertyEditorControl extends PropertyEditorControl { - /** - * The constant NOT_SELECTED. - */ - @NotNull - protected static final String NOT_SELECTED = Messages.RESOURCE_PROPERTY_EDIT_CONTROL_NOTHING_IS_SELECTED; + protected static final String NOT_SELECTED = + Messages.RESOURCE_PROPERTY_EDIT_CONTROL_NOTHING_IS_SELECTED; /** * The label with name of the resource. @@ -44,13 +39,16 @@ public abstract class ResourcePropertyEditorControl extends PropertyEditorCon @Nullable private Label resourceLabel; - protected ResourcePropertyEditorControl(@NotNull final VarTable vars, @NotNull final PropertyDefinition definition, - @NotNull final Runnable validationCallback) { + protected ResourcePropertyEditorControl( + @NotNull VarTable vars, + @NotNull PropertyDefinition definition, + @NotNull Runnable validationCallback + ) { super(vars, definition, validationCallback); setOnDragOver(this::dragOver); setOnDragDropped(this::dragDropped); setOnDragExited(this::dragExited); - FXUtils.addClassTo(this, CssClasses.ABSTRACT_RESOURCE_PROPERTY_CONTROL); + FxUtils.addClass(this, CssClasses.PROPERTY_CONTROL_RESOURCE); } @Override @@ -60,53 +58,74 @@ protected void createComponents() { resourceLabel = new Label(NOT_SELECTED); - final Button changeButton = new Button(); + var changeButton = new Button(); changeButton.setGraphic(new ImageView(Icons.ADD_16)); - changeButton.setOnAction(event -> processSelect()); + changeButton.setOnAction(event -> chooseNew()); + + var removeButton = new Button(); + removeButton.setGraphic(new ImageView(Icons.REMOVE_12)); + removeButton.setOnAction(event -> removeCurrent()); + removeButton.disableProperty() + .bind(resourceLabel.textProperty().isEqualTo(NOT_SELECTED)); - final HBox container = new HBox(resourceLabel, changeButton); - container.prefWidthProperty().bind(widthProperty().multiply(DEFAULT_FIELD_W_PERCENT)); + var container = new HBox(resourceLabel, changeButton, removeButton); + container.prefWidthProperty() + .bind(widthProperty().multiply(DEFAULT_FIELD_W_PERCENT)); - resourceLabel.prefWidthProperty().bind(container.widthProperty()); + resourceLabel.prefWidthProperty() + .bind(container.widthProperty()); - FXUtils.addToPane(container, this); + FxUtils.addChild(this, container); - FXUtils.addClassesTo(container, CssClasses.DEF_HBOX, CssClasses.TEXT_INPUT_CONTAINER); - FXUtils.addClassesTo(changeButton, CssClasses.FLAT_BUTTON, CssClasses.INPUT_CONTROL_TOOLBAR_BUTTON); - FXUtils.addClassTo(resourceLabel, CssClasses.ABSTRACT_PARAM_CONTROL_ELEMENT_LABEL); + FxUtils.addClass(container, + CssClasses.DEF_HBOX, CssClasses.TEXT_INPUT_CONTAINER) + .addClass(changeButton, removeButton, + CssClasses.FLAT_BUTTON, CssClasses.INPUT_CONTROL_TOOLBAR_BUTTON) + .addClass(resourceLabel, + CssClasses.ABSTRACT_PARAM_CONTROL_ELEMENT_LABEL); DynamicIconSupport.addSupport(changeButton); } /** - * Process select a resource. + * Choose a new resource. */ @FxThread - protected void processSelect() { + protected void chooseNew() { } + /** + * Remove the current resource. + */ + @FxThread + protected void removeCurrent() { + setPropertyValue(null); + change(); + reload(); + } + /** * Handle grad exiting. */ @FxThread - private void dragExited(@NotNull final DragEvent dragEvent) { + private void dragExited(@NotNull DragEvent dragEvent) { } /** * Handle dropped files to editor. */ @FxThread - private void dragDropped(@NotNull final DragEvent dragEvent) { + private void dragDropped(@NotNull DragEvent dragEvent) { - final Dragboard dragboard = dragEvent.getDragboard(); - final List files = unsafeCast(dragboard.getContent(DataFormat.FILES)); + var dragboard = dragEvent.getDragboard(); + var files = ClassUtils.>unsafeCast(dragboard.getContent(DataFormat.FILES)); if (files == null || files.size() != 1) { return; } - final File file = files.get(0); + var file = files.get(0); if (!canAccept(file)) { return; } @@ -120,36 +139,36 @@ private void dragDropped(@NotNull final DragEvent dragEvent) { * @param file the dropped file. */ @FxThread - protected void handleFile(@NotNull final File file) { + protected void handleFile(@NotNull File file) { } /** * Handle drag over. */ @FxThread - private void dragOver(@NotNull final DragEvent dragEvent) { + private void dragOver(@NotNull DragEvent dragEvent) { - final Dragboard dragboard = dragEvent.getDragboard(); - final List files = unsafeCast(dragboard.getContent(DataFormat.FILES)); + var dragboard = dragEvent.getDragboard(); + var files = ClassUtils.>unsafeCast(dragboard.getContent(DataFormat.FILES)); if (files == null || files.size() != 1) { return; } - final File file = files.get(0); + var file = files.get(0); if (!canAccept(file)) { return; } - final Set transferModes = dragboard.getTransferModes(); - final boolean isCopy = transferModes.contains(TransferMode.COPY); + var transferModes = dragboard.getTransferModes(); + var isCopy = transferModes.contains(TransferMode.COPY); dragEvent.acceptTransferModes(isCopy ? TransferMode.COPY : TransferMode.MOVE); dragEvent.consume(); } @FxThread - protected boolean canAccept(@NotNull final File file) { + protected boolean canAccept(@NotNull File file) { return false; } diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/SpatialAssetResourcePropertyControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/SpatialAssetResourcePropertyControl.java index ac2a6aed..fcee3f7f 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/SpatialAssetResourcePropertyControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/SpatialAssetResourcePropertyControl.java @@ -5,20 +5,18 @@ import static com.ss.editor.util.NodeUtils.findParent; import static com.ss.rlib.common.util.ClassUtils.unsafeCast; import static com.ss.rlib.common.util.ObjectUtils.notNull; -import com.jme3.asset.AssetKey; import com.jme3.asset.AssetManager; import com.jme3.asset.ModelKey; import com.jme3.scene.Spatial; import com.ss.editor.FileExtensions; -import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; +import com.ss.editor.annotation.FxThread; import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.util.EditorUtil; import com.ss.rlib.common.util.FileUtils; import com.ss.rlib.common.util.VarTable; import com.ss.rlib.common.util.array.Array; import com.ss.rlib.common.util.array.ArrayFactory; -import javafx.scene.control.Label; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -39,9 +37,11 @@ public class SpatialAssetResourcePropertyControl extends Asse EXTENSIONS.add(FileExtensions.JME_OBJECT); } - public SpatialAssetResourcePropertyControl(@NotNull final VarTable vars, - @NotNull final PropertyDefinition definition, - @NotNull final Runnable validationCallback) { + public SpatialAssetResourcePropertyControl( + @NotNull VarTable vars, + @NotNull PropertyDefinition definition, + @NotNull Runnable validationCallback + ) { super(vars, definition, validationCallback); } @@ -53,17 +53,17 @@ public SpatialAssetResourcePropertyControl(@NotNull final VarTable vars, @Override @FxThread - protected void processSelect(@NotNull final Path file) { + protected void chooseNew(@NotNull Path file) { - final AssetManager assetManager = EditorUtil.getAssetManager(); + var assetManager = EditorUtil.getAssetManager(); - final Path assetFile = notNull(getAssetFile(file)); - final ModelKey modelKey = new ModelKey(toAssetPath(assetFile)); - final T spatial = findResource(assetManager, modelKey); + var assetFile = notNull(getAssetFile(file)); + var modelKey = new ModelKey(toAssetPath(assetFile)); + var spatial = findResource(assetManager, modelKey); setPropertyValue(unsafeCast(spatial)); - super.processSelect(file); + super.chooseNew(file); } /** @@ -74,31 +74,32 @@ protected void processSelect(@NotNull final Path file) { * @return the target resource. */ @FxThread - protected @Nullable T findResource(@NotNull final AssetManager assetManager, @NotNull final ModelKey modelKey) { + protected @Nullable T findResource(@NotNull AssetManager assetManager, @NotNull ModelKey modelKey) { return unsafeCast(assetManager.loadModel(modelKey)); } @Override @FxThread - protected boolean canAccept(@NotNull final File file) { + protected boolean canAccept(@NotNull File file) { return EXTENSIONS.contains(FileUtils.getExtension(file.getName())); } @Override @FxThread - protected void handleFile(@NotNull final File file) { - processSelect(file.toPath()); + protected void handleFile(@NotNull File file) { + chooseNew(file.toPath()); } @Override @FxThread public void reload() { - final T model = getPropertyValue(); - final Spatial root = model == null ? null : findParent(model, spatial -> spatial.getKey() != null); - final AssetKey key = root == null ? null : root.getKey(); + var model = getPropertyValue(); + + Spatial root = model == null ? null : findParent(model, spatial -> spatial.getKey() != null); - final Label resourceLabel = getResourceLabel(); + var key = root == null ? null : root.getKey(); + var resourceLabel = getResourceLabel(); resourceLabel.setText(key == null ? NOT_SELECTED : key.getName() + "[" + model.getName() + "]"); super.reload(); diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/StringFromListPropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/StringFromListPropertyEditorControl.java index fcc2328e..72b15921 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/StringFromListPropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/StringFromListPropertyEditorControl.java @@ -68,7 +68,7 @@ protected void createComponents() { comboBox.prefWidthProperty().bind(widthProperty().multiply(DEFAULT_FIELD_W_PERCENT)); comboBox.setVisibleRowCount(20); - FXUtils.addClassTo(comboBox, CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); + FXUtils.addClassTo(comboBox, CssClasses.PROPERTY_CONTROL_COMBO_BOX); FXUtils.addToPane(comboBox, this); } diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/StringPropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/StringPropertyEditorControl.java index 9a0baada..8ba4699a 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/StringPropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/StringPropertyEditorControl.java @@ -37,7 +37,7 @@ protected void createComponents() { valueField.textProperty().addListener((observable, oldValue, newValue) -> change()); valueField.prefWidthProperty().bind(widthProperty().multiply(DEFAULT_FIELD_W_PERCENT)); - FXUtils.addClassTo(valueField, CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); + FXUtils.addClassTo(valueField, CssClasses.PROPERTY_CONTROL_COMBO_BOX); FXUtils.addToPane(valueField, this); } diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/Vector3fPropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/Vector3fPropertyEditorControl.java index 52217f0b..3145a6e2 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/Vector3fPropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/Vector3fPropertyEditorControl.java @@ -1,13 +1,15 @@ package com.ss.editor.plugin.api.property.control; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.math.Vector3f; import com.ss.editor.annotation.FxThread; -import com.ss.editor.ui.css.CssClasses; import com.ss.editor.plugin.api.property.PropertyDefinition; +import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.util.UiUtils; -import com.ss.rlib.fx.control.input.FloatTextField; -import com.ss.rlib.fx.util.FXUtils; import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.fx.control.input.FloatTextField; +import com.ss.rlib.fx.util.FxControlUtils; +import com.ss.rlib.fx.util.FxUtils; import javafx.scene.layout.GridPane; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -37,8 +39,11 @@ public class Vector3fPropertyEditorControl extends PropertyEditorControl change()); - xField.prefWidthProperty().bind(gridPane.widthProperty().divide(3)); + xField.prefWidthProperty().bind(fieldWidth); yField = new FloatTextField(); - yField.addChangeListener((observable, oldValue, newValue) -> change()); - yField.prefWidthProperty().bind(gridPane.widthProperty().divide(3)); + yField.prefWidthProperty().bind(fieldWidth); zField = new FloatTextField(); - zField.addChangeListener((observable, oldValue, newValue) -> change()); - zField.prefWidthProperty().bind(gridPane.widthProperty().divide(3)); + zField.prefWidthProperty().bind(fieldWidth); gridPane.add(xField, 0, 0); gridPane.add(yField, 1, 0); gridPane.add(zField, 2, 0); - FXUtils.addClassesTo(gridPane, CssClasses.DEF_GRID_PANE, CssClasses.TEXT_INPUT_CONTAINER); - FXUtils.addClassesTo(xField, yField, zField, CssClasses.ABSTRACT_PARAM_CONTROL_VECTOR3F_FIELD, - CssClasses.TRANSPARENT_TEXT_FIELD); - FXUtils.addToPane(gridPane, this); + FxControlUtils.onValueChange(xField, this::change); + FxControlUtils.onValueChange(yField, this::change); + FxControlUtils.onValueChange(zField, this::change); + + FxUtils.addClass(gridPane, + CssClasses.DEF_GRID_PANE, CssClasses.TEXT_INPUT_CONTAINER) + .addClass(xField, yField, zField, + CssClasses.TRANSPARENT_TEXT_FIELD, + CssClasses.PROPERTY_CONTROL_VECTOR_3F_FIELD); + + FxUtils.addChild(this, gridPane); UiUtils.addFocusBinding(gridPane, xField, yField, zField); } /** + * Get the field X. + * * @return the field X. */ @FxThread private @NotNull FloatTextField getXField() { - return xField; + return notNull(xField); } /** + * Get the field Y. + * * @return the field Y. */ @FxThread private @NotNull FloatTextField getYField() { - return yField; + return notNull(yField); } /** + * Get the field Z. + * * @return the field Z. */ @FxThread private @NotNull FloatTextField getZField() { - return zField; + return notNull(zField); } @Override @@ -103,24 +125,24 @@ protected void createComponents() { public void reload() { super.reload(); - final Vector3f value = getPropertyValue(); + var value = getPropertyValue(); - final FloatTextField xField = getXField(); + var xField = getXField(); xField.setValue(value == null ? 0 : value.getX()); - final FloatTextField yField = getYField(); + var yField = getYField(); yField.setValue(value == null ? 0 : value.getY()); - final FloatTextField zField = getZField(); + var zField = getZField(); zField.setValue(value == null ? 0 : value.getZ()); } @Override @FxThread protected void changeImpl() { - final FloatTextField xField = getXField(); - final FloatTextField yField = getYField(); - final FloatTextField zField = getZField(); + var xField = getXField(); + var yField = getYField(); + var zField = getZField(); setPropertyValue(new Vector3f(xField.getValue(), yField.getValue(), zField.getValue())); super.changeImpl(); } diff --git a/src/main/java/com/ss/editor/ui/component/painting/PaintingComponent.java b/src/main/java/com/ss/editor/ui/component/painting/PaintingComponent.java index 438ba401..101f3b3c 100644 --- a/src/main/java/com/ss/editor/ui/component/painting/PaintingComponent.java +++ b/src/main/java/com/ss/editor/ui/component/painting/PaintingComponent.java @@ -111,5 +111,6 @@ default void notifyHided() { * @param propertyName the property name */ @FxThread - void notifyChangeProperty(@NotNull Object object, @NotNull String propertyName); + default void notifyChangeProperty(@NotNull Object object, @NotNull String propertyName) { + } } diff --git a/src/main/java/com/ss/editor/ui/component/painting/impl/AbstractPaintingComponent.java b/src/main/java/com/ss/editor/ui/component/painting/impl/AbstractPaintingComponent.java index 98c7899e..bed28089 100644 --- a/src/main/java/com/ss/editor/ui/component/painting/impl/AbstractPaintingComponent.java +++ b/src/main/java/com/ss/editor/ui/component/painting/impl/AbstractPaintingComponent.java @@ -11,12 +11,13 @@ import com.ss.editor.annotation.JmeThread; import com.ss.editor.control.painting.PaintingControl; import com.ss.editor.manager.ExecutorManager; -import com.ss.editor.model.editor.Editor3DProvider; import com.ss.editor.model.undo.editor.ModelChangeConsumer; import com.ss.editor.ui.component.editor.state.EditorState; import com.ss.editor.ui.component.painting.PaintingComponent; import com.ss.editor.ui.component.painting.PaintingComponentContainer; import com.ss.editor.ui.css.CssClasses; +import com.ss.rlib.common.logging.Logger; +import com.ss.rlib.common.logging.LoggerManager; import com.ss.rlib.fx.control.input.FloatTextField; import com.ss.rlib.fx.util.FXUtils; import javafx.scene.control.Label; @@ -38,10 +39,8 @@ public abstract class AbstractPaintingComponent extends VBox implements PaintingComponent { - /** - * The executor manager. - */ - @NotNull + protected static final Logger LOGGER = LoggerManager.getLogger(PaintingComponent.class); + protected static final ExecutorManager EXECUTOR_MANAGER = ExecutorManager.getInstance(); /** @@ -90,7 +89,7 @@ public abstract class AbstractPaintingComponent changeBrushSize(newValue)); - final Label brushPowerLabel = new Label(Messages.PAINTING_COMPONENT_BRUSH_POWER + ":"); + final Label brushPowerLabel = new Label(Messages.MODEL_PROPERTY_BRUSH_POWER + ":"); brushPowerLabel.prefWidthProperty().bind(widthProperty().multiply(LABEL_PERCENT)); brushPowerField = new FloatTextField(); @@ -124,14 +123,14 @@ public AbstractPaintingComponent(@NotNull final PaintingComponentContainer conta FXUtils.addClassTo(settings, CssClasses.DEF_GRID_PANE); FXUtils.addClassTo(brushSizeLabel, brushPowerLabel, CssClasses.ABSTRACT_PARAM_CONTROL_PARAM_NAME_SINGLE_ROW); - FXUtils.addClassTo(brushSizeField, brushPowerField, CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); + FXUtils.addClassTo(brushSizeField, brushPowerField, CssClasses.PROPERTY_CONTROL_COMBO_BOX); return settings; } @Override - public void loadState(@NotNull final EditorState editorState) { - final S state = editorState.getOrCreateAdditionalState(getStateType(), getStateConstructor()); + public void loadState(@NotNull EditorState editorState) { + var state = editorState.getOrCreateAdditionalState(getStateType(), getStateConstructor()); this.state = state; readState(state); } @@ -146,17 +145,6 @@ public void loadState(@NotNull final EditorState editorState) { return notNull(state); } - /** - * Read the saved component's state. - * - * @param state the saved component's state. - */ - @FxThread - protected void readState(@NotNull final S state) { - getBrushSizeField().setValue(state.getBrushSize()); - getBrushPowerField().setValue(state.getBrushPower()); - } - /** * Get the state's constructor. * @@ -173,6 +161,17 @@ protected void readState(@NotNull final S state) { @FromAnyThread protected abstract @NotNull Class getStateType(); + /** + * Read the saved component's state. + * + * @param state the saved component's state. + */ + @FxThread + protected void readState(@NotNull S state) { + getBrushSizeField().setValue(state.getBrushSize()); + getBrushPowerField().setValue(state.getBrushPower()); + } + /** * Change brush sizes. */ @@ -192,7 +191,7 @@ protected void changeBrushSize(@NotNull final Float size) { * @param size the brush size. */ @JmeThread - protected void setBrushSize(@NotNull final Float size) { + protected void setBrushSize(@NotNull Float size) { getToolControl().setBrushSize(size); } @@ -200,7 +199,7 @@ protected void setBrushSize(@NotNull final Float size) { * Change brush powers. */ @FromAnyThread - protected void changeBrushPower(@NotNull final Float power) { + protected void changeBrushPower(@NotNull Float power) { if (state != null) { state.setBrushPower(power); @@ -215,7 +214,7 @@ protected void changeBrushPower(@NotNull final Float power) { * @param power the brush power. */ @JmeThread - protected void setBrushPower(@NotNull final Float power) { + protected void setBrushPower(@NotNull Float power) { getToolControl().setBrushPower(power); } @@ -235,7 +234,7 @@ protected void setBrushPower(@NotNull final Float power) { * @param toolControl the current tool control. */ @FromAnyThread - protected void setToolControl(@Nullable final C toolControl) { + protected void setToolControl(@Nullable C toolControl) { this.toolControl = toolControl; } @@ -272,8 +271,7 @@ protected void setToolControl(@Nullable final C toolControl) { */ @FromAnyThread public @NotNull ModelChangeConsumer getChangeConsumer() { - final PaintingComponentContainer editingContainer = getContainer(); - return editingContainer.getChangeConsumer(); + return getContainer().getChangeConsumer(); } @Override @@ -284,7 +282,7 @@ protected void setToolControl(@Nullable final C toolControl) { @Override @FxThread - public void startPainting(@NotNull final Object object) { + public void startPainting(@NotNull Object object) { this.paintedObject = unsafeCast(object); } @@ -302,9 +300,8 @@ protected void createComponents() { */ @JmeThread public @NotNull Node getCursorNode() { - final PaintingComponentContainer container = getContainer(); - final Editor3DProvider provider = container.getProvider(); - return provider.getCursorNode(); + return getContainer().getProvider() + .getCursorNode(); } /** @@ -314,9 +311,8 @@ protected void createComponents() { */ @JmeThread public @NotNull Node getMarkersNode() { - final PaintingComponentContainer container = getContainer(); - final Editor3DProvider provider = container.getProvider(); - return provider.getMarkersNode(); + return getContainer().getProvider() + .getMarkersNode(); } @Override @@ -334,7 +330,7 @@ public void notifyHided() { } /** - * Is showed boolean. + * Return true if this component is showed. * * @return true if this component is showed. */ @@ -344,25 +340,29 @@ protected boolean isShowed() { } /** - * Sets showed. + * Set true if this component is showed. * * @param showed true if this component is showed. */ @FxThread - protected void setShowed(final boolean showed) { + protected void setShowed(boolean showed) { this.showed = showed; } /** - * @param ignoreListeners the flag of ignoring listeners. + * Set true of need to ignore listeners + * + * @param ignoreListeners true of need to ignore listeners */ @FxThread - protected void setIgnoreListeners(final boolean ignoreListeners) { + protected void setIgnoreListeners(boolean ignoreListeners) { this.ignoreListeners = ignoreListeners; } /** - * @return the flag of ignoring listeners. + * Return true of need to ignore listeners + * + * @return true of need to ignore listeners */ @FxThread protected boolean isIgnoreListeners() { diff --git a/src/main/java/com/ss/editor/ui/component/painting/impl/AbstractPaintingStateWithEditorTool.java b/src/main/java/com/ss/editor/ui/component/painting/impl/AbstractPaintingStateWithEditorTool.java index 598b0005..f9102328 100644 --- a/src/main/java/com/ss/editor/ui/component/painting/impl/AbstractPaintingStateWithEditorTool.java +++ b/src/main/java/com/ss/editor/ui/component/painting/impl/AbstractPaintingStateWithEditorTool.java @@ -59,8 +59,8 @@ public float getBrushSize() { } @FxThread - public void setBrushSize(final float brushSize) { - final boolean changed = abs(getBrushSize() - brushSize) > 0.001f; + public void setBrushSize(float brushSize) { + var changed = abs(getBrushSize() - brushSize) > 0.001f; this.brushSize = brushSize; if (changed) notifyChange(); } @@ -71,8 +71,8 @@ public float getBrushPower() { } @FxThread - public void setBrushPower(final float brushPower) { - final boolean changed = abs(getBrushPower() - brushPower) > 0.001f; + public void setBrushPower(float brushPower) { + var changed = abs(getBrushPower() - brushPower) > 0.001f; this.brushPower = brushPower; if (changed) notifyChange(); } diff --git a/src/main/java/com/ss/editor/ui/component/painting/property/PaintingPropertyDefinition.java b/src/main/java/com/ss/editor/ui/component/painting/property/PaintingPropertyDefinition.java index 4927406c..ffab366c 100644 --- a/src/main/java/com/ss/editor/ui/component/painting/property/PaintingPropertyDefinition.java +++ b/src/main/java/com/ss/editor/ui/component/painting/property/PaintingPropertyDefinition.java @@ -16,9 +16,13 @@ public class PaintingPropertyDefinition extends PropertyDefinition { @NotNull private final String category; - public PaintingPropertyDefinition(@NotNull final String category, @NotNull final EditablePropertyType propertyType, - @NotNull final String name, @NotNull final String id, - @Nullable final Object defaultValue) { + public PaintingPropertyDefinition( + @NotNull String category, + @NotNull EditablePropertyType propertyType, + @NotNull String name, + @NotNull String id, + @Nullable Object defaultValue + ) { super(propertyType, name, id, defaultValue); this.category = category; } diff --git a/src/main/java/com/ss/editor/ui/component/painting/property/PropertiesBasedPaintingComponent.java b/src/main/java/com/ss/editor/ui/component/painting/property/PropertiesBasedPaintingComponent.java index 5f857a40..19e8f7cb 100644 --- a/src/main/java/com/ss/editor/ui/component/painting/property/PropertiesBasedPaintingComponent.java +++ b/src/main/java/com/ss/editor/ui/component/painting/property/PropertiesBasedPaintingComponent.java @@ -1,24 +1,26 @@ package com.ss.editor.ui.component.painting.property; +import static com.ss.editor.extension.property.EditablePropertyType.FLOAT; +import com.ss.editor.Messages; import com.ss.editor.annotation.FxThread; import com.ss.editor.control.painting.PaintingControl; +import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.plugin.api.property.control.PropertyEditorControl; import com.ss.editor.plugin.api.property.control.PropertyEditorControlFactory; import com.ss.editor.ui.component.painting.PaintingComponentContainer; import com.ss.editor.ui.component.painting.impl.AbstractPaintingComponent; import com.ss.editor.ui.component.painting.impl.AbstractPaintingStateWithEditorTool; -import com.ss.rlib.fx.util.FXUtils; import com.ss.rlib.common.util.VarTable; import com.ss.rlib.common.util.array.Array; import com.ss.rlib.common.util.array.ArrayFactory; import com.ss.rlib.common.util.dictionary.DictionaryFactory; import com.ss.rlib.common.util.dictionary.ObjectDictionary; -import javafx.collections.ObservableList; -import javafx.scene.Node; -import javafx.scene.layout.GridPane; +import com.ss.rlib.fx.util.FxUtils; import javafx.scene.layout.VBox; import org.jetbrains.annotations.NotNull; +import java.util.function.Function; + /** * The properties based implementation of painting component. * @@ -27,17 +29,29 @@ * @param the painting control's type. * @author JavaSaBr */ -public abstract class PropertiesBasedPaintingComponent extends - AbstractPaintingComponent { +public abstract class PropertiesBasedPaintingComponent extends AbstractPaintingComponent { - @NotNull - protected static final Array EMPTY_PROPERTIES = ArrayFactory.newArray(PaintingPropertyDefinition.class); + private static final String PROPERTY_BRUSH_SIZE = "brushSize"; + private static final String PROPERTY_BRUSH_POWER = "brushPower"; + + protected static final Array EMPTY_PROPERTIES = + ArrayFactory.newArray(PaintingPropertyDefinition.class); + + protected static class AdditionalPropertyContainer extends VBox { + } /** * The map of category to properties container. */ @NotNull - private ObjectDictionary propertyContainers; + private ObjectDictionary propertyContainers; + + /** + * The container of brush settings. + */ + @NotNull + private VBox brushSettings; /** * The property variables. @@ -45,7 +59,7 @@ public abstract class PropertiesBasedPaintingComponent containerFactory = this::createContainer; + Runnable callback = this::syncValues; + + for (var definition : getBrushProperties()) { + var control = PropertyEditorControlFactory.build(vars, definition, callback); + FxUtils.addChild(brushSettings, control); + } - for (final PaintingPropertyDefinition definition : getPaintingProperties()) { - final PropertyEditorControl control = PropertyEditorControlFactory.build(vars, definition, callback); - final VBox container = propertyContainers.get(definition.getCategory(), this::createContainer); - FXUtils.addToPane(control, container); + for (var definition : getPaintingProperties()) { + var control = PropertyEditorControlFactory.build(vars, definition, callback); + var container = propertyContainers.get(definition.getCategory(), containerFactory); + FxUtils.addChild(container, control); } - FXUtils.addToPane(settings, this); + FxUtils.addChild(this, brushSettings); } @Override @FxThread - protected void readState(@NotNull final S state) { - super.readState(state); + protected void readState(@NotNull S state) { + + var vars = getVars(); + vars.set(PROPERTY_BRUSH_POWER, state.getBrushPower()); + vars.set(PROPERTY_BRUSH_SIZE, state.getBrushSize()); + + //FIXME + // super.readState(state); + refreshPropertyControls(); syncValues(); } @@ -82,8 +109,15 @@ protected void readState(@NotNull final S state) { */ @FxThread protected void refreshPropertyControls() { + + brushSettings.getChildren() + .stream() + .map(node -> (PropertyEditorControl) node) + .forEach(PropertyEditorControl::reload); + propertyContainers.forEach(container -> container.getChildren() - .stream().map(node -> (PropertyEditorControl) node) + .stream() + .map(node -> (PropertyEditorControl) node) .forEach(PropertyEditorControl::reload)); } @@ -93,9 +127,9 @@ protected void refreshPropertyControls() { * @param category the category. */ @FxThread - protected void showCategory(@NotNull final String category) { - final ObservableList children = getChildren(); - children.removeIf(VBox.class::isInstance); + protected void showCategory(@NotNull String category) { + var children = getChildren(); + children.removeIf(AdditionalPropertyContainer.class::isInstance); children.add(propertyContainers.get(category)); } @@ -115,6 +149,20 @@ protected void showCategory(@NotNull final String category) { @FxThread protected void syncValues() { + var vars = getVars(); + var brushSize = vars.getFloat(PROPERTY_BRUSH_SIZE); + var brushPower = vars.getFloat(PROPERTY_BRUSH_POWER); + + var state = getState(); + state.setBrushPower(brushPower); + state.setBrushSize(brushSize); + + var toolControl = getToolControl(); + + EXECUTOR_MANAGER.addJmeTask(() -> { + toolControl.setBrushPower(brushPower); + toolControl.setBrushSize(brushSize); + }); } /** @@ -123,8 +171,25 @@ protected void syncValues() { * @param category the category. */ @FxThread - private VBox createContainer(@NotNull final String category) { - return new VBox(); + private AdditionalPropertyContainer createContainer(@NotNull String category) { + return new AdditionalPropertyContainer(); + } + + /** + * Get the list of brush properties. + * + * @return the list of brush properties. + */ + @FxThread + protected @NotNull Array getBrushProperties() { + + var result = ArrayFactory.newArray(PropertyDefinition.class); + result.add(new PropertyDefinition(FLOAT, Messages.MODEL_PROPERTY_BRUSH_SIZE, + PROPERTY_BRUSH_SIZE, 1F, 0.0001F, Integer.MAX_VALUE)); + result.add(new PropertyDefinition(FLOAT, Messages.MODEL_PROPERTY_BRUSH_POWER, + PROPERTY_BRUSH_POWER, 1F, 0.0001F, Integer.MAX_VALUE)); + + return result; } /** diff --git a/src/main/java/com/ss/editor/ui/component/painting/spawn/SpawnPaintingComponent.java b/src/main/java/com/ss/editor/ui/component/painting/spawn/SpawnPaintingComponent.java index 7cba0e75..08bc97a1 100644 --- a/src/main/java/com/ss/editor/ui/component/painting/spawn/SpawnPaintingComponent.java +++ b/src/main/java/com/ss/editor/ui/component/painting/spawn/SpawnPaintingComponent.java @@ -1,7 +1,7 @@ package com.ss.editor.ui.component.painting.spawn; import static com.ss.editor.extension.property.EditablePropertyType.*; -import com.jme3.asset.AssetManager; +import com.jme3.asset.AssetNotFoundException; import com.jme3.math.Vector3f; import com.jme3.scene.Node; import com.jme3.scene.Spatial; @@ -16,7 +16,6 @@ import com.ss.editor.ui.component.painting.property.PropertiesBasedPaintingComponent; import com.ss.editor.util.EditorUtil; import com.ss.editor.util.NodeUtils; -import com.ss.rlib.common.util.VarTable; import com.ss.rlib.common.util.array.Array; import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.image.Image; @@ -30,17 +29,22 @@ * * @author JavaSaBr */ -public class SpawnPaintingComponent extends PropertiesBasedPaintingComponent { +public class SpawnPaintingComponent extends + PropertiesBasedPaintingComponent { + + private static final SpawnMethod[] SPAWN_METHODS = SpawnMethod.values(); private static final String CATEGORY_DEFAULT = "Default"; private static final String PROPERTY_MODEL = "model"; private static final String PROPERTY_METHOD = "method"; - private static final String PROPERTY_SCALE = "scale"; + private static final String PROPERTY_MIN_SCALE = "minScale"; + private static final String PROPERTY_MAX_SCALE = "maxScale"; + private static final String PROPERTY_PADDING = "padding"; public static final int AVAILABLE_MODELS = 10; - public SpawnPaintingComponent(@NotNull final PaintingComponentContainer container) { + public SpawnPaintingComponent(@NotNull PaintingComponentContainer container) { super(container); setToolControl(new SpawnToolControl(this)); showCategory(CATEGORY_DEFAULT); @@ -50,15 +54,19 @@ public SpawnPaintingComponent(@NotNull final PaintingComponentContainer containe @FxThread protected @NotNull Array getPaintingProperties() { - final Array result = ArrayFactory.newArray(PaintingPropertyDefinition.class); + var result = ArrayFactory.newArray(PaintingPropertyDefinition.class); result.add(new PaintingPropertyDefinition(CATEGORY_DEFAULT, ENUM, - Messages.PAINTING_COMPONENT_METHOD, PROPERTY_METHOD, SpawnMethod.BATCH)); + Messages.MODEL_PROPERTY_METHOD, PROPERTY_METHOD, SpawnMethod.BATCH)); + result.add(new PaintingPropertyDefinition(CATEGORY_DEFAULT, VECTOR_3F, + Messages.MODEL_PROPERTY_MIN_SCALE, PROPERTY_MIN_SCALE, new Vector3f(1F, 1F, 1F))); result.add(new PaintingPropertyDefinition(CATEGORY_DEFAULT, VECTOR_3F, - Messages.PAINTING_COMPONENT_SCALE, PROPERTY_SCALE, new Vector3f(1F, 1F, 1F))); + Messages.MODEL_PROPERTY_MAX_SCALE, PROPERTY_MAX_SCALE, new Vector3f(1F, 1F, 1F))); + result.add(new PaintingPropertyDefinition(CATEGORY_DEFAULT, VECTOR_3F, + Messages.MODEL_PROPERTY_PADDING, PROPERTY_PADDING, new Vector3f(1F, 1F, 1F))); for (int i = 1; i <= AVAILABLE_MODELS; i++) { result.add(new PaintingPropertyDefinition(CATEGORY_DEFAULT, SPATIAL_FROM_ASSET_FOLDER, - Messages.PAINTING_COMPONENT_MODEL + " " + "#" + i, PROPERTY_MODEL + "_" + i, null)); + Messages.MODEL_PROPERTY_MODEL + " " + "#" + i, PROPERTY_MODEL + "_" + i, null)); } return result; @@ -68,59 +76,77 @@ public SpawnPaintingComponent(@NotNull final PaintingComponentContainer containe protected void syncValues() { super.syncValues(); - final VarTable vars = getVars(); - final SpawnToolControl toolControl = getToolControl(); + var vars = getVars(); + var toolControl = getToolControl(); - final Array examples = ArrayFactory.newArray(Spatial.class); - final String[] selectedModels = new String[AVAILABLE_MODELS]; + var examples = ArrayFactory.newArray(Spatial.class); + var selectedModels = new String[AVAILABLE_MODELS]; - for (int i = 1; i <= AVAILABLE_MODELS; i++) { + for (var i = 1; i <= AVAILABLE_MODELS; i++) { - final String id = PROPERTY_MODEL + "_" + i; + var id = PROPERTY_MODEL + "_" + i; if (!vars.has(id)) { selectedModels[i - 1] = null; continue; } - final Spatial spatial = vars.get(id); + var spatial = vars.get(id, Spatial.class); + examples.add(spatial); - selectedModels[i - 1] = spatial.getKey().getName(); + + selectedModels[i - 1] = spatial.getKey() + .getName(); } - final SpawnMethod method = vars.get(PROPERTY_METHOD); - final Vector3f scale = vars.get(PROPERTY_SCALE); + var method = vars.getEnum(PROPERTY_METHOD, SpawnMethod.class); + var minScale = vars.get(PROPERTY_MIN_SCALE, Vector3f.class); + var maxScale = vars.get(PROPERTY_MAX_SCALE, Vector3f.class); + var padding = vars.get(PROPERTY_PADDING, Vector3f.class); - final SpawnPaintingStateWithEditorTool state = getState(); + var state = getState(); state.setMethod(method.ordinal()); - state.setScale(scale); + state.setMinScale(minScale); + state.setMaxScale(maxScale); + state.setPadding(padding); state.setSelectedModels(selectedModels); EXECUTOR_MANAGER.addJmeTask(() -> { toolControl.setMethod(method); - toolControl.setScale(scale); + toolControl.setMinScale(minScale); + toolControl.setMaxScale(maxScale); + toolControl.setPadding(padding); toolControl.updateExamples(examples); }); } @Override @FxThread - protected void readState(@NotNull final SpawnPaintingStateWithEditorTool state) { + protected void readState(@NotNull SpawnPaintingStateWithEditorTool state) { - final int method = state.getMethod(); - final String[] selectedModels = state.getSelectedModels(); + var method = state.getMethod(); + var selectedModels = state.getSelectedModels(); - final VarTable vars = getVars(); - vars.set(PROPERTY_METHOD, SpawnMethod.values()[method]); - vars.set(PROPERTY_SCALE, state.getScale()); + var vars = getVars(); + vars.set(PROPERTY_METHOD, SPAWN_METHODS[method]); + vars.set(PROPERTY_MIN_SCALE, state.getMinScale()); + vars.set(PROPERTY_MAX_SCALE, state.getMaxScale()); + vars.set(PROPERTY_PADDING, state.getPadding()); - final AssetManager assetManager = EditorUtil.getAssetManager(); + var assetManager = EditorUtil.getAssetManager(); for (int i = 1; i <= AVAILABLE_MODELS; i++) { - final String selectedModel = selectedModels[i - 1]; + + var selectedModel = selectedModels[i - 1]; if (selectedModel == null) { continue; } - vars.set(PROPERTY_MODEL + "_" + i, assetManager.loadModel(selectedModel)); + + try { + vars.set(PROPERTY_MODEL + "_" + i, assetManager.loadModel(selectedModel)); + } catch (AssetNotFoundException e) { + LOGGER.warning(this, e); + continue; + } } super.readState(state); @@ -140,7 +166,7 @@ protected void readState(@NotNull final SpawnPaintingStateWithEditorTool state) @Override @FxThread - public boolean isSupport(@NotNull final Object object) { + public boolean isSupport(@NotNull Object object) { return object instanceof Node && NodeUtils.findGeometry((Spatial) object) != null; } @@ -156,10 +182,4 @@ public boolean isSupport(@NotNull final Object object) { public @Nullable Image getIcon() { return Icons.FOREST_16; } - - @Override - @FxThread - public void notifyChangeProperty(@NotNull final Object object, @NotNull final String propertyName) { - - } } diff --git a/src/main/java/com/ss/editor/ui/component/painting/spawn/SpawnPaintingStateWithEditorTool.java b/src/main/java/com/ss/editor/ui/component/painting/spawn/SpawnPaintingStateWithEditorTool.java index bacb17a3..1bf5340f 100644 --- a/src/main/java/com/ss/editor/ui/component/painting/spawn/SpawnPaintingStateWithEditorTool.java +++ b/src/main/java/com/ss/editor/ui/component/painting/spawn/SpawnPaintingStateWithEditorTool.java @@ -18,7 +18,7 @@ public class SpawnPaintingStateWithEditorTool extends AbstractPaintingStateWithE /** * The constant serialVersionUID. */ - public static final long serialVersionUID = 3; + public static final long serialVersionUID = 4; /** * The selected models. @@ -27,10 +27,22 @@ public class SpawnPaintingStateWithEditorTool extends AbstractPaintingStateWithE private String[] selectedModels; /** - * The models scale. + * The models min scale. */ @NotNull - private Vector3f scale; + private Vector3f minScale; + + /** + * The models max scale. + */ + @NotNull + private Vector3f maxScale; + + /** + * The models padding. + */ + @NotNull + private Vector3f padding; /** * The spawn method. @@ -40,7 +52,9 @@ public class SpawnPaintingStateWithEditorTool extends AbstractPaintingStateWithE public SpawnPaintingStateWithEditorTool() { this.method = SpawnMethod.BATCH.ordinal(); this.selectedModels = new String[SpawnPaintingComponent.AVAILABLE_MODELS]; - this.scale = new Vector3f(Vector3f.UNIT_XYZ); + this.minScale = Vector3f.UNIT_XYZ.clone(); + this.maxScale = Vector3f.UNIT_XYZ.clone(); + this.padding = Vector3f.ZERO.clone(); } /** @@ -49,7 +63,7 @@ public SpawnPaintingStateWithEditorTool() { * @param method the spawn method. */ @FxThread - public void setMethod(final int method) { + public void setMethod(int method) { final boolean changed = getMethod() != method; this.method = method; if (changed) notifyChange(); @@ -66,23 +80,69 @@ public int getMethod() { } /** - * Get the models scale. + * Set the models min scale. + * + * @param minScale the models min scale. + */ + @FxThread + public void setMinScale(@NotNull Vector3f minScale) { + final boolean changed = !minScale.equals(getMinScale()); + this.minScale = minScale; + if (changed) notifyChange(); + } + + /** + * Set the models max scale. + * + * @param maxScale the models max scale. + */ + @FxThread + public void setMaxScale(@NotNull Vector3f maxScale) { + final boolean changed = !maxScale.equals(getMaxScale()); + this.maxScale = maxScale; + if (changed) notifyChange(); + } + + /** + * Set the models padding. + * + * @param padding the models padding. + */ + @FxThread + public void setPadding(@NotNull Vector3f padding) { + final boolean changed = !padding.equals(getPadding()); + this.padding = padding; + if (changed) notifyChange(); + } + + /** + * Get the models min scale. + * + * @return the models min scale. + */ + @FxThread + public @NotNull Vector3f getMinScale() { + return minScale; + } + + /** + * Get the models max scale. * - * @param scale the models scale. + * @return the models max scale. */ @FxThread - public void setScale(@NotNull final Vector3f scale) { - this.scale = scale; + public @NotNull Vector3f getMaxScale() { + return maxScale; } /** - * Set the models scale. + * Get the models padding. * - * @return the models scale. + * @return the models padding. */ @FxThread - public @NotNull Vector3f getScale() { - return scale; + public @NotNull Vector3f getPadding() { + return padding; } /** @@ -91,7 +151,7 @@ public void setScale(@NotNull final Vector3f scale) { * @param selectedModels the selected models. */ @FxThread - public void setSelectedModels(@NotNull final String[] selectedModels) { + public void setSelectedModels(@NotNull String[] selectedModels) { final boolean changed = !Arrays.equals(getSelectedModels(), selectedModels); this.selectedModels = selectedModels; if (changed) notifyChange(); diff --git a/src/main/java/com/ss/editor/ui/component/painting/terrain/TerrainPaintingComponent.java b/src/main/java/com/ss/editor/ui/component/painting/terrain/TerrainPaintingComponent.java index 00bdd8c7..0edfb08e 100644 --- a/src/main/java/com/ss/editor/ui/component/painting/terrain/TerrainPaintingComponent.java +++ b/src/main/java/com/ss/editor/ui/component/painting/terrain/TerrainPaintingComponent.java @@ -540,7 +540,7 @@ protected void createComponents() { @FxThread private void createSlopeControlSettings() { - final Label smoothlyLabel = new Label(Messages.PAINTING_COMPONENT_SMOOTHLY + ":"); + final Label smoothlyLabel = new Label(Messages.MODEL_PROPERTY_SMOOTHLY + ":"); smoothlyLabel.prefWidthProperty().bind(widthProperty().multiply(LABEL_PERCENT)); slopeControlSmoothly = new CheckBox(); @@ -548,7 +548,7 @@ private void createSlopeControlSettings() { slopeControlSmoothly.selectedProperty() .addListener((observable, oldValue, newValue) -> changeSlopeControlSmoothly(newValue)); - final Label limitedLabel = new Label(Messages.PAINTING_COMPONENT_LIMITED + ":"); + final Label limitedLabel = new Label(Messages.MODEL_PROPERTY_LIMITED + ":"); limitedLabel.prefWidthProperty().bind(widthProperty().multiply(LABEL_PERCENT)); slopeControlLimited = new CheckBox(); @@ -573,7 +573,7 @@ private void createSlopeControlSettings() { @FxThread private void createLevelControlSettings() { - final Label smoothlyLabel = new Label(Messages.PAINTING_COMPONENT_SMOOTHLY + ":"); + final Label smoothlyLabel = new Label(Messages.MODEL_PROPERTY_SMOOTHLY + ":"); smoothlyLabel.prefWidthProperty().bind(widthProperty().multiply(LABEL_PERCENT)); levelControlSmoothly = new CheckBox(); @@ -581,7 +581,7 @@ private void createLevelControlSettings() { levelControlSmoothly.selectedProperty() .addListener((observable, oldValue, newValue) -> changeLevelControlSmoothly(newValue)); - final Label useMarkerLabel = new Label(Messages.PAINTING_COMPONENT_USE_MARKER + ":"); + final Label useMarkerLabel = new Label(Messages.MODEL_PROPERTY_USE_MARKER + ":"); useMarkerLabel.prefWidthProperty().bind(widthProperty().multiply(LABEL_PERCENT)); levelControlUseMarker = new CheckBox(); @@ -589,7 +589,7 @@ private void createLevelControlSettings() { levelControlUseMarker.selectedProperty() .addListener((observable, oldValue, newValue) -> changeLevelControlUseMarker(newValue)); - final Label levelLabel = new Label(Messages.PAINTING_COMPONENT_LEVEL + ":"); + final Label levelLabel = new Label(Messages.MODEL_PROPERTY_LEVEL + ":"); levelLabel.prefWidthProperty().bind(widthProperty().multiply(LABEL_PERCENT)); levelControlLevelField = new FloatTextField(); @@ -611,7 +611,7 @@ private void createLevelControlSettings() { CssClasses.ABSTRACT_PARAM_CONTROL_PARAM_NAME_SINGLE_ROW); FXUtils.addClassesTo(levelControlSettings, CssClasses.DEF_GRID_PANE); - FXUtils.addClassTo(levelControlLevelField, CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); + FXUtils.addClassTo(levelControlLevelField, CssClasses.PROPERTY_CONTROL_COMBO_BOX); FXUtils.addClassTo(levelControlSmoothly, levelControlUseMarker, CssClasses.ABSTRACT_PARAM_CONTROL_CHECK_BOX); } @@ -621,7 +621,7 @@ private void createLevelControlSettings() { @FxThread private void createRoughControlSettings() { - final Label roughnessLabel = new Label(Messages.PAINTING_COMPONENT_ROUGHNESS + ":"); + final Label roughnessLabel = new Label(Messages.MODEL_PROPERTY_ROUGHNESS + ":"); roughnessLabel.prefWidthProperty().bind(widthProperty().multiply(LABEL_PERCENT)); roughControlRoughnessField = new FloatTextField(); @@ -629,7 +629,7 @@ private void createRoughControlSettings() { roughControlRoughnessField.setMinMax(0F, Integer.MAX_VALUE); roughControlRoughnessField.addChangeListener((observable, oldValue, newValue) -> changeRoughControlRoughness(newValue)); - final Label frequencyLabel = new Label(Messages.PAINTING_COMPONENT_FREQUENCY + ":"); + final Label frequencyLabel = new Label(Messages.MODEL_PROPERTY_FREQUENCY + ":"); frequencyLabel.prefWidthProperty().bind(widthProperty().multiply(LABEL_PERCENT)); roughControlFrequencyField = new FloatTextField(); @@ -637,7 +637,7 @@ private void createRoughControlSettings() { roughControlFrequencyField.setMinMax(0.1F, Integer.MAX_VALUE); roughControlFrequencyField.addChangeListener((observable, oldValue, newValue) -> changeRoughControlFrequency(newValue)); - final Label lacunarityLabel = new Label(Messages.PAINTING_COMPONENT_LACUNARITY + ":"); + final Label lacunarityLabel = new Label(Messages.MODEL_PROPERTY_LACUNARITY + ":"); lacunarityLabel.prefWidthProperty().bind(widthProperty().multiply(LABEL_PERCENT)); roughControlLacunarityField = new FloatTextField(); @@ -645,7 +645,7 @@ private void createRoughControlSettings() { roughControlLacunarityField.setMinMax(1.1F, Integer.MAX_VALUE); roughControlLacunarityField.addChangeListener((observable, oldValue, newValue) -> changeRoughControlLacunarity(newValue)); - final Label octavesLabel = new Label(Messages.PAINTING_COMPONENT_OCTAVES + ":"); + final Label octavesLabel = new Label(Messages.MODEL_PROPERTY_OCTAVES + ":"); octavesLabel.prefWidthProperty().bind(widthProperty().multiply(LABEL_PERCENT)); roughControlOctavesField = new FloatTextField(); @@ -653,7 +653,7 @@ private void createRoughControlSettings() { roughControlOctavesField.setMinMax(0F, Integer.MAX_VALUE); roughControlOctavesField.addChangeListener((observable, oldValue, newValue) -> changeRoughControlOctaves(newValue)); - final Label scaleLabel = new Label(Messages.PAINTING_COMPONENT_SCALE + ":"); + final Label scaleLabel = new Label(Messages.MODEL_PROPERTY_MIN_SCALE + ":"); scaleLabel.prefWidthProperty().bind(widthProperty().multiply(LABEL_PERCENT)); roughControlScaleField = new FloatTextField(); @@ -679,7 +679,7 @@ private void createRoughControlSettings() { FXUtils.addClassesTo(roughControlSettings, CssClasses.DEF_GRID_PANE); FXUtils.addClassTo(roughControlRoughnessField, roughControlFrequencyField, roughControlLacunarityField, - roughControlOctavesField, roughControlScaleField, CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); + roughControlOctavesField, roughControlScaleField, CssClasses.PROPERTY_CONTROL_COMBO_BOX); } /** @@ -688,7 +688,7 @@ private void createRoughControlSettings() { @FxThread private void createPaintControlSettings() { - final Label triPlanarLabelLabel = new Label(Messages.PAINTING_COMPONENT_TRI_PLANAR + ":"); + final Label triPlanarLabelLabel = new Label(Messages.MODEL_PROPERTY_TRI_PLANAR + ":"); triPlanarLabelLabel.prefWidthProperty().bind(widthProperty().multiply(LABEL_PERCENT)); triPlanarCheckBox = new CheckBox(); @@ -696,7 +696,7 @@ private void createPaintControlSettings() { triPlanarCheckBox.selectedProperty() .addListener((observable, oldValue, newValue) -> changePaintControlTriPlanar(newValue)); - final Label shininessLabel = new Label(Messages.PAINTING_COMPONENT_SHININESS + ":"); + final Label shininessLabel = new Label(Messages.MODEL_PROPERTY_SHININESS + ":"); shininessLabel.prefWidthProperty().bind(widthProperty().multiply(LABEL_PERCENT)); shininessField = new FloatTextField(); @@ -716,7 +716,7 @@ private void createPaintControlSettings() { FXUtils.addClassesTo(paintControlSettings, CssClasses.DEF_GRID_PANE); FXUtils.addClassTo(shininessLabel, triPlanarLabelLabel, CssClasses.ABSTRACT_PARAM_CONTROL_PARAM_NAME_SINGLE_ROW); FXUtils.addClassTo(triPlanarCheckBox, CssClasses.ABSTRACT_PARAM_CONTROL_CHECK_BOX); - FXUtils.addClassTo(shininessField, CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); + FXUtils.addClassTo(shininessField, CssClasses.PROPERTY_CONTROL_COMBO_BOX); } /** diff --git a/src/main/java/com/ss/editor/ui/component/painting/terrain/paint/TextureLayerCell.java b/src/main/java/com/ss/editor/ui/component/painting/terrain/paint/TextureLayerCell.java index 604513bb..01be6f48 100644 --- a/src/main/java/com/ss/editor/ui/component/painting/terrain/paint/TextureLayerCell.java +++ b/src/main/java/com/ss/editor/ui/component/painting/terrain/paint/TextureLayerCell.java @@ -81,7 +81,7 @@ public TextureLayerCell(final DoubleBinding prefWidth, normalTextureControl.setChangeHandler(this::updateNormal); normalTextureControl.setControlWidthPercent(PropertyControl.CONTROL_WIDTH_PERCENT_2); - final Label scaleLabel = new Label(Messages.PAINTING_COMPONENT_SCALE + ":"); + final Label scaleLabel = new Label(Messages.MODEL_PROPERTY_MIN_SCALE + ":"); scaleLabel.prefWidthProperty().bind(settingContainer.widthProperty().multiply(LABEL_PERCENT)); scaleField = new FloatTextField(); @@ -99,7 +99,7 @@ public TextureLayerCell(final DoubleBinding prefWidth, FXUtils.addClassTo(settingContainer, CssClasses.DEF_GRID_PANE); FXUtils.addClassTo(layerField, CssClasses.ABSTRACT_PARAM_CONTROL_PARAM_NAME); FXUtils.addClassTo(scaleLabel, CssClasses.ABSTRACT_PARAM_CONTROL_PARAM_NAME_SINGLE_ROW); - FXUtils.addClassTo(scaleField, CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); + FXUtils.addClassTo(scaleField, CssClasses.PROPERTY_CONTROL_COMBO_BOX); FXUtils.addClassTo(this, CssClasses.PROCESSING_COMPONENT_TERRAIN_EDITOR_TEXTURE_LAYER); } @@ -222,7 +222,7 @@ protected void refresh() { diffuseTextureControl.setTextureFile(item.getDiffuseFile()); final Label layerField = getLayerField(); - layerField.setText(Messages.PAINTING_COMPONENT_LAYER + " #" + (item.getLayer() + 1)); + layerField.setText(Messages.MODEL_PROPERTY_LAYER + " #" + (item.getLayer() + 1)); } finally { setIgnoreListeners(false); diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/EnumPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/EnumPropertyControl.java index 41bf0faa..85088ccb 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/EnumPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/EnumPropertyControl.java @@ -73,7 +73,7 @@ protected void createComponents(@NotNull HBox container) { FxControlUtils.onSelectedItemChange(enumComboBox, this::change); FxUtils.addClass(enumComboBox, - CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); + CssClasses.PROPERTY_CONTROL_COMBO_BOX); FxUtils.addChild(container, enumComboBox); } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/FloatPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/FloatPropertyControl.java index 42affe77..4c1cae91 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/FloatPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/FloatPropertyControl.java @@ -70,7 +70,7 @@ protected void createComponents(@NotNull HBox container) { FxControlUtils.onFocusChange(valueField, this::applyOnLostFocus); FxUtils.addClass(valueField, - CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); + CssClasses.PROPERTY_CONTROL_COMBO_BOX); FxUtils.addChild(container, valueField); } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/IntegerPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/IntegerPropertyControl.java index 700787e6..8d17065b 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/IntegerPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/IntegerPropertyControl.java @@ -61,7 +61,7 @@ protected void createComponents(@NotNull HBox container) { FxControlUtils.onFocusChange(valueField, this::applyOnLostFocus); FxUtils.addClass(valueField, - CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); + CssClasses.PROPERTY_CONTROL_COMBO_BOX); FxUtils.addChild(container, valueField); } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/LayerModelPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/LayerModelPropertyControl.java index a3068981..478f8c5a 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/LayerModelPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/LayerModelPropertyControl.java @@ -77,7 +77,7 @@ protected void createComponents(@NotNull HBox container) { FxControlUtils.onSelectedItemChange(layerComboBox, this::updateLevel); FxUtils.addClass(layerComboBox, - CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); + CssClasses.PROPERTY_CONTROL_COMBO_BOX); FxUtils.addChild(container, layerComboBox); } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/LodLevelPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/LodLevelPropertyControl.java index dc7f9c3a..57afb78c 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/LodLevelPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/LodLevelPropertyControl.java @@ -86,7 +86,7 @@ protected void createComponents(@NotNull HBox container) { FxControlUtils.onSelectedItemChange(levelComboBox, this::updateLevel); FxUtils.addClass(levelComboBox, - CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); + CssClasses.PROPERTY_CONTROL_COMBO_BOX); FxUtils.addChild(container, levelComboBox); } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/QuaternionPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/QuaternionPropertyControl.java index ed2ddc13..188d1c77 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/QuaternionPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/QuaternionPropertyControl.java @@ -93,7 +93,7 @@ protected void createComponents(@NotNull HBox container) { CssClasses.TEXT_INPUT_CONTAINER, CssClasses.ABSTRACT_PARAM_CONTROL_INPUT_CONTAINER) .addClass(xField, yField, zField, - CssClasses.ABSTRACT_PARAM_CONTROL_VECTOR3F_FIELD, + CssClasses.PROPERTY_CONTROL_VECTOR_3F_FIELD, CssClasses.TRANSPARENT_TEXT_FIELD); FxUtils.addChild(container, diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/StringBasedArrayPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/StringBasedArrayPropertyControl.java index bff97214..bb8e8512 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/StringBasedArrayPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/StringBasedArrayPropertyControl.java @@ -67,7 +67,7 @@ protected void createComponents(@NotNull HBox container) { .bind(widthProperty().multiply(CONTROL_WIDTH_PERCENT)); FxUtils.addClass(valueField, - CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); + CssClasses.PROPERTY_CONTROL_COMBO_BOX); FxUtils.addChild(container, valueField); } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/StringPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/StringPropertyControl.java index 31b0c4cf..b39c20f6 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/StringPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/StringPropertyControl.java @@ -52,7 +52,7 @@ protected void createComponents(@NotNull HBox container) { FxControlUtils.onFocusChange(valueField, this::applyOnLostFocus); FxUtils.addClass(valueField, - CssClasses.ABSTRACT_PARAM_CONTROL_COMBO_BOX); + CssClasses.PROPERTY_CONTROL_COMBO_BOX); FxUtils.addChild(container, valueField); } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/Vector2fPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/Vector2fPropertyControl.java index 656c6152..a973eb09 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/Vector2fPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/Vector2fPropertyControl.java @@ -218,7 +218,7 @@ public boolean isDirty() { var x = getXField().getValue(); var y = getYField().getValue(); - return GeomUtils.equals(getPropertyValue(), x, y); + return !GeomUtils.equals(getPropertyValue(), x, y); } /** diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/Vector3fPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/Vector3fPropertyControl.java index 4786998f..8f3a7544 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/Vector3fPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/Vector3fPropertyControl.java @@ -103,7 +103,7 @@ protected void createComponents(@NotNull HBox container) { CssClasses.TEXT_INPUT_CONTAINER, CssClasses.ABSTRACT_PARAM_CONTROL_INPUT_CONTAINER) .addClass(xField, yField, zField, - CssClasses.ABSTRACT_PARAM_CONTROL_VECTOR3F_FIELD, + CssClasses.PROPERTY_CONTROL_VECTOR_3F_FIELD, CssClasses.TRANSPARENT_TEXT_FIELD); FxUtils.addChild(container, @@ -188,7 +188,7 @@ public boolean isDirty() { var y = getYField().getValue(); var z = getZField().getValue(); - return GeomUtils.equals(getPropertyValue(), x, y, z); + return !GeomUtils.equals(getPropertyValue(), x, y, z); } /** diff --git a/src/main/java/com/ss/editor/ui/css/CssClasses.java b/src/main/java/com/ss/editor/ui/css/CssClasses.java index b35d9f76..1abc6b0a 100644 --- a/src/main/java/com/ss/editor/ui/css/CssClasses.java +++ b/src/main/java/com/ss/editor/ui/css/CssClasses.java @@ -87,7 +87,12 @@ public interface CssClasses { @NotNull String ABSTRACT_NODE_TREE_CONTAINER = "abstract-node-tree-container"; @NotNull String ABSTRACT_NODE_TREE_CELL = "abstract-node-tree-cell"; - @NotNull String ABSTRACT_PARAM_EDITOR_CONTROL = "abstract-param-editor-control"; + @NotNull String PROPERTY_EDITOR_CONTROL = "property-editor-control"; + + @NotNull String PROPERTY_CONTROL_VECTOR_3F_FIELD = "property-control-vector-3f-field"; + @NotNull String PROPERTY_CONTROL_RESOURCE = "property-control-resource"; + @NotNull String PROPERTY_CONTROL_COMBO_BOX = "property-control-combo-box"; + @NotNull String ABSTRACT_PARAM_CONTROL_PARAM_NAME_SINGLE_ROW = "abstract-param-control-param-name-single-row"; @NotNull String ABSTRACT_PARAM_CONTROL_PARAM_NAME = "abstract-param-control-param-name"; @NotNull String ABSTRACT_PARAM_CONTROL_ELEMENT_LABEL = "abstract-param-control-element-label"; @@ -96,12 +101,9 @@ public interface CssClasses { @NotNull String ABSTRACT_PARAM_CONTROL_SHORT_INPUT_CONTAINER = "abstract-param-control-short-input-container"; @NotNull String ABSTRACT_PARAM_CONTROL_CHECK_BOX = "abstract-param-control-checkbox"; @NotNull String ABSTRACT_PARAM_CONTROL_COLOR_PICKER = "abstract-param-control-param-color-picker"; - @NotNull String ABSTRACT_PARAM_CONTROL_COMBO_BOX = "abstract-param-control-combobox"; @NotNull String ABSTRACT_PARAM_CONTROL_VECTOR2F_FIELD = "abstract-param-control-vector2f-field"; - @NotNull String ABSTRACT_PARAM_CONTROL_VECTOR3F_FIELD = "abstract-param-control-vector3f-field"; @NotNull String ABSTRACT_PARAM_CONTROL_LABEL_VALUE = "abstract-param-control-label-value"; @NotNull String ABSTRACT_PARAM_CONTROL_NUMBER_LABEL = "abstract-param-control-number-label"; - @NotNull String ABSTRACT_RESOURCE_PROPERTY_CONTROL = "abstract-resource-property-control"; @NotNull String PROPERTY_EDITOR = "property-editor"; @NotNull String PROPERTY_EDITOR_CONTAINER = "property-editor-container"; diff --git a/src/main/java/com/ss/editor/ui/dialog/sky/CreateSkyDialog.java b/src/main/java/com/ss/editor/ui/dialog/sky/CreateSkyDialog.java index d27dc031..3bb91a60 100644 --- a/src/main/java/com/ss/editor/ui/dialog/sky/CreateSkyDialog.java +++ b/src/main/java/com/ss/editor/ui/dialog/sky/CreateSkyDialog.java @@ -325,7 +325,7 @@ protected void createContent(@NotNull final VBox root) { FXUtils.addClassTo(skyTypeLabel, normalScaleLabel, CssClasses.DIALOG_DYNAMIC_LABEL); FXUtils.addClassTo(skyTypeComboBox, CssClasses.DIALOG_FIELD); FXUtils.addClassesTo(normalScaleXField, normalScaleYField, normalScaleZField, - CssClasses.ABSTRACT_PARAM_CONTROL_VECTOR3F_FIELD, CssClasses.TRANSPARENT_TEXT_FIELD); + CssClasses.PROPERTY_CONTROL_VECTOR_3F_FIELD, CssClasses.TRANSPARENT_TEXT_FIELD); UiUtils.addFocusBinding(normalScaleContainer, normalScaleXField, normalScaleYField, normalScaleZField); } diff --git a/src/main/java/com/ss/editor/util/EditorUtil.java b/src/main/java/com/ss/editor/util/EditorUtil.java index f64a9cd1..674cf5f6 100644 --- a/src/main/java/com/ss/editor/util/EditorUtil.java +++ b/src/main/java/com/ss/editor/util/EditorUtil.java @@ -45,6 +45,8 @@ import com.ss.rlib.common.util.ClassUtils; import com.ss.rlib.common.util.StringUtils; import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.dictionary.DictionaryFactory; +import com.ss.rlib.common.util.dictionary.ObjectDictionary; import javafx.scene.input.ClipboardContent; import javafx.scene.input.DataFormat; import javafx.scene.input.Dragboard; @@ -72,24 +74,17 @@ */ public abstract class EditorUtil { - @NotNull private static final Logger LOGGER = LoggerManager.getLogger(EditorUtil.class); - /** - * The constant JAVA_PARAM. - */ - @NotNull - public static final DataFormat JAVA_PARAM = new DataFormat("SSEditor.javaParam"); - - /** - * Represents a list of files. - */ + public static final DataFormat JAVA_PARAM = new DataFormat("jMB.javaParam"); public static final DataFormat GNOME_FILES = new DataFormat("x-special/gnome-copied-files"); - @NotNull private static final ThreadLocal LOCATE_DATE_FORMAT = withInitial(() -> new SimpleDateFormat("HH:mm:ss:SSS")); + private static ThreadLocal, Enum[]>> ENUM_VALUES_LOCAL = + ThreadLocal.withInitial(DictionaryFactory::newObjectDictionary); + @NotNull private static JmeApplication jmeApplication; @@ -877,7 +872,7 @@ public static float clipNumber(float value, float mod) { var enumConstants = valueClass.getEnumConstants(); - return ClassUtils.unsafeCast(enumConstants); + return unsafeCast(enumConstants); } /** @@ -1000,4 +995,22 @@ public static void openInEditor(@Nullable AssetKey assetKey) { List files = unsafeCast(dragboard.getContent(DataFormat.FILES)); return files == null ? Collections.emptyList() : files; } + + /** + * Get an array of enum constants by the class. + * + * @param enumType the enum's class. + * @param the enum's type. + * @return the array of enum's constants. + */ + @FromAnyThread + public static T[] getEnumValues(@NotNull Class enumType) { + + if(!enumType.isEnum()) { + throw new IllegalArgumentException("The type " + enumType + " isn't a enum."); + } + + return unsafeCast(ENUM_VALUES_LOCAL.get() + .get(enumType, type -> (Enum[]) type.getEnumConstants())); + } } diff --git a/src/main/resources/messages/messages.properties b/src/main/resources/messages/messages.properties index 5370c0cb..4a71c727 100644 --- a/src/main/resources/messages/messages.properties +++ b/src/main/resources/messages/messages.properties @@ -456,6 +456,22 @@ ModelPropertyLightMode=Light mode ModelPropertyColorSpace=Color space ModelPropertyLanguage=Language ModelPropertyTexture=Texture +ModelPropertyBrushSize=Brush size +ModelPropertyBrushPower=Brush power +ModelPropertySmoothly=Smoothly +ModelPropertyLimited=Limited +ModelPropertyUseMarker=User marker +ModelPropertyRoughness=Roughness +ModelPropertyFrequency=Frequency +ModelPropertyLacunarity=Lacunarity +ModelPropertyOctaves=Octaves +ModelPropertyMinScale=Min scale +ModelPropertyMaxScale=Max scale +ModelPropertyPadding=Padding +ModelPropertyTriPlanar=Tri-planar +ModelPropertyShininess=Shininess +ModelPropertyModel=Model +ModelPropertyMethod=Method MaterialModelPropertyControlNoTexture=No texture MaterialModelPropertyControlTextureSettings=Texture settings @@ -616,23 +632,6 @@ CreateParticleEmitterQuadShapeDialogTitle=Creating a quad shape CreateParticleEmitterTorusShapeDialogTitle=Creating a torus shape CreateParticleEmitterTriangleShapeDialogTitle=Creating a triangle shape -PaintingComponentBrushSize=Brush size -PaintingComponentBrushPower=Brush power -PaintingComponentSmoothly=Smoothly -PaintingComponentLimited=Limited -PaintingComponentUseMarker=User marker -PaintingComponentLevel=Level -PaintingComponentRoughness=Roughness -PaintingComponentFrequency=Frequency -PaintingComponentLacunarity=Lacunarity -PaintingComponentOctaves=Octaves -PaintingComponentScale=Scale -PaintingComponentTriPlanar=Tri-planar -PaintingComponentShininess=Shininess -PaintingComponentLayer=Layer -PaintingComponentModel=Model -PaintingComponentMethod=Method - ModelConverterDialogTitle=Model converting ModelConverterDialogResultName=Result name ModelConverterDialogDestinationFolder=Destination folder diff --git a/src/main/resources/messages/messages_de.properties b/src/main/resources/messages/messages_de.properties index 94ad9ad6..51d53a99 100644 --- a/src/main/resources/messages/messages_de.properties +++ b/src/main/resources/messages/messages_de.properties @@ -456,6 +456,22 @@ ModelPropertyLightMode=Lichtmodus ModelPropertyColorSpace=Farbraum ModelPropertyLanguage=Sprache ModelPropertyTexture=Textur +ModelPropertyBrushSize=Pinselgröße +ModelPropertyBrushPower=Pinselstärke +ModelPropertySmoothly=Weich +ModelPropertyLimited=Begrenzt +ModelPropertyUseMarker=Benutze Marker +ModelPropertyRoughness=Rauheit +ModelPropertyFrequency=Frequenz +ModelPropertyLacunarity=Lakunarität +ModelPropertyOctaves=Oktaven +ModelPropertyMinScale=Min scale +ModelPropertyMaxScale=Max scale +ModelPropertyPadding=Padding +ModelPropertyTriPlanar=Dreiflächig +ModelPropertyShininess=Glänzend +ModelPropertyModel=Model +ModelPropertyMethod=Method MaterialModelPropertyControlNoTexture=Keine Textur MaterialModelPropertyControlTextureSettings=Textureinstellungen @@ -616,23 +632,6 @@ CreateParticleEmitterQuadShapeDialogTitle=Viereck-Form erstellen CreateParticleEmitterTorusShapeDialogTitle=Torus-Form erstellen CreateParticleEmitterTriangleShapeDialogTitle=Dreieck-Form erstellen -PaintingComponentBrushSize=Pinselgröße -PaintingComponentBrushPower=Pinselstärke -PaintingComponentSmoothly=Weich -PaintingComponentLimited=Begrenzt -PaintingComponentUseMarker=Benutze Marker -PaintingComponentLevel=Stufe -PaintingComponentRoughness=Rauheit -PaintingComponentFrequency=Frequenz -PaintingComponentLacunarity=Lakunarität -PaintingComponentOctaves=Oktaven -PaintingComponentScale=Maßstab -PaintingComponentTriPlanar=Dreiflächig -PaintingComponentShininess=Glänzend -PaintingComponentLayer=Schicht -PaintingComponentModel=Model -PaintingComponentMethod=Method - ModelConverterDialogTitle=Modellkonvertierung ModelConverterDialogResultName=Resultierender Name ModelConverterDialogDestinationFolder=Ablageverzeichnis diff --git a/src/main/resources/messages/messages_fr.properties b/src/main/resources/messages/messages_fr.properties index bf0622b8..b93d42cf 100644 --- a/src/main/resources/messages/messages_fr.properties +++ b/src/main/resources/messages/messages_fr.properties @@ -456,7 +456,22 @@ ModelPropertyLightMode=Mode lumière ModelPropertyColorSpace=Espace colorimétrique ModelPropertyLanguage=Langue ModelPropertyTexture=Texture - +ModelPropertyBrushSize=Taille du pinceau +ModelPropertyBrushPower=Force du pincen (Intensité) +ModelPropertySmoothly=En douceur +ModelPropertyLimited=Limité +ModelPropertyUseMarker=Marqueur de l'utilisateur +ModelPropertyRoughness=Rugosité +ModelPropertyFrequency=Fréquence +ModelPropertyLacunarity=Lacunarité +ModelPropertyOctaves=Octaves +ModelPropertyMinScale=Min scale +ModelPropertyMaxScale=Max scale +ModelPropertyPadding=Padding +ModelPropertyTriPlanar=Tri-planaire +ModelPropertyShininess=Brillance +ModelPropertyModel=Model +ModelPropertyMethod=Method MaterialModelPropertyControlNoTexture=Aucune texture @@ -618,23 +633,6 @@ CreateParticleEmitterQuadShapeDialogTitle=Création d'une forme de quad CreateParticleEmitterTorusShapeDialogTitle=Création d'une forme de tore CreateParticleEmitterTriangleShapeDialogTitle=Création d'une forme de triangle -PaintingComponentBrushSize=Taille du pinceau -PaintingComponentBrushPower=Force du pincen (Intensité) -PaintingComponentSmoothly=En douceur -PaintingComponentLimited=Limité -PaintingComponentUseMarker=Marqueur de l'utilisateur -PaintingComponentLevel=Niveau -PaintingComponentRoughness=Rugosité -PaintingComponentFrequency=Fréquence -PaintingComponentLacunarity=Lacunarité -PaintingComponentOctaves=Octaves -PaintingComponentScale=Echelle -PaintingComponentTriPlanar=Tri-planaire -PaintingComponentShininess=Brillance -PaintingComponentLayer=Couche -PaintingComponentModel=Model -PaintingComponentMethod=Method - ModelConverterDialogTitle=Conversion de modèle ModelConverterDialogResultName=Nom du résultat ModelConverterDialogDestinationFolder=Dossier de destination diff --git a/src/main/resources/messages/messages_ru.properties b/src/main/resources/messages/messages_ru.properties index 058c948d..d9328f54 100644 --- a/src/main/resources/messages/messages_ru.properties +++ b/src/main/resources/messages/messages_ru.properties @@ -458,6 +458,22 @@ ModelPropertyLightMode=Режим света ModelPropertyColorSpace=Цвет. пространст. ModelPropertyLanguage=Язык ModelPropertyTexture=Текстура +ModelPropertyBrushSize=Размер кисти +ModelPropertyBrushPower=Сила кисти +ModelPropertySmoothly=Плавно +ModelPropertyLimited=Ограничено +ModelPropertyUseMarker=Использовать маркер +ModelPropertyRoughness=Шершавость +ModelPropertyFrequency=Частота +ModelPropertyLacunarity=Лакунарность +ModelPropertyOctaves=Октав +ModelPropertyMinScale=Мин. маштаб +ModelPropertyMaxScale=Макс. маштаб +ModelPropertyPadding=Паддинг +ModelPropertyTriPlanar=Три-плоскостной +ModelPropertyShininess=Блеск +ModelPropertyModel=Модель +ModelPropertyMethod=Метод MaterialModelPropertyControlNoTexture=Нет текстуры MaterialModelPropertyControlTextureSettings=Настройки текстуры @@ -618,23 +634,6 @@ CreateParticleEmitterQuadShapeDialogTitle=Создание формы квадр CreateParticleEmitterTorusShapeDialogTitle=Создание формы торуса CreateParticleEmitterTriangleShapeDialogTitle=Создание формы треугольника -PaintingComponentBrushSize=Размер кисти -PaintingComponentBrushPower=Сила кисти -PaintingComponentSmoothly=Плавно -PaintingComponentLimited=Ограничено -PaintingComponentUseMarker=Использовать маркер -PaintingComponentLevel=Уровень -PaintingComponentRoughness=Шершавость -PaintingComponentFrequency=Частота -PaintingComponentLacunarity=Лакунарность -PaintingComponentOctaves=Октав -PaintingComponentScale=Маштаб -PaintingComponentTriPlanar=Три-плоскостной -PaintingComponentShininess=Блеск -PaintingComponentLayer=Слой -PaintingComponentModel=Модель -PaintingComponentMethod=Метод - ModelConverterDialogTitle=Конвертирование модели ModelConverterDialogResultName=Итоговое имя ModelConverterDialogDestinationFolder=Папка для сохранения diff --git a/src/main/resources/messages/messages_zh_CN.properties b/src/main/resources/messages/messages_zh_CN.properties index 0a0b8b6e..cd5c2373 100644 --- a/src/main/resources/messages/messages_zh_CN.properties +++ b/src/main/resources/messages/messages_zh_CN.properties @@ -458,6 +458,22 @@ ModelPropertyLightMode=\u706f\u5149\u6a21\u5f0f ModelPropertyColorSpace=\u989c\u8272\u7a7a\u95f4 ModelPropertyLanguage=\u8bed\u8a00 ModelPropertyTexture=\u7eb9\u7406 +ModelPropertyBrushSize=\u7b14\u5237\u5c3a\u5bf8 +ModelPropertyBrushPower=\u7b14\u5237\u529b\u5ea6 +ModelPropertySmoothly=\u5e73\u6ed1\u7684 +ModelPropertyLimited=\u53d7\u9650\u7684 +ModelPropertyUseMarker=\u7528\u6237\u6807\u8bb0 +ModelPropertyRoughness=\u7c97\u7cd9\u5ea6 +ModelPropertyFrequency=\u9891\u7387 +ModelPropertyLacunarity=\u5b54\u9699\u5ea6 +ModelPropertyOctaves=\u516b\u8fb9\u5f62 +ModelPropertyMinScale=Min scale +ModelPropertyMaxScale=Max scale +ModelPropertyPadding=Padding +ModelPropertyTriPlanar=\u4e09\u5e73\u9762 +ModelPropertyShininess=\u5149\u4eae\u5ea6 +ModelPropertyModel=Model +ModelPropertyMethod=Method MaterialModelPropertyControlNoTexture=\u6ca1\u6709\u7eb9\u7406 MaterialModelPropertyControlTextureSettings=\u7eb9\u7406\u8bbe\u7f6e @@ -618,23 +634,6 @@ CreateParticleEmitterQuadShapeDialogTitle=\u521b\u5efa\u56db\u8fb9\u5f62\u72b6\u CreateParticleEmitterTorusShapeDialogTitle=\u521b\u5efa\u5706\u73af\u72b6\u53d1\u751f\u5668 CreateParticleEmitterTriangleShapeDialogTitle=\u521b\u5efa\u4e09\u89d2\u5f62\u53d1\u751f\u5668 -PaintingComponentBrushSize=\u7b14\u5237\u5c3a\u5bf8 -PaintingComponentBrushPower=\u7b14\u5237\u529b\u5ea6 -PaintingComponentSmoothly=\u5e73\u6ed1\u7684 -PaintingComponentLimited=\u53d7\u9650\u7684 -PaintingComponentUseMarker=\u7528\u6237\u6807\u8bb0 -PaintingComponentLevel=\u7b49\u7ea7 -PaintingComponentRoughness=\u7c97\u7cd9\u5ea6 -PaintingComponentFrequency=\u9891\u7387 -PaintingComponentLacunarity=\u5b54\u9699\u5ea6 -PaintingComponentOctaves=\u516b\u8fb9\u5f62 -PaintingComponentScale=\u7f29\u653e -PaintingComponentTriPlanar=\u4e09\u5e73\u9762 -PaintingComponentShininess=\u5149\u4eae\u5ea6 -PaintingComponentLayer=\u5c42\u6b21 -PaintingComponentModel=Model -PaintingComponentMethod=Method - ModelConverterDialogTitle=\u6a21\u578b\u8f6c\u6362 ModelConverterDialogResultName=\u6587\u4ef6\u540d ModelConverterDialogDestinationFolder=\u6587\u4ef6\u4fdd\u5b58\u76ee\u5f55 diff --git a/src/main/resources/ui/css/base.css b/src/main/resources/ui/css/base.css index bcc33639..71d0a5ec 100644 --- a/src/main/resources/ui/css/base.css +++ b/src/main/resources/ui/css/base.css @@ -24,6 +24,7 @@ -var-default-label-height: 22px; -var-default-field-height: 26px; + -var-default-field-inner-height: 22px; -var-default-field-preview-height: 24px; -var-default-inner-field-height: 22px; -var-default-cell-height: 22px; diff --git a/src/main/resources/ui/css/custom_classes.css b/src/main/resources/ui/css/custom_classes.css index efecd8bb..8911c539 100644 --- a/src/main/resources/ui/css/custom_classes.css +++ b/src/main/resources/ui/css/custom_classes.css @@ -134,6 +134,7 @@ -fx-border-radius: 1px; -fx-padding: 1px 1px 1px 4px; -fx-min-height: -var-default-field-height; + -fx-alignment: center; } .text-input-container:focused { @@ -719,13 +720,39 @@ .property-editor-container-split-line > .hbox { -fx-border-color: -var-border-color transparent transparent transparent, - transparent transparent transparent transparent; + transparent transparent transparent transparent; -fx-border-insets: 0, 1 0 0 0; -fx-border-style: none; -fx-padding: 0px; } +/******************************************************************************* + * * + * Property Control * + * * + ******************************************************************************/ + + +.property-control-resource { + +} + +.property-control-resource > .hbox { + -fx-padding: 0px 0px 0px 4px; +} + +.property-control-combo-box { +} + +.property-control-vector-3f-field { + -fx-min-height: -var-default-field-inner-height; +} + +.property-control-vector-3f-field:focused { + -fx-min-height: -var-default-field-inner-height; +} + /******************************************************************************* * * @@ -790,14 +817,9 @@ .abstract-param-control-checkbox { } -.abstract-param-control-combobox { -} - .abstract-param-control-vector2f-field { } -.abstract-param-control-vector3f-field { -} .abstract-param-control-label-value { -fx-alignment: center-left; @@ -1223,25 +1245,11 @@ /******************************************************************************* * * - * Abstract Resource Property Control * - * * - ******************************************************************************/ - -.abstract-resource-property-control { - -} - -.abstract-resource-property-control > .hbox { - -fx-padding: 0px 0px 0px 4px; -} - -/******************************************************************************* - * * - * Abstract Param Editor Control * + * Property Editor Control * * * ******************************************************************************/ -.abstract-param-editor-control { +.property-editor-control { -fx-padding: 1px 0px 1px 0px; -fx-spacing: 2px; } From 6fa6634285d0d2ffb589fe4e3ffa6d860f0f8acf Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Tue, 15 May 2018 08:02:22 +0300 Subject: [PATCH 37/49] updated jme's class. --- src/main/java/com/jme3/scene/Spatial.java | 85 ++++------------------- 1 file changed, 14 insertions(+), 71 deletions(-) diff --git a/src/main/java/com/jme3/scene/Spatial.java b/src/main/java/com/jme3/scene/Spatial.java index b33c26a8..c0df8334 100644 --- a/src/main/java/com/jme3/scene/Spatial.java +++ b/src/main/java/com/jme3/scene/Spatial.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2013 jMonkeyEngine + * Copyright (c) 2009-2018 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -31,6 +31,7 @@ */ package com.jme3.scene; +import com.jme3.anim.util.HasLocalTransform; import com.jme3.asset.AssetKey; import com.jme3.asset.CloneableSmartAsset; import com.jme3.bounding.BoundingVolume; @@ -48,18 +49,18 @@ import com.jme3.renderer.queue.RenderQueue.Bucket; import com.jme3.renderer.queue.RenderQueue.ShadowMode; import com.jme3.scene.control.Control; +import com.jme3.util.SafeArrayList; +import com.jme3.util.TempVars; import com.jme3.util.clone.Cloner; import com.jme3.util.clone.IdentityCloneFunction; import com.jme3.util.clone.JmeCloneable; -import com.jme3.util.SafeArrayList; -import com.jme3.util.TempVars; import java.io.IOException; import java.util.*; import java.util.logging.Logger; /** * Spatial defines the base class for scene graph nodes. It - * maintains a link to a parent, it's local transforms and the world's + * maintains a link to a parent, its local transforms and the world's * transforms. All other scene graph elements, such as {@link Node} and * {@link Geometry} are subclasses of Spatial. * @@ -67,7 +68,7 @@ * @author Joshua Slack * @version $Revision: 4075 $, $Data$ */ -public abstract class Spatial implements Savable, Cloneable, Collidable, CloneableSmartAsset, JmeCloneable { +public abstract class Spatial implements Savable, Cloneable, Collidable, CloneableSmartAsset, JmeCloneable, HasLocalTransform { private static final Logger logger = Logger.getLogger(Spatial.class.getName()); @@ -573,8 +574,8 @@ public void lookAt(Vector3f position, Vector3f upVector) { * Should be overridden by Node and Geometry. */ protected void updateWorldBound() { - // the world bound of a leaf is the same as it's model bound - // for a node, the world bound is a combination of all it's children + // the world bound of a leaf is the same as its model bound + // for a node, the world bound is a combination of all its children // bounds // -> handled by subclass refreshFlags &= ~RF_BOUND; @@ -972,7 +973,7 @@ protected void setParent(Node parent) { } /** - * removeFromParent removes this Spatial from it's parent. + * removeFromParent removes this Spatial from its parent. * * @return true if it has a parent and performed the remove. */ @@ -1373,66 +1374,11 @@ public Spatial clone( boolean cloneMaterial ) { } /** - * The old clone() method that did not use the new Cloner utility. + * The old clone() method that did not use the new Cloner utility. */ + @Deprecated public Spatial oldClone(boolean cloneMaterial) { - try { - Spatial clone = (Spatial) super.clone(); - if (worldBound != null) { - clone.worldBound = worldBound.clone(); - } - clone.worldLights = worldLights.clone(); - clone.localLights = localLights.clone(); - - // Set the new owner of the light lists - clone.localLights.setOwner(clone); - clone.worldLights.setOwner(clone); - - clone.worldOverrides = new SafeArrayList<>(MatParamOverride.class); - clone.localOverrides = new SafeArrayList<>(MatParamOverride.class); - - for (MatParamOverride override : localOverrides) { - clone.localOverrides.add((MatParamOverride) override.clone()); - } - - // No need to force cloned to update. - // This node already has the refresh flags - // set below so it will have to update anyway. - clone.worldTransform = worldTransform.clone(); - clone.localTransform = localTransform.clone(); - - if (clone instanceof Node) { - Node node = (Node) this; - Node nodeClone = (Node) clone; - nodeClone.children = new SafeArrayList(Spatial.class); - for (Spatial child : node.children) { - Spatial childClone = child.clone(cloneMaterial); - childClone.parent = nodeClone; - nodeClone.children.add(childClone); - } - } - - clone.parent = null; - clone.setBoundRefresh(); - clone.setTransformRefresh(); - clone.setLightListRefresh(); - clone.setMatParamOverrideRefresh(); - - clone.controls = new SafeArrayList(Control.class); - for (int i = 0; i < controls.size(); i++) { - Control newControl = controls.get(i).cloneForSpatial(clone); - newControl.setSpatial(clone); - clone.controls.add(newControl); - } - - if (userData != null) { - clone.userData = (HashMap) userData.clone(); - } - - return clone; - } catch (CloneNotSupportedException ex) { - throw new AssertionError(); - } + throw new UnsupportedOperationException(); } /** @@ -1442,9 +1388,6 @@ public Spatial oldClone(boolean cloneMaterial) { * Note that meshes of geometries are not cloned explicitly, they * are shared if static, or specially cloned if animated. * - * All controls will be cloned using the Control.cloneForSpatial method - * on the clone. - * * @see Mesh#cloneForAnim() */ @Override @@ -1876,7 +1819,7 @@ public boolean isVisible() { * * @param visible the visible */ - public void setVisible(final boolean visible) { + public void setVisible(boolean visible) { this.visible = visible; } -} \ No newline at end of file +} From a9998bb3a7c2749530a85efc213d158dd0ab6ad1 Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Tue, 15 May 2018 09:34:29 +0300 Subject: [PATCH 38/49] property control refactoring. --- build.gradle | 2 +- .../control/AwtFontPropertyEditorControl.java | 57 +++++++------ .../control/BooleanPropertyEditorControl.java | 29 ++++--- .../control/ColorPropertyEditorControl.java | 27 ++++--- .../ComboBoxPropertyEditorControl.java | 77 ++++++++++++++++++ .../control/EnumPropertyEditorControl.java | 62 +------------- .../ObjectFromListPropertyEditorControl.java | 72 +++-------------- .../StringFromListPropertyEditorControl.java | 81 ++++--------------- .../control/StringPropertyEditorControl.java | 24 ++++-- .../terrain/TerrainPaintingComponent.java | 6 +- .../property/impl/BooleanPropertyControl.java | 2 +- .../property/impl/ColorPropertyControl.java | 2 +- .../java/com/ss/editor/ui/css/CssClasses.java | 4 +- src/main/resources/ui/css/custom_classes.css | 10 +-- 14 files changed, 203 insertions(+), 252 deletions(-) create mode 100644 src/main/java/com/ss/editor/plugin/api/property/control/ComboBoxPropertyEditorControl.java diff --git a/build.gradle b/build.gradle index cd47cc20..b54439f5 100644 --- a/build.gradle +++ b/build.gradle @@ -128,7 +128,7 @@ dependencies { // base compile group: 'org.fxmisc.richtext', name: 'richtextfx', version: '0.9.0' compile 'org.controlsfx:controlsfx:9.0.0' - compile 'com.spaceshift:rlib.fx:5.0.0' + compile 'com.spaceshift:rlib.fx:5.0.1' compile 'com.spaceshift:rlib.common:7.0.0' compile ('com.jme3:jfx:2.0.0') { exclude group: 'org.jmonkeyengine' diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/AwtFontPropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/AwtFontPropertyEditorControl.java index f2fc5f70..2286eb42 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/AwtFontPropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/AwtFontPropertyEditorControl.java @@ -4,13 +4,13 @@ import com.ss.editor.annotation.FxThread; import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.fx.util.FXUtils; import com.ss.rlib.common.util.StringUtils; import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.fx.util.FxControlUtils; +import com.ss.rlib.fx.util.FxUtils; import impl.org.controlsfx.autocompletion.AutoCompletionTextFieldBinding; import impl.org.controlsfx.autocompletion.SuggestionProvider; import javafx.scene.control.ComboBox; -import javafx.scene.control.SingleSelectionModel; import javafx.util.StringConverter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -25,22 +25,18 @@ */ public class AwtFontPropertyEditorControl extends PropertyEditorControl { - @NotNull private static final GraphicsEnvironment GRAPHICS_ENVIRONMENT = GraphicsEnvironment.getLocalGraphicsEnvironment(); - - @NotNull private static final Font[] FONTS = GRAPHICS_ENVIRONMENT.getAllFonts(); - @NotNull private static final StringConverter STRING_CONVERTER = new StringConverter() { @Override - public @NotNull String toString(@Nullable final Font font) { + public @NotNull String toString(@Nullable Font font) { return font == null ? StringUtils.EMPTY : font.getFontName(); } @Override - public @Nullable Font fromString(@NotNull final String fontName) { + public @Nullable Font fromString(@NotNull String fontName) { return Arrays.stream(FONTS) .filter(font -> font.getFontName().equals(fontName)) .findAny().orElse(null); @@ -53,8 +49,11 @@ public class AwtFontPropertyEditorControl extends PropertyEditorControl { @Nullable private ComboBox comboBox; - protected AwtFontPropertyEditorControl(@NotNull final VarTable vars, @NotNull final PropertyDefinition definition, - @NotNull final Runnable validationCallback) { + protected AwtFontPropertyEditorControl( + @NotNull VarTable vars, + @NotNull PropertyDefinition definition, + @NotNull Runnable validationCallback + ) { super(vars, definition, validationCallback); } @@ -64,23 +63,27 @@ protected void createComponents() { super.createComponents(); comboBox = new ComboBox<>(); - comboBox.prefWidthProperty().bind(widthProperty().multiply(DEFAULT_FIELD_W_PERCENT)); comboBox.getItems().addAll(FONTS); comboBox.setVisibleRowCount(20); comboBox.setConverter(STRING_CONVERTER); comboBox.setEditable(true); + comboBox.prefWidthProperty() + .bind(widthProperty().multiply(DEFAULT_FIELD_W_PERCENT)); - final SingleSelectionModel selectionModel = comboBox.getSelectionModel(); - selectionModel.selectedItemProperty().addListener((observable, oldValue, newValue) -> change()); + var selectionModel = comboBox.getSelectionModel(); - final AutoCompletionTextFieldBinding binding = - new AutoCompletionTextFieldBinding<>(comboBox.getEditor(), - SuggestionProvider.create(comboBox.getItems()), STRING_CONVERTER); + var binding = new AutoCompletionTextFieldBinding(comboBox.getEditor(), + SuggestionProvider.create(comboBox.getItems()), STRING_CONVERTER); binding.setOnAutoCompleted(event -> selectionModel.select(event.getCompletion())); - FXUtils.addClassesTo(comboBox.getEditor(), CssClasses.TRANSPARENT_TEXT_FIELD, CssClasses.TEXT_FIELD_IN_COMBO_BOX); - FXUtils.addClassTo(comboBox, CssClasses.PROPERTY_CONTROL_COMBO_BOX); - FXUtils.addToPane(comboBox, this); + FxControlUtils.onSelectedItemChange(comboBox, this::change); + + FxUtils.addClass(comboBox.getEditor(), + CssClasses.TRANSPARENT_TEXT_FIELD, CssClasses.TEXT_FIELD_IN_COMBO_BOX) + .addClass(comboBox, + CssClasses.PROPERTY_CONTROL_COMBO_BOX); + + FxUtils.addChild(this, comboBox); } /** @@ -95,17 +98,21 @@ protected void createComponents() { @FxThread public void reload() { super.reload(); - final Font value = getPropertyValue(); - final ComboBox enumComboBox = getComboBox(); - enumComboBox.getSelectionModel().select(value); + var value = getPropertyValue(); + getComboBox().getSelectionModel() + .select(value); } @Override @FxThread protected void changeImpl() { - final ComboBox comboBox = getComboBox(); - final SingleSelectionModel selectionModel = comboBox.getSelectionModel(); - setPropertyValue(selectionModel.getSelectedItem()); + + var selectionItem = getComboBox() + .getSelectionModel() + .getSelectedItem(); + + setPropertyValue(selectionItem); + super.changeImpl(); } } diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/BooleanPropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/BooleanPropertyEditorControl.java index bddc2eac..52766ca3 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/BooleanPropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/BooleanPropertyEditorControl.java @@ -2,10 +2,11 @@ import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FxThread; -import com.ss.editor.ui.css.CssClasses; import com.ss.editor.plugin.api.property.PropertyDefinition; -import com.ss.rlib.fx.util.FXUtils; +import com.ss.editor.ui.css.CssClasses; import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.fx.util.FxControlUtils; +import com.ss.rlib.fx.util.FxUtils; import javafx.scene.control.CheckBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -23,8 +24,11 @@ public class BooleanPropertyEditorControl extends PropertyEditorControl @Nullable private CheckBox checkBox; - protected BooleanPropertyEditorControl(@NotNull final VarTable vars, @NotNull final PropertyDefinition definition, - @NotNull final Runnable validationCallback) { + protected BooleanPropertyEditorControl( + @NotNull VarTable vars, + @NotNull PropertyDefinition definition, + @NotNull Runnable validationCallback + ) { super(vars, definition, validationCallback); } @@ -34,15 +38,19 @@ protected void createComponents() { super.createComponents(); checkBox = new CheckBox(); - checkBox.selectedProperty().addListener((observable, oldValue, newValue) -> change()); - checkBox.prefWidthProperty().bind(widthProperty().multiply(DEFAULT_FIELD_W_PERCENT)); + checkBox.prefWidthProperty() + .bind(widthProperty().multiply(DEFAULT_FIELD_W_PERCENT)); + + FxControlUtils.onSelectedChange(checkBox, this::change); - FXUtils.addToPane(checkBox, this); - FXUtils.addClassTo(checkBox, CssClasses.ABSTRACT_PARAM_CONTROL_CHECK_BOX); + FxUtils.addClass(checkBox, CssClasses.PROPERTY_CONTROL_CHECK_BOX); + FxUtils.addChild(this, checkBox); } /** - * @return the CheckBox with current value. + * Get the check box with current value. + * + * @return the check box with current value. */ @FxThread private @NotNull CheckBox getCheckBox() { @@ -53,8 +61,7 @@ protected void createComponents() { @FxThread public void reload() { super.reload(); - final Boolean value = getPropertyValue(); - getCheckBox().setSelected(value == null ? false : value); + getCheckBox().setSelected(Boolean.TRUE.equals(getPropertyValue())); } @Override diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/ColorPropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/ColorPropertyEditorControl.java index 7fa4be00..eb35d7d5 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/ColorPropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/ColorPropertyEditorControl.java @@ -6,8 +6,9 @@ import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.ui.util.UiUtils; -import com.ss.rlib.fx.util.FXUtils; import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.fx.util.FxControlUtils; +import com.ss.rlib.fx.util.FxUtils; import javafx.scene.control.ColorPicker; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -25,8 +26,11 @@ public class ColorPropertyEditorControl extends PropertyEditorControl @Nullable private ColorPicker colorPicker; - protected ColorPropertyEditorControl(@NotNull final VarTable vars, @NotNull final PropertyDefinition definition, - @NotNull final Runnable validationCallback) { + protected ColorPropertyEditorControl( + @NotNull VarTable vars, + @NotNull PropertyDefinition definition, + @NotNull Runnable validationCallback + ) { super(vars, definition, validationCallback); } @@ -36,14 +40,18 @@ protected void createComponents() { super.createComponents(); colorPicker = new ColorPicker(); - colorPicker.valueProperty().addListener((observable, oldValue, newValue) -> change()); - colorPicker.prefWidthProperty().bind(widthProperty().multiply(DEFAULT_FIELD_W_PERCENT)); + colorPicker.prefWidthProperty() + .bind(widthProperty().multiply(DEFAULT_FIELD_W_PERCENT)); - FXUtils.addClassTo(colorPicker, CssClasses.ABSTRACT_PARAM_CONTROL_COLOR_PICKER); - FXUtils.addToPane(colorPicker, this); + FxControlUtils.onColorChange(colorPicker, this::change); + + FxUtils.addClass(colorPicker, CssClasses.PROPERTY_CONTROL_COLOR_PICKER); + FxUtils.addChild(this, colorPicker); } /** + * Get the color picker. + * * @return the color picker. */ @FxThread @@ -55,14 +63,13 @@ protected void createComponents() { @FxThread public void reload() { super.reload(); - final ColorPicker colorPicker = getColorPicker(); - colorPicker.setValue(UiUtils.from(getPropertyValue())); + getColorPicker().setValue(UiUtils.from(getPropertyValue())); } @Override @FxThread protected void changeImpl() { - final ColorPicker colorPicker = getColorPicker(); + var colorPicker = getColorPicker(); setPropertyValue(UiUtils.from(colorPicker.getValue())); super.changeImpl(); } diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/ComboBoxPropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/ComboBoxPropertyEditorControl.java new file mode 100644 index 00000000..d061e6fe --- /dev/null +++ b/src/main/java/com/ss/editor/plugin/api/property/control/ComboBoxPropertyEditorControl.java @@ -0,0 +1,77 @@ +package com.ss.editor.plugin.api.property.control; + +import static com.ss.rlib.common.util.ObjectUtils.notNull; +import com.ss.editor.annotation.FxThread; +import com.ss.editor.plugin.api.property.PropertyDefinition; +import com.ss.editor.ui.css.CssClasses; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.fx.util.FxControlUtils; +import com.ss.rlib.fx.util.FxUtils; +import javafx.scene.control.ComboBox; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * The combo box based property control. + * + * @author JavaSaBr + */ +public class ComboBoxPropertyEditorControl extends PropertyEditorControl { + + /** + * The list of available options. + */ + @Nullable + private ComboBox comboBox; + + protected ComboBoxPropertyEditorControl( + @NotNull VarTable vars, + @NotNull PropertyDefinition definition, + @NotNull Runnable validationCallback + ) { + super(vars, definition, validationCallback); + } + + @Override + @FxThread + protected void createComponents() { + super.createComponents(); + + comboBox = new ComboBox<>(); + comboBox.setVisibleRowCount(20); + comboBox.prefWidthProperty() + .bind(widthProperty().multiply(DEFAULT_FIELD_W_PERCENT)); + + FxControlUtils.onSelectedItemChange(comboBox, this::change); + + FxUtils.addClass(comboBox, CssClasses.PROPERTY_CONTROL_COMBO_BOX); + FxUtils.addChild(this, comboBox); + } + + /** + * Get the list of available options. + * + * @return the list of available options. + */ + @FxThread + protected @NotNull ComboBox getComboBox() { + return notNull(comboBox); + } + + @Override + @FxThread + public void reload() { + super.reload(); + getComboBox().getSelectionModel() + .select(getPropertyValue()); + } + + @Override + @FxThread + protected void changeImpl() { + var comboBox = getComboBox(); + var selectionModel = comboBox.getSelectionModel(); + setPropertyValue(selectionModel.getSelectedItem()); + super.changeImpl(); + } +} diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/EnumPropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/EnumPropertyEditorControl.java index 589244ae..bc7349b5 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/EnumPropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/EnumPropertyEditorControl.java @@ -1,30 +1,18 @@ package com.ss.editor.plugin.api.property.control; import static com.ss.rlib.common.util.ObjectUtils.notNull; -import com.ss.editor.annotation.FxThread; import com.ss.editor.plugin.api.property.PropertyDefinition; -import com.ss.editor.ui.css.CssClasses; import com.ss.editor.util.EditorUtil; import com.ss.rlib.common.util.ClassUtils; import com.ss.rlib.common.util.VarTable; -import com.ss.rlib.fx.util.FxControlUtils; -import com.ss.rlib.fx.util.FxUtils; -import javafx.scene.control.ComboBox; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; /** * The control to edit enum values. * * @author JavaSaBr */ -public class EnumPropertyEditorControl> extends PropertyEditorControl { - - /** - * The list of available options of the {@link Enum} value. - */ - @Nullable - private ComboBox enumComboBox; +public class EnumPropertyEditorControl> extends ComboBoxPropertyEditorControl { protected EnumPropertyEditorControl( @NotNull VarTable vars, @@ -36,53 +24,7 @@ protected EnumPropertyEditorControl( var defaultValue = ClassUtils.unsafeCast(notNull(definition.getDefaultValue())); var enumConstants = EditorUtil.getEnumValues(defaultValue.getClass()); - getEnumComboBox().getItems() + getComboBox().getItems() .addAll(enumConstants); } - - @Override - @FxThread - protected void createComponents() { - super.createComponents(); - - enumComboBox = new ComboBox<>(); - enumComboBox.prefWidthProperty() - .bind(widthProperty().multiply(DEFAULT_FIELD_W_PERCENT)); - - enumComboBox.setVisibleRowCount(20); - - FxControlUtils.onSelectedItemChange(enumComboBox, this::change); - - FxUtils.addClass(enumComboBox, CssClasses.PROPERTY_CONTROL_COMBO_BOX); - FxUtils.addChild(this, enumComboBox); - } - - /** - * @return the list of available options of the {@link Enum} value. - */ - @FxThread - private @NotNull ComboBox getEnumComboBox() { - return notNull(enumComboBox); - } - - @Override - @FxThread - public void reload() { - super.reload(); - getEnumComboBox().getSelectionModel() - .select(getPropertyValue()); - } - - @Override - @FxThread - protected void changeImpl() { - - var currentValue = getEnumComboBox() - .getSelectionModel() - .getSelectedItem(); - - setPropertyValue(currentValue); - - super.changeImpl(); - } } diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/ObjectFromListPropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/ObjectFromListPropertyEditorControl.java index 82db6351..97c52f4d 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/ObjectFromListPropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/ObjectFromListPropertyEditorControl.java @@ -1,76 +1,26 @@ package com.ss.editor.plugin.api.property.control; -import static com.ss.rlib.common.util.ObjectUtils.notNull; -import com.ss.editor.annotation.FxThread; import com.ss.editor.plugin.api.property.PropertyDefinition; -import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.fx.util.FXUtils; import com.ss.rlib.common.util.VarTable; import com.ss.rlib.common.util.array.Array; -import javafx.scene.control.ComboBox; -import javafx.scene.control.SingleSelectionModel; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; /** * The control to choose object value from list. * * @author JavaSaBr */ -public class ObjectFromListPropertyEditorControl extends PropertyEditorControl { - - /** - * The list of available options. - */ - @Nullable - private ComboBox comboBox; - - protected ObjectFromListPropertyEditorControl(@NotNull final VarTable vars, @NotNull final PropertyDefinition definition, - @NotNull final Runnable validationCallback, @NotNull final Array options) { +public class ObjectFromListPropertyEditorControl extends ComboBoxPropertyEditorControl { + + public ObjectFromListPropertyEditorControl( + @NotNull VarTable vars, + @NotNull PropertyDefinition definition, + @NotNull Runnable validationCallback, + @NotNull Array options + ) { super(vars, definition, validationCallback); - final ComboBox comboBox = getComboBox(); - options.forEach(comboBox.getItems(), (option, items) -> items.add(option.toString())); - } - - @Override - @FxThread - protected void createComponents() { - super.createComponents(); - - comboBox = new ComboBox<>(); - comboBox.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> change()); - comboBox.prefWidthProperty().bind(widthProperty().multiply(DEFAULT_FIELD_W_PERCENT)); - comboBox.setVisibleRowCount(20); - - FXUtils.addClassTo(comboBox, CssClasses.PROPERTY_CONTROL_COMBO_BOX); - FXUtils.addToPane(comboBox, this); - } - - /** - * Get the list of available options . - * - * @return the list of available options . - */ - @FxThread - private @NotNull ComboBox getComboBox() { - return notNull(comboBox); - } - - @Override - @FxThread - public void reload() { - super.reload(); - final Object value = getPropertyValue(); - final ComboBox comboBox = getComboBox(); - comboBox.getSelectionModel().select(value); - } - - @Override - @FxThread - protected void changeImpl() { - final ComboBox comboBox = getComboBox(); - final SingleSelectionModel selectionModel = comboBox.getSelectionModel(); - setPropertyValue(selectionModel.getSelectedItem()); - super.changeImpl(); + var comboBox = getComboBox(); + options.forEach(comboBox.getItems(), + (option, items) -> items.add(option)); } } diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/StringFromListPropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/StringFromListPropertyEditorControl.java index 72b15921..c25df8f1 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/StringFromListPropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/StringFromListPropertyEditorControl.java @@ -1,39 +1,31 @@ package com.ss.editor.plugin.api.property.control; -import static com.ss.rlib.common.util.ObjectUtils.notNull; -import com.ss.editor.annotation.FxThread; import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.fx.util.FXUtils; import com.ss.rlib.common.util.VarTable; import com.ss.rlib.common.util.array.Array; -import javafx.scene.control.ComboBox; -import javafx.scene.control.SingleSelectionModel; -import javafx.scene.control.TextField; -import org.controlsfx.control.textfield.AutoCompletionBinding; +import com.ss.rlib.fx.util.FxUtils; import org.controlsfx.control.textfield.TextFields; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; /** * The control to choose string value from list. * * @author JavaSaBr */ -public class StringFromListPropertyEditorControl extends PropertyEditorControl { - - /** - * The list of available options of the string value. - */ - @Nullable - private ComboBox comboBox; - - protected StringFromListPropertyEditorControl(@NotNull final VarTable vars, @NotNull final PropertyDefinition definition, - @NotNull final Runnable validationCallback, @NotNull final Array options) { +public class StringFromListPropertyEditorControl extends ComboBoxPropertyEditorControl { + + public StringFromListPropertyEditorControl( + @NotNull VarTable vars, + @NotNull PropertyDefinition definition, + @NotNull Runnable validationCallback, + @NotNull Array options + ) { super(vars, definition, validationCallback); - final ComboBox comboBox = getComboBox(); - options.forEach(comboBox.getItems(), (option, items) -> items.add(option.toString())); + var comboBox = getComboBox(); + options.forEach(comboBox.getItems(), + (option, items) -> items.add(option.toString())); if (options.size() > comboBox.getVisibleRowCount()) { setIgnoreListener(true); @@ -42,12 +34,13 @@ protected StringFromListPropertyEditorControl(@NotNull final VarTable vars, @Not //FIXME need to find more userfriendly control comboBox.setEditable(true); - final TextField editor = comboBox.getEditor(); - final SingleSelectionModel selectionModel = comboBox.getSelectionModel(); - final AutoCompletionBinding binding = TextFields.bindAutoCompletion(editor, comboBox.getItems()); + var editor = comboBox.getEditor(); + var selectionModel = comboBox.getSelectionModel(); + var binding = TextFields.bindAutoCompletion(editor, comboBox.getItems()); binding.setOnAutoCompleted(event -> selectionModel.select(event.getCompletion())); - FXUtils.addClassesTo(editor, CssClasses.TRANSPARENT_TEXT_FIELD, + FxUtils.addClass(editor, + CssClasses.TRANSPARENT_TEXT_FIELD, CssClasses.TEXT_FIELD_IN_COMBO_BOX); reload(); @@ -57,44 +50,4 @@ protected StringFromListPropertyEditorControl(@NotNull final VarTable vars, @Not } } } - - @Override - @FxThread - protected void createComponents() { - super.createComponents(); - - comboBox = new ComboBox<>(); - comboBox.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> change()); - comboBox.prefWidthProperty().bind(widthProperty().multiply(DEFAULT_FIELD_W_PERCENT)); - comboBox.setVisibleRowCount(20); - - FXUtils.addClassTo(comboBox, CssClasses.PROPERTY_CONTROL_COMBO_BOX); - FXUtils.addToPane(comboBox, this); - } - - /** - * @return The list of available options of the string value. - */ - @FxThread - private @NotNull ComboBox getComboBox() { - return notNull(comboBox); - } - - @Override - @FxThread - public void reload() { - super.reload(); - final String value = getPropertyValue(); - final ComboBox comboBox = getComboBox(); - comboBox.getSelectionModel().select(value); - } - - @Override - @FxThread - protected void changeImpl() { - final ComboBox comboBox = getComboBox(); - final SingleSelectionModel selectionModel = comboBox.getSelectionModel(); - setPropertyValue(selectionModel.getSelectedItem()); - super.changeImpl(); - } } diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/StringPropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/StringPropertyEditorControl.java index 8ba4699a..51b16f8c 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/StringPropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/StringPropertyEditorControl.java @@ -4,8 +4,9 @@ import com.ss.editor.annotation.FxThread; import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.fx.util.FXUtils; import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.fx.util.FxControlUtils; +import com.ss.rlib.fx.util.FxUtils; import javafx.scene.control.TextField; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -23,8 +24,11 @@ public class StringPropertyEditorControl extends PropertyEditorControl { @Nullable private TextField valueField; - protected StringPropertyEditorControl(@NotNull final VarTable vars, @NotNull final PropertyDefinition definition, - @NotNull final Runnable validationCallback) { + protected StringPropertyEditorControl( + @NotNull VarTable vars, + @NotNull PropertyDefinition definition, + @NotNull Runnable validationCallback + ) { super(vars, definition, validationCallback); } @@ -34,14 +38,18 @@ protected void createComponents() { super.createComponents(); valueField = new TextField(); - valueField.textProperty().addListener((observable, oldValue, newValue) -> change()); - valueField.prefWidthProperty().bind(widthProperty().multiply(DEFAULT_FIELD_W_PERCENT)); + valueField.prefWidthProperty() + .bind(widthProperty().multiply(DEFAULT_FIELD_W_PERCENT)); - FXUtils.addClassTo(valueField, CssClasses.PROPERTY_CONTROL_COMBO_BOX); - FXUtils.addToPane(valueField, this); + FxControlUtils.onTextChange(valueField, this::change); + + FxUtils.addClass(valueField, CssClasses.PROPERTY_CONTROL_COMBO_BOX); + FxUtils.addChild(this, valueField); } /** + * Get the value field. + * * @return the value field. */ @FxThread @@ -53,7 +61,7 @@ protected void createComponents() { @FxThread public void reload() { super.reload(); - final String value = getPropertyValue(); + var value = getPropertyValue(); getValueField().setText(value == null ? "" : value); } diff --git a/src/main/java/com/ss/editor/ui/component/painting/terrain/TerrainPaintingComponent.java b/src/main/java/com/ss/editor/ui/component/painting/terrain/TerrainPaintingComponent.java index 0edfb08e..b55fd681 100644 --- a/src/main/java/com/ss/editor/ui/component/painting/terrain/TerrainPaintingComponent.java +++ b/src/main/java/com/ss/editor/ui/component/painting/terrain/TerrainPaintingComponent.java @@ -564,7 +564,7 @@ private void createSlopeControlSettings() { FXUtils.addClassTo(slopeControlSettings, CssClasses.DEF_GRID_PANE); FXUtils.addClassTo(smoothlyLabel, limitedLabel, CssClasses.ABSTRACT_PARAM_CONTROL_PARAM_NAME_SINGLE_ROW); - FXUtils.addClassTo(slopeControlSmoothly, slopeControlLimited, CssClasses.ABSTRACT_PARAM_CONTROL_CHECK_BOX); + FXUtils.addClassTo(slopeControlSmoothly, slopeControlLimited, CssClasses.PROPERTY_CONTROL_CHECK_BOX); } /** @@ -612,7 +612,7 @@ private void createLevelControlSettings() { FXUtils.addClassesTo(levelControlSettings, CssClasses.DEF_GRID_PANE); FXUtils.addClassTo(levelControlLevelField, CssClasses.PROPERTY_CONTROL_COMBO_BOX); - FXUtils.addClassTo(levelControlSmoothly, levelControlUseMarker, CssClasses.ABSTRACT_PARAM_CONTROL_CHECK_BOX); + FXUtils.addClassTo(levelControlSmoothly, levelControlUseMarker, CssClasses.PROPERTY_CONTROL_CHECK_BOX); } /** @@ -715,7 +715,7 @@ private void createPaintControlSettings() { FXUtils.addClassesTo(paintControlSettings, CssClasses.DEF_GRID_PANE); FXUtils.addClassTo(shininessLabel, triPlanarLabelLabel, CssClasses.ABSTRACT_PARAM_CONTROL_PARAM_NAME_SINGLE_ROW); - FXUtils.addClassTo(triPlanarCheckBox, CssClasses.ABSTRACT_PARAM_CONTROL_CHECK_BOX); + FXUtils.addClassTo(triPlanarCheckBox, CssClasses.PROPERTY_CONTROL_CHECK_BOX); FXUtils.addClassTo(shininessField, CssClasses.PROPERTY_CONTROL_COMBO_BOX); } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/BooleanPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/BooleanPropertyControl.java index 439363c8..ae72f986 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/BooleanPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/BooleanPropertyControl.java @@ -60,7 +60,7 @@ protected void createComponents(@NotNull HBox container) { FxControlUtils.onSelectedChange(checkBox, this::updateValue); FxUtils.addClass(checkBox, - CssClasses.ABSTRACT_PARAM_CONTROL_CHECK_BOX); + CssClasses.PROPERTY_CONTROL_CHECK_BOX); FxUtils.addChild(container, checkBox); } diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/ColorPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/ColorPropertyControl.java index 08fbb707..0389b066 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/ColorPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/ColorPropertyControl.java @@ -50,7 +50,7 @@ protected void createComponents(@NotNull HBox container) { FxControlUtils.onColorChange(colorPicker, this::updateValue); FxUtils.addClass(colorPicker, - CssClasses.ABSTRACT_PARAM_CONTROL_COLOR_PICKER); + CssClasses.PROPERTY_CONTROL_COLOR_PICKER); FxUtils.addChild(container, colorPicker); } diff --git a/src/main/java/com/ss/editor/ui/css/CssClasses.java b/src/main/java/com/ss/editor/ui/css/CssClasses.java index 1abc6b0a..89a65657 100644 --- a/src/main/java/com/ss/editor/ui/css/CssClasses.java +++ b/src/main/java/com/ss/editor/ui/css/CssClasses.java @@ -92,6 +92,8 @@ public interface CssClasses { @NotNull String PROPERTY_CONTROL_VECTOR_3F_FIELD = "property-control-vector-3f-field"; @NotNull String PROPERTY_CONTROL_RESOURCE = "property-control-resource"; @NotNull String PROPERTY_CONTROL_COMBO_BOX = "property-control-combo-box"; + @NotNull String PROPERTY_CONTROL_CHECK_BOX = "property-control-check-box"; + @NotNull String PROPERTY_CONTROL_COLOR_PICKER = "property-control-check-box-color-picker"; @NotNull String ABSTRACT_PARAM_CONTROL_PARAM_NAME_SINGLE_ROW = "abstract-param-control-param-name-single-row"; @NotNull String ABSTRACT_PARAM_CONTROL_PARAM_NAME = "abstract-param-control-param-name"; @@ -99,8 +101,6 @@ public interface CssClasses { @NotNull String ABSTRACT_PARAM_CONTROL_PREVIEW_CONTAINER = "abstract-param-control-preview-container"; @NotNull String ABSTRACT_PARAM_CONTROL_INPUT_CONTAINER = "abstract-param-control-input-container"; @NotNull String ABSTRACT_PARAM_CONTROL_SHORT_INPUT_CONTAINER = "abstract-param-control-short-input-container"; - @NotNull String ABSTRACT_PARAM_CONTROL_CHECK_BOX = "abstract-param-control-checkbox"; - @NotNull String ABSTRACT_PARAM_CONTROL_COLOR_PICKER = "abstract-param-control-param-color-picker"; @NotNull String ABSTRACT_PARAM_CONTROL_VECTOR2F_FIELD = "abstract-param-control-vector2f-field"; @NotNull String ABSTRACT_PARAM_CONTROL_LABEL_VALUE = "abstract-param-control-label-value"; @NotNull String ABSTRACT_PARAM_CONTROL_NUMBER_LABEL = "abstract-param-control-number-label"; diff --git a/src/main/resources/ui/css/custom_classes.css b/src/main/resources/ui/css/custom_classes.css index 8911c539..a35daba7 100644 --- a/src/main/resources/ui/css/custom_classes.css +++ b/src/main/resources/ui/css/custom_classes.css @@ -753,6 +753,11 @@ -fx-min-height: -var-default-field-inner-height; } +.property-control-check-box { +} + +.property-control-check-box-color-picker { +} /******************************************************************************* * * @@ -811,11 +816,6 @@ -fx-max-height: -var-default-inner-field-height; } -.abstract-param-control-param-color-picker { -} - -.abstract-param-control-checkbox { -} .abstract-param-control-vector2f-field { } From 0d96b99b2c6496e1194d3183d4d17c0ad61d7d66 Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Wed, 16 May 2018 08:11:10 +0300 Subject: [PATCH 39/49] updated property editor controls. --- .../control/AwtFontPropertyEditorControl.java | 18 +++-- .../control/EnumPropertyEditorControl.java | 2 +- .../ExternalFileResourcePropertyControl.java | 17 ++--- .../FileAssetResourcePropertyControl.java | 16 +++-- .../control/FloatPropertyEditorControl.java | 44 +++--------- .../FolderAssetResourcePropertyControl.java | 19 +++--- .../GeometryAssetResourcePropertyControl.java | 14 ++-- .../control/IntegerPropertyEditorControl.java | 48 ++++--------- .../control/PropertyEditorControlFactory.java | 4 +- .../SpatialAssetResourcePropertyControl.java | 9 +-- .../StringFromListPropertyEditorControl.java | 18 +++-- .../TypedTextFieldPropertyEditorControl.java | 68 +++++++++++++++++++ .../impl/material/MaterialFileCreator.java | 37 ++++------ .../ui/util/AwtFontSuggestionProvider.java | 61 +++++++++++++++++ .../util/SimpleStringSuggestionProvider.java | 58 ++++++++++++++++ .../java/com/ss/editor/util/EditorUtil.java | 19 ++++++ .../java/com/ss/editor/util/NodeUtils.java | 32 ++++++++- 17 files changed, 341 insertions(+), 143 deletions(-) create mode 100644 src/main/java/com/ss/editor/plugin/api/property/control/TypedTextFieldPropertyEditorControl.java create mode 100644 src/main/java/com/ss/editor/ui/util/AwtFontSuggestionProvider.java create mode 100644 src/main/java/com/ss/editor/ui/util/SimpleStringSuggestionProvider.java diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/AwtFontPropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/AwtFontPropertyEditorControl.java index 2286eb42..4d643297 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/AwtFontPropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/AwtFontPropertyEditorControl.java @@ -2,14 +2,15 @@ import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FxThread; +import com.ss.editor.manager.ExecutorManager; import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.ui.css.CssClasses; +import com.ss.editor.ui.util.AwtFontSuggestionProvider; import com.ss.rlib.common.util.StringUtils; import com.ss.rlib.common.util.VarTable; import com.ss.rlib.fx.util.FxControlUtils; import com.ss.rlib.fx.util.FxUtils; import impl.org.controlsfx.autocompletion.AutoCompletionTextFieldBinding; -import impl.org.controlsfx.autocompletion.SuggestionProvider; import javafx.scene.control.ComboBox; import javafx.util.StringConverter; import org.jetbrains.annotations.NotNull; @@ -28,7 +29,7 @@ public class AwtFontPropertyEditorControl extends PropertyEditorControl { private static final GraphicsEnvironment GRAPHICS_ENVIRONMENT = GraphicsEnvironment.getLocalGraphicsEnvironment(); private static final Font[] FONTS = GRAPHICS_ENVIRONMENT.getAllFonts(); - private static final StringConverter STRING_CONVERTER = new StringConverter() { + private static final StringConverter STRING_CONVERTER = new StringConverter<>() { @Override public @NotNull String toString(@Nullable Font font) { @@ -72,13 +73,20 @@ protected void createComponents() { var selectionModel = comboBox.getSelectionModel(); - var binding = new AutoCompletionTextFieldBinding(comboBox.getEditor(), - SuggestionProvider.create(comboBox.getItems()), STRING_CONVERTER); + var editor = comboBox.getEditor(); + var binding = new AutoCompletionTextFieldBinding(editor, + new AwtFontSuggestionProvider(comboBox.getItems()), STRING_CONVERTER); binding.setOnAutoCompleted(event -> selectionModel.select(event.getCompletion())); + binding.prefWidthProperty().bind(comboBox.widthProperty().multiply(1.3)); + + FxControlUtils.onSelectedItemChange(comboBox, newValue -> { + var executorManager = ExecutorManager.getInstance(); + executorManager.addFxTask(() -> editor.positionCaret(newValue.getFontName().length())); + }); FxControlUtils.onSelectedItemChange(comboBox, this::change); - FxUtils.addClass(comboBox.getEditor(), + FxUtils.addClass(editor, CssClasses.TRANSPARENT_TEXT_FIELD, CssClasses.TEXT_FIELD_IN_COMBO_BOX) .addClass(comboBox, CssClasses.PROPERTY_CONTROL_COMBO_BOX); diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/EnumPropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/EnumPropertyEditorControl.java index bc7349b5..7c2ceb8d 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/EnumPropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/EnumPropertyEditorControl.java @@ -8,7 +8,7 @@ import org.jetbrains.annotations.NotNull; /** - * The control to edit enum values. + * The property control to edit enum values. * * @author JavaSaBr */ diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/ExternalFileResourcePropertyControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/ExternalFileResourcePropertyControl.java index b8c7b770..339f6e81 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/ExternalFileResourcePropertyControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/ExternalFileResourcePropertyControl.java @@ -5,7 +5,6 @@ import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.ui.dialog.file.chooser.ExternalFileEditorDialog; import com.ss.rlib.common.util.VarTable; -import javafx.scene.control.Label; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -25,9 +24,11 @@ public class ExternalFileResourcePropertyControl extends ResourcePropertyEditorC @Nullable private final String extension; - public ExternalFileResourcePropertyControl(@NotNull final VarTable vars, - @NotNull final PropertyDefinition definition, - @NotNull final Runnable validationCallback) { + public ExternalFileResourcePropertyControl( + @NotNull VarTable vars, + @NotNull PropertyDefinition definition, + @NotNull Runnable validationCallback + ) { super(vars, definition, validationCallback); this.extension = definition.getExtension(); } @@ -37,7 +38,7 @@ public ExternalFileResourcePropertyControl(@NotNull final VarTable vars, protected void chooseNew() { super.chooseNew(); - final ExternalFileEditorDialog dialog = new ExternalFileEditorDialog(this::openExternalFile); + var dialog = new ExternalFileEditorDialog(this::openExternalFile); dialog.setTitleText(Messages.ASSET_EDITOR_DIALOG_TITLE); dialog.setInitDirectory(Paths.get(System.getProperty("user.home"))); dialog.show(); @@ -49,7 +50,7 @@ protected void chooseNew() { * @param path the selected file. */ @FxThread - private void openExternalFile(@NotNull final Path path) { + private void openExternalFile(@NotNull Path path) { setPropertyValue(path); change(); reload(); @@ -60,8 +61,8 @@ private void openExternalFile(@NotNull final Path path) { @FxThread public void reload() { - final Path resource = getPropertyValue(); - final Label resourceLabel = getResourceLabel(); + var resource = getPropertyValue(); + var resourceLabel = getResourceLabel(); resourceLabel.setText(resource == null ? NOT_SELECTED : resource.toString()); super.reload(); diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/FileAssetResourcePropertyControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/FileAssetResourcePropertyControl.java index 8d24633c..742ce025 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/FileAssetResourcePropertyControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/FileAssetResourcePropertyControl.java @@ -3,14 +3,13 @@ import static com.ss.editor.util.EditorUtil.getAssetFile; import static com.ss.editor.util.EditorUtil.toAssetPath; import static com.ss.rlib.common.util.ObjectUtils.notNull; -import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; +import com.ss.editor.annotation.FxThread; import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.ui.component.asset.tree.context.menu.action.NewFileAction; import com.ss.rlib.common.util.VarTable; import com.ss.rlib.common.util.array.Array; import com.ss.rlib.common.util.array.ArrayFactory; -import javafx.scene.control.Label; import org.jetbrains.annotations.NotNull; import java.nio.file.Path; @@ -32,8 +31,11 @@ public class FileAssetResourcePropertyControl extends AssetResourcePropertyEdito @NotNull private final Array extensions; - public FileAssetResourcePropertyControl(@NotNull final VarTable vars, @NotNull final PropertyDefinition definition, - @NotNull final Runnable validationCallback) { + public FileAssetResourcePropertyControl( + @NotNull VarTable vars, + @NotNull PropertyDefinition definition, + @NotNull Runnable validationCallback + ) { super(vars, definition, validationCallback); this.extensions = ArrayFactory.asArray(notNull(definition.getExtension())); } @@ -52,7 +54,7 @@ public FileAssetResourcePropertyControl(@NotNull final VarTable vars, @NotNull f @Override @FxThread - protected void chooseNew(@NotNull final Path file) { + protected void chooseNew(@NotNull Path file) { setPropertyValue(notNull(getAssetFile(file))); super.chooseNew(file); } @@ -61,9 +63,9 @@ protected void chooseNew(@NotNull final Path file) { @FxThread public void reload() { - final Path file = getPropertyValue(); + var file = getPropertyValue(); - final Label resourceLabel = getResourceLabel(); + var resourceLabel = getResourceLabel(); resourceLabel.setText(file == null ? NOT_SELECTED : toAssetPath(file)); super.reload(); diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/FloatPropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/FloatPropertyEditorControl.java index e1202be8..8b0c90c6 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/FloatPropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/FloatPropertyEditorControl.java @@ -1,52 +1,30 @@ package com.ss.editor.plugin.api.property.control; -import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.FxThread; import com.ss.editor.plugin.api.property.PropertyDefinition; -import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.fx.control.input.FloatTextField; -import com.ss.rlib.fx.util.FXUtils; import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.fx.control.input.FloatTextField; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; /** * The control to edit float values. * * @author JavaSaBr */ -public class FloatPropertyEditorControl extends PropertyEditorControl { - - /** - * The value field. - */ - @Nullable - private FloatTextField valueField; +public class FloatPropertyEditorControl extends TypedTextFieldPropertyEditorControl { - protected FloatPropertyEditorControl(@NotNull final VarTable vars, @NotNull final PropertyDefinition definition, - @NotNull final Runnable validationCallback) { + public FloatPropertyEditorControl( + @NotNull VarTable vars, + @NotNull PropertyDefinition definition, + @NotNull Runnable validationCallback + ) { super(vars, definition, validationCallback); } @Override @FxThread - protected void createComponents() { - super.createComponents(); - - valueField = new FloatTextField(); - valueField.addChangeListener((observable, oldValue, newValue) -> change()); - valueField.prefWidthProperty().bind(widthProperty().multiply(DEFAULT_FIELD_W_PERCENT)); - - FXUtils.addClassTo(valueField, CssClasses.PROPERTY_CONTROL_COMBO_BOX); - FXUtils.addToPane(valueField, this); - } - - /** - * @return the value field. - */ - @FxThread - private @NotNull FloatTextField getValueField() { - return notNull(valueField); + protected @NotNull FloatTextField createField() { + return new FloatTextField(); } /** @@ -56,7 +34,7 @@ protected void createComponents() { * @param max the max value. */ @FxThread - public void setMinMax(final float min, final float max) { + public void setMinMax(float min, float max) { if (Float.isNaN(min) || Float.isNaN(max)) return; getValueField().setMinMax(min, max); } @@ -65,7 +43,7 @@ public void setMinMax(final float min, final float max) { @FxThread public void reload() { super.reload(); - final Float value = getPropertyValue(); + var value = getPropertyValue(); getValueField().setValue(value == null ? 0 : value); } diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/FolderAssetResourcePropertyControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/FolderAssetResourcePropertyControl.java index f7295e26..e7a79b99 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/FolderAssetResourcePropertyControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/FolderAssetResourcePropertyControl.java @@ -3,14 +3,13 @@ import static com.ss.editor.util.EditorUtil.getAssetFile; import static com.ss.editor.util.EditorUtil.toAssetPath; import static com.ss.rlib.common.util.ObjectUtils.notNull; -import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; +import com.ss.editor.annotation.FxThread; import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.ui.component.asset.tree.context.menu.action.NewFileAction; import com.ss.editor.ui.util.UiUtils; import com.ss.rlib.common.util.StringUtils; import com.ss.rlib.common.util.VarTable; -import javafx.scene.control.Label; import org.jetbrains.annotations.NotNull; import java.nio.file.Path; @@ -26,9 +25,11 @@ public class FolderAssetResourcePropertyControl extends AssetResourcePropertyEdi @NotNull private static final Predicate> ACTION_TESTER = type -> type == NewFileAction.class; - public FolderAssetResourcePropertyControl(@NotNull final VarTable vars, - @NotNull final PropertyDefinition definition, - @NotNull final Runnable validationCallback) { + public FolderAssetResourcePropertyControl( + @NotNull VarTable vars, + @NotNull PropertyDefinition definition, + @NotNull Runnable validationCallback + ) { super(vars, definition, validationCallback); } @@ -46,7 +47,7 @@ protected void chooseNew() { @Override @FxThread - protected void chooseNew(@NotNull final Path file) { + protected void chooseNew(@NotNull Path file) { setPropertyValue(notNull(getAssetFile(file))); super.chooseNew(file); } @@ -55,10 +56,10 @@ protected void chooseNew(@NotNull final Path file) { @FxThread public void reload() { - final Path file = getPropertyValue(); - final String assetPath = file == null ? NOT_SELECTED : toAssetPath(file); + var file = getPropertyValue(); + var assetPath = file == null ? NOT_SELECTED : toAssetPath(file); - final Label resourceLabel = getResourceLabel(); + var resourceLabel = getResourceLabel(); resourceLabel.setText(StringUtils.isEmpty(assetPath) ? "/" : assetPath); super.reload(); diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/GeometryAssetResourcePropertyControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/GeometryAssetResourcePropertyControl.java index c0d3051a..f7beb1ac 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/GeometryAssetResourcePropertyControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/GeometryAssetResourcePropertyControl.java @@ -3,7 +3,6 @@ import com.jme3.asset.AssetManager; import com.jme3.asset.ModelKey; import com.jme3.scene.Geometry; -import com.jme3.scene.Spatial; import com.ss.editor.annotation.FxThread; import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.util.NodeUtils; @@ -18,16 +17,17 @@ */ public class GeometryAssetResourcePropertyControl extends SpatialAssetResourcePropertyControl { - public GeometryAssetResourcePropertyControl(@NotNull final VarTable vars, - @NotNull final PropertyDefinition definition, - @NotNull final Runnable validationCallback) { + public GeometryAssetResourcePropertyControl( + @NotNull VarTable vars, + @NotNull PropertyDefinition definition, + @NotNull Runnable validationCallback + ) { super(vars, definition, validationCallback); } @Override @FxThread - protected @Nullable Geometry findResource(@NotNull final AssetManager assetManager, @NotNull final ModelKey modelKey) { - final Spatial spatial = assetManager.loadModel(modelKey); - return NodeUtils.findGeometry(spatial); + protected @Nullable Geometry findResource(@NotNull AssetManager assetManager, @NotNull ModelKey modelKey) { + return NodeUtils.findGeometry(assetManager.loadModel(modelKey)); } } diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/IntegerPropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/IntegerPropertyEditorControl.java index 37997fda..4e4d2f61 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/IntegerPropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/IntegerPropertyEditorControl.java @@ -1,44 +1,31 @@ package com.ss.editor.plugin.api.property.control; -import static com.ss.rlib.common.util.ObjectUtils.notNull; +import static com.ss.rlib.common.util.ObjectUtils.ifNull; import com.ss.editor.annotation.FxThread; import com.ss.editor.plugin.api.property.PropertyDefinition; -import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.fx.control.input.IntegerTextField; -import com.ss.rlib.fx.util.FXUtils; import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.fx.control.input.IntegerTextField; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; /** - * The control to edit integer values. + * The property control to edit integer values. * * @author JavaSaBr */ -public class IntegerPropertyEditorControl extends PropertyEditorControl { - - /** - * The value field. - */ - @Nullable - private IntegerTextField valueField; +public class IntegerPropertyEditorControl extends TypedTextFieldPropertyEditorControl { - protected IntegerPropertyEditorControl(@NotNull final VarTable vars, @NotNull final PropertyDefinition definition, - @NotNull final Runnable validationCallback) { + public IntegerPropertyEditorControl( + @NotNull VarTable vars, + @NotNull PropertyDefinition definition, + @NotNull Runnable validationCallback + ) { super(vars, definition, validationCallback); } @Override @FxThread - protected void createComponents() { - super.createComponents(); - - valueField = new IntegerTextField(); - valueField.addChangeListener((observable, oldValue, newValue) -> change()); - valueField.prefWidthProperty().bind(widthProperty().multiply(DEFAULT_FIELD_W_PERCENT)); - - FXUtils.addClassTo(valueField, CssClasses.PROPERTY_CONTROL_COMBO_BOX); - FXUtils.addToPane(valueField, this); + protected @NotNull IntegerTextField createField() { + return new IntegerTextField(); } /** @@ -48,25 +35,16 @@ protected void createComponents() { * @param max the max value. */ @FxThread - public void setMinMax(final float min, final float max) { + public void setMinMax(float min, float max) { if (Float.isNaN(min) || Float.isNaN(max)) return; getValueField().setMinMax((int) min, (int) max); } - /** - * @return the value field. - */ - @FxThread - private @NotNull IntegerTextField getValueField() { - return notNull(valueField); - } - @Override @FxThread public void reload() { super.reload(); - final Integer value = getPropertyValue(); - getValueField().setValue(value == null ? 0 : value); + getValueField().setValue(ifNull(getPropertyValue(), 0)); } @Override diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/PropertyEditorControlFactory.java b/src/main/java/com/ss/editor/plugin/api/property/control/PropertyEditorControlFactory.java index f2d08cc6..1c3fb521 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/PropertyEditorControlFactory.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/PropertyEditorControlFactory.java @@ -29,7 +29,7 @@ public class PropertyEditorControlFactory { switch (definition.getPropertyType()) { case FLOAT: { - final FloatPropertyEditorControl control = new FloatPropertyEditorControl(vars, definition, validation); + var control = new FloatPropertyEditorControl(vars, definition, validation); control.setMinMax(definition.getMin(), definition.getMax()); return control; } @@ -38,7 +38,7 @@ public class PropertyEditorControlFactory { case BOOLEAN: return new BooleanPropertyEditorControl(vars, definition, validation); case INTEGER: { - final IntegerPropertyEditorControl control = new IntegerPropertyEditorControl(vars, definition, validation); + var control = new IntegerPropertyEditorControl(vars, definition, validation); control.setMinMax(definition.getMin(), definition.getMax()); return control; } diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/SpatialAssetResourcePropertyControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/SpatialAssetResourcePropertyControl.java index fcee3f7f..1447d333 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/SpatialAssetResourcePropertyControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/SpatialAssetResourcePropertyControl.java @@ -2,7 +2,6 @@ import static com.ss.editor.util.EditorUtil.getAssetFile; import static com.ss.editor.util.EditorUtil.toAssetPath; -import static com.ss.editor.util.NodeUtils.findParent; import static com.ss.rlib.common.util.ClassUtils.unsafeCast; import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.asset.AssetManager; @@ -67,7 +66,7 @@ protected void chooseNew(@NotNull Path file) { } /** - * Finds a resource rom asset folder by the model key. + * Find a resource rom asset folder by the model key. * * @param assetManager the asset manager. * @param modelKey the model key. @@ -95,12 +94,10 @@ protected void handleFile(@NotNull File file) { public void reload() { var model = getPropertyValue(); + var rootKey = EditorUtil.findRootKey(model); - Spatial root = model == null ? null : findParent(model, spatial -> spatial.getKey() != null); - - var key = root == null ? null : root.getKey(); var resourceLabel = getResourceLabel(); - resourceLabel.setText(key == null ? NOT_SELECTED : key.getName() + "[" + model.getName() + "]"); + resourceLabel.setText(rootKey == null ? NOT_SELECTED : rootKey + "[" + model.getName() + "]"); super.reload(); } diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/StringFromListPropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/StringFromListPropertyEditorControl.java index c25df8f1..8ece920c 100644 --- a/src/main/java/com/ss/editor/plugin/api/property/control/StringFromListPropertyEditorControl.java +++ b/src/main/java/com/ss/editor/plugin/api/property/control/StringFromListPropertyEditorControl.java @@ -1,11 +1,14 @@ package com.ss.editor.plugin.api.property.control; +import com.ss.editor.manager.ExecutorManager; import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.ui.css.CssClasses; +import com.ss.editor.ui.util.SimpleStringSuggestionProvider; import com.ss.rlib.common.util.VarTable; import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.fx.util.FxControlUtils; import com.ss.rlib.fx.util.FxUtils; -import org.controlsfx.control.textfield.TextFields; +import impl.org.controlsfx.autocompletion.AutoCompletionTextFieldBinding; import org.jetbrains.annotations.NotNull; /** @@ -31,13 +34,20 @@ public StringFromListPropertyEditorControl( setIgnoreListener(true); try { - //FIXME need to find more userfriendly control comboBox.setEditable(true); - var editor = comboBox.getEditor(); var selectionModel = comboBox.getSelectionModel(); - var binding = TextFields.bindAutoCompletion(editor, comboBox.getItems()); + var editor = comboBox.getEditor(); + + var binding = new AutoCompletionTextFieldBinding(editor, + new SimpleStringSuggestionProvider(comboBox.getItems())); binding.setOnAutoCompleted(event -> selectionModel.select(event.getCompletion())); + binding.prefWidthProperty().bind(comboBox.widthProperty().multiply(1.3)); + + FxControlUtils.onSelectedItemChange(comboBox, newValue -> { + var executorManager = ExecutorManager.getInstance(); + executorManager.addFxTask(() -> editor.positionCaret(newValue.length())); + }); FxUtils.addClass(editor, CssClasses.TRANSPARENT_TEXT_FIELD, diff --git a/src/main/java/com/ss/editor/plugin/api/property/control/TypedTextFieldPropertyEditorControl.java b/src/main/java/com/ss/editor/plugin/api/property/control/TypedTextFieldPropertyEditorControl.java new file mode 100644 index 00000000..64fe6b3a --- /dev/null +++ b/src/main/java/com/ss/editor/plugin/api/property/control/TypedTextFieldPropertyEditorControl.java @@ -0,0 +1,68 @@ +package com.ss.editor.plugin.api.property.control; + +import static com.ss.rlib.common.util.ObjectUtils.notNull; +import com.ss.editor.annotation.FxThread; +import com.ss.editor.plugin.api.property.PropertyDefinition; +import com.ss.editor.ui.css.CssClasses; +import com.ss.rlib.common.util.VarTable; +import com.ss.rlib.fx.control.input.TypedTextField; +import com.ss.rlib.fx.util.FxControlUtils; +import com.ss.rlib.fx.util.FxUtils; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * The typed text field base property control. + * + * @author JavaSaBr + */ +public abstract class TypedTextFieldPropertyEditorControl> + extends PropertyEditorControl { + + /** + * The value field. + */ + @Nullable + private F valueField; + + protected TypedTextFieldPropertyEditorControl( + @NotNull VarTable vars, + @NotNull PropertyDefinition definition, + @NotNull Runnable validationCallback + ) { + super(vars, definition, validationCallback); + } + + @Override + @FxThread + protected void createComponents() { + super.createComponents(); + + valueField = createField(); + valueField.prefWidthProperty() + .bind(widthProperty().multiply(DEFAULT_FIELD_W_PERCENT)); + + FxControlUtils.onTextChange(valueField, this::change); + + FxUtils.addClass(valueField, CssClasses.PROPERTY_CONTROL_COMBO_BOX); + FxUtils.addChild(this, valueField); + } + + /** + * Create a new field. + * + * @return the new field. + */ + @FxThread + protected abstract @NotNull F createField(); + + /** + * Get the value field. + * + * @return the value field. + */ + @FxThread + protected @NotNull F getValueField() { + return notNull(valueField); + } +} diff --git a/src/main/java/com/ss/editor/ui/component/creator/impl/material/MaterialFileCreator.java b/src/main/java/com/ss/editor/ui/component/creator/impl/material/MaterialFileCreator.java index 99d5bb5d..d828abb0 100644 --- a/src/main/java/com/ss/editor/ui/component/creator/impl/material/MaterialFileCreator.java +++ b/src/main/java/com/ss/editor/ui/component/creator/impl/material/MaterialFileCreator.java @@ -3,20 +3,19 @@ import static com.ss.editor.FileExtensions.JME_MATERIAL; import static com.ss.rlib.common.util.ObjectUtils.notNull; import static java.nio.file.StandardOpenOption.*; -import com.jme3.asset.AssetManager; import com.jme3.material.Material; import com.ss.editor.FileExtensions; import com.ss.editor.Messages; import com.ss.editor.annotation.BackgroundThread; -import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; +import com.ss.editor.annotation.FxThread; import com.ss.editor.extension.property.EditablePropertyType; import com.ss.editor.manager.ResourceManager; import com.ss.editor.plugin.api.file.creator.GenericFileCreator; import com.ss.editor.plugin.api.property.PropertyDefinition; +import com.ss.editor.ui.component.creator.FileCreatorDescription; import com.ss.editor.util.EditorUtil; import com.ss.editor.util.MaterialSerializer; -import com.ss.editor.ui.component.creator.FileCreatorDescription; import com.ss.rlib.common.util.StringUtils; import com.ss.rlib.common.util.VarTable; import com.ss.rlib.common.util.array.Array; @@ -36,22 +35,12 @@ */ public class MaterialFileCreator extends GenericFileCreator { - /** - * The constant DESCRIPTION. - */ - @NotNull public static final FileCreatorDescription DESCRIPTION = new FileCreatorDescription(); - @NotNull private static final ResourceManager RESOURCE_MANAGER = ResourceManager.getInstance(); - @NotNull private static final String PBR_MAT_DEF = "Common/MatDefs/Light/PBRLighting.j3md"; - - @NotNull private static final String LIGHTING_MAT_DEF = "Common/MatDefs/Light/Lighting.j3md"; - - @NotNull private static final String PROP_MAT_DEF = "matDef"; static { @@ -83,7 +72,7 @@ public class MaterialFileCreator extends GenericFileCreator { definitions = RESOURCE_MANAGER.getAvailableResources(FileExtensions.JME_MATERIAL_DEFINITION); - final String def; + String def; if (definitions.contains(PBR_MAT_DEF)) { def = PBR_MAT_DEF; @@ -93,7 +82,7 @@ public class MaterialFileCreator extends GenericFileCreator { def = definitions.first(); } - final Array result = ArrayFactory.newArray(PropertyDefinition.class); + var result = ArrayFactory.newArray(PropertyDefinition.class); result.add(new PropertyDefinition(EditablePropertyType.STRING_FROM_LIST, Messages.MATERIAL_FILE_CREATOR_MATERIAL_TYPE_LABEL, PROP_MAT_DEF, def, definitions)); @@ -101,6 +90,8 @@ public class MaterialFileCreator extends GenericFileCreator { } /** + * Get the list of available definitions. + * * @return the list of available definitions. */ @FromAnyThread @@ -110,9 +101,9 @@ public class MaterialFileCreator extends GenericFileCreator { @Override @FxThread - protected boolean validate(@NotNull final VarTable vars) { + protected boolean validate(@NotNull VarTable vars) { - final String matDef = vars.get(PROP_MAT_DEF, String.class, StringUtils.EMPTY); + var matDef = vars.get(PROP_MAT_DEF, String.class, StringUtils.EMPTY); if (matDef.isEmpty() || !getDefinitions().contains(matDef)) { return false; @@ -123,18 +114,18 @@ protected boolean validate(@NotNull final VarTable vars) { @Override @BackgroundThread - protected void writeData(@NotNull final VarTable vars, @NotNull final Path resultFile) throws IOException { + protected void writeData(@NotNull VarTable vars, @NotNull Path resultFile) throws IOException { super.writeData(vars, resultFile); - final AssetManager assetManager = EditorUtil.getAssetManager(); - final String matDef = vars.get(PROP_MAT_DEF); + var assetManager = EditorUtil.getAssetManager(); + var matDef = vars.get(PROP_MAT_DEF, String.class); - final Material material = new Material(assetManager, matDef); + var material = new Material(assetManager, matDef); material.getAdditionalRenderState(); - final String materialContent = MaterialSerializer.serializeToString(material); + var materialContent = MaterialSerializer.serializeToString(material); - try (final PrintWriter out = new PrintWriter(Files.newOutputStream(resultFile, WRITE, TRUNCATE_EXISTING, CREATE))) { + try (var out = new PrintWriter(Files.newOutputStream(resultFile, WRITE, TRUNCATE_EXISTING, CREATE))) { out.print(materialContent); } } diff --git a/src/main/java/com/ss/editor/ui/util/AwtFontSuggestionProvider.java b/src/main/java/com/ss/editor/ui/util/AwtFontSuggestionProvider.java new file mode 100644 index 00000000..e4cabd03 --- /dev/null +++ b/src/main/java/com/ss/editor/ui/util/AwtFontSuggestionProvider.java @@ -0,0 +1,61 @@ +package com.ss.editor.ui.util; + +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayCollectors; +import com.ss.rlib.common.util.array.ArrayFactory; +import javafx.util.Callback; +import org.controlsfx.control.textfield.AutoCompletionBinding.ISuggestionRequest; +import org.jetbrains.annotations.NotNull; + +import java.awt.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; + +/** + * The suggestion provider's implementation to provide available fonts. + * + * @author JavaSaBr + */ +public class AwtFontSuggestionProvider implements Callback> { + + private final Array options; + private final Array lowerCaseOptions; + + public AwtFontSuggestionProvider(@NotNull Collection options) { + this.options = ArrayFactory.newArray(Font.class, options.size()); + this.options.addAll(options); + this.lowerCaseOptions = options.stream() + .map(Font::getFontName) + .map(String::toLowerCase) + .collect(ArrayCollectors.toArray(String.class)); + } + + @Override + public Collection call(@NotNull ISuggestionRequest request) { + + var userText = request.getUserText(); + + if (StringUtils.isEmpty(userText)) { + return Collections.emptyList(); + } + + var lowerInput = userText.toLowerCase(); + + var result = new ArrayList(); + + for (int i = 0; i < lowerCaseOptions.size(); i++) { + + var original = options.get(i); + var fontName = original.getFontName(); + var lowerCase = lowerCaseOptions.get(i); + + if (!fontName.equals(userText) && lowerCase.contains(lowerInput)) { + result.add(original); + } + } + + return result; + } +} diff --git a/src/main/java/com/ss/editor/ui/util/SimpleStringSuggestionProvider.java b/src/main/java/com/ss/editor/ui/util/SimpleStringSuggestionProvider.java new file mode 100644 index 00000000..13c2f386 --- /dev/null +++ b/src/main/java/com/ss/editor/ui/util/SimpleStringSuggestionProvider.java @@ -0,0 +1,58 @@ +package com.ss.editor.ui.util; + +import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.array.ArrayCollectors; +import com.ss.rlib.common.util.array.ArrayFactory; +import javafx.util.Callback; +import org.controlsfx.control.textfield.AutoCompletionBinding.ISuggestionRequest; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; + +/** + * The simple suggestion provider's implementation. + * + * @author JavaSaBr + */ +public class SimpleStringSuggestionProvider implements Callback> { + + private final Array options; + private final Array lowerCaseOptions; + + public SimpleStringSuggestionProvider(@NotNull Collection options) { + this.options = ArrayFactory.newArray(String.class, options.size()); + this.options.addAll(options); + this.lowerCaseOptions = options.stream() + .map(String::toLowerCase) + .collect(ArrayCollectors.toArray(String.class)); + } + + @Override + public Collection call(@NotNull ISuggestionRequest request) { + + var userText = request.getUserText(); + + if (StringUtils.isEmpty(userText)) { + return Collections.emptyList(); + } + + var lowerInput = userText.toLowerCase(); + + var result = new ArrayList(); + + for (int i = 0; i < lowerCaseOptions.size(); i++) { + + var original = options.get(i); + var lowerCase = lowerCaseOptions.get(i); + + if (!original.equals(userText) && lowerCase.contains(lowerInput)) { + result.add(original); + } + } + + return result; + } +} diff --git a/src/main/java/com/ss/editor/util/EditorUtil.java b/src/main/java/com/ss/editor/util/EditorUtil.java index 674cf5f6..735acbf9 100644 --- a/src/main/java/com/ss/editor/util/EditorUtil.java +++ b/src/main/java/com/ss/editor/util/EditorUtil.java @@ -21,6 +21,7 @@ import com.jme3.renderer.RenderManager; import com.jme3.renderer.Renderer; import com.jme3.scene.Node; +import com.jme3.scene.Spatial; import com.jme3.system.JmeSystem; import com.jme3.system.Platform; import com.ss.editor.JfxApplication; @@ -1013,4 +1014,22 @@ public static T[] getEnumValues(@NotNull Class enumType) { return unsafeCast(ENUM_VALUES_LOCAL.get() .get(enumType, type -> (Enum[]) type.getEnumConstants())); } + + /** + * Find a root key of the spatial. + * + * @param spatial the spatial. + * @return the root key or null. + */ + public static @Nullable String findRootKey(@Nullable Spatial spatial) { + + if(spatial == null) { + return null; + } + + return NodeUtils.findParentOpt(spatial, sp -> sp.getKey() != null) + .map(Spatial::getKey) + .map(AssetKey::getName) + .orElse(null); + } } diff --git a/src/main/java/com/ss/editor/util/NodeUtils.java b/src/main/java/com/ss/editor/util/NodeUtils.java index a85b04be..9b576d0b 100644 --- a/src/main/java/com/ss/editor/util/NodeUtils.java +++ b/src/main/java/com/ss/editor/util/NodeUtils.java @@ -18,6 +18,7 @@ import org.jetbrains.annotations.Nullable; import java.lang.reflect.Field; +import java.util.Optional; import java.util.function.Consumer; import java.util.function.Predicate; import java.util.stream.Stream; @@ -50,14 +51,13 @@ public class NodeUtils { * @return the found parent or null. */ @FromAnyThread - public static @Nullable T findParent(@NotNull final Spatial spatial, - @NotNull final Predicate condition) { + public static @Nullable T findParent(@NotNull Spatial spatial, @NotNull Predicate condition) { if (condition.test(spatial)) { return unsafeCast(spatial); } - final Node parent = spatial.getParent(); + var parent = spatial.getParent(); if (parent == null) { return null; } @@ -65,6 +65,32 @@ public class NodeUtils { return findParent(parent, condition); } + /** + * Find a parent of the model. + * + * @param the node's type. + * @param spatial the spatial. + * @param condition the condition. + * @return the optional result. + */ + @FromAnyThread + public static @NotNull Optional findParentOpt( + @NotNull Spatial spatial, + @NotNull Predicate condition + ) { + + if (condition.test(spatial)) { + return Optional.of(unsafeCast(spatial)); + } + + var parent = spatial.getParent(); + if (parent == null) { + return Optional.empty(); + } + + return findParentOpt(parent, condition); + } + /** * Find a parent of the model by the steps. * From 9a816d8985c82493a9cb8435d6622ae5f7a24bfe Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Thu, 17 May 2018 09:23:19 +0300 Subject: [PATCH 40/49] added tree test. --- src/test/java/com/ss/editor/test/external/TreeViewTest.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/test/java/com/ss/editor/test/external/TreeViewTest.java diff --git a/src/test/java/com/ss/editor/test/external/TreeViewTest.java b/src/test/java/com/ss/editor/test/external/TreeViewTest.java new file mode 100644 index 00000000..48786d7e --- /dev/null +++ b/src/test/java/com/ss/editor/test/external/TreeViewTest.java @@ -0,0 +1,4 @@ +package com.ss.editor.test.external; + +public class TreeViewTest { +} From 0c2be9ddb8b46a9994e1f1f918dea042c98041ca Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Thu, 17 May 2018 09:41:29 +0300 Subject: [PATCH 41/49] refactoring. --- .../control/client/OpenFileClientCommand.java | 20 +- .../ui/builder/EditorFxSceneBuilder.java | 8 - .../ui/component/asset/AssetComponent.java | 163 +++++++------- .../ui/component/asset/tree/ResourceTree.java | 50 ++--- .../editor/impl/AbstractFileEditor.java | 14 +- .../painting/PaintingComponentContainer.java | 72 +++--- .../painting/PaintingComponentListCell.java | 4 +- .../painting/PaintingComponentRegistry.java | 12 +- .../PropertiesBasedPaintingComponent.java | 13 +- .../terrain/TerrainPaintingComponent.java | 70 ++++-- .../split/pane/GlobalLeftToolSplitPane.java | 11 +- .../split/pane/TabToolSplitPane.java | 6 - .../dialog/asset/file/AssetEditorDialog.java | 9 +- .../ui/dialog/save/SaveAsEditorDialog.java | 9 +- .../ss/editor/ui/event/FxEventManager.java | 41 ++-- .../event/impl/AssetComponentLoadedEvent.java | 10 +- .../ui/event/impl/CreatedFileEvent.java | 26 +-- .../ui/event/impl/DeletedFileEvent.java | 19 +- .../ui/event/impl/FileChangedEvent.java | 8 +- .../ui/event/impl/RequestSelectFileEvent.java | 7 +- .../ss/editor/test/external/TreeViewTest.java | 208 +++++++++++++++++- 21 files changed, 495 insertions(+), 285 deletions(-) diff --git a/src/main/java/com/ss/editor/remote/control/client/OpenFileClientCommand.java b/src/main/java/com/ss/editor/remote/control/client/OpenFileClientCommand.java index ee27df43..aedb3143 100644 --- a/src/main/java/com/ss/editor/remote/control/client/OpenFileClientCommand.java +++ b/src/main/java/com/ss/editor/remote/control/client/OpenFileClientCommand.java @@ -10,7 +10,6 @@ import com.ss.editor.util.EditorUtil; import com.ss.rlib.common.network.ConnectionOwner; import com.ss.rlib.common.network.annotation.PacketDescription; -import javafx.event.Event; import javafx.event.EventHandler; import org.jetbrains.annotations.NotNull; @@ -26,21 +25,18 @@ @PacketDescription(id = 1) public class OpenFileClientCommand extends ClientCommand { - @NotNull private static final FxEventManager FX_EVENT_MANAGER = FxEventManager.getInstance(); - - @NotNull private static final ExecutorManager EXECUTOR_MANAGER = ExecutorManager.getInstance(); @Override @BackgroundThread - protected void readImpl(@NotNull final ConnectionOwner owner, @NotNull final ByteBuffer buffer) { + protected void readImpl(@NotNull ConnectionOwner owner, @NotNull ByteBuffer buffer) { - final Path assetPath = Paths.get(readString(buffer)); - final Path fileToOpen = Paths.get(readString(buffer)); + var assetPath = Paths.get(readString(buffer)); + var fileToOpen = Paths.get(readString(buffer)); - final EditorConfig editorConfig = EditorConfig.getInstance(); - final Path currentAsset = editorConfig.getCurrentAsset(); + var editorConfig = EditorConfig.getInstance(); + var currentAsset = editorConfig.getCurrentAsset(); if (currentAsset != null && assetPath.equals(currentAsset)) { EXECUTOR_MANAGER.addFxTask(() -> openFile(fileToOpen)); @@ -50,10 +46,10 @@ protected void readImpl(@NotNull final ConnectionOwner owner, @NotNull final Byt final OpenAssetAction action = new OpenAssetAction(); action.openAssetFolder(assetPath); - final EventHandler eventHandler = new EventHandler() { + var eventHandler = new EventHandler() { @Override - public void handle(final Event event) { + public void handle(@NotNull AssetComponentLoadedEvent event) { FX_EVENT_MANAGER.removeEventHandler(AssetComponentLoadedEvent.EVENT_TYPE, this); openFile(fileToOpen); } @@ -70,7 +66,7 @@ public void handle(final Event event) { * * @param fileToOpen the file. */ - private void openFile(@NotNull final Path fileToOpen) { + private void openFile(@NotNull Path fileToOpen) { FX_EVENT_MANAGER.notify(new RequestedOpenFileEvent(fileToOpen)); EditorUtil.requestFxFocus(); } diff --git a/src/main/java/com/ss/editor/ui/builder/EditorFxSceneBuilder.java b/src/main/java/com/ss/editor/ui/builder/EditorFxSceneBuilder.java index 4a11b80f..3893ae10 100644 --- a/src/main/java/com/ss/editor/ui/builder/EditorFxSceneBuilder.java +++ b/src/main/java/com/ss/editor/ui/builder/EditorFxSceneBuilder.java @@ -36,34 +36,26 @@ */ public class EditorFxSceneBuilder { - /** - * The CSS registry. - */ - @NotNull private static final CssRegistry CSS_REGISTRY = CssRegistry.getInstance(); /** * The path to the base CSS styles. */ - @NotNull public static final String CSS_FILE_BASE = "ui/css/base.css"; /** * The path to the external CSS styles. */ - @NotNull public static final String CSS_FILE_EXTERNAL = "ui/css/external.css"; /** * The path to the custom ids CSS styles. */ - @NotNull public static final String CSS_FILE_CUSTOM_IDS = "ui/css/custom_ids.css"; /** * The path to the custom classes CSS styles. */ - @NotNull public static final String CSS_FILE_CUSTOM_CLASSES = "ui/css/custom_classes.css"; static { diff --git a/src/main/java/com/ss/editor/ui/component/asset/AssetComponent.java b/src/main/java/com/ss/editor/ui/component/asset/AssetComponent.java index 7d8fe2fb..5d665e4c 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/AssetComponent.java +++ b/src/main/java/com/ss/editor/ui/component/asset/AssetComponent.java @@ -1,12 +1,11 @@ package com.ss.editor.ui.component.asset; import static com.ss.rlib.common.util.ObjectUtils.notNull; -import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; +import com.ss.editor.annotation.FxThread; import com.ss.editor.config.EditorConfig; import com.ss.editor.manager.ExecutorManager; import com.ss.editor.manager.WorkspaceManager; -import com.ss.editor.model.workspace.Workspace; import com.ss.editor.ui.component.ScreenComponent; import com.ss.editor.ui.component.asset.tree.ResourceTree; import com.ss.editor.ui.component.asset.tree.resource.FolderResourceElement; @@ -17,9 +16,9 @@ import com.ss.editor.ui.event.FxEventManager; import com.ss.editor.ui.event.impl.*; import com.ss.editor.ui.util.UiUtils; -import com.ss.rlib.fx.util.FXUtils; import com.ss.rlib.common.util.array.Array; import com.ss.rlib.common.util.array.ArrayFactory; +import com.ss.rlib.fx.util.FxUtils; import javafx.scene.control.TreeItem; import javafx.scene.layout.VBox; import org.jetbrains.annotations.NotNull; @@ -37,20 +36,11 @@ public class AssetComponent extends VBox implements ScreenComponent { @NotNull private static final String COMPONENT_ID = "AssetComponent"; - /** - * The executor manager. - */ - @NotNull private static final ExecutorManager EXECUTOR_MANAGER = ExecutorManager.getInstance(); - - /** - * The event manager. - */ - @NotNull private static final FxEventManager FX_EVENT_MANAGER = FxEventManager.getInstance(); /** - * The list of waited files to select. + * The list of waited files to be selected. */ @NotNull private final Array waitedFilesToSelect; @@ -79,17 +69,17 @@ public AssetComponent() { this.waitedFilesToSelect = ArrayFactory.newArray(Path.class); setId(CssIds.ASSET_COMPONENT); createComponents(); - FX_EVENT_MANAGER.addEventHandler(RequestedRefreshAssetEvent.EVENT_TYPE, event -> processRefresh()); - FX_EVENT_MANAGER.addEventHandler(ChangedCurrentAssetFolderEvent.EVENT_TYPE, event -> processChangeAsset()); - FX_EVENT_MANAGER.addEventHandler(CreatedFileEvent.EVENT_TYPE, event -> processEvent((CreatedFileEvent) event)); - FX_EVENT_MANAGER.addEventHandler(RequestSelectFileEvent.EVENT_TYPE, event -> processEvent((RequestSelectFileEvent) event)); - FX_EVENT_MANAGER.addEventHandler(DeletedFileEvent.EVENT_TYPE, event -> processEvent((DeletedFileEvent) event)); + FX_EVENT_MANAGER.addEventHandler(RequestedRefreshAssetEvent.EVENT_TYPE, event -> refreshAssetFolder()); + FX_EVENT_MANAGER.addEventHandler(ChangedCurrentAssetFolderEvent.EVENT_TYPE, event -> switchAssetFolder()); + FX_EVENT_MANAGER.addEventHandler(CreatedFileEvent.EVENT_TYPE, this::handleCreatedFile); + FX_EVENT_MANAGER.addEventHandler(RequestSelectFileEvent.EVENT_TYPE, this::handleRequestToSelectFile); + FX_EVENT_MANAGER.addEventHandler(DeletedFileEvent.EVENT_TYPE, this::handleDeletedFile); } /** - * Gets waited files to select. + * Get the list of waited files to be selected. * - * @return the list of waited files to select. + * @return the list of waited files to be selected. */ @FromAnyThread private @NotNull Array getWaitedFilesToSelect() { @@ -97,16 +87,16 @@ public AssetComponent() { } /** - * Handle request for selection a file. + * Handle of the request to select a file. */ @FxThread - private void processEvent(@NotNull final RequestSelectFileEvent event) { + private void handleRequestToSelectFile(@NotNull RequestSelectFileEvent event) { - final Path file = event.getFile(); + var file = event.getFile(); - final ResourceTree resourceTree = getResourceTree(); - final ResourceElement element = ResourceElementFactory.createFor(file); - final TreeItem treeItem = UiUtils.findItemForValue(resourceTree.getRoot(), element); + var resourceTree = getResourceTree(); + var element = ResourceElementFactory.createFor(file); + var treeItem = UiUtils.findItemForValue(resourceTree.getRoot(), element); if (treeItem == null) { getWaitedFilesToSelect().add(file); @@ -117,55 +107,61 @@ private void processEvent(@NotNull final RequestSelectFileEvent event) { } /** - * Handle a created file. + * Handle of the created file. */ @FxThread - private void processEvent(@NotNull final CreatedFileEvent event) { + private void handleCreatedFile(@NotNull CreatedFileEvent event) { - final Path file = event.getFile(); + var file = event.getFile(); - final Array waitedFilesToSelect = getWaitedFilesToSelect(); - final boolean waitedSelect = waitedFilesToSelect.contains(file); + var waitedFilesToSelect = getWaitedFilesToSelect(); + var wasWaitedToSelect = waitedFilesToSelect.contains(file); - final ResourceTree resourceTree = getResourceTree(); + var resourceTree = getResourceTree(); resourceTree.notifyCreated(file); - if (waitedSelect) waitedFilesToSelect.fastRemove(file); - if (waitedSelect || event.isNeedSelect()) resourceTree.expandTo(file, true); + if (wasWaitedToSelect) { + waitedFilesToSelect.fastRemove(file); + } + + if (wasWaitedToSelect || event.isNeedSelect()) { + resourceTree.expandTo(file, true); + } } /** - * Handle a deleted file. + * Handle of the deleted file. */ @FxThread - private void processEvent(@NotNull final DeletedFileEvent event) { + private void handleDeletedFile(@NotNull DeletedFileEvent event) { - final Path file = event.getFile(); + var file = event.getFile(); - final ResourceTree resourceTree = getResourceTree(); + var resourceTree = getResourceTree(); resourceTree.notifyDeleted(file); - final WorkspaceManager workspaceManager = WorkspaceManager.getInstance(); - final Workspace workspace = workspaceManager.getCurrentWorkspace(); - if (workspace == null) return; - workspace.removeEditorState(file); + var workspaceManager = WorkspaceManager.getInstance(); + var workspace = workspaceManager.getCurrentWorkspace(); + + if (workspace != null) { + workspace.removeEditorState(file); + } } /** - * Handle changing an asset folder. + * Switch to a new asset folder. */ @FxThread - private void processChangeAsset() { + private void switchAssetFolder() { loadAssetFolder(); } /** - * Handle refreshing. + * Refresh the current asset folder. */ @FxThread - private void processRefresh() { - final ResourceTree resourceTree = getResourceTree(); - resourceTree.refresh(); + private void refreshAssetFolder() { + getResourceTree().refresh(); } /** @@ -175,38 +171,39 @@ private void processRefresh() { private void createComponents() { setIgnoreExpanded(true); - this.barComponent = new AssetBarComponent(); - this.resourceTree = new ResourceTree(false); - this.resourceTree.setExpandHandler(this::updateExpanded); - this.resourceTree.setOnLoadHandler(this::handleTreeLoading); + barComponent = new AssetBarComponent(); + + resourceTree = new ResourceTree(false); + resourceTree.setExpandHandler(this::updateExpanded); + resourceTree.setOnLoadHandler(this::handleTreeLoading); + resourceTree.prefHeightProperty().bind(heightProperty()); //FIXME пока он не нужен //FXUtils.addToPane(barComponent, this); //FXUtils.bindFixedHeight(resourceTree, heightProperty().subtract(barComponent.heightProperty())); - FXUtils.addToPane(resourceTree, this); - FXUtils.bindFixedHeight(resourceTree, heightProperty()); - FXUtils.addClassTo(resourceTree, CssClasses.TRANSPARENT_LIST_VIEW); + FxUtils.addClass(resourceTree, CssClasses.TRANSPARENT_LIST_VIEW); + FxUtils.addChild(this, resourceTree); } /** - * Handle changing loading state of the tree. + * Handle of changing loading state of the tree. */ @FxThread - private void handleTreeLoading(@NotNull final Boolean finished) { + private void handleTreeLoading(@NotNull Boolean finished) { - final WorkspaceManager workspaceManager = WorkspaceManager.getInstance(); - final Workspace workspace = workspaceManager.getCurrentWorkspace(); + var workspaceManager = WorkspaceManager.getInstance(); + var workspace = workspaceManager.getCurrentWorkspace(); if (finished && workspace != null) { - final Array expandedFolders = workspace.getExpandedAbsoluteFolders(); - expandedFolders.forEach(getResourceTree()::markExpand); + workspace.getExpandedAbsoluteFolders() + .forEach(getResourceTree()::markExpand); } if (finished) { - final EditorConfig editorConfig = EditorConfig.getInstance(); - final Path currentAsset = editorConfig.getCurrentAsset(); + var editorConfig = EditorConfig.getInstance(); + var currentAsset = editorConfig.getCurrentAsset(); EXECUTOR_MANAGER.addFxTask(() -> setIgnoreExpanded(false)); @@ -220,7 +217,7 @@ private void handleTreeLoading(@NotNull final Boolean finished) { } /** - * Is ignore expanded boolean. + * Return true if the expand listener is ignored. * * @return true if the expand listener is ignored. */ @@ -230,9 +227,9 @@ private boolean isIgnoreExpanded() { } /** - * Sets ignore expanded. + * Set true if the expand listener is ignored. * - * @param ignoreExpanded the flag for ignoring expand changes. + * @param ignoreExpanded true if the expand listener is ignored. */ @FromAnyThread private void setIgnoreExpanded(final boolean ignoreExpanded) { @@ -243,15 +240,20 @@ private void setIgnoreExpanded(final boolean ignoreExpanded) { * Handle changes count of expanded folders. */ @FxThread - private void updateExpanded(final int count, final ResourceTree tree) { - if (isIgnoreExpanded()) return; + private void updateExpanded(int count, ResourceTree tree) { + + if (isIgnoreExpanded()) { + return; + } - final WorkspaceManager workspaceManager = WorkspaceManager.getInstance(); - final Workspace workspace = workspaceManager.getCurrentWorkspace(); - if (workspace == null) return; + var workspaceManager = WorkspaceManager.getInstance(); + var workspace = workspaceManager.getCurrentWorkspace(); + if (workspace == null) { + return; + } - final Array expanded = ArrayFactory.newArray(Path.class); - final Array> allItems = UiUtils.getAllItems(tree); + var expanded = ArrayFactory.newArray(Path.class); + var allItems = UiUtils.getAllItems(tree); allItems.stream().filter(TreeItem::isExpanded) .filter(treeItem -> !treeItem.isLeaf()) .map(TreeItem::getValue) @@ -263,6 +265,8 @@ private void updateExpanded(final int count, final ResourceTree tree) { } /** + * Get the toolbar of this component. + * * @return the toolbar of this component. */ @FxThread @@ -271,6 +275,8 @@ private void updateExpanded(final int count, final ResourceTree tree) { } /** + * Get the resource tree. + * * @return the resource tree. */ @FxThread @@ -293,11 +299,12 @@ public void notifyFinishBuild() { @FxThread private void loadAssetFolder() { - final EditorConfig editorConfig = EditorConfig.getInstance(); - final Path currentAsset = editorConfig.getCurrentAsset(); - if (currentAsset == null) return; + var editorConfig = EditorConfig.getInstance(); + var currentAsset = editorConfig.getCurrentAsset(); + if (currentAsset == null) { + return; + } - final ResourceTree resourceTree = getResourceTree(); - resourceTree.fill(currentAsset); + getResourceTree().fill(currentAsset); } } diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java b/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java index 5e0b29b4..81690b29 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java @@ -13,8 +13,6 @@ import com.ss.editor.ui.component.asset.tree.context.menu.action.*; import com.ss.editor.ui.component.asset.tree.resource.*; import com.ss.editor.ui.util.UiUtils; -import com.ss.rlib.common.concurrent.barrier.Barrier; -import com.ss.rlib.common.concurrent.barrier.BarrierFactory; import com.ss.rlib.common.function.IntObjectConsumer; import com.ss.rlib.common.util.StringUtils; import com.ss.rlib.common.util.array.Array; @@ -22,9 +20,11 @@ import com.ss.rlib.common.util.array.ArrayFactory; import com.ss.rlib.common.util.array.ConcurrentArray; import javafx.collections.FXCollections; +import javafx.event.EventHandler; import javafx.scene.control.ContextMenu; import javafx.scene.control.SelectionMode; import javafx.scene.control.TreeItem; +import javafx.scene.control.TreeItem.TreeModificationEvent; import javafx.scene.control.TreeView; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; @@ -128,10 +128,10 @@ private static int getLevel(@Nullable ResourceElement element) { private final Consumer openFunction; /** - * The memory barrier. + * The tree item event handler. */ @NotNull - private final Barrier barrier; + private final EventHandler> treeItemEventHandler; /** * The action tester. @@ -188,10 +188,7 @@ public ResourceTree(@Nullable Consumer openFunction, boolean re this.selectedElements = ArrayFactory.newConcurrentAtomicARSWLockArray(ResourceElement.class); this.extensionFilter = ArrayFactory.newArray(String.class, 0); this.actionTester = actionClass -> true; - this.barrier = BarrierFactory.newVolatileBased(); - - expandedItemCountProperty() - .addListener((observable, oldValue, newValue) -> processChangedExpands(newValue)); + this.treeItemEventHandler = this::processChangedExpands; getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); setFixedCellSize(FxConstants.RESOURCE_TREE_CELL_HEIGHT); @@ -200,6 +197,15 @@ public ResourceTree(@Nullable Consumer openFunction, boolean re setShowRoot(true); setContextMenu(new ContextMenu()); setFocusTraversable(true); + + rootProperty().addListener((observable, oldValue, newValue) -> { + if (oldValue != null) { + oldValue.removeEventHandler(TreeItem.treeNotificationEvent(), treeItemEventHandler); + } + if (newValue != null) { + newValue.addEventHandler(TreeItem.treeNotificationEvent(), treeItemEventHandler); + } + }); } /** @@ -246,13 +252,18 @@ private boolean isNeedCleanup() { * Handle changed count of expanded elements. */ @FxThread - private void processChangedExpands(@NotNull Number newValue) { + private void processChangedExpands(@NotNull TreeModificationEvent event) { + + if (!(event.wasExpanded() || event.wasCollapsed())) { + return; + } if (isLazyMode()) { EXECUTOR_MANAGER.addFxTask(this::lazyLoadChildren); } - getExpandHandler().ifPresent(handler -> handler.accept(newValue.intValue(), this)); + getExpandHandler().ifPresent(handler -> + handler.accept(getExpandedItemCount(), this)); } /** @@ -616,8 +627,6 @@ private void showLoading() { @BackgroundThread private void startBackgroundFill(@NotNull Path path) { - barrier.loadChanges(); - var rootElement = createFor(path); var newRoot = new TreeItem(rootElement); newRoot.setExpanded(true); @@ -628,8 +637,6 @@ private void startBackgroundFill(@NotNull Path path) { cleanup(newRoot); } - barrier.commitChanges(); - EXECUTOR_MANAGER.addFxTask(() -> applyNewRoot(newRoot)); } @@ -640,18 +647,11 @@ private void startBackgroundFill(@NotNull Path path) { */ @FxThread private void applyNewRoot(@NotNull TreeItem newRoot) { - barrier.loadChanges(); - try { + setRoot(newRoot); - setRoot(newRoot); - - var onLoadHandler = getOnLoadHandler(); - if (onLoadHandler != null) { - onLoadHandler.accept(Boolean.TRUE); - } - - } finally { - barrier.commitChanges(); + var onLoadHandler = getOnLoadHandler(); + if (onLoadHandler != null) { + onLoadHandler.accept(Boolean.TRUE); } } diff --git a/src/main/java/com/ss/editor/ui/component/editor/impl/AbstractFileEditor.java b/src/main/java/com/ss/editor/ui/component/editor/impl/AbstractFileEditor.java index b4cbbfad..e84f28de 100644 --- a/src/main/java/com/ss/editor/ui/component/editor/impl/AbstractFileEditor.java +++ b/src/main/java/com/ss/editor/ui/component/editor/impl/AbstractFileEditor.java @@ -2,11 +2,7 @@ import static com.ss.rlib.common.util.ObjectUtils.notNull; import static java.nio.file.StandardOpenOption.TRUNCATE_EXISTING; - -import com.jme3.asset.AssetKey; -import com.jme3.asset.ModelKey; import com.jme3.math.Vector3f; -import com.jme3.scene.Spatial; import com.ss.editor.JmeApplication; import com.ss.editor.Messages; import com.ss.editor.analytics.google.GAEvent; @@ -24,17 +20,15 @@ import com.ss.editor.ui.event.impl.FileChangedEvent; import com.ss.editor.ui.util.DynamicIconSupport; import com.ss.editor.ui.util.UiUtils; -import com.ss.editor.util.EditorUtil; import com.ss.rlib.common.logging.Logger; import com.ss.rlib.common.logging.LoggerManager; -import com.ss.rlib.fx.util.FXUtils; import com.ss.rlib.common.util.FileUtils; import com.ss.rlib.common.util.Utils; import com.ss.rlib.common.util.array.Array; import com.ss.rlib.common.util.array.ArrayFactory; +import com.ss.rlib.fx.util.FXUtils; import javafx.beans.property.BooleanProperty; import javafx.beans.property.SimpleBooleanProperty; -import javafx.event.Event; import javafx.event.EventHandler; import javafx.scene.control.Button; import javafx.scene.control.Tooltip; @@ -93,7 +87,7 @@ public abstract class AbstractFileEditor implements FileEditor { * The file changes listener. */ @NotNull - private final EventHandler fileChangedHandler; + private final EventHandler fileChangedHandler; /** * The dirty property. @@ -152,7 +146,7 @@ protected AbstractFileEditor() { this.showedTime = LocalTime.now(); this.editor3DParts = ArrayFactory.newArray(Editor3DPart.class); this.dirtyProperty = new SimpleBooleanProperty(this, "dirty", false); - this.fileChangedHandler = event -> processChangedFile((FileChangedEvent) event); + this.fileChangedHandler = this::processChangedFile; createContent(); } @@ -614,7 +608,7 @@ protected void handleExternalChanges() { * @return the file changes listener. */ @FxThread - private @NotNull EventHandler getFileChangedHandler() { + private @NotNull EventHandler getFileChangedHandler() { return fileChangedHandler; } diff --git a/src/main/java/com/ss/editor/ui/component/painting/PaintingComponentContainer.java b/src/main/java/com/ss/editor/ui/component/painting/PaintingComponentContainer.java index 9faab248..6731be73 100644 --- a/src/main/java/com/ss/editor/ui/component/painting/PaintingComponentContainer.java +++ b/src/main/java/com/ss/editor/ui/component/painting/PaintingComponentContainer.java @@ -9,10 +9,9 @@ import com.ss.editor.ui.FxConstants; import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.css.CssClasses; -import com.ss.rlib.fx.util.FXUtils; import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.fx.util.FxUtils; import javafx.beans.value.ObservableValue; -import javafx.collections.ObservableList; import javafx.scene.Node; import javafx.scene.control.ComboBox; import javafx.scene.control.Label; @@ -29,13 +28,7 @@ */ public class PaintingComponentContainer extends ScrollPane { - /** - * The constant LABEL_PERCENT. - */ public static final double LABEL_PERCENT = 1D - PropertyControl.CONTROL_WIDTH_PERCENT_2; - /** - * The constant FIELD_PERCENT. - */ public static final double FIELD_PERCENT = PropertyControl.CONTROL_WIDTH_PERCENT_2; /** @@ -85,42 +78,44 @@ public class PaintingComponentContainer extends ScrollPane { */ protected boolean showed; - public PaintingComponentContainer(@NotNull final ModelChangeConsumer changeConsumer, @NotNull final Editor3DProvider provider) { + public PaintingComponentContainer(@NotNull ModelChangeConsumer changeConsumer, @NotNull Editor3DProvider provider) { this.changeConsumer = changeConsumer; this.provider = provider; this.container = new VBox(); this.container.prefWidthProperty() .bind(widthProperty().subtract(FxConstants.PROPERTY_LIST_OFFSET)); - final HBox horContainer = new HBox(); - horContainer.prefWidthProperty() + var toolTypeContainer = new HBox(); + toolTypeContainer.prefWidthProperty() .bind(widthProperty().subtract(FxConstants.PROPERTY_LIST_OFFSET)); - final Label label = new Label(Messages.PAINTING_COMPONENT_CONTAINER_TOOL + ":"); - label.maxWidthProperty().bind(horContainer.widthProperty() + var label = new Label(Messages.PAINTING_COMPONENT_CONTAINER_TOOL + ":"); + label.maxWidthProperty().bind(toolTypeContainer.widthProperty() .multiply(LABEL_PERCENT)); componentBox = new ComboBox<>(); componentBox.setCellFactory(PaintingComponentListCell::new); componentBox.setButtonCell(new PaintingComponentListCell(null)); componentBox.setPromptText("No tools"); - componentBox.prefWidthProperty().bind(horContainer.widthProperty() + componentBox.prefWidthProperty().bind(toolTypeContainer.widthProperty() .multiply(FIELD_PERCENT)); componentBox.getSelectionModel() .selectedItemProperty() .addListener(this::activate); - final VBox resultContainer = new VBox(); + var resultContainer = new VBox(); setContent(resultContainer); - FXUtils.addToPane(label, componentBox, horContainer); - FXUtils.addToPane(horContainer, container, resultContainer); - FXUtils.addClassTo(container, CssClasses.DEF_VBOX); - FXUtils.addClassTo(horContainer, CssClasses.DEF_HBOX); - FXUtils.addClassTo(resultContainer, CssClasses.PAINTING_COMPONENT_ROOT); + FxUtils.addClass(container, CssClasses.DEF_VBOX) + .addClass(toolTypeContainer, CssClasses.DEF_HBOX) + .addClass(resultContainer, CssClasses.PAINTING_COMPONENT_ROOT); + + FxUtils.addChild(toolTypeContainer, label, componentBox) + .addChild(resultContainer, toolTypeContainer, container); + + var registry = PaintingComponentRegistry.getInstance(); - final PaintingComponentRegistry registry = PaintingComponentRegistry.getInstance(); this.components = registry.createComponents(this); } @@ -140,7 +135,7 @@ public PaintingComponentContainer(@NotNull final ModelChangeConsumer changeConsu * @param paintedObject the painted object. */ @FxThread - private void setPaintedObject(@Nullable final Object paintedObject) { + private void setPaintedObject(@Nullable Object paintedObject) { this.paintedObject = paintedObject; } @@ -160,7 +155,7 @@ private void setPaintedObject(@Nullable final Object paintedObject) { * @param currentComponent the current painting component. */ @FxThread - private void setCurrentComponent(@Nullable final PaintingComponent currentComponent) { + private void setCurrentComponent(@Nullable PaintingComponent currentComponent) { this.currentComponent = currentComponent; } @@ -172,11 +167,13 @@ private void setCurrentComponent(@Nullable final PaintingComponent currentCompon * @param newValue the new component. */ @FxThread - private void activate(@NotNull final ObservableValue observable, - @Nullable final PaintingComponent oldValue, @Nullable final PaintingComponent newValue) { + private void activate( + @NotNull ObservableValue observable, + @Nullable PaintingComponent oldValue, + @Nullable PaintingComponent newValue + ) { - final ObservableList items = getContainer() - .getChildren(); + var items = getContainer().getChildren(); if (oldValue != null) { oldValue.notifyHided(); @@ -184,15 +181,18 @@ private void activate(@NotNull final ObservableValue componentBox = getComponentBox(); - final ObservableList items = componentBox.getItems(); + var componentBox = getComponentBox(); + var items = componentBox.getItems(); items.clear(); if (element != null) { @@ -258,7 +258,7 @@ public void prepareFor(@Nullable final Object element) { @FxThread public void notifyShowed() { setShowed(true); - final PaintingComponent currentComponent = getCurrentComponent(); + var currentComponent = getCurrentComponent(); if (currentComponent != null) { currentComponent.notifyShowed(); } @@ -270,7 +270,7 @@ public void notifyShowed() { @FxThread public void notifyHided() { setShowed(false); - final PaintingComponent currentComponent = getCurrentComponent(); + var currentComponent = getCurrentComponent(); if (currentComponent != null) { currentComponent.notifyHided(); } @@ -312,7 +312,7 @@ protected boolean isShowed() { * @param showed true if this component is showed. */ @FxThread - protected void setShowed(final boolean showed) { + protected void setShowed(boolean showed) { this.showed = showed; } @@ -323,8 +323,8 @@ protected void setShowed(final boolean showed) { * @param propertyName the property name. */ @FxThread - public void notifyChangeProperty(@NotNull final Object object, @NotNull final String propertyName) { - final PaintingComponent currentComponent = getCurrentComponent(); + public void notifyChangeProperty(@NotNull Object object, @NotNull String propertyName) { + var currentComponent = getCurrentComponent(); if (currentComponent != null) { currentComponent.notifyChangeProperty(object, propertyName); } diff --git a/src/main/java/com/ss/editor/ui/component/painting/PaintingComponentListCell.java b/src/main/java/com/ss/editor/ui/component/painting/PaintingComponentListCell.java index 263d3a16..d5b06d5d 100644 --- a/src/main/java/com/ss/editor/ui/component/painting/PaintingComponentListCell.java +++ b/src/main/java/com/ss/editor/ui/component/painting/PaintingComponentListCell.java @@ -21,14 +21,14 @@ public class PaintingComponentListCell extends ListCell { @NotNull private final ImageView imageView; - public PaintingComponentListCell(@Nullable final ListView listView) { + public PaintingComponentListCell(@Nullable ListView listView) { this.imageView = new ImageView(); setGraphic(imageView); } @Override @FxThread - protected void updateItem(@Nullable final PaintingComponent item, final boolean empty) { + protected void updateItem(@Nullable PaintingComponent item, boolean empty) { super.updateItem(item, empty); if (item == null) { diff --git a/src/main/java/com/ss/editor/ui/component/painting/PaintingComponentRegistry.java b/src/main/java/com/ss/editor/ui/component/painting/PaintingComponentRegistry.java index 082c5d22..cbefaa2b 100644 --- a/src/main/java/com/ss/editor/ui/component/painting/PaintingComponentRegistry.java +++ b/src/main/java/com/ss/editor/ui/component/painting/PaintingComponentRegistry.java @@ -42,7 +42,7 @@ private PaintingComponentRegistry() { * @param constructor the new painting component's constructor. */ @FxThread - public void register(@NotNull final Function constructor) { + public void register(@NotNull Function constructor) { this.constructors.add(constructor); } @@ -53,9 +53,13 @@ public void register(@NotNull final Function createComponents(@NotNull final PaintingComponentContainer container) { - final Array result = ArrayFactory.newArray(PaintingComponent.class); - constructors.forEach(result, container, (constructor, components, cont) -> components.add(constructor.apply(cont))); + public @NotNull Array createComponents(@NotNull PaintingComponentContainer container) { + + var result = ArrayFactory.newArray(PaintingComponent.class); + + constructors.forEach(result, container, + (constructor, components, cont) -> components.add(constructor.apply(cont))); + return result; } } diff --git a/src/main/java/com/ss/editor/ui/component/painting/property/PropertiesBasedPaintingComponent.java b/src/main/java/com/ss/editor/ui/component/painting/property/PropertiesBasedPaintingComponent.java index 19e8f7cb..eef004ba 100644 --- a/src/main/java/com/ss/editor/ui/component/painting/property/PropertiesBasedPaintingComponent.java +++ b/src/main/java/com/ss/editor/ui/component/painting/property/PropertiesBasedPaintingComponent.java @@ -128,9 +128,20 @@ protected void refreshPropertyControls() { */ @FxThread protected void showCategory(@NotNull String category) { + var children = getChildren(); children.removeIf(AdditionalPropertyContainer.class::isInstance); - children.add(propertyContainers.get(category)); + + var index = children.indexOf(brushSettings); + + // supporting additional not properties children + propertyContainers.getOptional(category).ifPresent(container -> { + if (children.size() == 1) { + children.add(container); + } else { + children.add(index + 1, container); + } + }); } /** diff --git a/src/main/java/com/ss/editor/ui/component/painting/terrain/TerrainPaintingComponent.java b/src/main/java/com/ss/editor/ui/component/painting/terrain/TerrainPaintingComponent.java index b55fd681..6e3bf74a 100644 --- a/src/main/java/com/ss/editor/ui/component/painting/terrain/TerrainPaintingComponent.java +++ b/src/main/java/com/ss/editor/ui/component/painting/terrain/TerrainPaintingComponent.java @@ -20,20 +20,20 @@ import com.ss.editor.ui.Icons; import com.ss.editor.ui.component.editor.state.EditorState; import com.ss.editor.ui.component.painting.PaintingComponentContainer; -import com.ss.editor.ui.component.painting.impl.AbstractPaintingComponent; +import com.ss.editor.ui.component.painting.property.PaintingPropertyDefinition; +import com.ss.editor.ui.component.painting.property.PropertiesBasedPaintingComponent; import com.ss.editor.ui.component.painting.terrain.paint.TextureLayerSettings; import com.ss.editor.ui.control.property.operation.PropertyOperation; import com.ss.editor.ui.css.CssClasses; import com.ss.editor.util.MaterialUtils; import com.ss.editor.util.NodeUtils; -import com.ss.rlib.fx.control.input.FloatTextField; -import com.ss.rlib.fx.util.FXUtils; import com.ss.rlib.common.util.StringUtils; import com.ss.rlib.common.util.array.Array; import com.ss.rlib.common.util.array.ArrayFactory; import com.ss.rlib.common.util.dictionary.DictionaryFactory; import com.ss.rlib.common.util.dictionary.ObjectDictionary; -import javafx.collections.ObservableList; +import com.ss.rlib.fx.control.input.FloatTextField; +import com.ss.rlib.fx.util.FXUtils; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.control.CheckBox; @@ -55,14 +55,14 @@ * * @author JavaSaBr */ -public class TerrainPaintingComponent extends AbstractPaintingComponent { +public class TerrainPaintingComponent extends + PropertiesBasedPaintingComponent { - /** - * The constant TERRAIN_PARAM. - */ - @NotNull public static final String TERRAIN_PARAM = "terrainParam"; + private static final String CATEGORY_RAISE_LOWER = "RaiseLower"; + + @NotNull private static final Function LAYER_TO_SCALE_NAME = layer -> "DiffuseMap_" + layer + "_scale"; @@ -118,6 +118,12 @@ public class TerrainPaintingComponent extends AbstractPaintingComponent buttonToControl; + /** + * The map with mapping toggle button to properties category. + */ + @NotNull + private final ObjectDictionary buttonToCategory; + /** * The map with mapping toggle button to its settings. */ @@ -304,11 +310,12 @@ public class TerrainPaintingComponent extends AbstractPaintingComponent getPaintingProperties() { + + var result = ArrayFactory.newArray(PaintingPropertyDefinition.class); + //result.add(new PaintingPropertyDefinition(CATEGORY_DEFAULT, ENUM, + // Messages.MODEL_PROPERTY_METHOD, PROPERTY_METHOD, SpawnToolControl.SpawnMethod.BATCH)); + + return result; + } + @Override @FxThread public void loadState(@NotNull final EditorState editorState) { @@ -400,6 +418,16 @@ public void loadState(@NotNull final EditorState editorState) { return buttonToControl; } + /** + * Get the map with mapping toggle button to properties category. + * + * @return the map with mapping toggle button to properties category. + */ + @FxThread + private ObjectDictionary getButtonToCategory() { + return buttonToCategory; + } + /** * Get the map with mapping toggle button to its settings. * @@ -503,7 +531,7 @@ protected void createComponents() { paintButton = new ToggleButton(StringUtils.EMPTY, new ImageView(Icons.TERRAIN_PAINT_32)); paintButton.setOnAction(event -> switchMode((ToggleButton) event.getSource())); - final GridPane buttonsContainer = new GridPane(); + var buttonsContainer = new GridPane(); buttonsContainer.setAlignment(Pos.CENTER); buttonsContainer.setPadding(new Insets(2, 4, 2, 4)); buttonsContainer.add(raiseLowerButton, 0, 0); @@ -1045,17 +1073,20 @@ protected void setBrushPower(@NotNull final Float power) { * Switch editing mode. */ @FxThread - private void switchMode(@NotNull final ToggleButton source) { + private void switchMode(@NotNull ToggleButton source) { if (!source.isSelected()) { source.setSelected(true); return; } - getToggleButtons().forEach(source, (button, arg) -> button != - arg, (toggleButton, arg) -> toggleButton.setSelected(false)); + getToggleButtons().forEach(source, + (button, arg) -> button != arg, + (toDeselect, arg) -> toDeselect.setSelected(false)); + + showCategory(notNull(getButtonToCategory().get(source))); - final ObjectDictionary buttonToSettings = getButtonToSettings(); + /*final ObjectDictionary buttonToSettings = getButtonToSettings(); final Pane settings = buttonToSettings.get(source); final VBox controlSettings = getControlSettings(); @@ -1064,10 +1095,9 @@ private void switchMode(@NotNull final ToggleButton source) { if (settings != null) { children.add(settings); - } + }*/ - final ObjectDictionary buttonToControl = getButtonToControl(); - final TerrainToolControl toolControl = buttonToControl.get(source); + var toolControl = getButtonToControl().get(source); setToolControl(toolControl); @@ -1076,7 +1106,7 @@ private void switchMode(@NotNull final ToggleButton source) { } EXECUTOR_MANAGER.addJmeTask(() -> { - final Node cursorNode = getCursorNode(); + var cursorNode = getCursorNode(); cursorNode.removeControl(TerrainToolControl.class); cursorNode.addControl(toolControl); }); diff --git a/src/main/java/com/ss/editor/ui/component/split/pane/GlobalLeftToolSplitPane.java b/src/main/java/com/ss/editor/ui/component/split/pane/GlobalLeftToolSplitPane.java index 778515fb..b9969ab1 100644 --- a/src/main/java/com/ss/editor/ui/component/split/pane/GlobalLeftToolSplitPane.java +++ b/src/main/java/com/ss/editor/ui/component/split/pane/GlobalLeftToolSplitPane.java @@ -15,12 +15,7 @@ */ public class GlobalLeftToolSplitPane extends TabToolSplitPane { - /** - * Instantiates a new Global left tool split pane. - * - * @param scene the scene - */ - public GlobalLeftToolSplitPane(@NotNull final Scene scene) { + public GlobalLeftToolSplitPane(@NotNull Scene scene) { super(scene, EditorConfig.getInstance()); } @@ -35,12 +30,12 @@ protected int loadSize() { } @Override - protected void saveCollapsed(final boolean collapsed) { + protected void saveCollapsed(boolean collapsed) { getConfig().setGlobalLeftToolCollapsed(collapsed); } @Override - protected void saveSize(final int size) { + protected void saveSize(int size) { getConfig().setGlobalLeftToolWidth(size); } } diff --git a/src/main/java/com/ss/editor/ui/component/split/pane/TabToolSplitPane.java b/src/main/java/com/ss/editor/ui/component/split/pane/TabToolSplitPane.java index c12fac3f..9473b0bf 100644 --- a/src/main/java/com/ss/editor/ui/component/split/pane/TabToolSplitPane.java +++ b/src/main/java/com/ss/editor/ui/component/split/pane/TabToolSplitPane.java @@ -46,12 +46,6 @@ public abstract class TabToolSplitPane extends SplitPane { */ private boolean collapsed; - /** - * Instantiates a new Tab tool split pane. - * - * @param scene the scene - * @param config the config - */ protected TabToolSplitPane(@NotNull final Scene scene, @Nullable C config) { this.scene = scene; this.config = config; diff --git a/src/main/java/com/ss/editor/ui/dialog/asset/file/AssetEditorDialog.java b/src/main/java/com/ss/editor/ui/dialog/asset/file/AssetEditorDialog.java index 37e46d35..76bb2c40 100644 --- a/src/main/java/com/ss/editor/ui/dialog/asset/file/AssetEditorDialog.java +++ b/src/main/java/com/ss/editor/ui/dialog/asset/file/AssetEditorDialog.java @@ -3,8 +3,8 @@ import static com.ss.editor.ui.component.asset.tree.resource.ResourceElementFactory.createFor; import static com.ss.editor.ui.util.UiUtils.findItemForValue; import static com.ss.rlib.common.util.ObjectUtils.notNull; -import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; +import com.ss.editor.annotation.FxThread; import com.ss.editor.config.EditorConfig; import com.ss.editor.manager.ExecutorManager; import com.ss.editor.ui.component.asset.tree.ResourceTree; @@ -19,7 +19,6 @@ import com.ss.rlib.common.util.array.ArrayFactory; import javafx.beans.property.ReadOnlyObjectProperty; import javafx.beans.value.ObservableBooleanValue; -import javafx.event.Event; import javafx.event.EventHandler; import javafx.scene.control.MultipleSelectionModel; import javafx.scene.control.TreeItem; @@ -58,19 +57,19 @@ public class AssetEditorDialog extends BaseAssetEditorDialog createdFileHandler = event -> processEvent((CreatedFileEvent) event); + private final EventHandler createdFileHandler = this::processEvent; /** * The handler selected file events. */ @NotNull - private final EventHandler selectFileHandle = event -> processEvent((RequestSelectFileEvent) event); + private final EventHandler selectFileHandle = this::processEvent; /** * The handler deleted file events, */ @NotNull - private final EventHandler deletedFileHandler = event -> processEvent((DeletedFileEvent) event); + private final EventHandler deletedFileHandler = this::processEvent; /** * The list of waited files to select. diff --git a/src/main/java/com/ss/editor/ui/dialog/save/SaveAsEditorDialog.java b/src/main/java/com/ss/editor/ui/dialog/save/SaveAsEditorDialog.java index b22e7a28..2431bdc4 100644 --- a/src/main/java/com/ss/editor/ui/dialog/save/SaveAsEditorDialog.java +++ b/src/main/java/com/ss/editor/ui/dialog/save/SaveAsEditorDialog.java @@ -18,12 +18,11 @@ import com.ss.editor.ui.event.impl.CreatedFileEvent; import com.ss.editor.ui.event.impl.DeletedFileEvent; import com.ss.editor.ui.event.impl.RequestSelectFileEvent; -import com.ss.rlib.fx.util.FXUtils; import com.ss.rlib.common.util.FileUtils; import com.ss.rlib.common.util.StringUtils; import com.ss.rlib.common.util.array.Array; import com.ss.rlib.common.util.array.ArrayFactory; -import javafx.event.Event; +import com.ss.rlib.fx.util.FXUtils; import javafx.event.EventHandler; import javafx.scene.control.Button; import javafx.scene.control.Label; @@ -62,13 +61,13 @@ public class SaveAsEditorDialog extends AbstractSimpleEditorDialog { protected static final FxEventManager FX_EVENT_MANAGER = FxEventManager.getInstance(); @NotNull - private final EventHandler createdFileHandler = event -> processEvent((CreatedFileEvent) event); + private final EventHandler createdFileHandler = this::processEvent; @NotNull - private final EventHandler selectFileHandle = event -> processEvent((RequestSelectFileEvent) event); + private final EventHandler selectFileHandle = this::processEvent; @NotNull - private final EventHandler deletedFileHandler = event -> processEvent((DeletedFileEvent) event); + private final EventHandler deletedFileHandler = this::processEvent; /** * The list of waited files to select. diff --git a/src/main/java/com/ss/editor/ui/event/FxEventManager.java b/src/main/java/com/ss/editor/ui/event/FxEventManager.java index da231af9..e9b73ef1 100644 --- a/src/main/java/com/ss/editor/ui/event/FxEventManager.java +++ b/src/main/java/com/ss/editor/ui/event/FxEventManager.java @@ -4,6 +4,7 @@ import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; import com.ss.editor.manager.ExecutorManager; +import com.ss.rlib.common.util.ClassUtils; import com.ss.rlib.common.util.array.Array; import com.ss.rlib.common.util.dictionary.DictionaryFactory; import com.ss.rlib.common.util.dictionary.ObjectDictionary; @@ -32,7 +33,7 @@ public class FxEventManager { * The table of event handlers. */ @NotNull - private final ObjectDictionary, Array>> eventHandlers; + private final ObjectDictionary, Array>> eventHandlers; public FxEventManager() { this.eventHandlers = DictionaryFactory.newObjectDictionary(); @@ -45,8 +46,10 @@ public FxEventManager() { * @param eventHandler the event handler. */ @FxThread - public void addEventHandler(@NotNull final EventType eventType, - @NotNull final EventHandler eventHandler) { + public void addEventHandler( + @NotNull EventType eventType, + @NotNull EventHandler eventHandler + ) { getEventHandlers().get(eventType, () -> newArray(EventHandler.class)) .add(eventHandler); } @@ -58,20 +61,21 @@ public void addEventHandler(@NotNull final EventType eventType, * @param eventHandler the event handler. */ @FxThread - public void removeEventHandler(@NotNull final EventType eventType, - @NotNull final EventHandler eventHandler) { - - final Array> handlers = getEventHandlers().get(eventType); - if (handlers != null) { - handlers.slowRemove(eventHandler); - } + public void removeEventHandler( + @NotNull EventType eventType, + @NotNull EventHandler eventHandler + ) { + getEventHandlers().getOptional(eventType) + .ifPresent(handlers -> handlers.slowRemove(eventHandler)); } /** + * Get the table of event handlers. + * * @return the table of event handlers. */ @FxThread - private @NotNull ObjectDictionary, Array>> getEventHandlers() { + private @NotNull ObjectDictionary, Array>> getEventHandlers() { return eventHandlers; } @@ -81,11 +85,11 @@ public void removeEventHandler(@NotNull final EventType eventTy * @param event the new event. */ @FromAnyThread - public void notify(@NotNull final Event event) { + public void notify(@NotNull Event event) { if (Platform.isFxApplicationThread()) { notifyImpl(event); } else { - final ExecutorManager executorManager = ExecutorManager.getInstance(); + var executorManager = ExecutorManager.getInstance(); executorManager.addFxTask(() -> notifyImpl(event)); } } @@ -94,22 +98,23 @@ public void notify(@NotNull final Event event) { * The process of handling a new event. */ @FxThread - private void notifyImpl(@NotNull final Event event) { + private void notifyImpl(@NotNull Event event) { - final ObjectDictionary, Array>> eventHandlers = getEventHandlers(); + var eventHandlers = getEventHandlers(); for (EventType eventType = event.getEventType(); eventType != null; eventType = eventType.getSuperType()) { - final Array> handlers = eventHandlers.get(eventType); + var handlers = eventHandlers.get(eventType); if (handlers == null || handlers.isEmpty()) { continue; } - handlers.forEach(event, EventHandler::handle); + handlers.forEach(event, (handler, toHandle) -> + handler.handle(ClassUtils.unsafeCast(event))); } if (event instanceof ConsumableEvent && !event.isConsumed()) { - final ExecutorManager executorManager = ExecutorManager.getInstance(); + var executorManager = ExecutorManager.getInstance(); executorManager.addFxTask(() -> notifyImpl(event)); } } diff --git a/src/main/java/com/ss/editor/ui/event/impl/AssetComponentLoadedEvent.java b/src/main/java/com/ss/editor/ui/event/impl/AssetComponentLoadedEvent.java index fb55acb9..1642f483 100644 --- a/src/main/java/com/ss/editor/ui/event/impl/AssetComponentLoadedEvent.java +++ b/src/main/java/com/ss/editor/ui/event/impl/AssetComponentLoadedEvent.java @@ -15,11 +15,7 @@ */ public class AssetComponentLoadedEvent extends SceneEvent { - /** - * The constant EVENT_TYPE. - */ - @NotNull - public static final EventType EVENT_TYPE; + public static final EventType EVENT_TYPE; static { synchronized (Event.class) { @@ -29,7 +25,7 @@ public class AssetComponentLoadedEvent extends SceneEvent { private static final String ASSET = "asset"; - public AssetComponentLoadedEvent(@NotNull final Path assetFolder) { + public AssetComponentLoadedEvent(@NotNull Path assetFolder) { super(EVENT_TYPE); setAssetFolder(assetFolder); } @@ -48,7 +44,7 @@ public AssetComponentLoadedEvent(@NotNull final Path assetFolder) { * * @param assetFolder the asset folder. */ - public void setAssetFolder(@NotNull final Path assetFolder) { + public void setAssetFolder(@NotNull Path assetFolder) { set(ASSET, assetFolder); } } diff --git a/src/main/java/com/ss/editor/ui/event/impl/CreatedFileEvent.java b/src/main/java/com/ss/editor/ui/event/impl/CreatedFileEvent.java index 4b0e6d53..e3f8eebe 100644 --- a/src/main/java/com/ss/editor/ui/event/impl/CreatedFileEvent.java +++ b/src/main/java/com/ss/editor/ui/event/impl/CreatedFileEvent.java @@ -15,11 +15,7 @@ */ public class CreatedFileEvent extends SceneEvent { - /** - * The constant EVENT_TYPE. - */ - @NotNull - public static final EventType EVENT_TYPE; + public static final EventType EVENT_TYPE; static { synchronized (Event.class) { @@ -36,7 +32,7 @@ public CreatedFileEvent() { } /** - * Set the need select. + * Set true if need to select a file. * * @param needSelect true if need to select a file. */ @@ -45,7 +41,7 @@ public void setNeedSelect(final boolean needSelect) { } /** - * Is need select boolean. + * Return true if need to select a file. * * @return true if need to select a file. */ @@ -54,16 +50,16 @@ public boolean isNeedSelect() { } /** - * Is directory boolean. + * Return true if it is a directory. * - * @return true if the file is directory. + * @return true if it is a directory. */ public boolean isDirectory() { return get(IS_DIRECTORY) == Boolean.TRUE; } /** - * Gets file. + * Get the new file. * * @return the new file. */ @@ -72,20 +68,20 @@ public boolean isDirectory() { } /** - * Sets file. + * Set the new file. * * @param file the new file. */ - public void setFile(@NotNull final Path file) { + public void setFile(@NotNull Path file) { set(FILE, file); } /** - * Sets directory. + * Set true if it is a directory. * - * @param directory the directory. + * @param directory true if it is a directory. */ - public void setDirectory(final boolean directory) { + public void setDirectory(boolean directory) { set(IS_DIRECTORY, directory); } } diff --git a/src/main/java/com/ss/editor/ui/event/impl/DeletedFileEvent.java b/src/main/java/com/ss/editor/ui/event/impl/DeletedFileEvent.java index e04e6459..9a3cf41b 100644 --- a/src/main/java/com/ss/editor/ui/event/impl/DeletedFileEvent.java +++ b/src/main/java/com/ss/editor/ui/event/impl/DeletedFileEvent.java @@ -15,11 +15,7 @@ */ public class DeletedFileEvent extends SceneEvent { - /** - * The constant EVENT_TYPE. - */ - @NotNull - public static final EventType EVENT_TYPE; + public static final EventType EVENT_TYPE; static { synchronized (Event.class) { @@ -30,9 +26,6 @@ public class DeletedFileEvent extends SceneEvent { private static final String FILE = "file"; private static final String IS_DIRECTORY = "is_directory"; - /** - * Instantiates a new Deleted file event. - */ public DeletedFileEvent() { super(EVENT_TYPE); } @@ -47,7 +40,7 @@ public DeletedFileEvent() { } /** - * Is directory boolean. + * Return true if the file is directory. * * @return true if the file is directory. */ @@ -60,16 +53,16 @@ public boolean isDirectory() { * * @param file the file. */ - public void setFile(@NotNull final Path file) { + public void setFile(@NotNull Path file) { set(FILE, file); } /** - * Set the directory. + * Return true if it is a directory. * - * @param directory the directory. + * @param directory true if it is a directory. */ - public void setDirectory(final boolean directory) { + public void setDirectory(boolean directory) { set(IS_DIRECTORY, directory); } } diff --git a/src/main/java/com/ss/editor/ui/event/impl/FileChangedEvent.java b/src/main/java/com/ss/editor/ui/event/impl/FileChangedEvent.java index 83b88611..21c01762 100644 --- a/src/main/java/com/ss/editor/ui/event/impl/FileChangedEvent.java +++ b/src/main/java/com/ss/editor/ui/event/impl/FileChangedEvent.java @@ -15,11 +15,7 @@ */ public class FileChangedEvent extends SceneEvent { - /** - * The constant EVENT_TYPE. - */ - @NotNull - public static final EventType EVENT_TYPE; + public static final EventType EVENT_TYPE; static { synchronized (Event.class) { @@ -47,7 +43,7 @@ public FileChangedEvent() { * * @param file the file. */ - public void setFile(@NotNull final Path file) { + public void setFile(@NotNull Path file) { set(FILE, file); } } diff --git a/src/main/java/com/ss/editor/ui/event/impl/RequestSelectFileEvent.java b/src/main/java/com/ss/editor/ui/event/impl/RequestSelectFileEvent.java index 57274e06..e10d0334 100644 --- a/src/main/java/com/ss/editor/ui/event/impl/RequestSelectFileEvent.java +++ b/src/main/java/com/ss/editor/ui/event/impl/RequestSelectFileEvent.java @@ -14,10 +14,7 @@ */ public class RequestSelectFileEvent extends SceneEvent { - /** - * The constant EVENT_TYPE. - */ - public static final EventType EVENT_TYPE; + public static final EventType EVENT_TYPE; static { synchronized (EventType.class) { @@ -45,7 +42,7 @@ public RequestSelectFileEvent() { * * @param file the file. */ - public void setFile(@NotNull final Path file) { + public void setFile(@NotNull Path file) { set(FILE, file); } } diff --git a/src/test/java/com/ss/editor/test/external/TreeViewTest.java b/src/test/java/com/ss/editor/test/external/TreeViewTest.java index 48786d7e..eb0a5c4b 100644 --- a/src/test/java/com/ss/editor/test/external/TreeViewTest.java +++ b/src/test/java/com/ss/editor/test/external/TreeViewTest.java @@ -1,4 +1,210 @@ package com.ss.editor.test.external; -public class TreeViewTest { +import javafx.application.Application; +import javafx.beans.property.SimpleStringProperty; +import javafx.scene.Scene; +import javafx.scene.control.*; +import javafx.scene.input.KeyCode; +import javafx.scene.layout.VBox; +import javafx.scene.paint.Color; +import javafx.stage.Stage; + +import java.util.Arrays; +import java.util.List; + +public class TreeViewTest extends Application { + + List employees = Arrays.asList( + new Employee("Ethan Williams", "Sales Department", "Ethan Williams", "Sales Department"), + new Employee("Emma Jones", "Sales Department", "Emma Jones", "Sales Department"), + new Employee("Michael Brown", "Sales Department", "Michael Brown", "Sales Department"), + new Employee("Anna Black", "Sales Department", "Anna Black", "Sales Department"), + new Employee("Rodger York", "Sales Department", "Rodger York", "Sales Department"), + new Employee("Susan Collins", "Sales Department", "Susan Collins", "Sales Department"), + new Employee("Mike Graham", "IT Support", "Mike Graham", "IT Support"), + new Employee("Judy Mayer", "IT Support", "Judy Mayer", "IT Support"), + new Employee("Gregory Smith", "IT Support", "Gregory Smith", "IT Support"), + new Employee("Jacob Smith", "Accounts Department", "Jacob Smith", "Accounts Department"), + new Employee("Isabella Johnson", "Accounts Departmentllzzz", "Isabella Johnson", "Accounts Departmentllzzz"), + new Employee("Isabella Johnson", "Accounts Departmentllzzz", "Isabella Johnson", "Accounts Departmentllzzz"), + new Employee("Isabella Johnson", "Accounts Departmentllzzz", "Isabella Johnson", "Accounts Departmentllzzz")); + + TreeItem rootNode = new TreeItem<>("MyCompany Human Resources"); + + public static void main(String[] args) { + Application.launch(args); + } + + @Override + public void start(Stage stage) { + stage.setTitle("Tree View Sample"); + stage.setWidth(1024); + stage.setHeight(768); + + rootNode.setExpanded(true); + + for (Employee employee : employees) { + + TreeItem empLeaf = new TreeItem<>(employee.getName()); + + boolean found = false; + + for (TreeItem depNode : rootNode.getChildren()) { + if (depNode.getValue().contentEquals(employee.getDepartment())) { + depNode.getChildren().add(empLeaf); + found = true; + break; + } + } + + if (!found) { + TreeItem depNode = new TreeItem<>(employee.getDepartment()); + rootNode.getChildren().add(depNode); + depNode.getChildren().add(empLeaf); + } + } + + TreeView treeView = new TreeView<>(rootNode); + treeView.setShowRoot(true); + treeView.setEditable(false); + treeView.setCellFactory(p -> new TextFieldTreeCellImpl()); + + VBox emptyBox = new VBox(); + emptyBox.prefWidthProperty().bind(stage.widthProperty().multiply(0.5)); + + SplitPane splitPane = new SplitPane(); + splitPane.getItems() + .addAll(treeView, emptyBox); + + Scene scene = new Scene(splitPane, 400, 300); + scene.setFill(Color.LIGHTGRAY); + + stage.setScene(scene); + stage.show(); + } + + private final class TextFieldTreeCellImpl extends TreeCell { + + private TextField textField; + private ContextMenu addMenu = new ContextMenu(); + + public TextFieldTreeCellImpl() { + MenuItem addMenuItem = new MenuItem("Add Employee"); + addMenu.getItems().add(addMenuItem); + addMenuItem.setOnAction(t -> { + TreeItem newEmployee = new TreeItem<>("New Employee"); + getTreeItem().getChildren().add(newEmployee); + }); + } + + @Override + public void startEdit() { + super.startEdit(); + + if (textField == null) { + createTextField(); + } + setText(null); + setGraphic(textField); + textField.selectAll(); + } + + @Override + public void cancelEdit() { + super.cancelEdit(); + + setText(getItem()); + setGraphic(getTreeItem().getGraphic()); + } + + @Override + public void updateItem(String item, boolean empty) { + super.updateItem(item, empty); + + if (empty) { + setText(null); + setGraphic(null); + } else { + if (isEditing()) { + if (textField != null) { + textField.setText(getString()); + } + setText(null); + setGraphic(textField); + } else { + setText(getString()); + setGraphic(getTreeItem().getGraphic()); + if (!getTreeItem().isLeaf() && getTreeItem().getParent() != null) { + setContextMenu(addMenu); + } + } + } + } + + private void createTextField() { + textField = new TextField(getString()); + textField.setOnKeyReleased(t -> { + if (t.getCode() == KeyCode.ENTER) { + commitEdit(textField.getText()); + } else if (t.getCode() == KeyCode.ESCAPE) { + cancelEdit(); + } + }); + + } + + private String getString() { + return getItem() == null ? "" : getItem().toString(); + } + } + + public static class Employee { + + private final SimpleStringProperty name; + private final SimpleStringProperty department; + private final SimpleStringProperty test; + private final SimpleStringProperty testtwo; + + + private Employee(String name, String department, String test, String testtwo) { + this.name = new SimpleStringProperty(name); + this.department = new SimpleStringProperty(department); + this.test = new SimpleStringProperty(test); + this.testtwo = new SimpleStringProperty(testtwo); + } + + public String getName() { + return name.get(); + } + + public void setName(String fName) { + name.set(fName); + } + + public String getDepartment() { + return department.get(); + } + + public void setDepartment(String fName) { + department.set(fName); + } + + + public String getTest() { + return test.get(); + } + + public void setTest(String testd) { + test.set(testd); + } + + + public String getTesttwo() { + return testtwo.get(); + } + + public void setTesttwo(String fNdme) { + testtwo.set(fNdme); + } + } } From df360a7c3e2ae4bb94ca1949d67ec238edfdffcc Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Fri, 18 May 2018 06:53:39 +0300 Subject: [PATCH 42/49] added temprorary fix for resource tree. --- src/main/java/com/ss/editor/JfxApplication.java | 2 +- .../ui/component/asset/tree/ResourceTree.java | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/ss/editor/JfxApplication.java b/src/main/java/com/ss/editor/JfxApplication.java index ddda1888..ed57a858 100644 --- a/src/main/java/com/ss/editor/JfxApplication.java +++ b/src/main/java/com/ss/editor/JfxApplication.java @@ -107,7 +107,7 @@ public static void main(@NotNull String[] args) { // JavaFX System.setProperty("prism.lcdtext", "false"); - System.setProperty("prism.text", "t2k"); + //System.setProperty("prism.text", "t2k"); var editorConfig = EditorConfig.getInstance(); var openGLVersion = editorConfig.getEnum(PREF_OPEN_GL, PREF_DEFAULT_OPEN_GL); diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java b/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java index 81690b29..ba85e38d 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java @@ -13,12 +13,14 @@ import com.ss.editor.ui.component.asset.tree.context.menu.action.*; import com.ss.editor.ui.component.asset.tree.resource.*; import com.ss.editor.ui.util.UiUtils; +import com.ss.editor.util.EditorUtil; import com.ss.rlib.common.function.IntObjectConsumer; import com.ss.rlib.common.util.StringUtils; import com.ss.rlib.common.util.array.Array; import com.ss.rlib.common.util.array.ArrayComparator; import com.ss.rlib.common.util.array.ArrayFactory; import com.ss.rlib.common.util.array.ConcurrentArray; +import javafx.application.Platform; import javafx.collections.FXCollections; import javafx.event.EventHandler; import javafx.scene.control.ContextMenu; @@ -264,6 +266,18 @@ private void processChangedExpands(@NotNull TreeModificationEvent event) { getExpandHandler().ifPresent(handler -> handler.accept(getExpandedItemCount(), this)); + + repaint(); + } + + private void repaint() { + + //FIXME temp fix how to refresh + var stage = EditorUtil.getFxStage(); + var old = stage.getWidth(); + stage.setWidth(old + 1); + + Platform.runLater(() -> stage.setWidth(old)); } /** @@ -653,6 +667,8 @@ private void applyNewRoot(@NotNull TreeItem newRoot) { if (onLoadHandler != null) { onLoadHandler.accept(Boolean.TRUE); } + + repaint(); } /** From cbd9fa1d557d667597f4effa83cd545c8f7c1e96 Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Fri, 18 May 2018 09:59:46 +0300 Subject: [PATCH 43/49] small change. --- .../com/ss/editor/ui/component/asset/tree/ResourceTree.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java b/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java index ba85e38d..d5f5380d 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java @@ -275,7 +275,7 @@ private void repaint() { //FIXME temp fix how to refresh var stage = EditorUtil.getFxStage(); var old = stage.getWidth(); - stage.setWidth(old + 1); + stage.setWidth(old + 3); Platform.runLater(() -> stage.setWidth(old)); } From d5725c2595f20f1e5bff78ef4e2c9f4899b942c8 Mon Sep 17 00:00:00 2001 From: Yan <115050813@qq.com> Date: Sun, 20 May 2018 16:45:42 +0800 Subject: [PATCH 44/49] Update messages_zh_CN.properties --- .../messages/messages_zh_CN.properties | 1334 ++++++++--------- 1 file changed, 667 insertions(+), 667 deletions(-) diff --git a/src/main/resources/messages/messages_zh_CN.properties b/src/main/resources/messages/messages_zh_CN.properties index cd5c2373..a764eb61 100644 --- a/src/main/resources/messages/messages_zh_CN.properties +++ b/src/main/resources/messages/messages_zh_CN.properties @@ -1,682 +1,682 @@ -#Updated 2017-11-11 01:28 am +#Updated 2018-05-20 16:19 pm #By yan (115050813@qq.com) -EditorMenuFile=\u6587\u4ef6 -EditorMenuFileOpenAsset=\u6253\u5f00\u8d44\u6e90\u76ee\u5f55 -EditorMenuFileOpenAssetDirectoryChooser=\u9009\u62e9\u8d44\u6e90 -EditorMenuFileReopenAssetFolder=\u91cd\u65b0\u6253\u5f00\u76ee\u5f55 -EditorMenuFileExit=\u9000\u51fa -EditorMenuOther=\u5176\u4ed6 -EditorMenuOtherSettings=\u8bbe\u7f6e -EditorMenuOtherPlugins=\u63d2\u4ef6 -EditorMenuOtherClearAssetCache=\u6e05\u7a7a\u8d44\u6e90\u7f13\u5b58 -EditorMenuOtherUpdateClasspathAndAssetCache=\u66f4\u65b0Classpath -EditorMenuHelp=\u5e2e\u52a9 -EditorMenuHelpAbout=\u5173\u4e8e - -EditorToolAsset=\u8d44\u6e90 - -EditorAreaSaveFileQuestion=\u6587\u4ef6 "%file_name%" \u4fee\u6539\u540e\u5c1a\u672a\u4fdd\u5b58, \u662f\u5426\u9700\u8981\u4fdd\u5b58? - -AssetComponentResourceTreeContextMenuNewFile=\u65b0\u5efa -AssetComponentResourceTreeContextMenuOpenFile=\u6253\u5f00 -AssetComponentResourceTreeContextMenuOpenWithFile=\u6253\u5f00\u65b9\u5f0f -AssetComponentResourceTreeContextMenuCopyFile=\u590d\u5236 -AssetComponentResourceTreeContextMenuCutFile=\u526a\u5207 -AssetComponentResourceTreeContextMenuPasteFile=\u7c98\u8d34 +EditorMenuFile=\u6587\u4EF6 +EditorMenuFileOpenAsset=\u6253\u5F00\u8D44\u6E90\u76EE\u5F55 +EditorMenuFileOpenAssetDirectoryChooser=\u9009\u62E9\u8D44\u6E90 +EditorMenuFileReopenAssetFolder=\u91CD\u65B0\u6253\u5F00\u76EE\u5F55 +EditorMenuFileExit=\u9000\u51FA +EditorMenuOther=\u5176\u4ED6 +EditorMenuOtherSettings=\u8BBE\u7F6E +EditorMenuOtherPlugins=\u63D2\u4EF6 +EditorMenuOtherClearAssetCache=\u6E05\u7A7A\u8D44\u6E90\u7F13\u5B58 +EditorMenuOtherUpdateClasspathAndAssetCache=\u66F4\u65B0Classpath +EditorMenuHelp=\u5E2E\u52A9 +EditorMenuHelpAbout=\u5173\u4E8E + +EditorToolAsset=\u8D44\u6E90 + +EditorAreaSaveFileQuestion=\u6587\u4EF6 "%file_name%" \u4FEE\u6539\u540E\u5C1A\u672A\u4FDD\u5B58, \u662F\u5426\u9700\u8981\u4FDD\u5B58? + +AssetComponentResourceTreeContextMenuNewFile=\u65B0\u5EFA +AssetComponentResourceTreeContextMenuOpenFile=\u6253\u5F00 +AssetComponentResourceTreeContextMenuOpenWithFile=\u6253\u5F00\u65B9\u5F0F +AssetComponentResourceTreeContextMenuCopyFile=\u590D\u5236 +AssetComponentResourceTreeContextMenuCutFile=\u526A\u5207 +AssetComponentResourceTreeContextMenuPasteFile=\u7C98\u8D34 AssetComponentResourceTreeContextMenuDeleteFile=\u5220\u9664 -AssetComponentResourceTreeContextMenuDeleteFileQuestion=\u662f\u5426\u6253\u7b97\u5220\u9664 "%file_name%"? -AssetComponentResourceTreeContextMenuDeleteFilesQuestion=\u662f\u5426\u6253\u7b97\u5220\u9664 %file_count% \u4e2a\u6587\u4ef6? -AssetComponentResourceTreeContextMenuConvertFile=\u8f6c\u6362 -AssetComponentResourceTreeContextMenuOpenFileByExternalEditor=\u7528\u5176\u4ed6\u65b9\u5f0f\u6253\u5f00 -AssetComponentResourceTreeContextMenuOpenFileBySystemExplorer=\u6253\u5f00\u6240\u5728\u6587\u4ef6\u5939 -AssetComponentResourceTreeContextMenuRenameFile=\u91cd\u547d\u540d -AssetComponentResourceTreeContextMenuImportModel=\u5bfc\u5165\u6a21\u578b - -FileEditorActionSave=\u4fdd\u5b58 - -SceneFileEditorActionSelection=\u663e\u793a/\u9690\u85cf \u9009\u62e9\u9879 -SceneFileEditorActionGrid=\u663e\u793a/\u9690\u85cf \u7f51\u683c -SceneFileEditorActionStatistics=\u663e\u793a/\u9690\u85cf \u6e32\u67d3\u72b6\u6001 -SceneFileEditorActionMoveTool=\u4f7f\u7528\u64cd\u7eb5\u5668\u63a7\u5236:\u79fb\u52a8 -SceneFileEditorActionScaleTool=\u4f7f\u7528\u64cd\u7eb5\u5668\u63a7\u5236:\u7f29\u653e -SceneFileEditorActionRotationTool=\u4f7f\u7528\u64cd\u7eb5\u5668\u63a7\u5236:\u65cb\u8f6c -SceneFileEditorActionCameraLight=\u6253\u5f00/\u5173\u95ed \u6444\u50cf\u673a\u706f\u5149 -SceneFileEditorActionPhysics=\u6fc0\u6d3b/\u7981\u7528 Bullet\u7269\u7406\u5f15\u64ce -SceneFileEditorActionDebugPhysics=\u663e\u793a/\u9690\u85cf Bullet\u8c03\u8bd5\u7f51\u683c -SceneFileEditorActionShowLights=\u663e\u793a/\u9690\u85cf \u573a\u666f\u4e2d\u7684\u706f\u5149\u6807\u8bc6 -SceneFileEditorActionShowAudio=\u663e\u793a/\u9690\u85cf\u3000\u573a\u666f\u4e2d\u7684\u97f3\u6548\u8282\u70b9 - -MaterialFileEditorActionCube=\u663e\u793a\u4e3a\u65b9\u5757 -MaterialFileEditorActionSphere=\u663e\u793a\u4e3a\u7403\u4f53 -MaterialFileEditorActionPlane=\u663e\u793a\u4e3a\u5e73\u9762 -MaterialFileEditorActionLight=\u5f00\u542f/\u5173\u95ed\u706f\u5149 - -TextFileEditorName=\u6587\u672c\u7f16\u8f91\u5668 -MaterialFileEditorName=\u6750\u8d28\u7f16\u8f91\u5668 - -AssetEditorDialogTitle=\u8bf7\u9009\u62e9\u8d44\u6e90 -AssetEditorDialogWarningSelectFile=\u8bf7\u9009\u62e9\u6587\u4ef6\uff0c\u800c\u4e0d\u662f\u6587\u4ef6\u5939\u3002 - -SaveAsEditorDialogTitle=\u53e6\u5b58\u4e3a\u6587\u4ef6 -SaveAsEditorDialogFieldFilename=\u6587\u4ef6\u540d - -ParticlesAssetEditorDialogTextureParamLabel=\u7eb9\u7406\u53c2\u6570\u540d -ParticlesAssetEditorDialogTextureLightingTransformLabel=\u662f\u5426\u4f7f\u7528Lighting\u7740\u8272\u5668 - -MaterialFileEditorMaterialTypeLabel=\u6750\u8d28\u7c7b\u578b -MaterialFileEditorBucketTypeLabel=Queue Bucket +AssetComponentResourceTreeContextMenuDeleteFileQuestion=\u662F\u5426\u6253\u7B97\u5220\u9664 "%file_name%"? +AssetComponentResourceTreeContextMenuDeleteFilesQuestion=\u662F\u5426\u6253\u7B97\u5220\u9664 %file_count% \u4E2A\u6587\u4EF6? +AssetComponentResourceTreeContextMenuConvertFile=\u8F6C\u6362 +AssetComponentResourceTreeContextMenuOpenFileByExternalEditor=\u7528\u5176\u4ED6\u65B9\u5F0F\u6253\u5F00 +AssetComponentResourceTreeContextMenuOpenFileBySystemExplorer=\u6253\u5F00\u6240\u5728\u6587\u4EF6\u5939 +AssetComponentResourceTreeContextMenuRenameFile=\u91CD\u547D\u540D +AssetComponentResourceTreeContextMenuImportModel=\u5BFC\u5165\u6A21\u578B + +FileEditorActionSave=\u4FDD\u5B58 + +SceneFileEditorActionSelection=\u663E\u793A/\u9690\u85CF \u9009\u62E9\u9879 +SceneFileEditorActionGrid=\u663E\u793A/\u9690\u85CF \u7F51\u683C +SceneFileEditorActionStatistics=\u663E\u793A/\u9690\u85CF \u6E32\u67D3\u72B6\u6001 +SceneFileEditorActionMoveTool=\u4F7F\u7528\u64CD\u7EB5\u5668\u63A7\u5236:\u79FB\u52A8 +SceneFileEditorActionScaleTool=\u4F7F\u7528\u64CD\u7EB5\u5668\u63A7\u5236:\u7F29\u653E +SceneFileEditorActionRotationTool=\u4F7F\u7528\u64CD\u7EB5\u5668\u63A7\u5236:\u65CB\u8F6C +SceneFileEditorActionCameraLight=\u6253\u5F00/\u5173\u95ED \u6444\u50CF\u673A\u706F\u5149 +SceneFileEditorActionPhysics=\u6FC0\u6D3B/\u7981\u7528 Bullet\u7269\u7406\u5F15\u64CE +SceneFileEditorActionDebugPhysics=\u663E\u793A/\u9690\u85CF Bullet\u8C03\u8BD5\u7F51\u683C +SceneFileEditorActionShowLights=\u663E\u793A/\u9690\u85CF \u573A\u666F\u4E2D\u7684\u706F\u5149\u6807\u8BC6 +SceneFileEditorActionShowAudio=\u663E\u793A/\u9690\u85CF\u3000\u573A\u666F\u4E2D\u7684\u97F3\u6548\u8282\u70B9 + +MaterialFileEditorActionCube=\u663E\u793A\u4E3A\u65B9\u5757 +MaterialFileEditorActionSphere=\u663E\u793A\u4E3A\u7403\u4F53 +MaterialFileEditorActionPlane=\u663E\u793A\u4E3A\u5E73\u9762 +MaterialFileEditorActionLight=\u5F00\u542F/\u5173\u95ED\u706F\u5149 + +TextFileEditorName=\u6587\u672C\u7F16\u8F91\u5668 +MaterialFileEditorName=\u6750\u8D28\u7F16\u8F91\u5668 + +AssetEditorDialogTitle=\u8BF7\u9009\u62E9\u8D44\u6E90 +AssetEditorDialogWarningSelectFile=\u8BF7\u9009\u62E9\u6587\u4EF6\uFF0C\u800C\u4E0D\u662F\u6587\u4EF6\u5939\u3002 + +SaveAsEditorDialogTitle=\u53E6\u5B58\u4E3A\u6587\u4EF6 +SaveAsEditorDialogFieldFilename=\u6587\u4EF6\u540D + +ParticlesAssetEditorDialogTextureParamLabel=\u7EB9\u7406\u53C2\u6570\u540D +ParticlesAssetEditorDialogTextureLightingTransformLabel=\u662F\u5426\u4F7F\u7528Lighting\u7740\u8272\u5668 + +MaterialFileEditorMaterialTypeLabel=\u6750\u8D28\u7C7B\u578B +MaterialFileEditorBucketTypeLabel=\u6E32\u67D3\u961F\u5217 Texture2DMaterialParamControlRepeat=Repeat -Texture2DMaterialParamControlFlip=Flip -Texture2DMaterialParamControlAdd=\u6dfb\u52a0\u7eb9\u7406 -Texture2DMaterialParamControlRemove=\u79fb\u9664\u7eb9\u7406 - -ColorMaterialParamControlRemove=\u79fb\u9664\u989c\u8272 - -MaterialSettingsMain=\u8bbe\u7f6e -MaterialSettingsTextures=\u7eb9\u7406 -MaterialSettingsColors=\u989c\u8272 -MaterialSettingsRender=\u6e32\u67d3\u5668 -MaterialSettingsOther=\u5176\u4ed6 -MaterialRenderStateFaceCullMode=\u9762\u5254\u9664\u6a21\u5f0f(FaceCullMode) -MaterialRenderStateBlendMode=\u6df7\u5408\u6a21\u5f0f(BlendMode) -MaterialRenderStateBlendEquation=Blend equation -MaterialRenderStateBlendEquationAlpha=Blend equation alpha -MaterialRenderStatePolyOffsetFactor=Polygon offset factor -MaterialRenderStatePolyOffsetUnits=Polygon offset units -MaterialRenderStateDepthWrite=\u5199\u5165\u6df1\u5ea6\u7f13\u51b2 -MaterialRenderStateColorWrite=\u5199\u5165\u989c\u8272\u7f13\u51b2 -MaterialRenderStateDepthTest=\u5f00\u542f\u6df1\u5ea6\u68c0\u6d4b -MaterialRenderStateWireframe=\u7ebf\u6846\u6a21\u5f0f - -FileCreatorFileNameLabel=\u6587\u4ef6\u540d - -MaterialFileCreatorTitle=\u521b\u5efa\u6750\u8d28(j3m) -MaterialFileCreatorMaterialTypeLabel=\u6750\u8d28\u7c7b\u578b -MaterialFileCreatorFileDescription=\u65b0\u5efa\u6750\u8d28\u6587\u4ef6(j3m) -MaterialDefinitionFileCreatorFileDescription=\u521b\u5efa\u6750\u8d28\u5b9a\u4e49(j3md) -MaterialDefinitionFileCreatorTitle=\u65b0\u5efa\u6750\u8d28\u5b9a\u4e49\u6587\u4ef6(j3md) -MaterialDefinitionFileCreatorGlslLabel=GLSL\u7248\u672c - -SingleColorTextureFileCreatorTitle=\u521b\u5efa\u5355\u8272\u7eb9\u7406 -SingleColorTextureFileCreatorWidth=\u5bbd\u5ea6 -SingleColorTextureFileCreatorHeight=\u9ad8\u5ea6 -SingleColorTextureFileCreatorColor=\u989c\u8272 -SingleColorTextureFileCreatorDescription=\u65b0\u5efa\u5355\u8272\u7eb9\u7406\u8d34\u56fe - -SettingsDialogTitle=\u8bbe\u7f6e -SettingsDialogMessage=\u4fee\u6539\u540e\u9700\u8981\u91cd\u542f\u7a0b\u5e8f\uff0c\u8bbe\u7f6e\u624d\u80fd\u751f\u6548\u3002 -SettingsDialogClassesFolderChooserTitle=\u8bf7\u9009\u62e9class\u6587\u4ef6\u6240\u5728\u7684\u76ee\u5f55 -SettingsDialogLibrariesFolderChooserTitle=\u8bf7\u9009\u62e9.jar\u6587\u4ef6\u6240\u5728\u7684\u76ee\u5f55 -SettingsDialogEnvsFolderChooserTitle=\u8bf7\u9009\u62e9\u73af\u5883\u8d34\u56fe\u6240\u5728\u7684\u76ee\u5f55 - -SettingsPropertyFXAA=\u5f00\u542f FXAA -SettingsPropertyNativeFileChooser=\u4f7f\u7528\u672c\u5730\u6587\u4ef6\u9009\u62e9\u5668 -SettingsPropertyStopRenderOnLostFocus=\u5728\u753b\u9762\u5931\u53bb\u7126\u70b9\u540e\u505c\u6b62\u6e32\u67d3 -SettingsPropertyFrameRate=\u5237\u65b0\u7387 -SettingsPropertyGammaCorrection=\u4f3d\u9a6c\u6821\u6b63 -SettingsPropertyToneMapFilter=\u66dd\u5149\u6ee4\u955c -SettingsPropertyToneMapFilterWhitePoint=\u767d\u5e73\u8861 -SettingsPropertyAnisotropy=\u5404\u5411\u5f02\u6027 -SettingsPropertyAnalytics=Google\u3000Analytics -SettingsPropertyCameraAngle=\u6444\u50cf\u673a\u89d2\u5ea6 -SettingsPropertyTangentGeneration=\u81ea\u52a8\u751f\u6210\u5207\u7ebf -SettingsPropertyFlippedTexture=\u9ed8\u8ba4\u4f7f\u7528\u7ffb\u8f6c\u7eb9\u7406 -SettingsPropertyEditorCameraLamp=\u9ed8\u8ba4\u5f00\u542f\u6444\u50cf\u673a\u706f\u5149 -SettingsPropertyUserLibrariesFolder=User libraries\u76ee\u5f55 -SettingsPropertyUserClassesFolder=User classes\u76ee\u5f55 -SettingsPropertyTheme=\u6837\u5f0f +Texture2DMaterialParamControlFlip=\u5782\u76F4\u7FFB\u8F6C +Texture2DMaterialParamControlAdd=\u6DFB\u52A0\u7EB9\u7406 +Texture2DMaterialParamControlRemove=\u79FB\u9664\u7EB9\u7406 + +ColorMaterialParamControlRemove=\u79FB\u9664\u989C\u8272 + +MaterialSettingsMain=\u8BBE\u7F6E +MaterialSettingsTextures=\u7EB9\u7406 +MaterialSettingsColors=\u989C\u8272 +MaterialSettingsRender=\u6E32\u67D3\u5668 +MaterialSettingsOther=\u5176\u4ED6 +MaterialRenderStateFaceCullMode=\u9762\u5254\u9664\u6A21\u5F0F +MaterialRenderStateBlendMode=\u6DF7\u5408\u6A21\u5F0F +MaterialRenderStateBlendEquation=\u6DF7\u5408\u516C\u5F0F +MaterialRenderStateBlendEquationAlpha=\u900F\u660E\u5EA6\u6DF7\u5408\u516C\u5F0F +MaterialRenderStatePolyOffsetFactor=\u591A\u8FB9\u5F62\u504F\u79FB\u6BD4\u4F8B +MaterialRenderStatePolyOffsetUnits=\u591A\u8FB9\u5F62\u504F\u79FB\u5355\u4F4D +MaterialRenderStateDepthWrite=\u5199\u5165\u6DF1\u5EA6\u7F13\u51B2 +MaterialRenderStateColorWrite=\u5199\u5165\u989C\u8272\u7F13\u51B2 +MaterialRenderStateDepthTest=\u5F00\u542F\u6DF1\u5EA6\u68C0\u6D4B +MaterialRenderStateWireframe=\u7EBF\u6846\u6A21\u5F0F + +FileCreatorFileNameLabel=\u6587\u4EF6\u540D + +MaterialFileCreatorTitle=\u521B\u5EFA\u6750\u8D28(j3m) +MaterialFileCreatorMaterialTypeLabel=\u6750\u8D28\u7C7B\u578B +MaterialFileCreatorFileDescription=\u65B0\u5EFA\u6750\u8D28\u6587\u4EF6(j3m) +MaterialDefinitionFileCreatorFileDescription=\u521B\u5EFA\u6750\u8D28\u5B9A\u4E49(j3md) +MaterialDefinitionFileCreatorTitle=\u65B0\u5EFA\u6750\u8D28\u5B9A\u4E49\u6587\u4EF6(j3md) +MaterialDefinitionFileCreatorGlslLabel=GLSL\u7248\u672C + +SingleColorTextureFileCreatorTitle=\u521B\u5EFA\u5355\u8272\u7EB9\u7406 +SingleColorTextureFileCreatorWidth=\u5BBD\u5EA6 +SingleColorTextureFileCreatorHeight=\u9AD8\u5EA6 +SingleColorTextureFileCreatorColor=\u989C\u8272 +SingleColorTextureFileCreatorDescription=\u65B0\u5EFA\u5355\u8272\u7EB9\u7406\u8D34\u56FE + +SettingsDialogTitle=\u8BBE\u7F6E +SettingsDialogMessage=\u4FEE\u6539\u540E\u9700\u8981\u91CD\u542F\u7A0B\u5E8F\uFF0C\u8BBE\u7F6E\u624D\u80FD\u751F\u6548\u3002 +SettingsDialogClassesFolderChooserTitle=\u8BF7\u9009\u62E9class\u6587\u4EF6\u6240\u5728\u7684\u76EE\u5F55 +SettingsDialogLibrariesFolderChooserTitle=\u8BF7\u9009\u62E9.jar\u6587\u4EF6\u6240\u5728\u7684\u76EE\u5F55 +SettingsDialogEnvsFolderChooserTitle=\u8BF7\u9009\u62E9\u73AF\u5883\u8D34\u56FE\u6240\u5728\u7684\u76EE\u5F55 + +SettingsPropertyFXAA=\u5F00\u542F\u5FEB\u901F\u8FD1\u4F3C\u6297\u952F\u9F7F +SettingsPropertyNativeFileChooser=\u4F7F\u7528\u7CFB\u7EDF\u6587\u4EF6\u9009\u62E9\u5668 +SettingsPropertyStopRenderOnLostFocus=\u5728\u753B\u9762\u5931\u53BB\u7126\u70B9\u540E\u505C\u6B62\u6E32\u67D3 +SettingsPropertyFrameRate=\u5237\u65B0\u7387 +SettingsPropertyGammaCorrection=\u4F3D\u9A6C\u6821\u6B63 +SettingsPropertyToneMapFilter=\u66DD\u5149\u6EE4\u955C +SettingsPropertyToneMapFilterWhitePoint=\u767D\u5E73\u8861 +SettingsPropertyAnisotropy=\u5404\u5411\u5F02\u6027 +SettingsPropertyAnalytics=\u5F00\u542F\u8C37\u6B4C\u5206\u6790\u670D\u52A1 +SettingsPropertyCameraAngle=\u6444\u50CF\u673A\u89D2\u5EA6 +SettingsPropertyTangentGeneration=\u81EA\u52A8\u751F\u6210\u5207\u7EBF +SettingsPropertyFlippedTexture=\u9ED8\u8BA4\u4F7F\u7528\u7FFB\u8F6C\u7EB9\u7406 +SettingsPropertyEditorCameraLamp=\u9ED8\u8BA4\u5F00\u542F\u6444\u50CF\u673A\u706F\u5149 +SettingsPropertyUserLibrariesFolder=User libraries\u76EE\u5F55 +SettingsPropertyUserClassesFolder=User classes\u76EE\u5F55 +SettingsPropertyTheme=\u6837\u5F0F SettingsPropertyOpenGL=OpenGL -SettingsPropertyFastSkyFolder=Fast Sky folder - -SettingsCategoryGraphics=\u56fe\u5f62 -SettingsCategoryOther=\u5176\u4ed6 -SettingsCategoryEditor=Editor - -BlendToJ3oFileConverterDescription=\u5c06 .blend \u8f6c\u6362\u4e3a .j3o -GLTFToJ3oFileConverterDescription=\u5c06 .gltf \u8f6c\u6362\u4e3a .j3o -FBXToJ3oFileConverterDescription=\u5c06 .fbx \u8f6c\u6362\u4e3a .j3o -ObjToJ3oFileConverterDescription=\u5c06 .obj \u8f6c\u6362\u4e3a .j3o -SceneToJ3oFileConverterDescription=\u5c06 .scene \u8f6c\u6362\u4e3a .j3o -MeshXmlToJ3oFileConverterDescription=\u5c06 .mesh.xml \u8f6c\u6362\u4e3a .j3o -XBufToJ3oFileConverterDescription=\u5c06 .xbuf \u8f6c\u6362\u4e3a .j3o - -ModelFileEditorName=\u6a21\u578b\u7f16\u8f91\u5668 -ModelFileEditorNoSky=\u65e0\u5929\u7a7a\u76d2 -ModelFileEditorFastSky=\u5207\u6362\u5929\u7a7a\u76d2 -ModelFileEditorTransformMode=\u7a7a\u95f4\u8f6c\u6362\u6a21\u5f0f -ModelFileEditorNodeMesh=\u7f51\u683c -ModelFileEditorNodeMaterial=\u6750\u8d28 -ModelFileEditorNodeAmbientLight=\u73af\u5883\u5149 -ModelFileEditorNodeDirectionLight=\u5b9a\u5411\u5149 -ModelFileEditorNodePointLight=\u70b9\u5149\u6e90 -ModelFileEditorNodeSpotLight=\u805a\u5149\u706f -ModelFileEditorNodeLightProbe=\u706f\u5149\u63a2\u9488 -ModelFileEditorNodeAnimControl=\u52a8\u753b -ModelFileEditorNodeParticleEmitterInfluencers=\u7c92\u5b50\u53d1\u5c04\u5f71\u54cd\u5668 -ModelFileEditorNodeParticleEmitterInfluencerEmpty=\u65e0\u5f71\u54cd\u5668 -ModelFileEditorNodeParticleEmitterInfluencerDefault=\u9ed8\u8ba4\u5f71\u54cd\u5668 -ModelFileEditorNodeParticleEmitterInfluencerRadial=\u8f90\u5c04\u72b6\u5f71\u54cd\u5668 -ModelFileEditorNodeParticleEmitterShapeBox=\u76d2\u72b6 -ModelFileEditorNodeParticleEmitterShapeSphere=\u7403\u72b6 -ModelFileEditorNodeParticleEmitterShapePoint=\u70b9\u72b6 -ModelFileEditorNodeParticleEmitterShapeMeshVertex=\u7f51\u683c\u9876\u70b9 -ModelFileEditorNodeParticleEmitterShapeMeshFace=\u7f51\u683c\u8868\u9762 -ModelFileEditorNodeParticleEmitterShapeMeshConvexHull=\u7cbe\u786e\u7f51\u683c\u5f62\u72b6 -ModelFileEditorNodeStaticRigidBodyControl=\u9759\u6001\u521a\u4f53 -ModelFileEditorNodeRigidBodyControl=\u521a\u4f53 -ModelFileEditorNodeCharacterControl=\u89d2\u8272 -ModelFileEditorNodeSkeletonControl=\u9aa8\u9abc -ModelFileEditorNodeVehicleControl=\u4ea4\u901a\u5de5\u5177 -ModelFileEditorNodeRagDollControl=\u5e03\u5a03\u5a03 -ModelFileEditorNodeBoxCollisionShape=\u7acb\u65b9\u4f53 BoxCollisionShape -ModelFileEditorNodeCapsuleCollisionShape=\u80f6\u56ca\u4f53 CapsuleCollisionShape -ModelFileEditorNodeChildCollisionShape=\u5b50\u78b0\u649e\u5f62\u72b6 ChildCollisionShape -ModelFileEditorNodeComputedCollisionShape=\u751f\u6210\u7ec4\u5408\u78b0\u649e\u5f62\u72b6 CompoundCollisionShape -ModelFileEditorNodeConeCollisionShape=\u5706\u9525\u4f53 ConeCollisionShape -ModelFileEditorNodeCylinderCollisionShape=\u5706\u67f1\u4f53 CylinderCollisionShape -ModelFileEditorNodeGImpactCollisionShape=\u52a8\u6001\u7cbe\u786e\u7f51\u683c\u5f62\u72b6 GImpactCollisionShape -ModelFileEditorNodeHeightFieldCollisionShape=\u57fa\u4e8e\u9ad8\u5ea6\u5730\u5f62\u7684\u7cbe\u786e\u7f51\u683c\u5f62\u72b6 HeightFieldCollisionShape -ModelFileEditorNodeHullCollisionShape=\u4e0d\u592a\u7cbe\u786e\u7684\u7f51\u683c\u5f62\u72b6 HullCollisionShape -ModelFileEditorNodeMeshCollisionShape=\u7cbe\u786e\u7f51\u683c\u5f62\u72b6 MeshCollisionShape -ModelFileEditorNodePlaneCollisionShape=\u5e73\u9762 PlaneCollisionShape -ModelFileEditorNodeSphereCollisionShape=\u7403\u4f53 SphereCollisionShape -ModelFileEditorNodeWheel=\u8f66\u8f6e -ModelFileEditorNodeMotionControl=\u8fd0\u52a8\u63a7\u5236\u5668 -ModelFileEditorNodeMotionPath=\u8fd0\u52a8\u8def\u5f84 -ModelFileEditorNodeWayPoint=\u8def\u5f84\u70b9 -ModelFileEditorNodeVertexBuffer=\u9876\u70b9\u7f13\u5b58 -ModelFileEditorNodeLightControl=Light control - -SceneFileEditorNodeFilters=Filters -SceneFileEditorNodeAppStates=App states - -SceneFileEditorName=\u573a\u666f\u7f16\u8f91\u5668 -SceneFileEditorToolObjects=\u7269\u4f53 -SceneFileEditorToolPainting=Painting -SceneFileEditorToolScripting=\u811a\u672c -SceneFileEditorToolAppStates=\u72b6\u6001\u673a -SceneFileEditorToolFilters=\u6ee4\u955c -SceneFileEditorToolLayers=\u5c42 - -ModelNodeTreeActionRemove=\u79fb\u9664 -ModelNodeTreeActionRename=\u91cd\u547d\u540d -ModelNodeTreeActionOptimizeGeometry=\u4f18\u5316\u51e0\u4f55\u4f53 -ModelNodeTreeActionTools=\u5de5\u5177 -ModelNodeTreeActionCreate=\u521b\u5efa -ModelNodeTreeActionCreateNode=Node -ModelNodeTreeActionCreateSky=\u5929\u7a7a\u76d2 -ModelNodeTreeActionCreateEditableSky=\u53ef\u7f16\u8f91\u7684\u5929\u7a7a\u76d2 -ModelNodeTreeActionCreatePrimitive=\u57fa\u672c\u5f62\u72b6 -ModelNodeTreeActionCreatePrimitiveBox=\u7acb\u65b9\u4f53 -ModelNodeTreeActionCreatePrimitiveSphere=\u7403\u4f53 -ModelNodeTreeActionCreatePrimitiveQuad=\u56db\u8fb9\u5f62 -ModelNodeTreeActionLoadModel=\u52a0\u8f7d\u6a21\u578b -ModelNodeTreeActionSaveAs=\u53e6\u5b58\u4e3a -ModelNodeTreeActionMakeEmbedded=\u505a\u4e3a\u5185\u5d4c\u6a21\u578b -ModelNodeTreeActionLinkModel=\u94fe\u63a5\u6a21\u578b -ModelNodeTreeActionTangentGenerator=\u751f\u6210\u5207\u7ebf -ModelNodeTreeActionLoDGenerator=\u751f\u6210\u5c42\u6b21\u7ec6\u8282(LOD) -ModelNodeTreeActionLight=\u706f\u5149 -ModelNodeTreeActionAmbientLight=\u73af\u5883\u5149 -ModelNodeTreeActionDirectionLight=\u5b9a\u5411\u5149 -ModelNodeTreeActionPointLight=\u70b9\u5149\u6e90 -ModelNodeTreeActionSpotLight=\u805a\u5149\u706f -ModelNodeTreeActionAnimationPlay=\u64ad\u653e\u52a8\u753b -ModelNodeTreeActionAnimationPlaySettings=\u64ad\u653e\u8bbe\u7f6e -ModelNodeTreeActionAnimationStop=\u505c\u6b62\u52a8\u753b -ModelNodeTreeActionAnimationPause=\u6682\u505c\u52a8\u753b -ModelNodeTreeActionAnimationManualExtractSubAnimation=\u624b\u52a8\u89e3\u538b\u5b50\u52a8\u753b -ModelNodeTreeActionCreateAudioNode=AudioNode -ModelNodeTreeActionAudioPlay=\u64ad\u653e -ModelNodeTreeActionAudioStop=\u505c\u6b62 -ModelNodeTreeActionCopy=Copy -ModelNodeTreeActionPaste=Paste -ModelNodeTreeActionCreateDefaultParticleEmitter=\u9ed8\u8ba4\u7c92\u5b50\u53d1\u751f\u5668 -ModelNodeTreeActionResetParticleEmitters=\u91cd\u7f6e\u7c92\u5b50\u53d1\u751f\u5668 -ModelNodeTreeActionParticleEmitterChangeShape=\u6539\u53d8\u53d1\u751f\u5668\u5f62\u72b6 -ModelNodeTreeActionParticleEmitterBoxShape=\u76d2\u72b6 -ModelNodeTreeActionParticleEmitterSphereShape=\u7403\u72b6 -ModelNodeTreeActionParticleEmitterPointShape=\u70b9\u72b6 -ModelNodeTreeActionParticleEmitterMeshVertexShape=\u7f51\u683c\u9876\u70b9 -ModelNodeTreeActionParticleEmitterMeshFaceShape=\u7f51\u683c\u8868\u9762 -ModelNodeTreeActionParticleEmitterMeshConvexHullShape=\u7cbe\u786e\u7f51\u683c\u5f62\u72b6 -ModelNodeTreeActionParticleEmitterTriangleShape=\u4e09\u89d2\u5f62 -ModelNodeTreeActionParticleEmitterCylinderShape=\u5706\u67f1\u72b6 -ModelNodeTreeActionParticleEmitterDomeShape=\u534a\u7403\u72b6 -ModelNodeTreeActionParticleEmitterQuadShape=\u65b9\u5757 -ModelNodeTreeActionParticleEmitterTorusShape=\u73af\u72b6 -ModelNodeTreeActionParticleEmitterModelShape=\u5bfc\u5165\u6a21\u578b -ModelNodeTreeActionParticleEmitterChangeInfluencer=\u6539\u53d8\u7c92\u5b50\u5f71\u54cd\u5668 -ModelNodeTreeActionParticleEmitterInfluencerDefault=\u9ed8\u8ba4 -ModelNodeTreeActionParticleEmitterInfluencerEmpty=\u7a7a -ModelNodeTreeActionParticleEmitterInfluencerRadial=\u8f90\u5c04\u72b6\u5f71\u54cd\u5668 -ModelNodeTreeActionParticleEmitterChangeParticlesMesh=\u6539\u53d8\u7c92\u5b50\u7f51\u683c\u5f62\u72b6 -ModelNodeTreeActionParticleEmitterParticlesMeshQuad=\u56db\u8fb9\u5f62 -ModelNodeTreeActionParticleEmitterParticlesMeshPoint=\u70b9\u72b6 -ModelNodeTreeActionParticleEmitterParticlesMeshImpostor=Impostor -ModelNodeTreeActionParticleEmitterParticlesMeshModel=\u6a21\u578b -ModelNodeTreeActionCreateLayer=\u521b\u5efa\u5c42 -ModelNodeTreeActionAddUserData=\u6dfb\u52a0\u7528\u6237\u6570\u636e(UserData) -ModelNodeTreeActionAddControl=\u63a7\u5236\u5668(Control) -ModelNodeTreeActionAddControlRigidBody=\u521a\u4f53 -ModelNodeTreeActionAddControlStaticRigidBody=\u9759\u6001\u521a\u4f53 -ModelNodeTreeActionAddControlMotion=\u8fd0\u52a8 -ModelNodeTreeActionAddControlLight=Light -ModelNodeTreeActionAddControlCharacter=\u89d2\u8272 -ModelNodeTreeActionAddControlCustom=\u81ea\u5b9a\u4e49 -ModelNodeTreeActionAddControlVehicle=\u4ea4\u901a\u5de5\u5177 -ModelNodeTreeActionAddControlKinematicRagdoll=\u53ef\u8fd0\u52a8\u7684\u5e03\u5a03\u5a03 -ModelNodeTreeActionReactivate=\u91cd\u65b0\u6fc0\u6d3b -ModelNodeTreeActionChangeCollisionShape=\u6539\u53d8\u78b0\u649e\u5f62\u72b6 -ModelNodeTreeActionGenerateCollisionShape=\u751f\u6210 -ModelNodeTreeActionBoxCollisionShape=\u7acb\u65b9\u4f53 -ModelNodeTreeActionCapsuleCollisionShape=\u80f6\u56ca\u4f53 -ModelNodeTreeActionConeCollisionShape=\u5706\u9525\u4f53 -ModelNodeTreeActionCylinderCollisionShape=\u5706\u67f1\u4f53 -ModelNodeTreeActionSphereCollisionShape=\u7403\u4f53 -ModelNodeTreeActionAddWheel=\u6dfb\u52a0\u8f66\u8f6e -ModelNodeTreeActionAddTerrain=\u6dfb\u52a0\u5730\u5f62 -ModelNodeTreeActionEnableAllControls=Enable all controls -ModelNodeTreeActionDisableAllControls=Disable all controls - -ModelPropertyCullHint=\u9762\u5254\u9664 -ModelPropertyShadowMode=\u9634\u5f71\u6a21\u5f0f -ModelPropertyQueueBucket=Queue bucket -ModelPropertyLocation=\u4f4d\u7f6e -ModelPropertyScale=\u7f29\u653e -ModelPropertyRotation=\u65cb\u8f6c -ModelPropertyTransformation=Transformation -ModelPropertyMaterial=\u6750\u8d28 -ModelPropertyDirection=\u5b9a\u5411\u58f0\u6e90\u7684\u4f20\u64ad\u65b9\u5411 -ModelPropertyRadius=\u534a\u5f84 -ModelPropertyColor=\u989c\u8272 -ModelPropertyInnerAngle=\u5b9a\u5411\u58f0\u6ce2\u7684\u5185\u89d2\u89d2\u5ea6 -ModelPropertyOuterAngle=\u5b9a\u5411\u58f0\u6e90\u7684\u5916\u89d2\u89d2\u5ea6 -ModelPropertyMin=\u6700\u5c0f +SettingsPropertyFastSkyFolder=\u5FEB\u901F\u5929\u7A7A\u76EE\u5F55 + +SettingsCategoryGraphics=\u56FE\u5F62 +SettingsCategoryOther=\u5176\u4ED6 +SettingsCategoryEditor=\u7F16\u8F91\u5668 + +BlendToJ3oFileConverterDescription=\u5C06 .blend \u8F6C\u6362\u4E3A .j3o +GLTFToJ3oFileConverterDescription=\u5C06 .gltf \u8F6C\u6362\u4E3A .j3o +FBXToJ3oFileConverterDescription=\u5C06 .fbx \u8F6C\u6362\u4E3A .j3o +ObjToJ3oFileConverterDescription=\u5C06 .obj \u8F6C\u6362\u4E3A .j3o +SceneToJ3oFileConverterDescription=\u5C06 .scene \u8F6C\u6362\u4E3A .j3o +MeshXmlToJ3oFileConverterDescription=\u5C06 .mesh.xml \u8F6C\u6362\u4E3A .j3o +XBufToJ3oFileConverterDescription=\u5C06 .xbuf \u8F6C\u6362\u4E3A .j3o + +ModelFileEditorName=\u6A21\u578B\u7F16\u8F91\u5668 +ModelFileEditorNoSky=\u65E0\u5929\u7A7A\u76D2 +ModelFileEditorFastSky=\u5207\u6362\u5929\u7A7A\u76D2 +ModelFileEditorTransformMode=\u7A7A\u95F4\u8F6C\u6362\u6A21\u5F0F +ModelFileEditorNodeMesh=\u7F51\u683C +ModelFileEditorNodeMaterial=\u6750\u8D28 +ModelFileEditorNodeAmbientLight=\u73AF\u5883\u5149 +ModelFileEditorNodeDirectionLight=\u5B9A\u5411\u5149 +ModelFileEditorNodePointLight=\u70B9\u5149\u6E90 +ModelFileEditorNodeSpotLight=\u805A\u5149\u706F +ModelFileEditorNodeLightProbe=\u706F\u5149\u63A2\u9488 +ModelFileEditorNodeAnimControl=\u52A8\u753B +ModelFileEditorNodeParticleEmitterInfluencers=\u7C92\u5B50\u53D1\u5C04\u5F71\u54CD\u5668 +ModelFileEditorNodeParticleEmitterInfluencerEmpty=\u65E0\u5F71\u54CD\u5668 +ModelFileEditorNodeParticleEmitterInfluencerDefault=\u9ED8\u8BA4\u5F71\u54CD\u5668 +ModelFileEditorNodeParticleEmitterInfluencerRadial=\u8F90\u5C04\u72B6\u5F71\u54CD\u5668 +ModelFileEditorNodeParticleEmitterShapeBox=\u76D2\u72B6 +ModelFileEditorNodeParticleEmitterShapeSphere=\u7403\u72B6 +ModelFileEditorNodeParticleEmitterShapePoint=\u70B9\u72B6 +ModelFileEditorNodeParticleEmitterShapeMeshVertex=\u7F51\u683C\u9876\u70B9 +ModelFileEditorNodeParticleEmitterShapeMeshFace=\u7F51\u683C\u8868\u9762 +ModelFileEditorNodeParticleEmitterShapeMeshConvexHull=\u7CBE\u786E\u7F51\u683C\u5F62\u72B6 +ModelFileEditorNodeStaticRigidBodyControl=\u9759\u6001\u521A\u4F53 +ModelFileEditorNodeRigidBodyControl=\u521A\u4F53 +ModelFileEditorNodeCharacterControl=\u89D2\u8272 +ModelFileEditorNodeSkeletonControl=\u9AA8\u9ABC +ModelFileEditorNodeVehicleControl=\u4EA4\u901A\u5DE5\u5177 +ModelFileEditorNodeRagDollControl=\u5E03\u5A03\u5A03 +ModelFileEditorNodeBoxCollisionShape=\u7ACB\u65B9\u4F53 +ModelFileEditorNodeCapsuleCollisionShape=\u80F6\u56CA\u4F53 +ModelFileEditorNodeChildCollisionShape=\u5B50\u78B0\u649E\u4F53 +ModelFileEditorNodeComputedCollisionShape=\u7EC4\u5408\u78B0\u649E\u4F53 +ModelFileEditorNodeConeCollisionShape=\u5706\u9525\u4F53 +ModelFileEditorNodeCylinderCollisionShape=\u5706\u67F1\u4F53 +ModelFileEditorNodeGImpactCollisionShape=\u52A8\u6001\u7CBE\u786E\u7F51\u683C\u5F62\u72B6 +ModelFileEditorNodeHeightFieldCollisionShape=\u57FA\u4E8E\u9AD8\u5EA6\u5730\u5F62\u7684\u7CBE\u786E\u7F51\u683C\u5F62\u72B6 +ModelFileEditorNodeHullCollisionShape=\u4E0D\u592A\u7CBE\u786E\u7684\u7F51\u683C\u5F62\u72B6 +ModelFileEditorNodeMeshCollisionShape=\u7CBE\u786E\u7F51\u683C\u5F62\u72B6 +ModelFileEditorNodePlaneCollisionShape=\u5E73\u9762 +ModelFileEditorNodeSphereCollisionShape=\u7403\u4F53 +ModelFileEditorNodeWheel=\u8F66\u8F6E +ModelFileEditorNodeMotionControl=\u8FD0\u52A8\u63A7\u5236\u5668 +ModelFileEditorNodeMotionPath=\u8FD0\u52A8\u8DEF\u5F84 +ModelFileEditorNodeWayPoint=\u8DEF\u5F84\u70B9 +ModelFileEditorNodeVertexBuffer=\u9876\u70B9\u7F13\u5B58 +ModelFileEditorNodeLightControl=\u5149\u6E90\u63A7\u5236\u5668 + +SceneFileEditorNodeFilters=\u540E\u5904\u7406\u6EE4\u955C +SceneFileEditorNodeAppStates=AppState + +SceneFileEditorName=\u573A\u666F\u7F16\u8F91\u5668 +SceneFileEditorToolObjects=\u7269\u4F53 +SceneFileEditorToolPainting=\u7ED8\u5236 +SceneFileEditorToolScripting=\u811A\u672C +SceneFileEditorToolAppStates=AppState +SceneFileEditorToolFilters=\u540E\u5904\u7406\u6EE4\u955C +SceneFileEditorToolLayers=\u5C42 + +ModelNodeTreeActionRemove=\u79FB\u9664 +ModelNodeTreeActionRename=\u91CD\u547D\u540D +ModelNodeTreeActionOptimizeGeometry=\u4F18\u5316\u51E0\u4F55\u4F53 +ModelNodeTreeActionTools=\u5DE5\u5177 +ModelNodeTreeActionCreate=\u521B\u5EFA +ModelNodeTreeActionCreateNode=\u8282\u70B9 +ModelNodeTreeActionCreateSky=\u5929\u7A7A\u76D2 +ModelNodeTreeActionCreateEditableSky=\u53EF\u7F16\u8F91\u7684\u5929\u7A7A\u76D2 +ModelNodeTreeActionCreatePrimitive=\u57FA\u672C\u5F62\u72B6 +ModelNodeTreeActionCreatePrimitiveBox=\u7ACB\u65B9\u4F53 +ModelNodeTreeActionCreatePrimitiveSphere=\u7403\u4F53 +ModelNodeTreeActionCreatePrimitiveQuad=\u56DB\u8FB9\u5F62 +ModelNodeTreeActionLoadModel=\u52A0\u8F7D\u6A21\u578B +ModelNodeTreeActionSaveAs=\u53E6\u5B58\u4E3A +ModelNodeTreeActionMakeEmbedded=\u505A\u4E3A\u5185\u5D4C\u6A21\u578B +ModelNodeTreeActionLinkModel=\u94FE\u63A5\u6A21\u578B +ModelNodeTreeActionTangentGenerator=\u751F\u6210\u5207\u7EBF +ModelNodeTreeActionLoDGenerator=\u751F\u6210\u5C42\u6B21\u7EC6\u8282(LOD) +ModelNodeTreeActionLight=\u706F\u5149 +ModelNodeTreeActionAmbientLight=\u73AF\u5883\u5149 +ModelNodeTreeActionDirectionLight=\u5B9A\u5411\u5149 +ModelNodeTreeActionPointLight=\u70B9\u5149\u6E90 +ModelNodeTreeActionSpotLight=\u805A\u5149\u706F +ModelNodeTreeActionAnimationPlay=\u64AD\u653E\u52A8\u753B +ModelNodeTreeActionAnimationPlaySettings=\u64AD\u653E\u8BBE\u7F6E +ModelNodeTreeActionAnimationStop=\u505C\u6B62\u52A8\u753B +ModelNodeTreeActionAnimationPause=\u6682\u505C\u52A8\u753B +ModelNodeTreeActionAnimationManualExtractSubAnimation=\u624B\u52A8\u89E3\u538B\u5B50\u52A8\u753B +ModelNodeTreeActionCreateAudioNode=\u97F3\u9891\u8282\u70B9 +ModelNodeTreeActionAudioPlay=\u64AD\u653E +ModelNodeTreeActionAudioStop=\u505C\u6B62 +ModelNodeTreeActionCopy=\u590D\u5236 +ModelNodeTreeActionPaste=\u7C98\u8D34 +ModelNodeTreeActionCreateDefaultParticleEmitter=\u9ED8\u8BA4\u7C92\u5B50\u53D1\u751F\u5668 +ModelNodeTreeActionResetParticleEmitters=\u91CD\u7F6E\u7C92\u5B50\u53D1\u751F\u5668 +ModelNodeTreeActionParticleEmitterChangeShape=\u6539\u53D8\u53D1\u751F\u5668\u5F62\u72B6 +ModelNodeTreeActionParticleEmitterBoxShape=\u76D2\u72B6 +ModelNodeTreeActionParticleEmitterSphereShape=\u7403\u72B6 +ModelNodeTreeActionParticleEmitterPointShape=\u70B9\u72B6 +ModelNodeTreeActionParticleEmitterMeshVertexShape=\u7F51\u683C\u9876\u70B9 +ModelNodeTreeActionParticleEmitterMeshFaceShape=\u7F51\u683C\u8868\u9762 +ModelNodeTreeActionParticleEmitterMeshConvexHullShape=\u7CBE\u786E\u7F51\u683C\u5F62\u72B6 +ModelNodeTreeActionParticleEmitterTriangleShape=\u4E09\u89D2\u5F62 +ModelNodeTreeActionParticleEmitterCylinderShape=\u5706\u67F1\u72B6 +ModelNodeTreeActionParticleEmitterDomeShape=\u534A\u7403\u72B6 +ModelNodeTreeActionParticleEmitterQuadShape=\u65B9\u5757 +ModelNodeTreeActionParticleEmitterTorusShape=\u73AF\u72B6 +ModelNodeTreeActionParticleEmitterModelShape=\u5BFC\u5165\u6A21\u578B +ModelNodeTreeActionParticleEmitterChangeInfluencer=\u6539\u53D8\u7C92\u5B50\u5F71\u54CD\u5668 +ModelNodeTreeActionParticleEmitterInfluencerDefault=\u9ED8\u8BA4 +ModelNodeTreeActionParticleEmitterInfluencerEmpty=\u7A7A +ModelNodeTreeActionParticleEmitterInfluencerRadial=\u8F90\u5C04\u72B6\u5F71\u54CD\u5668 +ModelNodeTreeActionParticleEmitterChangeParticlesMesh=\u6539\u53D8\u7C92\u5B50\u7F51\u683C\u5F62\u72B6 +ModelNodeTreeActionParticleEmitterParticlesMeshQuad=\u56DB\u8FB9\u5F62 +ModelNodeTreeActionParticleEmitterParticlesMeshPoint=\u70B9\u72B6 +ModelNodeTreeActionParticleEmitterParticlesMeshImpostor=\u66FF\u4EE3\u8005 +ModelNodeTreeActionParticleEmitterParticlesMeshModel=\u6A21\u578B +ModelNodeTreeActionCreateLayer=\u521B\u5EFA\u5C42 +ModelNodeTreeActionAddUserData=\u6DFB\u52A0\u7528\u6237\u6570\u636E +ModelNodeTreeActionAddControl=\u63A7\u5236\u5668 +ModelNodeTreeActionAddControlRigidBody=\u521A\u4F53 +ModelNodeTreeActionAddControlStaticRigidBody=\u9759\u6001\u521A\u4F53 +ModelNodeTreeActionAddControlMotion=\u8FD0\u52A8 +ModelNodeTreeActionAddControlLight=\u706F\u5149 +ModelNodeTreeActionAddControlCharacter=\u89D2\u8272 +ModelNodeTreeActionAddControlCustom=\u81EA\u5B9A\u4E49 +ModelNodeTreeActionAddControlVehicle=\u4EA4\u901A\u5DE5\u5177 +ModelNodeTreeActionAddControlKinematicRagdoll=\u53EF\u8FD0\u52A8\u7684\u5E03\u5A03\u5A03 +ModelNodeTreeActionReactivate=\u91CD\u65B0\u6FC0\u6D3B +ModelNodeTreeActionChangeCollisionShape=\u6539\u53D8\u78B0\u649E\u5F62\u72B6 +ModelNodeTreeActionGenerateCollisionShape=\u751F\u6210 +ModelNodeTreeActionBoxCollisionShape=\u7ACB\u65B9\u4F53 +ModelNodeTreeActionCapsuleCollisionShape=\u80F6\u56CA\u4F53 +ModelNodeTreeActionConeCollisionShape=\u5706\u9525\u4F53 +ModelNodeTreeActionCylinderCollisionShape=\u5706\u67F1\u4F53 +ModelNodeTreeActionSphereCollisionShape=\u7403\u4F53 +ModelNodeTreeActionAddWheel=\u6DFB\u52A0\u8F66\u8F6E +ModelNodeTreeActionAddTerrain=\u6DFB\u52A0\u5730\u5F62 +ModelNodeTreeActionEnableAllControls=\u542F\u7528\u6240\u6709\u63A7\u5236\u5668 +ModelNodeTreeActionDisableAllControls=\u7981\u7528\u6240\u6709\u63A7\u5236\u5668 + +ModelPropertyCullHint=\u5254\u9664\u63D0\u793A +ModelPropertyShadowMode=\u9634\u5F71\u6A21\u5F0F +ModelPropertyQueueBucket=\u6E32\u67D3\u961F\u5217 +ModelPropertyLocation=\u4F4D\u7F6E +ModelPropertyScale=\u7F29\u653E +ModelPropertyRotation=\u65CB\u8F6C +ModelPropertyTransformation=\u7A7A\u95F4\u53D8\u6362 +ModelPropertyMaterial=\u6750\u8D28 +ModelPropertyDirection=\u5B9A\u5411\u58F0\u6E90\u7684\u4F20\u64AD\u65B9\u5411 +ModelPropertyRadius=\u534A\u5F84 +ModelPropertyColor=\u989C\u8272 +ModelPropertyInnerAngle=\u5B9A\u5411\u58F0\u6CE2\u7684\u5185\u89D2\u89D2\u5EA6 +ModelPropertyOuterAngle=\u5B9A\u5411\u58F0\u6E90\u7684\u5916\u89D2\u89D2\u5EA6 +ModelPropertyMin=\u6700\u5C0F ModelPropertyMax=\u6700\u5927 -ModelPropertyIsLooping=\u5faa\u73af\u6a21\u5f0f -ModelPropertyIsReverb=\u56de\u58f0 -ModelPropertyIsDirectional=\u5b9a\u5411\u58f0\u6e90 -ModelPropertyIsPositional=\u5b9a\u4f4d\u58f0\u6e90 -ModelPropertyAudioPitch=\u91c7\u6837\u9891\u7387 -ModelPropertyAudioVolume=\u97f3\u91cf -ModelPropertyTimeOffset=\u64ad\u653e\u65f6\u95f4 -ModelPropertyMaxDistance=\u6700\u5927\u4f20\u64ad\u8ddd\u79bb -ModelPropertyRefDistance=\u534a\u8870\u8ddd\u79bb -ModelPropertyAudioData=\u97f3\u9891\u6570\u636e -ModelPropertyVelocity=\u97f3\u6e90\u8fd0\u52a8\u901f\u5ea6 -ModelPropertyLoD=\u5c42\u6b21\u7ec6\u8282(LoD) -ModelPropertyTriangleCount=\u4e09\u89d2\u5f62\u6570 +ModelPropertyIsLooping=\u5FAA\u73AF\u6A21\u5F0F +ModelPropertyIsReverb=\u56DE\u58F0 +ModelPropertyIsDirectional=\u5B9A\u5411\u58F0\u6E90 +ModelPropertyIsPositional=\u5B9A\u4F4D\u58F0\u6E90 +ModelPropertyAudioPitch=\u91C7\u6837\u9891\u7387 +ModelPropertyAudioVolume=\u97F3\u91CF +ModelPropertyTimeOffset=\u64AD\u653E\u65F6\u95F4 +ModelPropertyMaxDistance=\u6700\u5927\u4F20\u64AD\u8DDD\u79BB +ModelPropertyRefDistance=\u534A\u8870\u8DDD\u79BB +ModelPropertyAudioData=\u97F3\u9891\u6570\u636E +ModelPropertyVelocity=\u97F3\u6E90\u8FD0\u52A8\u901F\u5EA6 +ModelPropertyLoD=\u5C42\u6B21\u7EC6\u8282(LoD) +ModelPropertyTriangleCount=\u4E09\u89D2\u5F62\u6570 ModelPropertyLevel=Level -ModelPropertyLayer=Layer -ModelPropertyValue=\u503c +ModelPropertyLayer=\u5C42 +ModelPropertyValue=\u503C ModelPropertyId=Id -ModelPropertyInstanceCount=\u5b9e\u4f8b\u6570\u91cf -ModelPropertyVertexCount=\u9876\u70b9\u6570\u91cf -ModelPropertyNumLodLevels=Lod\u6570\u91cf -ModelPropertyMode=\u6a21\u5f0f -ModelPropertyType=\u7c7b\u578b -ModelPropertyFormat=\u683c\u5f0f +ModelPropertyInstanceCount=\u5B9E\u4F8B\u6570\u91CF +ModelPropertyVertexCount=\u9876\u70B9\u6570\u91CF +ModelPropertyNumLodLevels=Lod\u6570\u91CF +ModelPropertyMode=\u6A21\u5F0F +ModelPropertyType=\u7C7B\u578B +ModelPropertyFormat=\u683C\u5F0F ModelPropertyUsage=\u7528\u9014 -ModelPropertyUniqId=\u552f\u4e00ID -ModelPropertyBaseInstanceCount=Base instances -ModelPropertyInstanceSpan=Instance span -ModelPropertyNumComponents=\u7ec4\u4ef6\u6570\u91cf -ModelPropertyNumElements=\u5143\u7d20\u6570\u91cf -ModelPropertyOffset=\u504f\u79fb -ModelPropertyStride=\u6b65\u5e45 -ModelPropertyCapacity=\u5bb9\u91cf -ModelPropertyIsEnabled=\u542f\u7528 -ModelPropertyIsHardwareSkinningPreferred=\u5f00\u542f\u786c\u4ef6\u8499\u76ae -ModelPropertyViewDirection=\u9762\u671d\u65b9\u5411 -ModelPropertyWalkDirection=\u884c\u8d70\u65b9\u5411 -ModelPropertyFallSpeed=\u6389\u843d\u901f\u5ea6 -ModelPropertyGravity=\u91cd\u529b\u52a0\u901f\u5ea6 -ModelPropertyJumpSpeed=\u8df3\u8dc3\u901f\u5ea6 -ModelPropertyJumpForce=Jump force -ModelPropertyPhysicsDamping=Physics damping -ModelPropertyMaxSlope=\u6700\u5927\u659c\u7387 -ModelPropertyIsApplyPhysicsLocal=\u662f\u5426\u542f\u7528\u672c\u5730\u7269\u7406 -ModelPropertyIsUseViewDirection=\u662f\u5426\u4f7f\u7528\u9762\u671d\u65b9\u5411 -ModelPropertyIsKinematicSpatial=\u662f\u5426\u4e3a\u8fd0\u52a8\u7269\u4f53 -ModelPropertyIsKinematic=\u662f\u5426\u53ef\u52a8 -ModelPropertyAngularVelocity=\u89d2\u901f\u5ea6 -ModelPropertyLinearFactor=\u7ebf\u6027\u56e0\u5b50 -ModelPropertyAngularDamping=\u65cb\u8f6c\u963b\u5c3c\u7cfb\u6570 -ModelPropertyAngularFactor=\u65cb\u8f6c\u56e0\u5b50 -ModelPropertyFriction=\u6469\u64e6\u7cfb\u6570 -ModelPropertyLinearDamping=\u7ebf\u6027\u963b\u5c3c\u7cfb\u6570 -ModelPropertyMass=\u8d28\u91cf -ModelPropertyRestitution=\u5f39\u6027 -ModelPropertyCurrentValue=\u5f53\u524d\u503c -ModelPropertyCurrentWayPoint=\u5f53\u524d\u8def\u5f84\u70b9 -ModelPropertyDirectionType=\u671d\u5411\u7c7b\u578b -ModelPropertyAngularSleepingThreshold=Angular sleeping threshold -ModelPropertyLoopMode=\u5faa\u73af\u6a21\u5f0f -ModelPropertyInitialDuration=\u521d\u59cb\u65f6\u957f -ModelPropertySpeed=\u901f\u5ea6 -ModelPropertyTime=\u65f6\u95f4 -ModelPropertyMargin=\u8fb9\u7f18\u7a7a\u767d -ModelPropertyHalfExtents=\u534a\u957f\u5ea6 -ModelPropertyHeight=\u9ad8\u5ea6 -ModelPropertyAxis=\u5750\u6807\u8f74 -ModelPropertyObjectId=\u5bf9\u8c61ID -ModelPropertyAxle=\u8f66\u8f74 -ModelPropertyRestLength=\u4f11\u606f\u65f6\u957f -ModelPropertyIsFront=\u524d\u65b9 -ModelPropertyDampingCompression=\u963b\u5c3c\u538b\u7f29 -ModelPropertyFrictionSlip=\u6469\u64e6\u6ed1\u5757 -ModelPropertyMaxSuspensionForce=\u6700\u5927\u60ac\u6d6e\u529b -ModelPropertyMaxSuspensionTravelCm=\u6700\u5927\u60ac\u6d6e\u884c\u7a0b -ModelPropertyDampingRelaxation=\u963b\u5c3c\u677e\u5f1b -ModelPropertySuspensionStiffness=\u60ac\u67b6\u521a\u5ea6 -ModelPropertyRollInfluence=\u65cb\u8f6c\u5f71\u54cd\u5668 +ModelPropertyUniqId=\u552F\u4E00ID +ModelPropertyBaseInstanceCount=\u57FA\u672C\u5B9E\u4F8B +ModelPropertyInstanceSpan=\u5B9E\u4F8B\u5C55\u5F00 +ModelPropertyNumComponents=\u7EC4\u4EF6\u6570\u91CF +ModelPropertyNumElements=\u5143\u7D20\u6570\u91CF +ModelPropertyOffset=\u504F\u79FB +ModelPropertyStride=\u6B65\u5E45 +ModelPropertyCapacity=\u5BB9\u91CF +ModelPropertyIsEnabled=\u542F\u7528 +ModelPropertyIsHardwareSkinningPreferred=\u5F00\u542F\u786C\u4EF6\u8499\u76AE +ModelPropertyViewDirection=\u9762\u671D\u65B9\u5411 +ModelPropertyWalkDirection=\u884C\u8D70\u65B9\u5411 +ModelPropertyFallSpeed=\u6389\u843D\u901F\u5EA6 +ModelPropertyGravity=\u91CD\u529B\u52A0\u901F\u5EA6 +ModelPropertyJumpSpeed=\u8DF3\u8DC3\u901F\u5EA6 +ModelPropertyJumpForce=\u8DF3\u8DC3\u529B\u91CF +ModelPropertyPhysicsDamping=\u7269\u7406\u963B\u5C3C +ModelPropertyMaxSlope=\u6700\u5927\u659C\u7387 +ModelPropertyIsApplyPhysicsLocal=\u662F\u5426\u542F\u7528\u672C\u5730\u7269\u7406 +ModelPropertyIsUseViewDirection=\u662F\u5426\u4F7F\u7528\u9762\u671D\u65B9\u5411 +ModelPropertyIsKinematicSpatial=\u662F\u5426\u4E3A\u8FD0\u52A8\u7269\u4F53 +ModelPropertyIsKinematic=\u662F\u5426\u53EF\u52A8 +ModelPropertyAngularVelocity=\u89D2\u901F\u5EA6 +ModelPropertyLinearFactor=\u7EBF\u6027\u56E0\u5B50 +ModelPropertyAngularDamping=\u65CB\u8F6C\u963B\u5C3C\u7CFB\u6570 +ModelPropertyAngularFactor=\u65CB\u8F6C\u56E0\u5B50 +ModelPropertyFriction=\u6469\u64E6\u7CFB\u6570 +ModelPropertyLinearDamping=\u7EBF\u6027\u963B\u5C3C\u7CFB\u6570 +ModelPropertyMass=\u8D28\u91CF +ModelPropertyRestitution=\u5F39\u6027 +ModelPropertyCurrentValue=\u5F53\u524D\u503C +ModelPropertyCurrentWayPoint=\u5F53\u524D\u8DEF\u5F84\u70B9 +ModelPropertyDirectionType=\u671D\u5411\u7C7B\u578B +ModelPropertyAngularSleepingThreshold=\u89D2\u4F11\u7720\u9608\u503C +ModelPropertyLoopMode=\u5FAA\u73AF\u6A21\u5F0F +ModelPropertyInitialDuration=\u521D\u59CB\u65F6\u957F +ModelPropertySpeed=\u901F\u5EA6 +ModelPropertyTime=\u65F6\u95F4 +ModelPropertyMargin=\u8FB9\u7F18\u7A7A\u767D +ModelPropertyHalfExtents=\u534A\u957F\u5EA6 +ModelPropertyHeight=\u9AD8\u5EA6 +ModelPropertyAxis=\u5750\u6807\u8F74 +ModelPropertyObjectId=\u5BF9\u8C61ID +ModelPropertyAxle=\u8F66\u8F74 +ModelPropertyRestLength=\u4F11\u606F\u65F6\u957F +ModelPropertyIsFront=\u524D\u65B9 +ModelPropertyDampingCompression=\u963B\u5C3C\u538B\u7F29 +ModelPropertyFrictionSlip=\u6469\u64E6\u6ED1\u5757 +ModelPropertyMaxSuspensionForce=\u6700\u5927\u60AC\u6D6E\u529B +ModelPropertyMaxSuspensionTravelCm=\u6700\u5927\u60AC\u6D6E\u884C\u7A0B +ModelPropertyDampingRelaxation=\u963B\u5C3C\u677E\u5F1B +ModelPropertySuspensionStiffness=\u60AC\u67B6\u521A\u5EA6 +ModelPropertyRollInfluence=\u65CB\u8F6C\u5F71\u54CD\u5668 ModelPropertyWheelSpatial=Wheel spatial -ModelPropertyLength=\u957f\u5ea6 -ModelPropertyCurrentTime=\u5f53\u524d\u65f6\u95f4 -ModelPropertyPoint=\u70b9 -ModelPropertyCenter=\u4e2d\u5fc3 -ModelPropertyVelocityVariation=\u901f\u5ea6\u7684\u53d8\u5316 -ModelPropertyInitialVelocity=\u521d\u59cb\u901f\u5ea6 -ModelPropertyOrigin=\u539f\u70b9 -ModelPropertyRadialVelocity=\u8f90\u5c04\u901f\u5ea6 -ModelPropertyIsHorizontal=\u662f\u5426\u6c34\u5e73 -ModelPropertyIsTestMode=\u6d4b\u8bd5\u53d1\u751f\u5668 -ModelPropertyIsRandomPoint=\u4f7f\u7528\u968f\u673a\u70b9 -ModelPropertyIsSequentialFace=\u4f7f\u7528\u6309\u6b21\u5e8f\u8868\u9762 -ModelPropertyIsSkipPattern=\u662f\u5426\u8df3\u8fc7\u6a21\u5f0f -ModelPropertyEmissionPoint=\u7c92\u5b50\u53d1\u751f\u70b9 -ModelPropertyMaxParticles=\u6700\u5927\u7c92\u5b50\u6570\u91cf -ModelPropertyEmissionPerSecond=\u53d1\u5c04\u6570/\u79d2 -ModelPropertyParticlesPerSecond=\u7c92\u5b50\u6570/\u79d2 -ModelPropertyEmitterLife=\u53d1\u5c04\u65f6\u95f4 -ModelPropertyEmitterDelay=\u53d1\u5c04\u5ef6\u8fdf -ModelPropertyIsTestParticles=\u6d4b\u8bd5\u7c92\u5b50 -ModelPropertyIsFollowEmitter=\u8ddf\u968f\u53d1\u5c04\u5668 -ModelPropertyStretching=\u62c9\u4f38 -ModelPropertyMagnitude=\u5e45\u5ea6 -ModelPropertyBillboard=\u5e7f\u544a\u724c(Billboard) -ModelPropertyInitialForce=\u521d\u59cb\u529b -ModelPropertyLife=\u751f\u5b58\u65f6\u95f4 +ModelPropertyLength=\u957F\u5EA6 +ModelPropertyCurrentTime=\u5F53\u524D\u65F6\u95F4 +ModelPropertyPoint=\u70B9 +ModelPropertyCenter=\u4E2D\u5FC3 +ModelPropertyVelocityVariation=\u901F\u5EA6\u7684\u53D8\u5316 +ModelPropertyInitialVelocity=\u521D\u59CB\u901F\u5EA6 +ModelPropertyOrigin=\u539F\u70B9 +ModelPropertyRadialVelocity=\u8F90\u5C04\u901F\u5EA6 +ModelPropertyIsHorizontal=\u662F\u5426\u6C34\u5E73 +ModelPropertyIsTestMode=\u6D4B\u8BD5\u53D1\u751F\u5668 +ModelPropertyIsRandomPoint=\u4F7F\u7528\u968F\u673A\u70B9 +ModelPropertyIsSequentialFace=\u4F7F\u7528\u6309\u6B21\u5E8F\u8868\u9762 +ModelPropertyIsSkipPattern=\u662F\u5426\u8DF3\u8FC7\u6A21\u5F0F +ModelPropertyEmissionPoint=\u7C92\u5B50\u53D1\u751F\u70B9 +ModelPropertyMaxParticles=\u6700\u5927\u7C92\u5B50\u6570\u91CF +ModelPropertyEmissionPerSecond=\u53D1\u5C04\u6570/\u79D2 +ModelPropertyParticlesPerSecond=\u7C92\u5B50\u6570/\u79D2 +ModelPropertyEmitterLife=\u53D1\u5C04\u65F6\u95F4 +ModelPropertyEmitterDelay=\u53D1\u5C04\u5EF6\u8FDF +ModelPropertyIsTestParticles=\u6D4B\u8BD5\u7C92\u5B50 +ModelPropertyIsFollowEmitter=\u8DDF\u968F\u53D1\u5C04\u5668 +ModelPropertyStretching=\u62C9\u4F38 +ModelPropertyMagnitude=\u5E45\u5EA6 +ModelPropertyBillboard=\u5E7F\u544A\u724C(Billboard) +ModelPropertyInitialForce=\u521D\u59CB\u529B +ModelPropertyLife=\u751F\u5B58\u65F6\u95F4 ModelPropertyLight=Light ModelPropertyColumns=\u5217\u6570 -ModelPropertyRows=\u884c\u6570 -ModelPropertySpriteCount=\u7cbe\u7075(Sprite)\u6570\u91cf -ModelPropertyIsFacingVelocity=\u6b63\u9762\u671d\u5411\u8fd0\u52a8\u65b9\u5411 -ModelPropertyIsInWorldSpace=\u5904\u4e8e\u4e16\u754c\u7a7a\u95f4 -ModelPropertyIsRandomAngle=\u968f\u673a\u89d2\u5ea6 -ModelPropertyIsSelectRandomImage=\u968f\u673a\u9009\u62e9\u56fe\u7247 -ModelPropertySize=\u5c3a\u5bf8 -ModelPropertyRotateSpeed=\u65cb\u8f6c\u901f\u5ea6 -ModelPropertyStartColor=\u521d\u59cb\u989c\u8272 -ModelPropertyEndColor=\u6700\u7ec8\u989c\u8272 -ModelPropertyMeshType=\u7f51\u683c\u7c7b\u578b -ModelPropertyFaceNormal=\u6b63\u9762\u671d\u5411\u6cd5\u5411\u91cf -ModelPropertyFixedDuration=\u56fa\u5b9a\u6301\u7eed\u65f6\u95f4 -ModelPropertyIsRandomStartColor=\u968f\u673a\u521d\u59cb\u989c\u8272 -ModelPropertyIsRandomStartSize=\u968f\u673a\u521d\u59cb\u5c3a\u5bf8 -ModelPropertySizeVariationFactor=\u5c3a\u5bf8\u53d8\u5316\u7cfb\u6570 -ModelPropertyIsRandomStartDestination=\u968f\u673a\u521d\u59cb\u76ee\u7684\u5730 -ModelPropertyChance=\u51e0\u7387 -ModelPropertyStrength=\u5f3a\u5ea6 -ModelPropertyAlignment=\u5bf9\u9f50 -ModelPropertyIsRandomDirection=\u968f\u673a\u65b9\u5411 -ModelPropertyPullCenter=Pull center -ModelPropertyPullAlignment=Pull alignment -ModelPropertyUpAlignment=\u4e0a\u5bf9\u9f50 -ModelPropertyRadialPull=Radial pull -ModelPropertyTangetForce=\u5207\u5411\u529b -ModelPropertyAlphaInterpolation=Alpha\u63d2\u503c -ModelPropertyColorInterpolation=\u989c\u8272\u63d2\u503c -ModelPropertyDestinationInterpolation=\u76ee\u7684\u5730\u63d2\u503c -ModelPropertyRotationInterpolation=\u65cb\u8f6c\u63d2\u503c -ModelPropertySizeInterpolation=\u5c3a\u5bf8\u63d2\u503c -ModelPropertyInfluencerAlpha=Alpha -ModelPropertyFrameSequence=\u5e27\u5e8f\u5217 -ModelPropertyIsRandomStartImage=\u968f\u673a\u521d\u59cb\u56fe\u7247 -ModelPropertyIsAnimate=\u6709\u52a8\u753b\u7684 -ModelPropertyReaction=\u53cd\u4f5c\u7528\u529b -ModelPropertyIsRandomSpeed=\u968f\u673a\u901f\u5ea6 -ModelPropertyIsStartRandomRotationX=\u968f\u673a\u65cb\u8f6c\u65b9\u5411 -ModelPropertyInterpolation=\u63d2\u503c -ModelPropertyGeometryList=\u51e0\u4f55\u4f53\u5217\u8868(\u672a\u4fdd\u5b58) -ModelPropertyGeometry=\u51e0\u4f55\u4f53 -ModelPropertyAxisSamples=Axis samples -ModelPropertyRadialSamples=Radial samples -ModelPropertyPlanes=\u5e73\u9762 -ModelPropertyWidth=\u5bbd\u5ea6 -ModelPropertyFlipCoords=\u7ffb\u8f6c\u5750\u6807 -ModelPropertyZSamples=Z samples -ModelPropertyCircleSamples=Circle samples -ModelPropertyInnerRadius=\u5185\u89d2\u534a\u5f84 -ModelPropertyOuterRadius=\u5916\u89d2\u534a\u5f84 -ModelPropertyName=\u540d\u79f0 -ModelPropertyDataType=\u6570\u636e\u7c7b\u578b -ModelPropertyDefaultValue=\u9ed8\u8ba4\u503c -ModelPropertyLightMode=\u706f\u5149\u6a21\u5f0f -ModelPropertyColorSpace=\u989c\u8272\u7a7a\u95f4 -ModelPropertyLanguage=\u8bed\u8a00 -ModelPropertyTexture=\u7eb9\u7406 -ModelPropertyBrushSize=\u7b14\u5237\u5c3a\u5bf8 -ModelPropertyBrushPower=\u7b14\u5237\u529b\u5ea6 -ModelPropertySmoothly=\u5e73\u6ed1\u7684 -ModelPropertyLimited=\u53d7\u9650\u7684 -ModelPropertyUseMarker=\u7528\u6237\u6807\u8bb0 -ModelPropertyRoughness=\u7c97\u7cd9\u5ea6 +ModelPropertyRows=\u884C\u6570 +ModelPropertySpriteCount=\u7CBE\u7075(Sprite)\u6570\u91CF +ModelPropertyIsFacingVelocity=\u6B63\u9762\u671D\u5411\u8FD0\u52A8\u65B9\u5411 +ModelPropertyIsInWorldSpace=\u5904\u4E8E\u4E16\u754C\u7A7A\u95F4 +ModelPropertyIsRandomAngle=\u968F\u673A\u89D2\u5EA6 +ModelPropertyIsSelectRandomImage=\u968F\u673A\u9009\u62E9\u56FE\u7247 +ModelPropertySize=\u5C3A\u5BF8 +ModelPropertyRotateSpeed=\u65CB\u8F6C\u901F\u5EA6 +ModelPropertyStartColor=\u521D\u59CB\u989C\u8272 +ModelPropertyEndColor=\u6700\u7EC8\u989C\u8272 +ModelPropertyMeshType=\u7F51\u683C\u7C7B\u578B +ModelPropertyFaceNormal=\u6B63\u9762\u671D\u5411\u6CD5\u5411\u91CF +ModelPropertyFixedDuration=\u56FA\u5B9A\u6301\u7EED\u65F6\u95F4 +ModelPropertyIsRandomStartColor=\u968F\u673A\u521D\u59CB\u989C\u8272 +ModelPropertyIsRandomStartSize=\u968F\u673A\u521D\u59CB\u5C3A\u5BF8 +ModelPropertySizeVariationFactor=\u5C3A\u5BF8\u53D8\u5316\u7CFB\u6570 +ModelPropertyIsRandomStartDestination=\u968F\u673A\u521D\u59CB\u76EE\u7684\u5730 +ModelPropertyChance=\u51E0\u7387 +ModelPropertyStrength=\u5F3A\u5EA6 +ModelPropertyAlignment=\u5BF9\u9F50 +ModelPropertyIsRandomDirection=\u968F\u673A\u65B9\u5411 +ModelPropertyPullCenter=\u62C9\u529B\u4E2D\u5FC3 +ModelPropertyPullAlignment=\u62C9\u529B\u5BF9\u9F50\u65B9\u5411 +ModelPropertyUpAlignment=\u4E0A\u5BF9\u9F50 +ModelPropertyRadialPull=\u5411\u5FC3\u529B +ModelPropertyTangetForce=\u5207\u5411\u529B +ModelPropertyAlphaInterpolation=\u900F\u660E\u5EA6 +ModelPropertyColorInterpolation=\u989C\u8272 +ModelPropertyDestinationInterpolation=\u76EE\u6807\u8DEF\u5F84 +ModelPropertyRotationInterpolation=\u65CB\u8F6C +ModelPropertySizeInterpolation=\u5C3A\u5BF8 +ModelPropertyInfluencerAlpha=\u900F\u660E\u5EA6 +ModelPropertyFrameSequence=\u5E27\u5E8F\u5217 +ModelPropertyIsRandomStartImage=\u968F\u673A\u521D\u59CB\u56FE\u7247 +ModelPropertyIsAnimate=\u6709\u52A8\u753B\u7684 +ModelPropertyReaction=\u53CD\u5E94 +ModelPropertyIsRandomSpeed=\u968F\u673A\u901F\u5EA6 +ModelPropertyIsStartRandomRotationX=\u968F\u673A\u65CB\u8F6C\u65B9\u5411 +ModelPropertyInterpolation=\u63D2\u503C +ModelPropertyGeometryList=\u51E0\u4F55\u4F53\u5217\u8868(\u672A\u4FDD\u5B58) +ModelPropertyGeometry=\u51E0\u4F55\u4F53 +ModelPropertyAxisSamples=\u8F74\u5411\u91C7\u6837\u6570 +ModelPropertyRadialSamples=\u5F84\u5411\u91C7\u6837\u6570 +ModelPropertyPlanes=\u5E73\u9762 +ModelPropertyWidth=\u5BBD\u5EA6 +ModelPropertyFlipCoords=\u7FFB\u8F6C\u5750\u6807 +ModelPropertyZSamples=Z\u8F74\u91C7\u6837\u6570 +ModelPropertyCircleSamples=\u5706\u73AF\u91C7\u6837\u6570 +ModelPropertyInnerRadius=\u5185\u89D2\u534A\u5F84 +ModelPropertyOuterRadius=\u5916\u89D2\u534A\u5F84 +ModelPropertyName=\u540D\u79F0 +ModelPropertyDataType=\u6570\u636E\u7C7B\u578B +ModelPropertyDefaultValue=\u9ED8\u8BA4\u503C +ModelPropertyLightMode=\u706F\u5149\u6A21\u5F0F +ModelPropertyColorSpace=\u989C\u8272\u7A7A\u95F4 +ModelPropertyLanguage=\u8BED\u8A00 +ModelPropertyTexture=\u7EB9\u7406 +ModelPropertyBrushSize=\u7B14\u5237\u5C3A\u5BF8 +ModelPropertyBrushPower=\u7B14\u5237\u529B\u5EA6 +ModelPropertySmoothly=\u5E73\u6ED1\u7684 +ModelPropertyLimited=\u53D7\u9650\u7684 +ModelPropertyUseMarker=\u7528\u6237\u6807\u8BB0 +ModelPropertyRoughness=\u7C97\u7CD9\u5EA6 ModelPropertyFrequency=\u9891\u7387 -ModelPropertyLacunarity=\u5b54\u9699\u5ea6 -ModelPropertyOctaves=\u516b\u8fb9\u5f62 -ModelPropertyMinScale=Min scale -ModelPropertyMaxScale=Max scale -ModelPropertyPadding=Padding -ModelPropertyTriPlanar=\u4e09\u5e73\u9762 -ModelPropertyShininess=\u5149\u4eae\u5ea6 -ModelPropertyModel=Model -ModelPropertyMethod=Method - -MaterialModelPropertyControlNoTexture=\u6ca1\u6709\u7eb9\u7406 -MaterialModelPropertyControlTextureSettings=\u7eb9\u7406\u8bbe\u7f6e -MaterialModelPropertyControlNoMaterial=\u5185\u5d4c\u7684\u6750\u8d28 -MaterialModelPropertyControlFlipY=\u5782\u76f4\u7ffb\u8f6c -MaterialModelPropertyControlWrapModeS=Horizontal wrap mode -MaterialModelPropertyControlWrapModeT=Vertical wrap mode -MaterialModelPropertyControlMagFilter=Magnification filter -MaterialModelPropertyControlMinFilter=Minification filter - -AbstractElementPropertyControlNoElement=\u6ca1\u6709\u5143\u7d20 -LayerPropertyControlNoLayer=\u6ca1\u6709\u5c42 -AudioKeyPropertyControlNoAudio=\u6ca1\u6709\u97f3\u9891 -ChooseFolderControlNoFolder=\u6ca1\u6709\u6587\u4ef6\u5939 - -RenameDialogTitle=\u91cd\u547d\u540d -RenameDialogNewNameLabel=\u65b0\u540d\u5b57 -RenameDialogButtonOk=\u91cd\u547d\u540d - -PlayAnimationSettingsDialogTitle=\u64ad\u653e\u8bbe\u7f6e - -ManualExtractAnimationDialogTitle=\u63d0\u53d6\u4e00\u6bb5\u5b50\u52a8\u753b -ManualExtractAnimationDialogName=\u540d\u79f0 -ManualExtractAnimationDialogNameExample=\u65b0\u7684\u52a8\u753b -ManualExtractAnimationDialogStartFrame=\u5f00\u59cb\u5e27 -ManualExtractAnimationDialogEndFrame=\u7ed3\u675f\u5e27 -ManualExtractAnimationDialogButtonOk=\u63d0\u53d6 - -QuestionDialogTitle=Question - -FolderCreatorDescription=\u65b0\u5efa\u76ee\u5f55 -FolderCreatorTitle=\u65b0\u5efa\u76ee\u5f55 -FolderCreatorFileNameLabel=\u76ee\u5f55\u540d - -EmptyFileCreatorDescription=\u65b0\u5efa\u7a7a\u767d\u6587\u4ef6 -EmptyFileCreatorTitle=\u521b\u5efa\u7a7a\u767d\u6587\u4ef6 - -ImageViewerEditorName=\u67e5\u770b\u56fe\u7247 - -AudioViewerEditorName=\u67e5\u770b\u97f3\u9891 -AudioViewerEditorDurationLabel=\u6301\u7eed\u65f6\u95f4 -AudioViewerEditorBitsPerSampleLabel=\u6bd4\u7279\u7387 -AudioViewerEditorChannelsLabel=\u58f0\u9053 -AudioViewerEditorDataTypeLabel=\u6570\u636e\u7c7b\u578b -AudioViewerEditorSampleRateLabel=\u91c7\u6837\u7387 - -SimpleDialogButtonOk=\u786e\u5b9a -SimpleDialogButtonSelect=\u9009\u62e9 -SimpleDialogButtonAdd=\u6dfb\u52a0 -SimpleDialogButtonSave=\u4fdd\u5b58 -SimpleDialogButtonGenerate=\u751f\u6210 -SimpleDialogButtonApply=\u5e94\u7528 -SimpleDialogButtonCreate=\u521b\u5efa -SimpleDialogButtonCancel=\u53d6\u6d88 -SimpleDialogButtonClose=\u5173\u95ed -SimpleDialogButtonYes=\u662f +ModelPropertyLacunarity=\u5B54\u9699\u5EA6 +ModelPropertyOctaves=\u516B\u8FB9\u5F62 +ModelPropertyMinScale=\u6700\u5C0F\u7F29\u653E\u6BD4\u4F8B +ModelPropertyMaxScale=\u6700\u5927\u7F29\u653E\u6BD4\u4F8B +ModelPropertyPadding=\u95F4\u9694 +ModelPropertyTriPlanar=\u4E09\u5E73\u9762 +ModelPropertyShininess=\u5149\u4EAE\u5EA6 +ModelPropertyModel=\u6A21\u578B +ModelPropertyMethod=\u65B9\u6CD5 + +MaterialModelPropertyControlNoTexture=\u6CA1\u6709\u7EB9\u7406 +MaterialModelPropertyControlTextureSettings=\u7EB9\u7406\u8BBE\u7F6E +MaterialModelPropertyControlNoMaterial=\u5185\u5D4C\u7684\u6750\u8D28 +MaterialModelPropertyControlFlipY=\u5782\u76F4\u7FFB\u8F6C +MaterialModelPropertyControlWrapModeS=\u6C34\u5E73\u5305\u56F4\u6A21\u5F0F +MaterialModelPropertyControlWrapModeT=\u5782\u76F4\u5305\u56F4\u6A21\u5F0F +MaterialModelPropertyControlMagFilter=\u653E\u5927\u6EE4\u6CE2 +MaterialModelPropertyControlMinFilter=\u7F29\u5C0F\u6EE4\u6CE2 + +AbstractElementPropertyControlNoElement=\u6CA1\u6709\u5143\u7D20 +LayerPropertyControlNoLayer=\u6CA1\u6709\u5C42 +AudioKeyPropertyControlNoAudio=\u6CA1\u6709\u97F3\u9891 +ChooseFolderControlNoFolder=\u6CA1\u6709\u6587\u4EF6\u5939 + +RenameDialogTitle=\u91CD\u547D\u540D +RenameDialogNewNameLabel=\u65B0\u540D\u5B57 +RenameDialogButtonOk=\u91CD\u547D\u540D + +PlayAnimationSettingsDialogTitle=\u64AD\u653E\u8BBE\u7F6E + +ManualExtractAnimationDialogTitle=\u63D0\u53D6\u4E00\u6BB5\u5B50\u52A8\u753B +ManualExtractAnimationDialogName=\u540D\u79F0 +ManualExtractAnimationDialogNameExample=\u65B0\u7684\u52A8\u753B +ManualExtractAnimationDialogStartFrame=\u5F00\u59CB\u5E27 +ManualExtractAnimationDialogEndFrame=\u7ED3\u675F\u5E27 +ManualExtractAnimationDialogButtonOk=\u63D0\u53D6 + +QuestionDialogTitle=\u95EE\u9898 + +FolderCreatorDescription=\u65B0\u5EFA\u76EE\u5F55 +FolderCreatorTitle=\u65B0\u5EFA\u76EE\u5F55 +FolderCreatorFileNameLabel=\u76EE\u5F55\u540D + +EmptyFileCreatorDescription=\u65B0\u5EFA\u7A7A\u767D\u6587\u4EF6 +EmptyFileCreatorTitle=\u521B\u5EFA\u7A7A\u767D\u6587\u4EF6 + +ImageViewerEditorName=\u67E5\u770B\u56FE\u7247 + +AudioViewerEditorName=\u67E5\u770B\u97F3\u9891 +AudioViewerEditorDurationLabel=\u6301\u7EED\u65F6\u95F4 +AudioViewerEditorBitsPerSampleLabel=\u6BD4\u7279\u7387 +AudioViewerEditorChannelsLabel=\u58F0\u9053 +AudioViewerEditorDataTypeLabel=\u6570\u636E\u7C7B\u578B +AudioViewerEditorSampleRateLabel=\u91C7\u6837\u7387 + +SimpleDialogButtonOk=\u786E\u5B9A +SimpleDialogButtonSelect=\u9009\u62E9 +SimpleDialogButtonAdd=\u6DFB\u52A0 +SimpleDialogButtonSave=\u4FDD\u5B58 +SimpleDialogButtonGenerate=\u751F\u6210 +SimpleDialogButtonApply=\u5E94\u7528 +SimpleDialogButtonCreate=\u521B\u5EFA +SimpleDialogButtonCancel=\u53D6\u6D88 +SimpleDialogButtonClose=\u5173\u95ED +SimpleDialogButtonYes=\u662F SimpleDialogButtonNo=\u5426 -SimpleDialogConvert=\u8f6c\u6362 -SimpleDialogImport=\u5bfc\u5165 - -CreateSkyDialogTitle=\u521b\u5efa\u5929\u7a7a -CreateSkyDialogSkyTypeSingle=\u5355\u4e2a\u7eb9\u7406 -CreateSkyDialogSkyTypeMultiple=\u591a\u4e2a\u7eb9\u7406 -CreateSkyDialogSkyType=\u5929\u7a7a\u7c7b\u578b -CreateSkyDialogNormalScale=Normal scale(x,y,z) -CreateSkyDialogMaterialFolder=\u6750\u8d28\u6587\u4ef6\u5939 -CreateSkyDialogMaterialName=\u6750\u8d28\u540d -CreateSkyDialogTexture=\u7eb9\u7406 -CreateSkyDialogTextureType=\u7eb9\u7406\u7c7b\u578b -CreateSkyDialogFlipY=\u5782\u76f4\u7ffb\u8f6c -CreateSkyDialogNorth=Front texture -CreateSkyDialogSouth=Back texture -CreateSkyDialogEast=Right texture -CreateSkyDialogWest=Left texture -CreateSkyDialogTop=Top texture -CreateSkyDialogBottom=Bottom texture - -EmptyModelCreatorDescription=\u65b0\u5efa\u6a21\u578b -EmptyModelCreatorTitle=\u521b\u5efa\u65b0\u6a21\u578b - -EmptySceneCreatorDescription=\u65b0\u5efa\u7a7a\u767d\u573a\u666f -DefaultSceneCreatorDescription=\u65b0\u5efa\u9ed8\u8ba4\u573a\u666f -EmptySceneCreatorTitle=\u521b\u5efa\u7a7a\u767d\u573a\u666f -DefaultSceneCreatorTitle=\u521b\u5efa\u9ed8\u8ba4\u573a\u666f - -GLSLFileEditorName=GLSL\u7f16\u8f91\u5668 -MaterialDefinitionFileEditorName=\u6750\u8d28\u5b9a\u4e49\u6587\u4ef6\u7f16\u8f91\u5668 - -GenerateTangentsDialogTitle=\u751f\u6210\u5207\u7ebf -GenerateTangentsDialogAlgorithmLabel=\u7b97\u6cd5\u7c7b\u578b -GenerateTangentsDialogSplitMirrored=Split vertices with mirrored UVs - -GenerateLoDDialogTitle=\u751f\u6210\u5c42\u6b21\u7ec6\u8282(LOD) -GenerateLoDDialogMethod=\u65b9\u6cd5 - -BoundingVolumeModelPropertyControlName=\u6a21\u578b\u5927\u5c0f -BoundingVolumeModelPropertyControlSphere=\u5305\u56f4\u7403 -BoundingVolumeModelPropertyControlSphereRadius=\u534a\u5f84 -BoundingVolumeModelPropertyControlBox=\u5305\u56f4\u76d2 - -NodeSelectorDialogTitle=\u8282\u70b9(Node)\u9009\u62e9\u5668 -SceneElementSelectorDialogTitle=Scene element selector - -GeometrySelectorDialogTitle=\u51e0\u4f55(Geometry)\u4f53\u9009\u62e9\u5668 -LightSelectorDialogTitle=\u706f\u5149\u9009\u62e9\u5668 - -LogViewTitle=\u65e5\u5fd7 - -CreateSceneAppStateDialogTitle=\u5411\u573a\u666f\u4e2d\u6dfb\u52a0\u72b6\u6001\u673a -CreateSceneAppStateDialogBuiltIn=\u5185\u7f6e\u72b6\u6001\u673a -CreateSceneAppStateDialogCustomBox=\u81ea\u5b9a\u4e49 -CreateSceneAppStateDialogCustomField=\u7c7b\u7684\u5168\u540d - -CreateSceneFilterDialogTitle=\u50cf\u573a\u666f\u4e2d\u6dfb\u52a0\u6ee4\u955c -CreateSceneFilterDialogBuiltIn=\u5185\u7f6e\u6ee4\u955c -CreateSceneFilterDialogCustomBox=\u81ea\u5b9a\u4e49 -CreateSceneFilterDialogCustomField=\u7c7b\u7684\u5168\u540d - -AddUserDataDialogTitle=\u6dfb\u52a0\u7528\u6237\u6570\u636e(UserData) - -CreateCustomControlDialogTitle=\u521b\u5efa\u81ea\u5b9a\u4e49\u63a7\u5236\u5668 -CreateCustomControlDialogBuiltIn=\u5185\u7f6e\u63a7\u5236\u5668 -CreateCustomControlDialogCustomBox=\u81ea\u5b9a\u4e49 -CreateCustomControlDialogCustomField=\u7c7b\u7684\u5168\u540d - -AnalyticsConfirmDialogMessage=\u60a8\u662f\u5426\u5141\u8bb8\u4e3a\u672c\u8f6f\u4ef6\u5f00\u542f\u8c37\u6b4c\u5206\u6790(GA)\u670d\u52a1\uff1f\u8fd9\u5c06\u5e2e\u52a9\u6211\u4eec\u6539\u8fdb\u8f6f\u4ef6\u8d28\u91cf\u3002 - -CreateBoxCollisionShapeDialogTitle=\u521b\u5efa\u7acb\u65b9\u4f53\u78b0\u649e\u5f62\u72b6 -CreateSphereCollisionShapeDialogTitle=\u521b\u5efa\u7403\u4f53\u78b0\u649e\u5f62\u72b6 -CreateCylinderCollisionShapeDialogTitle=\u521b\u5efa\u5706\u67f1\u4f53\u78b0\u649e\u5f62\u72b6 -CreateConeCollisionShapeDialogTitle=\u521b\u5efa\u5706\u9525\u4f53\u78b0\u649e\u5f62\u72b6 -CreateCapsuleCollisionShapeDialogTitle=\u521b\u5efa\u80f6\u56ca\u4f53\u78b0\u649e\u5f62\u72b6 -AddVehicleWheelDialogTitle=\u521b\u5efa\u8f66\u8f6e - -CreateTerrainDialogTitle=\u521b\u5efa\u5730\u5f62 -CreateTerrainDialogBaseTexture=\u57fa\u672c\u7eb9\u7406 -CreateTerrainDialogFolderAlphaTexture=\u8bf7\u9009\u62e9\u4fdd\u5b58AlphaMap\u7684\u76ee\u5f55 -CreateTerrainDialogTotalSize=\u603b\u8fb9\u957f -CreateTerrainDialogPatchSize=\u5757\u8fb9\u957f -CreateTerrainDialogAlphaBlendTextureSize=Alpha\u6df7\u5408\u7eb9\u7406\u8fb9\u957f -CreateTerrainDialogTerrainType=\u5730\u5f62\u7c7b\u578b -CreateTerrainDialogTerrainTypeFlat=\u8d85\u5e73\u5766 -CreateTerrainDialogTerrainTypeImageBased=\u57fa\u4e8e\u9ad8\u5ea6\u56fe -CreateTerrainDialogTerrainTypeHill=\u5c71\u5730 -CreateTerrainDialogHeightMapImage=\u9ad8\u5ea6\u56fe -CreateTerrainDialogHeightSmooth=\u9ad8\u5ea6\u56fe\u5e73\u6ed1\u5ea6 -CreateTerrainDialogHeightScale=\u9ad8\u5ea6\u7f29\u653e\u6bd4\u4f8b -CreateTerrainDialogIterations=\u8fed\u4ee3\u6b21\u6570 -CreateTerrainDialogFlattening=\u6241\u5e73\u7387 -CreateTerrainDialogMinRadius=\u6700\u5c0f\u534a\u5f84 -CreateTerrainDialogMaxRadius=\u6700\u5927\u534a\u5f84 - -CreateParticleEmitterPointShapeDialogTitle=\u521b\u5efa\u70b9\u72b6\u53d1\u751f\u5668 -CreateParticleEmitterBoxShapeDialogTitle=\u521b\u5efa\u76d2\u72b6\u53d1\u751f\u5668 -CreateParticleEmitterSphereShapeDialogTitle=\u521b\u5efa\u7403\u72b6\u53d1\u751f\u5668 -CreateParticleEmitterDomeShapeDialogTitle=\u521b\u5efa\u534a\u7403\u72b6\u53d1\u751f\u5668 -CreateParticleEmitterQuadShapeDialogTitle=\u521b\u5efa\u56db\u8fb9\u5f62\u72b6\u53d1\u751f\u5668 -CreateParticleEmitterTorusShapeDialogTitle=\u521b\u5efa\u5706\u73af\u72b6\u53d1\u751f\u5668 -CreateParticleEmitterTriangleShapeDialogTitle=\u521b\u5efa\u4e09\u89d2\u5f62\u53d1\u751f\u5668 - -ModelConverterDialogTitle=\u6a21\u578b\u8f6c\u6362 -ModelConverterDialogResultName=\u6587\u4ef6\u540d -ModelConverterDialogDestinationFolder=\u6587\u4ef6\u4fdd\u5b58\u76ee\u5f55 -ModelConverterDialogExportMaterials=\u5bfc\u51fa\u6750\u8d28 -ModelConverterDialogMaterialsFolder=\u6750\u8d28\u4fdd\u5b58\u76ee\u5f55 -ModelConverterDialogOverwriteMaterials=\u8986\u76d6\u540c\u540d\u6750\u8d28 - -ImportModelDialogTitle=\u5bfc\u5165\u6a21\u578b -ImportModelDialogExternalFile=\u5916\u90e8\u6587\u4ef6 -ImportModelDialogTexturesFolder=\u7eb9\u7406\u6240\u5728\u76ee\u5f55 -ImportModelDialogOverwriteTextures=\u8986\u76d6\u540c\u540d\u7eb9\u7406 - -FileDeleteHandlerDeleteMaterials=\u662f\u5426\u9700\u8981\u5220\u9664 %file_name% \u4e2d\u4f7f\u7528\u7684\u6240\u6709\u6750\u8d28? - -CheckNewVersionDialogTitle=\u66f4\u65b0\u4fe1\u606f -CheckNewVersionDialogHyperText=\u60a8\u53ef\u4ee5\u4e0b\u8f7d\u65b0\u7248\u672c: -CheckNewVersionDialogHeaderText=\u53ef\u7528\u66f4\u65b0\u7248\u672c: - -EditorScriptingComponentHeaders=\u811a\u672c\u6587\u4ef6\u5934 -EditorScriptingComponentBody=\u811a\u672c\u5185\u5bb9 -EditorScriptingComponentRun=\u8fd0\u884c\u811a\u672c - -AboutDialogTitle=\u5173\u4e8e -AboutDialogVersion=\u7248\u672c -AboutDialogProjectHome=\u9879\u76ee\u4e3b\u9875 -AboutDialogForumThread=\u8bba\u575b\u4e3b\u9898 -AboutDialogUsedLibraries=\u4f7f\u7528\u7684\u5e93 -AboutDialogUsedIcons=\u4f7f\u7528\u56fe\u6807 - -ResourcePropertyEditControlNothingIsSelected=\u672a\u9009\u62e9\u4efb\u4f55\u76ee\u6807 - -PluginsDialogTitle=\u63d2\u4ef6 -PluginsDialogFileChooserTitle=\u8bf7\u9009\u62e9\u63d2\u4ef6\u6587\u4ef6 -PluginsDialogFileChooserFilter=\u63d2\u4ef6\u6587\u4ef6\u4e3a .zip \u538b\u7f29\u6587\u4ef6 -PluginsDialogQuestion=\u6539\u52a8\u9700\u8981\u91cd\u65b0\u542f\u52a8\u7a0b\u5e8f\u65b9\u53ef\u751f\u6548. -PluginsDialogVersion=Version -PluginsDialogHomePage=Home page -PluginsDialogUsedDependencies=Used dependencies - -PaintingComponentContainerTool=Tool -PaintingComponentContainerNoTools=No tools -PaintingComponentTerrainEditor=Terrain editor -PaintingComponentSpawnModels=Spawn models +SimpleDialogConvert=\u8F6C\u6362 +SimpleDialogImport=\u5BFC\u5165 + +CreateSkyDialogTitle=\u521B\u5EFA\u5929\u7A7A +CreateSkyDialogSkyTypeSingle=\u5355\u4E2A\u7EB9\u7406 +CreateSkyDialogSkyTypeMultiple=\u591A\u4E2A\u7EB9\u7406 +CreateSkyDialogSkyType=\u5929\u7A7A\u7C7B\u578B +CreateSkyDialogNormalScale=\u6CD5\u7EBF\u7F29\u653E\u6BD4\u4F8B(x,y,z) +CreateSkyDialogMaterialFolder=\u6750\u8D28\u6587\u4EF6\u5939 +CreateSkyDialogMaterialName=\u6750\u8D28\u540D +CreateSkyDialogTexture=\u7EB9\u7406 +CreateSkyDialogTextureType=\u7EB9\u7406\u7C7B\u578B +CreateSkyDialogFlipY=\u5782\u76F4\u7FFB\u8F6C +CreateSkyDialogNorth=\u6B63\u9762\u7EB9\u7406 +CreateSkyDialogSouth=\u80CC\u9762\u7EB9\u7406 +CreateSkyDialogEast=\u53F3\u9762\u7EB9\u7406 +CreateSkyDialogWest=\u5DE6\u9762\u7EB9\u7406 +CreateSkyDialogTop=\u9876\u9762\u7EB9\u7406 +CreateSkyDialogBottom=\u5E95\u9762\u7EB9\u7406 + +EmptyModelCreatorDescription=\u65B0\u5EFA\u6A21\u578B +EmptyModelCreatorTitle=\u521B\u5EFA\u65B0\u6A21\u578B + +EmptySceneCreatorDescription=\u65B0\u5EFA\u7A7A\u767D\u573A\u666F +DefaultSceneCreatorDescription=\u65B0\u5EFA\u9ED8\u8BA4\u573A\u666F +EmptySceneCreatorTitle=\u521B\u5EFA\u7A7A\u767D\u573A\u666F +DefaultSceneCreatorTitle=\u521B\u5EFA\u9ED8\u8BA4\u573A\u666F + +GLSLFileEditorName=GLSL\u7F16\u8F91\u5668 +MaterialDefinitionFileEditorName=\u6750\u8D28\u5B9A\u4E49\u6587\u4EF6\u7F16\u8F91\u5668 + +GenerateTangentsDialogTitle=\u751F\u6210\u5207\u7EBF +GenerateTangentsDialogAlgorithmLabel=\u7B97\u6CD5\u7C7B\u578B +GenerateTangentsDialogSplitMirrored=\u6839\u636E\u955C\u50CFUV\u5206\u5272\u9876\u70B9 + +GenerateLoDDialogTitle=\u751F\u6210\u5C42\u6B21\u7EC6\u8282(LOD) +GenerateLoDDialogMethod=\u65B9\u6CD5 + +BoundingVolumeModelPropertyControlName=\u6A21\u578B\u5927\u5C0F +BoundingVolumeModelPropertyControlSphere=\u5305\u56F4\u7403 +BoundingVolumeModelPropertyControlSphereRadius=\u534A\u5F84 +BoundingVolumeModelPropertyControlBox=\u5305\u56F4\u76D2 + +NodeSelectorDialogTitle=\u8282\u70B9(Node)\u9009\u62E9\u5668 +SceneElementSelectorDialogTitle=\u573A\u666F\u5143\u7D20\u9009\u62E9\u5668 + +GeometrySelectorDialogTitle=\u51E0\u4F55(Geometry)\u4F53\u9009\u62E9\u5668 +LightSelectorDialogTitle=\u706F\u5149\u9009\u62E9\u5668 + +LogViewTitle=\u65E5\u5FD7 + +CreateSceneAppStateDialogTitle=\u5411\u573A\u666F\u4E2D\u6DFB\u52A0\u72B6\u6001\u673A +CreateSceneAppStateDialogBuiltIn=\u5185\u7F6E\u72B6\u6001\u673A +CreateSceneAppStateDialogCustomBox=\u81EA\u5B9A\u4E49 +CreateSceneAppStateDialogCustomField=\u7C7B\u7684\u5168\u540D + +CreateSceneFilterDialogTitle=\u50CF\u573A\u666F\u4E2D\u6DFB\u52A0\u6EE4\u955C +CreateSceneFilterDialogBuiltIn=\u5185\u7F6E\u6EE4\u955C +CreateSceneFilterDialogCustomBox=\u81EA\u5B9A\u4E49 +CreateSceneFilterDialogCustomField=\u7C7B\u7684\u5168\u540D + +AddUserDataDialogTitle=\u6DFB\u52A0\u7528\u6237\u6570\u636E + +CreateCustomControlDialogTitle=\u521B\u5EFA\u81EA\u5B9A\u4E49\u63A7\u5236\u5668 +CreateCustomControlDialogBuiltIn=\u5185\u7F6E\u63A7\u5236\u5668 +CreateCustomControlDialogCustomBox=\u81EA\u5B9A\u4E49 +CreateCustomControlDialogCustomField=\u7C7B\u7684\u5168\u540D + +AnalyticsConfirmDialogMessage=\u60A8\u662F\u5426\u5141\u8BB8\u4E3A\u672C\u8F6F\u4EF6\u5F00\u542F\u8C37\u6B4C\u5206\u6790(GA)\u670D\u52A1\uFF1F\u8FD9\u5C06\u5E2E\u52A9\u6211\u4EEC\u6539\u8FDB\u8F6F\u4EF6\u8D28\u91CF\u3002 + +CreateBoxCollisionShapeDialogTitle=\u521B\u5EFA\u7ACB\u65B9\u4F53\u78B0\u649E\u5F62\u72B6 +CreateSphereCollisionShapeDialogTitle=\u521B\u5EFA\u7403\u4F53\u78B0\u649E\u5F62\u72B6 +CreateCylinderCollisionShapeDialogTitle=\u521B\u5EFA\u5706\u67F1\u4F53\u78B0\u649E\u5F62\u72B6 +CreateConeCollisionShapeDialogTitle=\u521B\u5EFA\u5706\u9525\u4F53\u78B0\u649E\u5F62\u72B6 +CreateCapsuleCollisionShapeDialogTitle=\u521B\u5EFA\u80F6\u56CA\u4F53\u78B0\u649E\u5F62\u72B6 +AddVehicleWheelDialogTitle=\u521B\u5EFA\u8F66\u8F6E + +CreateTerrainDialogTitle=\u521B\u5EFA\u5730\u5F62 +CreateTerrainDialogBaseTexture=\u57FA\u672C\u7EB9\u7406 +CreateTerrainDialogFolderAlphaTexture=\u8BF7\u9009\u62E9\u4FDD\u5B58AlphaMap\u7684\u76EE\u5F55 +CreateTerrainDialogTotalSize=\u603B\u8FB9\u957F +CreateTerrainDialogPatchSize=\u5757\u8FB9\u957F +CreateTerrainDialogAlphaBlendTextureSize=Alpha\u6DF7\u5408\u7EB9\u7406\u8FB9\u957F +CreateTerrainDialogTerrainType=\u5730\u5F62\u7C7B\u578B +CreateTerrainDialogTerrainTypeFlat=\u8D85\u5E73\u5766 +CreateTerrainDialogTerrainTypeImageBased=\u57FA\u4E8E\u9AD8\u5EA6\u56FE +CreateTerrainDialogTerrainTypeHill=\u5C71\u5730 +CreateTerrainDialogHeightMapImage=\u9AD8\u5EA6\u56FE +CreateTerrainDialogHeightSmooth=\u9AD8\u5EA6\u56FE\u5E73\u6ED1\u5EA6 +CreateTerrainDialogHeightScale=\u9AD8\u5EA6\u7F29\u653E\u6BD4\u4F8B +CreateTerrainDialogIterations=\u8FED\u4EE3\u6B21\u6570 +CreateTerrainDialogFlattening=\u6241\u5E73\u7387 +CreateTerrainDialogMinRadius=\u6700\u5C0F\u534A\u5F84 +CreateTerrainDialogMaxRadius=\u6700\u5927\u534A\u5F84 + +CreateParticleEmitterPointShapeDialogTitle=\u521B\u5EFA\u70B9\u72B6\u53D1\u751F\u5668 +CreateParticleEmitterBoxShapeDialogTitle=\u521B\u5EFA\u76D2\u72B6\u53D1\u751F\u5668 +CreateParticleEmitterSphereShapeDialogTitle=\u521B\u5EFA\u7403\u72B6\u53D1\u751F\u5668 +CreateParticleEmitterDomeShapeDialogTitle=\u521B\u5EFA\u534A\u7403\u72B6\u53D1\u751F\u5668 +CreateParticleEmitterQuadShapeDialogTitle=\u521B\u5EFA\u56DB\u8FB9\u5F62\u72B6\u53D1\u751F\u5668 +CreateParticleEmitterTorusShapeDialogTitle=\u521B\u5EFA\u5706\u73AF\u72B6\u53D1\u751F\u5668 +CreateParticleEmitterTriangleShapeDialogTitle=\u521B\u5EFA\u4E09\u89D2\u5F62\u53D1\u751F\u5668 + +ModelConverterDialogTitle=\u6A21\u578B\u8F6C\u6362 +ModelConverterDialogResultName=\u6587\u4EF6\u540D +ModelConverterDialogDestinationFolder=\u6587\u4EF6\u4FDD\u5B58\u76EE\u5F55 +ModelConverterDialogExportMaterials=\u5BFC\u51FA\u6750\u8D28 +ModelConverterDialogMaterialsFolder=\u6750\u8D28\u4FDD\u5B58\u76EE\u5F55 +ModelConverterDialogOverwriteMaterials=\u8986\u76D6\u540C\u540D\u6750\u8D28 + +ImportModelDialogTitle=\u5BFC\u5165\u6A21\u578B +ImportModelDialogExternalFile=\u5916\u90E8\u6587\u4EF6 +ImportModelDialogTexturesFolder=\u7EB9\u7406\u6240\u5728\u76EE\u5F55 +ImportModelDialogOverwriteTextures=\u8986\u76D6\u540C\u540D\u7EB9\u7406 + +FileDeleteHandlerDeleteMaterials=\u662F\u5426\u9700\u8981\u5220\u9664 %file_name% \u4E2D\u4F7F\u7528\u7684\u6240\u6709\u6750\u8D28? + +CheckNewVersionDialogTitle=\u66F4\u65B0\u4FE1\u606F +CheckNewVersionDialogHyperText=\u60A8\u53EF\u4EE5\u4E0B\u8F7D\u65B0\u7248\u672C: +CheckNewVersionDialogHeaderText=\u53EF\u7528\u66F4\u65B0\u7248\u672C: + +EditorScriptingComponentHeaders=\u811A\u672C\u6587\u4EF6\u5934 +EditorScriptingComponentBody=\u811A\u672C\u5185\u5BB9 +EditorScriptingComponentRun=\u8FD0\u884C\u811A\u672C + +AboutDialogTitle=\u5173\u4E8E +AboutDialogVersion=\u7248\u672C +AboutDialogProjectHome=\u9879\u76EE\u4E3B\u9875 +AboutDialogForumThread=\u8BBA\u575B\u4E3B\u9898 +AboutDialogUsedLibraries=\u4F7F\u7528\u7684\u5E93 +AboutDialogUsedIcons=\u4F7F\u7528\u56FE\u6807 + +ResourcePropertyEditControlNothingIsSelected=\u672A\u9009\u62E9\u4EFB\u4F55\u76EE\u6807 + +PluginsDialogTitle=\u63D2\u4EF6 +PluginsDialogFileChooserTitle=\u8BF7\u9009\u62E9\u63D2\u4EF6\u6587\u4EF6 +PluginsDialogFileChooserFilter=\u63D2\u4EF6\u6587\u4EF6\u4E3A .zip \u538B\u7F29\u6587\u4EF6 +PluginsDialogQuestion=\u6539\u52A8\u9700\u8981\u91CD\u65B0\u542F\u52A8\u7A0B\u5E8F\u65B9\u53EF\u751F\u6548. +PluginsDialogVersion=\u7248\u672C +PluginsDialogHomePage=\u4E3B\u9875 +PluginsDialogUsedDependencies=\u4F7F\u7528\u7684\u4F9D\u8D56\u5E93 + +PaintingComponentContainerTool=\u5DE5\u5177 +PaintingComponentContainerNoTools=\u65E0 +PaintingComponentTerrainEditor=\u5730\u5F62\u7F16\u8F91\u5668 +PaintingComponentSpawnModels=\u751F\u6210\u6A21\u578B PaintingComponentSpawnModelsMethodAsIs=As Is -PaintingComponentSpawnModelsMethodLink=Using links -PaintingComponentSpawnModelsMethodBatch=Using batches \ No newline at end of file +PaintingComponentSpawnModelsMethodLink=\u4F7F\u7528\u94FE\u63A5(Link) +PaintingComponentSpawnModelsMethodBatch=\u4F7F\u7528\u5408\u6279(Batch) From 62ac2a1502809190aaad01e3fed97db68d02bd33 Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Mon, 21 May 2018 10:02:54 +0300 Subject: [PATCH 45/49] updated plugins, continue refactoring terrain tool. --- ...1.1.0.jar => jmb-font-generator-1.1.1.jar} | Bin 13532 -> 13949 bytes ...ol-1.2.0.jar => jmb-sky-control-1.2.1.jar} | Bin 25657 -> 26256 bytes ....1.1.jar => jmb-tonegod-emitter-1.1.2.jar} | Bin 140083 -> 140403 bytes .../{emitter-3.0.1.jar => emitter-3.0.2.jar} | Bin 161823 -> 162926 bytes ...1.2.1.jar => jmb-tree-generator-1.2.2.jar} | Bin 85879 -> 87013 bytes .../painting/spawn/SpawnToolControl.java | 8 +- .../impl/AbstractPaintingComponent.java | 127 +----- .../property/PaintingPropertyDefinition.java | 13 + .../PropertiesBasedPaintingComponent.java | 80 ++-- .../spawn/SpawnPaintingComponent.java | 37 +- .../terrain/TerrainPaintingComponent.java | 408 ++++-------------- 11 files changed, 179 insertions(+), 494 deletions(-) rename embedded-plugins/jmb-font-generator/{jmb-font-generator-1.1.0.jar => jmb-font-generator-1.1.1.jar} (75%) rename embedded-plugins/jmb-sky-control/{jmb-sky-control-1.2.0.jar => jmb-sky-control-1.2.1.jar} (55%) rename embedded-plugins/jmb-tonegod-emitter/{jmb-tonegod-emitter-1.1.1.jar => jmb-tonegod-emitter-1.1.2.jar} (88%) rename embedded-plugins/jmb-tonegod-emitter/libs/{emitter-3.0.1.jar => emitter-3.0.2.jar} (98%) rename embedded-plugins/jmb-tree-generator/{jmb-tree-generator-1.2.1.jar => jmb-tree-generator-1.2.2.jar} (87%) diff --git a/embedded-plugins/jmb-font-generator/jmb-font-generator-1.1.0.jar b/embedded-plugins/jmb-font-generator/jmb-font-generator-1.1.1.jar similarity index 75% rename from embedded-plugins/jmb-font-generator/jmb-font-generator-1.1.0.jar rename to embedded-plugins/jmb-font-generator/jmb-font-generator-1.1.1.jar index 36f0d609d59f2310a9f008a549ad29f6733c22a6..cd11499dce64353a8937122532246ba353c97b51 100644 GIT binary patch delta 2049 zcmZXVdo&aN8^`AwGbN_ttF)v|k~a&U4QDIp=wQ^8V>7kF}PN1Ofmu zGJrILsxoxvzf`Ar+B34NOGFJ?vcJFj#K94?)BLPj^c*X46$wscSNKq0tT zXD`g4;Sr!p*lPC>0-EV&)ze|Z*3TTO$B$;=_b2(x(6w|5<#Gr_Y@gINXuWYoNajRs z$hXFd^`CR;redF7ckZuSD5wql81HYhA8|jlap^A)MWzOi#wWnT9<=ORl-1TO{Y0ZO z_BXZU7=$ridD2)@tF?JhTtd>*@kQjn0zi$mL4>iSE(d-G$-QuK7kVPMNW6@l<$3mNM;Ay-z-7;-Fb!Ow&D-wW|&FHt z9yEIG+w$5gBT&62SIAEjx?RTm9WLQyE2eIptqywe#cMm{J=jhEk2rMD?s9`>^6KqF zTFIT}rsUl~g0uDy1GGI6-a*u?tZGO>J{Z5&-Vgl#N}tBD0UdB7 zG1^L`SiCpFq|OUDKp*NtTZ-U@h72uu0WYVV2rR5>7;lYp{?^J*eOIsi5*Awzy8Joq zj?JMTDMXs2LAxT`+vTBrq;KVRXPi2JcI^V@+#U5= z@+c)~qfPl#q5pf=f^_xvv-@4anuf|>*JjQQ7(HroM^C}}?x|46cZSs*w3bX9_twnJ zv*q@_AC>!-+&f_Vc4=P;Ce$HUKAWSQD`%pRS6S5Ce84YDsf&o4WQS_ya+t4pT47Pw zl)iVzGO^V*FIZ2x@a5KF(eRyn}a& zWoOX?ktWRfk|1h6xle&GwAFrF$B>`XbOg$1TGluB0^0-A2ZgaqLZ;0?T}4*Vtg~dn znIHU}Z@A|#cw5!^Vs(&9bCvP9i_ne9rhBe&7tMX{hMpw4b!OQ%8Zwyp$Iec`gp@LL z_2Z0!8`DE;%IqO_^*hS2*--;#BwnSR%UB8Xa04&*Q-@QV8*!%tZ%5C|teB*8m#!^8 zjZUhrayipl`u)IY;5vpyFu_iE8ZlSZVILfH^%aJ(M8!I3epXpu+LZF*6EkbRW8y?n zc6SC+-WT288Th0Jh5JQxx&j`Ns6fr%I~ZDXXvq(f>G%S2j04k7P;GUFSx3D2ZsZiOJ*(2wmh|po@8CYD)fx zd6fJw+Bok@0Vn8z+Fo>E)c){i@#O*O<@8bf-X0yE^hKU9=jE;s_AN{80>hRF-WBT5 zY@wx5&GZfWV8dzr>oN2Ku`LGHpz&vGEVc2zVda+Z60=mus!w{oepo1U)YdWyF<0i4 z>hVXR-7hE+NL-)(3dq?dhgpM)X>y3qk_0N@EdduZ zqK`b4ojty%N0^>}I&yqN0$7==wGBI!8~002me0|2G~Is^r$x>K&WqwNlpuU{j3T@Up3 z3W!T=_7O)Y(B^KXDIo8M_DAt&FxFDdd%)LaRZ&^>);3$0r;N2=a&CFaOnBI5Q;*WQ z-rkVob=*^5pa0lJ1Fx~Fog;|`=$M!U2kUL}9mEKDD7$P)xtIS--TiGiENV@EG2H*u zOWB%UkYWK9>u-iS*KmnVt`oA>9oe8hCGA_xQ)*Tl$*%QmNZ?z)#;Tj~b=jylCS$?N z-}G0eaEt!P7sogWLuU=&j03UQ4lA2=!xoZ{-QkBhsB4p#bUZazzYLoP94X@*vnYrb zk7QVP)b5J;t*)3jSmHmXY4ckKfHxk{?t1!;(4T_h^5FgB1)nziAX}Z(FrKv-c48jr}&%W|BlKClJ4dzp#QfDthJQ% RW{=|U*Cqu3FyWiOe*AN zwoaokdKv2+)kK9PB*VFBCA#dNd!9d@&-eR0fB&A{=vR@Hb&XC9MM=u2JPj!clO1K2 zd7QCMAkpF_QN$>$lB;rtOo_d$ns;QYKe<|Zyk&}^+yVpZTLhpo{Zl(>VX^>r_o_g* zpntb`@5qcC>$=XDe-oTOSVvr8l>B%LlcBK3XxY{L6L5ET!;rSC#Au_CK{LRyGX z6)W@r?X1UqAiO{2)^PY^W^kJtunN+dopxaKP)koR(L5i%(RegSZ{rp{3Ll*D`N_XE ziz}bMejGwN#S+Mv-irz6S^rGmWFVi8TP-r|6Y4O%I0ayMsR7E}b&SCPh7GDJp?b@s z&fNJKlfY?I$5FCt44a2r`s~&X!6Q z-Ubmdez$Qa-7ms&PAN9#dx#du%|MthAwMi>DFT20t#bB*vHZcSORBy7-1NwYn_-24 zH=R%2L!UtTue4H+jg?+_I zMsB(INl(vR58rNVb>qD4MU{N0hM(X~sQMEB-tzhL+3ev3CBSFwPQR_$F;3tiW;zR> z#xL{2j;{7JI@dd;#(>(c`Z+)DcERvm7QAq|EokEat9K~wV%NA_KrRWRYIvVFPE#-H z@;emM3SIQ5mE)pO9yEopq*w1f>BBNCfNfl5FjR?rmhb=L(iP|f89kZf%#l@ep&2ZCn zt}%2|y9!1{V(Q4SX?sXHuYNrDijP~3T~@n~NMlxaqgCCG9$l7*LpSmIt?2yMKI5+o z)>8&nE-Vi|S1!>130x%95Z3(l1N%WjAKiz!zp2$^UA@-^2tAx^KW?C*Ub&pY$t$=n%V~@ZX~|Ekge@j6Q{P&)~%;I4B%DN~8%l|P@q;`>YQM#&w*Apa^Q zDUZeEH2tn9qU2p}WBbvm9y|j^>B$P2EbtrRhvd+{#&zTzBdqXOu>aItX7Z%tmZUHV z{v(&nKPDjBjKtW$nO4T<%(*w8AIzwR+TN&2WPze{GYsw!zOd??j-9qF#@~X!)~k&p z30lpFRHC3^nJ<0D7oS*!Z(5+OvCZzezd%1siV$7t2;w|%SSbgF!%KuNeXi%yDJoCr zpz^kroSp2jj+wzP@>x|4L8OtsF)f3LL&^Bi+n$_Bv#*-vLG-#ae3#3az`u`DMRaTK zQxMmann1C?i_^@*+2rl{c-W~=LUMzYWCH2L-`bm1=U=rgpamOx@#>i3;fmw%>WyMW zRm7f9FK|+OPOj(MwRfW+!HbQx%92wmeh>Q~As2IE8d>=ej`z6<<>N0ki_<=0F|n6K zD%M1Ys93%`-m-i(#KtitR{jysT8ABX^yT;?qkq0x&g0}Toyyl@bd{3M6I zZ1r)wmKn)jp?9W9k&N!{LMAoB@aNGDpxvBRr{^OrM0S#nT*MA<5~4%p|QBUiNc`8@=&&onLlO0nwfX-&U`<2B=L4nz;w2Q}B<9PAC^4@g9K>v5h7r#~vkPLs fY33|uOY<=CtTM+bOG!(7FNN=om6DK%g74FRo7*m{ diff --git a/embedded-plugins/jmb-sky-control/jmb-sky-control-1.2.0.jar b/embedded-plugins/jmb-sky-control/jmb-sky-control-1.2.1.jar similarity index 55% rename from embedded-plugins/jmb-sky-control/jmb-sky-control-1.2.0.jar rename to embedded-plugins/jmb-sky-control/jmb-sky-control-1.2.1.jar index 56a86368877c635599281cdefd933b3c5e7a5d00..10df5a95bbdfda0a74bfd9581ed6620a04aee308 100644 GIT binary patch delta 3022 zcmZ9O2{@G7AIE1b8OvZ?+c1_aL&g?miKeV&UuLW`_FZL7)_N0JDnki4PP;HQbP<@bPP=j4IEJ8Ke!C*hfdloR@;G*vZQ#|Z!VC@{g5jcWD z%(H?CL7}5y0xvWOsyCoT`k{y&IZFkFDIeFJ)$>shh!&ZlA<-a#gtGy&rTR6&22|00 z=TP1+^BfkVD8IXnVompwy*{CPpH>En<$6i^eKpI?3wHQMJ4i>=uK5p3);2xOb+zx# z8K@YS2(s2=k&*i%%n(Hhu6QBn&5APug+TJLakiH$y)Rg>&p%4NCsA3Jgc;#PL>ONo zU}&s&MA4{mkz&>Fss;QMj3<&@h3+$b<*_EUHcqppY4Hpsv`~nlJL!}@NdLB#E6UGc zPq6E`vErAqWzk`ghBWj5U;FUU)l1B%pj41=|%kB@!xWDkk) z8^v5BQpRYNm~Q&S#$=P{m|ou@&zzS)u9QtlanGhHgf>u=jn{sn|M&=~5;Ke%BW^s{(RxH|?ZpQKKa;kE>0ZgBEHCN@`rc*5+=c@ucSA+K)KALh)u-t`7x& zz$fseemvB@iF(H0i8u#Y9J3Q#-0dpD)*@i@GSr6 ze9Ym=)oQPX&=gh+%tdabcVaVK7Q2Z6ibX31n|(-^2LVMytKXVA^^3ez6CHR!Fw?pw zYSy6Q!u!ovAp?C#d!n&wYB~#lwDF~V@;&sM0bM1;Xti8lSk#ujVHn5QBlTRHaQJq2 zl~ixN?jj4<5M0nfHU}4Llbu7lI&sk2`a~2)B9RV+s7VuVLvMsw-R{dx7J2(10%v%* zA0}2i0w8M!N(}F67GKhpdI#G+)$dUuaN8lh>`I7xegE||@2q)hOXlMz7tpospPp13 zPxkM-6WLt*`+QuItgHGBC~vk@8wSCe!5MxWr2wz;+)>))zyY`F%Nsv*|ibeEnn@Aa;=YEK~fjbmmD}brW#~Hd44m>dJ@{+p!Duc?CmqWB>k_=7lAaU zf}{Wte#xopY0SWehkFtBrIf(06WANmrNQK%$ug@);EF;+-vTR5)5`)_d;}l0Q?S?7 z%VA$>hn`=bQnPt7V0v9rKC8B$yiV8zBp}KwV>eEk7<)mKTn4+ z|NIz>g9^P$uJ;|ed&i6#w2D<`8#Am#x?bri#xE>HI!a{-1@>XZ9!6HwNs(9zXwaX} zQPY^NkuJY!%TAW>VaVlq+u4~PF*+Ky2z`S!u2dSN2=o51GN0NY-tQFMS4;|-;; znjrl;GRs#&=9c7%w}ok9$!0aM1E?s#w>FAqUoRy`KX={u@DF;1EOIIKth-8FSo_CH z=!!$p2bPgSi+I&YPPZ!q1^7XYlUOhUa#4|$CG=2Pv8f&B)aGtYZ zjo>i9vRt~{i%dK(+b&fY?l>HyeCI%cU7B^?k^}SLHAFFXX(y0PWn1;#+#z@8KVDVVm2hi_RxF8hGaS7n^Me`>_65 zW!VrmV&0=WRUWCzWxCLw+mUho28r;27@%w^?Z2OQK!&8QJej<$Wmc`q<+6cySn1t)`M*4s_i?~Mq6yB5mp@AzHa|xgrI5N)4-4c1(*aYg+TPl2zxakF3`is zS~V;pG|VsJY>;1M2HA=89;DvpjI5044TT-sK9 z>CU`oalSz7sb!3O<}ErU>PD?dXXeilCbDlk~m=^8fZhrJcA(biQ82=f#vl5VM5(Ho4k?~PlOA5; zWSE-<7$0>D0a@d=x0tBAAK1U>?(%o-y8B+OvPU?WEAp@g$?(`)*vr!q>{C1~K*GH6 zAU(XSK-PNgjTd={lV!a%!JLb?7sz&RU+LW!{MQxu>rdQ8W1>8s3`L^Is`di<|GgEq z7El&J*1x}%Eq5pUy#u=)u<=8-320ohLO1~}LF1fNZ@OtM_->U$B8xx&&itq~L shj?z~|0-voW%!hLZs^pGyxPAesX2j@kiG)EiV#J}5F7$2ciye|AJ{<(g#Z8m delta 2431 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 VUXYg38RiUwU4p@GZU84e{{tSF$TR=| delta 5855 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 diff --git a/embedded-plugins/jmb-tonegod-emitter/libs/emitter-3.0.1.jar b/embedded-plugins/jmb-tonegod-emitter/libs/emitter-3.0.2.jar similarity index 98% rename from embedded-plugins/jmb-tonegod-emitter/libs/emitter-3.0.1.jar rename to embedded-plugins/jmb-tonegod-emitter/libs/emitter-3.0.2.jar index 6d83986d53b379c4cbea6cf694d2ea9096d2faa2..f653d7e1087835c93e2a1f081ee3127bb6bf7080 100644 GIT binary patch delta 1334 zcmbRLf%DxDPTl}-W)?061`ZAeEu*cCysf;9TX~seO_+ha>AEINrXa@hR1+p<5Mz6W zIn!bjHhP}&~ulcLym$4k)YRf)tY1@GUCRSbE#SdBDXtpG(&!43kYz`Q*`G3&5Etg!jweq5MU7Q=Ma zJBZ`^W{Y-9XUS(#*F2xGZ+tp;#)p}cm!z+{^QmZY5dU6=@NaXEo_tXqmv`_4vye{8 z?0tR@mNfX)Dt6~;nhDQru03M;M&ZoN%4JXP^)BuTPG9%P>C}4Be6#nfdkyS3BiDAn zV^#Ix=Dc~xTH(USe*Uk4Tx;Iev%XUfYkx2IeEq%7{JWYH&9#G`g@^`T)ShbOdtvp( zY}FcdslJfwrHXfaj_tDSsn+Oz=l$iWd}YEBt*E&j6+LqN{%_jMKh!>U{o?zLX;x{n zPRidiQ_I!V9?zUvHlfQ`D>9LrquHR5_trjN*QHFeJXX%~Zplko@Paksq2sKFKkJ_~ zdVjoU_UCwjz1TFV&4*`nMZbF$w=H7TnXX)!&l3L1%A0pq)@62=cF(*aS0-`2<<*Dg z8%L5kjJt|Yo3l<|&m|Qs*Z)0#;>0Vfq|4uJR5@n!K}hSvx*uz|O<2Ju@SIUH#Ju&F z#$OdS@!HGjFHSR6Ejd4DhRub8Zq8pjWKE zZ;4SqGU@Ex(=6{4zU;QzB=G6OrYSlbAJ_b;ndPyGvub-BK6(%yBSb$pMXem(V`YtgFWRqv_=eYajdow@3`)-B0B?Z4J9T&_3o z^pzFbkBeGgPA%Gb=*g*{%qS(rbO{G0HE?EkbYPmz4`$u>XS%8iVol#(%H#}Y{4He) z0W(6%pp4aJOaWjK{!k|A>5}D4nqZ!5Ia9bIYKg(XV8nm`TN=3?n5Mt6VNz1SC_e(c z8JR?w;icI0`Q=Q~R==E?7)nwrN=l1Ti}le|_o^WA_z+uwlpfcFij71 ZU=kGz@MdKL$>agyObrHx{lQE?9suA5LU;fG delta 272 zcmaF&gLD1|&glvh8KoMfTBR7bN-+tTFbA7YnXYTXWC~&|Pc>m;1~Im0m^1BW0<+Yt zn5w|6$(dG))BoBqaZW#L!^8uYyJN#-306Oy-GxaFEM(xqG@E~VZ7!3*_S?ZsCsaX# z)0b5;IfEH*Dw#sS4Cg8+V^$SY09b@EoJo2*M>Ufsm}gSW6b@#*t7ek6;&xzSC`qj- zDJ@DZ)(`MzWD;TKVqoClU;rBK^FbqObrwGZLn;u9Fd)E|MiU37=?*STqGAEwtZX2O QTp+a6U|_i5&jjQF02E+K1ONa4 diff --git a/embedded-plugins/jmb-tree-generator/jmb-tree-generator-1.2.1.jar b/embedded-plugins/jmb-tree-generator/jmb-tree-generator-1.2.2.jar similarity index 87% rename from embedded-plugins/jmb-tree-generator/jmb-tree-generator-1.2.1.jar rename to embedded-plugins/jmb-tree-generator/jmb-tree-generator-1.2.2.jar index d125c6a499c96145985c05ae942514941f3e68ca..a9e47cef10f90ecab60ab80a4005df1b5e0287da 100644 GIT binary patch delta 5036 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 n$H|@<1 delta 3968 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 changeBrushSize(newValue)); - - final Label brushPowerLabel = new Label(Messages.MODEL_PROPERTY_BRUSH_POWER + ":"); - brushPowerLabel.prefWidthProperty().bind(widthProperty().multiply(LABEL_PERCENT)); - - brushPowerField = new FloatTextField(); - brushPowerField.prefWidthProperty().bind(widthProperty().multiply(FIELD_PERCENT)); - brushPowerField.setScrollPower(3F); - brushPowerField.setMinMax(0.0001F, Integer.MAX_VALUE); - brushPowerField.addChangeListener((observable, oldValue, newValue) -> changeBrushPower(newValue)); - - final GridPane settings = new GridPane(); - settings.add(brushSizeLabel, 0, 0); - settings.add(brushSizeField, 1, 0); - settings.add(brushPowerLabel, 0, 1); - settings.add(brushPowerField, 1, 1); - - FXUtils.addClassTo(settings, CssClasses.DEF_GRID_PANE); - FXUtils.addClassTo(brushSizeLabel, brushPowerLabel, CssClasses.ABSTRACT_PARAM_CONTROL_PARAM_NAME_SINGLE_ROW); - FXUtils.addClassTo(brushSizeField, brushPowerField, CssClasses.PROPERTY_CONTROL_COMBO_BOX); - - return settings; - } - @Override public void loadState(@NotNull EditorState editorState) { var state = editorState.getOrCreateAdditionalState(getStateType(), getStateConstructor()); @@ -168,54 +115,6 @@ public void loadState(@NotNull EditorState editorState) { */ @FxThread protected void readState(@NotNull S state) { - getBrushSizeField().setValue(state.getBrushSize()); - getBrushPowerField().setValue(state.getBrushPower()); - } - - /** - * Change brush sizes. - */ - @FromAnyThread - protected void changeBrushSize(@NotNull final Float size) { - - if (state != null) { - state.setBrushSize(size); - } - - EXECUTOR_MANAGER.addJmeTask(() -> setBrushSize(size)); - } - - /** - * Set the brush size. - * - * @param size the brush size. - */ - @JmeThread - protected void setBrushSize(@NotNull Float size) { - getToolControl().setBrushSize(size); - } - - /** - * Change brush powers. - */ - @FromAnyThread - protected void changeBrushPower(@NotNull Float power) { - - if (state != null) { - state.setBrushPower(power); - } - - EXECUTOR_MANAGER.addJmeTask(() -> setBrushPower(power)); - } - - /** - * Set the brush power. - * - * @param power the brush power. - */ - @JmeThread - protected void setBrushPower(@NotNull Float power) { - getToolControl().setBrushPower(power); } /** @@ -238,26 +137,6 @@ protected void setToolControl(@Nullable C toolControl) { this.toolControl = toolControl; } - /** - * Get the brush power field. - * - * @return the brush power field. - */ - @FxThread - protected @NotNull FloatTextField getBrushPowerField() { - return notNull(brushPowerField); - } - - /** - * Get the brush size field. - * - * @return the brush size field. - */ - @FxThread - protected @NotNull FloatTextField getBrushSizeField() { - return notNull(brushSizeField); - } - @Override @FromAnyThread public @NotNull PaintingComponentContainer getContainer() { @@ -319,14 +198,16 @@ protected void createComponents() { @FxThread public void notifyShowed() { setShowed(true); - EXECUTOR_MANAGER.addJmeTask(() -> getCursorNode().addControl(getToolControl())); + EXECUTOR_MANAGER.addJmeTask(() -> + getCursorNode().addControl(getToolControl())); } @Override @FxThread public void notifyHided() { setShowed(false); - EXECUTOR_MANAGER.addJmeTask(() -> getCursorNode().removeControl(getToolControl())); + EXECUTOR_MANAGER.addJmeTask(() -> + getCursorNode().removeControl(getToolControl())); } /** diff --git a/src/main/java/com/ss/editor/ui/component/painting/property/PaintingPropertyDefinition.java b/src/main/java/com/ss/editor/ui/component/painting/property/PaintingPropertyDefinition.java index ffab366c..c00dbe9a 100644 --- a/src/main/java/com/ss/editor/ui/component/painting/property/PaintingPropertyDefinition.java +++ b/src/main/java/com/ss/editor/ui/component/painting/property/PaintingPropertyDefinition.java @@ -27,6 +27,19 @@ public PaintingPropertyDefinition( this.category = category; } + public PaintingPropertyDefinition( + @NotNull String category, + @NotNull EditablePropertyType propertyType, + @NotNull String name, + @NotNull String id, + @Nullable Object defaultValue, + float min, + float max + ) { + super(propertyType, name, id, defaultValue, min, max); + this.category = category; + } + /** * Get the category. * diff --git a/src/main/java/com/ss/editor/ui/component/painting/property/PropertiesBasedPaintingComponent.java b/src/main/java/com/ss/editor/ui/component/painting/property/PropertiesBasedPaintingComponent.java index eef004ba..db8207ae 100644 --- a/src/main/java/com/ss/editor/ui/component/painting/property/PropertiesBasedPaintingComponent.java +++ b/src/main/java/com/ss/editor/ui/component/painting/property/PropertiesBasedPaintingComponent.java @@ -3,6 +3,7 @@ import static com.ss.editor.extension.property.EditablePropertyType.FLOAT; import com.ss.editor.Messages; import com.ss.editor.annotation.FxThread; +import com.ss.editor.annotation.JmeThread; import com.ss.editor.control.painting.PaintingControl; import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.plugin.api.property.control.PropertyEditorControl; @@ -39,6 +40,12 @@ public abstract class PropertiesBasedPaintingComponent + FxUtils.addChild(this, propertyContainer)); } @Override @FxThread protected void readState(@NotNull S state) { + super.readState(state); + readState(state, getVars()); + refreshPropertyControls(); + syncValues(); + } - var vars = getVars(); + @FxThread + protected void readState(@NotNull S state, @NotNull VarTable vars) { vars.set(PROPERTY_BRUSH_POWER, state.getBrushPower()); vars.set(PROPERTY_BRUSH_SIZE, state.getBrushSize()); - - //FIXME - // super.readState(state); - - refreshPropertyControls(); - syncValues(); } /** @@ -128,20 +138,14 @@ protected void refreshPropertyControls() { */ @FxThread protected void showCategory(@NotNull String category) { - - var children = getChildren(); - children.removeIf(AdditionalPropertyContainer.class::isInstance); - - var index = children.indexOf(brushSettings); - - // supporting additional not properties children - propertyContainers.getOptional(category).ifPresent(container -> { - if (children.size() == 1) { - children.add(container); - } else { - children.add(index + 1, container); - } - }); + getChildren().stream() + .filter(AdditionalPropertyContainer.class::isInstance) + .peek(node -> node.setManaged(false)) + .peek(node -> node.setVisible(false)) + .map(AdditionalPropertyContainer.class::cast) + .filter(container -> container.category.equals(category)) + .peek(container -> container.setManaged(true)) + .forEach(container -> container.setVisible(true)); } /** @@ -159,21 +163,39 @@ protected void showCategory(@NotNull String category) { */ @FxThread protected void syncValues() { + syncValues(getVars(), getState()); + } + + /** + * Synchronize values from properties. + * + * @param vars the variable's table. + * @param state the state. + */ + @FxThread + protected void syncValues(@NotNull VarTable vars, @NotNull S state) { - var vars = getVars(); var brushSize = vars.getFloat(PROPERTY_BRUSH_SIZE); var brushPower = vars.getFloat(PROPERTY_BRUSH_POWER); - var state = getState(); state.setBrushPower(brushPower); state.setBrushSize(brushSize); var toolControl = getToolControl(); - EXECUTOR_MANAGER.addJmeTask(() -> { - toolControl.setBrushPower(brushPower); - toolControl.setBrushSize(brushSize); - }); + EXECUTOR_MANAGER.addJmeTask(() -> syncValues(state, toolControl)); + } + + /** + * Synchronize values from properties with the current tool control. + * + * @param state the state. + * @param toolControl the tool control. + */ + @JmeThread + protected void syncValues(@NotNull S state, @NotNull C toolControl) { + toolControl.setBrushPower(state.getBrushPower()); + toolControl.setBrushSize(state.getBrushSize()); } /** @@ -183,7 +205,7 @@ protected void syncValues() { */ @FxThread private AdditionalPropertyContainer createContainer(@NotNull String category) { - return new AdditionalPropertyContainer(); + return new AdditionalPropertyContainer(category); } /** diff --git a/src/main/java/com/ss/editor/ui/component/painting/spawn/SpawnPaintingComponent.java b/src/main/java/com/ss/editor/ui/component/painting/spawn/SpawnPaintingComponent.java index 08bc97a1..163d1f9b 100644 --- a/src/main/java/com/ss/editor/ui/component/painting/spawn/SpawnPaintingComponent.java +++ b/src/main/java/com/ss/editor/ui/component/painting/spawn/SpawnPaintingComponent.java @@ -8,6 +8,7 @@ import com.ss.editor.Messages; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; +import com.ss.editor.annotation.JmeThread; import com.ss.editor.control.painting.spawn.SpawnToolControl; import com.ss.editor.control.painting.spawn.SpawnToolControl.SpawnMethod; import com.ss.editor.ui.Icons; @@ -16,6 +17,7 @@ import com.ss.editor.ui.component.painting.property.PropertiesBasedPaintingComponent; import com.ss.editor.util.EditorUtil; import com.ss.editor.util.NodeUtils; +import com.ss.rlib.common.util.VarTable; import com.ss.rlib.common.util.array.Array; import com.ss.rlib.common.util.array.ArrayFactory; import javafx.scene.image.Image; @@ -73,10 +75,9 @@ public SpawnPaintingComponent(@NotNull PaintingComponentContainer container) { } @Override - protected void syncValues() { - super.syncValues(); + @FxThread + protected void syncValues(@NotNull VarTable vars, @NotNull SpawnPaintingStateWithEditorTool state) { - var vars = getVars(); var toolControl = getToolControl(); var examples = ArrayFactory.newArray(Spatial.class); @@ -103,30 +104,35 @@ protected void syncValues() { var maxScale = vars.get(PROPERTY_MAX_SCALE, Vector3f.class); var padding = vars.get(PROPERTY_PADDING, Vector3f.class); - var state = getState(); state.setMethod(method.ordinal()); state.setMinScale(minScale); state.setMaxScale(maxScale); state.setPadding(padding); state.setSelectedModels(selectedModels); - EXECUTOR_MANAGER.addJmeTask(() -> { - toolControl.setMethod(method); - toolControl.setMinScale(minScale); - toolControl.setMaxScale(maxScale); - toolControl.setPadding(padding); - toolControl.updateExamples(examples); - }); + super.syncValues(vars, state); + + EXECUTOR_MANAGER.addJmeTask(() -> + toolControl.updateExamples(examples)); } @Override - @FxThread - protected void readState(@NotNull SpawnPaintingStateWithEditorTool state) { + @JmeThread + protected void syncValues(@NotNull SpawnPaintingStateWithEditorTool state, @NotNull SpawnToolControl toolControl) { + super.syncValues(state, toolControl); + toolControl.setMethod(SpawnMethod.valueOf(state.getMethod())); + toolControl.setMinScale(state.getMinScale()); + toolControl.setMaxScale(state.getMaxScale()); + toolControl.setPadding(state.getPadding()); + } + + @Override + protected void readState(@NotNull SpawnPaintingStateWithEditorTool state, @NotNull VarTable vars) { + super.readState(state, vars); var method = state.getMethod(); var selectedModels = state.getSelectedModels(); - var vars = getVars(); vars.set(PROPERTY_METHOD, SPAWN_METHODS[method]); vars.set(PROPERTY_MIN_SCALE, state.getMinScale()); vars.set(PROPERTY_MAX_SCALE, state.getMaxScale()); @@ -145,11 +151,8 @@ protected void readState(@NotNull SpawnPaintingStateWithEditorTool state) { vars.set(PROPERTY_MODEL + "_" + i, assetManager.loadModel(selectedModel)); } catch (AssetNotFoundException e) { LOGGER.warning(this, e); - continue; } } - - super.readState(state); } @Override diff --git a/src/main/java/com/ss/editor/ui/component/painting/terrain/TerrainPaintingComponent.java b/src/main/java/com/ss/editor/ui/component/painting/terrain/TerrainPaintingComponent.java index 6e3bf74a..92acfbb5 100644 --- a/src/main/java/com/ss/editor/ui/component/painting/terrain/TerrainPaintingComponent.java +++ b/src/main/java/com/ss/editor/ui/component/painting/terrain/TerrainPaintingComponent.java @@ -1,5 +1,7 @@ package com.ss.editor.ui.component.painting.terrain; +import static com.ss.editor.extension.property.EditablePropertyType.BOOLEAN; +import static com.ss.editor.extension.property.EditablePropertyType.FLOAT; import static com.ss.editor.ui.component.painting.PaintingComponentContainer.FIELD_PERCENT; import static com.ss.editor.ui.component.painting.PaintingComponentContainer.LABEL_PERCENT; import static com.ss.rlib.common.util.ObjectUtils.notNull; @@ -18,7 +20,6 @@ import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.model.undo.editor.ModelChangeConsumer; import com.ss.editor.ui.Icons; -import com.ss.editor.ui.component.editor.state.EditorState; import com.ss.editor.ui.component.painting.PaintingComponentContainer; import com.ss.editor.ui.component.painting.property.PaintingPropertyDefinition; import com.ss.editor.ui.component.painting.property.PropertiesBasedPaintingComponent; @@ -28,12 +29,14 @@ import com.ss.editor.util.MaterialUtils; import com.ss.editor.util.NodeUtils; import com.ss.rlib.common.util.StringUtils; +import com.ss.rlib.common.util.VarTable; import com.ss.rlib.common.util.array.Array; import com.ss.rlib.common.util.array.ArrayFactory; import com.ss.rlib.common.util.dictionary.DictionaryFactory; import com.ss.rlib.common.util.dictionary.ObjectDictionary; import com.ss.rlib.fx.control.input.FloatTextField; import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.fx.util.FxUtils; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.control.CheckBox; @@ -42,7 +45,6 @@ import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.GridPane; -import javafx.scene.layout.Pane; import javafx.scene.layout.VBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -61,6 +63,14 @@ public class TerrainPaintingComponent extends public static final String TERRAIN_PARAM = "terrainParam"; private static final String CATEGORY_RAISE_LOWER = "RaiseLower"; + private static final String CATEGORY_SLOPE = "Slope"; + private static final String CATEGORY_LEVEL = "Level"; + + private static final String PROPERTY_SLOPE_SMOOTHLY = "slope.smoothly"; + private static final String PROPERTY_SLOPE_LIMITED = "slope.limited"; + private static final String PROPERTY_LEVEL_SMOOTHLY = "level.smoothly"; + private static final String PROPERTY_LEVEL_USE_MARKER = "level.useMarker"; + private static final String PROPERTY_LEVEL_VALUE = "level.level"; @NotNull @@ -124,11 +134,6 @@ public class TerrainPaintingComponent extends @NotNull private final ObjectDictionary buttonToCategory; - /** - * The map with mapping toggle button to its settings. - */ - @NotNull - private final ObjectDictionary buttonToSettings; /** * The control to raise/lowe terrain. @@ -208,30 +213,6 @@ public class TerrainPaintingComponent extends @Nullable private VBox controlSettings; - /** - * The settings of level control. - */ - @Nullable - private GridPane levelControlSettings; - - /** - * The setting of using smoothly changing of terrain height. - */ - @Nullable - private CheckBox levelControlSmoothly; - - /** - * The setting of using marker to detect a level. - */ - @Nullable - private CheckBox levelControlUseMarker; - - /** - * The setting of target level. - */ - @Nullable - private FloatTextField levelControlLevelField; - /** * The settings of rough control. */ @@ -268,24 +249,6 @@ public class TerrainPaintingComponent extends @Nullable private FloatTextField roughControlScaleField; - /** - * The settings of slope control. - */ - @Nullable - private GridPane slopeControlSettings; - - /** - * The setting of using smoothly changing of terrain height. - */ - @Nullable - private CheckBox slopeControlSmoothly; - - /** - * The setting of using limited between markers. - */ - @Nullable - private CheckBox slopeControlLimited; - /** * The settings of painting control. */ @@ -314,7 +277,6 @@ public TerrainPaintingComponent(@NotNull PaintingComponentContainer container) { super(container); this.buttonToControl = DictionaryFactory.newObjectDictionary(); - this.buttonToSettings = DictionaryFactory.newObjectDictionary(); this.buttonToCategory = DictionaryFactory.newObjectDictionary(); this.raiseLowerToolControl = new RaiseLowerTerrainToolControl(this); this.smoothToolControl = new SmoothTerrainToolControl(this); @@ -330,24 +292,25 @@ public TerrainPaintingComponent(@NotNull PaintingComponentContainer container) { slopeButton, paintButton)); var raiseLowerButton = getRaiseLowerButton(); + var slopeButton = getSlopeButton(); + var levelButton = getLevelButton(); buttonToControl.put(raiseLowerButton, raiseLowerToolControl); buttonToControl.put(getSmoothButton(), smoothToolControl); buttonToControl.put(getRoughButton(), roughToolControl); - buttonToControl.put(getLevelButton(), levelToolControl); - buttonToControl.put(getSlopeButton(), slopeToolControl); + buttonToControl.put(levelButton, levelToolControl); + buttonToControl.put(slopeButton, slopeToolControl); buttonToControl.put(getPaintButton(), paintToolControl); - buttonToSettings.put(getSlopeButton(), slopeControlSettings); - buttonToSettings.put(getLevelButton(), levelControlSettings); - buttonToSettings.put(getRoughButton(), roughControlSettings); - buttonToSettings.put(getPaintButton(), paintControlSettings); buttonToCategory.put(raiseLowerButton, CATEGORY_RAISE_LOWER); + buttonToCategory.put(slopeButton, CATEGORY_SLOPE); + buttonToCategory.put(levelButton, CATEGORY_LEVEL); raiseLowerButton.setSelected(true); setToolControl(raiseLowerToolControl); + showCategory(CATEGORY_RAISE_LOWER); - FXUtils.addClassTo(this, CssClasses.PROCESSING_COMPONENT_TERRAIN_EDITOR); + FxUtils.addClass(this, CssClasses.PROCESSING_COMPONENT_TERRAIN_EDITOR); } @Override @@ -369,23 +332,20 @@ public TerrainPaintingComponent(@NotNull PaintingComponentContainer container) { //result.add(new PaintingPropertyDefinition(CATEGORY_DEFAULT, ENUM, // Messages.MODEL_PROPERTY_METHOD, PROPERTY_METHOD, SpawnToolControl.SpawnMethod.BATCH)); - return result; - } - @Override - @FxThread - public void loadState(@NotNull final EditorState editorState) { - super.loadState(editorState); - getLevelControlLevelField().setValue(state.getLevelValue()); - getLevelControlUseMarker().setSelected(state.isLevelUseMarker()); - getLevelControlSmoothly().setSelected(state.isLevelSmoothly()); - getSlopeControlLimited().setSelected(state.isSlopeLimited()); - getSlopeControlSmoothly().setSelected(state.isSlopeSmoothly()); - getRoughControlFrequencyField().setValue(state.getRoughtFrequency()); - getRoughControlLacunarityField().setValue(state.getRoughtLacunarity()); - getRoughControlOctavesField().setValue(state.getRoughtOctaves()); - getRoughControlRoughnessField().setValue(state.getRoughtRoughness()); - getRoughControlScaleField().setValue(state.getRoughtScale()); + result.add(new PaintingPropertyDefinition(CATEGORY_SLOPE, BOOLEAN, Messages.MODEL_PROPERTY_SMOOTHLY, + PROPERTY_SLOPE_SMOOTHLY, false)); + result.add(new PaintingPropertyDefinition(CATEGORY_SLOPE, BOOLEAN, Messages.MODEL_PROPERTY_LIMITED, + PROPERTY_SLOPE_LIMITED, false)); + + result.add(new PaintingPropertyDefinition(CATEGORY_LEVEL, FLOAT, Messages.MODEL_PROPERTY_LEVEL, + PROPERTY_LEVEL_VALUE, 1F, 0F, Integer.MAX_VALUE)); + result.add(new PaintingPropertyDefinition(CATEGORY_LEVEL, BOOLEAN, Messages.MODEL_PROPERTY_SMOOTHLY, + PROPERTY_LEVEL_SMOOTHLY, false)); + result.add(new PaintingPropertyDefinition(CATEGORY_LEVEL, BOOLEAN, Messages.MODEL_PROPERTY_USE_MARKER, + PROPERTY_LEVEL_USE_MARKER, false)); + + return result; } /** @@ -428,16 +388,6 @@ private ObjectDictionary getButtonToCategory() { return buttonToCategory; } - /** - * Get the map with mapping toggle button to its settings. - * - * @return the map with mapping toggle button to its settings. - */ - @FxThread - private @NotNull ObjectDictionary getButtonToSettings() { - return buttonToSettings; - } - /** * Get the container of control settings. * @@ -511,7 +461,6 @@ private ObjectDictionary getButtonToCategory() { @Override @FxThread protected void createComponents() { - super.createComponents(); raiseLowerButton = new ToggleButton(StringUtils.EMPTY, new ImageView(Icons.TERRAIN_UP_32)); raiseLowerButton.setOnAction(event -> switchMode((ToggleButton) event.getSource())); @@ -542,105 +491,75 @@ protected void createComponents() { buttonsContainer.add(paintButton, 5, 0); buttonsContainer.prefWidthProperty().bind(widthProperty()); - FXUtils.addClassTo(buttonsContainer, CssClasses.DEF_GRID_PANE); + FxUtils.addChild(this, buttonsContainer); + + super.createComponents(); controlSettings = new VBox(); controlSettings.prefWidthProperty().bind(widthProperty()); - FXUtils.addToPane(buttonsContainer, this); - FXUtils.addToPane(createBrushSettings(), this); - FXUtils.addToPane(controlSettings, this); + FxUtils.addChild(this, controlSettings); - createLevelControlSettings(); - createSlopeControlSettings(); - createRoughControlSettings(); createPaintControlSettings(); - FXUtils.addClassesTo(raiseLowerButton, smoothButton, roughButton, levelButton, slopeButton, paintButton, - CssClasses.MEDIUM_TOGGLE_BUTTON); + FxUtils.addClass(raiseLowerButton, smoothButton, roughButton, CssClasses.MEDIUM_TOGGLE_BUTTON) + .addClass(levelButton, slopeButton, paintButton, CssClasses.MEDIUM_TOGGLE_BUTTON) + .addClass(buttonsContainer, CssClasses.DEF_GRID_PANE) + .addClass(controlSettings, CssClasses.DEF_VBOX); + } + + @Override + protected void readState(@NotNull TerrainPaintingStateWithEditorTool state, @NotNull VarTable vars) { + super.readState(state, vars); - FXUtils.addClassTo(controlSettings, CssClasses.DEF_VBOX); + vars.set(PROPERTY_SLOPE_LIMITED, state.isSlopeLimited()); + vars.set(PROPERTY_SLOPE_SMOOTHLY, state.isSlopeSmoothly()); + vars.set(PROPERTY_LEVEL_VALUE, state.getLevelValue()); + vars.set(PROPERTY_LEVEL_SMOOTHLY, state.isLevelSmoothly()); + vars.set(PROPERTY_LEVEL_USE_MARKER, state.isLevelUseMarker()); } - /** - * Create settings of slope control. - */ - @FxThread - private void createSlopeControlSettings() { + @Override + protected void syncValues(@NotNull VarTable vars, @NotNull TerrainPaintingStateWithEditorTool state) { - final Label smoothlyLabel = new Label(Messages.MODEL_PROPERTY_SMOOTHLY + ":"); - smoothlyLabel.prefWidthProperty().bind(widthProperty().multiply(LABEL_PERCENT)); + var slopeLimited = vars.getBoolean(PROPERTY_SLOPE_LIMITED); + var slopeSmoothly = vars.getBoolean(PROPERTY_SLOPE_SMOOTHLY); + var levelUseMarker = vars.getBoolean(PROPERTY_LEVEL_USE_MARKER); + var levelSmoothly = vars.getBoolean(PROPERTY_LEVEL_SMOOTHLY); + var levelValue = vars.getFloat(PROPERTY_LEVEL_VALUE); - slopeControlSmoothly = new CheckBox(); - slopeControlSmoothly.prefWidthProperty().bind(widthProperty().multiply(FIELD_PERCENT)); - slopeControlSmoothly.selectedProperty() - .addListener((observable, oldValue, newValue) -> changeSlopeControlSmoothly(newValue)); + state.setSlopeLimited(slopeLimited); + state.setSlopeSmoothly(slopeSmoothly); + state.setLevelSmoothly(levelSmoothly); + state.setLevelUseMarker(levelUseMarker); + state.setLevelValue(levelValue); - final Label limitedLabel = new Label(Messages.MODEL_PROPERTY_LIMITED + ":"); - limitedLabel.prefWidthProperty().bind(widthProperty().multiply(LABEL_PERCENT)); + super.syncValues(vars, state); + } - slopeControlLimited = new CheckBox(); - slopeControlLimited.prefWidthProperty().bind(widthProperty().multiply(FIELD_PERCENT)); - slopeControlLimited.selectedProperty() - .addListener((observable, oldValue, newValue) -> changeSlopeControlLimited(newValue)); + @Override + @JmeThread + protected void syncValues( + @NotNull TerrainPaintingStateWithEditorTool state, + @NotNull TerrainToolControl toolControl) { - slopeControlSettings = new GridPane(); - slopeControlSettings.add(smoothlyLabel, 0, 0); - slopeControlSettings.add(slopeControlSmoothly, 1, 0); - slopeControlSettings.add(limitedLabel, 0, 1); - slopeControlSettings.add(slopeControlLimited, 1, 1); + var brushPower = state.getBrushPower(); + var brushSize = state.getBrushSize(); - FXUtils.addClassTo(slopeControlSettings, CssClasses.DEF_GRID_PANE); - FXUtils.addClassTo(smoothlyLabel, limitedLabel, CssClasses.ABSTRACT_PARAM_CONTROL_PARAM_NAME_SINGLE_ROW); - FXUtils.addClassTo(slopeControlSmoothly, slopeControlLimited, CssClasses.PROPERTY_CONTROL_CHECK_BOX); - } + var toolControls = getToolControls(); + toolControls.forEach(brushSize, TerrainToolControl::setBrushSize); + toolControls.forEach(brushPower, TerrainToolControl::setBrushPower); - /** - * Create settings of level control. - */ - @FxThread - private void createLevelControlSettings() { - - final Label smoothlyLabel = new Label(Messages.MODEL_PROPERTY_SMOOTHLY + ":"); - smoothlyLabel.prefWidthProperty().bind(widthProperty().multiply(LABEL_PERCENT)); - - levelControlSmoothly = new CheckBox(); - levelControlSmoothly.prefWidthProperty().bind(widthProperty().multiply(FIELD_PERCENT)); - levelControlSmoothly.selectedProperty() - .addListener((observable, oldValue, newValue) -> changeLevelControlSmoothly(newValue)); - - final Label useMarkerLabel = new Label(Messages.MODEL_PROPERTY_USE_MARKER + ":"); - useMarkerLabel.prefWidthProperty().bind(widthProperty().multiply(LABEL_PERCENT)); - - levelControlUseMarker = new CheckBox(); - levelControlUseMarker.prefWidthProperty().bind(widthProperty().multiply(FIELD_PERCENT)); - levelControlUseMarker.selectedProperty() - .addListener((observable, oldValue, newValue) -> changeLevelControlUseMarker(newValue)); - - final Label levelLabel = new Label(Messages.MODEL_PROPERTY_LEVEL + ":"); - levelLabel.prefWidthProperty().bind(widthProperty().multiply(LABEL_PERCENT)); - - levelControlLevelField = new FloatTextField(); - levelControlLevelField.prefWidthProperty().bind(widthProperty().multiply(FIELD_PERCENT)); - levelControlLevelField.setMinMax(0F, Integer.MAX_VALUE); - levelControlLevelField.addChangeListener((observable, oldValue, newValue) -> changeLevelControlLevel(newValue)); - levelControlLevelField.disableProperty() - .bind(levelControlUseMarker.selectedProperty()); - - levelControlSettings = new GridPane(); - levelControlSettings.add(smoothlyLabel, 0, 0); - levelControlSettings.add(levelControlSmoothly, 1, 0); - levelControlSettings.add(useMarkerLabel, 0, 1); - levelControlSettings.add(levelControlUseMarker, 1, 1); - levelControlSettings.add(levelLabel, 0, 2); - levelControlSettings.add(levelControlLevelField, 1, 2); - - FXUtils.addClassTo(smoothlyLabel, useMarkerLabel, levelLabel, - CssClasses.ABSTRACT_PARAM_CONTROL_PARAM_NAME_SINGLE_ROW); + var slopeToolControl = getSlopeToolControl(); + slopeToolControl.setLock(state.isSlopeLimited()); + slopeToolControl.setPrecision(state.isSlopeSmoothly()); - FXUtils.addClassesTo(levelControlSettings, CssClasses.DEF_GRID_PANE); - FXUtils.addClassTo(levelControlLevelField, CssClasses.PROPERTY_CONTROL_COMBO_BOX); - FXUtils.addClassTo(levelControlSmoothly, levelControlUseMarker, CssClasses.PROPERTY_CONTROL_CHECK_BOX); + var levelToolControl = getLevelToolControl(); + levelToolControl.setLevel(state.getLevelValue()); + levelToolControl.setPrecision(state.isLevelSmoothly()); + levelToolControl.setUseMarker(state.isLevelUseMarker()); + + super.syncValues(state, toolControl); } /** @@ -835,51 +754,6 @@ private void changePaintControlTriPlanar(@NotNull final Boolean newValue) { changeConsumer.execute(operation); } - /** - * Change using smoothly editing. - */ - @FromAnyThread - private void changeLevelControlSmoothly(@NotNull final Boolean newValue) { - if (state != null) state.setLevelSmoothly(newValue); - EXECUTOR_MANAGER.addJmeTask(() -> getLevelToolControl().setPrecision(!newValue)); - } - - /** - * Change using marker for level control. - */ - @FromAnyThread - private void changeLevelControlUseMarker(@NotNull final Boolean newValue) { - if (state != null) state.setLevelUseMarker(newValue); - EXECUTOR_MANAGER.addJmeTask(() -> getLevelToolControl().setUseMarker(newValue)); - } - - /** - * Change a level of a level control. - */ - @FromAnyThread - private void changeLevelControlLevel(@NotNull final Float newLevel) { - if (state != null) state.setLevelValue(newLevel); - EXECUTOR_MANAGER.addJmeTask(() -> getLevelToolControl().setLevel(newLevel)); - } - - /** - * Change using smoothly editing. - */ - @FromAnyThread - private void changeSlopeControlSmoothly(@NotNull final Boolean newValue) { - if (state != null) state.setSlopeSmoothly(newValue); - EXECUTOR_MANAGER.addJmeTask(() -> getSlopeToolControl().setPrecision(!newValue)); - } - - /** - * Change using limited editing. - */ - @FromAnyThread - private void changeSlopeControlLimited(@NotNull final Boolean newValue) { - if (state != null) state.setSlopeLimited(newValue); - EXECUTOR_MANAGER.addJmeTask(() -> getSlopeToolControl().setLock(newValue)); - } - /** * Change scale of a rough control. */ @@ -925,20 +799,6 @@ private void changeRoughControlRoughness(@NotNull final Float newRoughness) { EXECUTOR_MANAGER.addJmeTask(() -> getRoughToolControl().setRoughness(newRoughness)); } - @Override - @JmeThread - protected void setBrushSize(@NotNull final Float size) { - final Array toolControls = getToolControls(); - toolControls.forEach(size, TerrainToolControl::setBrushSize); - } - - @Override - @JmeThread - protected void setBrushPower(@NotNull final Float power) { - final Array toolControls = getToolControls(); - toolControls.forEach(power, TerrainToolControl::setBrushPower); - } - /** * Get the box to use tri-planar. * @@ -959,106 +819,6 @@ protected void setBrushPower(@NotNull final Float power) { return notNull(shininessField); } - /** - * Get the setting of using smoothly changing of terrain height. - * - * @return the setting of using smoothly changing of terrain height. - */ - @FxThread - private @NotNull CheckBox getLevelControlSmoothly() { - return notNull(levelControlSmoothly); - } - - /** - * Get the setting of using marker to detect a level. - * - * @return the setting of using marker to detect a level. - */ - @FxThread - private @NotNull CheckBox getLevelControlUseMarker() { - return notNull(levelControlUseMarker); - } - - /** - * Get the setting of target level. - * - * @return the setting of target level. - */ - @FxThread - private @NotNull FloatTextField getLevelControlLevelField() { - return notNull(levelControlLevelField); - } - - /** - * Get the setting of using limited between markers. - * - * @return the setting of using limited between markers. - */ - @FxThread - private @NotNull CheckBox getSlopeControlLimited() { - return notNull(slopeControlLimited); - } - - /** - * Get the setting of using smoothly changing of terrain height. - * - * @return the setting of using smoothly changing of terrain height. - */ - @FxThread - private @NotNull CheckBox getSlopeControlSmoothly() { - return notNull(slopeControlSmoothly); - } - - /** - * Get the settings of frequency. - * - * @return the settings of frequency. - */ - @FxThread - private @NotNull FloatTextField getRoughControlFrequencyField() { - return notNull(roughControlFrequencyField); - } - - /** - * Get the settings of lacunarity. - * - * @return the settings of lacunarity. - */ - @FxThread - private @NotNull FloatTextField getRoughControlLacunarityField() { - return notNull(roughControlLacunarityField); - } - - /** - * Get the settings of octaves. - * - * @return the settings of octaves. - */ - @FxThread - private @NotNull FloatTextField getRoughControlOctavesField() { - return notNull(roughControlOctavesField); - } - - /** - * Get the settings of roughness. - * - * @return the settings of roughness. - */ - @FxThread - private @NotNull FloatTextField getRoughControlRoughnessField() { - return notNull(roughControlRoughnessField); - } - - /** - * Get the settings of scale. - * - * @return the settings of scale. - */ - @FxThread - private @NotNull FloatTextField getRoughControlScaleField() { - return notNull(roughControlScaleField); - } - /** * Get the settings of painting control. * From e0a8766823bc80e2f6bdd3aee4a9f05d57c71c9b Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Tue, 22 May 2018 07:53:34 +0300 Subject: [PATCH 46/49] finished refactoring terrain tool. --- build.gradle | 2 +- .../terrain/TerrainPaintingComponent.java | 352 ++++++------------ .../terrain/paint/TextureLayerCell.java | 2 +- 3 files changed, 112 insertions(+), 244 deletions(-) diff --git a/build.gradle b/build.gradle index b54439f5..5cdb87d8 100644 --- a/build.gradle +++ b/build.gradle @@ -128,7 +128,7 @@ dependencies { // base compile group: 'org.fxmisc.richtext', name: 'richtextfx', version: '0.9.0' compile 'org.controlsfx:controlsfx:9.0.0' - compile 'com.spaceshift:rlib.fx:5.0.1' + compile 'com.spaceshift:rlib.fx:5.0.2' compile 'com.spaceshift:rlib.common:7.0.0' compile ('com.jme3:jfx:2.0.0') { exclude group: 'org.jmonkeyengine' diff --git a/src/main/java/com/ss/editor/ui/component/painting/terrain/TerrainPaintingComponent.java b/src/main/java/com/ss/editor/ui/component/painting/terrain/TerrainPaintingComponent.java index 92acfbb5..ba6d7057 100644 --- a/src/main/java/com/ss/editor/ui/component/painting/terrain/TerrainPaintingComponent.java +++ b/src/main/java/com/ss/editor/ui/component/painting/terrain/TerrainPaintingComponent.java @@ -6,9 +6,6 @@ import static com.ss.editor.ui.component.painting.PaintingComponentContainer.LABEL_PERCENT; import static com.ss.rlib.common.util.ObjectUtils.notNull; import static com.ss.rlib.common.util.array.ArrayFactory.toArray; -import com.jme3.material.MatParam; -import com.jme3.material.Material; -import com.jme3.material.MaterialDef; import com.jme3.scene.Node; import com.jme3.terrain.Terrain; import com.jme3.terrain.geomipmap.TerrainQuad; @@ -18,7 +15,6 @@ import com.ss.editor.annotation.JmeThread; import com.ss.editor.control.painting.terrain.*; import com.ss.editor.model.undo.editor.ChangeConsumer; -import com.ss.editor.model.undo.editor.ModelChangeConsumer; import com.ss.editor.ui.Icons; import com.ss.editor.ui.component.painting.PaintingComponentContainer; import com.ss.editor.ui.component.painting.property.PaintingPropertyDefinition; @@ -35,7 +31,7 @@ import com.ss.rlib.common.util.dictionary.DictionaryFactory; import com.ss.rlib.common.util.dictionary.ObjectDictionary; import com.ss.rlib.fx.control.input.FloatTextField; -import com.ss.rlib.fx.util.FXUtils; +import com.ss.rlib.fx.util.FxControlUtils; import com.ss.rlib.fx.util.FxUtils; import javafx.geometry.Insets; import javafx.geometry.Pos; @@ -45,7 +41,6 @@ import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.GridPane; -import javafx.scene.layout.VBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -63,15 +58,22 @@ public class TerrainPaintingComponent extends public static final String TERRAIN_PARAM = "terrainParam"; private static final String CATEGORY_RAISE_LOWER = "RaiseLower"; + private static final String CATEGORY_ROUGH = "Rough"; private static final String CATEGORY_SLOPE = "Slope"; private static final String CATEGORY_LEVEL = "Level"; + private static final String CATEGORY_SMOOTH = "Smooth"; + private static final String CATEGORY_PAINT = "Paint"; private static final String PROPERTY_SLOPE_SMOOTHLY = "slope.smoothly"; private static final String PROPERTY_SLOPE_LIMITED = "slope.limited"; private static final String PROPERTY_LEVEL_SMOOTHLY = "level.smoothly"; private static final String PROPERTY_LEVEL_USE_MARKER = "level.useMarker"; private static final String PROPERTY_LEVEL_VALUE = "level.level"; - + private static final String PROPERTY_ROUGH_ROUGHNESS = "rough.roughness"; + private static final String PROPERTY_ROUGH_FREQUENCY = "rough.frequency"; + private static final String PROPERTY_ROUGH_LACUNARITY = "rough.lacunarity"; + private static final String PROPERTY_ROUGH_OCTAVES = "rough.octaves"; + private static final String PROPERTY_ROUGH_SCALE = "rough.scale"; @NotNull private static final Function LAYER_TO_SCALE_NAME = layer -> "DiffuseMap_" + layer + "_scale"; @@ -207,48 +209,6 @@ public class TerrainPaintingComponent extends @Nullable private ToggleButton paintButton; - /** - * The container of control settings. - */ - @Nullable - private VBox controlSettings; - - /** - * The settings of rough control. - */ - @Nullable - private GridPane roughControlSettings; - - /** - * The settings of roughness. - */ - @Nullable - private FloatTextField roughControlRoughnessField; - - /** - * The settings of frequency. - */ - @Nullable - private FloatTextField roughControlFrequencyField; - - /** - * The settings of lacunarity. - */ - @Nullable - private FloatTextField roughControlLacunarityField; - - /** - * The settings of octaves. - */ - @Nullable - private FloatTextField roughControlOctavesField; - - /** - * The settings of scale. - */ - @Nullable - private FloatTextField roughControlScaleField; - /** * The settings of painting control. */ @@ -294,16 +254,22 @@ public TerrainPaintingComponent(@NotNull PaintingComponentContainer container) { var raiseLowerButton = getRaiseLowerButton(); var slopeButton = getSlopeButton(); var levelButton = getLevelButton(); + var roughButton = getRoughButton(); + var smoothButton = getSmoothButton(); + var paintButton = getPaintButton(); buttonToControl.put(raiseLowerButton, raiseLowerToolControl); - buttonToControl.put(getSmoothButton(), smoothToolControl); - buttonToControl.put(getRoughButton(), roughToolControl); + buttonToControl.put(smoothButton, smoothToolControl); + buttonToControl.put(roughButton, roughToolControl); buttonToControl.put(levelButton, levelToolControl); buttonToControl.put(slopeButton, slopeToolControl); - buttonToControl.put(getPaintButton(), paintToolControl); + buttonToControl.put(paintButton, paintToolControl); buttonToCategory.put(raiseLowerButton, CATEGORY_RAISE_LOWER); buttonToCategory.put(slopeButton, CATEGORY_SLOPE); buttonToCategory.put(levelButton, CATEGORY_LEVEL); + buttonToCategory.put(roughButton, CATEGORY_ROUGH); + buttonToCategory.put(smoothButton, CATEGORY_SMOOTH); + buttonToCategory.put(paintButton, CATEGORY_PAINT); raiseLowerButton.setSelected(true); @@ -329,15 +295,23 @@ public TerrainPaintingComponent(@NotNull PaintingComponentContainer container) { protected @NotNull Array getPaintingProperties() { var result = ArrayFactory.newArray(PaintingPropertyDefinition.class); - //result.add(new PaintingPropertyDefinition(CATEGORY_DEFAULT, ENUM, - // Messages.MODEL_PROPERTY_METHOD, PROPERTY_METHOD, SpawnToolControl.SpawnMethod.BATCH)); - result.add(new PaintingPropertyDefinition(CATEGORY_SLOPE, BOOLEAN, Messages.MODEL_PROPERTY_SMOOTHLY, PROPERTY_SLOPE_SMOOTHLY, false)); result.add(new PaintingPropertyDefinition(CATEGORY_SLOPE, BOOLEAN, Messages.MODEL_PROPERTY_LIMITED, PROPERTY_SLOPE_LIMITED, false)); + result.add(new PaintingPropertyDefinition(CATEGORY_ROUGH, FLOAT, Messages.MODEL_PROPERTY_ROUGHNESS, + PROPERTY_ROUGH_ROUGHNESS, 0F, 0F, Integer.MAX_VALUE)); + result.add(new PaintingPropertyDefinition(CATEGORY_ROUGH, FLOAT, Messages.MODEL_PROPERTY_FREQUENCY, + PROPERTY_ROUGH_FREQUENCY, 0F, 0.1F, Integer.MAX_VALUE)); + result.add(new PaintingPropertyDefinition(CATEGORY_ROUGH, FLOAT, Messages.MODEL_PROPERTY_LACUNARITY, + PROPERTY_ROUGH_LACUNARITY, 0F, 1.1F, Integer.MAX_VALUE)); + result.add(new PaintingPropertyDefinition(CATEGORY_ROUGH, FLOAT, Messages.MODEL_PROPERTY_OCTAVES, + PROPERTY_ROUGH_OCTAVES, 0F, 0F, Integer.MAX_VALUE)); + result.add(new PaintingPropertyDefinition(CATEGORY_ROUGH, FLOAT, Messages.MODEL_PROPERTY_MIN_SCALE, + PROPERTY_ROUGH_SCALE, 0F, 0F, Integer.MAX_VALUE)); + result.add(new PaintingPropertyDefinition(CATEGORY_LEVEL, FLOAT, Messages.MODEL_PROPERTY_LEVEL, PROPERTY_LEVEL_VALUE, 1F, 0F, Integer.MAX_VALUE)); result.add(new PaintingPropertyDefinition(CATEGORY_LEVEL, BOOLEAN, Messages.MODEL_PROPERTY_SMOOTHLY, @@ -384,20 +358,10 @@ public TerrainPaintingComponent(@NotNull PaintingComponentContainer container) { * @return the map with mapping toggle button to properties category. */ @FxThread - private ObjectDictionary getButtonToCategory() { + private @NotNull ObjectDictionary getButtonToCategory() { return buttonToCategory; } - /** - * Get the container of control settings. - * - * @return the container of control settings. - */ - @FxThread - private @NotNull VBox getControlSettings() { - return notNull(controlSettings); - } - /** * Get the button to change height of terrain by level. * @@ -495,17 +459,11 @@ protected void createComponents() { super.createComponents(); - controlSettings = new VBox(); - controlSettings.prefWidthProperty().bind(widthProperty()); - - FxUtils.addChild(this, controlSettings); - createPaintControlSettings(); FxUtils.addClass(raiseLowerButton, smoothButton, roughButton, CssClasses.MEDIUM_TOGGLE_BUTTON) .addClass(levelButton, slopeButton, paintButton, CssClasses.MEDIUM_TOGGLE_BUTTON) - .addClass(buttonsContainer, CssClasses.DEF_GRID_PANE) - .addClass(controlSettings, CssClasses.DEF_VBOX); + .addClass(buttonsContainer, CssClasses.DEF_GRID_PANE); } @Override @@ -527,12 +485,22 @@ protected void syncValues(@NotNull VarTable vars, @NotNull TerrainPaintingStateW var levelUseMarker = vars.getBoolean(PROPERTY_LEVEL_USE_MARKER); var levelSmoothly = vars.getBoolean(PROPERTY_LEVEL_SMOOTHLY); var levelValue = vars.getFloat(PROPERTY_LEVEL_VALUE); + var roughFrequency = vars.getFloat(PROPERTY_ROUGH_FREQUENCY); + var roughLacunarity = vars.getFloat(PROPERTY_ROUGH_LACUNARITY); + var roughRoughness = vars.getFloat(PROPERTY_ROUGH_ROUGHNESS); + var roughScale = vars.getFloat(PROPERTY_ROUGH_SCALE); + var roughOctaves = vars.getFloat(PROPERTY_ROUGH_OCTAVES); state.setSlopeLimited(slopeLimited); state.setSlopeSmoothly(slopeSmoothly); state.setLevelSmoothly(levelSmoothly); state.setLevelUseMarker(levelUseMarker); state.setLevelValue(levelValue); + state.setRoughtFrequency(roughFrequency); + state.setRoughtLacunarity(roughLacunarity); + state.setRoughtScale(roughScale); + state.setRoughtOctaves(roughOctaves); + state.setRoughtRoughness(roughRoughness); super.syncValues(vars, state); } @@ -559,74 +527,14 @@ protected void syncValues( levelToolControl.setPrecision(state.isLevelSmoothly()); levelToolControl.setUseMarker(state.isLevelUseMarker()); - super.syncValues(state, toolControl); - } - - /** - * Create settings of rough control. - */ - @FxThread - private void createRoughControlSettings() { - - final Label roughnessLabel = new Label(Messages.MODEL_PROPERTY_ROUGHNESS + ":"); - roughnessLabel.prefWidthProperty().bind(widthProperty().multiply(LABEL_PERCENT)); - - roughControlRoughnessField = new FloatTextField(); - roughControlRoughnessField.prefWidthProperty().bind(widthProperty().multiply(FIELD_PERCENT)); - roughControlRoughnessField.setMinMax(0F, Integer.MAX_VALUE); - roughControlRoughnessField.addChangeListener((observable, oldValue, newValue) -> changeRoughControlRoughness(newValue)); - - final Label frequencyLabel = new Label(Messages.MODEL_PROPERTY_FREQUENCY + ":"); - frequencyLabel.prefWidthProperty().bind(widthProperty().multiply(LABEL_PERCENT)); + var roughToolControl = getRoughToolControl(); + roughToolControl.setFrequency(state.getRoughtFrequency()); + roughToolControl.setLacunarity(state.getRoughtLacunarity()); + roughToolControl.setOctaves(state.getRoughtOctaves()); + roughToolControl.setScale(state.getRoughtScale()); + roughToolControl.setRoughness(state.getRoughtRoughness()); - roughControlFrequencyField = new FloatTextField(); - roughControlFrequencyField.prefWidthProperty().bind(widthProperty().multiply(FIELD_PERCENT)); - roughControlFrequencyField.setMinMax(0.1F, Integer.MAX_VALUE); - roughControlFrequencyField.addChangeListener((observable, oldValue, newValue) -> changeRoughControlFrequency(newValue)); - - final Label lacunarityLabel = new Label(Messages.MODEL_PROPERTY_LACUNARITY + ":"); - lacunarityLabel.prefWidthProperty().bind(widthProperty().multiply(LABEL_PERCENT)); - - roughControlLacunarityField = new FloatTextField(); - roughControlLacunarityField.prefWidthProperty().bind(widthProperty().multiply(FIELD_PERCENT)); - roughControlLacunarityField.setMinMax(1.1F, Integer.MAX_VALUE); - roughControlLacunarityField.addChangeListener((observable, oldValue, newValue) -> changeRoughControlLacunarity(newValue)); - - final Label octavesLabel = new Label(Messages.MODEL_PROPERTY_OCTAVES + ":"); - octavesLabel.prefWidthProperty().bind(widthProperty().multiply(LABEL_PERCENT)); - - roughControlOctavesField = new FloatTextField(); - roughControlOctavesField.prefWidthProperty().bind(widthProperty().multiply(FIELD_PERCENT)); - roughControlOctavesField.setMinMax(0F, Integer.MAX_VALUE); - roughControlOctavesField.addChangeListener((observable, oldValue, newValue) -> changeRoughControlOctaves(newValue)); - - final Label scaleLabel = new Label(Messages.MODEL_PROPERTY_MIN_SCALE + ":"); - scaleLabel.prefWidthProperty().bind(widthProperty().multiply(LABEL_PERCENT)); - - roughControlScaleField = new FloatTextField(); - roughControlScaleField.prefWidthProperty().bind(widthProperty().multiply(FIELD_PERCENT)); - roughControlScaleField.setMinMax(0F, Integer.MAX_VALUE); - roughControlScaleField.addChangeListener((observable, oldValue, newValue) -> changeRoughControlScale(newValue)); - - roughControlSettings = new GridPane(); - roughControlSettings.add(roughnessLabel, 0, 0); - roughControlSettings.add(roughControlRoughnessField, 1, 0); - roughControlSettings.add(frequencyLabel, 0, 1); - roughControlSettings.add(roughControlFrequencyField, 1, 1); - roughControlSettings.add(lacunarityLabel, 0, 2); - roughControlSettings.add(roughControlLacunarityField, 1, 2); - roughControlSettings.add(octavesLabel, 0, 3); - roughControlSettings.add(roughControlOctavesField, 1, 3); - roughControlSettings.add(scaleLabel, 0, 4); - roughControlSettings.add(roughControlScaleField, 1, 4); - - FXUtils.addClassTo(roughnessLabel, frequencyLabel, lacunarityLabel, octavesLabel, scaleLabel, - CssClasses.ABSTRACT_PARAM_CONTROL_PARAM_NAME_SINGLE_ROW); - - - FXUtils.addClassesTo(roughControlSettings, CssClasses.DEF_GRID_PANE); - FXUtils.addClassTo(roughControlRoughnessField, roughControlFrequencyField, roughControlLacunarityField, - roughControlOctavesField, roughControlScaleField, CssClasses.PROPERTY_CONTROL_COMBO_BOX); + super.syncValues(state, toolControl); } /** @@ -635,21 +543,24 @@ private void createRoughControlSettings() { @FxThread private void createPaintControlSettings() { - final Label triPlanarLabelLabel = new Label(Messages.MODEL_PROPERTY_TRI_PLANAR + ":"); - triPlanarLabelLabel.prefWidthProperty().bind(widthProperty().multiply(LABEL_PERCENT)); + var triPlanarLabelLabel = new Label(Messages.MODEL_PROPERTY_TRI_PLANAR + ":"); + triPlanarLabelLabel.prefWidthProperty() + .bind(widthProperty().multiply(LABEL_PERCENT)); triPlanarCheckBox = new CheckBox(); - triPlanarCheckBox.prefWidthProperty().bind(widthProperty().multiply(FIELD_PERCENT)); - triPlanarCheckBox.selectedProperty() - .addListener((observable, oldValue, newValue) -> changePaintControlTriPlanar(newValue)); + triPlanarCheckBox.prefWidthProperty() + .bind(widthProperty().multiply(FIELD_PERCENT)); - final Label shininessLabel = new Label(Messages.MODEL_PROPERTY_SHININESS + ":"); + var shininessLabel = new Label(Messages.MODEL_PROPERTY_SHININESS + ":"); shininessLabel.prefWidthProperty().bind(widthProperty().multiply(LABEL_PERCENT)); shininessField = new FloatTextField(); - shininessField.prefWidthProperty().bind(widthProperty().multiply(FIELD_PERCENT)); shininessField.setMinMax(0F, Integer.MAX_VALUE); - shininessField.addChangeListener((observable, oldValue, newValue) -> changePaintControlShininess(newValue)); + shininessField.prefWidthProperty() + .bind(widthProperty().multiply(FIELD_PERCENT)); + + FxControlUtils.onSelectedChange(triPlanarCheckBox, this::changePaintControlTriPlanar); + FxControlUtils.onValueChange(shininessField, this::changePaintControlShininess); textureLayerSettings = new TextureLayerSettings(this); @@ -660,10 +571,10 @@ private void createPaintControlSettings() { paintControlSettings.add(triPlanarCheckBox, 1, 1); paintControlSettings.add(textureLayerSettings, 0, 2, 2, 1); - FXUtils.addClassesTo(paintControlSettings, CssClasses.DEF_GRID_PANE); - FXUtils.addClassTo(shininessLabel, triPlanarLabelLabel, CssClasses.ABSTRACT_PARAM_CONTROL_PARAM_NAME_SINGLE_ROW); - FXUtils.addClassTo(triPlanarCheckBox, CssClasses.PROPERTY_CONTROL_CHECK_BOX); - FXUtils.addClassTo(shininessField, CssClasses.PROPERTY_CONTROL_COMBO_BOX); + FxUtils.addClass(paintControlSettings, CssClasses.DEF_GRID_PANE) + .addClass(shininessLabel, triPlanarLabelLabel, CssClasses.ABSTRACT_PARAM_CONTROL_PARAM_NAME_SINGLE_ROW) + .addClass(triPlanarCheckBox, CssClasses.PROPERTY_CONTROL_CHECK_BOX) + .addClass(shininessField, CssClasses.PROPERTY_CONTROL_COMBO_BOX); } /** @@ -710,93 +621,46 @@ private void createPaintControlSettings() { * Change the shininess value. */ @FromAnyThread - private void changePaintControlShininess(@NotNull final Float newValue) { + private void changePaintControlShininess(@NotNull Float newValue) { if (isIgnoreListeners()) { return; } - final Node paintedObject = notNull(getPaintedObject()); - final Material material = NodeUtils.findMateial(paintedObject, mat -> mat.getParam("Shininess") != null); - final MatParam param = material == null ? null : material.getParam("Shininess"); - final float shininess = param == null ? 0F : (float) param.getValue(); + var paintedObject = notNull(getPaintedObject()); + var material = NodeUtils.findMateial(paintedObject, mat -> mat.getParam("Shininess") != null); + var param = material == null ? null : material.getParam("Shininess"); + var shininess = param == null ? 0F : (float) param.getValue(); - final PropertyOperation operation = - new PropertyOperation<>(paintedObject, TERRAIN_PARAM, newValue, shininess); + var operation = new PropertyOperation(paintedObject, TERRAIN_PARAM, + newValue, shininess); operation.setApplyHandler((terrainQuad, value) -> NodeUtils.visitMaterials(terrainQuad, mat -> MaterialUtils.safeSet(mat, "Shininess", value))); - final ModelChangeConsumer changeConsumer = getChangeConsumer(); - changeConsumer.execute(operation); + getChangeConsumer().execute(operation); } /** * Change using tri-planar textures. */ @FromAnyThread - private void changePaintControlTriPlanar(@NotNull final Boolean newValue) { + private void changePaintControlTriPlanar(@NotNull Boolean newValue) { if (isIgnoreListeners()) { return; } - final Node paintedObject = notNull(getPaintedObject()); - final PropertyOperation operation = - new PropertyOperation<>(paintedObject, TERRAIN_PARAM, newValue, !newValue); + var paintedObject = notNull(getPaintedObject()); + var operation = new PropertyOperation(paintedObject, TERRAIN_PARAM, + newValue, !newValue); operation.setApplyHandler((terrainQuad, value) -> NodeUtils.visitMaterials(terrainQuad, mat -> MaterialUtils.safeSet(mat, "useTriPlanarMapping", value))); - final ModelChangeConsumer changeConsumer = getChangeConsumer(); - changeConsumer.execute(operation); - } - - /** - * Change scale of a rough control. - */ - @FromAnyThread - private void changeRoughControlScale(@NotNull final Float newScale) { - if (state != null) state.setRoughtScale(newScale); - EXECUTOR_MANAGER.addJmeTask(() -> getRoughToolControl().setScale(newScale)); - } - - /** - * Change frequency of a rough control. - */ - @FromAnyThread - private void changeRoughControlFrequency(@NotNull final Float newFrequency) { - if (state != null) state.setRoughtFrequency(newFrequency); - EXECUTOR_MANAGER.addJmeTask(() -> getRoughToolControl().setFrequency(newFrequency)); - } - - /** - * Change lacunarity of a rough control. - */ - @FromAnyThread - private void changeRoughControlLacunarity(@NotNull final Float newLacunarity) { - if (state != null) state.setRoughtLacunarity(newLacunarity); - EXECUTOR_MANAGER.addJmeTask(() -> getRoughToolControl().setLacunarity(newLacunarity)); - } - - /** - * Change octaves of a rough control. - */ - @FromAnyThread - private void changeRoughControlOctaves(@NotNull final Float newOctaves) { - if (state != null) state.setRoughtOctaves(newOctaves); - EXECUTOR_MANAGER.addJmeTask(() -> getRoughToolControl().setOctaves(newOctaves)); - } - - /** - * Change roughness of a rough control. - */ - @FromAnyThread - private void changeRoughControlRoughness(@NotNull final Float newRoughness) { - if (state != null) state.setRoughtRoughness(newRoughness); - EXECUTOR_MANAGER.addJmeTask(() -> getRoughToolControl().setRoughness(newRoughness)); + getChangeConsumer().execute(operation); } /** @@ -829,6 +693,16 @@ private void changeRoughControlRoughness(@NotNull final Float newRoughness) { return notNull(textureLayerSettings); } + /** + * Get the paint control settings. + * + * @return the paint control settings. + */ + @FxThread + private @NotNull GridPane getPaintControlSettings() { + return notNull(paintControlSettings); + } + /** * Switch editing mode. */ @@ -844,18 +718,15 @@ private void switchMode(@NotNull ToggleButton source) { (button, arg) -> button != arg, (toDeselect, arg) -> toDeselect.setSelected(false)); - showCategory(notNull(getButtonToCategory().get(source))); - - /*final ObjectDictionary buttonToSettings = getButtonToSettings(); - final Pane settings = buttonToSettings.get(source); + var category = notNull(getButtonToCategory().get(source)); - final VBox controlSettings = getControlSettings(); - final ObservableList children = controlSettings.getChildren(); - children.clear(); + showCategory(category); - if (settings != null) { - children.add(settings); - }*/ + if (CATEGORY_PAINT.equals(category)) { + FxUtils.addChild(this, getPaintControlSettings()); + } else { + FxUtils.removeChild(this, getPaintControlSettings()); + } var toolControl = getButtonToControl().get(source); @@ -874,19 +745,19 @@ private void switchMode(@NotNull ToggleButton source) { @Override @FxThread - public void startPainting(@NotNull final Object object) { + public void startPainting(@NotNull Object object) { super.startPainting(object); refreshProperties(); - final TextureLayerSettings settings = getTextureLayerSettings(); - final ToggleButton paintButton = getPaintButton(); + var settings = getTextureLayerSettings(); + var paintButton = getPaintButton(); if (object instanceof Terrain) { - final Terrain terrain = (Terrain) object; - final Material material = terrain.getMaterial(); - final MaterialDef materialDef = material.getMaterialDef(); + var terrain = (Terrain) object; + var material = terrain.getMaterial(); + var materialDef = material.getMaterialDef(); if (materialDef.getAssetName().equals("Common/MatDefs/Terrain/TerrainLighting.j3md")) { settings.setLayerToScaleName(LAYER_TO_SCALE_NAME); @@ -907,7 +778,7 @@ public void startPainting(@NotNull final Object object) { if (paintButton.isSelected()) { - final ToggleButton raiseLowerButton = getRaiseLowerButton(); + var raiseLowerButton = getRaiseLowerButton(); raiseLowerButton.setSelected(true); switchMode(raiseLowerButton); @@ -923,18 +794,15 @@ private void refreshProperties() { setIgnoreListeners(true); try { - final Node paintedObject = notNull(getPaintedObject()); - final Material material = NodeUtils.findMateial(paintedObject, mat -> mat.getParam("Shininess") != null); - final MatParam shininessParam = material == null ? null : material.getParam("Shininess"); - final MatParam triPlanarMappingParam = material == null ? null : material.getParam("useTriPlanarMapping"); - final float shininess = shininessParam == null ? 0F : (float) shininessParam.getValue(); - final boolean triPlanarMapping = triPlanarMappingParam != null && (boolean) triPlanarMappingParam.getValue(); - - final FloatTextField shininessField = getShininessField(); - shininessField.setValue(shininess); + var paintedObject = notNull(getPaintedObject()); + var material = NodeUtils.findMateial(paintedObject, mat -> mat.getParam("Shininess") != null); + var shininessParam = material == null ? null : material.getParam("Shininess"); + var triPlanarMappingParam = material == null ? null : material.getParam("useTriPlanarMapping"); + var shininess = shininessParam == null ? 0F : (float) shininessParam.getValue(); + var triPlanarMapping = triPlanarMappingParam != null && (boolean) triPlanarMappingParam.getValue(); - final CheckBox triPlanarCheckBox = getTriPlanarCheckBox(); - triPlanarCheckBox.setSelected(triPlanarMapping); + getShininessField().setValue(shininess); + getTriPlanarCheckBox().setSelected(triPlanarMapping); } finally { setIgnoreListeners(false); @@ -943,7 +811,7 @@ private void refreshProperties() { @Override @FxThread - public void notifyChangeProperty(@NotNull final Object object, @NotNull final String propertyName) { + public void notifyChangeProperty(@NotNull Object object, @NotNull String propertyName) { refreshProperties(); if (getPaintedObject() instanceof Terrain) { @@ -953,7 +821,7 @@ public void notifyChangeProperty(@NotNull final Object object, @NotNull final St @Override @FxThread - public boolean isSupport(@NotNull final Object object) { + public boolean isSupport(@NotNull Object object) { return object instanceof Node && NodeUtils.findSpatial((Node) object, TerrainQuad.class::isInstance) != null; } diff --git a/src/main/java/com/ss/editor/ui/component/painting/terrain/paint/TextureLayerCell.java b/src/main/java/com/ss/editor/ui/component/painting/terrain/paint/TextureLayerCell.java index 01be6f48..1e371a44 100644 --- a/src/main/java/com/ss/editor/ui/component/painting/terrain/paint/TextureLayerCell.java +++ b/src/main/java/com/ss/editor/ui/component/painting/terrain/paint/TextureLayerCell.java @@ -81,7 +81,7 @@ public TextureLayerCell(final DoubleBinding prefWidth, normalTextureControl.setChangeHandler(this::updateNormal); normalTextureControl.setControlWidthPercent(PropertyControl.CONTROL_WIDTH_PERCENT_2); - final Label scaleLabel = new Label(Messages.MODEL_PROPERTY_MIN_SCALE + ":"); + final Label scaleLabel = new Label(Messages.MODEL_PROPERTY_SCALE + ":"); scaleLabel.prefWidthProperty().bind(settingContainer.widthProperty().multiply(LABEL_PERCENT)); scaleField = new FloatTextField(); From 5970a209c0e632bed5b506eb7e1103f228f78f3b Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Wed, 23 May 2018 09:31:00 +0300 Subject: [PATCH 47/49] continue working on tree. --- build.gradle | 2 +- .../jmb-shader-nodes-1.1.1.jar | Bin 351160 -> 395401 bytes .../java/com/ss/editor/JmeApplication.java | 10 ++-- .../ui/builder/EditorFxSceneBuilder.java | 44 +++++++++--------- .../ui/component/asset/tree/ResourceTree.java | 35 ++++++++++---- .../component/bar/EditorMenuBarComponent.java | 26 +++-------- 6 files changed, 61 insertions(+), 56 deletions(-) diff --git a/build.gradle b/build.gradle index 5cdb87d8..aec06c8e 100644 --- a/build.gradle +++ b/build.gradle @@ -129,7 +129,7 @@ dependencies { compile group: 'org.fxmisc.richtext', name: 'richtextfx', version: '0.9.0' compile 'org.controlsfx:controlsfx:9.0.0' compile 'com.spaceshift:rlib.fx:5.0.2' - compile 'com.spaceshift:rlib.common:7.0.0' + compile 'com.spaceshift:rlib.common:7.1.1' compile ('com.jme3:jfx:2.0.0') { exclude group: 'org.jmonkeyengine' } diff --git a/embedded-plugins/jmb-shader-nodes/jmb-shader-nodes-1.1.1.jar b/embedded-plugins/jmb-shader-nodes/jmb-shader-nodes-1.1.1.jar index 17ff52a4a1097eb56621f05ae36b8299a7787f8a..38de7df360e4484a498310cc10da58f2c0b60cf9 100644 GIT binary patch delta 342303 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%0DpqjSVmW2CA~QsL1iXQ6oiH4r8SEkFPS*mF-+tw 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

gA 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 delta 298796 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νny=r=ugX&q;Gm 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 EMPTY_JOB_ADAPTER = new JobProgressAdapter() { + private static final JobProgressAdapter EMPTY_JOB_ADAPTER = new JobProgressAdapter<>() { public void done(@NotNull LightProbe result) { } }; @@ -107,7 +107,7 @@ public void done(@NotNull LightProbe result) { JME_APPLICATION.setDisplayStatView(false); JME_APPLICATION.setDisplayFps(false); - } catch (final Exception e) { + } catch (Exception e) { LOGGER.warning(e); throw new RuntimeException(e); } @@ -384,7 +384,7 @@ public void update() { super.update(); } - } catch (final AssetNotFoundException | NoSuchMethodError | RendererException | AssertionError | + } catch (AssetNotFoundException | NoSuchMethodError | RendererException | AssertionError | ArrayIndexOutOfBoundsException | NullPointerException | StackOverflowError | IllegalStateException | UnsupportedOperationException e) { LOGGER.warning(e); @@ -398,7 +398,7 @@ public void update() { } @JmeThread - private void finishWorkOnError(@NotNull final Throwable e) { + private void finishWorkOnError(@NotNull Throwable e) { GAnalytics.sendException(e, true); GAnalytics.waitForSend(); @@ -512,7 +512,7 @@ public void enableLightProbe() { * @param progressAdapter the progress adapter */ @JmeThread - public void updatePreviewLightProbe(@NotNull final JobProgressAdapter progressAdapter) { + public void updatePreviewLightProbe(@NotNull JobProgressAdapter progressAdapter) { var lightProbe = getPreviewLightProbe(); var environmentCamera = getPreviewEnvironmentCamera(); diff --git a/src/main/java/com/ss/editor/ui/builder/EditorFxSceneBuilder.java b/src/main/java/com/ss/editor/ui/builder/EditorFxSceneBuilder.java index 3893ae10..4bf8ceaa 100644 --- a/src/main/java/com/ss/editor/ui/builder/EditorFxSceneBuilder.java +++ b/src/main/java/com/ss/editor/ui/builder/EditorFxSceneBuilder.java @@ -16,14 +16,12 @@ import com.ss.editor.ui.component.tab.GlobalBottomToolComponent; import com.ss.editor.ui.component.tab.GlobalLeftToolComponent; import com.ss.editor.ui.css.CssClasses; -import com.ss.editor.ui.css.CssColorTheme; import com.ss.editor.ui.css.CssRegistry; import com.ss.editor.ui.event.EventRedirector; import com.ss.editor.ui.scene.EditorFxScene; import com.ss.rlib.fx.util.FXUtils; -import javafx.collections.ObservableList; +import com.ss.rlib.fx.util.FxUtils; import javafx.scene.Group; -import javafx.scene.image.ImageView; import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; import javafx.stage.Stage; @@ -72,23 +70,22 @@ public class EditorFxSceneBuilder { * @return the editor fx scene */ @FxThread - public static @NotNull EditorFxScene build(@NotNull final Stage stage) { + public static @NotNull EditorFxScene build(@NotNull Stage stage) { - final EditorConfig editorConfig = EditorConfig.getInstance(); - final CssColorTheme theme = editorConfig.getEnum(PREF_UI_THEME, PREF_DEFAULT_THEME); + var editorConfig = EditorConfig.getInstance(); + var theme = editorConfig.getEnum(PREF_UI_THEME, PREF_DEFAULT_THEME); - final Group root = new Group(); - //root.getTransforms().add(new Scale(1.5, 1.5)); + var root = new Group(); - final EditorFxScene scene = new EditorFxScene(root); + var scene = new EditorFxScene(root); scene.setFill(TRANSPARENT); scene.setRoot(root); - final ObservableList stylesheets = scene.getStylesheets(); + var stylesheets = scene.getStylesheets(); stylesheets.addAll(CSS_REGISTRY.getAvailableCssFiles()); stylesheets.add(theme.getCssFile()); - final StackPane container = scene.getContainer(); + var container = scene.getContainer(); build(scene, container, stage); @@ -98,24 +95,22 @@ public class EditorFxSceneBuilder { } @FxThread - private static void build(@NotNull final EditorFxScene scene, - @NotNull final StackPane container, - @NotNull final Stage stage) { + private static void build(@NotNull EditorFxScene scene, @NotNull StackPane container, @NotNull Stage stage) { - final ImageView canvas = scene.getCanvas(); - final EditorMenuBarComponent barComponent = new EditorMenuBarComponent(); - final EditorAreaComponent editorAreaComponent = new EditorAreaComponent(); + var canvas = scene.getCanvas(); + var barComponent = new EditorMenuBarComponent(); + var editorAreaComponent = new EditorAreaComponent(); new EventRedirector(editorAreaComponent, canvas, stage); - final GlobalLeftToolSplitPane leftSplitContainer = new GlobalLeftToolSplitPane(scene); + var leftSplitContainer = new GlobalLeftToolSplitPane(scene); leftSplitContainer.prefHeightProperty().bind(container.heightProperty()); - final GlobalBottomToolSplitPane bottomSplitContainer = new GlobalBottomToolSplitPane(scene); - final GlobalLeftToolComponent globalLeftToolComponent = new GlobalLeftToolComponent(leftSplitContainer); + var bottomSplitContainer = new GlobalBottomToolSplitPane(scene); + var globalLeftToolComponent = new GlobalLeftToolComponent(leftSplitContainer); globalLeftToolComponent.addComponent(new AssetComponent(), Messages.EDITOR_TOOL_ASSET); - final GlobalBottomToolComponent globalBottomToolComponent = new GlobalBottomToolComponent(bottomSplitContainer); + var globalBottomToolComponent = new GlobalBottomToolComponent(bottomSplitContainer); globalBottomToolComponent.addComponent(LogView.getInstance(), Messages.LOG_VIEW_TITLE); leftSplitContainer.initFor(globalLeftToolComponent, bottomSplitContainer); @@ -125,9 +120,12 @@ private static void build(@NotNull final EditorFxScene scene, bottomSplitContainer.heightProperty() .addListener((observable, oldValue, newValue) -> runLater(editorAreaComponent::requestLayout)); - FXUtils.addToPane(new VBox(barComponent, leftSplitContainer), container); + FxUtils.addClass(leftSplitContainer, bottomSplitContainer, + CssClasses.MAIN_SPLIT_PANEL); + + FxUtils.addChild(container, new VBox(barComponent, leftSplitContainer)); + FXUtils.bindFixedWidth(leftSplitContainer, container.widthProperty()); FXUtils.bindFixedWidth(barComponent, container.widthProperty()); - FXUtils.addClassTo(leftSplitContainer, bottomSplitContainer, CssClasses.MAIN_SPLIT_PANEL); } } diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java b/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java index d5f5380d..86abf683 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java @@ -20,7 +20,6 @@ import com.ss.rlib.common.util.array.ArrayComparator; import com.ss.rlib.common.util.array.ArrayFactory; import com.ss.rlib.common.util.array.ConcurrentArray; -import javafx.application.Platform; import javafx.collections.FXCollections; import javafx.event.EventHandler; import javafx.scene.control.ContextMenu; @@ -28,6 +27,8 @@ import javafx.scene.control.TreeItem; import javafx.scene.control.TreeItem.TreeModificationEvent; import javafx.scene.control.TreeView; +import javafx.scene.control.skin.TreeViewSkin; +import javafx.scene.control.skin.VirtualFlow; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import org.jetbrains.annotations.NotNull; @@ -46,22 +47,31 @@ */ public class ResourceTree extends TreeView { + public static class MySkin extends TreeViewSkin { + + public MySkin(TreeView control) { + super(control); + } + + @Override + public void updateItemCount() { + super.updateItemCount(); + } + } + /** * The executor manager. */ - @NotNull private static final ExecutorManager EXECUTOR_MANAGER = ExecutorManager.getInstance(); /** * The resource elements comparator. */ - @NotNull private static final ArrayComparator COMPARATOR = ResourceElement::compareTo; /** * The name comparator. */ - @NotNull private static final ArrayComparator NAME_COMPARATOR = (first, second) -> { var firstLevel = getLevel(first); @@ -83,7 +93,6 @@ public class ResourceTree extends TreeView { /** * The tree items comparator. */ - @NotNull private static final ArrayComparator> ITEM_COMPARATOR = (first, second) -> { var firstElement = notNull(first).getValue(); var secondElement = notNull(second).getValue(); @@ -93,7 +102,6 @@ public class ResourceTree extends TreeView { /** * The context menu filler registry. */ - @NotNull private static final AssetTreeContextMenuFillerRegistry CONTEXT_MENU_FILLER_REGISTRY = AssetTreeContextMenuFillerRegistry.getInstance(); @@ -199,6 +207,7 @@ public ResourceTree(@Nullable Consumer openFunction, boolean re setShowRoot(true); setContextMenu(new ContextMenu()); setFocusTraversable(true); + setSkin(new MySkin(this)); rootProperty().addListener((observable, oldValue, newValue) -> { if (oldValue != null) { @@ -275,9 +284,19 @@ private void repaint() { //FIXME temp fix how to refresh var stage = EditorUtil.getFxStage(); var old = stage.getWidth(); - stage.setWidth(old + 3); + //stage.setWidth(old + 3); + //setLayoutX(20F); + + //Platform.runLater(() -> stage.setWidth(old)); + //Platform.runLater(() -> setLayoutX(0)); + + MySkin mySkin = (MySkin) getSkin(); + mySkin.getChildren().stream() + .filter(VirtualFlow.class::isInstance) + .map(VirtualFlow.class::cast) + .forEach(VirtualFlow::requestLayout); - Platform.runLater(() -> stage.setWidth(old)); + mySkin.updateItemCount(); } /** diff --git a/src/main/java/com/ss/editor/ui/component/bar/EditorMenuBarComponent.java b/src/main/java/com/ss/editor/ui/component/bar/EditorMenuBarComponent.java index 6e4359f4..8cc8eea9 100644 --- a/src/main/java/com/ss/editor/ui/component/bar/EditorMenuBarComponent.java +++ b/src/main/java/com/ss/editor/ui/component/bar/EditorMenuBarComponent.java @@ -4,7 +4,6 @@ import com.ss.editor.ui.component.ScreenComponent; import com.ss.editor.ui.component.bar.action.*; import com.ss.editor.ui.css.CssIds; -import javafx.collections.ObservableList; import javafx.scene.control.Menu; import javafx.scene.control.MenuBar; import org.jetbrains.annotations.NotNull; @@ -16,15 +15,8 @@ */ public class EditorMenuBarComponent extends MenuBar implements ScreenComponent { - /** - * The constant COMPONENT_ID. - */ - @NotNull private static final String COMPONENT_ID = "EditorMenuBarComponent"; - /** - * Instantiates a new Editor bar component. - */ public EditorMenuBarComponent() { super(); setId(CssIds.EDITOR_MENU_BAR_COMPONENT); @@ -32,16 +24,14 @@ public EditorMenuBarComponent() { } private void createComponents() { - final ObservableList

menus = getMenus(); - menus.addAll(createFileMenu(), + getMenus().addAll(createFileMenu(), createOtherMenu(), createHelpMenu()); } - @NotNull - private Menu createFileMenu() { + private @NotNull Menu createFileMenu() { - final Menu menu = new Menu(Messages.EDITOR_MENU_FILE); + var menu = new Menu(Messages.EDITOR_MENU_FILE); menu.getItems().addAll(new OpenAssetAction(), new ReopenAssetMenu(), new ExitAction()); @@ -49,10 +39,9 @@ private Menu createFileMenu() { return menu; } - @NotNull - private Menu createOtherMenu() { + private @NotNull Menu createOtherMenu() { - final Menu menu = new Menu(Messages.EDITOR_MENU_OTHER); + var menu = new Menu(Messages.EDITOR_MENU_OTHER); menu.getItems().addAll(new OpenSettingsAction(), new OpenPluginsAction(), new ClearAssetCacheAction(), @@ -61,10 +50,9 @@ private Menu createOtherMenu() { return menu; } - @NotNull - private Menu createHelpMenu() { + private @NotNull Menu createHelpMenu() { - final Menu menu = new Menu(Messages.EDITOR_MENU_HELP); + var menu = new Menu(Messages.EDITOR_MENU_HELP); menu.getItems().addAll(new AboutAction()); return menu; From 1b2b2951690d7ae49c5814adf9e71b3a3ef76eea Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Fri, 25 May 2018 09:19:50 +0300 Subject: [PATCH 48/49] fixed problems with tree view. --- .../ui/builder/EditorFxSceneBuilder.java | 15 +-- .../ui/component/asset/AssetComponent.java | 2 +- .../ui/component/asset/tree/ResourceTree.java | 23 ---- .../split/pane/EditorToolSplitPane.java | 27 ++-- .../split/pane/GlobalBottomToolSplitPane.java | 40 +++--- .../split/pane/GlobalLeftToolSplitPane.java | 9 +- .../split/pane/TabToolSplitPane.java | 121 +++++++++++------- .../com/ss/editor/ui/scene/EditorFxScene.java | 6 +- 8 files changed, 128 insertions(+), 115 deletions(-) diff --git a/src/main/java/com/ss/editor/ui/builder/EditorFxSceneBuilder.java b/src/main/java/com/ss/editor/ui/builder/EditorFxSceneBuilder.java index 4bf8ceaa..c469f2ac 100644 --- a/src/main/java/com/ss/editor/ui/builder/EditorFxSceneBuilder.java +++ b/src/main/java/com/ss/editor/ui/builder/EditorFxSceneBuilder.java @@ -2,7 +2,6 @@ import static com.ss.editor.config.DefaultSettingsProvider.Defaults.PREF_DEFAULT_THEME; import static com.ss.editor.config.DefaultSettingsProvider.Preferences.PREF_UI_THEME; -import static javafx.application.Platform.runLater; import static javafx.scene.paint.Color.TRANSPARENT; import com.ss.editor.Messages; import com.ss.editor.annotation.FxThread; @@ -19,7 +18,6 @@ import com.ss.editor.ui.css.CssRegistry; import com.ss.editor.ui.event.EventRedirector; import com.ss.editor.ui.scene.EditorFxScene; -import com.ss.rlib.fx.util.FXUtils; import com.ss.rlib.fx.util.FxUtils; import javafx.scene.Group; import javafx.scene.layout.StackPane; @@ -104,7 +102,8 @@ private static void build(@NotNull EditorFxScene scene, @NotNull StackPane conta new EventRedirector(editorAreaComponent, canvas, stage); var leftSplitContainer = new GlobalLeftToolSplitPane(scene); - leftSplitContainer.prefHeightProperty().bind(container.heightProperty()); + leftSplitContainer.prefHeightProperty() + .bind(container.heightProperty()); var bottomSplitContainer = new GlobalBottomToolSplitPane(scene); var globalLeftToolComponent = new GlobalLeftToolComponent(leftSplitContainer); @@ -116,16 +115,14 @@ private static void build(@NotNull EditorFxScene scene, @NotNull StackPane conta leftSplitContainer.initFor(globalLeftToolComponent, bottomSplitContainer); bottomSplitContainer.initFor(globalBottomToolComponent, editorAreaComponent); - // to fix with layout bottom panel - bottomSplitContainer.heightProperty() - .addListener((observable, oldValue, newValue) -> runLater(editorAreaComponent::requestLayout)); - FxUtils.addClass(leftSplitContainer, bottomSplitContainer, CssClasses.MAIN_SPLIT_PANEL); FxUtils.addChild(container, new VBox(barComponent, leftSplitContainer)); - FXUtils.bindFixedWidth(leftSplitContainer, container.widthProperty()); - FXUtils.bindFixedWidth(barComponent, container.widthProperty()); + leftSplitContainer.prefWidthProperty() + .bind(container.widthProperty()); + barComponent.prefWidthProperty() + .bind(container.widthProperty()); } } diff --git a/src/main/java/com/ss/editor/ui/component/asset/AssetComponent.java b/src/main/java/com/ss/editor/ui/component/asset/AssetComponent.java index 5d665e4c..c699a4e4 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/AssetComponent.java +++ b/src/main/java/com/ss/editor/ui/component/asset/AssetComponent.java @@ -232,7 +232,7 @@ private boolean isIgnoreExpanded() { * @param ignoreExpanded true if the expand listener is ignored. */ @FromAnyThread - private void setIgnoreExpanded(final boolean ignoreExpanded) { + private void setIgnoreExpanded(boolean ignoreExpanded) { this.ignoreExpanded = ignoreExpanded; } diff --git a/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java b/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java index 86abf683..fcdcd6eb 100644 --- a/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java +++ b/src/main/java/com/ss/editor/ui/component/asset/tree/ResourceTree.java @@ -27,8 +27,6 @@ import javafx.scene.control.TreeItem; import javafx.scene.control.TreeItem.TreeModificationEvent; import javafx.scene.control.TreeView; -import javafx.scene.control.skin.TreeViewSkin; -import javafx.scene.control.skin.VirtualFlow; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import org.jetbrains.annotations.NotNull; @@ -47,18 +45,6 @@ */ public class ResourceTree extends TreeView { - public static class MySkin extends TreeViewSkin { - - public MySkin(TreeView control) { - super(control); - } - - @Override - public void updateItemCount() { - super.updateItemCount(); - } - } - /** * The executor manager. */ @@ -207,7 +193,6 @@ public ResourceTree(@Nullable Consumer openFunction, boolean re setShowRoot(true); setContextMenu(new ContextMenu()); setFocusTraversable(true); - setSkin(new MySkin(this)); rootProperty().addListener((observable, oldValue, newValue) -> { if (oldValue != null) { @@ -289,14 +274,6 @@ private void repaint() { //Platform.runLater(() -> stage.setWidth(old)); //Platform.runLater(() -> setLayoutX(0)); - - MySkin mySkin = (MySkin) getSkin(); - mySkin.getChildren().stream() - .filter(VirtualFlow.class::isInstance) - .map(VirtualFlow.class::cast) - .forEach(VirtualFlow::requestLayout); - - mySkin.updateItemCount(); } /** diff --git a/src/main/java/com/ss/editor/ui/component/split/pane/EditorToolSplitPane.java b/src/main/java/com/ss/editor/ui/component/split/pane/EditorToolSplitPane.java index 7690adfa..8099eb2c 100644 --- a/src/main/java/com/ss/editor/ui/component/split/pane/EditorToolSplitPane.java +++ b/src/main/java/com/ss/editor/ui/component/split/pane/EditorToolSplitPane.java @@ -4,7 +4,7 @@ import com.ss.editor.ui.component.editor.state.EditorToolConfig; import com.ss.editor.ui.component.tab.GlobalLeftToolComponent; import com.ss.editor.ui.component.tab.TabToolComponent; -import javafx.application.Platform; +import com.ss.rlib.fx.util.ObservableUtils; import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.control.SplitPane; @@ -24,23 +24,24 @@ public class EditorToolSplitPane extends TabToolSplitPane { @NotNull private final Region root; - public EditorToolSplitPane(@NotNull final Scene scene, @NotNull final Region root) { + public EditorToolSplitPane(@NotNull Scene scene, @NotNull Region root) { super(scene, null); this.root = root; } @Override @FxThread - public void initFor(@NotNull final TabToolComponent toolComponent, @NotNull final Node other) { - super.initFor(toolComponent, other); - root.widthProperty().addListener((observableValue, oldValue, newValue) -> handleSceneChanged(getSceneSize())); + public void initFor(@NotNull TabToolComponent toolComponent, @NotNull Node another) { + super.initFor(toolComponent, another); + ObservableUtils.onChange(root.widthProperty(), + () -> handleSceneChanged(getSceneSize())); } @Override @FxThread - protected void handleSceneChanged(@NotNull final Number newSize) { + protected void handleSceneChanged(@NotNull Number newSize) { super.handleSceneChanged(newSize); - Platform.runLater(this::requestLayout); + EXECUTOR_MANAGER.addFxTask(this::requestLayout); } @Override @@ -50,7 +51,7 @@ protected void bindToScene() { @Override @FxThread - protected void addElements(@NotNull final TabToolComponent toolComponent, @NotNull final Node other) { + protected void addElements(@NotNull TabToolComponent toolComponent, @NotNull Node other) { getItems().setAll(other, toolComponent); } @@ -68,13 +69,13 @@ protected int loadSize() { @Override @FxThread - protected void saveCollapsed(final boolean collapsed) { + protected void storeCollapsed(boolean collapsed) { getConfig().setToolCollapsed(collapsed); } @Override @FxThread - protected void saveSize(final int size) { + protected void storeSize(int size) { getConfig().setToolWidth(size); } @@ -87,13 +88,13 @@ protected double getCollapsedPosition() { @Override @FxThread protected double getSceneSize() { - final double width = root.getWidth(); - return width == 0 ? scene.getWidth() : width; + var width = root.getWidth(); + return Double.compare(width, 0D) == 0 ? scene.getWidth() : width; } @Override @FxThread - protected double getExpandPosition(final double toolSize, final double sceneSize) { + protected double getExpandPosition(double toolSize, double sceneSize) { return 1D - super.getExpandPosition(toolSize, sceneSize); } } diff --git a/src/main/java/com/ss/editor/ui/component/split/pane/GlobalBottomToolSplitPane.java b/src/main/java/com/ss/editor/ui/component/split/pane/GlobalBottomToolSplitPane.java index 79b00187..c565c5bd 100644 --- a/src/main/java/com/ss/editor/ui/component/split/pane/GlobalBottomToolSplitPane.java +++ b/src/main/java/com/ss/editor/ui/component/split/pane/GlobalBottomToolSplitPane.java @@ -1,7 +1,9 @@ package com.ss.editor.ui.component.split.pane; +import com.ss.editor.annotation.FxThread; import com.ss.editor.config.EditorConfig; import com.ss.editor.ui.component.tab.TabToolComponent; +import com.ss.rlib.fx.util.ObservableUtils; import javafx.geometry.Orientation; import javafx.scene.Node; import javafx.scene.Scene; @@ -15,66 +17,70 @@ */ public class GlobalBottomToolSplitPane extends TabToolSplitPane { - /** - * Instantiates a new Global bottom tool split pane. - * - * @param scene the scene - */ - public GlobalBottomToolSplitPane(@NotNull final Scene scene) { + public GlobalBottomToolSplitPane(@NotNull Scene scene) { super(scene, EditorConfig.getInstance()); setOrientation(Orientation.VERTICAL); } @Override - protected void addElements(@NotNull final TabToolComponent toolComponent, @NotNull final Node other) { + @FxThread + protected void addElements(@NotNull TabToolComponent toolComponent, @NotNull Node other) { getItems().setAll(other, toolComponent); } @Override - protected void addListeners(@NotNull final TabToolComponent toolComponent) { - toolComponent.heightProperty() - .addListener((observable, oldValue, newValue) -> handleToolChanged(newValue)); + @FxThread + protected void addListeners(@NotNull TabToolComponent toolComponent) { + ObservableUtils.onChange(toolComponent.heightProperty(), this::handleToolChanged); } @Override + @FxThread protected void bindToScene() { - scene.heightProperty() - .addListener((observableValue, oldValue, newValue) -> handleSceneChanged(getSceneSize())); + ObservableUtils.onChange(scene.heightProperty(), + number -> handleSceneChanged(getSceneSize())); } @Override + @FxThread protected boolean loadCollapsed() { return getConfig().isGlobalBottomToolCollapsed(); } @Override + @FxThread protected int loadSize() { return getConfig().getGlobalBottomToolHeight(); } @Override - protected void saveCollapsed(final boolean collapsed) { + @FxThread + protected void storeCollapsed(boolean collapsed) { getConfig().setGlobalBottomToolCollapsed(collapsed); } @Override - protected void saveSize(final int size) { + @FxThread + protected void storeSize(int size) { getConfig().setGlobalBottomToolHeight(size); } @Override + @FxThread protected double getCollapsedPosition() { return 1; } @Override + @FxThread protected double getSceneSize() { - final double height = scene.getHeight(); - return height == 0 ? scene.getHeight() : height; + var height = scene.getHeight(); + return Double.compare(height, 0D) == 0 ? scene.getHeight() : height; } @Override - protected double getExpandPosition(final double toolSize, final double sceneSize) { + @FxThread + protected double getExpandPosition(double toolSize, double sceneSize) { return 1D - super.getExpandPosition(toolSize, sceneSize); } } diff --git a/src/main/java/com/ss/editor/ui/component/split/pane/GlobalLeftToolSplitPane.java b/src/main/java/com/ss/editor/ui/component/split/pane/GlobalLeftToolSplitPane.java index b9969ab1..d7c09dc0 100644 --- a/src/main/java/com/ss/editor/ui/component/split/pane/GlobalLeftToolSplitPane.java +++ b/src/main/java/com/ss/editor/ui/component/split/pane/GlobalLeftToolSplitPane.java @@ -1,5 +1,6 @@ package com.ss.editor.ui.component.split.pane; +import com.ss.editor.annotation.FxThread; import com.ss.editor.config.EditorConfig; import com.ss.editor.ui.component.tab.GlobalLeftToolComponent; @@ -20,22 +21,26 @@ public GlobalLeftToolSplitPane(@NotNull Scene scene) { } @Override + @FxThread protected boolean loadCollapsed() { return getConfig().isGlobalLeftToolCollapsed(); } @Override + @FxThread protected int loadSize() { return getConfig().getGlobalLeftToolWidth(); } @Override - protected void saveCollapsed(boolean collapsed) { + @FxThread + protected void storeCollapsed(boolean collapsed) { getConfig().setGlobalLeftToolCollapsed(collapsed); } @Override - protected void saveSize(int size) { + @FxThread + protected void storeSize(int size) { getConfig().setGlobalLeftToolWidth(size); } } diff --git a/src/main/java/com/ss/editor/ui/component/split/pane/TabToolSplitPane.java b/src/main/java/com/ss/editor/ui/component/split/pane/TabToolSplitPane.java index 9473b0bf..3cbc332c 100644 --- a/src/main/java/com/ss/editor/ui/component/split/pane/TabToolSplitPane.java +++ b/src/main/java/com/ss/editor/ui/component/split/pane/TabToolSplitPane.java @@ -3,7 +3,10 @@ import static com.ss.rlib.common.util.ObjectUtils.notNull; import static java.lang.Math.max; import static java.lang.Math.min; +import com.ss.editor.annotation.FxThread; +import com.ss.editor.manager.ExecutorManager; import com.ss.editor.ui.component.tab.TabToolComponent; +import com.ss.rlib.fx.util.ObservableUtils; import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.control.SplitPane; @@ -13,11 +16,13 @@ /** * The implementation of the {@link SplitPane} for the {@link TabToolComponent}. * - * @param the type parameter + * @param the config's type. * @author JavaSaBr */ public abstract class TabToolSplitPane extends SplitPane { + protected static final ExecutorManager EXECUTOR_MANAGER = ExecutorManager.getInstance(); + /** * The scene. */ @@ -46,7 +51,7 @@ public abstract class TabToolSplitPane extends SplitPane { */ private boolean collapsed; - protected TabToolSplitPane(@NotNull final Scene scene, @Nullable C config) { + protected TabToolSplitPane(@NotNull Scene scene, @Nullable C config) { this.scene = scene; this.config = config; if (config != null) { @@ -56,11 +61,12 @@ protected TabToolSplitPane(@NotNull final Scene scene, @Nullable C config) { } /** - * Update this pane for the new config. + * Update this pane to use the new config. * - * @param config the config + * @param config the config. */ - public void updateFor(@NotNull final C config) { + @FxThread + public void updateFor(@NotNull C config) { this.config = config; this.size = loadSize(); this.collapsed = loadCollapsed(); @@ -68,87 +74,97 @@ public void updateFor(@NotNull final C config) { } /** - * Load collapsed boolean. + * Load stored collapsed state of this pane. * - * @return the stored flag of collapsed. + * @return true of this pane was collapsed. */ + @FxThread protected boolean loadCollapsed() { return false; } /** - * Load size int. + * Load stored size of this pane. * - * @return the stored size of the tool component. + * @return the stored size of this pane. */ + @FxThread protected int loadSize() { return 1; } /** - * @return true if the tool collapsed. + * Return true if the tool is collapsed. + * + * @return true if the tool is collapsed. */ + @FxThread private boolean isCollapsed() { return collapsed; } /** + * Get the tool component. + * * @return the tool component. */ - @NotNull - private TabToolComponent getToolComponent() { + @FxThread + private @NotNull TabToolComponent getToolComponent() { return notNull(toolComponent); } /** - * Gets config. + * Get the current config. * - * @return the config. + * @return the current config. */ - @NotNull - public C getConfig() { + @FxThread + public @NotNull C getConfig() { return notNull(config); } /** * Init this split pane for the tool component. * - * @param toolComponent the tool component - * @param other the other + * @param toolComponent the tool component. + * @param another the another node. */ - public void initFor(@NotNull final TabToolComponent toolComponent, @NotNull final Node other) { + @FxThread + public void initFor(@NotNull TabToolComponent toolComponent, @NotNull Node another) { this.toolComponent = toolComponent; - addElements(toolComponent, other); + addElements(toolComponent, another); addListeners(toolComponent); bindToScene(); update(); } /** - * Add with listener to handle size changes. + * Add a width listener to handle changes of the tool component's size. * - * @param toolComponent the tool component + * @param toolComponent the tool component. */ - protected void addListeners(@NotNull final TabToolComponent toolComponent) { - toolComponent.widthProperty() - .addListener((observable, oldValue, newValue) -> handleToolChanged(newValue)); + @FxThread + protected void addListeners(@NotNull TabToolComponent toolComponent) { + ObservableUtils.onChange(toolComponent.widthProperty(), this::handleToolChanged); } /** * Bind to the scene. */ + @FxThread protected void bindToScene() { - scene.widthProperty() - .addListener((observableValue, oldValue, newValue) -> handleSceneChanged(getSceneSize())); + ObservableUtils.onChange(scene.widthProperty(), + () -> handleSceneChanged(getSceneSize())); } /** - * Add an element to the tool component. + * Add the tool component to this pane. * * @param toolComponent the tool component. * @param other the element. */ - protected void addElements(@NotNull final TabToolComponent toolComponent, @NotNull final Node other) { + @FxThread + protected void addElements(@NotNull TabToolComponent toolComponent, @NotNull Node other) { getItems().addAll(toolComponent, other); } @@ -156,7 +172,10 @@ protected void addElements(@NotNull final TabToolComponent toolComponent, @NotNu * Update. */ protected void update() { - if (config == null) return; + + if (config == null) { + return; + } if (isCollapsed()) { getToolComponent().collapse(); @@ -170,24 +189,29 @@ protected void update() { * * @param newValue the new value */ - protected void handleToolChanged(@NotNull final Number newValue) { - if (config == null) return; + protected void handleToolChanged(@NotNull Number newValue) { + + if (config == null) { + return; + } + + var toolComponent = getToolComponent(); this.collapsed = toolComponent.isCollapsed(); - saveCollapsed(collapsed); + + storeCollapsed(isCollapsed()); if (!isCollapsed()) { int abs = Math.abs(size - newValue.intValue()); size = abs > 2 ? newValue.intValue() : size; - saveSize(size); + storeSize(size); } toolComponent.setExpandPosition(getExpandPosition(size, getSceneSize())); - handleSceneChanged(getSceneSize()); } /** - * Gets scene size. + * Get the current scene size. * * @return the scene size. */ @@ -196,19 +220,19 @@ protected double getSceneSize() { } /** - * Save the flag of collapsed. + * Store the current collapsed state. * - * @param collapsed the collapsed + * @param collapsed the current collapsed state. */ - protected void saveCollapsed(final boolean collapsed) { + protected void storeCollapsed(boolean collapsed) { } /** - * Save the size of the tool component. + * Save the current size. * - * @param size the size + * @param size the current size. */ - protected void saveSize(final int size) { + protected void storeSize(int size) { } /** @@ -216,10 +240,11 @@ protected void saveSize(final int size) { * * @param newSize the new size */ - protected void handleSceneChanged(@NotNull final Number newSize) { - if (config == null) return; + protected void handleSceneChanged(@NotNull Number newSize) { - if (isCollapsed()) { + if (config == null) { + return; + } else if (isCollapsed()) { setDividerPosition(getDividerIndex(), getCollapsedPosition()); return; } @@ -228,7 +253,7 @@ protected void handleSceneChanged(@NotNull final Number newSize) { } /** - * Gets collapsed position. + * Get the collapsed position. * * @return the collapsed position. */ @@ -237,6 +262,8 @@ protected double getCollapsedPosition() { } /** + * Get the divider index. + * * @return the divider index. */ private int getDividerIndex() { @@ -250,7 +277,7 @@ private int getDividerIndex() { * @param sceneSize the scene size * @return the expand position */ - protected double getExpandPosition(final double toolSize, final double sceneSize) { + protected double getExpandPosition(double toolSize, double sceneSize) { return min(1, max(0.1, toolSize / sceneSize)); } } diff --git a/src/main/java/com/ss/editor/ui/scene/EditorFxScene.java b/src/main/java/com/ss/editor/ui/scene/EditorFxScene.java index 4cfd7c6e..9ce78aaf 100644 --- a/src/main/java/com/ss/editor/ui/scene/EditorFxScene.java +++ b/src/main/java/com/ss/editor/ui/scene/EditorFxScene.java @@ -83,7 +83,7 @@ public class EditorFxScene extends Scene { @Nullable private Node focused; - public EditorFxScene(@NotNull final Group root) { + public EditorFxScene(@NotNull Group root) { super(root); this.canvas = new EditorFxImageView(); @@ -105,8 +105,6 @@ public EditorFxScene(@NotNull final Group root) { var background = new Pane(); background.setId(CssIds.ROOT); - // FxUtils.addDebugBorderTo(canvas); - FxUtils.addChild(root, hideLayer, background, container, loadingLayer); FXUtils.bindFixedWidth(background, widthProperty()); @@ -227,6 +225,7 @@ private void showLoading() { var loadingLayer = getLoadingLayer(); loadingLayer.setVisible(true); + loadingLayer.setManaged(true); loadingLayer.toFront(); progressIndicator = new ProgressIndicator(ProgressIndicator.INDETERMINATE_PROGRESS); @@ -246,6 +245,7 @@ private void hideLoading() { var loadingLayer = getLoadingLayer(); loadingLayer.setVisible(false); + loadingLayer.setManaged(false); loadingLayer.getChildren().clear(); progressIndicator = null; From 6f657d13fbe8d1fa0d6c2a41672d2cd3cd317ef1 Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Mon, 28 May 2018 09:28:44 +0300 Subject: [PATCH 49/49] refactoring. --- build.gradle | 4 +- src/main/java/com/jme3/scene/Spatial.java | 83 ++++++-- src/main/java/com/ss/editor/EditorThread.java | 4 +- .../java/com/ss/editor/FileExtensions.java | 21 +- .../java/com/ss/editor/JfxApplication.java | 1 - .../java/com/ss/editor/JmeApplication.java | 2 +- .../terrain/LevelTerrainToolControl.java | 132 ++++++------ .../terrain/SlopeTerrainToolControl.java | 167 +++++++-------- .../ss/editor/manager/ClasspathManager.java | 10 +- .../com/ss/editor/plugin/EditorPlugin.java | 34 ++-- .../plugin/api/RenderFilterExtension.java | 6 +- .../api/dialog/GenericFactoryDialog.java | 30 ++- .../api/file/creator/GenericFileCreator.java | 30 +-- .../api/messages/MessagesPluginFactory.java | 19 +- .../plugin/api/settings/SettingsCategory.java | 7 +- .../settings/SettingsPropertyDefinition.java | 69 +++++-- .../plugin/api/settings/SettingsProvider.java | 6 +- .../settings/SettingsProviderRegistry.java | 25 ++- .../remote/control/client/ClientCommand.java | 2 +- .../InitLocalClasspathClientCommand.java | 15 +- .../client/LoadLocalClassesClientCommand.java | 13 +- .../LoadLocalLibrariesClientCommand.java | 9 +- .../control/client/OpenFileClientCommand.java | 2 +- .../ss/editor/task/CheckNewVersionTask.java | 45 ++-- .../com/ss/editor/util/AnimationUtils.java | 80 ++++---- .../com/ss/editor/util/AudioNodeUtils.java | 21 +- .../java/com/ss/editor/util/ControlUtils.java | 39 ++-- .../java/com/ss/editor/util/EditorUtil.java | 18 +- .../ss/editor/util/ExtObjectInputStream.java | 21 +- .../java/com/ss/editor/util/GeomUtils.java | 168 ++++++++------- .../java/com/ss/editor/util/GlslType.java | 12 +- .../java/com/ss/editor/util/LocalObjects.java | 7 +- .../ss/editor/util/MaterialSerializer.java | 50 ++--- .../com/ss/editor/util/MaterialUtils.java | 192 ++++++++++-------- .../java/com/ss/editor/util/NodeUtils.java | 177 ++++++++-------- .../com/ss/editor/util/OpenGLVersion.java | 13 +- .../com/ss/editor/util/PaintingUtils.java | 97 +++------ .../editor/util/ReusableCollisionResults.java | 6 +- .../com/ss/editor/util/SimpleFileVisitor.java | 19 +- .../ss/editor/util/SimpleFolderVisitor.java | 7 +- .../com/ss/editor/util/TangentGenerator.java | 19 +- .../util/svg/SvgImageLoaderFactory.java | 3 +- 42 files changed, 886 insertions(+), 799 deletions(-) diff --git a/build.gradle b/build.gradle index aec06c8e..8609991e 100644 --- a/build.gradle +++ b/build.gradle @@ -55,7 +55,7 @@ mainClassName = "com.ss.editor.JfxApplication" ext.applicationMainClass = "com.ss.editor.JfxApplication" ext.applicationVendor = "javasabr@gmail.com" ext.applicationTitle = "jMonkeyBuilder" -ext.jmeVersion = "develop-SNAPSHOT" +ext.jmeVersion = "3.2.1-SNAPSHOT" ext.jmbExtVersion = "2.3.1" ext.jme3_xbuf_version = '0.9.1' ext.junitPlatformVersion = "1.0.0" @@ -129,7 +129,7 @@ dependencies { compile group: 'org.fxmisc.richtext', name: 'richtextfx', version: '0.9.0' compile 'org.controlsfx:controlsfx:9.0.0' compile 'com.spaceshift:rlib.fx:5.0.2' - compile 'com.spaceshift:rlib.common:7.1.1' + compile 'com.spaceshift:rlib.common:7.1.2' compile ('com.jme3:jfx:2.0.0') { exclude group: 'org.jmonkeyengine' } diff --git a/src/main/java/com/jme3/scene/Spatial.java b/src/main/java/com/jme3/scene/Spatial.java index c0df8334..534f46c7 100644 --- a/src/main/java/com/jme3/scene/Spatial.java +++ b/src/main/java/com/jme3/scene/Spatial.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2018 jMonkeyEngine + * Copyright (c) 2009-2013 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -31,7 +31,6 @@ */ package com.jme3.scene; -import com.jme3.anim.util.HasLocalTransform; import com.jme3.asset.AssetKey; import com.jme3.asset.CloneableSmartAsset; import com.jme3.bounding.BoundingVolume; @@ -49,18 +48,18 @@ import com.jme3.renderer.queue.RenderQueue.Bucket; import com.jme3.renderer.queue.RenderQueue.ShadowMode; import com.jme3.scene.control.Control; -import com.jme3.util.SafeArrayList; -import com.jme3.util.TempVars; import com.jme3.util.clone.Cloner; import com.jme3.util.clone.IdentityCloneFunction; import com.jme3.util.clone.JmeCloneable; +import com.jme3.util.SafeArrayList; +import com.jme3.util.TempVars; import java.io.IOException; import java.util.*; import java.util.logging.Logger; /** * Spatial defines the base class for scene graph nodes. It - * maintains a link to a parent, its local transforms and the world's + * maintains a link to a parent, it's local transforms and the world's * transforms. All other scene graph elements, such as {@link Node} and * {@link Geometry} are subclasses of Spatial. * @@ -68,7 +67,7 @@ * @author Joshua Slack * @version $Revision: 4075 $, $Data$ */ -public abstract class Spatial implements Savable, Cloneable, Collidable, CloneableSmartAsset, JmeCloneable, HasLocalTransform { +public abstract class Spatial implements Savable, Cloneable, Collidable, CloneableSmartAsset, JmeCloneable { private static final Logger logger = Logger.getLogger(Spatial.class.getName()); @@ -574,8 +573,8 @@ public void lookAt(Vector3f position, Vector3f upVector) { * Should be overridden by Node and Geometry. */ protected void updateWorldBound() { - // the world bound of a leaf is the same as its model bound - // for a node, the world bound is a combination of all its children + // the world bound of a leaf is the same as it's model bound + // for a node, the world bound is a combination of all it's children // bounds // -> handled by subclass refreshFlags &= ~RF_BOUND; @@ -973,7 +972,7 @@ protected void setParent(Node parent) { } /** - * removeFromParent removes this Spatial from its parent. + * removeFromParent removes this Spatial from it's parent. * * @return true if it has a parent and performed the remove. */ @@ -1374,11 +1373,66 @@ public Spatial clone( boolean cloneMaterial ) { } /** - * The old clone() method that did not use the new Cloner utility. + * The old clone() method that did not use the new Cloner utility. */ - @Deprecated public Spatial oldClone(boolean cloneMaterial) { - throw new UnsupportedOperationException(); + try { + Spatial clone = (Spatial) super.clone(); + if (worldBound != null) { + clone.worldBound = worldBound.clone(); + } + clone.worldLights = worldLights.clone(); + clone.localLights = localLights.clone(); + + // Set the new owner of the light lists + clone.localLights.setOwner(clone); + clone.worldLights.setOwner(clone); + + clone.worldOverrides = new SafeArrayList<>(MatParamOverride.class); + clone.localOverrides = new SafeArrayList<>(MatParamOverride.class); + + for (MatParamOverride override : localOverrides) { + clone.localOverrides.add((MatParamOverride) override.clone()); + } + + // No need to force cloned to update. + // This node already has the refresh flags + // set below so it will have to update anyway. + clone.worldTransform = worldTransform.clone(); + clone.localTransform = localTransform.clone(); + + if (clone instanceof Node) { + Node node = (Node) this; + Node nodeClone = (Node) clone; + nodeClone.children = new SafeArrayList(Spatial.class); + for (Spatial child : node.children) { + Spatial childClone = child.clone(cloneMaterial); + childClone.parent = nodeClone; + nodeClone.children.add(childClone); + } + } + + clone.parent = null; + clone.setBoundRefresh(); + clone.setTransformRefresh(); + clone.setLightListRefresh(); + clone.setMatParamOverrideRefresh(); + + clone.controls = new SafeArrayList(Control.class); + for (int i = 0; i < controls.size(); i++) { + Control newControl = controls.get(i).cloneForSpatial(clone); + newControl.setSpatial(clone); + clone.controls.add(newControl); + } + + if (userData != null) { + clone.userData = (HashMap) userData.clone(); + } + + return clone; + } catch (CloneNotSupportedException ex) { + throw new AssertionError(); + } } /** @@ -1388,6 +1442,9 @@ public Spatial oldClone(boolean cloneMaterial) { * Note that meshes of geometries are not cloned explicitly, they * are shared if static, or specially cloned if animated. * + * All controls will be cloned using the Control.cloneForSpatial method + * on the clone. + * * @see Mesh#cloneForAnim() */ @Override @@ -1822,4 +1879,4 @@ public boolean isVisible() { public void setVisible(boolean visible) { this.visible = visible; } -} +} \ No newline at end of file diff --git a/src/main/java/com/ss/editor/EditorThread.java b/src/main/java/com/ss/editor/EditorThread.java index e4fe3294..631bcbe2 100644 --- a/src/main/java/com/ss/editor/EditorThread.java +++ b/src/main/java/com/ss/editor/EditorThread.java @@ -21,12 +21,12 @@ public EditorThread() { this.localObjects = new LocalObjects(); } - public EditorThread(@NotNull final Runnable target) { + public EditorThread(@NotNull Runnable target) { super(target); this.localObjects = new LocalObjects(); } - public EditorThread(@NotNull final ThreadGroup group, @NotNull final Runnable target, @NotNull final String name) { + public EditorThread(@NotNull ThreadGroup group, @NotNull Runnable target, @NotNull String name) { super(group, target, name); this.localObjects = new LocalObjects(); } diff --git a/src/main/java/com/ss/editor/FileExtensions.java b/src/main/java/com/ss/editor/FileExtensions.java index 5360bc62..601d16bc 100644 --- a/src/main/java/com/ss/editor/FileExtensions.java +++ b/src/main/java/com/ss/editor/FileExtensions.java @@ -1,7 +1,6 @@ package com.ss.editor; import com.ss.rlib.common.util.array.Array; -import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; /** @@ -49,7 +48,7 @@ public interface FileExtensions { @NotNull String MODEL_MESH_XML = "mesh.xml"; @NotNull String MODEL_XBUF = "xbuf"; - @NotNull Array IMAGE_EXTENSIONS = ArrayFactory.asArray( + @NotNull Array IMAGE_EXTENSIONS = Array.of( IMAGE_PNG, IMAGE_JPG, IMAGE_JPEG, @@ -58,24 +57,26 @@ public interface FileExtensions { IMAGE_HDR, IMAGE_BMP, IMAGE_GIF, - IMAGE_TIFF); + IMAGE_TIFF + ); - @NotNull Array TEXTURE_EXTENSIONS = ArrayFactory.asArray( + @NotNull Array TEXTURE_EXTENSIONS = Array.of( IMAGE_PNG, IMAGE_JPG, IMAGE_JPEG, IMAGE_TGA, IMAGE_DDS, - IMAGE_HDR); + IMAGE_HDR + ); - @NotNull Array SHADER_EXTENSIONS = ArrayFactory.asArray(GLSL_FRAGMENT, + @NotNull Array SHADER_EXTENSIONS = Array.of( + GLSL_FRAGMENT, GLSL_VERTEX, GLSL_TESSELLATION_CONTROL, GLSL_TESSELLATION_EVALUATION, GLSL_GEOM, - GLSL_LIB); + GLSL_LIB + ); - @NotNull Array AUDIO_EXTENSIONS = ArrayFactory.asArray(AUDIO_MP3, - AUDIO_WAV, - AUDIO_OGG); + @NotNull Array AUDIO_EXTENSIONS = Array.of(AUDIO_MP3, AUDIO_WAV, AUDIO_OGG); } \ No newline at end of file diff --git a/src/main/java/com/ss/editor/JfxApplication.java b/src/main/java/com/ss/editor/JfxApplication.java index ed57a858..d06ee5f7 100644 --- a/src/main/java/com/ss/editor/JfxApplication.java +++ b/src/main/java/com/ss/editor/JfxApplication.java @@ -77,7 +77,6 @@ */ public class JfxApplication extends Application { - @NotNull private static final Logger LOGGER = LoggerManager.getLogger(JfxApplication.class); @Nullable diff --git a/src/main/java/com/ss/editor/JmeApplication.java b/src/main/java/com/ss/editor/JmeApplication.java index 667f5386..641118a1 100644 --- a/src/main/java/com/ss/editor/JmeApplication.java +++ b/src/main/java/com/ss/editor/JmeApplication.java @@ -59,7 +59,6 @@ */ public class JmeApplication extends JmeToJfxApplication { - @NotNull private static final Logger LOGGER = LoggerManager.getLogger(JmeApplication.class); /** @@ -371,6 +370,7 @@ public void simpleUpdate(float tpf) { @Override @JmeThread public void update() { + var stamp = syncLock(); try { diff --git a/src/main/java/com/ss/editor/control/painting/terrain/LevelTerrainToolControl.java b/src/main/java/com/ss/editor/control/painting/terrain/LevelTerrainToolControl.java index 245b5663..c8d1b346 100644 --- a/src/main/java/com/ss/editor/control/painting/terrain/LevelTerrainToolControl.java +++ b/src/main/java/com/ss/editor/control/painting/terrain/LevelTerrainToolControl.java @@ -1,6 +1,6 @@ package com.ss.editor.control.painting.terrain; -import static com.ss.editor.util.PaintingUtils.*; +import static com.ss.editor.util.PaintingUtils.isContains; import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.math.ColorRGBA; import com.jme3.math.Quaternion; @@ -8,18 +8,17 @@ import com.jme3.math.Vector3f; import com.jme3.scene.Geometry; import com.jme3.scene.Node; -import com.jme3.scene.Spatial; +import com.jme3.scene.Spatial.CullHint; import com.jme3.scene.shape.Sphere; -import com.jme3.terrain.Terrain; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.JmeThread; import com.ss.editor.control.painting.PaintingInput; import com.ss.editor.ui.component.painting.terrain.TerrainPaintingComponent; -import com.ss.editor.util.LocalObjects; +import com.ss.editor.util.PaintingUtils; +import com.ss.rlib.common.util.ExtMath; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; -import java.util.List; /** * The implementation of terrain tool to change height by level. @@ -49,7 +48,7 @@ public class LevelTerrainToolControl extends ChangeHeightTerrainToolControl { */ private boolean precision; - public LevelTerrainToolControl(@NotNull final TerrainPaintingComponent component) { + public LevelTerrainToolControl(@NotNull TerrainPaintingComponent component) { super(component); this.levelMarker = new Geometry("LevelMarker", new Sphere(8, 8, 1)); @@ -58,34 +57,31 @@ public LevelTerrainToolControl(@NotNull final TerrainPaintingComponent component @Override @JmeThread - protected void onAttached(@NotNull final Node node) { + protected void onAttached(@NotNull Node node) { super.onAttached(node); - final Spatial editedModel = notNull(getPaintedModel()); - final Geometry levelMarker = getLevelMarker(); + var editedModel = notNull(getPaintedModel()); + var levelMarker = getLevelMarker(); - final Node markersNode = component.getMarkersNode(); - markersNode.attachChild(levelMarker); + component.getMarkersNode() + .attachChild(levelMarker); levelMarker.setLocalTranslation(editedModel.getWorldTranslation()); } @Override @JmeThread - protected void onDetached(@NotNull final Node node) { + protected void onDetached(@NotNull Node node) { super.onDetached(node); - - final Node markersNode = component.getMarkersNode(); - markersNode.detachChild(getLevelMarker()); + component.getMarkersNode() + .detachChild(getLevelMarker()); } @Override @JmeThread - protected void controlUpdate(final float tpf) { + protected void controlUpdate(float tpf) { super.controlUpdate(tpf); - - final Geometry levelMarker = getLevelMarker(); - levelMarker.setCullHint(isUseMarker() ? Spatial.CullHint.Never : Spatial.CullHint.Always); + getLevelMarker().setCullHint(isUseMarker() ? CullHint.Never : CullHint.Always); } @Override @@ -96,8 +92,11 @@ protected void controlUpdate(final float tpf) { @Override @JmeThread - public void startPainting(@NotNull final PaintingInput input, @NotNull final Quaternion brushRotation, - @NotNull final Vector3f contactPoint) { + public void startPainting( + @NotNull PaintingInput input, + @NotNull Quaternion brushRotation, + @NotNull Vector3f contactPoint + ) { super.startPainting(input, brushRotation, contactPoint); switch (input) { @@ -115,12 +114,10 @@ public void startPainting(@NotNull final PaintingInput input, @NotNull final Qua @Override @JmeThread - public void updatePainting(@NotNull final Quaternion brushRotation, @NotNull final Vector3f contactPoint, - final float tpf) { + public void updatePainting(@NotNull Quaternion brushRotation, @NotNull Vector3f contactPoint, float tpf) { + super.updatePainting(brushRotation, contactPoint, tpf); - final PaintingInput input = notNull(getCurrentInput()); - - switch (input) { + switch (notNull(getCurrentInput())) { case MOUSE_PRIMARY: { modifyHeight(contactPoint); break; @@ -134,12 +131,10 @@ public void updatePainting(@NotNull final Quaternion brushRotation, @NotNull fin @Override @JmeThread - public void finishPainting(@NotNull final Quaternion brushRotation, @NotNull final Vector3f contactPoint) { + public void finishPainting(@NotNull Quaternion brushRotation, @NotNull Vector3f contactPoint) { super.finishPainting(brushRotation, contactPoint); - final PaintingInput input = notNull(getCurrentInput()); - - switch (input) { + switch (notNull(getCurrentInput())) { case MOUSE_PRIMARY: { modifyHeight(contactPoint); commitChanges(); @@ -158,38 +153,38 @@ public void finishPainting(@NotNull final Quaternion brushRotation, @NotNull fin * @param contactPoint the contact point. */ @JmeThread - private void modifyHeight(@NotNull final Vector3f contactPoint) { + private void modifyHeight(@NotNull Vector3f contactPoint) { - final LocalObjects local = getLocalObjects(); - final Spatial paintedModel = notNull(getPaintedModel()); - final Geometry brush = getBrush(); - final Geometry levelMarker = getLevelMarker(); + var local = getLocalObjects(); + var paintedModel = notNull(getPaintedModel()); + var brush = getBrush(); + var levelMarker = getLevelMarker(); - final float brushSize = getBrushSize(); - final float brushPower = getBrushPower(); + var brushSize = getBrushSize(); + var brushPower = getBrushPower(); - final List locs = new ArrayList<>(); - final List heights = new ArrayList<>(); + var locs = new ArrayList(); + var heights = new ArrayList(); - for (final Terrain terrain : getTerrains()) { + for (var terrain : getTerrains()) { - final Node terrainNode = (Node) terrain; + var terrainNode = (Node) terrain; - final Vector3f markerTranslation = levelMarker.getLocalTranslation(); - final Vector3f worldTranslation = terrainNode.getWorldTranslation(); - final Vector3f localScale = terrainNode.getLocalScale(); - final Vector3f localPoint = contactPoint.subtract(worldTranslation, local.nextVector()); - final Vector2f terrainLoc = local.nextVector2f(); - final Vector2f effectPoint = local.nextVector2f(); + var markerTranslation = levelMarker.getLocalTranslation(); + var worldTranslation = terrainNode.getWorldTranslation(); + var localScale = terrainNode.getLocalScale(); + var localPoint = contactPoint.subtract(worldTranslation, local.nextVector()); + var terrainLoc = local.nextVector2f(); + var effectPoint = local.nextVector2f(); - final float markerHeight = markerTranslation.getY() - worldTranslation.getY(); - final float desiredHeight = isUseMarker() ? markerHeight : getLevel(); + var markerHeight = markerTranslation.getY() - worldTranslation.getY(); + var desiredHeight = isUseMarker() ? markerHeight : getLevel(); - final int radiusStepsX = (int) (brushSize / localScale.getX()); - final int radiusStepsZ = (int) (brushSize / localScale.getZ()); + var radiusStepsX = (int) (brushSize / localScale.getX()); + var radiusStepsZ = (int) (brushSize / localScale.getZ()); - final float xStepAmount = localScale.getX(); - final float zStepAmount = localScale.getZ(); + var xStepAmount = localScale.getX(); + var zStepAmount = localScale.getZ(); locs.clear(); heights.clear(); @@ -197,8 +192,8 @@ private void modifyHeight(@NotNull final Vector3f contactPoint) { for (int z = -radiusStepsZ; z < radiusStepsZ; z++) { for (int x = -radiusStepsX; x < radiusStepsX; x++) { - float locX = localPoint.getX() + (x * xStepAmount); - float locZ = localPoint.getZ() + (z * zStepAmount); + var locX = localPoint.getX() + (x * xStepAmount); + var locZ = localPoint.getZ() + (z * zStepAmount); effectPoint.set(locX - localPoint.getX(), locZ - localPoint.getZ()); @@ -209,30 +204,33 @@ private void modifyHeight(@NotNull final Vector3f contactPoint) { terrainLoc.set(locX, locZ); // adjust height based on radius of the tool - final float currentHeight = terrain.getHeightmapHeight(terrainLoc) * localScale.getY(); + var currentHeight = terrain.getHeightmapHeight(terrainLoc) * localScale.getY(); if (isPrecision()) { locs.add(terrainLoc.clone()); heights.add(desiredHeight / localScale.getY()); } else { - float epsilon = 0.0001f * brushPower; // rounding error for snapping - float adj = 0; + var epsilon = 0.0001f * brushPower; // rounding error for snapping + var adj = 0F; - if (currentHeight < desiredHeight) adj = 1; - else if (currentHeight > desiredHeight) adj = -1; + if (currentHeight < desiredHeight) { + adj = 1; + } else if (currentHeight > desiredHeight) { + adj = -1; + } adj *= brushPower; - adj *= calculateRadiusPercent(brushSize, effectPoint.getX(), effectPoint.getY()); + adj *= PaintingUtils.calculateRadiusPercent(brushSize, effectPoint.getX(), effectPoint.getY()); // test if adjusting too far and then cap it - if (adj > 0 && floatGreaterThan((currentHeight + adj), desiredHeight, epsilon)) { + if (adj > 0 && ExtMath.greaterThan((currentHeight + adj), desiredHeight, epsilon)) { adj = desiredHeight - currentHeight; - } else if (adj < 0 && floatLessThan((currentHeight + adj), desiredHeight, epsilon)) { + } else if (adj < 0 && ExtMath.lessThan((currentHeight + adj), desiredHeight, epsilon)) { adj = desiredHeight - currentHeight; } - if (!floatEquals(adj, 0, 0.001f)) { + if (!ExtMath.equals(adj, 0, 0.001f)) { locs.add(terrainLoc.clone()); heights.add(currentHeight + adj); } @@ -256,7 +254,7 @@ private void modifyHeight(@NotNull final Vector3f contactPoint) { * @param level the target level. */ @JmeThread - public void setLevel(final float level) { + public void setLevel(float level) { this.level = level; } @@ -286,7 +284,7 @@ private boolean isPrecision() { * @param precision the flag of using precision changing. */ @JmeThread - public void setPrecision(final boolean precision) { + public void setPrecision(boolean precision) { this.precision = precision; } @@ -296,7 +294,7 @@ public void setPrecision(final boolean precision) { * @param useMarker the flag of using marker. */ @JmeThread - public void setUseMarker(final boolean useMarker) { + public void setUseMarker(boolean useMarker) { this.useMarker = useMarker; } diff --git a/src/main/java/com/ss/editor/control/painting/terrain/SlopeTerrainToolControl.java b/src/main/java/com/ss/editor/control/painting/terrain/SlopeTerrainToolControl.java index 199102dc..64d35c4c 100644 --- a/src/main/java/com/ss/editor/control/painting/terrain/SlopeTerrainToolControl.java +++ b/src/main/java/com/ss/editor/control/painting/terrain/SlopeTerrainToolControl.java @@ -1,24 +1,25 @@ package com.ss.editor.control.painting.terrain; -import static com.ss.editor.util.PaintingUtils.*; +import static com.ss.editor.util.PaintingUtils.isContains; import static com.ss.rlib.common.util.ObjectUtils.notNull; import static java.lang.Math.max; -import com.jme3.math.*; +import com.jme3.math.ColorRGBA; +import com.jme3.math.Quaternion; +import com.jme3.math.Vector2f; +import com.jme3.math.Vector3f; import com.jme3.scene.Geometry; import com.jme3.scene.Node; -import com.jme3.scene.Spatial; import com.jme3.scene.shape.Line; import com.jme3.scene.shape.Sphere; -import com.jme3.terrain.Terrain; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.JmeThread; import com.ss.editor.control.painting.PaintingInput; import com.ss.editor.ui.component.painting.terrain.TerrainPaintingComponent; -import com.ss.editor.util.LocalObjects; +import com.ss.editor.util.PaintingUtils; +import com.ss.rlib.common.util.ExtMath; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; -import java.util.List; /** * The implementation of terrain tool to make slopes. @@ -55,7 +56,7 @@ public class SlopeTerrainToolControl extends ChangeHeightTerrainToolControl { */ private boolean lock; - public SlopeTerrainToolControl(@NotNull final TerrainPaintingComponent component) { + public SlopeTerrainToolControl(@NotNull TerrainPaintingComponent component) { super(component); this.baseMarker = new Geometry("BaseMarker", new Sphere(8, 8, 1)); @@ -74,15 +75,15 @@ public SlopeTerrainToolControl(@NotNull final TerrainPaintingComponent component @Override @JmeThread - protected void onAttached(@NotNull final Node node) { + protected void onAttached(@NotNull Node node) { super.onAttached(node); - final Spatial editedModel = notNull(getPaintedModel()); - final Geometry baseMarker = getBaseMarker(); - final Geometry targetMarker = getTargetMarker(); - final Geometry line = getLine(); + var editedModel = notNull(getPaintedModel()); + var baseMarker = getBaseMarker(); + var targetMarker = getTargetMarker(); + var line = getLine(); - final Node markersNode = component.getMarkersNode(); + var markersNode = component.getMarkersNode(); markersNode.attachChild(baseMarker); markersNode.attachChild(targetMarker); markersNode.attachChild(line); @@ -93,14 +94,14 @@ protected void onAttached(@NotNull final Node node) { @Override @JmeThread - protected void onDetached(@NotNull final Node node) { + protected void onDetached(@NotNull Node node) { super.onDetached(node); - final Geometry baseMarker = getBaseMarker(); - final Geometry targetMarker = getTargetMarker(); - final Geometry line = getLine(); + var baseMarker = getBaseMarker(); + var targetMarker = getTargetMarker(); + var line = getLine(); - final Node markersNode = component.getMarkersNode(); + var markersNode = component.getMarkersNode(); markersNode.detachChild(baseMarker); markersNode.detachChild(targetMarker); markersNode.detachChild(line); @@ -108,24 +109,27 @@ protected void onDetached(@NotNull final Node node) { @Override @JmeThread - protected void controlUpdate(final float tpf) { + protected void controlUpdate(float tpf) { super.controlUpdate(tpf); - final Geometry baseMarker = getBaseMarker(); - final Geometry targetMarker = getTargetMarker(); - final Geometry line = getLine(); + var baseMarker = getBaseMarker(); + var targetMarker = getTargetMarker(); + var line = getLine(); - final Vector3f firstPoint = baseMarker.getLocalTranslation(); - final Vector3f secondPoint = targetMarker.getLocalTranslation(); + var firstPoint = baseMarker.getLocalTranslation(); + var secondPoint = targetMarker.getLocalTranslation(); - final Line mesh = (Line) line.getMesh(); + var mesh = (Line) line.getMesh(); mesh.updatePoints(firstPoint, secondPoint); } @Override @JmeThread - public void startPainting(@NotNull final PaintingInput input, @NotNull final Quaternion brushRotation, - @NotNull final Vector3f contactPoint) { + public void startPainting( + @NotNull PaintingInput input, + @NotNull Quaternion brushRotation, + @NotNull Vector3f contactPoint + ) { super.startPainting(input, brushRotation, contactPoint); switch (input) { @@ -147,12 +151,10 @@ public void startPainting(@NotNull final PaintingInput input, @NotNull final Qua @Override @JmeThread - public void updatePainting(@NotNull final Quaternion brushRotation, @NotNull final Vector3f contactPoint, - final float tpf) { + public void updatePainting(@NotNull Quaternion brushRotation, @NotNull Vector3f contactPoint, float tpf) { + super.updatePainting(brushRotation, contactPoint, tpf); - final PaintingInput input = notNull(getCurrentInput()); - - switch (input) { + switch (notNull(getCurrentInput())) { case MOUSE_PRIMARY: { modifyHeight(contactPoint); break; @@ -170,7 +172,7 @@ public void updatePainting(@NotNull final Quaternion brushRotation, @NotNull fin @Override @JmeThread - public void finishPainting(@NotNull final Quaternion brushRotation, @NotNull final Vector3f contactPoint) { + public void finishPainting(@NotNull Quaternion brushRotation, @NotNull Vector3f contactPoint) { super.finishPainting(brushRotation, contactPoint); final PaintingInput input = notNull(getCurrentInput()); @@ -198,33 +200,33 @@ public void finishPainting(@NotNull final Quaternion brushRotation, @NotNull fin * @param contactPoint the contact point. */ @JmeThread - private void modifyHeight(@NotNull final Vector3f contactPoint) { + private void modifyHeight(@NotNull Vector3f contactPoint) { - final LocalObjects local = getLocalObjects(); - final Spatial paintedModel = notNull(getPaintedModel()); + var local = getLocalObjects(); + var paintedModel = notNull(getPaintedModel()); - final Geometry brush = getBrush(); - final Geometry baseMarker = getBaseMarker(); - final Geometry targetMarker = getTargetMarker(); + var brush = getBrush(); + var baseMarker = getBaseMarker(); + var targetMarker = getTargetMarker(); - final float brushSize = getBrushSize(); - final float brushPower = getBrushPower(); + var brushSize = getBrushSize(); + var brushPower = getBrushPower(); - final List locs = new ArrayList<>(); - final List heights = new ArrayList<>(); + var locs = new ArrayList(); + var heights = new ArrayList(); - for (final Terrain terrain : getTerrains()) { + for (var terrain : getTerrains()) { - final Node terrainNode = (Node) terrain; + var terrainNode = (Node) terrain; locs.clear(); heights.clear(); - final Vector3f worldTranslation = terrainNode.getWorldTranslation(); - final Vector3f localScale = terrainNode.getLocalScale(); - final Vector3f firstPoint = baseMarker.getLocalTranslation(); - final Vector3f secondPoint = targetMarker.getLocalTranslation(); - final Vector3f localPoint = contactPoint.subtract(worldTranslation, local.nextVector()); + var worldTranslation = terrainNode.getWorldTranslation(); + var localScale = terrainNode.getLocalScale(); + var firstPoint = baseMarker.getLocalTranslation(); + var secondPoint = targetMarker.getLocalTranslation(); + var localPoint = contactPoint.subtract(worldTranslation, local.nextVector()); Vector3f higher, lower; @@ -237,31 +239,31 @@ private void modifyHeight(@NotNull final Vector3f contactPoint) { lower = firstPoint.subtract(worldTranslation, local.nextVector()); } - final Vector3f subtract = higher.subtract(lower, local.nextVector()); - final Vector3f normal = lower.subtract(higher, local.nextVector()).normalize(); - final Vector3f firstSide = local.nextVector(); - final Vector3f secondSide = local.nextVector(); - final Vector3f targetPoint = local.nextVector(); - final Vector2f terrainLoc = local.nextVector2f(); - final Vector2f effectPoint = local.nextVector2f(); + var subtract = higher.subtract(lower, local.nextVector()); + var normal = lower.subtract(higher, local.nextVector()).normalize(); + var firstSide = local.nextVector(); + var secondSide = local.nextVector(); + var targetPoint = local.nextVector(); + var terrainLoc = local.nextVector2f(); + var effectPoint = local.nextVector2f(); - final int radiusStepsX = (int) (brushSize / localScale.getX()); - final int radiusStepsZ = (int) (brushSize / localScale.getY()); + var radiusStepsX = (int) (brushSize / localScale.getX()); + var radiusStepsZ = (int) (brushSize / localScale.getY()); - final float xStepAmount = localScale.getX(); - final float zStepAmount = localScale.getZ(); + var xStepAmount = localScale.getX(); + var zStepAmount = localScale.getZ(); - final Plane firstPlane = local.nextPlane(); + var firstPlane = local.nextPlane(); firstPlane.setOriginNormal(lower, normal); - final Plane secondPlane = local.nextPlane(); + var secondPlane = local.nextPlane(); secondPlane.setOriginNormal(higher, normal); for (int z = -radiusStepsZ; z < radiusStepsZ; z++) { for (int x = -radiusStepsX; x < radiusStepsX; x++) { - float locX = localPoint.getX() + (x * xStepAmount); - float locZ = localPoint.getZ() + (z * zStepAmount); + var locX = localPoint.getX() + (x * xStepAmount); + var locZ = localPoint.getZ() + (z * zStepAmount); effectPoint.set(locX - localPoint.getX(), locZ - localPoint.getZ()); @@ -272,21 +274,21 @@ private void modifyHeight(@NotNull final Vector3f contactPoint) { terrainLoc.set(locX, locZ); // adjust height based on radius of the tool - final float heightmapHeight = terrain.getHeightmapHeight(terrainLoc); + var heightmapHeight = terrain.getHeightmapHeight(terrainLoc); if (Float.isNaN(heightmapHeight)) { continue; } - float currentHeight = heightmapHeight * localScale.getY(); + var currentHeight = heightmapHeight * localScale.getY(); targetPoint.set(locX, currentHeight, locZ) .subtractLocal(lower) .projectLocal(subtract) .addLocal(lower); - final float lowerDist = lower.distance(targetPoint); - final float higherDist = higher.distance(targetPoint); - final float maxDistance = lower.distance(higher); + var lowerDist = lower.distance(targetPoint); + var higherDist = higher.distance(targetPoint); + var maxDistance = lower.distance(higher); float distance; @@ -296,7 +298,7 @@ private void modifyHeight(@NotNull final Vector3f contactPoint) { distance = lower.distance(targetPoint) / max(lower.distance(higher), 0.00001F); } - final float desiredHeight = lower.getY() + (higher.getY() - lower.getY()) * distance; + var desiredHeight = lower.getY() + (higher.getY() - lower.getY()) * distance; firstSide.set(locX, 0f, locZ); secondSide.set(locX, 0f, locZ); @@ -308,23 +310,26 @@ private void modifyHeight(@NotNull final Vector3f contactPoint) { if (!isPrecision()) { // rounding error for snapping - float epsilon = 0.0001f * brushPower; - float adj = 0; + var epsilon = 0.0001f * brushPower; + var adj = 0F; - if (currentHeight < desiredHeight) adj = 1; - else if (currentHeight > desiredHeight) adj = -1; + if (currentHeight < desiredHeight) { + adj = 1F; + } else if (currentHeight > desiredHeight) { + adj = -1F; + } adj *= brushPower; - adj *= calculateRadiusPercent(brushSize, effectPoint.getX(), effectPoint.getY()); + adj *= PaintingUtils.calculateRadiusPercent(brushSize, effectPoint.getX(), effectPoint.getY()); // test if adjusting too far and then cap it - if ((adj > 0) && floatGreaterThan((currentHeight + adj), desiredHeight, epsilon)) { + if ((adj > 0) && ExtMath.greaterThan((currentHeight + adj), desiredHeight, epsilon)) { adj = desiredHeight - currentHeight; - } else if (adj < 0 && floatLessThan((currentHeight + adj), desiredHeight, epsilon)) { + } else if (adj < 0 && ExtMath.lessThan((currentHeight + adj), desiredHeight, epsilon)) { adj = desiredHeight - currentHeight; } - if (!floatEquals(adj, 0, 0.001f)) { + if (!ExtMath.equals(adj, 0, 0.001f)) { locs.add(terrainLoc.clone()); heights.add(currentHeight + adj); } @@ -392,7 +397,7 @@ public boolean isPrecision() { * @param precision the flag of using precision changing. */ @JmeThread - public void setPrecision(final boolean precision) { + public void setPrecision(boolean precision) { this.precision = precision; } @@ -412,7 +417,7 @@ private boolean isLock() { * @param lock the flag of locking. */ @JmeThread - public void setLock(final boolean lock) { + public void setLock(boolean lock) { this.lock = lock; } } diff --git a/src/main/java/com/ss/editor/manager/ClasspathManager.java b/src/main/java/com/ss/editor/manager/ClasspathManager.java index 0fdb4fd4..6cc1f336 100644 --- a/src/main/java/com/ss/editor/manager/ClasspathManager.java +++ b/src/main/java/com/ss/editor/manager/ClasspathManager.java @@ -274,7 +274,7 @@ private void updateClasses() { * Load local libraries. */ @FromAnyThread - public synchronized void loadLocalLibraries(@NotNull final Array libraries) { + public synchronized @NotNull ClasspathManager loadLocalLibraries(@NotNull Array libraries) { final AssetManager assetManager = EditorUtil.getAssetManager(); final URLClassLoader currentClassLoader = getLocalLibrariesLoader(); @@ -286,7 +286,7 @@ public synchronized void loadLocalLibraries(@NotNull final Array libraries if (libraries.isEmpty()) { this.localLibrariesScanner = null; - return; + return this; } final URL[] urlArray = libraries.stream() @@ -310,13 +310,14 @@ public synchronized void loadLocalLibraries(@NotNull final Array libraries scanner.scan(); this.localLibrariesScanner = scanner; + return this; } /** * Load local classes. */ @FromAnyThread - public synchronized void loadLocalClasses(@Nullable final Path output) { + public synchronized @NotNull ClasspathManager loadLocalClasses(@Nullable final Path output) { final AssetManager assetManager = EditorUtil.getAssetManager(); final URLClassLoader currentClassLoader = getLocalClassesLoader(); @@ -328,7 +329,7 @@ public synchronized void loadLocalClasses(@Nullable final Path output) { if (output == null || !Files.exists(output)) { this.localClassesScanner = null; - return; + return this; } final Array folders = ArrayFactory.newArray(Path.class); @@ -365,6 +366,7 @@ public synchronized void loadLocalClasses(@Nullable final Path output) { scanner.scan(); this.localClassesScanner = scanner; + return this; } /** diff --git a/src/main/java/com/ss/editor/plugin/EditorPlugin.java b/src/main/java/com/ss/editor/plugin/EditorPlugin.java index 1d1c4758..05f3f012 100644 --- a/src/main/java/com/ss/editor/plugin/EditorPlugin.java +++ b/src/main/java/com/ss/editor/plugin/EditorPlugin.java @@ -29,7 +29,7 @@ */ public class EditorPlugin extends BasePlugin { - public EditorPlugin(@NotNull final PluginContainer pluginContainer) { + public EditorPlugin(@NotNull PluginContainer pluginContainer) { super(pluginContainer); } @@ -39,7 +39,7 @@ public EditorPlugin(@NotNull final PluginContainer pluginContainer) { * @param registry the CSS registry. */ @FromAnyThread - public void register(@NotNull final CssRegistry registry) { + public void register(@NotNull CssRegistry registry) { } /** @@ -48,7 +48,7 @@ public void register(@NotNull final CssRegistry registry) { * @param registry the file creator registry. */ @FromAnyThread - public void register(@NotNull final FileCreatorRegistry registry) { + public void register(@NotNull FileCreatorRegistry registry) { } /** @@ -57,7 +57,7 @@ public void register(@NotNull final FileCreatorRegistry registry) { * @param registry the file creator registry. */ @FromAnyThread - public void register(@NotNull final EditorRegistry registry) { + public void register(@NotNull EditorRegistry registry) { } /** @@ -66,7 +66,7 @@ public void register(@NotNull final EditorRegistry registry) { * @param iconManager the icon manager. */ @FromAnyThread - public void register(@NotNull final FileIconManager iconManager) { + public void register(@NotNull FileIconManager iconManager) { } /** @@ -75,7 +75,7 @@ public void register(@NotNull final FileIconManager iconManager) { * @param registry the converters registry. */ @FromAnyThread - public void register(@NotNull final FileConverterRegistry registry) { + public void register(@NotNull FileConverterRegistry registry) { } /** @@ -84,7 +84,7 @@ public void register(@NotNull final FileConverterRegistry registry) { * @param registry the menu fillers registry. */ @FromAnyThread - public void register(@NotNull final AssetTreeContextMenuFillerRegistry registry) { + public void register(@NotNull AssetTreeContextMenuFillerRegistry registry) { } /** @@ -93,7 +93,7 @@ public void register(@NotNull final AssetTreeContextMenuFillerRegistry registry) * @param registry the registry of tree node factories. */ @FromAnyThread - public void register(@NotNull final TreeNodeFactoryRegistry registry) { + public void register(@NotNull TreeNodeFactoryRegistry registry) { } /** @@ -102,7 +102,7 @@ public void register(@NotNull final TreeNodeFactoryRegistry registry) { * @param registry the registry of property builders. */ @FromAnyThread - public void register(@NotNull final PropertyBuilderRegistry registry) { + public void register(@NotNull PropertyBuilderRegistry registry) { } /** @@ -111,7 +111,7 @@ public void register(@NotNull final PropertyBuilderRegistry registry) { * @param registry the registry of file preview factories. */ @FromAnyThread - public void register(@NotNull final FilePreviewFactoryRegistry registry) { + public void register(@NotNull FilePreviewFactoryRegistry registry) { } /** @@ -120,7 +120,7 @@ public void register(@NotNull final FilePreviewFactoryRegistry registry) { * @param registry the registry of settings providers. */ @FxThread - public void register(@NotNull final SettingsProviderRegistry registry) { + public void register(@NotNull SettingsProviderRegistry registry) { } /** @@ -129,7 +129,7 @@ public void register(@NotNull final SettingsProviderRegistry registry) { * @param registry the registry of painting component's constructors. */ @FxThread - public void register(@NotNull final PaintingComponentRegistry registry) { + public void register(@NotNull PaintingComponentRegistry registry) { } /** @@ -138,7 +138,7 @@ public void register(@NotNull final PaintingComponentRegistry registry) { * @param pluginSystem the plugin system. */ @JmeThread - public void onBeforeCreateJmeContext(@NotNull final PluginSystem pluginSystem) { + public void onBeforeCreateJmeContext(@NotNull PluginSystem pluginSystem) { } /** @@ -147,7 +147,7 @@ public void onBeforeCreateJmeContext(@NotNull final PluginSystem pluginSystem) { * @param pluginSystem the plugin system. */ @JmeThread - public void onAfterCreateJmeContext(@NotNull final PluginSystem pluginSystem) { + public void onAfterCreateJmeContext(@NotNull PluginSystem pluginSystem) { } /** @@ -156,7 +156,7 @@ public void onAfterCreateJmeContext(@NotNull final PluginSystem pluginSystem) { * @param pluginSystem the plugin system. */ @FxThread - public void onBeforeCreateJavaFxContext(@NotNull final PluginSystem pluginSystem) { + public void onBeforeCreateJavaFxContext(@NotNull PluginSystem pluginSystem) { } /** @@ -165,7 +165,7 @@ public void onBeforeCreateJavaFxContext(@NotNull final PluginSystem pluginSystem * @param pluginSystem the plugin system. */ @FxThread - public void onAfterCreateJavaFxContext(@NotNull final PluginSystem pluginSystem) { + public void onAfterCreateJavaFxContext(@NotNull PluginSystem pluginSystem) { } /** @@ -174,7 +174,7 @@ public void onAfterCreateJavaFxContext(@NotNull final PluginSystem pluginSystem) * @param pluginSystem the plugin system. */ @FxThread - public void onFinishLoading(@NotNull final PluginSystem pluginSystem) { + public void onFinishLoading(@NotNull PluginSystem pluginSystem) { } @Override diff --git a/src/main/java/com/ss/editor/plugin/api/RenderFilterExtension.java b/src/main/java/com/ss/editor/plugin/api/RenderFilterExtension.java index 5658a54a..dd2697a2 100644 --- a/src/main/java/com/ss/editor/plugin/api/RenderFilterExtension.java +++ b/src/main/java/com/ss/editor/plugin/api/RenderFilterExtension.java @@ -51,7 +51,7 @@ private RenderFilterExtension() { * @param filter the filter. */ @JmeThread - public void register(@NotNull final Filter filter) { + public void register(@NotNull Filter filter) { this.filters.add(filter); EditorUtil.getGlobalFilterPostProcessor() .addFilter(filter); @@ -65,7 +65,7 @@ public void register(@NotNull final Filter filter) { * @param the filter's type. */ @JmeThread - public void setOnRefresh(@NotNull final T filter, @NotNull final Consumer<@NotNull T> handler) { + public void setOnRefresh(@NotNull T filter, @NotNull Consumer handler) { if (!filters.contains(filter)) { throw new IllegalArgumentException("The filter " + filter + "isn't registered."); @@ -80,7 +80,7 @@ public void setOnRefresh(@NotNull final T filter, @NotNull fi @JmeThread public void refreshFilters() { refreshActions.forEach((filter, consumer) -> { - final Consumer<@NotNull Filter> cast = ClassUtils.unsafeCast(consumer); + var cast = ClassUtils.>unsafeCast(consumer); cast.accept(filter); }); } diff --git a/src/main/java/com/ss/editor/plugin/api/dialog/GenericFactoryDialog.java b/src/main/java/com/ss/editor/plugin/api/dialog/GenericFactoryDialog.java index dfb3f28b..3b8959af 100644 --- a/src/main/java/com/ss/editor/plugin/api/dialog/GenericFactoryDialog.java +++ b/src/main/java/com/ss/editor/plugin/api/dialog/GenericFactoryDialog.java @@ -3,15 +3,13 @@ import static com.ss.editor.plugin.api.property.control.PropertyEditorControlFactory.build; import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.Messages; -import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; +import com.ss.editor.annotation.FxThread; import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.plugin.api.property.control.PropertyEditorControl; import com.ss.editor.ui.dialog.AbstractSimpleEditorDialog; import com.ss.rlib.common.util.VarTable; import com.ss.rlib.common.util.array.Array; -import javafx.collections.ObservableList; -import javafx.scene.Node; import javafx.scene.layout.VBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -27,7 +25,6 @@ */ public class GenericFactoryDialog extends AbstractSimpleEditorDialog { - @NotNull private static final Point DIALOG_SIZE = new Point(400, -1); /** @@ -66,14 +63,15 @@ public class GenericFactoryDialog extends AbstractSimpleEditorDialog { @Nullable private VBox root; - public GenericFactoryDialog(@NotNull final Array definitions, - @NotNull final Consumer handler) { + public GenericFactoryDialog(@NotNull Array definitions, @NotNull Consumer handler) { this(definitions, handler, varTable -> true); } - public GenericFactoryDialog(@NotNull final Array definitions, - @NotNull final Consumer handler, - @NotNull final Predicate validator) { + public GenericFactoryDialog( + @NotNull Array definitions, + @NotNull Consumer handler, + @NotNull Predicate validator + ) { this.definitions = definitions; this.handler = handler; this.validator = validator; @@ -89,7 +87,7 @@ public GenericFactoryDialog(@NotNull final Array definitions * @param title the new title. */ @FxThread - public void setTitle(@NotNull final String title) { + public void setTitle(@NotNull String title) { getDialog().setTitle(title); } @@ -99,7 +97,7 @@ public void setTitle(@NotNull final String title) { * @param text the new text. */ @FxThread - public void setButtonOkText(@NotNull final String text) { + public void setButtonOkText(@NotNull String text) { notNull(getOkButton()).setText(text); } @@ -109,7 +107,7 @@ public void setButtonOkText(@NotNull final String text) { * @param text the new text. */ @FxThread - public void setButtonCloseText(@NotNull final String text) { + public void setButtonCloseText(@NotNull String text) { notNull(getCloseButton()).setText(text); } @@ -121,7 +119,7 @@ public void setButtonCloseText(@NotNull final String text) { @Override @FxThread - protected void createContent(@NotNull final VBox root) { + protected void createContent(@NotNull VBox root) { super.createContent(root); this.root = root; } @@ -142,11 +140,11 @@ protected void createContent(@NotNull final VBox root) { @FxThread private void createControls() { - final ObservableList children = getRoot().getChildren(); + var children = getRoot().getChildren(); - final Array definitions = getDefinitions(); + var definitions = getDefinitions(); definitions.forEach(definition -> { - final PropertyEditorControl control = build(vars, definition, validateCallback); + var control = build(vars, definition, validateCallback); control.prefWidthProperty().bind(widthProperty()); children.add(control); }); diff --git a/src/main/java/com/ss/editor/plugin/api/file/creator/GenericFileCreator.java b/src/main/java/com/ss/editor/plugin/api/file/creator/GenericFileCreator.java index 9584ffa9..2d265abc 100644 --- a/src/main/java/com/ss/editor/plugin/api/file/creator/GenericFileCreator.java +++ b/src/main/java/com/ss/editor/plugin/api/file/creator/GenericFileCreator.java @@ -3,15 +3,14 @@ import static com.ss.editor.plugin.api.property.control.PropertyEditorControlFactory.build; import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.ss.editor.annotation.BackgroundThread; -import com.ss.editor.annotation.FxThread; import com.ss.editor.annotation.FromAnyThread; +import com.ss.editor.annotation.FxThread; import com.ss.editor.plugin.api.property.PropertyDefinition; import com.ss.editor.plugin.api.property.control.PropertyEditorControl; import com.ss.editor.ui.component.creator.impl.AbstractFileCreator; import com.ss.rlib.common.util.VarTable; import com.ss.rlib.common.util.array.Array; import com.ss.rlib.common.util.array.ArrayFactory; -import javafx.scene.control.Button; import javafx.scene.layout.GridPane; import javafx.stage.Window; import org.jetbrains.annotations.NotNull; @@ -46,17 +45,16 @@ public GenericFileCreator() { } @Override - protected void createSettings(@NotNull final GridPane root) { + protected void createSettings(@NotNull GridPane root) { super.createSettings(root); this.settingsContainer = root; this.vars = VarTable.newInstance(); - int rowIndex = 1; + var rowIndex = 1; - final Array definitions = getPropertyDefinitions(); - for (final PropertyDefinition definition : definitions) { - final PropertyEditorControl control = build(vars, definition, this::validateFileName); + for (var definition : getPropertyDefinitions()) { + var control = build(vars, definition, this::validateFileName); control.prefWidthProperty().bind(widthProperty()); root.add(control, 0, rowIndex++, 2, 1); } @@ -64,7 +62,7 @@ protected void createSettings(@NotNull final GridPane root) { @Override @FxThread - public void show(@NotNull final Window owner) { + public void show(@NotNull Window owner) { super.show(owner); validateFileName(); } @@ -92,16 +90,18 @@ public void show(@NotNull final Window owner) { protected void validateFileName() { super.validateFileName(); - final GridPane settingsContainer = getSettingsContainer(); + var settingsContainer = getSettingsContainer(); settingsContainer.getChildren().stream() .filter(PropertyEditorControl.class::isInstance) .map(PropertyEditorControl.class::cast) .forEach(PropertyEditorControl::checkDependency); - final Button okButton = getOkButton(); - if (okButton == null) return; + var okButton = getOkButton(); + if (okButton == null) { + return; + } - final boolean result = validate(getVars()); + var result = validate(getVars()); if (!okButton.isDisabled()) { okButton.setDisable(!result); @@ -115,13 +115,13 @@ protected void validateFileName() { * @return true if the all variables are valid. */ @FxThread - protected boolean validate(@NotNull final VarTable vars) { + protected boolean validate(@NotNull VarTable vars) { return true; } @Override @BackgroundThread - protected void writeData(@NotNull final Path resultFile) throws IOException { + protected void writeData(@NotNull Path resultFile) throws IOException { writeData(getVars(), resultFile); } @@ -133,7 +133,7 @@ protected void writeData(@NotNull final Path resultFile) throws IOException { * @throws IOException if was some problem with writing to the result file. */ @BackgroundThread - protected void writeData(@NotNull final VarTable vars, @NotNull final Path resultFile) throws IOException { + protected void writeData(@NotNull VarTable vars, @NotNull Path resultFile) throws IOException { } /** diff --git a/src/main/java/com/ss/editor/plugin/api/messages/MessagesPluginFactory.java b/src/main/java/com/ss/editor/plugin/api/messages/MessagesPluginFactory.java index 1e23eac3..5be7faa2 100644 --- a/src/main/java/com/ss/editor/plugin/api/messages/MessagesPluginFactory.java +++ b/src/main/java/com/ss/editor/plugin/api/messages/MessagesPluginFactory.java @@ -22,10 +22,10 @@ public class MessagesPluginFactory { /** * The empty resource bundle. */ - @NotNull private static final ResourceBundle EMPTY_RESOURCE_BUNDLE = new ResourceBundle() { + @Override - protected Object handleGetObject(@NotNull final String key) { + protected Object handleGetObject(@NotNull String key) { return null; } @@ -44,7 +44,7 @@ public Enumeration getKeys() { * @return the resource bundle. */ @FromAnyThread - public static @NotNull ResourceBundle getResourceBundle(@NotNull final Class pluginClass) { + public static @NotNull ResourceBundle getResourceBundle(@NotNull Class pluginClass) { return getResourceBundle(pluginClass, Messages.BUNDLE_NAME); } @@ -56,11 +56,14 @@ public Enumeration getKeys() { * @return the resource bundle. */ @FromAnyThread - public static @NotNull ResourceBundle getResourceBundle(@NotNull final Class pluginClass, - @NotNull final String bundleName) { - final Locale locale = Locale.getDefault(); - final ClassLoader classLoader = pluginClass.getClassLoader(); - final ResourceBundle resourceBundle = getBundle(bundleName, locale, classLoader, PropertyLoader.getInstance()); + public static @NotNull ResourceBundle getResourceBundle( + @NotNull Class pluginClass, + @NotNull String bundleName + ) { + + var locale = Locale.getDefault(); + var classLoader = pluginClass.getClassLoader(); + var resourceBundle = getBundle(bundleName, locale, classLoader, PropertyLoader.getInstance()); if (resourceBundle == null) { return EMPTY_RESOURCE_BUNDLE; diff --git a/src/main/java/com/ss/editor/plugin/api/settings/SettingsCategory.java b/src/main/java/com/ss/editor/plugin/api/settings/SettingsCategory.java index 9203623c..b196026f 100644 --- a/src/main/java/com/ss/editor/plugin/api/settings/SettingsCategory.java +++ b/src/main/java/com/ss/editor/plugin/api/settings/SettingsCategory.java @@ -2,6 +2,7 @@ import com.ss.editor.annotation.FromAnyThread; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * The class to describe a settings category. @@ -27,7 +28,7 @@ public class SettingsCategory implements Comparable { */ private final int order; - public SettingsCategory(@NotNull final String id, @NotNull final String label, final int order) { + public SettingsCategory(@NotNull String id, @NotNull String label, int order) { this.id = id; this.label = label; this.order = order; @@ -54,7 +55,7 @@ public SettingsCategory(@NotNull final String id, @NotNull final String label, f } @Override - public boolean equals(final Object o) { + public boolean equals(@Nullable Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; final SettingsCategory that = (SettingsCategory) o; @@ -67,7 +68,7 @@ public int hashCode() { } @Override - public int compareTo(@NotNull final SettingsCategory o) { + public int compareTo(@NotNull SettingsCategory o) { return order - o.order; } } diff --git a/src/main/java/com/ss/editor/plugin/api/settings/SettingsPropertyDefinition.java b/src/main/java/com/ss/editor/plugin/api/settings/SettingsPropertyDefinition.java index d8322888..b1200e25 100644 --- a/src/main/java/com/ss/editor/plugin/api/settings/SettingsPropertyDefinition.java +++ b/src/main/java/com/ss/editor/plugin/api/settings/SettingsPropertyDefinition.java @@ -20,46 +20,75 @@ public class SettingsPropertyDefinition extends PropertyDefinition { @NotNull private final SettingsCategory category; - public SettingsPropertyDefinition(@NotNull final EditablePropertyType propertyType, @NotNull final String name, - @NotNull final String id, @NotNull final SettingsCategory category, - @Nullable final Object defaultValue) { + public SettingsPropertyDefinition( + @NotNull EditablePropertyType propertyType, + @NotNull String name, + @NotNull String id, + @NotNull SettingsCategory category, + @Nullable Object defaultValue + ) { super(propertyType, name, id, defaultValue); this.category = category; } - public SettingsPropertyDefinition(@NotNull final EditablePropertyType propertyType, - @Nullable final Array dependencies, @NotNull final String name, - @NotNull final String id, @NotNull final SettingsCategory category, - @Nullable final Object defaultValue) { + public SettingsPropertyDefinition( + @NotNull EditablePropertyType propertyType, + @Nullable Array dependencies, + @NotNull String name, + @NotNull String id, + @NotNull SettingsCategory category, + @Nullable Object defaultValue + ) { super(propertyType, dependencies, name, id, defaultValue); this.category = category; } - public SettingsPropertyDefinition(@NotNull final EditablePropertyType propertyType, @NotNull final String name, - @NotNull final String id, @NotNull final SettingsCategory category, - @Nullable final Object defaultValue, @Nullable final String extension) { + public SettingsPropertyDefinition( + @NotNull EditablePropertyType propertyType, + @NotNull String name, + @NotNull String id, + @NotNull SettingsCategory category, + @Nullable Object defaultValue, + @Nullable String extension + ) { super(propertyType, name, id, defaultValue, extension); this.category = category; } - public SettingsPropertyDefinition(@NotNull final EditablePropertyType propertyType, - @Nullable final Array dependencies, @NotNull final String name, - @NotNull final String id, @NotNull final SettingsCategory category, - @Nullable final Object defaultValue, @Nullable final String extension) { + public SettingsPropertyDefinition( + @NotNull EditablePropertyType propertyType, + @Nullable Array dependencies, + @NotNull String name, + @NotNull String id, + @NotNull SettingsCategory category, + @Nullable Object defaultValue, + @Nullable String extension + ) { super(propertyType, dependencies, name, id, defaultValue, extension); this.category = category; } - public SettingsPropertyDefinition(@NotNull final EditablePropertyType propertyType, final @NotNull String name, - @NotNull final String id, @NotNull final SettingsCategory category, - @Nullable final Object defaultValue, @NotNull final Array options) { + public SettingsPropertyDefinition( + @NotNull EditablePropertyType propertyType, + @NotNull String name, + @NotNull String id, + @NotNull SettingsCategory category, + @Nullable Object defaultValue, + @NotNull Array options + ) { super(propertyType, name, id, defaultValue, options); this.category = category; } - public SettingsPropertyDefinition(@NotNull final EditablePropertyType propertyType, @NotNull final String name, - @NotNull final String id, @NotNull final SettingsCategory category, - @Nullable final Object defaultValue, final float min, final float max) { + public SettingsPropertyDefinition( + @NotNull EditablePropertyType propertyType, + @NotNull String name, + @NotNull String id, + @NotNull SettingsCategory category, + @Nullable Object defaultValue, + float min, + float max + ) { super(propertyType, name, id, defaultValue, min, max); this.category = category; } diff --git a/src/main/java/com/ss/editor/plugin/api/settings/SettingsProvider.java b/src/main/java/com/ss/editor/plugin/api/settings/SettingsProvider.java index 1a077248..05a4e2a4 100644 --- a/src/main/java/com/ss/editor/plugin/api/settings/SettingsProvider.java +++ b/src/main/java/com/ss/editor/plugin/api/settings/SettingsProvider.java @@ -26,7 +26,7 @@ public interface SettingsProvider { * @return true if need restart to apply changes for this property. */ @FxThread - default boolean isRequiredRestart(@NotNull final String propertyId) { + default boolean isRequiredRestart(@NotNull String propertyId) { return false; } @@ -37,7 +37,7 @@ default boolean isRequiredRestart(@NotNull final String propertyId) { * @return true if need to update classpath to apply changes for this property. */ @FxThread - default boolean isRequiredUpdateClasspath(@NotNull final String propertyId) { + default boolean isRequiredUpdateClasspath(@NotNull String propertyId) { return false; } @@ -48,7 +48,7 @@ default boolean isRequiredUpdateClasspath(@NotNull final String propertyId) { * @return true if need to reshape 3D view to apply changes for this property. */ @FxThread - default boolean isRequiredReshape3DView(@NotNull final String propertyId) { + default boolean isRequiredReshape3DView(@NotNull String propertyId) { return false; } } diff --git a/src/main/java/com/ss/editor/plugin/api/settings/SettingsProviderRegistry.java b/src/main/java/com/ss/editor/plugin/api/settings/SettingsProviderRegistry.java index 56b8373c..a6c0cba6 100644 --- a/src/main/java/com/ss/editor/plugin/api/settings/SettingsProviderRegistry.java +++ b/src/main/java/com/ss/editor/plugin/api/settings/SettingsProviderRegistry.java @@ -38,7 +38,7 @@ private SettingsProviderRegistry() { * @param settingsProvider the new settings provider. */ @FxThread - public void register(@NotNull final SettingsProvider settingsProvider) { + public void register(@NotNull SettingsProvider settingsProvider) { this.providers.add(settingsProvider); } @@ -49,8 +49,12 @@ public void register(@NotNull final SettingsProvider settingsProvider) { */ @FxThread public @NotNull Array getDefinitions() { - final Array result = ArrayFactory.newArray(SettingsPropertyDefinition.class); - providers.forEach(result, (provider, definitions) -> definitions.addAll(provider.getDefinitions())); + + var result = ArrayFactory.newArray(SettingsPropertyDefinition.class); + + providers.forEach(result, + (provider, definitions) -> definitions.addAll(provider.getDefinitions())); + return result; } @@ -61,8 +65,9 @@ public void register(@NotNull final SettingsProvider settingsProvider) { * @return true if need to restart to apply changes for this property. */ @FxThread - public boolean isRequiredRestart(@NotNull final String propertyId) { - return providers.search(propertyId, (provider, id) -> provider.isRequiredRestart(propertyId)) != null; + public boolean isRequiredRestart(@NotNull String propertyId) { + return providers.search(propertyId, + (provider, id) -> provider.isRequiredRestart(propertyId)) != null; } /** @@ -72,8 +77,9 @@ public boolean isRequiredRestart(@NotNull final String propertyId) { * @return true if need to update classpath to apply changes for this property. */ @FxThread - public boolean isRequiredUpdateClasspath(@NotNull final String propertyId) { - return providers.search(propertyId, (provider, id) -> provider.isRequiredRestart(propertyId)) != null; + public boolean isRequiredUpdateClasspath(@NotNull String propertyId) { + return providers.search(propertyId, + (provider, id) -> provider.isRequiredRestart(propertyId)) != null; } /** @@ -83,7 +89,8 @@ public boolean isRequiredUpdateClasspath(@NotNull final String propertyId) { * @return true if need to reshape 3D view to apply changes for this property. */ @FxThread - public boolean isRequiredReshape3DView(@NotNull final String propertyId) { - return providers.search(propertyId, (provider, id) -> provider.isRequiredRestart(propertyId)) != null; + public boolean isRequiredReshape3DView(@NotNull String propertyId) { + return providers.search(propertyId, + (provider, id) -> provider.isRequiredRestart(propertyId)) != null; } } diff --git a/src/main/java/com/ss/editor/remote/control/client/ClientCommand.java b/src/main/java/com/ss/editor/remote/control/client/ClientCommand.java index 079329f6..4f3bc524 100644 --- a/src/main/java/com/ss/editor/remote/control/client/ClientCommand.java +++ b/src/main/java/com/ss/editor/remote/control/client/ClientCommand.java @@ -16,5 +16,5 @@ public abstract class ClientCommand extends AbstractReadablePacket { @Override @BackgroundThread - protected abstract void readImpl(@NotNull final ConnectionOwner owner, @NotNull final ByteBuffer buffer); + protected abstract void readImpl(@NotNull ConnectionOwner owner, @NotNull ByteBuffer buffer); } diff --git a/src/main/java/com/ss/editor/remote/control/client/InitLocalClasspathClientCommand.java b/src/main/java/com/ss/editor/remote/control/client/InitLocalClasspathClientCommand.java index 2fd8561c..3d5e3351 100644 --- a/src/main/java/com/ss/editor/remote/control/client/InitLocalClasspathClientCommand.java +++ b/src/main/java/com/ss/editor/remote/control/client/InitLocalClasspathClientCommand.java @@ -5,7 +5,6 @@ import com.ss.rlib.common.network.ConnectionOwner; import com.ss.rlib.common.network.annotation.PacketDescription; import com.ss.rlib.common.util.StringUtils; -import com.ss.rlib.common.util.array.Array; import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; @@ -23,19 +22,19 @@ public class InitLocalClasspathClientCommand extends ClientCommand { @Override @BackgroundThread - protected void readImpl(@NotNull final ConnectionOwner owner, @NotNull final ByteBuffer buffer) { + protected void readImpl(@NotNull ConnectionOwner owner, @NotNull ByteBuffer buffer) { - final Array libraries = ArrayFactory.newArray(Path.class); + var libraries = ArrayFactory.newArray(Path.class); for (int i = 0, length = readInt(buffer); i < length; i++) { libraries.add(Paths.get(readString(buffer))); } - final String outputPath = readString(buffer); - final Path output = StringUtils.isEmpty(outputPath) ? null : Paths.get(outputPath); + var outputPath = readString(buffer); + var output = StringUtils.isEmpty(outputPath) ? null : Paths.get(outputPath); - final ClasspathManager classpathManager = ClasspathManager.getInstance(); - classpathManager.loadLocalLibraries(libraries); - classpathManager.loadLocalClasses(output); + ClasspathManager.getInstance() + .loadLocalLibraries(libraries) + .loadLocalClasses(output); } } diff --git a/src/main/java/com/ss/editor/remote/control/client/LoadLocalClassesClientCommand.java b/src/main/java/com/ss/editor/remote/control/client/LoadLocalClassesClientCommand.java index f81ea177..f4c90971 100644 --- a/src/main/java/com/ss/editor/remote/control/client/LoadLocalClassesClientCommand.java +++ b/src/main/java/com/ss/editor/remote/control/client/LoadLocalClassesClientCommand.java @@ -10,7 +10,6 @@ import org.jetbrains.annotations.NotNull; import java.nio.ByteBuffer; -import java.nio.file.Path; import java.nio.file.Paths; /** @@ -21,17 +20,17 @@ @PacketDescription(id = 3) public class LoadLocalClassesClientCommand extends ClientCommand { - @NotNull private static final ExecutorManager EXECUTOR_MANAGER = ExecutorManager.getInstance(); @Override @BackgroundThread - protected void readImpl(@NotNull final ConnectionOwner owner, @NotNull final ByteBuffer buffer) { + protected void readImpl(@NotNull ConnectionOwner owner, @NotNull ByteBuffer buffer) { - final String outputPath = readString(buffer); - final Path output = StringUtils.isEmpty(outputPath) ? null : Paths.get(outputPath); - final ClasspathManager classpathManager = ClasspathManager.getInstance(); - classpathManager.loadLocalClasses(output); + var outputPath = readString(buffer); + var output = StringUtils.isEmpty(outputPath) ? null : Paths.get(outputPath); + + ClasspathManager.getInstance() + .loadLocalClasses(output); EXECUTOR_MANAGER.addJmeTask(() -> EditorUtil.getAssetManager().clearCache()); } diff --git a/src/main/java/com/ss/editor/remote/control/client/LoadLocalLibrariesClientCommand.java b/src/main/java/com/ss/editor/remote/control/client/LoadLocalLibrariesClientCommand.java index a265dc40..d6d3c7f5 100644 --- a/src/main/java/com/ss/editor/remote/control/client/LoadLocalLibrariesClientCommand.java +++ b/src/main/java/com/ss/editor/remote/control/client/LoadLocalLibrariesClientCommand.java @@ -4,7 +4,6 @@ import com.ss.editor.manager.ClasspathManager; import com.ss.rlib.common.network.ConnectionOwner; import com.ss.rlib.common.network.annotation.PacketDescription; -import com.ss.rlib.common.util.array.Array; import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; @@ -22,15 +21,15 @@ public class LoadLocalLibrariesClientCommand extends ClientCommand { @Override @BackgroundThread - protected void readImpl(@NotNull final ConnectionOwner owner, @NotNull final ByteBuffer buffer) { + protected void readImpl(@NotNull ConnectionOwner owner, @NotNull ByteBuffer buffer) { - final Array libraries = ArrayFactory.newArray(Path.class); + var libraries = ArrayFactory.newArray(Path.class); for (int i = 0, length = readInt(buffer); i < length; i++) { libraries.add(Paths.get(readString(buffer))); } - final ClasspathManager classpathManager = ClasspathManager.getInstance(); - classpathManager.loadLocalLibraries(libraries); + ClasspathManager.getInstance(). + loadLocalLibraries(libraries); } } diff --git a/src/main/java/com/ss/editor/remote/control/client/OpenFileClientCommand.java b/src/main/java/com/ss/editor/remote/control/client/OpenFileClientCommand.java index aedb3143..5e28ae3c 100644 --- a/src/main/java/com/ss/editor/remote/control/client/OpenFileClientCommand.java +++ b/src/main/java/com/ss/editor/remote/control/client/OpenFileClientCommand.java @@ -38,7 +38,7 @@ protected void readImpl(@NotNull ConnectionOwner owner, @NotNull ByteBuffer buff var editorConfig = EditorConfig.getInstance(); var currentAsset = editorConfig.getCurrentAsset(); - if (currentAsset != null && assetPath.equals(currentAsset)) { + if (assetPath.equals(currentAsset)) { EXECUTOR_MANAGER.addFxTask(() -> openFile(fileToOpen)); } else { EXECUTOR_MANAGER.addFxTask(() -> { diff --git a/src/main/java/com/ss/editor/task/CheckNewVersionTask.java b/src/main/java/com/ss/editor/task/CheckNewVersionTask.java index 245dae00..f0013723 100644 --- a/src/main/java/com/ss/editor/task/CheckNewVersionTask.java +++ b/src/main/java/com/ss/editor/task/CheckNewVersionTask.java @@ -1,29 +1,20 @@ package com.ss.editor.task; import static org.apache.http.impl.client.HttpClients.createMinimal; -import com.ss.editor.JfxApplication; import com.ss.editor.Messages; import com.ss.editor.config.Config; +import com.ss.editor.util.EditorUtil; import com.ss.rlib.common.logging.Logger; import com.ss.rlib.common.logging.LoggerManager; import com.ss.rlib.common.plugin.Version; -import javafx.application.HostServices; import javafx.application.Platform; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; -import javafx.scene.control.DialogPane; import javafx.scene.control.Hyperlink; import org.apache.commons.io.IOUtils; -import org.apache.http.Header; -import org.apache.http.HttpEntity; -import org.apache.http.StatusLine; -import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.CloseableHttpClient; -import org.jetbrains.annotations.NotNull; import java.io.IOException; -import java.io.InputStream; /** * The task to check new versions of the editor. @@ -32,35 +23,31 @@ */ public class CheckNewVersionTask implements Runnable { - @NotNull private static final Logger LOGGER = LoggerManager.getLogger(CheckNewVersionTask.class); - @NotNull private static final String APP_VERSION_URL = "https://api.bitbucket.org/1.0/repositories/javasabr/" + "jmonkey-builder/raw/master/app.version"; - - @NotNull private static final String DOWNLOAD_APP_PATH_URL = "https://api.bitbucket.org/1.0/repositories/javasabr/" + "jmonkey-builder/raw/master/download.app.path"; @Override public void run() { - try (final CloseableHttpClient httpClient = createMinimal()) { + try (var httpClient = createMinimal()) { - CloseableHttpResponse response = httpClient.execute(new HttpGet(APP_VERSION_URL)); - StatusLine statusLine = response.getStatusLine(); + var response = httpClient.execute(new HttpGet(APP_VERSION_URL)); + var statusLine = response.getStatusLine(); if (statusLine.getStatusCode() != 200) { return; } - HttpEntity entity = response.getEntity(); - InputStream content = entity.getContent(); - Header encoding = entity.getContentEncoding(); - String enc = encoding == null ? "UTF-8" : encoding.getValue(); + var entity = response.getEntity(); + var content = entity.getContent(); + var encoding = entity.getContentEncoding(); + var enc = encoding == null ? "UTF-8" : encoding.getValue(); - final String targetVersion = IOUtils.toString(content, enc) + var targetVersion = IOUtils.toString(content, enc) .trim() .replace("v.", ""); @@ -80,27 +67,27 @@ public void run() { encoding = entity.getContentEncoding(); enc = encoding == null ? "UTF-8" : encoding.getValue(); - final String targetLink = IOUtils.toString(content, enc).trim(); + var targetLink = IOUtils.toString(content, enc) + .trim(); Platform.runLater(() -> { - final JfxApplication jfxApplication = JfxApplication.getInstance(); - final HostServices hostServices = jfxApplication.getHostServices(); + var hostServices = EditorUtil.getHostServices(); - final Hyperlink hyperlink = new Hyperlink(Messages.CHECK_NEW_VERSION_DIALOG_HYPERLINK + targetLink); + var hyperlink = new Hyperlink(Messages.CHECK_NEW_VERSION_DIALOG_HYPERLINK + targetLink); hyperlink.setOnAction(event -> hostServices.showDocument(targetLink)); - final Alert alert = new Alert(AlertType.INFORMATION); + var alert = new Alert(AlertType.INFORMATION); alert.setTitle(Messages.CHECK_NEW_VERSION_DIALOG_TITLE); alert.setHeaderText(Messages.CHECK_NEW_VERSION_DIALOG_HEADER_TEXT + targetVersion); - final DialogPane dialogPane = alert.getDialogPane(); + var dialogPane = alert.getDialogPane(); dialogPane.setContent(hyperlink); alert.show(); }); - } catch (final IOException e) { + } catch (IOException e) { LOGGER.warning(e); } } diff --git a/src/main/java/com/ss/editor/util/AnimationUtils.java b/src/main/java/com/ss/editor/util/AnimationUtils.java index 057b5508..cc02c342 100644 --- a/src/main/java/com/ss/editor/util/AnimationUtils.java +++ b/src/main/java/com/ss/editor/util/AnimationUtils.java @@ -1,6 +1,5 @@ package com.ss.editor.util; -import static com.ss.rlib.common.util.ClassUtils.unsafeCast; import com.jme3.animation.AnimControl; import com.jme3.animation.Animation; import com.jme3.animation.BoneTrack; @@ -8,7 +7,7 @@ import com.jme3.math.Quaternion; import com.jme3.math.Vector3f; import com.ss.editor.annotation.FromAnyThread; -import com.ss.rlib.common.util.array.Array; +import com.ss.rlib.common.util.ClassUtils; import com.ss.rlib.common.util.array.ArrayFactory; import org.jetbrains.annotations.NotNull; @@ -34,7 +33,7 @@ public class AnimationUtils { ANIMATIONS_MAP_FIELD = AnimControl.class.getDeclaredField("animationMap"); ANIMATIONS_MAP_FIELD.setAccessible(true); - } catch (final NoSuchFieldException e) { + } catch (NoSuchFieldException e) { throw new RuntimeException(e); } } @@ -49,18 +48,22 @@ public class AnimationUtils { * @return the new sub animation. */ @FromAnyThread - public static @NotNull Animation extractAnimation(@NotNull final Animation source, @NotNull final String newName, - final int startFrame, final int endFrame) { - - final Track[] sourceTracks = source.getTracks(); - final BoneTrack firstSourceTrack = (BoneTrack) sourceTracks[0]; - final float[] sourceTimes = firstSourceTrack.getTimes(); - - final float newLength = (source.getLength() / (float) sourceTimes.length) * (float) (endFrame - startFrame); - final Animation result = new Animation(newName, newLength); - final Array newTracks = ArrayFactory.newArray(Track.class); - - for (final Track sourceTrack : sourceTracks) { + public static @NotNull Animation extractAnimation( + @NotNull Animation source, + @NotNull String newName, + int startFrame, + int endFrame + ) { + + var sourceTracks = source.getTracks(); + var firstSourceTrack = (BoneTrack) sourceTracks[0]; + var sourceTimes = firstSourceTrack.getTimes(); + + var newLength = (source.getLength() / (float) sourceTimes.length) * (float) (endFrame - startFrame); + var result = new Animation(newName, newLength); + var newTracks = ArrayFactory.newArray(Track.class); + + for (var sourceTrack : sourceTracks) { if (sourceTrack instanceof BoneTrack) { newTracks.add(extractBoneTrack((BoneTrack) sourceTrack, startFrame, endFrame)); } @@ -79,22 +82,22 @@ public class AnimationUtils { * @param endFrame the end frame. * @return the extracted bone track. */ - private static @NotNull BoneTrack extractBoneTrack(@NotNull final BoneTrack boneTrack, final int startFrame, - final int endFrame) { + @FromAnyThread + private static @NotNull BoneTrack extractBoneTrack(@NotNull BoneTrack boneTrack, int startFrame, int endFrame) { - final float[] sourceTimes = boneTrack.getTimes(); + var sourceTimes = boneTrack.getTimes(); - final Vector3f[] newTranslations = new Vector3f[endFrame - startFrame]; - final Quaternion[] newRotations = new Quaternion[endFrame - startFrame]; - final Vector3f[] newScales = new Vector3f[endFrame - startFrame]; - final float[] newTimes = new float[endFrame - startFrame]; + var newTranslations = new Vector3f[endFrame - startFrame]; + var newRotations = new Quaternion[endFrame - startFrame]; + var newScales = new Vector3f[endFrame - startFrame]; + var newTimes = new float[endFrame - startFrame]; for (int i = startFrame; i < endFrame; i++) { - final int newFrame = i - startFrame; - final Vector3f sourceTranslation = boneTrack.getTranslations()[i]; - final Vector3f sourceScale = boneTrack.getScales()[i]; - final Quaternion sourceRotation = boneTrack.getRotations()[i]; + var newFrame = i - startFrame; + var sourceTranslation = boneTrack.getTranslations()[i]; + var sourceScale = boneTrack.getScales()[i]; + var sourceRotation = boneTrack.getRotations()[i]; newTimes[newFrame] = sourceTimes[i] - sourceTimes[startFrame]; newTranslations[newFrame] = sourceTranslation.clone(); @@ -102,7 +105,8 @@ public class AnimationUtils { newScales[newFrame] = sourceScale.clone(); } - return new BoneTrack(boneTrack.getTargetBoneIndex(), newTimes, newTranslations, newRotations, newScales); + return new BoneTrack(boneTrack.getTargetBoneIndex(), newTimes, + newTranslations, newRotations, newScales); } /** @@ -114,11 +118,15 @@ public class AnimationUtils { * @param newName the new name. */ @FromAnyThread - public static void changeName(@NotNull final AnimControl control, @NotNull final Animation animation, - @NotNull final String oldName, @NotNull final String newName) { + public static void changeName( + @NotNull AnimControl control, + @NotNull Animation animation, + @NotNull String oldName, + @NotNull String newName + ) { try { - final Map animationMap = unsafeCast(ANIMATIONS_MAP_FIELD.get(control)); + var animationMap = ClassUtils.>unsafeCast(ANIMATIONS_MAP_FIELD.get(control)); if (!animationMap.containsKey(oldName)) { throw new IllegalArgumentException("Given animation does not exist " + "in this AnimControl"); @@ -133,7 +141,7 @@ public static void changeName(@NotNull final AnimControl control, @NotNull final animationMap.remove(oldName); animationMap.put(newName, animation); - } catch (final IllegalAccessException e) { + } catch (IllegalAccessException e) { throw new RuntimeException(e); } } @@ -145,12 +153,12 @@ public static void changeName(@NotNull final AnimControl control, @NotNull final * @return the frame count or -1. */ @FromAnyThread - public static int getFrameCount(@NotNull final Animation animation) { + public static int getFrameCount(@NotNull Animation animation) { - int min = Integer.MAX_VALUE; + var min = Integer.MAX_VALUE; - final Track[] tracks = animation.getTracks(); - for (final Track track : tracks) { + var tracks = animation.getTracks(); + for (var track : tracks) { if (track instanceof BoneTrack) { min = Math.min(min, ((BoneTrack) track).getTimes().length); } @@ -167,7 +175,7 @@ public static int getFrameCount(@NotNull final Animation animation) { * @return the free name. */ @FromAnyThread - public static @NotNull String findFreeName(@NotNull final AnimControl control, @NotNull final String base) { + public static @NotNull String findFreeName(@NotNull AnimControl control, @NotNull String base) { if (control.getAnim(base) == null) { return base; diff --git a/src/main/java/com/ss/editor/util/AudioNodeUtils.java b/src/main/java/com/ss/editor/util/AudioNodeUtils.java index fa14b8f8..253cb5ae 100644 --- a/src/main/java/com/ss/editor/util/AudioNodeUtils.java +++ b/src/main/java/com/ss/editor/util/AudioNodeUtils.java @@ -3,9 +3,8 @@ import com.jme3.audio.AudioData; import com.jme3.audio.AudioKey; import com.jme3.audio.AudioNode; -import com.ss.editor.annotation.JmeThread; import com.ss.editor.annotation.FromAnyThread; - +import com.ss.editor.annotation.JmeThread; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -18,10 +17,7 @@ */ public class AudioNodeUtils { - @NotNull private static final Field AUDIO_DATA_FIELD; - - @NotNull private static final Field AUDIO_KEY_FIELD; static { @@ -33,7 +29,7 @@ public class AudioNodeUtils { AUDIO_DATA_FIELD = AudioNode.class.getDeclaredField("data"); AUDIO_DATA_FIELD.setAccessible(true); - } catch (final NoSuchFieldException e) { + } catch (NoSuchFieldException e) { throw new RuntimeException(e); } } @@ -46,12 +42,15 @@ public class AudioNodeUtils { * @param audioKey the audio key. */ @JmeThread - public static void updateData(@NotNull final AudioNode audioNode, @Nullable final AudioData audioData, - @Nullable final AudioKey audioKey) { + public static void updateData( + @NotNull AudioNode audioNode, + @Nullable AudioData audioData, + @Nullable AudioKey audioKey + ) { try { AUDIO_DATA_FIELD.set(audioNode, audioData); AUDIO_KEY_FIELD.set(audioNode, audioKey); - } catch (final IllegalAccessException e) { + } catch (IllegalAccessException e) { throw new RuntimeException(e); } } @@ -63,10 +62,10 @@ public static void updateData(@NotNull final AudioNode audioNode, @Nullable fina * @return the audio key. */ @FromAnyThread - public static @Nullable AudioKey getAudioKey(@NotNull final AudioNode audioNode) { + public static @Nullable AudioKey getAudioKey(@NotNull AudioNode audioNode) { try { return (AudioKey) AUDIO_KEY_FIELD.get(audioNode); - } catch (final IllegalAccessException e) { + } catch (IllegalAccessException e) { throw new RuntimeException(e); } } diff --git a/src/main/java/com/ss/editor/util/ControlUtils.java b/src/main/java/com/ss/editor/util/ControlUtils.java index 0772c5bd..897b5477 100644 --- a/src/main/java/com/ss/editor/util/ControlUtils.java +++ b/src/main/java/com/ss/editor/util/ControlUtils.java @@ -10,7 +10,6 @@ import com.jme3.bullet.objects.PhysicsRigidBody; import com.jme3.math.Vector3f; import com.jme3.scene.Geometry; -import com.jme3.scene.Mesh; import com.jme3.scene.Spatial; import com.jme3.scene.control.AbstractControl; import com.jme3.scene.control.Control; @@ -37,14 +36,14 @@ public class ControlUtils { * @return the control's stream. */ @FromAnyThread - public static boolean has(@NotNull final Spatial spatial, @NotNull final Class type) { + public static boolean has(@NotNull Spatial spatial, @NotNull Class type) { - final int numControls = spatial.getNumControls(); + var numControls = spatial.getNumControls(); if (numControls < 1) { return false; } - for (int i = 0; i < numControls; i++) { + for (var i = 0; i < numControls; i++) { if (type.isInstance(spatial.getControl(i))) { return true; } @@ -60,15 +59,15 @@ public static boolean has(@NotNull final Spatial spatial, @NotNull final Class controls(@NotNull final Spatial spatial) { + public static @NotNull Stream controls(@NotNull Spatial spatial) { - final int numControls = spatial.getNumControls(); + var numControls = spatial.getNumControls(); if (numControls < 1) { return Stream.empty(); } - final Control[] controls = new Control[numControls]; - for (int i = 0; i < numControls; i++) { + var controls = new Control[numControls]; + for (var i = 0; i < numControls; i++) { controls[i] = spatial.getControl(i); } @@ -82,7 +81,7 @@ public static boolean has(@NotNull final Spatial spatial, @NotNull final Class, Enum[]>> ENUM_VALUES_LOCAL = ThreadLocal.withInitial(DictionaryFactory::newObjectDictionary); - @NotNull private static JmeApplication jmeApplication; - - @NotNull private static JfxApplication jfxApplication; public static void setJmeApplication(@NotNull JmeApplication jmeApplication) { @@ -256,6 +254,16 @@ public static void updateGlobalLightProbe(@NotNull JobProgressAdapter resolveClass(@NotNull final ObjectStreamClass desc) throws IOException, ClassNotFoundException { + protected Class resolveClass(@NotNull ObjectStreamClass desc) throws IOException, ClassNotFoundException { try { return super.resolveClass(desc); - } catch (final ClassNotFoundException e) { + } catch (ClassNotFoundException e) { - final String name = desc.getName(); + var name = desc.getName(); - try (final Reference ref = ReferenceFactory.takeFromTLPool(ReferenceType.OBJECT)) { + try (var ref = ReferenceFactory.takeFromTLPool(ReferenceType.OBJECT)) { - final PluginManager pluginManager = PluginManager.getInstance(); + var pluginManager = PluginManager.getInstance(); pluginManager.handlePlugins(plugin -> { - if (ref.getObject() != null) return; + if (ref.getObject() != null) { + return; + } - final ClassLoader classLoader = plugin.getClassLoader(); + var classLoader = plugin.getClassLoader(); try { ref.setObject(classLoader.loadClass(name)); - } catch (final ClassNotFoundException ex) { + } catch (ClassNotFoundException ex) { // ignore this exception } }); diff --git a/src/main/java/com/ss/editor/util/GeomUtils.java b/src/main/java/com/ss/editor/util/GeomUtils.java index 76213fac..448c369a 100644 --- a/src/main/java/com/ss/editor/util/GeomUtils.java +++ b/src/main/java/com/ss/editor/util/GeomUtils.java @@ -2,9 +2,7 @@ import com.jme3.collision.CollisionResult; import com.jme3.collision.CollisionResults; -import com.jme3.input.InputManager; import com.jme3.math.Quaternion; -import com.jme3.math.Ray; import com.jme3.math.Vector2f; import com.jme3.math.Vector3f; import com.jme3.renderer.Camera; @@ -16,7 +14,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.List; import java.util.Objects; import java.util.concurrent.atomic.AtomicInteger; @@ -35,7 +32,7 @@ public class GeomUtils { * @return the up. */ @FromAnyThread - public static @NotNull Vector3f getUp(@NotNull final Quaternion rotation, @NotNull final Vector3f store) { + public static @NotNull Vector3f getUp(@NotNull Quaternion rotation, @NotNull Vector3f store) { return rotation.getRotationColumn(1, store); } @@ -47,7 +44,7 @@ public class GeomUtils { * @return the left. */ @FromAnyThread - public static @NotNull Vector3f getLeft(@NotNull final Quaternion rotation, @NotNull final Vector3f store) { + public static @NotNull Vector3f getLeft(@NotNull Quaternion rotation, @NotNull Vector3f store) { return rotation.getRotationColumn(0, store); } @@ -59,7 +56,7 @@ public class GeomUtils { * @return the direction. */ @FromAnyThread - public static @NotNull Vector3f getDirection(@NotNull final Quaternion rotation, @NotNull final Vector3f store) { + public static @NotNull Vector3f getDirection(@NotNull Quaternion rotation, @NotNull Vector3f store) { return rotation.getRotationColumn(2, store); } @@ -71,7 +68,7 @@ public class GeomUtils { * @return the index. */ @FromAnyThread - public static int getIndex(@NotNull final Spatial model, @NotNull final Object object) { + public static int getIndex(@NotNull Spatial model, @NotNull Object object) { Spatial parent = model; int parentIndex = 0; @@ -86,12 +83,11 @@ public static int getIndex(@NotNull final Spatial model, @NotNull final Object o return -1; } - final AtomicInteger counter = new AtomicInteger(0); - final Node node = (Node) model; + var counter = new AtomicInteger(0); + var node = (Node) model; + var children = node.getChildren(); - final List children = node.getChildren(); - - for (final Spatial child : children) { + for (var child : children) { if (getIndex(child, object, counter)) { return counter.get(); } @@ -104,8 +100,7 @@ public static int getIndex(@NotNull final Spatial model, @NotNull final Object o * Get the index of the object in the model. */ @FromAnyThread - private static boolean getIndex(@NotNull final Object model, @NotNull final Object object, - @NotNull final AtomicInteger counter) { + private static boolean getIndex(@NotNull Object model, @NotNull Object object, @NotNull AtomicInteger counter) { counter.incrementAndGet(); if (Objects.equals(model, object)) { @@ -116,10 +111,10 @@ private static boolean getIndex(@NotNull final Object model, @NotNull final Obje return false; } - final Node node = (Node) model; - final List children = node.getChildren(); + var node = (Node) model; + var children = node.getChildren(); - for (final Spatial child : children) { + for (var child : children) { if (getIndex(child, object, counter)) { return true; } @@ -136,7 +131,7 @@ private static boolean getIndex(@NotNull final Object model, @NotNull final Obje * @return the object by index. */ @FromAnyThread - public static @Nullable Object getObjectByIndex(@NotNull final Spatial model, final int index) { + public static @Nullable Object getObjectByIndex(@NotNull Spatial model, int index) { Spatial parent = model; int parentIndex = 0; @@ -151,14 +146,15 @@ private static boolean getIndex(@NotNull final Object model, @NotNull final Obje return null; } - final AtomicInteger counter = new AtomicInteger(0); - final Node node = (Node) model; - - final List children = node.getChildren(); + var counter = new AtomicInteger(0); + var node = (Node) model; + var children = node.getChildren(); - for (final Spatial child : children) { - final Object object = getObjectByIndex(child, index, counter); - if (object != null) return object; + for (var child : children) { + var object = getObjectByIndex(child, index, counter); + if (object != null) { + return object; + } } return null; @@ -168,8 +164,11 @@ private static boolean getIndex(@NotNull final Object model, @NotNull final Obje * Find the object by the index in the model. */ @FromAnyThread - private static @Nullable Object getObjectByIndex(@NotNull final Object model, final int index, - @NotNull final AtomicInteger counter) { + private static @Nullable Object getObjectByIndex( + @NotNull Object model, + int index, + @NotNull AtomicInteger counter + ) { if (counter.incrementAndGet() == index) { return model; @@ -179,12 +178,14 @@ private static boolean getIndex(@NotNull final Object model, @NotNull final Obje return null; } - final Node node = (Node) model; - final List children = node.getChildren(); + var node = (Node) model; + var children = node.getChildren(); - for (final Spatial child : children) { - final Object object = getObjectByIndex(child, index, counter); - if (object != null) return object; + for (var child : children) { + var object = getObjectByIndex(child, index, counter); + if (object != null) { + return object; + } } return null; @@ -199,7 +200,7 @@ private static boolean getIndex(@NotNull final Object model, @NotNull final Obje * @return true if the spatial can be attached to the node. */ @FromAnyThread - public static boolean canAttach(@NotNull final Node node, @NotNull final Spatial spatial, final boolean isCopy) { + public static boolean canAttach(@NotNull Node node, @NotNull Spatial spatial, boolean isCopy) { if (spatial.getParent() == node && !isCopy) { return false; @@ -207,8 +208,8 @@ public static boolean canAttach(@NotNull final Node node, @NotNull final Spatial return false; } - final AssetLinkNode linkNode = isCopy ? null : - NodeUtils.findParent(spatial.getParent(), AssetLinkNode.class::isInstance); + var linkNode = isCopy ? null : NodeUtils.findParent(spatial.getParent(), + AssetLinkNode.class::isInstance); return linkNode == null; } @@ -221,9 +222,9 @@ public static boolean canAttach(@NotNull final Node node, @NotNull final Spatial * @return the contact point or null. */ @FromAnyThread - public static @Nullable Vector3f getContactPointFromCursor(@NotNull final Spatial spatial, @NotNull final Camera camera) { - final InputManager inputManager = EditorUtil.getInputManager(); - final Vector2f cursor = inputManager.getCursorPosition(); + public static @Nullable Vector3f getContactPointFromCursor(@NotNull Spatial spatial, @NotNull Camera camera) { + var inputManager = EditorUtil.getInputManager(); + var cursor = inputManager.getCursorPosition(); return getContactPointFromScreenPos(spatial, camera, cursor.getX(), cursor.getY()); } @@ -235,10 +236,9 @@ public static boolean canAttach(@NotNull final Node node, @NotNull final Spatial * @return the collision result or null. */ @FromAnyThread - public static @Nullable CollisionResult getCollisionFromCursor(@NotNull final Spatial spatial, - @NotNull final Camera camera) { - final InputManager inputManager = EditorUtil.getInputManager(); - final Vector2f cursor = inputManager.getCursorPosition(); + public static @Nullable CollisionResult getCollisionFromCursor(@NotNull Spatial spatial, @NotNull Camera camera) { + var inputManager = EditorUtil.getInputManager(); + var cursor = inputManager.getCursorPosition(); return getCollisionFromScreenPos(spatial, camera, cursor.getX(), cursor.getY()); } @@ -250,10 +250,9 @@ public static boolean canAttach(@NotNull final Node node, @NotNull final Spatial * @return the collisions result. */ @FromAnyThread - public static @NotNull CollisionResults getCollisionsFromCursor(@NotNull final Spatial spatial, - @NotNull final Camera camera) { - final InputManager inputManager = EditorUtil.getInputManager(); - final Vector2f cursor = inputManager.getCursorPosition(); + public static @NotNull CollisionResults getCollisionsFromCursor(@NotNull Spatial spatial, @NotNull Camera camera) { + var inputManager = EditorUtil.getInputManager(); + var cursor = inputManager.getCursorPosition(); return getCollisionsFromScreenPos(spatial, camera, cursor.getX(), cursor.getY()); } @@ -267,10 +266,13 @@ public static boolean canAttach(@NotNull final Node node, @NotNull final Spatial * @return the contact point or null. */ @FromAnyThread - public static @Nullable Vector3f getContactPointFromScreenPos(@NotNull final Spatial spatial, - @NotNull final Camera camera, final float screenX, - final float screenY) { - final CollisionResult collision = getCollisionFromScreenPos(spatial, camera, screenX, screenY); + public static @Nullable Vector3f getContactPointFromScreenPos( + @NotNull Spatial spatial, + @NotNull Camera camera, + float screenX, + float screenY + ) { + var collision = getCollisionFromScreenPos(spatial, camera, screenX, screenY); return collision == null ? null : collision.getContactPoint(); } @@ -284,10 +286,13 @@ public static boolean canAttach(@NotNull final Node node, @NotNull final Spatial * @return the contact normal or null. */ @FromAnyThread - public static @Nullable Vector3f getContactNormalFromScreenPos(@NotNull final Spatial spatial, - @NotNull final Camera camera, final float screenX, - final float screenY) { - final CollisionResult collision = getCollisionFromScreenPos(spatial, camera, screenX, screenY); + public static @Nullable Vector3f getContactNormalFromScreenPos( + @NotNull Spatial spatial, + @NotNull Camera camera, + float screenX, + float screenY + ) { + var collision = getCollisionFromScreenPos(spatial, camera, screenX, screenY); return collision == null ? null : collision.getContactNormal(); } @@ -299,9 +304,9 @@ public static boolean canAttach(@NotNull final Node node, @NotNull final Spatial * @return the geometry or null. */ @FromAnyThread - public static @Nullable Geometry getGeometryFromCursor(@NotNull final Spatial spatial, @NotNull final Camera camera) { - final InputManager inputManager = EditorUtil.getInputManager(); - final Vector2f cursor = inputManager.getCursorPosition(); + public static @Nullable Geometry getGeometryFromCursor(@NotNull Spatial spatial, @NotNull Camera camera) { + var inputManager = EditorUtil.getInputManager(); + var cursor = inputManager.getCursorPosition(); return getGeometryFromScreenPos(spatial, camera, cursor.getX(), cursor.getY()); } @@ -315,10 +320,13 @@ public static boolean canAttach(@NotNull final Node node, @NotNull final Spatial * @return the geometry or null. */ @FromAnyThread - public static @Nullable Geometry getGeometryFromScreenPos(@NotNull final Spatial spatial, - @NotNull final Camera camera, final float screenX, - final float screenY) { - final CollisionResult collision = getCollisionFromScreenPos(spatial, camera, screenX, screenY); + public static @Nullable Geometry getGeometryFromScreenPos( + @NotNull Spatial spatial, + @NotNull Camera camera, + float screenX, + float screenY + ) { + var collision = getCollisionFromScreenPos(spatial, camera, screenX, screenY); return collision == null ? null : collision.getGeometry(); } @@ -332,11 +340,14 @@ public static boolean canAttach(@NotNull final Node node, @NotNull final Spatial * @return the collision or null. */ @FromAnyThread - public static @Nullable CollisionResult getCollisionFromScreenPos(@NotNull final Spatial spatial, - @NotNull final Camera camera, final float screenX, - final float screenY) { - - final CollisionResults results = getCollisionsFromScreenPos(spatial, camera, screenX, screenY); + public static @Nullable CollisionResult getCollisionFromScreenPos( + @NotNull Spatial spatial, + @NotNull Camera camera, + float screenX, + float screenY + ) { + + var results = getCollisionsFromScreenPos(spatial, camera, screenX, screenY); if (results.size() < 1) { return null; } @@ -354,23 +365,26 @@ public static boolean canAttach(@NotNull final Node node, @NotNull final Spatial * @return the collisions . */ @FromAnyThread - public static @NotNull CollisionResults getCollisionsFromScreenPos(@NotNull final Spatial spatial, - @NotNull final Camera camera, - final float screenX, final float screenY) { - - final LocalObjects local = LocalObjects.get(); - - final Vector2f cursor = local.nextVector(screenX, screenY); - final Vector3f click3d = camera.getWorldCoordinates(cursor, 0f, local.nextVector()); - final Vector3f dir = camera.getWorldCoordinates(cursor, 1f, local.nextVector()) + public static @NotNull CollisionResults getCollisionsFromScreenPos( + @NotNull Spatial spatial, + @NotNull Camera camera, + float screenX, + float screenY + ) { + + var local = LocalObjects.get(); + + var cursor = local.nextVector(screenX, screenY); + var click3d = camera.getWorldCoordinates(cursor, 0f, local.nextVector()); + var dir = camera.getWorldCoordinates(cursor, 1f, local.nextVector()) .subtractLocal(click3d) .normalizeLocal(); - final Ray ray = local.nextRay(); + var ray = local.nextRay(); ray.setOrigin(click3d); ray.setDirection(dir); - final CollisionResults results = local.nextCollisionResults(); + var results = local.nextCollisionResults(); spatial.updateModelBound(); spatial.collideWith(ray, results); diff --git a/src/main/java/com/ss/editor/util/GlslType.java b/src/main/java/com/ss/editor/util/GlslType.java index 2f94dc0b..793c1056 100644 --- a/src/main/java/com/ss/editor/util/GlslType.java +++ b/src/main/java/com/ss/editor/util/GlslType.java @@ -34,17 +34,13 @@ public enum GlslType { SAMPLER_2D("sampler2D", "Texture 2D"), SAMPLER_CUBE("samplerCube", "Cube Texture"); - @NotNull public static final GlslType[] VALUES = values(); - @NotNull private static final ObjectDictionary RAW_TYPE_TO_ENUM = DictionaryFactory.newObjectDictionary(); - - @NotNull private static final ObjectDictionary UI_NAME_TO_ENUM = DictionaryFactory.newObjectDictionary(); static { - for (final GlslType glslType : VALUES) { + for (var glslType : VALUES) { RAW_TYPE_TO_ENUM.put(glslType.getRawType(), glslType); UI_NAME_TO_ENUM.put(glslType.getUIName(), glslType); } @@ -57,7 +53,7 @@ public enum GlslType { * @return the enum value. */ @FromAnyThread - public static @NotNull GlslType ofRawType(@NotNull final String rawType) { + public static @NotNull GlslType ofRawType(@NotNull String rawType) { return notNull(RAW_TYPE_TO_ENUM.get(rawType)); } @@ -68,7 +64,7 @@ public enum GlslType { * @return the enum value. */ @FromAnyThread - public static @NotNull GlslType ofUIName(@NotNull final String uiName) { + public static @NotNull GlslType ofUIName(@NotNull String uiName) { return notNull(RAW_TYPE_TO_ENUM.get(uiName)); } @@ -84,7 +80,7 @@ public enum GlslType { @NotNull private String uiName; - GlslType(@NotNull final String rawType, @NotNull final String uiName) { + GlslType(@NotNull String rawType, @NotNull String uiName) { this.rawType = rawType; this.uiName = uiName; } diff --git a/src/main/java/com/ss/editor/util/LocalObjects.java b/src/main/java/com/ss/editor/util/LocalObjects.java index 26e3b2f9..a122ec89 100644 --- a/src/main/java/com/ss/editor/util/LocalObjects.java +++ b/src/main/java/com/ss/editor/util/LocalObjects.java @@ -23,7 +23,6 @@ public class LocalObjects { private static final int SIZE = 50; - @NotNull private static final ThreadLocal THREAD_LOCAL = ThreadLocal.withInitial(LocalObjects::new); /** @@ -210,7 +209,7 @@ public LocalObjects() { * @return the next free vector with values from the source vector. */ @FromAnyThread - public @NotNull Vector3f nextVector(@NotNull final Vector3f vector3f) { + public @NotNull Vector3f nextVector(@NotNull Vector3f vector3f) { return vectorBuffer.next().set(vector3f); } @@ -223,7 +222,7 @@ public LocalObjects() { * @return the next free vector with the values. */ @FromAnyThread - public @NotNull Vector3f nextVector(final float x, final float y, final float z) { + public @NotNull Vector3f nextVector(float x, float y, float z) { return vectorBuffer.next().set(x, y, z); } @@ -245,7 +244,7 @@ public LocalObjects() { * @return the next free vector with the values. */ @FromAnyThread - public @NotNull Vector2f nextVector(final float x, final float y) { + public @NotNull Vector2f nextVector(float x, float y) { return vector2fBuffer.next().set(x, y); } diff --git a/src/main/java/com/ss/editor/util/MaterialSerializer.java b/src/main/java/com/ss/editor/util/MaterialSerializer.java index 822a70f5..2c066f0d 100644 --- a/src/main/java/com/ss/editor/util/MaterialSerializer.java +++ b/src/main/java/com/ss/editor/util/MaterialSerializer.java @@ -3,7 +3,6 @@ import com.jme3.asset.TextureKey; import com.jme3.material.MatParam; import com.jme3.material.Material; -import com.jme3.material.MaterialDef; import com.jme3.material.RenderState; import com.jme3.math.ColorRGBA; import com.jme3.math.Vector2f; @@ -17,8 +16,6 @@ import com.ss.rlib.common.util.StringUtils; import org.jetbrains.annotations.NotNull; -import java.util.Collection; - /** * The implementation of a material serializer. * @@ -33,21 +30,21 @@ public class MaterialSerializer { * @return the string */ @FromAnyThread - public static @NotNull String serializeToString(@NotNull final Material material) { + public static @NotNull String serializeToString(@NotNull Material material) { - final MaterialDef materialDef = material.getMaterialDef(); - final Collection params = material.getParams(); + var materialDef = material.getMaterialDef(); + var params = material.getParams(); - final StringBuilder builder = new StringBuilder(); + var builder = new StringBuilder(); builder.append("Material MyMaterial : ").append(materialDef.getAssetName()).append(" {\n"); builder.append(" MaterialParameters {\n"); params.forEach(matParam -> addMaterialParameter(builder, matParam)); builder.append(" }\n"); builder.append(" AdditionalRenderState {\n"); - final RenderState renderState = material.getAdditionalRenderState(); - final RenderState.BlendMode blendMode = renderState.getBlendMode(); - final RenderState.FaceCullMode faceCullMode = renderState.getFaceCullMode(); + var renderState = material.getAdditionalRenderState(); + var blendMode = renderState.getBlendMode(); + var faceCullMode = renderState.getFaceCullMode(); if (blendMode != RenderState.BlendMode.Off) { builder.append(" Blend ").append(blendMode.name()).append('\n'); @@ -62,8 +59,8 @@ public class MaterialSerializer { if (!renderState.isDepthWrite()) builder.append(" DepthWrite Off\n"); if (!renderState.isColorWrite()) builder.append(" ColorWrite Off\n"); - final float polyOffsetFactor = renderState.getPolyOffsetFactor(); - final float polyOffsetUnits = renderState.getPolyOffsetUnits(); + var polyOffsetFactor = renderState.getPolyOffsetFactor(); + var polyOffsetUnits = renderState.getPolyOffsetUnits(); if (polyOffsetFactor != 0 || polyOffsetUnits != 0) { builder.append(" PolyOffset ") @@ -86,9 +83,9 @@ public class MaterialSerializer { * @param matParam the material parameter. */ @FromAnyThread - private static void addMaterialParameter(@NotNull final StringBuilder builder, @NotNull final MatParam matParam) { + private static void addMaterialParameter(@NotNull StringBuilder builder, @NotNull MatParam matParam) { - final String value = toString(matParam.getVarType(), matParam.getValue()); + var value = toString(matParam.getVarType(), matParam.getValue()); if (StringUtils.isEmpty(value)) { return; } @@ -101,7 +98,7 @@ private static void addMaterialParameter(@NotNull final StringBuilder builder, @ } @FromAnyThread - private static @NotNull String toString(@NotNull final VarType varType, @NotNull final Object value) { + private static @NotNull String toString(@NotNull VarType varType, @NotNull Object value) { switch (varType) { case Int: @@ -111,32 +108,33 @@ private static void addMaterialParameter(@NotNull final StringBuilder builder, @ case Vector4: { if (value instanceof ColorRGBA) { - final ColorRGBA color = (ColorRGBA) value; + var color = (ColorRGBA) value; return color.getRed() + " " + color.getGreen() + " " + color.getBlue() + " " + color.getAlpha(); } else if (value instanceof Vector4f) { - final Vector4f vector4f = (Vector4f) value; + var vector4f = (Vector4f) value; return vector4f.getX() + " " + vector4f.getY() + " " + vector4f.getZ() + " " + vector4f.getW(); } break; } case Vector2: { - final Vector2f vector2f = (Vector2f) value; + var vector2f = (Vector2f) value; return vector2f.getX() + " " + vector2f.getY(); } case Vector3: { - final Vector3f vector3f = (Vector3f) value; + var vector3f = (Vector3f) value; return vector3f.getX() + " " + vector3f.getY() + " " + vector3f.getZ(); } case Texture2D: { - final Texture2D texture2D = (Texture2D) value; - final TextureKey textureKey = (TextureKey) texture2D.getKey(); + var texture2D = (Texture2D) value; + var textureKey = (TextureKey) texture2D.getKey(); if (textureKey == null) { return ""; } - final StringBuilder builder = new StringBuilder(); + var builder = new StringBuilder(); + if (textureKey.isFlipY()) { builder.append("Flip "); } @@ -151,13 +149,15 @@ private static void addMaterialParameter(@NotNull final StringBuilder builder, @ } case TextureCubeMap: { - final TextureCubeMap textureCubeMap = (TextureCubeMap) value; - final TextureKey textureKey = (TextureKey) textureCubeMap.getKey(); + var textureCubeMap = (TextureCubeMap) value; + var textureKey = (TextureKey) textureCubeMap.getKey(); + if (textureKey == null) { return ""; } - final StringBuilder builder = new StringBuilder(); + var builder = new StringBuilder(); + if (textureKey.isFlipY()) { builder.append("Flip "); } diff --git a/src/main/java/com/ss/editor/util/MaterialUtils.java b/src/main/java/com/ss/editor/util/MaterialUtils.java index e728a09f..4983c990 100644 --- a/src/main/java/com/ss/editor/util/MaterialUtils.java +++ b/src/main/java/com/ss/editor/util/MaterialUtils.java @@ -5,14 +5,13 @@ import static com.ss.rlib.common.util.array.ArrayFactory.toArray; import static java.nio.file.StandardOpenOption.*; import com.jme3.asset.AssetKey; -import com.jme3.asset.AssetManager; import com.jme3.asset.MaterialKey; import com.jme3.asset.TextureKey; -import com.jme3.material.*; +import com.jme3.material.MatParam; +import com.jme3.material.Material; +import com.jme3.material.MaterialDef; import com.jme3.scene.Spatial; -import com.jme3.shader.Shader; import com.jme3.shader.VarType; -import com.jme3.texture.Image; import com.jme3.texture.Texture; import com.ss.editor.FileExtensions; import com.ss.editor.annotation.FromAnyThread; @@ -24,15 +23,10 @@ import org.jetbrains.annotations.Nullable; import javax.imageio.ImageIO; -import java.awt.image.BufferedImage; import java.io.IOException; -import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; -import java.util.Collection; -import java.util.EnumMap; -import java.util.List; /** * The class with utility methods for working with {@link Material}. @@ -66,7 +60,7 @@ public class MaterialUtils { * @return the texture type or 0. */ @FromAnyThread - public static int getPossibleTextureType(@NotNull final String textureName) { + public static int getPossibleTextureType(@NotNull String textureName) { if (textureName.contains("NORMAL") || textureName.contains("Normal") || textureName.contains("normal")) { return TEXTURE_NORMAL; @@ -114,7 +108,7 @@ public static int getPossibleTextureType(@NotNull final String textureName) { * @return the array of possible param names. */ @FromAnyThread - public static @NotNull String[] getPossibleParamNames(final int textureType) { + public static @NotNull String[] getPossibleParamNames(int textureType) { return TEXTURE_TYPE_PARAM_NAMES[textureType]; } @@ -126,28 +120,34 @@ public static int getPossibleTextureType(@NotNull final String textureName) { * @return the updated material or null. */ @JmeThread - public static @Nullable Material updateMaterialIdNeed(@NotNull final Path file, @NotNull final Material material) { + public static @Nullable Material updateMaterialIdNeed(@NotNull Path file, @NotNull Material material) { - final AssetManager assetManager = EditorUtil.getAssetManager(); + var assetManager = EditorUtil.getAssetManager(); boolean needToReload = false; String textureKey = null; if (MaterialUtils.isShaderFile(file)) { - if (!MaterialUtils.containsShader(material, file)) return null; + + if (!MaterialUtils.containsShader(material, file)) { + return null; + } + needToReload = true; // if the shader was changed we need to reload material definition - final MaterialDef materialDef = material.getMaterialDef(); - final String assetName = materialDef.getAssetName(); + var materialDef = material.getMaterialDef(); + var assetName = materialDef.getAssetName(); assetManager.deleteFromCache(new AssetKey<>(assetName)); } else if (MaterialUtils.isTextureFile(file)) { textureKey = MaterialUtils.containsTexture(material, file); - if (textureKey == null) return null; + if (textureKey == null) { + return null; + } } - final String assetName = material.getAssetName(); + var assetName = material.getAssetName(); // try to refresh texture directly if (textureKey != null) { @@ -157,11 +157,11 @@ public static int getPossibleTextureType(@NotNull final String textureName) { return null; } - final MaterialKey materialKey = new MaterialKey(assetName); + var materialKey = new MaterialKey(assetName); assetManager.deleteFromCache(materialKey); - final Material newMaterial = new Material(assetManager, material.getMaterialDef().getAssetName()); + var newMaterial = new Material(assetManager, material.getMaterialDef().getAssetName()); migrateTo(newMaterial, material); @@ -176,12 +176,11 @@ public static int getPossibleTextureType(@NotNull final String textureName) { * @return true if the material contains the shader. */ @FromAnyThread - private static boolean containsShader(@NotNull final Material material, @NotNull final Path file) { - - final MaterialDef materialDef = material.getMaterialDef(); + private static boolean containsShader(@NotNull Material material, @NotNull Path file) { - final Path assetFile = notNull(getAssetFile(file), "Can't get an asset file."); - final String assetPath = toAssetPath(assetFile); + var materialDef = material.getMaterialDef(); + var assetFile = notNull(getAssetFile(file), "Can't get an asset file."); + var assetPath = toAssetPath(assetFile); return containsShader(materialDef, assetPath); } @@ -194,10 +193,10 @@ private static boolean containsShader(@NotNull final Material material, @NotNull * @return changed texture key or null. */ @FromAnyThread - private static @Nullable String containsTexture(@NotNull final Material material, @NotNull final Path file) { + private static @Nullable String containsTexture(@NotNull Material material, @NotNull Path file) { - final Path assetFile = notNull(getAssetFile(file), "Can't get an asset file."); - final String assetPath = toAssetPath(assetFile); + var assetFile = notNull(getAssetFile(file), "Can't get an asset file."); + var assetPath = toAssetPath(assetFile); return containsTexture(material, assetPath) ? assetPath : null; } @@ -210,13 +209,15 @@ private static boolean containsShader(@NotNull final Material material, @NotNull * @return true if the material definition contains the shader. */ @FromAnyThread - private static boolean containsShader(@NotNull final MaterialDef materialDef, @NotNull final String assetPath) { + private static boolean containsShader(@NotNull MaterialDef materialDef, @NotNull String assetPath) { - final List defaultTechniques = materialDef.getTechniqueDefs("Default"); + var defaultTechniques = materialDef.getTechniqueDefs("Default"); - for (final TechniqueDef technique : defaultTechniques) { - final EnumMap shaderProgramNames = technique.getShaderProgramNames(); - if (shaderProgramNames.containsValue(assetPath)) return true; + for (var technique : defaultTechniques) { + var shaderProgramNames = technique.getShaderProgramNames(); + if (shaderProgramNames.containsValue(assetPath)) { + return true; + } } return false; @@ -230,13 +231,18 @@ private static boolean containsShader(@NotNull final MaterialDef materialDef, @N * @return true if the material definition contains the texture. */ @FromAnyThread - private static boolean containsTexture(@NotNull final Material material, @NotNull final String assetPath) { + private static boolean containsTexture(@NotNull Material material, @NotNull String assetPath) { + + var materialParams = material.getParams(); + + for (var materialParam : materialParams) { - final Collection materialParams = material.getParams(); - for (final MatParam materialParam : materialParams) { - if (materialParam.getVarType() != VarType.Texture2D) continue; - final Texture value = (Texture) materialParam.getValue(); - final TextureKey textureKey = value == null ? null : (TextureKey) value.getKey(); + if (materialParam.getVarType() != VarType.Texture2D) { + continue; + } + + var value = (Texture) materialParam.getValue(); + var textureKey = value == null ? null : (TextureKey) value.getKey(); if (textureKey != null && StringUtils.equals(textureKey.getName(), assetPath)) { return true; } @@ -252,9 +258,10 @@ private static boolean containsTexture(@NotNull final Material material, @NotNul * @return true if the file is shader. */ @FromAnyThread - public static boolean isShaderFile(@NotNull final Path path) { - final String extension = FileUtils.getExtension(path); - return FileExtensions.GLSL_FRAGMENT.equals(extension) || FileExtensions.GLSL_VERTEX.equals(extension); + public static boolean isShaderFile(@NotNull Path path) { + var extension = FileUtils.getExtension(path); + return FileExtensions.GLSL_FRAGMENT.equals(extension) || + FileExtensions.GLSL_VERTEX.equals(extension); } /** @@ -264,8 +271,8 @@ public static boolean isShaderFile(@NotNull final Path path) { * @return true if the file is texture. */ @FromAnyThread - public static boolean isTextureFile(@NotNull final Path path) { - final String extension = FileUtils.getExtension(path); + public static boolean isTextureFile(@NotNull Path path) { + var extension = FileUtils.getExtension(path); return FileExtensions.IMAGE_DDS.equals(extension) || FileExtensions.IMAGE_HDR.equals(extension) || FileExtensions.IMAGE_HDR.equals(extension) || FileExtensions.IMAGE_JPEG.equals(extension) || FileExtensions.IMAGE_JPG.equals(extension) || FileExtensions.IMAGE_PNG.equals(extension) || @@ -280,23 +287,24 @@ public static boolean isTextureFile(@NotNull final Path path) { * @param textureKey the texture key. */ @JmeThread - private static void refreshTextures(@NotNull final Material material, @NotNull final String textureKey) { + private static void refreshTextures(@NotNull Material material, @NotNull String textureKey) { - final AssetManager assetManager = EditorUtil.getAssetManager(); + var assetManager = EditorUtil.getAssetManager(); - final Collection params = material.getParams(); - params.forEach(matParam -> { + material.getParams().forEach(matParam -> { - final VarType varType = matParam.getVarType(); - final Object value = matParam.getValue(); + var varType = matParam.getVarType(); + var value = matParam.getValue(); - if (varType != VarType.Texture2D || value == null) return; + if (varType != VarType.Texture2D || value == null) { + return; + } - final Texture texture = (Texture) value; - final TextureKey key = (TextureKey) texture.getKey(); + var texture = (Texture) value; + var key = (TextureKey) texture.getKey(); if (key != null && StringUtils.equals(key.getName(), textureKey)) { - final Texture newTexture = assetManager.loadAsset(key); + var newTexture = assetManager.loadAsset(key); matParam.setValue(newTexture); } }); @@ -310,28 +318,24 @@ private static void refreshTextures(@NotNull final Material material, @NotNull f * @param material the target material. */ @JmeThread - private static void updateTo(@NotNull final Material toUpdate, @NotNull final Material material) { + private static void updateTo(@NotNull Material toUpdate, @NotNull Material material) { - final Collection oldParams = new ArrayList<>(toUpdate.getParams()); + var oldParams = new ArrayList(toUpdate.getParams()); oldParams.forEach(matParam -> { - - final MatParam param = material.getParam(matParam.getName()); - + var param = material.getParam(matParam.getName()); if (param == null || param.getValue() == null) { toUpdate.clearParam(matParam.getName()); } }); - final Collection actualParams = material.getParams(); + var actualParams = material.getParams(); actualParams.forEach(matParam -> { - - final VarType varType = matParam.getVarType(); - final Object value = matParam.getValue(); - + var varType = matParam.getVarType(); + var value = matParam.getValue(); toUpdate.setParam(matParam.getName(), varType, value); }); - final RenderState additionalRenderState = toUpdate.getAdditionalRenderState(); + var additionalRenderState = toUpdate.getAdditionalRenderState(); additionalRenderState.set(material.getAdditionalRenderState()); } @@ -342,14 +346,14 @@ private static void updateTo(@NotNull final Material toUpdate, @NotNull final Ma * @param source the source material. */ @JmeThread - public static void migrateTo(@NotNull final Material target, @NotNull final Material source) { + public static void migrateTo(@NotNull Material target, @NotNull Material source) { - final MaterialDef materialDef = target.getMaterialDef(); - final Collection actualParams = source.getParams(); + var materialDef = target.getMaterialDef(); + var actualParams = source.getParams(); actualParams.forEach(matParam -> { - final MatParam param = materialDef.getMaterialParam(matParam.getName()); + var param = materialDef.getMaterialParam(matParam.getName()); if (param == null || param.getVarType() != matParam.getVarType()) { return; @@ -358,7 +362,7 @@ public static void migrateTo(@NotNull final Material target, @NotNull final Mate target.setParam(matParam.getName(), matParam.getVarType(), matParam.getValue()); }); - final RenderState additionalRenderState = target.getAdditionalRenderState(); + var additionalRenderState = target.getAdditionalRenderState(); additionalRenderState.set(source.getAdditionalRenderState()); target.setKey(source.getKey()); @@ -370,10 +374,12 @@ public static void migrateTo(@NotNull final Material target, @NotNull final Mate * @param spatial the model. */ @JmeThread - public static void cleanUpMaterialParams(@NotNull final Spatial spatial) { + public static void cleanUpMaterialParams(@NotNull Spatial spatial) { NodeUtils.visitGeometry(spatial, geometry -> { - final Material material = geometry.getMaterial(); - if (material != null) cleanUp(material); + var material = geometry.getMaterial(); + if (material != null) { + cleanUp(material); + } }); } @@ -383,8 +389,8 @@ public static void cleanUpMaterialParams(@NotNull final Spatial spatial) { * @param material the material. */ @JmeThread - private static void cleanUp(@NotNull final Material material) { - final Collection params = new ArrayList<>(material.getParams()); + private static void cleanUp(@NotNull Material material) { + var params = new ArrayList(material.getParams()); params.stream().filter(param -> param.getValue() == null) .forEach(matParam -> material.clearParam(matParam.getName())); } @@ -395,8 +401,8 @@ private static void cleanUp(@NotNull final Material material) { * @param material the material. */ @FromAnyThread - public static void saveIfNeedTextures(@NotNull final Material material) { - final Collection params = material.getParams(); + public static void saveIfNeedTextures(@NotNull Material material) { + var params = material.getParams(); params.stream().filter(matParam -> matParam.getVarType() == VarType.Texture2D) .map(MatParam::getValue) .map(Texture.class::cast) @@ -409,18 +415,20 @@ public static void saveIfNeedTextures(@NotNull final Material material) { * @param texture the texture. */ @FromAnyThread - private static void saveIfNeedTexture(@NotNull final Texture texture) { + private static void saveIfNeedTexture(@NotNull Texture texture) { - final Image image = texture.getImage(); - if (!image.isChanged()) return; + var image = texture.getImage(); + if (!image.isChanged()) { + return; + } - final AssetKey key = texture.getKey(); - final Path file = notNull(getRealFile(key.getName())); - final BufferedImage bufferedImage = ImageToAwt.convert(image, false, true, 0); + var key = texture.getKey(); + var file = notNull(getRealFile(key.getName())); + var bufferedImage = ImageToAwt.convert(image, false, true, 0); - try (final OutputStream out = Files.newOutputStream(file, WRITE, TRUNCATE_EXISTING, CREATE)) { + try (var out = Files.newOutputStream(file, WRITE, TRUNCATE_EXISTING, CREATE)) { ImageIO.write(bufferedImage, "png", out); - } catch (final IOException e) { + } catch (IOException e) { e.printStackTrace(); } @@ -435,12 +443,15 @@ private static void saveIfNeedTexture(@NotNull final Texture texture) { * @param value the value. */ @FromAnyThread - public static void safeSet(@Nullable final Material material, @NotNull final String name, final float value) { + public static void safeSet(@Nullable Material material, @NotNull String name, float value) { + if (material == null) { return; } - final MatParam materialParam = material.getMaterialDef().getMaterialParam(name); + var materialParam = material.getMaterialDef() + .getMaterialParam(name); + if (materialParam != null) { material.setFloat(name, value); } @@ -454,12 +465,15 @@ public static void safeSet(@Nullable final Material material, @NotNull final Str * @param value the value. */ @FromAnyThread - public static void safeSet(@Nullable final Material material, @NotNull final String name, final boolean value) { + public static void safeSet(@Nullable Material material, @NotNull String name, boolean value) { + if (material == null) { return; } - final MatParam materialParam = material.getMaterialDef().getMaterialParam(name); + var materialParam = material.getMaterialDef() + .getMaterialParam(name); + if (materialParam != null) { material.setBoolean(name, value); } diff --git a/src/main/java/com/ss/editor/util/NodeUtils.java b/src/main/java/com/ss/editor/util/NodeUtils.java index 9b576d0b..eec2cf11 100644 --- a/src/main/java/com/ss/editor/util/NodeUtils.java +++ b/src/main/java/com/ss/editor/util/NodeUtils.java @@ -1,14 +1,13 @@ package com.ss.editor.util; import static com.ss.rlib.common.util.ClassUtils.unsafeCast; -import com.jme3.asset.AssetKey; import com.jme3.audio.AudioNode; import com.jme3.light.Light; -import com.jme3.light.LightList; import com.jme3.material.Material; import com.jme3.scene.Geometry; import com.jme3.scene.Node; import com.jme3.scene.Spatial; +import com.jme3.scene.Spatial.DFSMode; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.JmeThread; import com.ss.rlib.common.util.StringUtils; @@ -30,14 +29,13 @@ */ public class NodeUtils { - @NotNull private static final Field FIELD_WORLD_BOUND; static { try { FIELD_WORLD_BOUND = Spatial.class.getDeclaredField("worldBound"); FIELD_WORLD_BOUND.setAccessible(true); - } catch (final Exception e) { + } catch (Exception e) { throw new RuntimeException(e); } } @@ -99,7 +97,7 @@ public class NodeUtils { * @return the result parent. */ @FromAnyThread - public static @Nullable Spatial findParent(@NotNull final Spatial spatial, int count) { + public static @Nullable Spatial findParent(@NotNull Spatial spatial, int count) { Spatial parent = spatial; @@ -117,7 +115,7 @@ public class NodeUtils { * @return the geometry or null. */ @FromAnyThread - public static @Nullable Geometry findGeometry(@NotNull final Spatial spatial) { + public static @Nullable Geometry findGeometry(@NotNull Spatial spatial) { if (spatial instanceof Geometry) { return (Geometry) spatial; @@ -125,10 +123,10 @@ public class NodeUtils { return null; } - final Node node = (Node) spatial; + var node = (Node) spatial; - for (final Spatial children : node.getChildren()) { - final Geometry geometry = findGeometry(children); + for (var children : node.getChildren()) { + var geometry = findGeometry(children); if (geometry != null) { return geometry; } else if (children instanceof Geometry) { @@ -147,17 +145,21 @@ public class NodeUtils { * @return the geometry or null. */ @FromAnyThread - public static @Nullable Geometry findGeometry(@NotNull final Spatial spatial, @NotNull final String name) { + public static @Nullable Geometry findGeometry(@NotNull Spatial spatial, @NotNull String name) { if (!(spatial instanceof Node)) { return null; } - final Node node = (Node) spatial; + var node = (Node) spatial; + + for (var children : node.getChildren()) { + + var geometry = findGeometry(children, name); + if (geometry != null) { + return geometry; + } - for (final Spatial children : node.getChildren()) { - final Geometry geometry = findGeometry(children, name); - if (geometry != null) return geometry; if (children instanceof Geometry && StringUtils.equals(children.getName(), name)) { return (Geometry) children; } @@ -174,18 +176,17 @@ public class NodeUtils { * @return the geometry or null. */ @FromAnyThread - public static @Nullable Geometry findGeometry(@NotNull final Spatial spatial, - @NotNull final Predicate condition) { + public static @Nullable Geometry findGeometry(@NotNull Spatial spatial, @NotNull Predicate condition) { if (!(spatial instanceof Node)) { return null; } - final Node node = (Node) spatial; + var node = (Node) spatial; - for (final Spatial child : node.getChildren()) { + for (var child : node.getChildren()) { - final Geometry geometry = findGeometry(child, condition); + var geometry = findGeometry(child, condition); if (geometry != null) { return geometry; } @@ -206,18 +207,17 @@ public class NodeUtils { * @return the material or null. */ @FromAnyThread - public static @Nullable Material findMateial(@NotNull final Spatial spatial, - @NotNull final Predicate condition) { + public static @Nullable Material findMateial(@NotNull Spatial spatial, @NotNull Predicate condition) { if (!(spatial instanceof Node)) { return null; } - final Node node = (Node) spatial; + var node = (Node) spatial; - for (final Spatial child : node.getChildren()) { + for (var child : node.getChildren()) { - final Material material = findMateial(child, condition); + var material = findMateial(child, condition); if (material != null) { return material; } @@ -238,8 +238,12 @@ public class NodeUtils { * @return the spatial or null. */ @FromAnyThread - public static @Nullable Spatial findSpatial(@NotNull final Spatial spatial, @NotNull final String name) { - if (!(spatial instanceof Node)) return null; + public static @Nullable Spatial findSpatial(@NotNull Spatial spatial, @NotNull String name) { + + if (!(spatial instanceof Node)) { + return null; + } + return ((Node) spatial).getChild(name); } @@ -251,7 +255,7 @@ public class NodeUtils { * @return the spatial. */ @FromAnyThread - public static @Nullable Spatial findSpatial(@NotNull final Spatial spatial, @NotNull final Predicate condition) { + public static @Nullable Spatial findSpatial(@NotNull Spatial spatial, @NotNull Predicate condition) { if (condition.test(spatial)) { return spatial; @@ -259,10 +263,10 @@ public class NodeUtils { return null; } - final Node node = (Node) spatial; + var node = (Node) spatial; - for (final Spatial children : node.getChildren()) { - final Spatial child = findSpatial(children, condition); + for (var children : node.getChildren()) { + var child = findSpatial(children, condition); if (child != null) { return child; } @@ -279,15 +283,21 @@ public class NodeUtils { * @param assetPath the asset path. */ @FromAnyThread - public static void addGeometryWithMaterial(@NotNull final Spatial spatial, @NotNull final Array container, - @NotNull final String assetPath) { - if (StringUtils.isEmpty(assetPath)) return; + public static void addGeometryWithMaterial( + @NotNull Spatial spatial, + @NotNull Array container, + @NotNull String assetPath + ) { + + if (StringUtils.isEmpty(assetPath)) { + return; + } if (spatial instanceof Geometry) { - final Geometry geometry = (Geometry) spatial; - final Material material = geometry.getMaterial(); - final String assetName = material == null ? null : material.getAssetName(); + var geometry = (Geometry) spatial; + var material = geometry.getMaterial(); + var assetName = material == null ? null : material.getAssetName(); if (StringUtils.equals(assetName, assetPath)) { container.add(geometry); @@ -299,9 +309,9 @@ public static void addGeometryWithMaterial(@NotNull final Spatial spatial, @NotN return; } - final Node node = (Node) spatial; + var node = (Node) spatial; - for (final Spatial children : node.getChildren()) { + for (var children : node.getChildren()) { addGeometryWithMaterial(children, container, assetPath); } } @@ -314,11 +324,17 @@ public static void addGeometryWithMaterial(@NotNull final Spatial spatial, @NotN * @param assetPath the asset path. */ @FromAnyThread - public static void addSpatialWithAssetPath(@NotNull final Spatial spatial, @NotNull final Array container, - @NotNull final String assetPath) { - if (StringUtils.isEmpty(assetPath)) return; + public static void addSpatialWithAssetPath( + @NotNull Spatial spatial, + @NotNull Array container, + @NotNull String assetPath + ) { + + if (StringUtils.isEmpty(assetPath)) { + return; + } - final AssetKey key = spatial.getKey(); + var key = spatial.getKey(); if (key != null && StringUtils.equals(key.getName(), assetPath)) { container.add(spatial); @@ -328,9 +344,9 @@ public static void addSpatialWithAssetPath(@NotNull final Spatial spatial, @NotN return; } - final Node node = (Node) spatial; + var node = (Node) spatial; - for (final Spatial children : node.getChildren()) { + for (var children : node.getChildren()) { addSpatialWithAssetPath(children, container, assetPath); } } @@ -342,20 +358,12 @@ public static void addSpatialWithAssetPath(@NotNull final Spatial spatial, @NotN * @param consumer the consumer. */ @FromAnyThread - public static void visitGeometry(@NotNull final Spatial spatial, @NotNull final Consumer consumer) { - - if (spatial instanceof Geometry) { - consumer.accept((Geometry) spatial); - return; - } else if (!(spatial instanceof Node)) { - return; - } - - final Node node = (Node) spatial; - - for (final Spatial children : node.getChildren()) { - visitGeometry(children, consumer); - } + public static void visitGeometry(@NotNull Spatial spatial, @NotNull Consumer consumer) { + spatial.depthFirstTraversal(sp -> { + if (spatial instanceof Geometry) { + consumer.accept((Geometry) sp); + } + }, DFSMode.PRE_ORDER); } /** @@ -365,7 +373,7 @@ public static void visitGeometry(@NotNull final Spatial spatial, @NotNull final * @param handler the handler which should return true if need to visit children of a spatial. */ @FromAnyThread - public static void visitSpatial(@NotNull final Spatial spatial, @NotNull final Predicate handler) { + public static void visitSpatial(@NotNull Spatial spatial, @NotNull Predicate handler) { if (!handler.test(spatial)) { return; @@ -373,9 +381,9 @@ public static void visitSpatial(@NotNull final Spatial spatial, @NotNull final P return; } - final Node node = (Node) spatial; + var node = (Node) spatial; - for (final Spatial child : node.getChildren()) { + for (var child : node.getChildren()) { visitSpatial(child, handler); } } @@ -387,7 +395,7 @@ public static void visitSpatial(@NotNull final Spatial spatial, @NotNull final P * @param consumer the consumer. */ @FromAnyThread - public static void visitMaterials(@NotNull final Spatial spatial, @NotNull final Consumer consumer) { + public static void visitMaterials(@NotNull Spatial spatial, @NotNull Consumer consumer) { if (spatial instanceof Geometry) { consumer.accept(((Geometry) spatial).getMaterial()); @@ -396,9 +404,9 @@ public static void visitMaterials(@NotNull final Spatial spatial, @NotNull final return; } - final Node node = (Node) spatial; + var node = (Node) spatial; - for (final Spatial children : node.getChildren()) { + for (var children : node.getChildren()) { visitMaterials(children, consumer); } } @@ -412,8 +420,11 @@ public static void visitMaterials(@NotNull final Spatial spatial, @NotNull final * @param consumer the consumer. */ @FromAnyThread - public static void visitSpatial(@NotNull final Spatial spatial, @NotNull final Class type, - @NotNull final Consumer consumer) { + public static void visitSpatial( + @NotNull Spatial spatial, + @NotNull Class type, + @NotNull Consumer consumer + ) { if (type.isInstance(spatial)) { consumer.accept(type.cast(spatial)); @@ -423,9 +434,9 @@ public static void visitSpatial(@NotNull final Spatial spati return; } - final Node node = (Node) spatial; + var node = (Node) spatial; - for (final Spatial children : node.getChildren()) { + for (var children : node.getChildren()) { visitSpatial(children, type, consumer); } } @@ -437,8 +448,8 @@ public static void visitSpatial(@NotNull final Spatial spati * @return the list of all geometries. */ @FromAnyThread - public static @NotNull Array getGeometries(@NotNull final Spatial spatial) { - final Array result = ArrayFactory.newArray(Geometry.class); + public static @NotNull Array getGeometries(@NotNull Spatial spatial) { + var result = ArrayFactory.newArray(Geometry.class); addGeometry(spatial, result); return result; } @@ -450,7 +461,7 @@ public static void visitSpatial(@NotNull final Spatial spati * @param container the container. */ @FromAnyThread - public static void addGeometry(@NotNull final Spatial spatial, @NotNull final Array container) { + public static void addGeometry(@NotNull Spatial spatial, @NotNull Array container) { if (spatial instanceof Geometry) { container.add((Geometry) spatial); @@ -459,9 +470,9 @@ public static void addGeometry(@NotNull final Spatial spatial, @NotNull final Ar return; } - final Node node = (Node) spatial; + var node = (Node) spatial; - for (final Spatial children : node.getChildren()) { + for (var children : node.getChildren()) { addGeometry(children, container); } } @@ -473,18 +484,18 @@ public static void addGeometry(@NotNull final Spatial spatial, @NotNull final Ar * @param container the container. */ @FromAnyThread - public static void addLight(@NotNull final Spatial spatial, @NotNull final Array container) { + public static void addLight(@NotNull Spatial spatial, @NotNull Array container) { - final LightList lightList = spatial.getLocalLightList(); + var lightList = spatial.getLocalLightList(); lightList.forEach(container::add); if (!(spatial instanceof Node)) { return; } - final Node node = (Node) spatial; + var node = (Node) spatial; - for (final Spatial children : node.getChildren()) { + for (var children : node.getChildren()) { addLight(children, container); } } @@ -496,15 +507,15 @@ public static void addLight(@NotNull final Spatial spatial, @NotNull final Array * @param container the container. */ @FromAnyThread - public static void addAudioNodes(@NotNull final Spatial spatial, @NotNull final Array container) { + public static void addAudioNodes(@NotNull Spatial spatial, @NotNull Array container) { if (!(spatial instanceof Node)) { return; } - final Node node = (Node) spatial; + var node = (Node) spatial; - for (final Spatial children : node.getChildren()) { + for (var children : node.getChildren()) { if (children instanceof AudioNode) { container.add((AudioNode) children); } @@ -519,9 +530,9 @@ public static void addAudioNodes(@NotNull final Spatial spatial, @NotNull final * @return the spatial's stream. */ @FromAnyThread - public static Stream children(@NotNull final Spatial spatial) { + public static Stream children(@NotNull Spatial spatial) { - final Array result = ArrayFactory.newArray(Spatial.class); + var result = ArrayFactory.newArray(Spatial.class); visitSpatial(spatial, sp -> { result.add(sp); @@ -537,7 +548,7 @@ public static Stream children(@NotNull final Spatial spatial) { * @param spatial the spatial. */ @JmeThread - public static void updateWorldBound(@NotNull final Spatial spatial) { + public static void updateWorldBound(@NotNull Spatial spatial) { children(spatial).forEach(sp -> sp.forceRefresh(true, true, false)); children(spatial).forEach(Spatial::getWorldBound); } diff --git a/src/main/java/com/ss/editor/util/OpenGLVersion.java b/src/main/java/com/ss/editor/util/OpenGLVersion.java index ef0bc113..b3f126b7 100644 --- a/src/main/java/com/ss/editor/util/OpenGLVersion.java +++ b/src/main/java/com/ss/editor/util/OpenGLVersion.java @@ -19,11 +19,9 @@ public enum OpenGLVersion { GL_44(AppSettings.LWJGL_OPENGL44, "4.4 with core profile"), GL_45(AppSettings.LWJGL_OPENGL45, "4.5 with core profile"); - @NotNull private static final OpenGLVersion[] VERSIONS = values(); - @NotNull - public static OpenGLVersion valueOf(final int index) { + public static @NotNull OpenGLVersion valueOf(int index) { return VERSIONS[index]; } @@ -39,20 +37,23 @@ public static OpenGLVersion valueOf(final int index) { @NotNull private final String label; - OpenGLVersion(@NotNull final String render, @NotNull final String label) { + OpenGLVersion(@NotNull String render, @NotNull String label) { this.render = render; this.label = label; } /** + * Get the value for render. + * * @return the value for render. */ - @NotNull - public String getRender() { + public @NotNull String getRender() { return render; } /** + * Get the label for UI. + * * @return the label for UI. */ @Override diff --git a/src/main/java/com/ss/editor/util/PaintingUtils.java b/src/main/java/com/ss/editor/util/PaintingUtils.java index 9fd9b2fb..70c4e44c 100644 --- a/src/main/java/com/ss/editor/util/PaintingUtils.java +++ b/src/main/java/com/ss/editor/util/PaintingUtils.java @@ -1,14 +1,12 @@ package com.ss.editor.util; -import com.jme3.math.Vector2f; -import com.jme3.math.Vector3f; import com.jme3.scene.Geometry; -import com.jme3.scene.Mesh; import com.jme3.scene.Node; import com.jme3.scene.Spatial; import com.jme3.scene.shape.Sphere; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.control.painting.PaintingControl; +import com.ss.rlib.common.geom.util.CoordsUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -26,7 +24,7 @@ public class PaintingUtils { * @return the painting control or null. */ @FromAnyThread - public static @Nullable PaintingControl getPaintingControl(@NotNull final Node cursorNode) { + public static @Nullable PaintingControl getPaintingControl(@NotNull Node cursorNode) { return cursorNode.getControl(PaintingControl.class); } @@ -37,9 +35,9 @@ public class PaintingUtils { * @return the edited model or null. */ @FromAnyThread - public static @Nullable Spatial getPaintedModel(@NotNull final Node cursorNode) { - final PaintingControl control = getPaintingControl(cursorNode); - final Object paintedModel = control == null ? null : control.getPaintedModel(); + public static @Nullable Spatial getPaintedModel(@NotNull Node cursorNode) { + var control = getPaintingControl(cursorNode); + var paintedModel = control == null ? null : control.getPaintedModel(); return paintedModel instanceof Spatial ? (Spatial) paintedModel : null; } @@ -50,30 +48,29 @@ public class PaintingUtils { * @return the painted model or null. */ @FromAnyThread - public static @Nullable Spatial getPaintedModel(@Nullable final PaintingControl control) { - final Object paintedModel = control == null ? null : control.getPaintedModel(); + public static @Nullable Spatial getPaintedModel(@Nullable PaintingControl control) { + var paintedModel = control == null ? null : control.getPaintedModel(); return paintedModel instanceof Spatial ? (Spatial) paintedModel : null; } /** - * Check that the point is contains in a geometry. + * Check that the point is contains in the geometry. * * @param geometry the geometry. - * @param x the X coord. - * @param y the Y coord. - * @return true of the mesh contains the point. + * @param x the X component. + * @param y the Y component. + * @return true if the geometry contains the point. */ @FromAnyThread - public static boolean isContains(@NotNull final Geometry geometry, final float x, final float y) { + public static boolean isContains(@NotNull Geometry geometry, float x, float y) { - final Mesh mesh = geometry.getMesh(); - final Vector3f localScale = geometry.getLocalScale(); + var mesh = geometry.getMesh(); + var localScale = geometry.getLocalScale(); if (mesh instanceof Sphere) { - final float radius = ((Sphere) mesh).getRadius() * localScale.getX(); - final Vector2f point = new Vector2f(x, y); + var radius = ((Sphere) mesh).getRadius() * localScale.getX(); // return true if the distance is less than equal to the radius - return Math.abs(point.length()) <= radius; + return Math.abs(CoordsUtils.length(x, y)) <= radius; } return false; @@ -87,70 +84,28 @@ public static boolean isContains(@NotNull final Geometry geometry, final float x * * @param radius of the tool. * @param heightFactor potential height value to be adjusted. - * @param x location. - * @param z location. + * @param x the X component. + * @param y the Y component. * @return the adjusted height value. */ @FromAnyThread - public static float calculateHeight(final float radius, final float heightFactor, final float x, final float z) { - float val = calculateRadiusPercent(radius, x, z); - return heightFactor * val; + public static float calculateHeight(float radius, float heightFactor, float x, float y) { + return heightFactor * calculateRadiusPercent(radius, x, y); } /** - * Calculate radius percent float. + * Calculate percent of vector length and radius. * * @param radius the radius. - * @param x the x. - * @param z the z. - * @return the float. + * @param x the X component. + * @param y the Y component. + * @return the result percent. */ @FromAnyThread - public static float calculateRadiusPercent(final float radius, final float x, final float z) { + public static float calculateRadiusPercent(float radius, float x, float y) { // find percentage for each 'unit' in radius - final Vector2f point = LocalObjects.get().nextVector(x, z); - float val = Math.abs(point.length()) / radius; + var val = Math.abs(CoordsUtils.length(x, y)) / radius; val = 1f - val; return val; } - - /** - * Compare the two float values by the epsilon. - * - * @param first the first. - * @param second the second. - * @param epsilon the epsilon. - * @return true if the values are equals. - */ - @FromAnyThread - public static boolean floatEquals(final float first, final float second, final float epsilon) { - return first == second || Math.abs(first - second) < epsilon; - } - - /** - * Compare the two float values by the epsilon. - * - * @param first the first. - * @param second the second. - * @param epsilon the epsilon. - * @return true if the first value is less than the second value. - */ - @FromAnyThread - public static boolean floatLessThan(final float first, final float second, final float epsilon) { - return second - first > epsilon; - } - - /** - * Compare the two float values by the epsilon. - * - * @param first the first. - * @param second the second. - * @param epsilon the epsilon. - * @return the boolean - * @return true if the first value is greater than the second value. - */ - @FromAnyThread - public static boolean floatGreaterThan(final float first, final float second, final float epsilon) { - return first - second > epsilon; - } } diff --git a/src/main/java/com/ss/editor/util/ReusableCollisionResults.java b/src/main/java/com/ss/editor/util/ReusableCollisionResults.java index 39b029ec..42b79a75 100644 --- a/src/main/java/com/ss/editor/util/ReusableCollisionResults.java +++ b/src/main/java/com/ss/editor/util/ReusableCollisionResults.java @@ -37,19 +37,19 @@ public ReusableCollisionResults() { @Override @JmeThread - public void addCollision(@NotNull final CollisionResult result) { + public void addCollision(@NotNull CollisionResult result) { collisions.add(result); original.add(result); } @Override - public Iterator iterator() { + public @NotNull Iterator iterator() { return collisions.iterator(); } @Override @JmeThread - public CollisionResult getCollisionDirect(final int index) { + public CollisionResult getCollisionDirect(int index) { return original.get(index); } diff --git a/src/main/java/com/ss/editor/util/SimpleFileVisitor.java b/src/main/java/com/ss/editor/util/SimpleFileVisitor.java index b109c4d6..efaefd18 100644 --- a/src/main/java/com/ss/editor/util/SimpleFileVisitor.java +++ b/src/main/java/com/ss/editor/util/SimpleFileVisitor.java @@ -17,35 +17,32 @@ public interface SimpleFileVisitor extends FileVisitor { @Override - default FileVisitResult preVisitDirectory(@NotNull final Path dir, @NotNull final BasicFileAttributes attrs) + default FileVisitResult preVisitDirectory(@NotNull Path dir, @NotNull BasicFileAttributes attrs) throws IOException { return FileVisitResult.CONTINUE; } @Override - default FileVisitResult visitFile(@NotNull final Path file, @NotNull final BasicFileAttributes attrs) - throws IOException { + default FileVisitResult visitFile(@NotNull Path file, @NotNull BasicFileAttributes attrs) throws IOException { visit(file, attrs); return FileVisitResult.CONTINUE; } /** - * Visit. + * Visit the file. * - * @param file the file - * @param attrs the attrs + * @param file the file. + * @param attrs the attributes of the file. */ - void visit(@NotNull final Path file, @NotNull final BasicFileAttributes attrs); + void visit(@NotNull Path file, @NotNull BasicFileAttributes attrs); @Override - default FileVisitResult visitFileFailed(@NotNull final Path file, @Nullable final IOException exc) - throws IOException { + default FileVisitResult visitFileFailed(@NotNull Path file, @Nullable IOException exc) throws IOException { return FileVisitResult.CONTINUE; } @Override - default FileVisitResult postVisitDirectory(@NotNull final Path dir, @Nullable final IOException exc) - throws IOException { + default FileVisitResult postVisitDirectory(@NotNull Path dir, @Nullable IOException exc) throws IOException { return FileVisitResult.CONTINUE; } } diff --git a/src/main/java/com/ss/editor/util/SimpleFolderVisitor.java b/src/main/java/com/ss/editor/util/SimpleFolderVisitor.java index 68656e84..c55e8466 100644 --- a/src/main/java/com/ss/editor/util/SimpleFolderVisitor.java +++ b/src/main/java/com/ss/editor/util/SimpleFolderVisitor.java @@ -15,14 +15,15 @@ public interface SimpleFolderVisitor extends SimpleFileVisitor { @Override - default @NotNull FileVisitResult preVisitDirectory(@NotNull final Path dir, - @NotNull final BasicFileAttributes attrs) throws IOException { + default @NotNull FileVisitResult preVisitDirectory( + @NotNull Path dir, @NotNull BasicFileAttributes attrs + ) throws IOException { visit(dir, attrs); return FileVisitResult.CONTINUE; } @Override - default @NotNull FileVisitResult visitFile(@NotNull final Path file, @NotNull final BasicFileAttributes attrs) + default @NotNull FileVisitResult visitFile(@NotNull Path file, @NotNull BasicFileAttributes attrs) throws IOException { return FileVisitResult.CONTINUE; } diff --git a/src/main/java/com/ss/editor/util/TangentGenerator.java b/src/main/java/com/ss/editor/util/TangentGenerator.java index 77b941a4..5340bbd2 100644 --- a/src/main/java/com/ss/editor/util/TangentGenerator.java +++ b/src/main/java/com/ss/editor/util/TangentGenerator.java @@ -1,8 +1,7 @@ package com.ss.editor.util; -import com.jme3.scene.Mesh; import com.jme3.scene.Spatial; -import com.jme3.scene.VertexBuffer; +import com.jme3.scene.VertexBuffer.Type; import com.jme3.util.TangentBinormalGenerator; import com.jme3.util.mikktspace.MikktspaceTangentGenerator; import com.ss.rlib.common.logging.Logger; @@ -25,20 +24,20 @@ public class TangentGenerator { * @param spatial the spatial. * @param splitMirrored the split mirrored. */ - public static void useStandardGenerator(@NotNull final Spatial spatial, final boolean splitMirrored) { + public static void useStandardGenerator(@NotNull Spatial spatial, boolean splitMirrored) { try { NodeUtils.visitGeometry(spatial, geometry -> { - final Mesh mesh = geometry.getMesh(); - final VertexBuffer texCoord = mesh.getBuffer(VertexBuffer.Type.TexCoord); + var mesh = geometry.getMesh(); + var texCoord = mesh.getBuffer(Type.TexCoord); if (texCoord != null) { TangentBinormalGenerator.generate(geometry, splitMirrored); } }); - } catch (final Exception e) { + } catch (Exception e) { EditorUtil.handleException(LOGGER, null, e); } } @@ -48,20 +47,20 @@ public static void useStandardGenerator(@NotNull final Spatial spatial, final bo * * @param spatial the spatial. */ - public static void useMikktspaceGenerator(@NotNull final Spatial spatial) { + public static void useMikktspaceGenerator(@NotNull Spatial spatial) { try { NodeUtils.visitGeometry(spatial, geometry -> { - final Mesh mesh = geometry.getMesh(); - final VertexBuffer texCoord = mesh.getBuffer(VertexBuffer.Type.TexCoord); + var mesh = geometry.getMesh(); + var texCoord = mesh.getBuffer(Type.TexCoord); if (texCoord != null) { MikktspaceTangentGenerator.generate(geometry); } }); - } catch (final Exception e) { + } catch (Exception e) { EditorUtil.handleException(LOGGER, null, e); } } diff --git a/src/main/java/com/ss/editor/util/svg/SvgImageLoaderFactory.java b/src/main/java/com/ss/editor/util/svg/SvgImageLoaderFactory.java index d0026199..4d66215e 100644 --- a/src/main/java/com/ss/editor/util/svg/SvgImageLoaderFactory.java +++ b/src/main/java/com/ss/editor/util/svg/SvgImageLoaderFactory.java @@ -16,7 +16,6 @@ */ public class SvgImageLoaderFactory implements ImageLoaderFactory { - @NotNull private static final ImageLoaderFactory INSTANCE = new SvgImageLoaderFactory(); @FxThread @@ -37,7 +36,7 @@ public ImageFormatDescription getFormatDescription() { @Override @FxThread - public ImageLoader createImageLoader(@NotNull final InputStream input) throws IOException { + public ImageLoader createImageLoader(@NotNull InputStream input) throws IOException { return new SvgImageLoader(input); } }

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

6oi#TcDjL9qSe;SV^Kvw2D7E?fUmP^ACRJI}3 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 diff --git a/embedded-plugins/jmb-tree-generator/jmb-tree-generator-1.2.1.jar b/embedded-plugins/jmb-tree-generator/jmb-tree-generator-1.2.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..d125c6a499c96145985c05ae942514941f3e68ca GIT binary patch literal 85879 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 delta 7284 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 property = cast(description); + + var value = property.getValue(); + var propertyControl = new LayerModelPropertyControl>(value, + property.getName(), consumer); + + addControl(container, property, propertyControl); + break; + } } } } diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/EditableObjectPropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/EditableObjectPropertyBuilder.java index e93857a7..b2fe1993 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/EditableObjectPropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/EditableObjectPropertyBuilder.java @@ -1,17 +1,17 @@ package com.ss.editor.ui.control.property.builder.impl; import static com.ss.rlib.common.util.ObjectUtils.notNull; - import com.jme3.math.*; import com.jme3.texture.Texture2D; import com.ss.editor.annotation.FxThread; import com.ss.editor.extension.property.EditableProperty; import com.ss.editor.model.undo.editor.ChangeConsumer; +import com.ss.editor.model.undo.editor.ModelChangeConsumer; import com.ss.editor.ui.control.property.PropertyControl; import com.ss.editor.ui.control.property.impl.*; import com.ss.editor.util.EditorUtil; -import com.ss.rlib.fx.util.FXUtils; import com.ss.rlib.common.util.ClassUtils; +import com.ss.rlib.fx.util.FxUtils; import javafx.scene.layout.VBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -61,25 +61,25 @@ protected void buildFor( switch (type) { case BOOLEAN: { - final EditableProperty property = cast(description); - final Boolean currentValue = property.getValue(); + EditableProperty property = cast(description); + var currentValue = property.getValue(); - final BooleanPropertyControl> propertyControl = - new BooleanPropertyControl<>(currentValue, property.getName(), changeConsumer); + var propertyControl = new BooleanPropertyControl>(currentValue, + property.getName(), changeConsumer); addControl(container, property, propertyControl); break; } case FLOAT: { - final EditableProperty property = cast(description); - final Float currentValue = property.getValue(); + EditableProperty property = cast(description); + var currentValue = property.getValue(); - final FloatPropertyControl> propertyControl = - new FloatPropertyControl<>(currentValue, property.getName(), changeConsumer); + var propertyControl = new FloatPropertyControl>(currentValue, + property.getName(), changeConsumer); - final float scrollPower = propertyControl.getScrollPower(); - final float mod = property.getScrollPower(); + var scrollPower = propertyControl.getScrollPower(); + var mod = property.getScrollPower(); propertyControl.setScrollPower(scrollPower * mod); propertyControl.setMinMax(property.getMinValue(), property.getMaxValue()); @@ -89,8 +89,9 @@ protected void buildFor( } case COLOR: { - final EditableProperty property = cast(description); - final Object undefine = description.getValue(); + EditableProperty property = cast(description); + var undefine = description.getValue(); + final ColorRGBA color; // for some cases with materials @@ -101,63 +102,86 @@ protected void buildFor( color = (ColorRGBA) undefine; } - final ColorPropertyControl> propertyControl = - new ColorPropertyControl<>(color, property.getName(), changeConsumer); + var propertyControl = new ColorPropertyControl>(color, + property.getName(), changeConsumer); addControl(container, property, propertyControl); break; } case INTEGER: { - final EditableProperty property = cast(description); - final Integer currentValue = property.getValue(); + EditableProperty property = cast(description); + var currentValue = property.getValue(); - final IntegerPropertyControl> propertyControl = - new IntegerPropertyControl<>(currentValue, property.getName(), changeConsumer); + var propertyControl = new IntegerPropertyControl>(currentValue, + property.getName(), changeConsumer); addControl(container, property, propertyControl); break; } case STRING: { - final EditableProperty property = cast(description); - final String currentValue = property.getValue(); + EditableProperty property = cast(description); + var currentValue = property.getValue(); - final StringPropertyControl> propertyControl = - new StringPropertyControl<>(currentValue, property.getName(), changeConsumer); + var propertyControl = new StringPropertyControl>(currentValue, + property.getName(), changeConsumer); addControl(container, property, propertyControl); break; } case READ_ONLY_STRING: { - final EditableProperty property = cast(description); - final Object currentValue = property.getValue(); + EditableProperty property = cast(description); + var currentValue = property.getValue(); - final DefaultSinglePropertyControl, Object> propertyControl = - new DefaultSinglePropertyControl<>(currentValue, property.getName(), changeConsumer); + var propertyControl = new DefaultSinglePropertyControl, Object>( + currentValue, property.getName(), changeConsumer); addControl(container, property, propertyControl); break; } case VECTOR_2F: { - final EditableProperty property = cast(description); - final Vector2f currentValue = property.getValue(); + EditableProperty property = cast(description); + var currentValue = property.getValue(); + var propertyControl = new Vector2fPropertyControl>(currentValue, + property.getName(), changeConsumer); + + var scrollPower = propertyControl.getScrollPower(); + var mod = property.getScrollPower(); - final Vector2fPropertyControl> propertyControl = - new Vector2fPropertyControl<>(currentValue, property.getName(), changeConsumer); + propertyControl.setMinMax(property.getMinValue(), property.getMaxValue()); + propertyControl.setScrollPower(scrollPower * mod); + + addControl(container, property, propertyControl); + break; + } + case MIN_MAX_2F: { + + EditableProperty property = cast(description); + + var value = property.getValue(); + var propertyControl = new MinMaxPropertyControl>( + value, property.getName(), changeConsumer); + + + var scrollPower = propertyControl.getScrollPower(); + var mod = property.getScrollPower(); + + propertyControl.setMinMax(property.getMinValue(), property.getMaxValue()); + propertyControl.setScrollPower(scrollPower * mod); addControl(container, property, propertyControl); break; } case VECTOR_3F: { - final EditableProperty property = cast(description); - final Vector3f currentValue = property.getValue(); + EditableProperty property = cast(description); + var currentValue = property.getValue(); - final Vector3fPropertyControl> propertyControl = - new Vector3fPropertyControl<>(currentValue, property.getName(), changeConsumer); + var propertyControl = new Vector3fPropertyControl>(currentValue, + property.getName(), changeConsumer); addControl(container, property, propertyControl); break; @@ -175,23 +199,23 @@ protected void buildFor( } case ENUM: { - final EditableProperty, ?> property = cast(description); - final Enum value = notNull(property.getValue(), "Enum value can't be null."); - final Enum[] availableValues = EditorUtil.getAvailableValues(value); + EditableProperty, ?> property = cast(description); + var value = notNull(property.getValue(), "Enum value can't be null."); + var availableValues = EditorUtil.getAvailableValues(value); - final EnumPropertyControl, ?>, Enum> propertyControl = - new EnumPropertyControl<>(value, property.getName(), changeConsumer, availableValues); + var propertyControl = new EnumPropertyControl, ?>, Enum>(value, + property.getName(), changeConsumer, availableValues); addControl(container, property, propertyControl); break; } case TEXTURE_2D: { - final EditableProperty property = cast(description); - final Texture2D value = property.getValue(); + EditableProperty property = cast(description); + var value = property.getValue(); - final Texture2dPropertyControl> propertyControl = - new Texture2dPropertyControl<>(value, property.getName(), changeConsumer); + var propertyControl = new Texture2dPropertyControl>(value, + property.getName(), changeConsumer); addControl(container, property, propertyControl); break; @@ -226,7 +250,7 @@ protected void addControl( propertyControl.setEditObject(property); propertyControl.setDisable(property.isReadOnly()); - FXUtils.addToPane(propertyControl, container); + FxUtils.addChild(container, propertyControl); } /** diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/ParticleEmitterPropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/ParticleEmitterPropertyBuilder.java index 5f627295..aac50438 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/ParticleEmitterPropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/ParticleEmitterPropertyBuilder.java @@ -1,75 +1,61 @@ package com.ss.editor.ui.control.property.builder.impl; +import static com.ss.editor.extension.property.EditablePropertyType.*; +import static com.ss.rlib.common.util.ObjectUtils.ifNull; +import static com.ss.rlib.common.util.ObjectUtils.notNull; import com.jme3.effect.ParticleEmitter; -import com.jme3.effect.ParticleMesh; -import com.jme3.math.ColorRGBA; import com.jme3.math.Vector2f; import com.jme3.math.Vector3f; import com.ss.editor.Messages; import com.ss.editor.annotation.FromAnyThread; -import com.ss.editor.annotation.FxThread; +import com.ss.editor.extension.property.*; import com.ss.editor.model.undo.editor.ModelChangeConsumer; -import com.ss.editor.ui.control.property.impl.particle.ParticleEmitterImagesModelPropertyControl; import com.ss.editor.ui.control.property.builder.PropertyBuilder; -import com.ss.editor.ui.control.property.impl.*; -import com.ss.rlib.fx.util.FXUtils; -import javafx.scene.layout.VBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.function.BiConsumer; -import java.util.function.Function; +import java.util.ArrayList; +import java.util.List; /** * The implementation of the {@link PropertyBuilder} to build property controls for {@link ParticleEmitter} objects. * * @author JavaSaBr */ -public class ParticleEmitterPropertyBuilder extends AbstractPropertyBuilder { +public class ParticleEmitterPropertyBuilder extends EditableModelObjectPropertyBuilder { - @NotNull - private static final ParticleMesh.Type[] MESH_TYPES = ParticleMesh.Type.values(); + @FunctionalInterface + private interface ChangeHandler extends Setter { - @NotNull - private static final BiConsumer APPLY_SIZE_HANDLER = (emitter, result) -> { - emitter.setStartSize(result.getX()); - emitter.setEndSize(result.getY()); - emitter.killAllParticles(); - }; - - @NotNull - private static final BiConsumer APPLY_LIFE_HANDLER = (emitter, result) -> { - emitter.setLowLife(result.getX()); - emitter.setHighLife(result.getY()); - emitter.killAllParticles(); - }; - - @NotNull - private static final BiConsumer APPLY_IMAGES_HANDLER = (emitter, result) -> { - emitter.setImagesX((int) result.getX()); - emitter.setImagesY((int) result.getY()); - emitter.killAllParticles(); - }; - - @NotNull - private static final Function SYNC_SIZE_HANDLER = emitter -> - new Vector2f(emitter.getStartSize(), emitter.getEndSize()); + @Override + default void set(@NotNull ParticleEmitter emitter, @Nullable T value) { + setImpl(emitter, notNull(value)); + emitter.killAllParticles(); + } - @NotNull - private static final Function SYNC_LIFE_HANDLER = emitter -> - new Vector2f(emitter.getLowLife(), emitter.getHighLife()); + void setImpl(@NotNull ParticleEmitter emitter, @NotNull T value); + } - @NotNull - private static final Function SYNC_IMAGES_HANDLER = emitter -> - new Vector2f(emitter.getImagesX(), emitter.getImagesY()); + private static final Getter SIZE_GETTER = + emitter -> new Vector2f(emitter.getStartSize(), emitter.getEndSize()); + private static final Getter LIFE_GETTER = + emitter -> new Vector2f(emitter.getLowLife(), emitter.getHighLife()); + private static final Getter SPRITES_GETTER = + emitter -> new Vector2f(emitter.getImagesX(), emitter.getImagesY()); - @NotNull - private static final Function SYNC_FACE_NORMAL_HANDLER = emitter -> { - final Vector3f faceNormal = emitter.getFaceNormal(); - return faceNormal == null ? new Vector3f() : faceNormal; + private static final ChangeHandler SIZE_SETTER = (emitter, size) -> { + emitter.setStartSize(size.getX()); + emitter.setEndSize(size.getY()); + }; + private static final ChangeHandler LIFE_SETTER = (emitter, size) -> { + emitter.setLowLife(size.getX()); + emitter.setHighLife(size.getY()); + }; + private static final ChangeHandler SPRITES_SETTER = (emitter, size) -> { + emitter.setImagesX((int) size.getX()); + emitter.setImagesY((int) size.getY()); }; - @NotNull private static final PropertyBuilder INSTANCE = new ParticleEmitterPropertyBuilder(); @FromAnyThread @@ -82,155 +68,57 @@ private ParticleEmitterPropertyBuilder() { } @Override - @FxThread - protected void buildForImpl(@NotNull final Object object, @Nullable final Object parent, - @NotNull final VBox container, @NotNull final ModelChangeConsumer changeConsumer) { + protected @Nullable List> getProperties(@NotNull Object object) { if (!(object instanceof ParticleEmitter)) { - return; + return null; } - buildFor(container, changeConsumer, (ParticleEmitter) object); - buildSplitLine(container); + var emitter = (ParticleEmitter) object; + + var result = new ArrayList>(); + result.add(new SimpleProperty<>(BOOLEAN, Messages.MODEL_PROPERTY_IS_ENABLED, emitter, + ParticleEmitter::isEnabled, ParticleEmitter::setEnabled)); + result.add(new SimpleProperty<>(BOOLEAN, Messages.MODEL_PROPERTY_IS_FACING_VELOCITY, emitter, + ParticleEmitter::isFacingVelocity, ParticleEmitter::setFacingVelocity)); + result.add(new SimpleProperty<>(BOOLEAN, Messages.MODEL_PROPERTY_IS_IN_WORLD_SPACE, emitter, + ParticleEmitter::isInWorldSpace, ParticleEmitter::setInWorldSpace)); + result.add(new SimpleProperty<>(BOOLEAN, Messages.MODEL_PROPERTY_IS_RANDOM_ANGLE, emitter, + ParticleEmitter::isRandomAngle, ParticleEmitter::setRandomAngle)); + result.add(new SimpleProperty<>(BOOLEAN, Messages.MODEL_PROPERTY_IS_SELECT_RANDOM_IMAGE, emitter, + ParticleEmitter::isSelectRandomImage, ParticleEmitter::setSelectRandomImage)); + + result.add(new SimpleProperty<>(INTEGER, Messages.MODEL_PROPERTY_MAX_PARTICLES, 1F, 0, Integer.MAX_VALUE, emitter, + ParticleEmitter::getMaxNumParticles, ParticleEmitter::setNumParticles)); + result.add(new SimpleProperty<>(FLOAT, Messages.MODEL_PROPERTY_ROTATE_SPEED, emitter, + ParticleEmitter::getRotateSpeed, ParticleEmitter::setRotateSpeed)); + result.add(new SimpleProperty<>(ENUM, Messages.MODEL_PROPERTY_MESH_TYPE, emitter, + ParticleEmitter::getMeshType, ParticleEmitter::setMeshType)); + + result.add(new SimpleProperty<>(COLOR, Messages.MODEL_PROPERTY_START_COLOR, emitter, + ParticleEmitter::getStartColor, ParticleEmitter::setStartColor)); + result.add(new SimpleProperty<>(COLOR, Messages.MODEL_PROPERTY_END_COLOR, emitter, + ParticleEmitter::getEndColor, ParticleEmitter::setEndColor)); + + result.add(new SimpleProperty<>(VECTOR_2F, Messages.MODEL_PROPERTY_SIZE, 1F, 0F, 100F, emitter, + SIZE_GETTER, SIZE_SETTER)); + result.add(new SimpleProperty<>(MIN_MAX_2F, Messages.MODEL_PROPERTY_LIFE, 1F, 0F, 100F, emitter, + LIFE_GETTER, LIFE_SETTER)); + result.add(new SimpleProperty<>(VECTOR_2F, Messages.MODEL_PROPERTY_SPRITE_COUNT, 1F, 1, 100F, emitter, + SPRITES_GETTER, SPRITES_SETTER)); + + result.add(new SimpleProperty<>(VECTOR_3F, Messages.MODEL_PROPERTY_GRAVITY, emitter, + ParticleEmitter::getGravity, ParticleEmitter::setGravity)); + result.add(new SimpleProperty<>(VECTOR_3F, Messages.MODEL_PROPERTY_FACE_NORMAL, emitter, + em -> ifNull(em.getFaceNormal(), Vector3f::new), ParticleEmitter::setFaceNormal)); + + result.add(SeparatorProperty.getInstance()); + + return result; } - @FxThread - private void buildFor(@NotNull final VBox container, @NotNull final ModelChangeConsumer changeConsumer, - @NotNull final ParticleEmitter emitter) { - - final boolean facingVelocity = emitter.isFacingVelocity(); - final boolean enabled = emitter.isEnabled(); - final boolean inWorldSpace = emitter.isInWorldSpace(); - final boolean randomAngle = emitter.isRandomAngle(); - final boolean selectRandomImage = emitter.isSelectRandomImage(); - - final float startSize = emitter.getStartSize(); - final float endSize = emitter.getEndSize(); - - final float lowLife = emitter.getLowLife(); - final float highLife = emitter.getHighLife(); - - final int imagesX = emitter.getImagesX(); - final int imagesY = emitter.getImagesY(); - - final int maxNumParticles = emitter.getMaxNumParticles(); - final float rotateSpeed = emitter.getRotateSpeed(); - - final ColorRGBA startColor = emitter.getStartColor(); - final ColorRGBA endColor = emitter.getEndColor(); - - final ParticleMesh.Type meshType = emitter.getMeshType(); - - final Vector3f gravity = emitter.getGravity(); - final Vector3f faceNormal = emitter.getFaceNormal() == null? new Vector3f() : emitter.getFaceNormal(); - - final BooleanPropertyControl enabledControl = - new BooleanPropertyControl<>(enabled, Messages.MODEL_PROPERTY_IS_ENABLED, changeConsumer); - enabledControl.setApplyHandler(ParticleEmitter::setEnabled); - enabledControl.setSyncHandler(ParticleEmitter::isEnabled); - enabledControl.setEditObject(emitter); - - final BooleanPropertyControl facingVelocityControl = - new BooleanPropertyControl<>(facingVelocity, Messages.MODEL_PROPERTY_IS_FACING_VELOCITY, changeConsumer); - facingVelocityControl.setApplyHandler(ParticleEmitter::setFacingVelocity); - facingVelocityControl.setSyncHandler(ParticleEmitter::isFacingVelocity); - facingVelocityControl.setEditObject(emitter); - - final BooleanPropertyControl inWorldSpaceControl = - new BooleanPropertyControl<>(inWorldSpace, Messages.MODEL_PROPERTY_IS_IN_WORLD_SPACE, changeConsumer); - inWorldSpaceControl.setApplyHandler(ParticleEmitter::setInWorldSpace); - inWorldSpaceControl.setSyncHandler(ParticleEmitter::isInWorldSpace); - inWorldSpaceControl.setEditObject(emitter); - - final BooleanPropertyControl randomAngleControl = - new BooleanPropertyControl<>(randomAngle, Messages.MODEL_PROPERTY_IS_RANDOM_ANGLE, changeConsumer); - randomAngleControl.setApplyHandler(ParticleEmitter::setRandomAngle); - randomAngleControl.setSyncHandler(ParticleEmitter::isRandomAngle); - randomAngleControl.setEditObject(emitter); - - final BooleanPropertyControl selectRandomImageControl = - new BooleanPropertyControl<>(selectRandomImage, Messages.MODEL_PROPERTY_IS_SELECT_RANDOM_IMAGE, changeConsumer); - selectRandomImageControl.setApplyHandler(ParticleEmitter::setSelectRandomImage); - selectRandomImageControl.setSyncHandler(ParticleEmitter::isSelectRandomImage); - selectRandomImageControl.setEditObject(emitter); - - final IntegerPropertyControl maxNumParticlesControl = - new IntegerPropertyControl<>(maxNumParticles, Messages.MODEL_PROPERTY_MAX_PARTICLES, changeConsumer); - maxNumParticlesControl.setApplyHandler(ParticleEmitter::setNumParticles); - maxNumParticlesControl.setSyncHandler(ParticleEmitter::getMaxNumParticles); - maxNumParticlesControl.setEditObject(emitter); - - final FloatPropertyControl rotateSpeedControl = - new FloatPropertyControl<>(rotateSpeed, Messages.MODEL_PROPERTY_ROTATE_SPEED, changeConsumer); - rotateSpeedControl.setApplyHandler(ParticleEmitter::setRotateSpeed); - rotateSpeedControl.setSyncHandler(ParticleEmitter::getRotateSpeed); - rotateSpeedControl.setEditObject(emitter); - - final EnumPropertyControl meshTypeControl = - new EnumPropertyControl<>(meshType, Messages.MODEL_PROPERTY_MESH_TYPE, changeConsumer, MESH_TYPES); - meshTypeControl.setApplyHandler(ParticleEmitter::setMeshType); - meshTypeControl.setSyncHandler(ParticleEmitter::getMeshType); - meshTypeControl.setEditObject(emitter); - - final ColorPropertyControl startColorControl = - new ColorPropertyControl<>(startColor, Messages.MODEL_PROPERTY_START_COLOR, changeConsumer); - startColorControl.setApplyHandler(ParticleEmitter::setStartColor); - startColorControl.setSyncHandler(ParticleEmitter::getStartColor); - startColorControl.setEditObject(emitter); - - final ColorPropertyControl endColorControl = - new ColorPropertyControl<>(endColor, Messages.MODEL_PROPERTY_END_COLOR, changeConsumer); - endColorControl.setApplyHandler(ParticleEmitter::setEndColor); - endColorControl.setSyncHandler(ParticleEmitter::getEndColor); - endColorControl.setEditObject(emitter); - - final MinMaxPropertyControl sizeControl = - new MinMaxPropertyControl<>(new Vector2f(startSize, endSize), Messages.MODEL_PROPERTY_SIZE, changeConsumer); - sizeControl.setApplyHandler(APPLY_SIZE_HANDLER); - sizeControl.setSyncHandler(SYNC_SIZE_HANDLER); - sizeControl.setEditObject(emitter); - - final MinMaxPropertyControl lifeControl = - new MinMaxPropertyControl<>(new Vector2f(lowLife, highLife), Messages.MODEL_PROPERTY_LIFE, changeConsumer); - lifeControl.setApplyHandler(APPLY_LIFE_HANDLER); - lifeControl.setSyncHandler(SYNC_LIFE_HANDLER); - lifeControl.setEditObject(emitter); - - final ParticleEmitterImagesModelPropertyControl imagesControl = - new ParticleEmitterImagesModelPropertyControl(new Vector2f(imagesX, imagesY), Messages.MODEL_PROPERTY_SPRITE_COUNT, changeConsumer); - imagesControl.setApplyHandler(APPLY_IMAGES_HANDLER); - imagesControl.setSyncHandler(SYNC_IMAGES_HANDLER); - imagesControl.setEditObject(emitter); - - final Vector3fPropertyControl gravityControl = - new Vector3fPropertyControl<>(gravity, Messages.MODEL_PROPERTY_GRAVITY, changeConsumer); - gravityControl.setApplyHandler(ParticleEmitter::setGravity); - gravityControl.setSyncHandler(ParticleEmitter::getGravity); - gravityControl.setEditObject(emitter); - - final Vector3fPropertyControl faceNormalControl = - new Vector3fPropertyControl<>(faceNormal, Messages.MODEL_PROPERTY_FACE_NORMAL, changeConsumer); - faceNormalControl.setApplyHandler(ParticleEmitter::setFaceNormal); - faceNormalControl.setSyncHandler(SYNC_FACE_NORMAL_HANDLER); - faceNormalControl.setEditObject(emitter); - - FXUtils.addToPane(enabledControl, container); - FXUtils.addToPane(facingVelocityControl, container); - FXUtils.addToPane(inWorldSpaceControl, container); - FXUtils.addToPane(randomAngleControl, container); - FXUtils.addToPane(selectRandomImageControl, container); - FXUtils.addToPane(maxNumParticlesControl, container); - FXUtils.addToPane(rotateSpeedControl, container); - FXUtils.addToPane(meshTypeControl, container); - FXUtils.addToPane(startColorControl, container); - FXUtils.addToPane(endColorControl, container); - FXUtils.addToPane(sizeControl, container); - FXUtils.addToPane(lifeControl, container); - FXUtils.addToPane(imagesControl, container); - - buildSplitLine(container); - - FXUtils.addToPane(gravityControl, container); - FXUtils.addToPane(faceNormalControl, container); + @Override + public int getPriority() { + return SpatialPropertyBuilder.PRIORITY + 1; } } diff --git a/src/main/java/com/ss/editor/ui/control/property/builder/impl/SpatialPropertyBuilder.java b/src/main/java/com/ss/editor/ui/control/property/builder/impl/SpatialPropertyBuilder.java index a62f2020..d34547ea 100644 --- a/src/main/java/com/ss/editor/ui/control/property/builder/impl/SpatialPropertyBuilder.java +++ b/src/main/java/com/ss/editor/ui/control/property/builder/impl/SpatialPropertyBuilder.java @@ -2,38 +2,26 @@ import static com.ss.editor.extension.property.EditablePropertyType.*; import static com.ss.editor.part3d.editor.impl.scene.AbstractSceneEditor3DPart.KEY_LOADED_MODEL; - -import com.jme3.bullet.objects.VehicleWheel; +import static com.ss.rlib.common.util.ObjectUtils.ifNull; import com.jme3.math.ColorRGBA; import com.jme3.math.Vector2f; import com.jme3.math.Vector3f; -import com.jme3.renderer.queue.RenderQueue.Bucket; -import com.jme3.renderer.queue.RenderQueue.ShadowMode; import com.jme3.scene.Spatial; -import com.jme3.scene.Spatial.CullHint; import com.ss.editor.Messages; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; -import com.ss.editor.extension.property.EditableProperty; -import com.ss.editor.extension.property.EditablePropertyType; -import com.ss.editor.extension.property.SeparatorProperty; -import com.ss.editor.extension.property.SimpleProperty; +import com.ss.editor.extension.property.*; import com.ss.editor.extension.scene.SceneLayer; import com.ss.editor.extension.scene.SceneNode; import com.ss.editor.model.undo.editor.ModelChangeConsumer; -import com.ss.editor.model.undo.editor.SceneChangeConsumer; import com.ss.editor.ui.control.property.builder.PropertyBuilder; -import com.ss.editor.ui.control.property.impl.*; -import com.ss.rlib.fx.util.FXUtils; import com.ss.rlib.common.util.array.Array; import com.ss.rlib.common.util.array.ArrayFactory; -import javafx.scene.layout.VBox; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; -import java.util.Objects; /** * The implementation of the {@link PropertyBuilder} to build property controls for {@link Spatial} objects. @@ -44,9 +32,14 @@ public class SpatialPropertyBuilder extends EditableModelObjectPropertyBuilder { public static final int PRIORITY = 1; - @NotNull private static final PropertyBuilder INSTANCE = new SpatialPropertyBuilder(); + private static final Getter LAYER_GETTER = + spatial -> ifNull(SceneLayer.getLayer(spatial), SceneLayer.NO_LAYER); + + private static final Setter LAYER_SETTER = + (spatial, layer) -> SceneLayer.setLayer(layer, spatial); + @FromAnyThread public static @NotNull PropertyBuilder getInstance() { return INSTANCE; @@ -63,7 +56,7 @@ private SpatialPropertyBuilder() { @NotNull ModelChangeConsumer changeConsumer ) { - if(!(object instanceof Spatial)) { + if (!(object instanceof Spatial)) { return null; } @@ -76,6 +69,7 @@ private SpatialPropertyBuilder() { Spatial::getShadowMode, Spatial::setShadowMode)); properties.add(new SimpleProperty<>(ENUM, Messages.MODEL_PROPERTY_QUEUE_BUCKET, spatial, Spatial::getLocalQueueBucket, Spatial::setQueueBucket)); + properties.add(new SimpleProperty<>(SCENE_LAYER, Messages.MODEL_PROPERTY_LAYER, spatial, LAYER_GETTER, LAYER_SETTER)); if (canEditTransformation(spatial)) { @@ -144,33 +138,6 @@ private SpatialPropertyBuilder() { return EditablePropertyType.READ_ONLY_STRING; } - @Override - @FxThread - protected void buildForImpl( - @NotNull Object object, - @Nullable Object parent, - @NotNull VBox container, - @NotNull ModelChangeConsumer changeConsumer - ) { - super.buildForImpl(object, parent, container, changeConsumer); - - if (!(object instanceof Spatial)) { - return; - } - - var spatial = (Spatial) object; - - if (changeConsumer instanceof SceneChangeConsumer) { - - // TODO add an editable property type - var layer = SceneLayer.getLayer(spatial); - var propertyControl = new LayerModelPropertyControl(layer, (SceneChangeConsumer) changeConsumer); - propertyControl.setEditObject(spatial); - - FXUtils.addToPane(propertyControl, container); - } - } - @FxThread private boolean isNeedSkip(@NotNull String key) { return SceneLayer.KEY.equals(key) || KEY_LOADED_MODEL.equals(key); diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/LayerModelPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/LayerModelPropertyControl.java index e389e754..a3068981 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/LayerModelPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/LayerModelPropertyControl.java @@ -2,17 +2,13 @@ import static com.ss.rlib.common.util.ObjectUtils.ifNull; import static com.ss.rlib.common.util.ObjectUtils.notNull; -import com.jme3.scene.Spatial; import com.ss.editor.Messages; import com.ss.editor.annotation.FromAnyThread; import com.ss.editor.annotation.FxThread; -import com.ss.editor.annotation.JmeThread; import com.ss.editor.extension.scene.SceneLayer; -import com.ss.editor.model.undo.editor.ChangeConsumer; import com.ss.editor.model.undo.editor.ModelChangeConsumer; import com.ss.editor.model.undo.editor.SceneChangeConsumer; import com.ss.editor.ui.control.property.PropertyControl; -import com.ss.editor.ui.control.property.operation.PropertyOperation; import com.ss.editor.ui.css.CssClasses; import com.ss.rlib.fx.util.FxControlUtils; import com.ss.rlib.fx.util.FxUtils; @@ -25,9 +21,10 @@ /** * The implementation of the {@link PropertyControl} to edit layers. * + * @param the type of an editing object. * @author JavaSaBr */ -public class LayerModelPropertyControl extends PropertyControl { +public class LayerModelPropertyControl extends PropertyControl { @NotNull private class LayerCell extends ListCell { @@ -51,33 +48,12 @@ protected void updateItem(@Nullable SceneLayer layer, boolean empty) { @Nullable private ComboBox layerComboBox; - public LayerModelPropertyControl(@Nullable SceneLayer layer, @NotNull SceneChangeConsumer changeConsumer) { - super(ifNull(layer, SceneLayer.NO_LAYER), Messages.MODEL_PROPERTY_LAYER, changeConsumer); - setApplyHandler(this::setLayer); - setSyncHandler(this::getLayer); - } - - @Override - @FromAnyThread - public @NotNull ChangeHandler newChangeHandler() { - return (changeConsumer, object, propName, newValue, oldValue, handler) -> { - - var operation = new PropertyOperation( - object, SceneLayer.KEY, newValue, oldValue); - operation.setApplyHandler(handler); - - changeConsumer.execute(operation); - }; - } - - @JmeThread - private void setLayer(@NotNull Spatial spatial, @NotNull SceneLayer newLayer) { - SceneLayer.setLayer(newLayer, spatial); - } - - @JmeThread - private SceneLayer getLayer(@NotNull Spatial spatial) { - return ifNull(SceneLayer.getLayer(spatial), SceneLayer.NO_LAYER); + public LayerModelPropertyControl( + @Nullable SceneLayer layer, + @NotNull String propertyName, + @NotNull SceneChangeConsumer changeConsumer + ) { + super(ifNull(layer, SceneLayer.NO_LAYER), propertyName, changeConsumer); } @Override diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/MinMaxPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/MinMaxPropertyControl.java index 8c6d0588..187cad10 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/MinMaxPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/MinMaxPropertyControl.java @@ -3,7 +3,6 @@ import static java.lang.Math.max; import static java.lang.Math.min; import com.jme3.math.Vector2f; -import com.jme3.scene.Spatial; import com.ss.editor.annotation.FxThread; import com.ss.editor.model.undo.editor.ChangeConsumer; import org.jetbrains.annotations.NotNull; @@ -16,7 +15,7 @@ * @param the type of an editing object. * @author JavaSaBr */ -public class MinMaxPropertyControl extends Vector2fPropertyControl { +public class MinMaxPropertyControl extends Vector2fPropertyControl { public MinMaxPropertyControl( @Nullable Vector2f propertyValue, diff --git a/src/main/java/com/ss/editor/ui/control/property/impl/Vector2fPropertyControl.java b/src/main/java/com/ss/editor/ui/control/property/impl/Vector2fPropertyControl.java index a6dd396d..656c6152 100644 --- a/src/main/java/com/ss/editor/ui/control/property/impl/Vector2fPropertyControl.java +++ b/src/main/java/com/ss/editor/ui/control/property/impl/Vector2fPropertyControl.java @@ -62,6 +62,39 @@ public void changeControlWidthPercent(double controlWidthPercent) { widthProperty().multiply(controlWidthPercent)); } + /** + * Set value limits for this field. + * + * @param min the min value. + * @param max the max value. + */ + @FxThread + public void setMinMax(float min, float max) { + getXField().setMinMax(min, max); + getYField().setMinMax(min, max); + } + + /** + * Sets the scroll power. + * + * @param scrollPower the scroll power. + */ + @FxThread + public void setScrollPower(float scrollPower) { + getXField().setScrollPower(scrollPower); + getYField().setScrollPower(scrollPower); + } + + /** + * Get the scroll power. + * + * @return the scroll power. + */ + @FxThread + public float getScrollPower() { + return getXField().getScrollPower(); + } + @Override @FxThread protected void createComponents(@NotNull HBox container) { From bef3a72c05ba02a085bd44d9427423b17a22a928 Mon Sep 17 00:00:00 2001 From: JavaSaBr Date: Tue, 8 May 2018 21:01:34 +0300 Subject: [PATCH 35/49] refactoring, updated plugins. --- build.gradle | 2 +- ....1.0.jar => jmb-tonegod-emitter-1.1.1.jar} | Bin 140147 -> 140083 bytes .../{emitter-3.0.0.jar => emitter-3.0.1.jar} | Bin 157909 -> 161823 bytes .../com/ss/editor/DevelopPluginStarter.java | 5 +- .../java/com/ss/editor/JfxApplication.java | 12 +- .../java/com/ss/editor/JmeApplication.java | 4 +- .../com/ss/editor/config/EditorConfig.java | 119 ++++--- .../editor/manager/JmeFilePreviewManager.java | 153 ++++----- .../ui/{FXConstants.java => FxConstants.java} | 2 +- .../ui/component/asset/tree/ResourceTree.java | 22 +- .../asset/tree/ResourceTreeCell.java | 6 +- .../editor/area/EditorAreaComponent.java | 305 ++++++++---------- .../editor/impl/model/ModelFileEditor.java | 16 +- .../impl/scene/AbstractSceneFileEditor.java | 6 +- .../painting/PaintingComponentContainer.java | 6 +- .../virtual/tree/VirtualResourceTree.java | 4 +- .../control/app/state/list/AppStateList.java | 4 +- .../ui/control/filter/list/FilterList.java | 4 +- .../ui/control/property/PropertyControl.java | 12 +- .../ui/control/property/PropertyEditor.java | 15 +- .../builder/impl/AbstractPropertyBuilder.java | 2 +- .../ss/editor/ui/control/tree/NodeTree.java | 18 +- .../java/com/ss/editor/ui/css/CssClasses.java | 9 +- .../com/ss/editor/ui/dialog/EditorDialog.java | 109 +++---- .../ss/editor/ui/dialog/SettingsDialog.java | 134 ++++---- .../geometry/lod/GenerateLodLevelsDialog.java | 6 +- .../ui/dialog/plugin/PluginsDialog.java | 4 +- .../com/ss/editor/ui/scene/EditorFxScene.java | 43 +-- .../java/com/ss/editor/ui/util/UiUtils.java | 4 + src/main/resources/ui/css/custom_classes.css | 56 ++-- 30 files changed, 495 insertions(+), 587 deletions(-) rename embedded-plugins/jmb-tonegod-emitter/{jmb-tonegod-emitter-1.1.0.jar => jmb-tonegod-emitter-1.1.1.jar} (88%) rename embedded-plugins/jmb-tonegod-emitter/libs/{emitter-3.0.0.jar => emitter-3.0.1.jar} (59%) rename src/main/java/com/ss/editor/ui/{FXConstants.java => FxConstants.java} (88%) diff --git a/build.gradle b/build.gradle index cc45256b..31a4ffdc 100644 --- a/build.gradle +++ b/build.gradle @@ -130,7 +130,7 @@ dependencies { compile 'org.controlsfx:controlsfx:9.0.0' compile 'com.spaceshift:rlib.fx:5.0.0' compile 'com.spaceshift:rlib.common:7.0.0' - compile ('com.jme3x:jme-jfx:2.0.0') { + compile ('com.jme3:jfx:2.0.0') { exclude group: 'org.jmonkeyengine' } diff --git a/embedded-plugins/jmb-tonegod-emitter/jmb-tonegod-emitter-1.1.0.jar b/embedded-plugins/jmb-tonegod-emitter/jmb-tonegod-emitter-1.1.1.jar similarity index 88% rename from embedded-plugins/jmb-tonegod-emitter/jmb-tonegod-emitter-1.1.0.jar rename to embedded-plugins/jmb-tonegod-emitter/jmb-tonegod-emitter-1.1.1.jar index 00f4690fc9340679b2ba1cbe2acf988941134e0f..a5c569daedc4b394e604ab0cb7063e41fee57667 100644 GIT binary patch delta 6134 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 JtO3U@{s$3}nv?(l delta 6209 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