LICENSE
This commit is contained in:
11
.idea/codeStyleSettings.xml
generated
Normal file
11
.idea/codeStyleSettings.xml
generated
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectCodeStyleSettingsManager">
|
||||
<option name="PER_PROJECT_SETTINGS">
|
||||
<value>
|
||||
<option name="LINE_SEPARATOR" value=" " />
|
||||
</value>
|
||||
</option>
|
||||
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
|
||||
</component>
|
||||
</project>
|
||||
17
.idea/compiler.xml
generated
Normal file
17
.idea/compiler.xml
generated
Normal file
@@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="CompilerConfiguration">
|
||||
<bytecodeTargetLevel>
|
||||
<module name="HMCL_main" target="1.8" />
|
||||
<module name="hmcl_main" target="1.8" />
|
||||
<module name="hmcl_test" target="1.8" />
|
||||
<module name="HMCL_test" target="1.8" />
|
||||
<module name="HMCLCore_main" target="1.8" />
|
||||
<module name="HMCLCore_test" target="1.8" />
|
||||
<module name="HMCLKotlin_main" target="1.8" />
|
||||
<module name="HMCLKotlin_test" target="1.8" />
|
||||
<module name="tornadofx_main" target="1.8" />
|
||||
<module name="tornadofx_test" target="1.8" />
|
||||
</bytecodeTargetLevel>
|
||||
</component>
|
||||
</project>
|
||||
17
.idea/fileTemplates/JavaFXApplication.java
generated
Normal file
17
.idea/fileTemplates/JavaFXApplication.java
generated
Normal file
@@ -0,0 +1,17 @@
|
||||
#parse("HMCL.java")
|
||||
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "") package ${PACKAGE_NAME};#end
|
||||
|
||||
import javafx.application.Application;
|
||||
import javafx.stage.Stage;
|
||||
|
||||
public class ${NAME} extends Application {
|
||||
|
||||
public static void main(String[] args) {
|
||||
launch(args);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void start(Stage primaryStage) {
|
||||
|
||||
}
|
||||
}
|
||||
12
.idea/fileTemplates/Singleton.java
generated
Normal file
12
.idea/fileTemplates/Singleton.java
generated
Normal file
@@ -0,0 +1,12 @@
|
||||
#parse("HMCL.java")
|
||||
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
|
||||
public class ${NAME}{
|
||||
private static ${NAME} ourInstance = new ${NAME}();
|
||||
|
||||
public static ${NAME} getInstance() {
|
||||
return ourInstance;
|
||||
}
|
||||
|
||||
private ${NAME}() {
|
||||
}
|
||||
}
|
||||
18
.idea/fileTemplates/includes/HMCL.java
generated
Normal file
18
.idea/fileTemplates/includes/HMCL.java
generated
Normal file
@@ -0,0 +1,18 @@
|
||||
/*
|
||||
* Hello Minecraft! Launcher.
|
||||
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
*/
|
||||
|
||||
4
.idea/fileTemplates/internal/AnnotationType.java
generated
Normal file
4
.idea/fileTemplates/internal/AnnotationType.java
generated
Normal file
@@ -0,0 +1,4 @@
|
||||
#parse("HMCL.java")
|
||||
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
|
||||
public @interface ${NAME} {
|
||||
}
|
||||
4
.idea/fileTemplates/internal/Class.java
generated
Normal file
4
.idea/fileTemplates/internal/Class.java
generated
Normal file
@@ -0,0 +1,4 @@
|
||||
#parse("HMCL.java")
|
||||
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
|
||||
public class ${NAME} {
|
||||
}
|
||||
4
.idea/fileTemplates/internal/Enum.java
generated
Normal file
4
.idea/fileTemplates/internal/Enum.java
generated
Normal file
@@ -0,0 +1,4 @@
|
||||
#parse("HMCL.java")
|
||||
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
|
||||
public enum ${NAME} {
|
||||
}
|
||||
4
.idea/fileTemplates/internal/Interface.java
generated
Normal file
4
.idea/fileTemplates/internal/Interface.java
generated
Normal file
@@ -0,0 +1,4 @@
|
||||
#parse("HMCL.java")
|
||||
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
|
||||
public interface ${NAME} {
|
||||
}
|
||||
5
.idea/fileTemplates/internal/Kotlin Class.kt
generated
Normal file
5
.idea/fileTemplates/internal/Kotlin Class.kt
generated
Normal file
@@ -0,0 +1,5 @@
|
||||
#parse("HMCL.java")
|
||||
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME}
|
||||
#end
|
||||
class ${NAME} {
|
||||
}
|
||||
5
.idea/fileTemplates/internal/Kotlin Enum.kt
generated
Normal file
5
.idea/fileTemplates/internal/Kotlin Enum.kt
generated
Normal file
@@ -0,0 +1,5 @@
|
||||
#parse("HMCL.java")
|
||||
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME}
|
||||
#end
|
||||
enum class ${NAME} {
|
||||
}
|
||||
3
.idea/fileTemplates/internal/Kotlin File.kt
generated
Normal file
3
.idea/fileTemplates/internal/Kotlin File.kt
generated
Normal file
@@ -0,0 +1,3 @@
|
||||
#parse("HMCL.java")
|
||||
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME}
|
||||
#end
|
||||
5
.idea/fileTemplates/internal/Kotlin Interface.kt
generated
Normal file
5
.idea/fileTemplates/internal/Kotlin Interface.kt
generated
Normal file
@@ -0,0 +1,5 @@
|
||||
#parse("HMCL.java")
|
||||
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME}
|
||||
#end
|
||||
interface ${NAME} {
|
||||
}
|
||||
53
.idea/gradle.xml
generated
Normal file
53
.idea/gradle.xml
generated
Normal file
@@ -0,0 +1,53 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="GradleSettings">
|
||||
<option name="linkedExternalProjectsSettings">
|
||||
<GradleProjectSettings>
|
||||
<option name="distributionType" value="DEFAULT_WRAPPED" />
|
||||
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||
<option name="gradleJvm" value="1.8" />
|
||||
<option name="modules">
|
||||
<set>
|
||||
<option value="$PROJECT_DIR$" />
|
||||
<option value="$PROJECT_DIR$/HMCL" />
|
||||
<option value="$PROJECT_DIR$/HMCLCore" />
|
||||
</set>
|
||||
</option>
|
||||
<option name="useAutoImport" value="true" />
|
||||
</GradleProjectSettings>
|
||||
<GradleProjectSettings>
|
||||
<option name="distributionType" value="DEFAULT_WRAPPED" />
|
||||
<option name="externalProjectPath" value="$PROJECT_DIR$/HMCL" />
|
||||
<option name="gradleJvm" value="1.8" />
|
||||
<option name="modules">
|
||||
<set>
|
||||
<option value="$PROJECT_DIR$/HMCL" />
|
||||
</set>
|
||||
</option>
|
||||
<option name="useAutoImport" value="true" />
|
||||
</GradleProjectSettings>
|
||||
<GradleProjectSettings>
|
||||
<option name="distributionType" value="DEFAULT_WRAPPED" />
|
||||
<option name="externalProjectPath" value="$PROJECT_DIR$/JFoenix" />
|
||||
<option name="gradleJvm" value="1.8" />
|
||||
<option name="modules">
|
||||
<set>
|
||||
<option value="$PROJECT_DIR$/JFoenix" />
|
||||
</set>
|
||||
</option>
|
||||
<option name="useAutoImport" value="true" />
|
||||
</GradleProjectSettings>
|
||||
<GradleProjectSettings>
|
||||
<option name="distributionType" value="DEFAULT_WRAPPED" />
|
||||
<option name="externalProjectPath" value="$PROJECT_DIR$/TornadoFx" />
|
||||
<option name="gradleJvm" value="1.8" />
|
||||
<option name="modules">
|
||||
<set>
|
||||
<option value="$PROJECT_DIR$/TornadoFx" />
|
||||
</set>
|
||||
</option>
|
||||
<option name="useAutoImport" value="true" />
|
||||
</GradleProjectSettings>
|
||||
</option>
|
||||
</component>
|
||||
</project>
|
||||
6
.idea/kotlinc.xml
generated
Normal file
6
.idea/kotlinc.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Kotlin2JvmCompilerArguments">
|
||||
<option name="jvmTarget" value="1.8" />
|
||||
</component>
|
||||
</project>
|
||||
11
.idea/libraries/Gradle__com_google_code_gson_gson_2_8_1.xml
generated
Normal file
11
.idea/libraries/Gradle__com_google_code_gson_gson_2_8_1.xml
generated
Normal file
@@ -0,0 +1,11 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Gradle: com.google.code.gson:gson:2.8.1">
|
||||
<CLASSES>
|
||||
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.1/2a8e0aa38a2e21cb39e2f5a7d6704cbdc941da0/gson-2.8.1.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES>
|
||||
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.1/c10732c97eccba635e20596a02c3824fef0605bf/gson-2.8.1-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
||||
11
.idea/libraries/Gradle__junit_junit_4_12.xml
generated
Normal file
11
.idea/libraries/Gradle__junit_junit_4_12.xml
generated
Normal file
@@ -0,0 +1,11 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Gradle: junit:junit:4.12">
|
||||
<CLASSES>
|
||||
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/junit/junit/4.12/2973d150c0dc1fefe998f834810d68f278ea58ec/junit-4.12.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES>
|
||||
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/junit/junit/4.12/a6c32b40bf3d76eca54e3c601e5d1470c86fcdfa/junit-4.12-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
||||
11
.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml
generated
Normal file
11
.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml
generated
Normal file
@@ -0,0 +1,11 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Gradle: org.hamcrest:hamcrest-core:1.3">
|
||||
<CLASSES>
|
||||
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-core/1.3/42a25dc3219429f0e5d060061f71acb49bf010a0/hamcrest-core-1.3.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES>
|
||||
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-core/1.3/1dc37250fbc78e23a65a67fbbaf71d2e9cbc3c0b/hamcrest-core-1.3-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
||||
11
.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml
generated
Normal file
11
.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml
generated
Normal file
@@ -0,0 +1,11 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Gradle: org.jetbrains:annotations:13.0">
|
||||
<CLASSES>
|
||||
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES>
|
||||
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/5991ca87ef1fb5544943d9abc5a9a37583fabe03/annotations-13.0-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
||||
11
.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_1_3_2.xml
generated
Normal file
11
.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_1_3_2.xml
generated
Normal file
@@ -0,0 +1,11 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Gradle: org.jetbrains.kotlin:kotlin-stdlib:1.1.3-2">
|
||||
<CLASSES>
|
||||
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.3-2/9b44c139a4ec57031e0c84ba0e49ba16df6d801c/kotlin-stdlib-1.1.3-2.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES>
|
||||
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.3-2/fd533d031dcdf086dfc75cfb9003c4349ed829aa/kotlin-stdlib-1.1.3-2-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
||||
11
.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jre7_1_1_3_2.xml
generated
Normal file
11
.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jre7_1_1_3_2.xml
generated
Normal file
@@ -0,0 +1,11 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre7:1.1.3-2">
|
||||
<CLASSES>
|
||||
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre7/1.1.3-2/3fe54c7558c903868351ac79b792d152bca958f2/kotlin-stdlib-jre7-1.1.3-2.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES>
|
||||
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre7/1.1.3-2/39fdd46daad46e2d19fbcad7e639dd940df9d74f/kotlin-stdlib-jre7-1.1.3-2-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
||||
11
.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jre8_1_1_3_2.xml
generated
Normal file
11
.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jre8_1_1_3_2.xml
generated
Normal file
@@ -0,0 +1,11 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre8:1.1.3-2">
|
||||
<CLASSES>
|
||||
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre8/1.1.3-2/c8da1d60b49926296fa95f2ccdb218b7912f9c17/kotlin-stdlib-jre8-1.1.3-2.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES>
|
||||
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre8/1.1.3-2/989f32e8eb68a3e1ee346410f95729b78cbfb800/kotlin-stdlib-jre8-1.1.3-2-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
||||
6
.idea/misc.xml
generated
Normal file
6
.idea/misc.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="false" project-jdk-name="1.8" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/out" />
|
||||
</component>
|
||||
</project>
|
||||
16
.idea/modules.xml
generated
Normal file
16
.idea/modules.xml
generated
Normal file
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/modules/HMCL/HMCL.iml" filepath="$PROJECT_DIR$/.idea/modules/HMCL/HMCL.iml" group="HMCL" />
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/modules/HMCLCore/HMCLCore.iml" filepath="$PROJECT_DIR$/.idea/modules/HMCLCore/HMCLCore.iml" group="HMCLCore" />
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/modules/HMCLCore/HMCLCore_main.iml" filepath="$PROJECT_DIR$/.idea/modules/HMCLCore/HMCLCore_main.iml" group="HMCLCore" />
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/modules/HMCLCore/HMCLCore_test.iml" filepath="$PROJECT_DIR$/.idea/modules/HMCLCore/HMCLCore_test.iml" group="HMCLCore" />
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/modules/HMCLKotlin.iml" filepath="$PROJECT_DIR$/.idea/modules/HMCLKotlin.iml" />
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/modules/HMCLKotlin_main.iml" filepath="$PROJECT_DIR$/.idea/modules/HMCLKotlin_main.iml" group="HMCLKotlin" />
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/modules/HMCLKotlin_test.iml" filepath="$PROJECT_DIR$/.idea/modules/HMCLKotlin_test.iml" group="HMCLKotlin" />
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/modules/HMCL/HMCL_main.iml" filepath="$PROJECT_DIR$/.idea/modules/HMCL/HMCL_main.iml" group="HMCL" />
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/modules/HMCL/HMCL_test.iml" filepath="$PROJECT_DIR$/.idea/modules/HMCL/HMCL_test.iml" group="HMCL" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
||||
13
.idea/modules/HMCL/HMCL.iml
generated
Normal file
13
.idea/modules/HMCL/HMCL.iml
generated
Normal file
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module external.linked.project.id=":HMCL" external.linked.project.path="$MODULE_DIR$/../../../HMCL" external.root.project.path="$MODULE_DIR$/../../.." external.system.id="GRADLE" external.system.module.group="org.jackhuang" external.system.module.version="3.0" type="JAVA_MODULE" version="4">
|
||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$/../../../HMCL">
|
||||
<excludeFolder url="file://$MODULE_DIR$/../../../HMCL/.gradle" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/../../../HMCL/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/../../../HMCL/out" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
||||
54
.idea/modules/HMCL/HMCL_main.iml
generated
Normal file
54
.idea/modules/HMCL/HMCL_main.iml
generated
Normal file
@@ -0,0 +1,54 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module external.linked.project.id=":HMCL:main" external.linked.project.path="$MODULE_DIR$/../../../HMCL" external.root.project.path="$MODULE_DIR$/../../.." external.system.id="GRADLE" external.system.module.group="org.jackhuang" external.system.module.type="sourceSet" external.system.module.version="3.0" type="JAVA_MODULE" version="4">
|
||||
<component name="FacetManager">
|
||||
<facet type="kotlin-language" name="Kotlin">
|
||||
<configuration version="3" platform="JVM 1.8" useProjectSettings="false">
|
||||
<compilerSettings />
|
||||
<compilerArguments>
|
||||
<option name="destination" value="$MODULE_DIR$/../../../HMCL/build/kotlin-classes/main" />
|
||||
<option name="classpath" value="$MODULE_DIR$/../../../lib/JFoenix.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre8/1.1.3-2/c8da1d60b49926296fa95f2ccdb218b7912f9c17/kotlin-stdlib-jre8-1.1.3-2.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.1/2a8e0aa38a2e21cb39e2f5a7d6704cbdc941da0/gson-2.8.1.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre7/1.1.3-2/3fe54c7558c903868351ac79b792d152bca958f2/kotlin-stdlib-jre7-1.1.3-2.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.3-2/9b44c139a4ec57031e0c84ba0e49ba16df6d801c/kotlin-stdlib-1.1.3-2.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar" />
|
||||
<option name="noStdlib" value="true" />
|
||||
<option name="noReflect" value="true" />
|
||||
<option name="moduleName" value="HMCL_main" />
|
||||
<option name="jvmTarget" value="1.8" />
|
||||
<option name="addCompilerBuiltIns" value="true" />
|
||||
<option name="loadBuiltInsFromDependencies" value="true" />
|
||||
<option name="languageVersion" value="1.1" />
|
||||
<option name="apiVersion" value="1.1" />
|
||||
<option name="pluginOptions">
|
||||
<array />
|
||||
</option>
|
||||
<option name="pluginClasspaths">
|
||||
<array />
|
||||
</option>
|
||||
</compilerArguments>
|
||||
</configuration>
|
||||
</facet>
|
||||
</component>
|
||||
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
|
||||
<output url="file://$MODULE_DIR$/../../../HMCL/out/production/classes" />
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$/../../../HMCL/src/main">
|
||||
<sourceFolder url="file://$MODULE_DIR$/../../../HMCL/src/main/java" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/../../../HMCL/src/main/kotlin" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/../../../HMCL/src/main/resources" type="java-resource" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="module-library">
|
||||
<library>
|
||||
<CLASSES>
|
||||
<root url="jar://$MODULE_DIR$/../../../lib/JFoenix.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</orderEntry>
|
||||
<orderEntry type="module" module-name="HMCLCore_main" />
|
||||
<orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre8:1.1.3-2" level="project" />
|
||||
<orderEntry type="library" name="Gradle: com.google.code.gson:gson:2.8.1" level="project" />
|
||||
<orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre7:1.1.3-2" level="project" />
|
||||
<orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib:1.1.3-2" level="project" />
|
||||
<orderEntry type="library" name="Gradle: org.jetbrains:annotations:13.0" level="project" />
|
||||
</component>
|
||||
</module>
|
||||
58
.idea/modules/HMCL/HMCL_test.iml
generated
Normal file
58
.idea/modules/HMCL/HMCL_test.iml
generated
Normal file
@@ -0,0 +1,58 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module external.linked.project.id=":HMCL:test" external.linked.project.path="$MODULE_DIR$/../../../HMCL" external.root.project.path="$MODULE_DIR$/../../.." external.system.id="GRADLE" external.system.module.group="org.jackhuang" external.system.module.type="sourceSet" external.system.module.version="3.0" type="JAVA_MODULE" version="4">
|
||||
<component name="FacetManager">
|
||||
<facet type="kotlin-language" name="Kotlin">
|
||||
<configuration version="3" platform="JVM 1.8" useProjectSettings="false">
|
||||
<compilerSettings />
|
||||
<compilerArguments>
|
||||
<option name="destination" value="$MODULE_DIR$/../../../HMCL/build/kotlin-classes/test" />
|
||||
<option name="classpath" value="$MODULE_DIR$/../../../lib/JFoenix.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre8/1.1.3-2/c8da1d60b49926296fa95f2ccdb218b7912f9c17/kotlin-stdlib-jre8-1.1.3-2.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.1/2a8e0aa38a2e21cb39e2f5a7d6704cbdc941da0/gson-2.8.1.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/junit/junit/4.12/2973d150c0dc1fefe998f834810d68f278ea58ec/junit-4.12.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre7/1.1.3-2/3fe54c7558c903868351ac79b792d152bca958f2/kotlin-stdlib-jre7-1.1.3-2.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.3-2/9b44c139a4ec57031e0c84ba0e49ba16df6d801c/kotlin-stdlib-1.1.3-2.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-core/1.3/42a25dc3219429f0e5d060061f71acb49bf010a0/hamcrest-core-1.3.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar" />
|
||||
<option name="noStdlib" value="true" />
|
||||
<option name="noReflect" value="true" />
|
||||
<option name="moduleName" value="HMCL_main" />
|
||||
<option name="jvmTarget" value="1.8" />
|
||||
<option name="addCompilerBuiltIns" value="true" />
|
||||
<option name="loadBuiltInsFromDependencies" value="true" />
|
||||
<option name="languageVersion" value="1.1" />
|
||||
<option name="apiVersion" value="1.1" />
|
||||
<option name="pluginOptions">
|
||||
<array />
|
||||
</option>
|
||||
<option name="pluginClasspaths">
|
||||
<array />
|
||||
</option>
|
||||
</compilerArguments>
|
||||
</configuration>
|
||||
</facet>
|
||||
</component>
|
||||
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
|
||||
<output-test url="file://$MODULE_DIR$/../../../HMCL/out/test/classes" />
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$/../../../HMCL/src/test">
|
||||
<sourceFolder url="file://$MODULE_DIR$/../../../HMCL/src/test/java" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/../../../HMCL/src/test/kotlin" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/../../../HMCL/src/test/resources" type="java-test-resource" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="module" module-name="HMCL_main" />
|
||||
<orderEntry type="module-library">
|
||||
<library>
|
||||
<CLASSES>
|
||||
<root url="jar://$MODULE_DIR$/../../../lib/JFoenix.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</orderEntry>
|
||||
<orderEntry type="module" module-name="HMCLCore_main" />
|
||||
<orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre8:1.1.3-2" level="project" />
|
||||
<orderEntry type="library" name="Gradle: com.google.code.gson:gson:2.8.1" level="project" />
|
||||
<orderEntry type="library" name="Gradle: junit:junit:4.12" level="project" />
|
||||
<orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre7:1.1.3-2" level="project" />
|
||||
<orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib:1.1.3-2" level="project" />
|
||||
<orderEntry type="library" name="Gradle: org.hamcrest:hamcrest-core:1.3" level="project" />
|
||||
<orderEntry type="library" name="Gradle: org.jetbrains:annotations:13.0" level="project" />
|
||||
</component>
|
||||
<component name="TestModuleProperties" production-module="HMCL_main" />
|
||||
</module>
|
||||
13
.idea/modules/HMCLCore/HMCLCore.iml
generated
Normal file
13
.idea/modules/HMCLCore/HMCLCore.iml
generated
Normal file
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module external.linked.project.id=":HMCLCore" external.linked.project.path="$MODULE_DIR$/../../../HMCLCore" external.root.project.path="$MODULE_DIR$/../../.." external.system.id="GRADLE" external.system.module.group="org.jackhuang" external.system.module.version="3.0" type="JAVA_MODULE" version="4">
|
||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$/../../../HMCLCore">
|
||||
<excludeFolder url="file://$MODULE_DIR$/../../../HMCLCore/.gradle" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/../../../HMCLCore/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/../../../HMCLCore/out" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
||||
44
.idea/modules/HMCLCore/HMCLCore_main.iml
generated
Normal file
44
.idea/modules/HMCLCore/HMCLCore_main.iml
generated
Normal file
@@ -0,0 +1,44 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module external.linked.project.id=":HMCLCore:main" external.linked.project.path="$MODULE_DIR$/../../../HMCLCore" external.root.project.path="$MODULE_DIR$/../../.." external.system.id="GRADLE" external.system.module.group="org.jackhuang" external.system.module.type="sourceSet" external.system.module.version="3.0" type="JAVA_MODULE" version="4">
|
||||
<component name="FacetManager">
|
||||
<facet type="kotlin-language" name="Kotlin">
|
||||
<configuration version="3" platform="JVM 1.8" useProjectSettings="false">
|
||||
<compilerSettings />
|
||||
<compilerArguments>
|
||||
<option name="destination" value="$MODULE_DIR$/../../../HMCLCore/build/kotlin-classes/main" />
|
||||
<option name="classpath" value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre8/1.1.3-2/c8da1d60b49926296fa95f2ccdb218b7912f9c17/kotlin-stdlib-jre8-1.1.3-2.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.1/2a8e0aa38a2e21cb39e2f5a7d6704cbdc941da0/gson-2.8.1.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre7/1.1.3-2/3fe54c7558c903868351ac79b792d152bca958f2/kotlin-stdlib-jre7-1.1.3-2.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.3-2/9b44c139a4ec57031e0c84ba0e49ba16df6d801c/kotlin-stdlib-1.1.3-2.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar" />
|
||||
<option name="noStdlib" value="true" />
|
||||
<option name="noReflect" value="true" />
|
||||
<option name="moduleName" value="HMCLCore_main" />
|
||||
<option name="jvmTarget" value="1.8" />
|
||||
<option name="addCompilerBuiltIns" value="true" />
|
||||
<option name="loadBuiltInsFromDependencies" value="true" />
|
||||
<option name="languageVersion" value="1.1" />
|
||||
<option name="apiVersion" value="1.1" />
|
||||
<option name="pluginOptions">
|
||||
<array />
|
||||
</option>
|
||||
<option name="pluginClasspaths">
|
||||
<array />
|
||||
</option>
|
||||
</compilerArguments>
|
||||
</configuration>
|
||||
</facet>
|
||||
</component>
|
||||
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
|
||||
<output url="file://$MODULE_DIR$/../../../HMCLCore/out/production/classes" />
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$/../../../HMCLCore/src/main">
|
||||
<sourceFolder url="file://$MODULE_DIR$/../../../HMCLCore/src/main/java" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/../../../HMCLCore/src/main/kotlin" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/../../../HMCLCore/src/main/resources" type="java-resource" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre8:1.1.3-2" level="project" />
|
||||
<orderEntry type="library" name="Gradle: com.google.code.gson:gson:2.8.1" level="project" />
|
||||
<orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre7:1.1.3-2" level="project" />
|
||||
<orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib:1.1.3-2" level="project" />
|
||||
<orderEntry type="library" name="Gradle: org.jetbrains:annotations:13.0" level="project" />
|
||||
</component>
|
||||
</module>
|
||||
48
.idea/modules/HMCLCore/HMCLCore_test.iml
generated
Normal file
48
.idea/modules/HMCLCore/HMCLCore_test.iml
generated
Normal file
@@ -0,0 +1,48 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module external.linked.project.id=":HMCLCore:test" external.linked.project.path="$MODULE_DIR$/../../../HMCLCore" external.root.project.path="$MODULE_DIR$/../../.." external.system.id="GRADLE" external.system.module.group="org.jackhuang" external.system.module.type="sourceSet" external.system.module.version="3.0" type="JAVA_MODULE" version="4">
|
||||
<component name="FacetManager">
|
||||
<facet type="kotlin-language" name="Kotlin">
|
||||
<configuration version="3" platform="JVM 1.8" useProjectSettings="false">
|
||||
<compilerSettings />
|
||||
<compilerArguments>
|
||||
<option name="destination" value="$MODULE_DIR$/../../../HMCLCore/build/kotlin-classes/test" />
|
||||
<option name="classpath" value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre8/1.1.3-2/c8da1d60b49926296fa95f2ccdb218b7912f9c17/kotlin-stdlib-jre8-1.1.3-2.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.1/2a8e0aa38a2e21cb39e2f5a7d6704cbdc941da0/gson-2.8.1.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/junit/junit/4.12/2973d150c0dc1fefe998f834810d68f278ea58ec/junit-4.12.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre7/1.1.3-2/3fe54c7558c903868351ac79b792d152bca958f2/kotlin-stdlib-jre7-1.1.3-2.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.3-2/9b44c139a4ec57031e0c84ba0e49ba16df6d801c/kotlin-stdlib-1.1.3-2.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-core/1.3/42a25dc3219429f0e5d060061f71acb49bf010a0/hamcrest-core-1.3.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar" />
|
||||
<option name="noStdlib" value="true" />
|
||||
<option name="noReflect" value="true" />
|
||||
<option name="moduleName" value="HMCLCore_main" />
|
||||
<option name="jvmTarget" value="1.8" />
|
||||
<option name="addCompilerBuiltIns" value="true" />
|
||||
<option name="loadBuiltInsFromDependencies" value="true" />
|
||||
<option name="languageVersion" value="1.1" />
|
||||
<option name="apiVersion" value="1.1" />
|
||||
<option name="pluginOptions">
|
||||
<array />
|
||||
</option>
|
||||
<option name="pluginClasspaths">
|
||||
<array />
|
||||
</option>
|
||||
</compilerArguments>
|
||||
</configuration>
|
||||
</facet>
|
||||
</component>
|
||||
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
|
||||
<output-test url="file://$MODULE_DIR$/../../../HMCLCore/out/test/classes" />
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$/../../../HMCLCore/src/test">
|
||||
<sourceFolder url="file://$MODULE_DIR$/../../../HMCLCore/src/test/java" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/../../../HMCLCore/src/test/kotlin" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/../../../HMCLCore/src/test/resources" type="java-test-resource" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="module" module-name="HMCLCore_main" />
|
||||
<orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre8:1.1.3-2" level="project" />
|
||||
<orderEntry type="library" name="Gradle: com.google.code.gson:gson:2.8.1" level="project" />
|
||||
<orderEntry type="library" name="Gradle: junit:junit:4.12" level="project" />
|
||||
<orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre7:1.1.3-2" level="project" />
|
||||
<orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib:1.1.3-2" level="project" />
|
||||
<orderEntry type="library" name="Gradle: org.hamcrest:hamcrest-core:1.3" level="project" />
|
||||
<orderEntry type="library" name="Gradle: org.jetbrains:annotations:13.0" level="project" />
|
||||
</component>
|
||||
<component name="TestModuleProperties" production-module="HMCLCore_main" />
|
||||
</module>
|
||||
12
.idea/modules/HMCLKotlin.iml
generated
Normal file
12
.idea/modules/HMCLKotlin.iml
generated
Normal file
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module external.linked.project.id="HMCLKotlin" external.linked.project.path="$MODULE_DIR$/../.." external.root.project.path="$MODULE_DIR$/../.." external.system.id="GRADLE" external.system.module.group="org.jackhuang" external.system.module.version="3.0" type="JAVA_MODULE" version="4">
|
||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$/../..">
|
||||
<excludeFolder url="file://$MODULE_DIR$/../../.gradle" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/../../build" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
||||
44
.idea/modules/HMCLKotlin_main.iml
generated
Normal file
44
.idea/modules/HMCLKotlin_main.iml
generated
Normal file
@@ -0,0 +1,44 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module external.linked.project.id="HMCLKotlin:main" external.linked.project.path="$MODULE_DIR$/../.." external.root.project.path="$MODULE_DIR$/../.." external.system.id="GRADLE" external.system.module.group="org.jackhuang" external.system.module.type="sourceSet" external.system.module.version="3.0" type="JAVA_MODULE" version="4">
|
||||
<component name="FacetManager">
|
||||
<facet type="kotlin-language" name="Kotlin">
|
||||
<configuration version="3" platform="JVM 1.8" useProjectSettings="false">
|
||||
<compilerSettings />
|
||||
<compilerArguments>
|
||||
<option name="destination" value="$MODULE_DIR$/../../build/kotlin-classes/main" />
|
||||
<option name="classpath" value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre8/1.1.3-2/c8da1d60b49926296fa95f2ccdb218b7912f9c17/kotlin-stdlib-jre8-1.1.3-2.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.1/2a8e0aa38a2e21cb39e2f5a7d6704cbdc941da0/gson-2.8.1.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre7/1.1.3-2/3fe54c7558c903868351ac79b792d152bca958f2/kotlin-stdlib-jre7-1.1.3-2.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.3-2/9b44c139a4ec57031e0c84ba0e49ba16df6d801c/kotlin-stdlib-1.1.3-2.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar" />
|
||||
<option name="noStdlib" value="true" />
|
||||
<option name="noReflect" value="true" />
|
||||
<option name="moduleName" value="HMCLKotlin_main" />
|
||||
<option name="jvmTarget" value="1.8" />
|
||||
<option name="addCompilerBuiltIns" value="true" />
|
||||
<option name="loadBuiltInsFromDependencies" value="true" />
|
||||
<option name="languageVersion" value="1.1" />
|
||||
<option name="apiVersion" value="1.1" />
|
||||
<option name="pluginOptions">
|
||||
<array />
|
||||
</option>
|
||||
<option name="pluginClasspaths">
|
||||
<array />
|
||||
</option>
|
||||
</compilerArguments>
|
||||
</configuration>
|
||||
</facet>
|
||||
</component>
|
||||
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
|
||||
<output url="file://$MODULE_DIR$/../../out/production/classes" />
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$/../../src/main">
|
||||
<sourceFolder url="file://$MODULE_DIR$/../../src/main/java" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/../../src/main/kotlin" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/../../src/main/resources" type="java-resource" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre8:1.1.3-2" level="project" />
|
||||
<orderEntry type="library" name="Gradle: com.google.code.gson:gson:2.8.1" level="project" />
|
||||
<orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre7:1.1.3-2" level="project" />
|
||||
<orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib:1.1.3-2" level="project" />
|
||||
<orderEntry type="library" name="Gradle: org.jetbrains:annotations:13.0" level="project" />
|
||||
</component>
|
||||
</module>
|
||||
48
.idea/modules/HMCLKotlin_test.iml
generated
Normal file
48
.idea/modules/HMCLKotlin_test.iml
generated
Normal file
@@ -0,0 +1,48 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module external.linked.project.id="HMCLKotlin:test" external.linked.project.path="$MODULE_DIR$/../.." external.root.project.path="$MODULE_DIR$/../.." external.system.id="GRADLE" external.system.module.group="org.jackhuang" external.system.module.type="sourceSet" external.system.module.version="3.0" type="JAVA_MODULE" version="4">
|
||||
<component name="FacetManager">
|
||||
<facet type="kotlin-language" name="Kotlin">
|
||||
<configuration version="3" platform="JVM 1.8" useProjectSettings="false">
|
||||
<compilerSettings />
|
||||
<compilerArguments>
|
||||
<option name="destination" value="$MODULE_DIR$/../../build/kotlin-classes/test" />
|
||||
<option name="classpath" value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre8/1.1.3-2/c8da1d60b49926296fa95f2ccdb218b7912f9c17/kotlin-stdlib-jre8-1.1.3-2.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.1/2a8e0aa38a2e21cb39e2f5a7d6704cbdc941da0/gson-2.8.1.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/junit/junit/4.12/2973d150c0dc1fefe998f834810d68f278ea58ec/junit-4.12.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre7/1.1.3-2/3fe54c7558c903868351ac79b792d152bca958f2/kotlin-stdlib-jre7-1.1.3-2.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.3-2/9b44c139a4ec57031e0c84ba0e49ba16df6d801c/kotlin-stdlib-1.1.3-2.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-core/1.3/42a25dc3219429f0e5d060061f71acb49bf010a0/hamcrest-core-1.3.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar" />
|
||||
<option name="noStdlib" value="true" />
|
||||
<option name="noReflect" value="true" />
|
||||
<option name="moduleName" value="HMCLKotlin_main" />
|
||||
<option name="jvmTarget" value="1.8" />
|
||||
<option name="addCompilerBuiltIns" value="true" />
|
||||
<option name="loadBuiltInsFromDependencies" value="true" />
|
||||
<option name="languageVersion" value="1.1" />
|
||||
<option name="apiVersion" value="1.1" />
|
||||
<option name="pluginOptions">
|
||||
<array />
|
||||
</option>
|
||||
<option name="pluginClasspaths">
|
||||
<array />
|
||||
</option>
|
||||
</compilerArguments>
|
||||
</configuration>
|
||||
</facet>
|
||||
</component>
|
||||
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
|
||||
<output-test url="file://$MODULE_DIR$/../../out/test/classes" />
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$/../../src/test">
|
||||
<sourceFolder url="file://$MODULE_DIR$/../../src/test/java" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/../../src/test/kotlin" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/../../src/test/resources" type="java-test-resource" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="module" module-name="HMCLKotlin_main" />
|
||||
<orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre8:1.1.3-2" level="project" />
|
||||
<orderEntry type="library" name="Gradle: com.google.code.gson:gson:2.8.1" level="project" />
|
||||
<orderEntry type="library" name="Gradle: junit:junit:4.12" level="project" />
|
||||
<orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre7:1.1.3-2" level="project" />
|
||||
<orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib:1.1.3-2" level="project" />
|
||||
<orderEntry type="library" name="Gradle: org.hamcrest:hamcrest-core:1.3" level="project" />
|
||||
<orderEntry type="library" name="Gradle: org.jetbrains:annotations:13.0" level="project" />
|
||||
</component>
|
||||
<component name="TestModuleProperties" production-module="HMCLKotlin_main" />
|
||||
</module>
|
||||
14
.idea/modules/jfoenix.iml
generated
Normal file
14
.idea/modules/jfoenix.iml
generated
Normal file
@@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module external.linked.project.id="jfoenix" external.linked.project.path="$MODULE_DIR$/../../JFoenix" external.root.project.path="$MODULE_DIR$/../../JFoenix" external.system.id="GRADLE" external.system.module.group="" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
|
||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$/../../JFoenix">
|
||||
<sourceFolder url="file://$MODULE_DIR$/../../JFoenix/src/main/java" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/../../JFoenix/src/main/resources" type="java-resource" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/../../JFoenix/.gradle" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/../../JFoenix/build" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
||||
15
.idea/modules/tornadofx.iml
generated
Normal file
15
.idea/modules/tornadofx.iml
generated
Normal file
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module external.linked.project.id="tornadofx" external.linked.project.path="$MODULE_DIR$/../../TornadoFx" external.root.project.path="$MODULE_DIR$/../../TornadoFx" external.system.id="GRADLE" external.system.module.group="org.jackhuang" external.system.module.version="3.0" type="JAVA_MODULE" version="4">
|
||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$/../../TornadoFx">
|
||||
<sourceFolder url="file://$MODULE_DIR$/../../TornadoFx/src/main/kotlin" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/../../TornadoFx/src/main/resources" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/../../TornadoFx/src/test/resources" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/../../TornadoFx/src/test/kotlin" isTestSource="true" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="library" name="KotlinJavaRuntime" level="project" />
|
||||
</component>
|
||||
</module>
|
||||
43
.idea/modules/tornadofx_main.iml
generated
Normal file
43
.idea/modules/tornadofx_main.iml
generated
Normal file
@@ -0,0 +1,43 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module external.linked.project.id="tornadofx:main" external.linked.project.path="$MODULE_DIR$/../../TornadoFx" external.root.project.path="$MODULE_DIR$/../../TornadoFx" external.system.id="GRADLE" external.system.module.group="org.jackhuang" external.system.module.type="sourceSet" external.system.module.version="3.0" type="JAVA_MODULE" version="4">
|
||||
<component name="FacetManager">
|
||||
<facet type="kotlin-language" name="Kotlin">
|
||||
<configuration version="3" platform="JVM 1.8" useProjectSettings="false">
|
||||
<compilerSettings />
|
||||
<compilerArguments>
|
||||
<option name="destination" value="$MODULE_DIR$/../../TornadoFx/build/kotlin-classes/main" />
|
||||
<option name="classpath" value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre8/1.1.3-2/c8da1d60b49926296fa95f2ccdb218b7912f9c17/kotlin-stdlib-jre8-1.1.3-2.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.3-2/9b44c139a4ec57031e0c84ba0e49ba16df6d801c/kotlin-stdlib-1.1.3-2.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre7/1.1.3-2/3fe54c7558c903868351ac79b792d152bca958f2/kotlin-stdlib-jre7-1.1.3-2.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar" />
|
||||
<option name="noStdlib" value="true" />
|
||||
<option name="noReflect" value="true" />
|
||||
<option name="moduleName" value="tornadofx_main" />
|
||||
<option name="jvmTarget" value="1.8" />
|
||||
<option name="addCompilerBuiltIns" value="true" />
|
||||
<option name="loadBuiltInsFromDependencies" value="true" />
|
||||
<option name="languageVersion" value="1.1" />
|
||||
<option name="apiVersion" value="1.1" />
|
||||
<option name="pluginOptions">
|
||||
<array />
|
||||
</option>
|
||||
<option name="pluginClasspaths">
|
||||
<array />
|
||||
</option>
|
||||
</compilerArguments>
|
||||
</configuration>
|
||||
</facet>
|
||||
</component>
|
||||
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
|
||||
<output url="file://$MODULE_DIR$/../../TornadoFx/build/classes/main" />
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$/../../TornadoFx/src/main">
|
||||
<sourceFolder url="file://$MODULE_DIR$/../../TornadoFx/src/main/java" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/../../TornadoFx/src/main/kotlin" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/../../TornadoFx/src/main/resources" type="java-resource" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre8:1.1.3-2" level="project" />
|
||||
<orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib:1.1.3-2" level="project" />
|
||||
<orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre7:1.1.3-2" level="project" />
|
||||
<orderEntry type="library" name="Gradle: org.jetbrains:annotations:13.0" level="project" />
|
||||
</component>
|
||||
</module>
|
||||
47
.idea/modules/tornadofx_test.iml
generated
Normal file
47
.idea/modules/tornadofx_test.iml
generated
Normal file
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module external.linked.project.id="tornadofx:test" external.linked.project.path="$MODULE_DIR$/../../TornadoFx" external.root.project.path="$MODULE_DIR$/../../TornadoFx" external.system.id="GRADLE" external.system.module.group="org.jackhuang" external.system.module.type="sourceSet" external.system.module.version="3.0" type="JAVA_MODULE" version="4">
|
||||
<component name="FacetManager">
|
||||
<facet type="kotlin-language" name="Kotlin">
|
||||
<configuration version="3" platform="JVM 1.8" useProjectSettings="false">
|
||||
<compilerSettings />
|
||||
<compilerArguments>
|
||||
<option name="destination" value="$MODULE_DIR$/../../TornadoFx/build/kotlin-classes/test" />
|
||||
<option name="classpath" value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre8/1.1.3-2/c8da1d60b49926296fa95f2ccdb218b7912f9c17/kotlin-stdlib-jre8-1.1.3-2.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/junit/junit/4.12/2973d150c0dc1fefe998f834810d68f278ea58ec/junit-4.12.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.3-2/9b44c139a4ec57031e0c84ba0e49ba16df6d801c/kotlin-stdlib-1.1.3-2.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre7/1.1.3-2/3fe54c7558c903868351ac79b792d152bca958f2/kotlin-stdlib-jre7-1.1.3-2.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-core/1.3/42a25dc3219429f0e5d060061f71acb49bf010a0/hamcrest-core-1.3.jar;C:/Users/huang/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar" />
|
||||
<option name="noStdlib" value="true" />
|
||||
<option name="noReflect" value="true" />
|
||||
<option name="moduleName" value="tornadofx_main" />
|
||||
<option name="jvmTarget" value="1.8" />
|
||||
<option name="addCompilerBuiltIns" value="true" />
|
||||
<option name="loadBuiltInsFromDependencies" value="true" />
|
||||
<option name="languageVersion" value="1.1" />
|
||||
<option name="apiVersion" value="1.1" />
|
||||
<option name="pluginOptions">
|
||||
<array />
|
||||
</option>
|
||||
<option name="pluginClasspaths">
|
||||
<array />
|
||||
</option>
|
||||
</compilerArguments>
|
||||
</configuration>
|
||||
</facet>
|
||||
</component>
|
||||
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
|
||||
<output-test url="file://$MODULE_DIR$/../../TornadoFx/build/classes/test" />
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$/../../TornadoFx/src/test">
|
||||
<sourceFolder url="file://$MODULE_DIR$/../../TornadoFx/src/test/java" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/../../TornadoFx/src/test/kotlin" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/../../TornadoFx/src/test/resources" type="java-test-resource" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="module" module-name="tornadofx_main" />
|
||||
<orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre8:1.1.3-2" level="project" />
|
||||
<orderEntry type="library" name="Gradle: junit:junit:4.12" level="project" />
|
||||
<orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib:1.1.3-2" level="project" />
|
||||
<orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre7:1.1.3-2" level="project" />
|
||||
<orderEntry type="library" name="Gradle: org.hamcrest:hamcrest-core:1.3" level="project" />
|
||||
<orderEntry type="library" name="Gradle: org.jetbrains:annotations:13.0" level="project" />
|
||||
</component>
|
||||
<component name="TestModuleProperties" production-module="tornadofx_main" />
|
||||
</module>
|
||||
124
.idea/uiDesigner.xml
generated
Normal file
124
.idea/uiDesigner.xml
generated
Normal file
@@ -0,0 +1,124 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Palette2">
|
||||
<group name="Swing">
|
||||
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
|
||||
</item>
|
||||
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
|
||||
</item>
|
||||
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
|
||||
</item>
|
||||
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
|
||||
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
|
||||
</item>
|
||||
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
|
||||
<initial-values>
|
||||
<property name="text" value="Button" />
|
||||
</initial-values>
|
||||
</item>
|
||||
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
|
||||
<initial-values>
|
||||
<property name="text" value="RadioButton" />
|
||||
</initial-values>
|
||||
</item>
|
||||
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
|
||||
<initial-values>
|
||||
<property name="text" value="CheckBox" />
|
||||
</initial-values>
|
||||
</item>
|
||||
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
|
||||
<initial-values>
|
||||
<property name="text" value="Label" />
|
||||
</initial-values>
|
||||
</item>
|
||||
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
||||
<preferred-size width="150" height="-1" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
||||
<preferred-size width="150" height="-1" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
||||
<preferred-size width="150" height="-1" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
|
||||
<preferred-size width="200" height="200" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
|
||||
<preferred-size width="200" height="200" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
|
||||
</item>
|
||||
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
|
||||
<preferred-size width="-1" height="20" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
|
||||
</item>
|
||||
</group>
|
||||
</component>
|
||||
</project>
|
||||
6
.idea/vcs.xml
generated
Normal file
6
.idea/vcs.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
2536
.idea/workspace.xml
generated
Normal file
2536
.idea/workspace.xml
generated
Normal file
File diff suppressed because it is too large
Load Diff
14
HMCL/.travis.yml
Normal file
14
HMCL/.travis.yml
Normal file
@@ -0,0 +1,14 @@
|
||||
language: java
|
||||
jdk:
|
||||
- oraclejdk8
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
before_install:
|
||||
- chmod +x gradlew
|
||||
script: "bash ./gradlew clean build --stacktrace"
|
||||
before_cache:
|
||||
- rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
|
||||
cache:
|
||||
directories:
|
||||
- "$HOME/.gradle/caches/"
|
||||
BIN
HMCL/out/production/classes/META-INF/HMCL_main.kotlin_module
Normal file
BIN
HMCL/out/production/classes/META-INF/HMCL_main.kotlin_module
Normal file
Binary file not shown.
394
HMCL/out/production/resources/assets/css/jfoenix-components.css
Normal file
394
HMCL/out/production/resources/assets/css/jfoenix-components.css
Normal file
@@ -0,0 +1,394 @@
|
||||
.root {
|
||||
-fx-font-family: Roboto;
|
||||
src: "/resources/roboto/Roboto-Regular.ttf";
|
||||
}
|
||||
|
||||
/* Burgers Demo */
|
||||
|
||||
.jfx-hamburger {
|
||||
-fx-spacing: 5;
|
||||
-fx-cursor: hand;
|
||||
}
|
||||
|
||||
.jfx-hamburger StackPane {
|
||||
-fx-pref-width: 40px;
|
||||
-fx-pref-height: 7px;
|
||||
-fx-background-color: #D63333;
|
||||
-fx-background-radius: 5px;
|
||||
}
|
||||
|
||||
/* Input Demo */
|
||||
|
||||
.text-field {
|
||||
-fx-max-width: 300;
|
||||
}
|
||||
|
||||
.jfx-text-field, .jfx-password-field {
|
||||
-fx-background-color: WHITE;
|
||||
-fx-font-weight: BOLD;
|
||||
-fx-prompt-text-fill: #808080;
|
||||
-fx-alignment: top-left;
|
||||
-jfx-focus-color: #4059A9;
|
||||
-jfx-unfocus-color: #4d4d4d;
|
||||
-fx-max-width: 300;
|
||||
}
|
||||
|
||||
.jfx-decorator {
|
||||
-fx-decorator-color: RED;
|
||||
}
|
||||
|
||||
.jfx-decorator .jfx-decorator-buttons-container {
|
||||
-fx-background-color: -fx-decorator-color;
|
||||
}
|
||||
|
||||
.jfx-decorator .resize-border {
|
||||
-fx-border-color: -fx-decorator-color;
|
||||
-fx-border-width: 0 4 4 4;
|
||||
}
|
||||
|
||||
.jfx-text-area, .text-area {
|
||||
-fx-font-weight: BOLD;
|
||||
}
|
||||
|
||||
.jfx-text-field:error, .jfx-password-field:error, .jfx-text-area:error {
|
||||
-jfx-focus-color: #D34336;
|
||||
-jfx-unfocus-color: #D34336;
|
||||
}
|
||||
|
||||
.jfx-text-field .error-label, .jfx-password-field .error-label, .jfx-text-area .error-label {
|
||||
-fx-text-fill: #D34336;
|
||||
-fx-font-size: 0.75em;
|
||||
}
|
||||
|
||||
.jfx-text-field .error-icon, .jfx-password-field .error-icon, .jfx-text-area .error-icon {
|
||||
-fx-text-fill: #D34336;
|
||||
-fx-font-size: 1em;
|
||||
}
|
||||
|
||||
/* Progress Bar Demo */
|
||||
|
||||
.progress-bar > .bar {
|
||||
-fx-min-width: 500;
|
||||
}
|
||||
|
||||
.jfx-progress-bar > .bar {
|
||||
-fx-min-width: 500;
|
||||
}
|
||||
|
||||
.jfx-progress-bar {
|
||||
-fx-progress-color: #0F9D58;
|
||||
-fx-stroke-width: 3;
|
||||
}
|
||||
|
||||
/* Icons Demo */
|
||||
.icon {
|
||||
-fx-text-fill: #FE774D;
|
||||
-fx-padding: 10;
|
||||
-fx-cursor: hand;
|
||||
}
|
||||
|
||||
.icons-rippler {
|
||||
-jfx-rippler-fill: BLUE;
|
||||
-jfx-mask-type: CIRCLE;
|
||||
}
|
||||
|
||||
.icons-rippler:hover {
|
||||
-fx-cursor: hand;
|
||||
}
|
||||
|
||||
.jfx-check-box {
|
||||
-fx-font-weight: BOLD;
|
||||
}
|
||||
|
||||
.custom-jfx-check-box {
|
||||
-jfx-checked-color: RED;
|
||||
-jfx-unchecked-color: BLACK;
|
||||
}
|
||||
|
||||
/* Button */
|
||||
.button {
|
||||
-fx-padding: 0.7em 0.57em;
|
||||
-fx-font-size: 14px;
|
||||
}
|
||||
|
||||
.button-raised {
|
||||
-fx-padding: 0.7em 0.57em;
|
||||
-fx-font-size: 14px;
|
||||
-jfx-button-type: RAISED;
|
||||
-fx-background-color: rgb(77, 102, 204);
|
||||
-fx-pref-width: 200;
|
||||
-fx-text-fill: WHITE;
|
||||
}
|
||||
|
||||
/* The main scrollbar **track** CSS class */
|
||||
.mylistview .scroll-bar:horizontal .track,
|
||||
.mylistview .scroll-bar:vertical .track {
|
||||
-fx-background-color: transparent;
|
||||
-fx-border-color: transparent;
|
||||
-fx-background-radius: 0em;
|
||||
-fx-border-radius: 2em;
|
||||
}
|
||||
|
||||
/* The increment and decrement button CSS class of scrollbar */
|
||||
.mylistview .scroll-bar:horizontal .increment-button,
|
||||
.mylistview .scroll-bar:horizontal .decrement-button {
|
||||
-fx-background-color: transparent;
|
||||
-fx-background-radius: 0em;
|
||||
-fx-padding: 0 0 10 0;
|
||||
}
|
||||
|
||||
/* The increment and decrement button CSS class of scrollbar */
|
||||
|
||||
.mylistview .scroll-bar:vertical .increment-button,
|
||||
.mylistview .scroll-bar:vertical .decrement-button {
|
||||
-fx-background-color: transparent;
|
||||
-fx-background-radius: 0em;
|
||||
-fx-padding: 0 10 0 0;
|
||||
|
||||
}
|
||||
|
||||
.mylistview .scroll-bar .increment-arrow,
|
||||
.mylistview .scroll-bar .decrement-arrow {
|
||||
-fx-shape: " ";
|
||||
-fx-padding: 0;
|
||||
}
|
||||
|
||||
/* The main scrollbar **thumb** CSS class which we drag every time (movable) */
|
||||
.mylistview .scroll-bar:horizontal .thumb,
|
||||
.mylistview .scroll-bar:vertical .thumb {
|
||||
-fx-background-color: derive(black, 90%);
|
||||
-fx-background-insets: 2, 0, 0;
|
||||
-fx-background-radius: 2em;
|
||||
}
|
||||
|
||||
.jfx-list-cell-container {
|
||||
-fx-alignment: center-left;
|
||||
}
|
||||
|
||||
.jfx-list-cell-container > .label {
|
||||
-fx-text-fill: BLACK;
|
||||
}
|
||||
|
||||
.jfx-list-cell:odd:selected > .jfx-rippler > StackPane, .jfx-list-cell:even:selected > .jfx-rippler > StackPane {
|
||||
-fx-background-color: rgba(0, 0, 255, 0.2);
|
||||
}
|
||||
|
||||
.jfx-list-cell {
|
||||
-fx-background-insets: 0.0;
|
||||
-fx-text-fill: BLACK;
|
||||
}
|
||||
|
||||
.jfx-list-cell:odd, .jfx-list-cell:even {
|
||||
-fx-background-color: WHITE;
|
||||
}
|
||||
|
||||
.jfx-list-cell:filled:hover {
|
||||
-fx-text-fill: black;
|
||||
}
|
||||
|
||||
.jfx-list-cell .jfx-rippler {
|
||||
-jfx-rippler-fill: BLUE;
|
||||
}
|
||||
|
||||
.jfx-list-view {
|
||||
-fx-background-insets: 0;
|
||||
-jfx-cell-horizontal-margin: 0.0;
|
||||
-jfx-cell-vertical-margin: 5.0;
|
||||
-jfx-vertical-gap: 10;
|
||||
-jfx-expanded: false;
|
||||
-fx-pref-width: 200;
|
||||
}
|
||||
|
||||
.jfx-toggle-button {
|
||||
-jfx-toggle-color: RED;
|
||||
}
|
||||
|
||||
.jfx-tool-bar {
|
||||
-fx-font-size: 15;
|
||||
-fx-background-color: #5264AE;
|
||||
-fx-pref-width: 100%;
|
||||
-fx-pref-height: 64px;
|
||||
}
|
||||
|
||||
.jfx-tool-bar HBox {
|
||||
-fx-alignment: center;
|
||||
-fx-spacing: 25;
|
||||
-fx-padding: 0 10;
|
||||
}
|
||||
|
||||
.jfx-tool-bar Label {
|
||||
-fx-text-fill: WHITE;
|
||||
}
|
||||
|
||||
.jfx-popup-container {
|
||||
-fx-background-color: WHITE;
|
||||
}
|
||||
|
||||
.jfx-snackbar-content {
|
||||
-fx-background-color: #323232;
|
||||
-fx-padding: 5;
|
||||
-fx-spacing: 5;
|
||||
}
|
||||
|
||||
.jfx-snackbar-toast {
|
||||
-fx-text-fill: WHITE;
|
||||
}
|
||||
|
||||
.jfx-snackbar-action {
|
||||
-fx-text-fill: #ff4081;
|
||||
}
|
||||
|
||||
.jfx-list-cell-content-container {
|
||||
-fx-alignment: center-left;
|
||||
}
|
||||
|
||||
.jfx-list-cell-container .label {
|
||||
-fx-text-fill: BLACK;
|
||||
}
|
||||
|
||||
.combo-box-popup .list-view .jfx-list-cell:odd:selected .jfx-list-cell-container,
|
||||
.combo-box-popup .list-view .jfx-list-cell:even:selected .jfx-list-cell-container {
|
||||
-fx-background-color: rgba(0.0, 0.0, 255.0, 0.2);
|
||||
}
|
||||
|
||||
.combo-box-popup .list-view .jfx-list-cell {
|
||||
-fx-background-insets: 0.0;
|
||||
-fx-text-fill: BLACK;
|
||||
}
|
||||
|
||||
.combo-box-popup .list-view .jfx-list-cell:odd,
|
||||
.combo-box-popup .list-view .jfx-list-cell:even {
|
||||
-fx-background-color: WHITE;
|
||||
}
|
||||
|
||||
.combo-box-popup .list-view .jfx-list-cell:filled:hover {
|
||||
-fx-text-fill: black;
|
||||
}
|
||||
|
||||
.combo-box-popup .list-view .jfx-list-cell .jfx-rippler {
|
||||
-fx-rippler-fill: #5264AE;
|
||||
}
|
||||
|
||||
/*.combo-box .combo-box-button-container{
|
||||
-fx-border-color:BLACK;-fx-border-width: 0 0 1 0;
|
||||
}
|
||||
.combo-box .combo-box-selected-value-container{
|
||||
-fx-border-color:BLACK;
|
||||
} */
|
||||
|
||||
/*
|
||||
* TREE TABLE CSS
|
||||
*/
|
||||
|
||||
.tree-table-view {
|
||||
-fx-tree-table-color: rgba(255, 0, 0, 0.2);
|
||||
-fx-tree-table-rippler-color: rgba(255, 0, 0, 0.4);
|
||||
}
|
||||
|
||||
.tree-table-view:focused .tree-table-row-cell:selected {
|
||||
-fx-background-color: -fx-tree-table-color;
|
||||
-fx-table-cell-border-color: -fx-tree-table-color;
|
||||
-fx-text-fill: BLACK;
|
||||
}
|
||||
|
||||
.tree-table-view:focused .tree-table-row-cell:selected .tree-table-cell {
|
||||
-fx-text-fill: BLACK;
|
||||
}
|
||||
|
||||
.tree-table-view .jfx-rippler {
|
||||
-jfx-rippler-fill: -fx-tree-table-rippler-color;
|
||||
}
|
||||
|
||||
.tree-table-view .column-header,
|
||||
.tree-table-view .column-header-background,
|
||||
.tree-table-view .column-header-background .filler {
|
||||
-fx-background-color: TRANSPARENT;
|
||||
}
|
||||
|
||||
.tree-table-view .column-header {
|
||||
-fx-border-width: 0 1 0 1;
|
||||
-fx-border-color: #F3F3F3;
|
||||
}
|
||||
|
||||
.tree-table-view .column-header .label {
|
||||
-fx-text-fill: #949494;
|
||||
-fx-padding: 16 0 16 0;
|
||||
}
|
||||
|
||||
.tree-table-view .column-header .arrow, .tree-table-view .column-header .sort-order-dot {
|
||||
-fx-background-color: #949494;
|
||||
}
|
||||
|
||||
.tree-table-view .column-header:last-visible {
|
||||
-fx-border-width: 0 2 0 1;
|
||||
}
|
||||
|
||||
.tree-table-view .column-header-background {
|
||||
-fx-border-width: 0 0.0 1 0;
|
||||
-fx-border-color: #F3F3F3;
|
||||
}
|
||||
|
||||
.tree-table-view .tree-table-cell {
|
||||
-fx-border-width: 0 0 0 0;
|
||||
-fx-padding: 16 0 16 0;
|
||||
}
|
||||
|
||||
.tree-table-view .column-overlay {
|
||||
-fx-background-color: -fx-tree-table-color;
|
||||
}
|
||||
|
||||
.tree-table-view .column-resize-line, .tree-table-view .column-drag-header {
|
||||
-fx-background-color: -fx-tree-table-rippler-color;
|
||||
}
|
||||
|
||||
.tree-table-view:focused {
|
||||
-fx-background-color: -fx-tree-table-color, -fx-box-border, -fx-control-inner-background;
|
||||
-fx-background-insets: -1.4, 0, 1;
|
||||
-fx-background-radius: 1.4, 0, 0;
|
||||
/*....*/
|
||||
-fx-padding: 1; /* 0.083333em; */
|
||||
}
|
||||
|
||||
.tree-table-row-cell > .tree-disclosure-node > .arrow {
|
||||
-fx-background-color: -fx-text-fill;
|
||||
-fx-padding: 0.333333em 0.229em 0.333333em 0.229em; /* 4 */
|
||||
-fx-shape: "M 0 -3.5 L 4 0 L 0 3.5 z";
|
||||
}
|
||||
|
||||
.tree-table-row-cell .jfx-text-field {
|
||||
-fx-focus-color: rgba(240, 40, 40);
|
||||
}
|
||||
|
||||
.tree-table-row-group {
|
||||
-fx-background-color: rgba(230, 230, 230);
|
||||
}
|
||||
|
||||
.animated-option-button {
|
||||
-fx-pref-width: 50px;
|
||||
-fx-background-color: #44B449;
|
||||
-fx-background-radius: 50px;
|
||||
-fx-pref-height: 50px;
|
||||
-fx-text-fill: white;
|
||||
-fx-border-color: WHITE;
|
||||
-fx-border-radius: 50px;
|
||||
-fx-border-width: 4px;
|
||||
}
|
||||
|
||||
.animated-option-sub-button {
|
||||
-fx-background-color: #43609C;
|
||||
}
|
||||
|
||||
.animated-option-sub-button2 {
|
||||
-fx-background-color: rgb(203, 104, 96);
|
||||
}
|
||||
|
||||
.tree-table-view .menu-item:focused {
|
||||
-fx-background-color: -fx-tree-table-color;
|
||||
|
||||
}
|
||||
|
||||
.tree-table-view .menu-item .label {
|
||||
-fx-padding: 5 0 5 0;
|
||||
}
|
||||
|
||||
|
||||
1033
HMCL/out/production/resources/assets/css/jfoenix-main-demo.css
Normal file
1033
HMCL/out/production/resources/assets/css/jfoenix-main-demo.css
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,29 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import com.jfoenix.controls.JFXListView?>
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.layout.BorderPane?>
|
||||
<?import javafx.scene.layout.StackPane?>
|
||||
<fx:root xmlns="http://javafx.com/javafx"
|
||||
xmlns:fx="http://javafx.com/fxml"
|
||||
type="StackPane"
|
||||
prefHeight="400.0" prefWidth="600.0">
|
||||
<JFXListView fx:id="list" styleClass="jfx-list-view" maxWidth="300" maxHeight="100">
|
||||
<BorderPane mouseTransparent="true">
|
||||
<left>
|
||||
<Label>Install New Game</Label>
|
||||
</left>
|
||||
<right>
|
||||
<fx:include source="/assets/svg/arrow-right.fxml"/>
|
||||
</right>
|
||||
</BorderPane>
|
||||
<BorderPane mouseTransparent="true">
|
||||
<left>
|
||||
<Label>Install Modpack (CurseForge supported)</Label>
|
||||
</left>
|
||||
<right>
|
||||
<fx:include source="/assets/svg/arrow-right.fxml"/>
|
||||
</right>
|
||||
</BorderPane>
|
||||
</JFXListView>
|
||||
</fx:root>
|
||||
@@ -0,0 +1,54 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import com.jfoenix.controls.JFXListView?>
|
||||
<?import javafx.scene.layout.StackPane?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.layout.BorderPane?>
|
||||
<?import com.jfoenix.controls.JFXButton?>
|
||||
<?import javafx.scene.layout.HBox?>
|
||||
<fx:root xmlns="http://javafx.com/javafx"
|
||||
xmlns:fx="http://javafx.com/fxml"
|
||||
type="StackPane">
|
||||
<BorderPane>
|
||||
<top>
|
||||
<HBox alignment="CENTER" style="-fx-padding: 40px;">
|
||||
<Label fx:id="lblGameVersion" alignment="CENTER" />
|
||||
</HBox>
|
||||
</top>
|
||||
<center>
|
||||
<JFXListView fx:id="list" styleClass="jfx-list-view" maxHeight="150" maxWidth="300">
|
||||
<BorderPane mouseTransparent="true">
|
||||
<left>
|
||||
<Label fx:id="lblForge">Install Forge</Label>
|
||||
</left>
|
||||
<right>
|
||||
<fx:include source="/assets/svg/arrow-right.fxml"/>
|
||||
</right>
|
||||
</BorderPane>
|
||||
<BorderPane mouseTransparent="true">
|
||||
<left>
|
||||
<Label fx:id="lblLiteLoader">Install LiteLoader</Label>
|
||||
</left>
|
||||
<right>
|
||||
<fx:include source="/assets/svg/arrow-right.fxml"/>
|
||||
</right>
|
||||
</BorderPane>
|
||||
<BorderPane mouseTransparent="true">
|
||||
<left>
|
||||
<Label fx:id="lblOptiFine">Install OptiFine</Label>
|
||||
</left>
|
||||
<right>
|
||||
<fx:include source="/assets/svg/arrow-right.fxml"/>
|
||||
</right>
|
||||
</BorderPane>
|
||||
</JFXListView>
|
||||
</center>
|
||||
<bottom>
|
||||
<HBox alignment="CENTER">
|
||||
<JFXButton fx:id="buttonLaunch" prefWidth="100" prefHeight="40" buttonType="RAISED" text="Install"
|
||||
style="-fx-text-fill:WHITE;-fx-background-color:#5264AE;-fx-font-size:14px;"/>
|
||||
</HBox>
|
||||
</bottom>
|
||||
</BorderPane>
|
||||
</fx:root>
|
||||
@@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import javafx.scene.control.*?>
|
||||
<?import javafx.scene.layout.*?>
|
||||
|
||||
<fx:root xmlns="http://javafx.com/javafx"
|
||||
xmlns:fx="http://javafx.com/fxml"
|
||||
type="BorderPane" pickOnBounds="false">
|
||||
<left>
|
||||
<VBox alignment="CENTER_LEFT" mouseTransparent="true">
|
||||
<Label fx:id="lblSelfVersion" style="-fx-font-size: 15;" />
|
||||
</VBox>
|
||||
</left>
|
||||
<center>
|
||||
<VBox alignment="CENTER" mouseTransparent="true">
|
||||
<Label alignment="CENTER" fx:id="lblGameVersion" style="-fx-color: gray;" />
|
||||
</VBox>
|
||||
</center>
|
||||
<right>
|
||||
<fx:include source="/assets/svg/arrow-right.fxml" />
|
||||
</right>
|
||||
</fx:root>
|
||||
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import com.jfoenix.controls.JFXListView?>
|
||||
<?import javafx.scene.layout.StackPane?>
|
||||
<?import com.jfoenix.controls.JFXSpinner?>
|
||||
<fx:root xmlns="http://javafx.com/javafx"
|
||||
xmlns:fx="http://javafx.com/fxml"
|
||||
type="StackPane"
|
||||
prefHeight="400.0" prefWidth="600.0">
|
||||
<JFXSpinner fx:id="spinner" style="-fx-radius:16" styleClass="materialDesign-purple, first-spinner" />
|
||||
<JFXListView fx:id="list" styleClass="jfx-list-view">
|
||||
</JFXListView>
|
||||
</fx:root>
|
||||
44
HMCL/out/production/resources/assets/fxml/main.fxml
Normal file
44
HMCL/out/production/resources/assets/fxml/main.fxml
Normal file
@@ -0,0 +1,44 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import javafx.scene.control.*?>
|
||||
<?import javafx.scene.layout.*?>
|
||||
<?import com.jfoenix.controls.*?>
|
||||
<BorderPane
|
||||
maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity"
|
||||
fx:controller="org.jackhuang.hmcl.ui.MainController"
|
||||
style="-fx-background-color: white;"
|
||||
xmlns="http://javafx.com/javafx/8.0.112" xmlns:fx="http://javafx.com/fxml/1">
|
||||
<center>
|
||||
<StackPane fx:id="page" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" />
|
||||
</center>
|
||||
<left>
|
||||
<BorderPane prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER">
|
||||
<top>
|
||||
<JFXComboBox fx:id="comboProfiles" prefWidth="150.0" BorderPane.alignment="CENTER" />
|
||||
</top>
|
||||
<center>
|
||||
<StackPane>
|
||||
<JFXListView fx:id="listVersions" styleClass="mylistview" style="-fx-background-color: #F1F1F1;" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" />
|
||||
<AnchorPane pickOnBounds="false">
|
||||
<JFXButton onMouseClicked="#installNewVersion" AnchorPane.bottomAnchor="16" AnchorPane.rightAnchor="16" buttonType="RAISED" prefWidth="40" prefHeight="40" style="-fx-text-fill:WHITE;-fx-background-color:#5264AE;-fx-font-size:14px;-fx-background-radius: 80px;">
|
||||
<graphic>
|
||||
<fx:include source="/assets/svg/plus.fxml" />
|
||||
</graphic>
|
||||
</JFXButton>
|
||||
</AnchorPane>
|
||||
</StackPane>
|
||||
</center>
|
||||
</BorderPane>
|
||||
</left>
|
||||
<bottom>
|
||||
<BorderPane prefHeight="50.0" prefWidth="200.0" BorderPane.alignment="CENTER">
|
||||
<right>
|
||||
<StackPane prefHeight="50.0" prefWidth="150.0" BorderPane.alignment="CENTER">
|
||||
<JFXSpinner fx:id="spinner" style="-fx-radius:16" styleClass="materialDesign-purple, first-spinner" />
|
||||
<JFXButton fx:id="buttonLaunch" prefWidth="100" prefHeight="40" buttonType="RAISED" text="Launch"
|
||||
style="-fx-text-fill:WHITE;-fx-background-color:#5264AE;-fx-font-size:14px;"/>
|
||||
</StackPane>
|
||||
</right>
|
||||
</BorderPane>
|
||||
</bottom>
|
||||
</BorderPane>
|
||||
@@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import javafx.scene.control.*?>
|
||||
<?import javafx.scene.layout.*?>
|
||||
|
||||
<?import com.jfoenix.controls.JFXButton?>
|
||||
<fx:root xmlns="http://javafx.com/javafx"
|
||||
xmlns:fx="http://javafx.com/fxml"
|
||||
style="-fx-background-color: transparent; "
|
||||
type="BorderPane" pickOnBounds="false">
|
||||
<left>
|
||||
<VBox alignment="CENTER_LEFT" mouseTransparent="true">
|
||||
<Label fx:id="lblVersionName" style="-fx-font-size: 15;" />
|
||||
<Label fx:id="lblGameVersion" />
|
||||
</VBox>
|
||||
</left>
|
||||
<right>
|
||||
<HBox>
|
||||
<JFXButton onMouseClicked="#onSettings" styleClass="toggle-icon3">
|
||||
<graphic>
|
||||
<fx:include source="/assets/svg/gear.fxml"/>
|
||||
</graphic>
|
||||
</JFXButton>
|
||||
<JFXButton onMouseClicked="#onLaunch" styleClass="toggle-icon3">
|
||||
<graphic>
|
||||
<fx:include source="/assets/svg/rocket.fxml"/>
|
||||
</graphic>
|
||||
</JFXButton>
|
||||
</HBox>
|
||||
</right>
|
||||
</fx:root>
|
||||
109
HMCL/out/production/resources/assets/fxml/version.fxml
Normal file
109
HMCL/out/production/resources/assets/fxml/version.fxml
Normal file
@@ -0,0 +1,109 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import com.jfoenix.controls.*?>
|
||||
<?import javafx.collections.FXCollections?>
|
||||
<?import javafx.geometry.Insets?>
|
||||
<?import javafx.scene.control.*?>
|
||||
<?import javafx.scene.layout.*?>
|
||||
<StackPane xmlns="http://javafx.com/javafx"
|
||||
xmlns:fx="http://javafx.com/fxml"
|
||||
fx:controller="org.jackhuang.hmcl.ui.VersionController">
|
||||
<VBox spacing="20" GridPane.rowIndex="0">
|
||||
<JFXToolbar maxHeight="20" styleClass="jfx-tool-bar">
|
||||
<leftItems>
|
||||
<JFXButton fx:id="backButton" maxHeight="20" styleClass="toggle-icon3"
|
||||
StackPane.alignment="CENTER_LEFT">
|
||||
<graphic>
|
||||
<fx:include source="/assets/svg/arrow-left.fxml" />
|
||||
</graphic>
|
||||
<StackPane.margin>
|
||||
<Insets left="20" />
|
||||
</StackPane.margin>
|
||||
</JFXButton>
|
||||
<Label fx:id="titleLabel" style="-fx-text-fill:WHITE; -fx-font-size: 20;"
|
||||
StackPane.alignment="CENTER_LEFT"/>
|
||||
</leftItems>
|
||||
<rightItems>
|
||||
|
||||
</rightItems>
|
||||
</JFXToolbar>
|
||||
<ScrollPane fx:id="scroll"
|
||||
style="-fx-margin: 10; -fx-background-color: white; -fx-font-size: 14; -fx-pref-width: 100%; "
|
||||
fitToHeight="true" fitToWidth="true">
|
||||
<VBox.margin>
|
||||
<Insets left="10" right="10"/>
|
||||
</VBox.margin>
|
||||
<VBox>
|
||||
<GridPane fx:id="settingsPane" style="-fx-margin-left: 10; -fx-background-color: white; " hgap="5" vgap="10">
|
||||
<Label GridPane.rowIndex="0" GridPane.columnIndex="0">Java Directory</Label>
|
||||
<Label GridPane.rowIndex="1" GridPane.columnIndex="0">Max Memory</Label>
|
||||
<Label GridPane.rowIndex="2" GridPane.columnIndex="0">Launcher Visibility</Label>
|
||||
<Label GridPane.rowIndex="3" GridPane.columnIndex="0">Run Directory</Label>
|
||||
<Label GridPane.rowIndex="4" GridPane.columnIndex="0">Dimension</Label>
|
||||
<Label GridPane.rowIndex="5" GridPane.columnIndex="0"> </Label>
|
||||
|
||||
<JFXTextField styleClass="fit-width" fx:id="txtGameDir" GridPane.rowIndex="0" GridPane.columnIndex="1"
|
||||
maxWidth="Infinity"/>
|
||||
<BorderPane GridPane.rowIndex="1" GridPane.columnIndex="1" GridPane.columnSpan="2">
|
||||
<left>
|
||||
<JFXTextField fx:id="txtMaxMemory" maxWidth="Infinity"/>
|
||||
</left>
|
||||
<right>
|
||||
<Label>Physical Memory: 16000MB
|
||||
<BorderPane.margin>
|
||||
<Insets right="7"/>
|
||||
</BorderPane.margin>
|
||||
</Label>
|
||||
</right>
|
||||
</BorderPane>
|
||||
<JFXComboBox fx:id="cboLauncherVisibility" GridPane.rowIndex="2" GridPane.columnIndex="1"
|
||||
GridPane.columnSpan="2" maxWidth="Infinity">
|
||||
<items>
|
||||
<FXCollections fx:factory="observableArrayList">
|
||||
<Label>Close</Label>
|
||||
<Label>Hide</Label>
|
||||
<Label>Keep</Label>
|
||||
<Label>Hide and Reopen</Label>
|
||||
</FXCollections>
|
||||
</items>
|
||||
</JFXComboBox>
|
||||
<JFXComboBox fx:id="cboRunDirectory" GridPane.rowIndex="3" GridPane.columnIndex="1"
|
||||
GridPane.columnSpan="2" maxWidth="Infinity">
|
||||
<items>
|
||||
<FXCollections fx:factory="observableArrayList">
|
||||
<Label>Default(.minecraft/)</Label>
|
||||
<Label>Divided(.minecraft/versions/<versionName>)</Label>
|
||||
</FXCollections>
|
||||
</items>
|
||||
</JFXComboBox>
|
||||
<BorderPane GridPane.rowIndex="4" GridPane.columnIndex="1" GridPane.columnSpan="2">
|
||||
<left>
|
||||
<HBox prefWidth="210">
|
||||
<JFXTextField fx:id="txtWidth" promptText="800" prefWidth="100"/>
|
||||
<Label>x</Label>
|
||||
<JFXTextField fx:id="txtHeight" promptText="480" prefWidth="100"/>
|
||||
</HBox>
|
||||
</left>
|
||||
<right>
|
||||
<JFXCheckBox fx:id="chkFullscreen" text="Fullscreen" alignment="CENTER">
|
||||
<BorderPane.margin>
|
||||
<Insets right="7"/>
|
||||
</BorderPane.margin>
|
||||
</JFXCheckBox>
|
||||
</right>
|
||||
</BorderPane>
|
||||
|
||||
<JFXButton GridPane.rowIndex="0" GridPane.columnIndex="2" text="Explore" onMouseClicked="#onExploreJavaDir" />
|
||||
</GridPane>
|
||||
<VBox fx:id="advancedSettingsPane" style="-fx-padding-bottom: 10; -fx-background-color: white; " spacing="30">
|
||||
<JFXTextField labelFloat="true" promptText="JVM Args" styleClass="fit-width" fx:id="txtJVMArgs" maxWidth="Infinity"/>
|
||||
<JFXTextField labelFloat="true" promptText="Game Args" styleClass="fit-width" fx:id="txtGameArgs" maxWidth="Infinity"/>
|
||||
<JFXTextField labelFloat="true" promptText="Metaspace" styleClass="fit-width" fx:id="txtMetaspace" maxWidth="Infinity"/>
|
||||
<JFXTextField labelFloat="true" promptText="Wrapper Launcher(like optirun)" styleClass="fit-width" fx:id="txtWrapper" maxWidth="Infinity"/>
|
||||
<JFXTextField labelFloat="true" promptText="Pre-calling command" styleClass="fit-width" fx:id="txtPrecallingCommand" maxWidth="Infinity"/>
|
||||
<JFXTextField labelFloat="true" promptText="Server IP" styleClass="fit-width" fx:id="txtServerIP" maxWidth="Infinity"/>
|
||||
</VBox>
|
||||
</VBox>
|
||||
</ScrollPane>
|
||||
</VBox>
|
||||
</StackPane>
|
||||
47
HMCL/out/production/resources/assets/fxml/wizard.fxml
Normal file
47
HMCL/out/production/resources/assets/fxml/wizard.fxml
Normal file
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import com.jfoenix.controls.JFXButton?>
|
||||
<?import com.jfoenix.controls.JFXToolbar?>
|
||||
<?import javafx.geometry.Insets?>
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.layout.*?>
|
||||
<fx:root xmlns="http://javafx.com/javafx"
|
||||
type="StackPane"
|
||||
xmlns:fx="http://javafx.com/fxml">
|
||||
<VBox>
|
||||
<JFXToolbar fx:id="toolbar" maxHeight="20" styleClass="jfx-tool-bar">
|
||||
<leftItems>
|
||||
<JFXButton fx:id="closeButton" maxHeight="20" styleClass="toggle-icon3"
|
||||
StackPane.alignment="CENTER_RIGHT" onMouseClicked="#close">
|
||||
<graphic>
|
||||
<fx:include source="/assets/svg/close.fxml"/>
|
||||
</graphic>
|
||||
<StackPane.margin>
|
||||
<Insets left="20"/>
|
||||
</StackPane.margin>
|
||||
</JFXButton>
|
||||
<JFXButton fx:id="backButton" maxHeight="20" styleClass="toggle-icon3"
|
||||
StackPane.alignment="CENTER_LEFT" onMouseClicked="#back">
|
||||
<graphic>
|
||||
<fx:include source="/assets/svg/arrow-left.fxml"/>
|
||||
</graphic>
|
||||
</JFXButton>
|
||||
<Label fx:id="titleLabel" style="-fx-text-fill:WHITE; -fx-font-size: 15;"
|
||||
StackPane.alignment="CENTER_LEFT"/>
|
||||
</leftItems>
|
||||
<rightItems>
|
||||
<JFXButton fx:id="refreshButton" maxHeight="20" styleClass="toggle-icon3" disable="true"
|
||||
StackPane.alignment="CENTER_RIGHT">
|
||||
<graphic>
|
||||
<fx:include source="/assets/svg/refresh.fxml"/>
|
||||
</graphic>
|
||||
<StackPane.margin>
|
||||
<Insets left="20"/>
|
||||
</StackPane.margin>
|
||||
</JFXButton>
|
||||
</rightItems>
|
||||
</JFXToolbar>
|
||||
|
||||
<StackPane fx:id="root"/>
|
||||
</VBox>
|
||||
</fx:root>
|
||||
2
HMCL/out/production/resources/assets/svg/arrow-left.fxml
Normal file
2
HMCL/out/production/resources/assets/svg/arrow-left.fxml
Normal file
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<javafx.scene.shape.SVGPath fill="white" content="M20,11V13H8L13.5,18.5L12.08,19.92L4.16,12L12.08,4.08L13.5,5.5L8,11H20Z" />
|
||||
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<javafx.scene.shape.SVGPath content="M4,11V13H16L10.5,18.5L11.92,19.92L19.84,12L11.92,4.08L10.5,5.5L16,11H4Z" />
|
||||
2
HMCL/out/production/resources/assets/svg/close.fxml
Normal file
2
HMCL/out/production/resources/assets/svg/close.fxml
Normal file
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<javafx.scene.shape.SVGPath fill="white" content="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z" />
|
||||
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<javafx.scene.shape.SVGPath fill="white" content="M12,16A2,2 0 0,1 14,18A2,2 0 0,1 12,20A2,2 0 0,1 10,18A2,2 0 0,1 12,16M12,10A2,2 0 0,1 14,12A2,2 0 0,1 12,14A2,2 0 0,1 10,12A2,2 0 0,1 12,10M12,4A2,2 0 0,1 14,6A2,2 0 0,1 12,8A2,2 0 0,1 10,6A2,2 0 0,1 12,4Z" />
|
||||
2
HMCL/out/production/resources/assets/svg/gear.fxml
Normal file
2
HMCL/out/production/resources/assets/svg/gear.fxml
Normal file
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<javafx.scene.shape.SVGPath content="M12,15.5A3.5,3.5 0 0,1 8.5,12A3.5,3.5 0 0,1 12,8.5A3.5,3.5 0 0,1 15.5,12A3.5,3.5 0 0,1 12,15.5M19.43,12.97C19.47,12.65 19.5,12.33 19.5,12C19.5,11.67 19.47,11.34 19.43,11L21.54,9.37C21.73,9.22 21.78,8.95 21.66,8.73L19.66,5.27C19.54,5.05 19.27,4.96 19.05,5.05L16.56,6.05C16.04,5.66 15.5,5.32 14.87,5.07L14.5,2.42C14.46,2.18 14.25,2 14,2H10C9.75,2 9.54,2.18 9.5,2.42L9.13,5.07C8.5,5.32 7.96,5.66 7.44,6.05L4.95,5.05C4.73,4.96 4.46,5.05 4.34,5.27L2.34,8.73C2.21,8.95 2.27,9.22 2.46,9.37L4.57,11C4.53,11.34 4.5,11.67 4.5,12C4.5,12.33 4.53,12.65 4.57,12.97L2.46,14.63C2.27,14.78 2.21,15.05 2.34,15.27L4.34,18.73C4.46,18.95 4.73,19.03 4.95,18.95L7.44,17.94C7.96,18.34 8.5,18.68 9.13,18.93L9.5,21.58C9.54,21.82 9.75,22 10,22H14C14.25,22 14.46,21.82 14.5,21.58L14.87,18.93C15.5,18.67 16.04,18.34 16.56,17.94L19.05,18.95C19.27,19.03 19.54,18.95 19.66,18.73L21.66,15.27C21.78,15.05 21.73,14.78 21.54,14.63L19.43,12.97Z" />
|
||||
2
HMCL/out/production/resources/assets/svg/plus.fxml
Normal file
2
HMCL/out/production/resources/assets/svg/plus.fxml
Normal file
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<javafx.scene.shape.SVGPath fill="white" content="M19,13H13V19H11V13H5V11H11V5H13V11H19V13Z" />
|
||||
2
HMCL/out/production/resources/assets/svg/refresh.fxml
Normal file
2
HMCL/out/production/resources/assets/svg/refresh.fxml
Normal file
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<javafx.scene.shape.SVGPath fill="white" content="M17.65,6.35C16.2,4.9 14.21,4 12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20C15.73,20 18.84,17.45 19.73,14H17.65C16.83,16.33 14.61,18 12,18A6,6 0 0,1 6,12A6,6 0 0,1 12,6C13.66,6 15.14,6.69 16.22,7.78L13,11H20V4L17.65,6.35Z" />
|
||||
2
HMCL/out/production/resources/assets/svg/rocket.fxml
Normal file
2
HMCL/out/production/resources/assets/svg/rocket.fxml
Normal file
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<javafx.scene.shape.SVGPath content="M2.81,14.12L5.64,11.29L8.17,10.79C11.39,6.41 17.55,4.22 19.78,4.22C19.78,6.45 17.59,12.61 13.21,15.83L12.71,18.36L9.88,21.19L9.17,17.66C7.76,17.66 7.76,17.66 7.05,16.95C6.34,16.24 6.34,16.24 6.34,14.83L2.81,14.12M5.64,16.95L7.05,18.36L4.39,21.03H2.97V19.61L5.64,16.95M4.22,15.54L5.46,15.71L3,18.16V16.74L4.22,15.54M8.29,18.54L8.46,19.78L7.26,21H5.84L8.29,18.54M13,9.5A1.5,1.5 0 0,0 11.5,11A1.5,1.5 0 0,0 13,12.5A1.5,1.5 0 0,0 14.5,11A1.5,1.5 0 0,0 13,9.5Z" />
|
||||
2
HMCL/settings.gradle
Normal file
2
HMCL/settings.gradle
Normal file
@@ -0,0 +1,2 @@
|
||||
rootProject.name = 'HMCL'
|
||||
|
||||
61
HMCL/src/main/java/org/jackhuang/hmcl/Main.kt
Normal file
61
HMCL/src/main/java/org/jackhuang/hmcl/Main.kt
Normal file
@@ -0,0 +1,61 @@
|
||||
/*
|
||||
* Hello Minecraft! Launcher.
|
||||
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
*/
|
||||
package org.jackhuang.hmcl
|
||||
|
||||
import javafx.application.Application
|
||||
import javafx.stage.Stage
|
||||
import org.jackhuang.hmcl.ui.Controllers
|
||||
import org.jackhuang.hmcl.util.DEFAULT_USER_AGENT
|
||||
import org.jackhuang.hmcl.util.OS
|
||||
import java.io.File
|
||||
|
||||
class MainApplication : Application() {
|
||||
|
||||
override fun start(stage: Stage) {
|
||||
Controllers.initialize(stage)
|
||||
|
||||
stage.isResizable = false
|
||||
stage.scene = Controllers.scene
|
||||
stage.show()
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
@JvmStatic
|
||||
fun main(args: Array<String>) {
|
||||
DEFAULT_USER_AGENT = "Hello Minecraft! Launcher"
|
||||
|
||||
launch(MainApplication::class.java, *args)
|
||||
}
|
||||
|
||||
fun getWorkingDirectory(folder: String): File {
|
||||
val userhome = System.getProperty("user.home", ".")
|
||||
return when (OS.CURRENT_OS) {
|
||||
OS.LINUX -> File(userhome, ".$folder/")
|
||||
OS.WINDOWS -> {
|
||||
val appdata: String? = System.getenv("APPDATA")
|
||||
File(appdata ?: userhome, ".$folder/")
|
||||
}
|
||||
OS.OSX -> File(userhome, "Library/Application Support/" + folder)
|
||||
else -> File(userhome, "$folder/")
|
||||
}
|
||||
}
|
||||
|
||||
fun getMinecraftDirectory(): File = getWorkingDirectory("minecraft")
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* Hello Minecraft! Launcher.
|
||||
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
*/
|
||||
package org.jackhuang.hmcl.game
|
||||
|
||||
import org.jackhuang.hmcl.util.LOG
|
||||
import java.io.File
|
||||
import java.io.IOException
|
||||
import java.util.logging.Level
|
||||
|
||||
class HMCLGameRepository(baseDirectory: File)
|
||||
: DefaultGameRepository(baseDirectory) {
|
||||
|
||||
val PROFILE = "{\"selectedProfile\": \"(Default)\",\"profiles\": {\"(Default)\": {\"name\": \"(Default)\"}},\"clientToken\": \"88888888-8888-8888-8888-888888888888\"}"
|
||||
|
||||
@Synchronized
|
||||
override fun refreshVersions() {
|
||||
super.refreshVersions()
|
||||
|
||||
try {
|
||||
val file = baseDirectory.resolve("launcher_profiles.json")
|
||||
if (!file.exists())
|
||||
file.writeText(PROFILE)
|
||||
} catch (ex: IOException) {
|
||||
LOG.log(Level.WARNING, "Unable to create launcher_profiles.json, Forge/LiteLoader installer will not work.", ex)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
* Hello Minecraft! Launcher.
|
||||
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
*/
|
||||
package org.jackhuang.hmcl.setting
|
||||
|
||||
enum class EnumGameDirectory {
|
||||
ROOT_FOLDER,
|
||||
VERSION_FOLDER
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
* Hello Minecraft! Launcher.
|
||||
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
*/
|
||||
package org.jackhuang.hmcl.setting
|
||||
|
||||
/**
|
||||
* The visibility of launcher.
|
||||
* @author huangyuhui
|
||||
*/
|
||||
enum class LauncherVisibility {
|
||||
|
||||
/**
|
||||
* Close the launcher anyway when the game process created even if failed to
|
||||
* launch game.
|
||||
*/
|
||||
CLOSE,
|
||||
|
||||
/**
|
||||
* Hide the launcher when the game process created, if failed to launch
|
||||
* game, will show the log window.
|
||||
*/
|
||||
HIDE,
|
||||
|
||||
/**
|
||||
* Keep the launcher visible even if the game launched successfully.
|
||||
*/
|
||||
KEEP,
|
||||
|
||||
/**
|
||||
* Hide the launcher and reopen it when game closes.
|
||||
*/
|
||||
HIDE_AND_REOPEN
|
||||
}
|
||||
232
HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionSetting.kt
Normal file
232
HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionSetting.kt
Normal file
@@ -0,0 +1,232 @@
|
||||
/*
|
||||
* Hello Minecraft! Launcher.
|
||||
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
*/
|
||||
package org.jackhuang.hmcl.setting
|
||||
|
||||
import com.google.gson.*
|
||||
import javafx.beans.property.*
|
||||
import org.jackhuang.hmcl.util.*
|
||||
import java.lang.reflect.Type
|
||||
|
||||
class VersionSetting() {
|
||||
|
||||
/**
|
||||
* The displayed name.
|
||||
*/
|
||||
val nameProperty = SimpleStringProperty(this, "name", "")
|
||||
var name: String by nameProperty
|
||||
|
||||
/**
|
||||
* HMCL Version Settings have been divided into 2 parts.
|
||||
* 1. Global settings.
|
||||
* 2. Version settings.
|
||||
* If a version claims that it uses global settings, its version setting will be disabled.
|
||||
*
|
||||
* Defaults false because if one version uses global first, custom version file will not be generated.
|
||||
*/
|
||||
val usesGlobalProperty = SimpleBooleanProperty(this, "usesGlobal", false)
|
||||
var usesGlobal: Boolean by usesGlobalProperty
|
||||
|
||||
// java
|
||||
|
||||
/**
|
||||
* Java version or null if user customizes java directory.
|
||||
*/
|
||||
val javaProperty = SimpleStringProperty(this, "java", null)
|
||||
var java: String? by javaProperty
|
||||
|
||||
/**
|
||||
* User customized java directory or null if user uses system Java.
|
||||
*/
|
||||
val javaDirProperty = SimpleStringProperty(this, "javaDir", "")
|
||||
var javaDir: String by javaDirProperty
|
||||
|
||||
/**
|
||||
* The command to launch java, i.e. optirun.
|
||||
*/
|
||||
val wrapperProperty = SimpleStringProperty(this, "wrapper", "")
|
||||
var wrapper: String by wrapperProperty
|
||||
|
||||
/**
|
||||
* The permanent generation size of JVM garbage collection.
|
||||
*/
|
||||
val permSizeProperty = SimpleIntegerProperty(this, "permSize", 0)
|
||||
var permSize: Int by permSizeProperty
|
||||
|
||||
/**
|
||||
* The maximum memory that JVM can allocate.
|
||||
* The size of JVM heap.
|
||||
*/
|
||||
val maxMemoryProperty = SimpleIntegerProperty(this, "maxMemory", 0)
|
||||
var maxMemory: Int by maxMemoryProperty
|
||||
|
||||
/**
|
||||
* The command that will be executed before launching the Minecraft.
|
||||
* Operating system relevant.
|
||||
*/
|
||||
val precalledCommandProperty = SimpleStringProperty(this, "precalledCommand", "")
|
||||
var precalledCommand: String by precalledCommandProperty
|
||||
|
||||
// options
|
||||
|
||||
/**
|
||||
* The user customized arguments passed to JVM.
|
||||
*/
|
||||
val javaArgsProperty = SimpleStringProperty(this, "javaArgs", "")
|
||||
var javaArgs: String by javaArgsProperty
|
||||
|
||||
/**
|
||||
* The user customized arguments passed to Minecraft.
|
||||
*/
|
||||
val minecraftArgsProperty = SimpleStringProperty(this, "minecraftArgs", "")
|
||||
var minecraftArgs: String by minecraftArgsProperty
|
||||
|
||||
/**
|
||||
* True if disallow HMCL use default JVM arguments.
|
||||
*/
|
||||
val noJVMArgsProperty = SimpleBooleanProperty(this, "noJVMArgs", false)
|
||||
var noJVMArgs: Boolean by noJVMArgsProperty
|
||||
|
||||
/**
|
||||
* True if HMCL does not check game's completeness.
|
||||
*/
|
||||
val notCheckGameProperty = SimpleBooleanProperty(this, "notCheckGame", false)
|
||||
var notCheckGame: Boolean by notCheckGameProperty
|
||||
|
||||
// Minecraft settings.
|
||||
|
||||
/**
|
||||
* The server ip that will be entered after Minecraft successfully loaded immediately.
|
||||
*
|
||||
* Format: ip:port or without port.
|
||||
*/
|
||||
val serverIpProperty = SimpleStringProperty(this, "serverIp", "")
|
||||
var serverIp: String by serverIpProperty
|
||||
|
||||
/**
|
||||
* True if Minecraft started in fullscreen mode.
|
||||
*/
|
||||
val fullscreenProperty = SimpleBooleanProperty(this, "fullscreen", false)
|
||||
var fullscreen: Boolean by fullscreenProperty
|
||||
|
||||
/**
|
||||
* The width of Minecraft window, defaults 800.
|
||||
*
|
||||
* The field saves int value.
|
||||
* String type prevents unexpected value from causing JsonSyntaxException.
|
||||
* We can only reset this field instead of recreating the whole setting file.
|
||||
*/
|
||||
val widthProperty = SimpleIntegerProperty(this, "width", 0)
|
||||
var width: Int by widthProperty
|
||||
|
||||
|
||||
/**
|
||||
* The height of Minecraft window, defaults 480.
|
||||
*
|
||||
* The field saves int value.
|
||||
* String type prevents unexpected value from causing JsonSyntaxException.
|
||||
* We can only reset this field instead of recreating the whole setting file.
|
||||
*/
|
||||
val heightProperty = SimpleIntegerProperty(this, "height", 0)
|
||||
var height: Int by heightProperty
|
||||
|
||||
|
||||
/**
|
||||
* 0 - .minecraft<br/>
|
||||
* 1 - .minecraft/versions/<version>/<br/>
|
||||
*/
|
||||
val gameDirTypeProperty = SimpleObjectProperty<EnumGameDirectory>(this, "gameDirTypeProperty", EnumGameDirectory.ROOT_FOLDER)
|
||||
var gameDirType: EnumGameDirectory by gameDirTypeProperty
|
||||
|
||||
// launcher settings
|
||||
|
||||
/**
|
||||
* 0 - Close the launcher when the game starts.<br/>
|
||||
* 1 - Hide the launcher when the game starts.<br/>
|
||||
* 2 - Keep the launcher open.<br/>
|
||||
*/
|
||||
val launcherVisibilityProperty = SimpleObjectProperty<LauncherVisibility>(this, "launcherVisibility", LauncherVisibility.HIDE)
|
||||
var launcherVisibility: LauncherVisibility by launcherVisibilityProperty
|
||||
|
||||
val gameVersion: String
|
||||
get() = "1.7.10"
|
||||
|
||||
companion object Serializer: JsonSerializer<VersionSetting>, JsonDeserializer<VersionSetting> {
|
||||
override fun serialize(src: VersionSetting?, typeOfSrc: Type?, context: JsonSerializationContext?): JsonElement {
|
||||
if (src == null) return JsonNull.INSTANCE
|
||||
val jsonObject = JsonObject()
|
||||
with(jsonObject) {
|
||||
addProperty("name", src.name)
|
||||
addProperty("usesGlobal", src.usesGlobal)
|
||||
addProperty("javaArgs", src.javaArgs)
|
||||
addProperty("minecraftArgs", src.minecraftArgs)
|
||||
addProperty("maxMemory", src.maxMemory)
|
||||
addProperty("permSize", src.permSize)
|
||||
addProperty("width", src.width)
|
||||
addProperty("height", src.height)
|
||||
addProperty("javaDir", src.javaDir)
|
||||
addProperty("precalledCommand", src.precalledCommand)
|
||||
addProperty("serverIp", src.serverIp)
|
||||
addProperty("java", src.java)
|
||||
addProperty("wrapper", src.wrapper)
|
||||
addProperty("fullscreen", src.fullscreen)
|
||||
addProperty("noJVMArgs", src.noJVMArgs)
|
||||
addProperty("notCheckGame", src.notCheckGame)
|
||||
addProperty("launcherVisibility", src.launcherVisibility.ordinal)
|
||||
addProperty("gameDirType", src.gameDirType.ordinal)
|
||||
}
|
||||
|
||||
return jsonObject
|
||||
}
|
||||
|
||||
override fun deserialize(json: JsonElement?, typeOfT: Type?, context: JsonDeserializationContext?): VersionSetting? {
|
||||
if (json == null || json == JsonNull.INSTANCE || json !is JsonObject) return null
|
||||
|
||||
return VersionSetting().apply {
|
||||
name = json["name"]?.asString ?: ""
|
||||
usesGlobal = json["usesGlobal"]?.asBoolean ?: false
|
||||
javaArgs = json["javaArgs"]?.asString ?: ""
|
||||
minecraftArgs = json["minecraftArgs"]?.asString ?: ""
|
||||
maxMemory = parseJsonPrimitive(json["maxMemory"]?.asJsonPrimitive)
|
||||
permSize = parseJsonPrimitive(json["permSize"]?.asJsonPrimitive)
|
||||
width = parseJsonPrimitive(json["width"]?.asJsonPrimitive)
|
||||
height = parseJsonPrimitive(json["height"]?.asJsonPrimitive)
|
||||
javaDir = json["javaDir"]?.asString ?: ""
|
||||
precalledCommand = json["precalledCommand"]?.asString ?: ""
|
||||
serverIp = json["serverIp"]?.asString ?: ""
|
||||
java = json["java"]?.asString
|
||||
wrapper = json["wrapper"]?.asString ?: ""
|
||||
fullscreen = json["fullscreen"]?.asBoolean ?: false
|
||||
noJVMArgs = json["noJVMArgs"]?.asBoolean ?: false
|
||||
notCheckGame = json["notCheckGame"]?.asBoolean ?: false
|
||||
launcherVisibility = LauncherVisibility.values()[json["launcherVisibility"]?.asInt ?: 1]
|
||||
gameDirType = EnumGameDirectory.values()[json["gameDirType"]?.asInt ?: 0]
|
||||
}
|
||||
}
|
||||
|
||||
fun parseJsonPrimitive(primitive: JsonPrimitive?, defaultValue: Int = 0): Int {
|
||||
if (primitive != null)
|
||||
if (primitive.isNumber)
|
||||
return primitive.asInt
|
||||
else
|
||||
return primitive.asString.toIntOrNull() ?: defaultValue
|
||||
else
|
||||
return defaultValue
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
63
HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.kt
Normal file
63
HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.kt
Normal file
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* Hello Minecraft! Launcher.
|
||||
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
*/
|
||||
package org.jackhuang.hmcl.ui
|
||||
|
||||
import javafx.fxml.FXMLLoader
|
||||
import javafx.scene.Node
|
||||
import javafx.scene.Scene
|
||||
import javafx.scene.layout.Pane
|
||||
import javafx.scene.layout.StackPane
|
||||
import javafx.stage.Stage
|
||||
|
||||
object Controllers {
|
||||
lateinit var scene: Scene private set
|
||||
lateinit var stage: Stage private set
|
||||
|
||||
lateinit var mainController: MainController
|
||||
private val mainPane: Pane = loadPane("main")
|
||||
|
||||
lateinit var versionController: VersionController
|
||||
val versionPane: Pane = loadPane("version")
|
||||
|
||||
fun initialize(stage: Stage) {
|
||||
this.stage = stage
|
||||
|
||||
val decorator = Decorator(stage, mainPane, max = false)
|
||||
// Let root pane fix window size.
|
||||
(mainPane.parent as StackPane).run {
|
||||
mainPane.prefWidthProperty().bind(widthProperty())
|
||||
mainPane.prefHeightProperty().bind(heightProperty())
|
||||
}
|
||||
decorator.isCustomMaximize = false
|
||||
|
||||
scene = Scene(decorator, 800.0, 480.0)
|
||||
scene.stylesheets.addAll(Controllers::class.java.getResource("/css/jfoenix-design.css").toExternalForm(),
|
||||
Controllers::class.java.getResource("/assets/css/jfoenix-components.css").toExternalForm(),
|
||||
Controllers::class.java.getResource("/assets/css/jfoenix-main-demo.css").toExternalForm())
|
||||
stage.minWidth = 800.0
|
||||
stage.maxWidth = 800.0
|
||||
stage.maxHeight = 480.0
|
||||
stage.minHeight = 480.0
|
||||
}
|
||||
|
||||
fun navigate(node: Node?) {
|
||||
mainController.setContentPage(node)
|
||||
}
|
||||
|
||||
private fun <T> loadPane(s: String): T = FXMLLoader(Controllers::class.java.getResource("/assets/fxml/$s.fxml")).load()
|
||||
}
|
||||
384
HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.kt
Normal file
384
HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.kt
Normal file
@@ -0,0 +1,384 @@
|
||||
/*
|
||||
* Hello Minecraft! Launcher.
|
||||
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
*/
|
||||
package org.jackhuang.hmcl.ui
|
||||
|
||||
import com.jfoenix.controls.JFXButton
|
||||
import com.jfoenix.svg.SVGGlyph
|
||||
import javafx.animation.*
|
||||
import javafx.application.Platform
|
||||
import javafx.beans.property.BooleanProperty
|
||||
import javafx.beans.property.ObjectProperty
|
||||
import javafx.beans.property.SimpleBooleanProperty
|
||||
import javafx.beans.property.SimpleObjectProperty
|
||||
import javafx.geometry.BoundingBox
|
||||
import javafx.geometry.Bounds
|
||||
import javafx.geometry.Insets
|
||||
import javafx.geometry.Pos
|
||||
import javafx.scene.Cursor
|
||||
import javafx.scene.Node
|
||||
import javafx.scene.control.Button
|
||||
import javafx.scene.control.Label
|
||||
import javafx.scene.control.Tooltip
|
||||
import javafx.scene.input.MouseEvent
|
||||
import javafx.scene.layout.*
|
||||
import javafx.scene.paint.Color
|
||||
import javafx.scene.shape.Rectangle
|
||||
import javafx.stage.Screen
|
||||
import javafx.stage.Stage
|
||||
import javafx.stage.StageStyle
|
||||
import java.util.ArrayList
|
||||
|
||||
class Decorator @JvmOverloads constructor(private val primaryStage: Stage, node: Node, max: Boolean = true, min: Boolean = true) : VBox() {
|
||||
private var xOffset: Double = 0.toDouble()
|
||||
private var yOffset: Double = 0.toDouble()
|
||||
private var newX: Double = 0.toDouble()
|
||||
private var newY: Double = 0.toDouble()
|
||||
private var initX: Double = 0.toDouble()
|
||||
private var initY: Double = 0.toDouble()
|
||||
private var allowMove: Boolean = false
|
||||
private var isDragging: Boolean = false
|
||||
private var windowDecoratorAnimation: Timeline? = null
|
||||
private val contentPlaceHolder: StackPane
|
||||
private val titleContainer: BorderPane
|
||||
private val onCloseButtonAction: ObjectProperty<Runnable>
|
||||
private val customMaximize: BooleanProperty
|
||||
private var maximized: Boolean = false
|
||||
private var originalBox: BoundingBox? = null
|
||||
private var maximizedBox: BoundingBox? = null
|
||||
private val btnMax: JFXButton
|
||||
|
||||
init {
|
||||
this.xOffset = 0.0
|
||||
this.yOffset = 0.0
|
||||
this.allowMove = false
|
||||
this.isDragging = false
|
||||
this.contentPlaceHolder = StackPane()
|
||||
this.onCloseButtonAction = SimpleObjectProperty(Runnable { this.primaryStage.close() })
|
||||
this.customMaximize = SimpleBooleanProperty(false)
|
||||
this.maximized = false
|
||||
this.primaryStage.initStyle(StageStyle.UNDECORATED)
|
||||
this.isPickOnBounds = false
|
||||
this.styleClass.add("jfx-decorator")
|
||||
val minus = SVGGlyph(0, "MINUS", "M804.571 420.571v109.714q0 22.857-16 38.857t-38.857 16h-694.857q-22.857 0-38.857-16t-16-38.857v-109.714q0-22.857 16-38.857t38.857-16h694.857q22.857 0 38.857 16t16 38.857z", Color.WHITE)
|
||||
minus.setSize(12.0, 2.0)
|
||||
minus.translateY = 4.0
|
||||
val resizeMax = SVGGlyph(0, "RESIZE_MAX", "M726 810v-596h-428v596h428zM726 44q34 0 59 25t25 59v768q0 34-25 60t-59 26h-428q-34 0-59-26t-25-60v-768q0-34 25-60t59-26z", Color.WHITE)
|
||||
resizeMax.setSize(12.0, 12.0)
|
||||
val resizeMin = SVGGlyph(0, "RESIZE_MIN", "M80.842 943.158v-377.264h565.894v377.264h-565.894zM0 404.21v619.79h727.578v-619.79h-727.578zM377.264 161.684h565.894v377.264h-134.736v80.842h215.578v-619.79h-727.578v323.37h80.842v-161.686z", Color.WHITE)
|
||||
resizeMin.setSize(12.0, 12.0)
|
||||
val close = SVGGlyph(0, "CLOSE", "M810 274l-238 238 238 238-60 60-238-238-238 238-60-60 238-238-238-238 60-60 238 238 238-238z", Color.WHITE)
|
||||
close.setSize(12.0, 12.0)
|
||||
val btnClose = JFXButton()
|
||||
btnClose.styleClass.add("jfx-decorator-button")
|
||||
btnClose.cursor = Cursor.HAND
|
||||
btnClose.setOnAction { action -> (this.onCloseButtonAction.get() as Runnable).run() }
|
||||
btnClose.graphic = close
|
||||
btnClose.ripplerFill = Color.WHITE
|
||||
val btnMin = JFXButton()
|
||||
btnMin.styleClass.add("jfx-decorator-button")
|
||||
btnMin.cursor = Cursor.HAND
|
||||
btnMin.setOnAction { action -> this.primaryStage.isIconified = true }
|
||||
btnMin.graphic = minus
|
||||
btnMin.ripplerFill = Color.WHITE
|
||||
this.btnMax = JFXButton()
|
||||
this.btnMax.styleClass.add("jfx-decorator-button")
|
||||
this.btnMax.cursor = Cursor.HAND
|
||||
this.btnMax.ripplerFill = Color.WHITE
|
||||
this.btnMax.setOnAction { action ->
|
||||
if (!this.isCustomMaximize) {
|
||||
this.primaryStage.isMaximized = !this.primaryStage.isMaximized
|
||||
this.maximized = this.primaryStage.isMaximized
|
||||
if (this.primaryStage.isMaximized) {
|
||||
this.btnMax.graphic = resizeMin
|
||||
this.btnMax.tooltip = Tooltip("Restore Down")
|
||||
} else {
|
||||
this.btnMax.graphic = resizeMax
|
||||
this.btnMax.tooltip = Tooltip("Maximize")
|
||||
}
|
||||
} else {
|
||||
if (!this.maximized) {
|
||||
this.originalBox = BoundingBox(primaryStage.x, primaryStage.y, primaryStage.width, primaryStage.height)
|
||||
val screen = Screen.getScreensForRectangle(primaryStage.x, primaryStage.y, primaryStage.width, primaryStage.height)[0] as Screen
|
||||
val bounds = screen.visualBounds
|
||||
this.maximizedBox = BoundingBox(bounds.minX, bounds.minY, bounds.width, bounds.height)
|
||||
primaryStage.x = this.maximizedBox!!.minX
|
||||
primaryStage.y = this.maximizedBox!!.minY
|
||||
primaryStage.width = this.maximizedBox!!.width
|
||||
primaryStage.height = this.maximizedBox!!.height
|
||||
this.btnMax.graphic = resizeMin
|
||||
this.btnMax.tooltip = Tooltip("Restore Down")
|
||||
} else {
|
||||
primaryStage.x = this.originalBox!!.minX
|
||||
primaryStage.y = this.originalBox!!.minY
|
||||
primaryStage.width = this.originalBox!!.width
|
||||
primaryStage.height = this.originalBox!!.height
|
||||
this.originalBox = null
|
||||
this.btnMax.graphic = resizeMax
|
||||
this.btnMax.tooltip = Tooltip("Maximize")
|
||||
}
|
||||
|
||||
this.maximized = !this.maximized
|
||||
}
|
||||
|
||||
}
|
||||
this.btnMax.graphic = resizeMax
|
||||
titleContainer = BorderPane()
|
||||
titleContainer.styleClass += "jfx-decorator-buttons-container"
|
||||
titleContainer.isPickOnBounds = false
|
||||
val titleWrapper = HBox()
|
||||
titleWrapper.style += "-fx-padding: 15;"
|
||||
titleWrapper.alignment = Pos.CENTER_LEFT
|
||||
val title = Label("Hello Minecraft! Launcher")
|
||||
title.alignment = Pos.CENTER_LEFT
|
||||
title.style += "--fx-background-color: transparent; -fx-text-fill: white; -fx-font-size: 15px;"
|
||||
title.isMouseTransparent = false
|
||||
titleWrapper.children.setAll(title)
|
||||
titleContainer.left = titleWrapper
|
||||
|
||||
val buttonsContainer = HBox()
|
||||
buttonsContainer.styleClass.add("jfx-decorator-buttons-container")
|
||||
buttonsContainer.background = Background(*arrayOf(BackgroundFill(Color.BLACK, CornerRadii.EMPTY, Insets.EMPTY)))
|
||||
buttonsContainer.padding = Insets(4.0)
|
||||
buttonsContainer.alignment = Pos.CENTER_RIGHT
|
||||
titleContainer.addEventHandler(MouseEvent.MOUSE_CLICKED) { mouseEvent ->
|
||||
if (mouseEvent.clickCount == 2) {
|
||||
this.btnMax.fire()
|
||||
}
|
||||
|
||||
}
|
||||
val btns = ArrayList<Button>()
|
||||
|
||||
if (min) {
|
||||
btns.add(btnMin)
|
||||
}
|
||||
|
||||
if (max) {
|
||||
btns.add(this.btnMax)
|
||||
}
|
||||
|
||||
btns.add(btnClose)
|
||||
buttonsContainer.children.addAll(btns)
|
||||
titleContainer.addEventHandler(MouseEvent.MOUSE_ENTERED) { enter -> this.allowMove = true }
|
||||
titleContainer.addEventHandler(MouseEvent.MOUSE_EXITED) { enter ->
|
||||
if (!this.isDragging) {
|
||||
this.allowMove = false
|
||||
}
|
||||
|
||||
}
|
||||
buttonsContainer.minWidth = 180.0
|
||||
|
||||
titleContainer.right = buttonsContainer
|
||||
this.contentPlaceHolder.styleClass.add("jfx-decorator-content-container")
|
||||
this.contentPlaceHolder.setMinSize(0.0, 0.0)
|
||||
this.contentPlaceHolder.children.add(node)
|
||||
(node as Region).setMinSize(0.0, 0.0)
|
||||
VBox.setVgrow(this.contentPlaceHolder, Priority.ALWAYS)
|
||||
this.contentPlaceHolder.styleClass.add("resize-border")
|
||||
this.contentPlaceHolder.border = Border(*arrayOf(BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, BorderWidths(0.0, 4.0, 4.0, 4.0))))
|
||||
val clip = Rectangle()
|
||||
clip.widthProperty().bind(node.widthProperty())
|
||||
clip.heightProperty().bind(node.heightProperty())
|
||||
node.setClip(clip)
|
||||
this.children.addAll(*arrayOf<Node>(titleContainer, this.contentPlaceHolder))
|
||||
this.setOnMouseMoved { mouseEvent ->
|
||||
if (!this.primaryStage.isMaximized && !this.primaryStage.isFullScreen && !this.maximized) {
|
||||
if (!this.primaryStage.isResizable) {
|
||||
this.updateInitMouseValues(mouseEvent)
|
||||
} else {
|
||||
val x = mouseEvent.x
|
||||
val y = mouseEvent.y
|
||||
val boundsInParent = this.boundsInParent
|
||||
if (this.contentPlaceHolder.border != null && this.contentPlaceHolder.border.strokes.size > 0) {
|
||||
val borderWidth = this.contentPlaceHolder.snappedLeftInset()
|
||||
if (this.isRightEdge(x, y, boundsInParent)) {
|
||||
if (y < borderWidth) {
|
||||
this.cursor = Cursor.NE_RESIZE
|
||||
} else if (y > this.height - borderWidth) {
|
||||
this.cursor = Cursor.SE_RESIZE
|
||||
} else {
|
||||
this.cursor = Cursor.E_RESIZE
|
||||
}
|
||||
} else if (this.isLeftEdge(x, y, boundsInParent)) {
|
||||
if (y < borderWidth) {
|
||||
this.cursor = Cursor.NW_RESIZE
|
||||
} else if (y > this.height - borderWidth) {
|
||||
this.cursor = Cursor.SW_RESIZE
|
||||
} else {
|
||||
this.cursor = Cursor.W_RESIZE
|
||||
}
|
||||
} else if (this.isTopEdge(x, y, boundsInParent)) {
|
||||
this.cursor = Cursor.N_RESIZE
|
||||
} else if (this.isBottomEdge(x, y, boundsInParent)) {
|
||||
this.cursor = Cursor.S_RESIZE
|
||||
} else {
|
||||
this.cursor = Cursor.DEFAULT
|
||||
}
|
||||
|
||||
this.updateInitMouseValues(mouseEvent)
|
||||
}
|
||||
|
||||
}
|
||||
} else {
|
||||
this.cursor = Cursor.DEFAULT
|
||||
}
|
||||
}
|
||||
this.setOnMouseReleased { mouseEvent -> this.isDragging = false }
|
||||
this.setOnMouseDragged { mouseEvent ->
|
||||
this.isDragging = true
|
||||
if (mouseEvent.isPrimaryButtonDown && (this.xOffset != -1.0 || this.yOffset != -1.0)) {
|
||||
if (!this.primaryStage.isFullScreen && !mouseEvent.isStillSincePress && !this.primaryStage.isMaximized && !this.maximized) {
|
||||
this.newX = mouseEvent.screenX
|
||||
this.newY = mouseEvent.screenY
|
||||
val deltax = this.newX - this.initX
|
||||
val deltay = this.newY - this.initY
|
||||
val cursor = this.cursor
|
||||
if (Cursor.E_RESIZE == cursor) {
|
||||
this.setStageWidth(this.primaryStage.width + deltax)
|
||||
mouseEvent.consume()
|
||||
} else if (Cursor.NE_RESIZE == cursor) {
|
||||
if (this.setStageHeight(this.primaryStage.height - deltay)) {
|
||||
this.primaryStage.y = this.primaryStage.y + deltay
|
||||
}
|
||||
|
||||
this.setStageWidth(this.primaryStage.width + deltax)
|
||||
mouseEvent.consume()
|
||||
} else if (Cursor.SE_RESIZE == cursor) {
|
||||
this.setStageWidth(this.primaryStage.width + deltax)
|
||||
this.setStageHeight(this.primaryStage.height + deltay)
|
||||
mouseEvent.consume()
|
||||
} else if (Cursor.S_RESIZE == cursor) {
|
||||
this.setStageHeight(this.primaryStage.height + deltay)
|
||||
mouseEvent.consume()
|
||||
} else if (Cursor.W_RESIZE == cursor) {
|
||||
if (this.setStageWidth(this.primaryStage.width - deltax)) {
|
||||
this.primaryStage.x = this.primaryStage.x + deltax
|
||||
}
|
||||
|
||||
mouseEvent.consume()
|
||||
} else if (Cursor.SW_RESIZE == cursor) {
|
||||
if (this.setStageWidth(this.primaryStage.width - deltax)) {
|
||||
this.primaryStage.x = this.primaryStage.x + deltax
|
||||
}
|
||||
|
||||
this.setStageHeight(this.primaryStage.height + deltay)
|
||||
mouseEvent.consume()
|
||||
} else if (Cursor.NW_RESIZE == cursor) {
|
||||
if (this.setStageWidth(this.primaryStage.width - deltax)) {
|
||||
this.primaryStage.x = this.primaryStage.x + deltax
|
||||
}
|
||||
|
||||
if (this.setStageHeight(this.primaryStage.height - deltay)) {
|
||||
this.primaryStage.y = this.primaryStage.y + deltay
|
||||
}
|
||||
|
||||
mouseEvent.consume()
|
||||
} else if (Cursor.N_RESIZE == cursor) {
|
||||
if (this.setStageHeight(this.primaryStage.height - deltay)) {
|
||||
this.primaryStage.y = this.primaryStage.y + deltay
|
||||
}
|
||||
|
||||
mouseEvent.consume()
|
||||
} else if (this.allowMove) {
|
||||
this.primaryStage.x = mouseEvent.screenX - this.xOffset
|
||||
this.primaryStage.y = mouseEvent.screenY - this.yOffset
|
||||
mouseEvent.consume()
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun updateInitMouseValues(mouseEvent: MouseEvent) {
|
||||
this.initX = mouseEvent.screenX
|
||||
this.initY = mouseEvent.screenY
|
||||
this.xOffset = mouseEvent.sceneX
|
||||
this.yOffset = mouseEvent.sceneY
|
||||
}
|
||||
|
||||
private fun isRightEdge(x: Double, y: Double, boundsInParent: Bounds): Boolean {
|
||||
return x < this.width && x > this.width - this.contentPlaceHolder.snappedLeftInset()
|
||||
}
|
||||
|
||||
private fun isTopEdge(x: Double, y: Double, boundsInParent: Bounds): Boolean {
|
||||
return y >= 0.0 && y < this.contentPlaceHolder.snappedLeftInset()
|
||||
}
|
||||
|
||||
private fun isBottomEdge(x: Double, y: Double, boundsInParent: Bounds): Boolean {
|
||||
return y < this.height && y > this.height - this.contentPlaceHolder.snappedLeftInset()
|
||||
}
|
||||
|
||||
private fun isLeftEdge(x: Double, y: Double, boundsInParent: Bounds): Boolean {
|
||||
return x >= 0.0 && x < this.contentPlaceHolder.snappedLeftInset()
|
||||
}
|
||||
|
||||
internal fun setStageWidth(width: Double): Boolean {
|
||||
var width = width
|
||||
if (width >= this.primaryStage.minWidth && width >= this.titleContainer.minWidth) {
|
||||
this.primaryStage.width = width
|
||||
this.initX = this.newX
|
||||
return true
|
||||
} else {
|
||||
if (width >= this.primaryStage.minWidth && width <= this.titleContainer.minWidth) {
|
||||
width = this.titleContainer.minWidth
|
||||
this.primaryStage.width = width
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
internal fun setStageHeight(height: Double): Boolean {
|
||||
var height = height
|
||||
if (height >= this.primaryStage.minHeight && height >= this.titleContainer.height) {
|
||||
this.primaryStage.height = height
|
||||
this.initY = this.newY
|
||||
return true
|
||||
} else {
|
||||
if (height >= this.primaryStage.minHeight && height <= this.titleContainer.height) {
|
||||
height = this.titleContainer.height
|
||||
this.primaryStage.height = height
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
fun setOnCloseButtonAction(onCloseButtonAction: Runnable) {
|
||||
this.onCloseButtonAction.set(onCloseButtonAction)
|
||||
}
|
||||
|
||||
fun customMaximizeProperty(): BooleanProperty {
|
||||
return this.customMaximize
|
||||
}
|
||||
|
||||
var isCustomMaximize: Boolean
|
||||
get() = this.customMaximizeProperty().get()
|
||||
set(customMaximize) = this.customMaximizeProperty().set(customMaximize)
|
||||
|
||||
fun setMaximized(maximized: Boolean) {
|
||||
if (this.maximized != maximized) {
|
||||
Platform.runLater { this.btnMax.fire() }
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
fun setContent(content: Node) {
|
||||
this.contentPlaceHolder.children.setAll(*arrayOf(content))
|
||||
}
|
||||
}
|
||||
89
HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.kt
Normal file
89
HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.kt
Normal file
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
* Hello Minecraft! Launcher.
|
||||
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
*/
|
||||
package org.jackhuang.hmcl.ui
|
||||
|
||||
import com.jfoenix.concurrency.JFXUtilities
|
||||
import javafx.animation.Animation
|
||||
import javafx.animation.KeyFrame
|
||||
import javafx.animation.Timeline
|
||||
import javafx.event.ActionEvent
|
||||
import javafx.event.EventHandler
|
||||
import javafx.fxml.FXMLLoader
|
||||
import javafx.scene.Node
|
||||
import javafx.scene.control.ListView
|
||||
import javafx.scene.control.ScrollBar
|
||||
import javafx.scene.input.MouseEvent
|
||||
import javafx.scene.input.ScrollEvent
|
||||
import javafx.util.Duration
|
||||
|
||||
fun Node.loadFXML(absolutePath: String) {
|
||||
val fxmlLoader = FXMLLoader(this.javaClass.getResource(absolutePath))
|
||||
fxmlLoader.setRoot(this)
|
||||
fxmlLoader.setController(this)
|
||||
fxmlLoader.load<Any>()
|
||||
}
|
||||
|
||||
fun ListView<*>.smoothScrolling() {
|
||||
skinProperty().addListener { _ ->
|
||||
val bar = lookup(".scroll-bar") as ScrollBar
|
||||
val virtualFlow = lookup(".virtual-flow")
|
||||
val frictions = doubleArrayOf(0.99, 0.1, 0.05, 0.04, 0.03, 0.02, 0.01, 0.04, 0.01, 0.008, 0.008, 0.008, 0.008, 0.0006, 0.0005, 0.00003, 0.00001)
|
||||
val pushes = doubleArrayOf(1.0)
|
||||
val derivatives = DoubleArray(frictions.size)
|
||||
|
||||
val timeline = Timeline()
|
||||
bar.addEventHandler(MouseEvent.DRAG_DETECTED) { timeline.stop() }
|
||||
|
||||
val scrollEventHandler = EventHandler<ScrollEvent> { event ->
|
||||
if (event.eventType == ScrollEvent.SCROLL) {
|
||||
val direction = if (event.deltaY > 0) -1 else 1
|
||||
for (i in pushes.indices) {
|
||||
derivatives[i] += direction * pushes[i]
|
||||
}
|
||||
if (timeline.status == Animation.Status.STOPPED) {
|
||||
timeline.play()
|
||||
}
|
||||
event.consume()
|
||||
}
|
||||
}
|
||||
|
||||
bar.addEventHandler(ScrollEvent.ANY, scrollEventHandler)
|
||||
virtualFlow.onScroll = scrollEventHandler
|
||||
|
||||
timeline.keyFrames.add(KeyFrame(Duration.millis(3.0), EventHandler<ActionEvent> {
|
||||
for (i in derivatives.indices) {
|
||||
derivatives[i] *= frictions[i]
|
||||
}
|
||||
for (i in 1..derivatives.size - 1) {
|
||||
derivatives[i] += derivatives[i - 1]
|
||||
}
|
||||
val dy = derivatives[derivatives.size - 1]
|
||||
val height = layoutBounds.height
|
||||
bar.value = Math.min(Math.max(bar.value + dy / height, 0.0), 1.0)
|
||||
if (Math.abs(dy) < 0.001) {
|
||||
timeline.stop()
|
||||
}
|
||||
requestLayout()
|
||||
}))
|
||||
timeline.cycleCount = Animation.INDEFINITE
|
||||
}
|
||||
}
|
||||
|
||||
fun runOnUiThread(runnable: () -> Unit) = {
|
||||
JFXUtilities.runInFX(runnable)
|
||||
}
|
||||
125
HMCL/src/main/java/org/jackhuang/hmcl/ui/MainController.kt
Normal file
125
HMCL/src/main/java/org/jackhuang/hmcl/ui/MainController.kt
Normal file
@@ -0,0 +1,125 @@
|
||||
/*
|
||||
* Hello Minecraft! Launcher.
|
||||
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
*/
|
||||
package org.jackhuang.hmcl.ui
|
||||
|
||||
import com.jfoenix.controls.JFXButton
|
||||
import com.jfoenix.controls.JFXComboBox
|
||||
import com.jfoenix.controls.JFXListCell
|
||||
import com.jfoenix.controls.JFXListView
|
||||
import javafx.fxml.FXML
|
||||
import javafx.scene.Node
|
||||
import javafx.scene.layout.Pane
|
||||
import javafx.scene.layout.StackPane
|
||||
import org.jackhuang.hmcl.setting.VersionSetting
|
||||
import org.jackhuang.hmcl.ui.animation.ContainerAnimations
|
||||
import org.jackhuang.hmcl.ui.download.DownloadWizardProvider
|
||||
import org.jackhuang.hmcl.ui.animation.TransitionHandler
|
||||
import org.jackhuang.hmcl.ui.wizard.Wizard
|
||||
|
||||
/**
|
||||
* @see /assets/fxml/main.fxml
|
||||
*/
|
||||
class MainController {
|
||||
|
||||
/**
|
||||
* A combo box that allows user to select Minecraft directory.
|
||||
*/
|
||||
@FXML lateinit var comboProfiles: JFXComboBox<String> // TODO: JFXComboBox<Profile>
|
||||
|
||||
/**
|
||||
* The button that is to launch the selected game version.
|
||||
*/
|
||||
@FXML lateinit var buttonLaunch: JFXButton
|
||||
|
||||
/**
|
||||
* A central pane that contains popups like (global) version settings, app settings, game installations and so on.
|
||||
*/
|
||||
@FXML lateinit var page: StackPane
|
||||
|
||||
@FXML lateinit var listVersions: JFXListView<VersionSetting> // TODO: JFXListView<Version> including icon, title, game version(if equals to title, hidden)
|
||||
|
||||
lateinit var animationHandler: TransitionHandler
|
||||
|
||||
// TODO: implementing functions.
|
||||
fun initialize() {
|
||||
Controllers.mainController = this
|
||||
|
||||
animationHandler = TransitionHandler(page)
|
||||
|
||||
listVersions.items.add(VersionSetting("1"))
|
||||
listVersions.items.add(VersionSetting("2"))
|
||||
listVersions.items.add(VersionSetting("3"))
|
||||
listVersions.items.add(VersionSetting("4"))
|
||||
listVersions.items.add(VersionSetting("5"))
|
||||
listVersions.items.add(VersionSetting("6"))
|
||||
listVersions.items.add(VersionSetting("7"))
|
||||
listVersions.items.add(VersionSetting("8"))
|
||||
listVersions.items.add(VersionSetting("9"))
|
||||
listVersions.items.add(VersionSetting("10"))
|
||||
listVersions.items.add(VersionSetting("11"))
|
||||
listVersions.items.add(VersionSetting("12"))
|
||||
|
||||
listVersions.setCellFactory {
|
||||
object : JFXListCell<VersionSetting>() {
|
||||
override fun updateItem(item: VersionSetting?, empty: Boolean) {
|
||||
super.updateItem(item, empty)
|
||||
|
||||
if (item == null || empty) return
|
||||
val g = VersionListItem(item, item.gameVersion)
|
||||
g.onSettingsButtonClicked {
|
||||
setContentPage(Controllers.versionPane)
|
||||
Controllers.versionController.loadVersionSetting(g.setting)
|
||||
}
|
||||
graphic = g
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
listVersions.setOnMouseClicked {
|
||||
if (it.clickCount == 2) {
|
||||
setContentPage(Controllers.versionPane)
|
||||
Controllers.versionController.loadVersionSetting(listVersions.selectionModel.selectedItem)
|
||||
} else
|
||||
it.consume()
|
||||
}
|
||||
|
||||
comboProfiles.items.add("SA")
|
||||
comboProfiles.items.add("SB")
|
||||
comboProfiles.items.add("SC")
|
||||
comboProfiles.items.add("SD")
|
||||
comboProfiles.items.add("SE")
|
||||
comboProfiles.items.add("SF")
|
||||
comboProfiles.items.add("SG")
|
||||
comboProfiles.items.add("SH")
|
||||
comboProfiles.items.add("SI")
|
||||
comboProfiles.items.add("SJ")
|
||||
comboProfiles.items.add("SK")
|
||||
|
||||
listVersions.smoothScrolling()
|
||||
}
|
||||
|
||||
private val empty = Pane()
|
||||
|
||||
fun setContentPage(node: Node?) {
|
||||
animationHandler.setContent(node ?: empty, ContainerAnimations.FADE.animationProducer)
|
||||
}
|
||||
|
||||
fun installNewVersion() {
|
||||
setContentPage(Wizard.createWizard("Install New Game", DownloadWizardProvider()))
|
||||
}
|
||||
}
|
||||
57
HMCL/src/main/java/org/jackhuang/hmcl/ui/SVG.kt
Normal file
57
HMCL/src/main/java/org/jackhuang/hmcl/ui/SVG.kt
Normal file
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
* Hello Minecraft! Launcher.
|
||||
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
*/
|
||||
package org.jackhuang.hmcl.ui
|
||||
|
||||
import javafx.fxml.FXMLLoader
|
||||
import javafx.scene.Group
|
||||
import javafx.scene.Node
|
||||
import javafx.scene.shape.SVGPath
|
||||
import kotlin.coroutines.experimental.EmptyCoroutineContext.plus
|
||||
|
||||
object SVG {
|
||||
val svgNames = setOf("gear")
|
||||
val svgs: Map<String, Group>
|
||||
|
||||
init {
|
||||
val svgsImpl = HashMap<String, Group>()
|
||||
for (svgName in svgNames) {
|
||||
svgsImpl[svgName] = FXMLLoader(Controllers::class.java.getResource("/assets/svg/$svgName.fxml")).load()
|
||||
}
|
||||
svgs = svgsImpl
|
||||
}
|
||||
|
||||
private fun createSVGPath(d: String, fill: String = "black", width: Double = 20.0, height: Double = 20.0): Node {
|
||||
val path = SVGPath()
|
||||
path.styleClass += "svg"
|
||||
path.content = d
|
||||
path.style = "-fx-fill: $fill;"
|
||||
|
||||
val svg = Group(path)
|
||||
val scale = minOf(width / svg.boundsInParent.width, height / svg.boundsInParent.height)
|
||||
svg.scaleX = scale
|
||||
svg.scaleY = scale
|
||||
svg.maxWidth(width)
|
||||
|
||||
return svg
|
||||
}
|
||||
|
||||
fun gear(): Node = createSVGPath("M12,15.5A3.5,3.5 0 0,1 8.5,12A3.5,3.5 0 0,1 12,8.5A3.5,3.5 0 0,1 15.5,12A3.5,3.5 0 0,1 12,15.5M19.43,12.97C19.47,12.65 19.5,12.33 19.5,12C19.5,11.67 19.47,11.34 19.43,11L21.54,9.37C21.73,9.22 21.78,8.95 21.66,8.73L19.66,5.27C19.54,5.05 19.27,4.96 19.05,5.05L16.56,6.05C16.04,5.66 15.5,5.32 14.87,5.07L14.5,2.42C14.46,2.18 14.25,2 14,2H10C9.75,2 9.54,2.18 9.5,2.42L9.13,5.07C8.5,5.32 7.96,5.66 7.44,6.05L4.95,5.05C4.73,4.96 4.46,5.05 4.34,5.27L2.34,8.73C2.21,8.95 2.27,9.22 2.46,9.37L4.57,11C4.53,11.34 4.5,11.67 4.5,12C4.5,12.33 4.53,12.65 4.57,12.97L2.46,14.63C2.27,14.78 2.21,15.05 2.34,15.27L4.34,18.73C4.46,18.95 4.73,19.03 4.95,18.95L7.44,17.94C7.96,18.34 8.5,18.68 9.13,18.93L9.5,21.58C9.54,21.82 9.75,22 10,22H14C14.25,22 14.46,21.82 14.5,21.58L14.87,18.93C15.5,18.67 16.04,18.34 16.56,17.94L19.05,18.95C19.27,19.03 19.54,18.95 19.66,18.73L21.66,15.27C21.78,15.05 21.73,14.78 21.54,14.63L19.43,12.97Z")
|
||||
fun back(fill: String = "white"): Node = createSVGPath("M20,11V13H8L13.5,18.5L12.08,19.92L4.16,12L12.08,4.08L13.5,5.5L8,11H20Z", fill)
|
||||
fun close(fill: String = "white"): Node = createSVGPath("M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z", fill)
|
||||
fun dotsVertical(fill: String = "white"): Node = createSVGPath("M12,16A2,2 0 0,1 14,18A2,2 0 0,1 12,20A2,2 0 0,1 10,18A2,2 0 0,1 12,16M12,10A2,2 0 0,1 14,12A2,2 0 0,1 12,14A2,2 0 0,1 10,12A2,2 0 0,1 12,10M12,4A2,2 0 0,1 14,6A2,2 0 0,1 12,8A2,2 0 0,1 10,6A2,2 0 0,1 12,4Z", fill)
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
/*
|
||||
* Hello Minecraft! Launcher.
|
||||
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
*/
|
||||
package org.jackhuang.hmcl.ui
|
||||
|
||||
import com.jfoenix.controls.JFXButton
|
||||
import com.jfoenix.controls.JFXScrollPane
|
||||
import com.jfoenix.controls.JFXTextField
|
||||
import javafx.fxml.FXML
|
||||
import javafx.scene.control.Label
|
||||
import javafx.scene.control.ScrollPane
|
||||
import javafx.scene.layout.ColumnConstraints
|
||||
import javafx.scene.layout.GridPane
|
||||
import javafx.scene.layout.Priority
|
||||
import javafx.scene.paint.Color
|
||||
import javafx.stage.DirectoryChooser
|
||||
import org.jackhuang.hmcl.setting.VersionSetting
|
||||
|
||||
class VersionController {
|
||||
@FXML
|
||||
lateinit var titleLabel: Label
|
||||
@FXML
|
||||
lateinit var backButton: JFXButton
|
||||
@FXML
|
||||
lateinit var scroll: ScrollPane
|
||||
@FXML
|
||||
lateinit var settingsPane: GridPane
|
||||
@FXML
|
||||
lateinit var txtGameDir: JFXTextField
|
||||
|
||||
fun initialize() {
|
||||
Controllers.versionController = this
|
||||
|
||||
settingsPane.columnConstraints.addAll(
|
||||
ColumnConstraints(),
|
||||
ColumnConstraints().apply { hgrow = Priority.ALWAYS },
|
||||
ColumnConstraints()
|
||||
)
|
||||
|
||||
backButton.ripplerFill = Color.WHITE
|
||||
backButton.setOnMouseClicked {
|
||||
Controllers.navigate(null)
|
||||
}
|
||||
|
||||
JFXScrollPane.smoothScrolling(scroll)
|
||||
}
|
||||
|
||||
fun loadVersionSetting(version: VersionSetting) {
|
||||
titleLabel.text = version.name
|
||||
}
|
||||
|
||||
fun onExploreJavaDir() {
|
||||
val chooser = DirectoryChooser()
|
||||
chooser.title = "Selecting Java Directory"
|
||||
val selectedDir = chooser.showDialog(Controllers.stage)
|
||||
if (selectedDir != null)
|
||||
txtGameDir.text = selectedDir.absolutePath
|
||||
}
|
||||
}
|
||||
49
HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionListItem.kt
Normal file
49
HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionListItem.kt
Normal file
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* Hello Minecraft! Launcher.
|
||||
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
*/
|
||||
package org.jackhuang.hmcl.ui
|
||||
|
||||
import javafx.fxml.FXML
|
||||
import javafx.scene.control.Label
|
||||
import javafx.scene.layout.BorderPane
|
||||
import org.jackhuang.hmcl.setting.VersionSetting
|
||||
|
||||
class VersionListItem(val setting: VersionSetting, val gameVersion: String) : BorderPane() {
|
||||
|
||||
@FXML lateinit var lblVersionName: Label
|
||||
@FXML lateinit var lblGameVersion: Label
|
||||
|
||||
private var handler: () -> Unit = {}
|
||||
|
||||
init {
|
||||
loadFXML("/assets/fxml/version-list-item.fxml")
|
||||
lblVersionName.text = setting.name
|
||||
lblGameVersion.text = gameVersion
|
||||
}
|
||||
|
||||
fun onSettings() {
|
||||
handler()
|
||||
}
|
||||
|
||||
fun onLaunch() {
|
||||
|
||||
}
|
||||
|
||||
fun onSettingsButtonClicked(handler: () -> Unit) {
|
||||
this.handler = handler
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* Hello Minecraft! Launcher.
|
||||
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
*/
|
||||
package org.jackhuang.hmcl.ui.animation
|
||||
|
||||
import javafx.scene.Node
|
||||
import javafx.scene.layout.Pane
|
||||
import javafx.util.Duration
|
||||
|
||||
interface AnimationHandler {
|
||||
val snapshot: Node
|
||||
val duration: Duration
|
||||
val view: Pane
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
/*
|
||||
* Hello Minecraft! Launcher.
|
||||
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
*/
|
||||
package org.jackhuang.hmcl.ui.animation
|
||||
|
||||
import javafx.animation.Interpolator
|
||||
import javafx.animation.KeyFrame
|
||||
import javafx.animation.KeyValue
|
||||
import javafx.util.Duration
|
||||
|
||||
enum class ContainerAnimations(val animationProducer: (AnimationHandler) -> List<KeyFrame>) {
|
||||
/**
|
||||
* None
|
||||
*/
|
||||
NONE({
|
||||
emptyList()
|
||||
}),
|
||||
/**
|
||||
* A fade between the old and new view
|
||||
*/
|
||||
FADE({ c ->
|
||||
listOf(
|
||||
KeyFrame(Duration.ZERO,
|
||||
KeyValue(c.snapshot.opacityProperty(), 1.0, Interpolator.EASE_BOTH)),
|
||||
KeyFrame(c.duration,
|
||||
KeyValue(c.snapshot.opacityProperty(), 0.0, Interpolator.EASE_BOTH))
|
||||
)
|
||||
}),
|
||||
/**
|
||||
* A zoom effect
|
||||
*/
|
||||
ZOOM_IN({ c ->
|
||||
listOf(
|
||||
KeyFrame(Duration.ZERO,
|
||||
KeyValue(c.snapshot.scaleXProperty(), 1, Interpolator.EASE_BOTH),
|
||||
KeyValue(c.snapshot.scaleYProperty(), 1, Interpolator.EASE_BOTH),
|
||||
KeyValue(c.snapshot.opacityProperty(), 1.0, Interpolator.EASE_BOTH)),
|
||||
KeyFrame(c.duration,
|
||||
KeyValue(c.snapshot.scaleXProperty(), 4, Interpolator.EASE_BOTH),
|
||||
KeyValue(c.snapshot.scaleYProperty(), 4, Interpolator.EASE_BOTH),
|
||||
KeyValue(c.snapshot.opacityProperty(), 0, Interpolator.EASE_BOTH))
|
||||
)
|
||||
}),
|
||||
/**
|
||||
* A zoom effect
|
||||
*/
|
||||
ZOOM_OUT({ c ->
|
||||
listOf(
|
||||
KeyFrame(Duration.ZERO,
|
||||
KeyValue(c.snapshot.scaleXProperty(), 1, Interpolator.EASE_BOTH),
|
||||
KeyValue(c.snapshot.scaleYProperty(), 1, Interpolator.EASE_BOTH),
|
||||
KeyValue(c.snapshot.opacityProperty(), 1.0, Interpolator.EASE_BOTH)),
|
||||
KeyFrame(c.duration,
|
||||
KeyValue(c.snapshot.scaleXProperty(), 0, Interpolator.EASE_BOTH),
|
||||
KeyValue(c.snapshot.scaleYProperty(), 0, Interpolator.EASE_BOTH),
|
||||
KeyValue(c.snapshot.opacityProperty(), 0, Interpolator.EASE_BOTH))
|
||||
)
|
||||
}),
|
||||
/**
|
||||
* A swipe effect
|
||||
*/
|
||||
SWIPE_LEFT({ c ->
|
||||
listOf(
|
||||
KeyFrame(Duration.ZERO,
|
||||
KeyValue(c.view.translateXProperty(), c.view.getWidth(), Interpolator.EASE_BOTH),
|
||||
KeyValue(c.snapshot.translateXProperty(), -c.view.getWidth(), Interpolator.EASE_BOTH)),
|
||||
KeyFrame(c.duration,
|
||||
KeyValue(c.view.translateXProperty(), 0, Interpolator.EASE_BOTH),
|
||||
KeyValue(c.snapshot.translateXProperty(), -c.view.getWidth(), Interpolator.EASE_BOTH)
|
||||
))
|
||||
}),
|
||||
/**
|
||||
* A swipe effect
|
||||
*/
|
||||
SWIPE_RIGHT({ c ->
|
||||
listOf(
|
||||
KeyFrame(Duration.ZERO,
|
||||
KeyValue(c.view.translateXProperty(), -c.view.getWidth(), Interpolator.EASE_BOTH),
|
||||
KeyValue(c.snapshot.translateXProperty(), c.view.getWidth(), Interpolator.EASE_BOTH)),
|
||||
KeyFrame(c.duration,
|
||||
KeyValue(c.view.translateXProperty(), 0, Interpolator.EASE_BOTH),
|
||||
KeyValue(c.snapshot.translateXProperty(), c.view.getWidth(), Interpolator.EASE_BOTH))
|
||||
)
|
||||
})
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
/*
|
||||
* Hello Minecraft! Launcher.
|
||||
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
*/
|
||||
package org.jackhuang.hmcl.ui.animation
|
||||
|
||||
import javafx.animation.KeyFrame
|
||||
import javafx.animation.Timeline
|
||||
import javafx.event.EventHandler
|
||||
import javafx.scene.Node
|
||||
import javafx.scene.SnapshotParameters
|
||||
import javafx.scene.image.ImageView
|
||||
import javafx.scene.image.WritableImage
|
||||
import javafx.scene.layout.StackPane
|
||||
import javafx.util.Duration
|
||||
|
||||
class TransitionHandler(override val view: StackPane): AnimationHandler {
|
||||
private var animation: Timeline? = null
|
||||
|
||||
override val snapshot = ImageView().apply {
|
||||
isPreserveRatio = true
|
||||
isSmooth = true
|
||||
}
|
||||
|
||||
override lateinit var duration: Duration
|
||||
private set
|
||||
|
||||
fun setContent(newView: Node, transition: (TransitionHandler) -> List<KeyFrame>, duration: Duration = Duration.millis(320.0)) {
|
||||
this.duration = duration
|
||||
|
||||
val prevAnimation = animation
|
||||
if (prevAnimation != null)
|
||||
prevAnimation.stop()
|
||||
|
||||
updateContent(newView)
|
||||
|
||||
val nowAnimation = Timeline().apply {
|
||||
keyFrames.addAll(transition(this@TransitionHandler))
|
||||
keyFrames.add(KeyFrame(duration, EventHandler {
|
||||
snapshot.image = null
|
||||
snapshot.x = 0.0
|
||||
snapshot.y = 0.0
|
||||
snapshot.isVisible = false
|
||||
}))
|
||||
}
|
||||
nowAnimation.play()
|
||||
animation = nowAnimation
|
||||
}
|
||||
|
||||
private fun updateContent(newView: Node) {
|
||||
if (view.width > 0 && view.height > 0) {
|
||||
val image = view.snapshot(SnapshotParameters(), null)
|
||||
val x = (image.width - view.width) / 2
|
||||
val y = image.height - view.height
|
||||
val newImage = WritableImage(image.pixelReader, x.toInt(), y.toInt(), view.width.toInt(), view.height.toInt())
|
||||
snapshot.image = newImage
|
||||
snapshot.fitWidth = newImage.width
|
||||
snapshot.fitHeight = newImage.height
|
||||
} else
|
||||
snapshot.image = null
|
||||
|
||||
snapshot.isVisible = true
|
||||
snapshot.opacity = 1.0
|
||||
view.children.setAll(snapshot)
|
||||
view.children.add(newView)
|
||||
snapshot.toFront()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
* Hello Minecraft! Launcher.
|
||||
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
*/
|
||||
package org.jackhuang.hmcl.ui.download
|
||||
|
||||
import javafx.scene.Node
|
||||
import javafx.scene.layout.Pane
|
||||
import org.jackhuang.hmcl.download.BMCLAPIDownloadProvider
|
||||
import org.jackhuang.hmcl.ui.wizard.WizardController
|
||||
import org.jackhuang.hmcl.ui.wizard.WizardProvider
|
||||
|
||||
class DownloadWizardProvider(): WizardProvider() {
|
||||
|
||||
override fun finish(settings: Map<String, Any>): Any? {
|
||||
println(settings)
|
||||
return null
|
||||
}
|
||||
|
||||
override fun createPage(controller: WizardController, step: Int, settings: Map<String, Any>): Node {
|
||||
return when (step) {
|
||||
0 -> InstallTypePage(controller)
|
||||
1 -> when (settings[InstallTypePage.INSTALL_TYPE]) {
|
||||
0 -> VersionsPage(controller, "", BMCLAPIDownloadProvider, "game", { controller.onNext(InstallersPage(controller, BMCLAPIDownloadProvider)) })
|
||||
else -> Pane()
|
||||
}
|
||||
else -> throw IllegalStateException()
|
||||
}
|
||||
}
|
||||
|
||||
override fun cancel(): Boolean {
|
||||
return true
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* Hello Minecraft! Launcher.
|
||||
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
*/
|
||||
package org.jackhuang.hmcl.ui.download
|
||||
|
||||
import com.jfoenix.controls.JFXListView
|
||||
import javafx.fxml.FXML
|
||||
import javafx.scene.layout.StackPane
|
||||
import org.jackhuang.hmcl.ui.loadFXML
|
||||
import org.jackhuang.hmcl.ui.wizard.WizardController
|
||||
import org.jackhuang.hmcl.ui.wizard.WizardPage
|
||||
|
||||
class InstallTypePage(private val controller: WizardController): StackPane(), WizardPage {
|
||||
|
||||
@FXML lateinit var list: JFXListView<Any>
|
||||
|
||||
init {
|
||||
loadFXML("/assets/fxml/download/dltype.fxml")
|
||||
|
||||
list.selectionModel.selectedIndexProperty().addListener { _, _, newValue ->
|
||||
controller.settings[INSTALL_TYPE] = newValue
|
||||
controller.onNext()
|
||||
}
|
||||
}
|
||||
|
||||
override fun cleanup(settings: MutableMap<String, Any>) {
|
||||
settings.remove(INSTALL_TYPE)
|
||||
}
|
||||
|
||||
override val title: String
|
||||
get() = "Select an operation"
|
||||
|
||||
companion object {
|
||||
const val INSTALL_TYPE: String = "INSTALL_TYPE"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
/*
|
||||
* Hello Minecraft! Launcher.
|
||||
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
*/
|
||||
package org.jackhuang.hmcl.ui.download
|
||||
|
||||
import com.jfoenix.controls.JFXListView
|
||||
import javafx.fxml.FXML
|
||||
import javafx.scene.control.Label
|
||||
import javafx.scene.layout.StackPane
|
||||
import org.jackhuang.hmcl.download.DownloadProvider
|
||||
import org.jackhuang.hmcl.ui.loadFXML
|
||||
import org.jackhuang.hmcl.ui.wizard.WizardController
|
||||
import org.jackhuang.hmcl.ui.wizard.WizardPage
|
||||
|
||||
class InstallersPage(private val controller: WizardController, private val downloadProvider: DownloadProvider): StackPane(), WizardPage {
|
||||
|
||||
@FXML lateinit var list: JFXListView<VersionsPageItem>
|
||||
@FXML lateinit var lblGameVersion: Label
|
||||
@FXML lateinit var lblForge: Label
|
||||
@FXML lateinit var lblLiteLoader: Label
|
||||
@FXML lateinit var lblOptiFine: Label
|
||||
|
||||
init {
|
||||
loadFXML("/assets/fxml/download/installers.fxml")
|
||||
list.selectionModel.selectedIndexProperty().addListener { _, _, newValue ->
|
||||
controller.settings[INSTALLER_TYPE] = newValue
|
||||
controller.onNext(when (newValue){
|
||||
0 -> VersionsPage(controller, controller.settings["game"] as String, downloadProvider, "forge") { controller.onPrev(false) }
|
||||
1 -> VersionsPage(controller, controller.settings["game"] as String, downloadProvider, "liteloader") { controller.onPrev(false) }
|
||||
2 -> VersionsPage(controller, controller.settings["game"] as String, downloadProvider, "optifine") { controller.onPrev(false) }
|
||||
else -> throw IllegalStateException()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
override val title: String
|
||||
get() = "Choose a game version"
|
||||
|
||||
override fun onNavigate(settings: MutableMap<String, Any>) {
|
||||
lblGameVersion.text = "Current Game Version: ${controller.settings["game"]}"
|
||||
if (controller.settings.containsKey("forge"))
|
||||
lblForge.text = "Forge Versoin: ${controller.settings["forge"]}"
|
||||
else
|
||||
lblForge.text = "Forge not installed"
|
||||
|
||||
if (controller.settings.containsKey("liteloader"))
|
||||
lblLiteLoader.text = "LiteLoader Versoin: ${controller.settings["liteloader"]}"
|
||||
else
|
||||
lblLiteLoader.text = "LiteLoader not installed"
|
||||
|
||||
if (controller.settings.containsKey("optifine"))
|
||||
lblOptiFine.text = "OptiFine Versoin: ${controller.settings["optifine"]}"
|
||||
else
|
||||
lblOptiFine.text = "OptiFine not installed"
|
||||
}
|
||||
|
||||
override fun cleanup(settings: MutableMap<String, Any>) {
|
||||
settings.remove(INSTALLER_TYPE)
|
||||
}
|
||||
|
||||
companion object {
|
||||
val INSTALLER_TYPE = "INSTALLER_TYPE"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
/*
|
||||
* Hello Minecraft! Launcher.
|
||||
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
*/
|
||||
package org.jackhuang.hmcl.ui.download
|
||||
|
||||
import com.jfoenix.controls.JFXListView
|
||||
import com.jfoenix.controls.JFXSpinner
|
||||
import javafx.fxml.FXML
|
||||
import javafx.scene.layout.StackPane
|
||||
import org.jackhuang.hmcl.download.RemoteVersion
|
||||
import org.jackhuang.hmcl.download.DownloadProvider
|
||||
import org.jackhuang.hmcl.task.Scheduler
|
||||
import org.jackhuang.hmcl.ui.animation.ContainerAnimations
|
||||
import org.jackhuang.hmcl.ui.animation.TransitionHandler
|
||||
import org.jackhuang.hmcl.ui.loadFXML
|
||||
import org.jackhuang.hmcl.ui.wizard.WizardController
|
||||
import org.jackhuang.hmcl.ui.wizard.WizardPage
|
||||
|
||||
class VersionsPage(private val controller: WizardController, private val gameVersion: String, private val downloadProvider: DownloadProvider, private val libraryId: String, private val callback: () -> Unit): StackPane(), WizardPage {
|
||||
|
||||
@FXML lateinit var list: JFXListView<VersionsPageItem>
|
||||
@FXML lateinit var spinner: JFXSpinner
|
||||
|
||||
val transitionHandler = TransitionHandler(this)
|
||||
private val versionList = downloadProvider.getVersionListById(libraryId)
|
||||
|
||||
init {
|
||||
loadFXML("/assets/fxml/download/versions.fxml")
|
||||
children.setAll(spinner)
|
||||
list.selectionModel.selectedItemProperty().addListener { _, _, newValue ->
|
||||
controller.settings[libraryId] = newValue.remoteVersion.selfVersion
|
||||
callback()
|
||||
}
|
||||
versionList.refreshAsync(downloadProvider).subscribe(Scheduler.JAVAFX) {
|
||||
val versions = ArrayList(versionList.getVersions(gameVersion))
|
||||
versions.sortWith(RemoteVersion)
|
||||
for (version in versions) {
|
||||
list.items.add(VersionsPageItem(version))
|
||||
}
|
||||
|
||||
transitionHandler.setContent(list, ContainerAnimations.FADE.animationProducer)
|
||||
}
|
||||
}
|
||||
|
||||
override val title: String
|
||||
get() = "Choose a game version"
|
||||
|
||||
override fun cleanup(settings: MutableMap<String, Any>) {
|
||||
settings.remove(libraryId)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Hello Minecraft! Launcher.
|
||||
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
*/
|
||||
package org.jackhuang.hmcl.ui.download
|
||||
|
||||
import javafx.fxml.FXML
|
||||
import javafx.scene.control.Label
|
||||
import javafx.scene.layout.BorderPane
|
||||
import org.jackhuang.hmcl.download.RemoteVersion
|
||||
import org.jackhuang.hmcl.ui.loadFXML
|
||||
|
||||
class VersionsPageItem(val remoteVersion: RemoteVersion<*>) : BorderPane() {
|
||||
|
||||
@FXML lateinit var lblSelfVersion: Label
|
||||
@FXML lateinit var lblGameVersion: Label
|
||||
|
||||
private var handler: () -> Unit = {}
|
||||
|
||||
init {
|
||||
loadFXML("/assets/fxml/download/versions-list-item.fxml")
|
||||
lblSelfVersion.text = remoteVersion.selfVersion
|
||||
lblGameVersion.text = remoteVersion.gameVersion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,124 @@
|
||||
/*
|
||||
* Hello Minecraft! Launcher.
|
||||
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
*/
|
||||
package org.jackhuang.hmcl.ui.wizard
|
||||
|
||||
import com.jfoenix.concurrency.JFXUtilities
|
||||
import com.jfoenix.controls.JFXButton
|
||||
import com.jfoenix.controls.JFXProgressBar
|
||||
import com.jfoenix.controls.JFXToolbar
|
||||
import javafx.fxml.FXML
|
||||
import javafx.scene.Node
|
||||
import javafx.scene.control.Label
|
||||
import javafx.scene.layout.StackPane
|
||||
import javafx.scene.layout.VBox
|
||||
import org.jackhuang.hmcl.ui.Controllers
|
||||
import org.jackhuang.hmcl.ui.animation.TransitionHandler
|
||||
import org.jackhuang.hmcl.ui.loadFXML
|
||||
import kotlin.concurrent.thread
|
||||
|
||||
internal class DefaultWizardDisplayer(private val prefix: String, wizardProvider: WizardProvider) : StackPane(), WizardDisplayer {
|
||||
|
||||
val wizardController = WizardController(this, wizardProvider)
|
||||
|
||||
lateinit var transitionHandler: TransitionHandler
|
||||
|
||||
@FXML lateinit var root: StackPane
|
||||
@FXML lateinit var closeButton: JFXButton
|
||||
@FXML lateinit var backButton: JFXButton
|
||||
@FXML lateinit var toolbar: JFXToolbar
|
||||
/**
|
||||
* Only shown if it is needed in now step.
|
||||
*/
|
||||
@FXML lateinit var refreshButton: JFXButton
|
||||
@FXML lateinit var titleLabel: Label
|
||||
|
||||
init {
|
||||
loadFXML("/assets/fxml/wizard.fxml")
|
||||
toolbar.effect = null
|
||||
}
|
||||
|
||||
fun initialize() {
|
||||
transitionHandler = TransitionHandler(root)
|
||||
|
||||
wizardController.onStart()
|
||||
}
|
||||
|
||||
fun back() {
|
||||
wizardController.onPrev(true)
|
||||
}
|
||||
|
||||
fun close() {
|
||||
wizardController.onCancel()
|
||||
Controllers.navigate(null)
|
||||
}
|
||||
|
||||
override fun navigateTo(page: Node, nav: Navigation.NavigationDirection) {
|
||||
backButton.isDisable = !wizardController.canPrev()
|
||||
transitionHandler.setContent(page, nav.animation.animationProducer)
|
||||
val title = if (prefix.isEmpty()) "" else "$prefix - "
|
||||
if (page is WizardPage)
|
||||
titleLabel.text = title + page.title
|
||||
}
|
||||
|
||||
override fun handleDeferredWizardResult(settings: Map<String, Any>, deferredResult: DeferredWizardResult) {
|
||||
val vbox = VBox()
|
||||
val progressBar = JFXProgressBar()
|
||||
val label = Label()
|
||||
progressBar.maxHeight = 10.0
|
||||
vbox.children += progressBar
|
||||
vbox.children += label
|
||||
|
||||
root.children.setAll(progressBar)
|
||||
|
||||
thread {
|
||||
deferredResult.start(settings, object : ResultProgressHandle {
|
||||
private var running = true
|
||||
|
||||
override fun setProgress(currentStep: Int, totalSteps: Int) {
|
||||
progressBar.progress = 1.0 * currentStep / totalSteps
|
||||
}
|
||||
|
||||
override fun setProgress(description: String, currentStep: Int, totalSteps: Int) {
|
||||
label.text = description
|
||||
progressBar.progress = 1.0 * currentStep / totalSteps
|
||||
}
|
||||
|
||||
override fun setBusy(description: String) {
|
||||
progressBar.progress = JFXProgressBar.INDETERMINATE_PROGRESS
|
||||
}
|
||||
|
||||
override fun finished(result: Any) {
|
||||
running = false
|
||||
}
|
||||
|
||||
override fun failed(message: String, canNavigateBack: Boolean) {
|
||||
label.text = message
|
||||
running = false
|
||||
}
|
||||
|
||||
override val isRunning: Boolean
|
||||
get() = running
|
||||
|
||||
})
|
||||
|
||||
JFXUtilities.runInFX {
|
||||
navigateTo(Label("Successful"), Navigation.NavigationDirection.FINISH)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* Hello Minecraft! Launcher.
|
||||
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
*/
|
||||
package org.jackhuang.hmcl.ui.wizard
|
||||
|
||||
abstract class DeferredWizardResult(val canAbort: Boolean = false) {
|
||||
|
||||
abstract fun start(settings: Map<String, Any>, progressHandle: ResultProgressHandle)
|
||||
open fun abort() { }
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Hello Minecraft! Launcher.
|
||||
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
*/
|
||||
package org.jackhuang.hmcl.ui.wizard
|
||||
|
||||
import org.jackhuang.hmcl.ui.animation.ContainerAnimations
|
||||
|
||||
interface Navigation {
|
||||
fun onStart()
|
||||
fun onNext()
|
||||
fun onPrev(cleanUp: Boolean)
|
||||
fun canPrev(): Boolean
|
||||
fun onFinish()
|
||||
fun onCancel()
|
||||
|
||||
enum class NavigationDirection(val animation: ContainerAnimations) {
|
||||
START(ContainerAnimations.NONE),
|
||||
PREVIOUS(ContainerAnimations.SWIPE_RIGHT),
|
||||
NEXT(ContainerAnimations.SWIPE_LEFT),
|
||||
FINISH(ContainerAnimations.SWIPE_LEFT),
|
||||
IN(ContainerAnimations.ZOOM_IN),
|
||||
OUT(ContainerAnimations.ZOOM_OUT)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,104 @@
|
||||
/*
|
||||
* Hello Minecraft! Launcher.
|
||||
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
*/
|
||||
package org.jackhuang.hmcl.ui.wizard
|
||||
|
||||
/**
|
||||
* A controller for the progress bar shown in the user interface. Used in
|
||||
* conjunction then `DeferredWizardResult` for cases where at
|
||||
* the conclusion of the wizard, the work to create the final wizard result
|
||||
* will take a while and needs to happen on a background thread.
|
||||
* @author Tim Boudreau
|
||||
*/
|
||||
interface ResultProgressHandle {
|
||||
|
||||
/**
|
||||
* Set the current position and total number of steps. Note it is
|
||||
* inadvisable to be holding any locks when calling this method, as it
|
||||
* may immediately update the GUI using
|
||||
* `EventQueue.invokeAndWait()`.
|
||||
|
||||
* @param currentStep the current step in the progress of computing the
|
||||
* * result.
|
||||
* *
|
||||
* @param totalSteps the total number of steps. Must be greater than
|
||||
* * or equal to currentStep.
|
||||
*/
|
||||
fun setProgress(currentStep: Int, totalSteps: Int)
|
||||
|
||||
/**
|
||||
* Set the current position and total number of steps, and description
|
||||
* of what the computation is doing. Note it is
|
||||
* inadvisable to be holding any locks when calling this method, as it
|
||||
* may immediately update the GUI using
|
||||
* `EventQueue.invokeAndWait()`.
|
||||
* @param description Text to describe what is being done, which can
|
||||
* * be displayed in the UI.
|
||||
* *
|
||||
* @param currentStep the current step in the progress of computing the
|
||||
* * result.
|
||||
* *
|
||||
* @param totalSteps the total number of steps. Must be greater than
|
||||
* * or equal to currentStep.
|
||||
*/
|
||||
fun setProgress(description: String, currentStep: Int, totalSteps: Int)
|
||||
|
||||
/**
|
||||
* Set the status as "busy" - a rotating icon will be displayed instead
|
||||
* of a percent complete progress bar.
|
||||
|
||||
* Note it is inadvisable to be holding any locks when calling this method, as it
|
||||
* may immediately update the GUI using
|
||||
* `EventQueue.invokeAndWait()`.
|
||||
* @param description Text to describe what is being done, which can
|
||||
* * be displayed in the UI.
|
||||
*/
|
||||
fun setBusy(description: String)
|
||||
|
||||
/**
|
||||
* Call this method when the computation is complete, and pass in the
|
||||
* final result of the computation. The method doing the computation
|
||||
* (`DeferredWizardResult.start()` or something it
|
||||
* called) should exit immediately after calling this method. If the
|
||||
* `failed()` method is called after this method has been
|
||||
* called, a runtime exception may be thrown.
|
||||
* @param result the Object which was computed, if any.
|
||||
*/
|
||||
fun finished(result: Any)
|
||||
|
||||
/**
|
||||
* Call this method if computation fails. The message may be some text
|
||||
* describing what went wrong, or null if no description.
|
||||
* @param message The text to display to the user. The method
|
||||
* * doing the computation (`DeferredWizardResult.start()` or something it
|
||||
* * called). If the `finished()` method is called after this
|
||||
* * method has been called, a runtime exception may be thrown.
|
||||
* * should exit immediately after calling this method.
|
||||
* * It is A description of what went wrong, or null.
|
||||
* *
|
||||
* @param canNavigateBack whether or not the Prev button should be
|
||||
* * enabled.
|
||||
*/
|
||||
fun failed(message: String, canNavigateBack: Boolean)
|
||||
|
||||
/**
|
||||
* Returns true if the computation is still running, i.e., if neither finished or failed have been called.
|
||||
|
||||
* @return true if there is no result yet.
|
||||
*/
|
||||
val isRunning: Boolean
|
||||
}
|
||||
41
HMCL/src/main/java/org/jackhuang/hmcl/ui/wizard/Summary.kt
Normal file
41
HMCL/src/main/java/org/jackhuang/hmcl/ui/wizard/Summary.kt
Normal file
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* Hello Minecraft! Launcher.
|
||||
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
*/
|
||||
package org.jackhuang.hmcl.ui.wizard
|
||||
|
||||
import com.jfoenix.controls.JFXListView
|
||||
import com.jfoenix.controls.JFXTextArea
|
||||
import javafx.scene.Node
|
||||
|
||||
class Summary(
|
||||
/**
|
||||
* The component that will display the summary information
|
||||
*/
|
||||
val component: Node,
|
||||
/**
|
||||
* The object that represents the actual result of whatever that Wizard
|
||||
* that created this Summary object computes, or null.
|
||||
*/
|
||||
val result: Any?) {
|
||||
constructor(items: Array<String>, result: Any?)
|
||||
: this(JFXListView<String>().apply { this.items.addAll(*items) }, result) {
|
||||
}
|
||||
|
||||
constructor(text: String, result: Any?)
|
||||
: this(JFXTextArea(text).apply { isEditable = false }, result) {
|
||||
}
|
||||
}
|
||||
24
HMCL/src/main/java/org/jackhuang/hmcl/ui/wizard/Wizard.kt
Normal file
24
HMCL/src/main/java/org/jackhuang/hmcl/ui/wizard/Wizard.kt
Normal file
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* Hello Minecraft! Launcher.
|
||||
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
*/
|
||||
package org.jackhuang.hmcl.ui.wizard
|
||||
|
||||
import javafx.scene.Node
|
||||
|
||||
object Wizard {
|
||||
fun createWizard(namespace: String = "", provider: WizardProvider): Node = DefaultWizardDisplayer(namespace, provider)
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
/*
|
||||
* Hello Minecraft! Launcher.
|
||||
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
*/
|
||||
package org.jackhuang.hmcl.ui.wizard
|
||||
|
||||
import javafx.scene.Node
|
||||
import java.util.*
|
||||
|
||||
class WizardController(protected val displayer: WizardDisplayer, protected val provider: WizardProvider) : Navigation {
|
||||
val settings = mutableMapOf<String, Any>()
|
||||
val pages = Stack<Node>()
|
||||
|
||||
override fun onStart() {
|
||||
val page = navigatingTo(0)
|
||||
pages.push(page)
|
||||
displayer.navigateTo(page, Navigation.NavigationDirection.START)
|
||||
}
|
||||
|
||||
override fun onNext() {
|
||||
onNext(navigatingTo(pages.size))
|
||||
}
|
||||
|
||||
fun onNext(page: Node) {
|
||||
pages.push(page)
|
||||
|
||||
if (page is WizardPage)
|
||||
page.onNavigate(settings)
|
||||
|
||||
displayer.navigateTo(page, Navigation.NavigationDirection.NEXT)
|
||||
}
|
||||
|
||||
override fun onPrev(cleanUp: Boolean) {
|
||||
val page = pages.pop()
|
||||
if (cleanUp && page is WizardPage)
|
||||
page.cleanup(settings)
|
||||
|
||||
val prevPage = pages.peek()
|
||||
if (prevPage is WizardPage)
|
||||
prevPage.onNavigate(settings)
|
||||
|
||||
displayer.navigateTo(prevPage, Navigation.NavigationDirection.PREVIOUS)
|
||||
}
|
||||
|
||||
override fun canPrev() = pages.size > 1
|
||||
|
||||
override fun onFinish() {
|
||||
val result = provider.finish(settings)
|
||||
when (result) {
|
||||
is DeferredWizardResult -> displayer.handleDeferredWizardResult(settings, result)
|
||||
is Summary -> displayer.navigateTo(result.component, Navigation.NavigationDirection.NEXT)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCancel() {
|
||||
|
||||
}
|
||||
|
||||
fun navigatingTo(step: Int): Node {
|
||||
return provider.createPage(this, step, settings)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* Hello Minecraft! Launcher.
|
||||
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
*/
|
||||
package org.jackhuang.hmcl.ui.wizard
|
||||
|
||||
import javafx.scene.Node
|
||||
|
||||
interface WizardDisplayer {
|
||||
fun navigateTo(page: Node, nav: Navigation.NavigationDirection)
|
||||
|
||||
fun handleDeferredWizardResult(settings: Map<String, Any>, deferredResult: DeferredWizardResult)
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
* Hello Minecraft! Launcher.
|
||||
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
*/
|
||||
package org.jackhuang.hmcl.ui.wizard
|
||||
|
||||
enum class WizardNavigationResult {
|
||||
PROCEED {
|
||||
override val deferredComputation = false
|
||||
},
|
||||
DENY {
|
||||
override val deferredComputation = false
|
||||
};
|
||||
|
||||
abstract val deferredComputation: Boolean
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
* Hello Minecraft! Launcher.
|
||||
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
*/
|
||||
package org.jackhuang.hmcl.ui.wizard
|
||||
|
||||
interface WizardObserver {
|
||||
|
||||
fun stepsChanged(wizard: Wizard)
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* Hello Minecraft! Launcher.
|
||||
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
*/
|
||||
package org.jackhuang.hmcl.ui.wizard
|
||||
|
||||
interface WizardPage {
|
||||
fun onNavigate(settings: MutableMap<String, Any>) {}
|
||||
fun cleanup(settings: MutableMap<String, Any>)
|
||||
val title: String
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
/*
|
||||
* Hello Minecraft! Launcher.
|
||||
* Copyright (C) 2017 huangyuhui <huanghongxun2008@126.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||
*/
|
||||
package org.jackhuang.hmcl.ui.wizard
|
||||
|
||||
import javafx.scene.Node
|
||||
|
||||
abstract class WizardProvider {
|
||||
|
||||
abstract fun finish(settings: Map<String, Any>): Any?
|
||||
abstract fun createPage(controller: WizardController, step: Int, settings: Map<String, Any>): Node
|
||||
abstract fun cancel(): Boolean
|
||||
}
|
||||
394
HMCL/src/main/resources/assets/css/jfoenix-components.css
Normal file
394
HMCL/src/main/resources/assets/css/jfoenix-components.css
Normal file
@@ -0,0 +1,394 @@
|
||||
.root {
|
||||
-fx-font-family: Roboto;
|
||||
src: "/resources/roboto/Roboto-Regular.ttf";
|
||||
}
|
||||
|
||||
/* Burgers Demo */
|
||||
|
||||
.jfx-hamburger {
|
||||
-fx-spacing: 5;
|
||||
-fx-cursor: hand;
|
||||
}
|
||||
|
||||
.jfx-hamburger StackPane {
|
||||
-fx-pref-width: 40px;
|
||||
-fx-pref-height: 7px;
|
||||
-fx-background-color: #D63333;
|
||||
-fx-background-radius: 5px;
|
||||
}
|
||||
|
||||
/* Input Demo */
|
||||
|
||||
.text-field {
|
||||
-fx-max-width: 300;
|
||||
}
|
||||
|
||||
.jfx-text-field, .jfx-password-field {
|
||||
-fx-background-color: WHITE;
|
||||
-fx-font-weight: BOLD;
|
||||
-fx-prompt-text-fill: #808080;
|
||||
-fx-alignment: top-left;
|
||||
-jfx-focus-color: #4059A9;
|
||||
-jfx-unfocus-color: #4d4d4d;
|
||||
-fx-max-width: 300;
|
||||
}
|
||||
|
||||
.jfx-decorator {
|
||||
-fx-decorator-color: RED;
|
||||
}
|
||||
|
||||
.jfx-decorator .jfx-decorator-buttons-container {
|
||||
-fx-background-color: -fx-decorator-color;
|
||||
}
|
||||
|
||||
.jfx-decorator .resize-border {
|
||||
-fx-border-color: -fx-decorator-color;
|
||||
-fx-border-width: 0 4 4 4;
|
||||
}
|
||||
|
||||
.jfx-text-area, .text-area {
|
||||
-fx-font-weight: BOLD;
|
||||
}
|
||||
|
||||
.jfx-text-field:error, .jfx-password-field:error, .jfx-text-area:error {
|
||||
-jfx-focus-color: #D34336;
|
||||
-jfx-unfocus-color: #D34336;
|
||||
}
|
||||
|
||||
.jfx-text-field .error-label, .jfx-password-field .error-label, .jfx-text-area .error-label {
|
||||
-fx-text-fill: #D34336;
|
||||
-fx-font-size: 0.75em;
|
||||
}
|
||||
|
||||
.jfx-text-field .error-icon, .jfx-password-field .error-icon, .jfx-text-area .error-icon {
|
||||
-fx-text-fill: #D34336;
|
||||
-fx-font-size: 1em;
|
||||
}
|
||||
|
||||
/* Progress Bar Demo */
|
||||
|
||||
.progress-bar > .bar {
|
||||
-fx-min-width: 500;
|
||||
}
|
||||
|
||||
.jfx-progress-bar > .bar {
|
||||
-fx-min-width: 500;
|
||||
}
|
||||
|
||||
.jfx-progress-bar {
|
||||
-fx-progress-color: #0F9D58;
|
||||
-fx-stroke-width: 3;
|
||||
}
|
||||
|
||||
/* Icons Demo */
|
||||
.icon {
|
||||
-fx-text-fill: #FE774D;
|
||||
-fx-padding: 10;
|
||||
-fx-cursor: hand;
|
||||
}
|
||||
|
||||
.icons-rippler {
|
||||
-jfx-rippler-fill: BLUE;
|
||||
-jfx-mask-type: CIRCLE;
|
||||
}
|
||||
|
||||
.icons-rippler:hover {
|
||||
-fx-cursor: hand;
|
||||
}
|
||||
|
||||
.jfx-check-box {
|
||||
-fx-font-weight: BOLD;
|
||||
}
|
||||
|
||||
.custom-jfx-check-box {
|
||||
-jfx-checked-color: RED;
|
||||
-jfx-unchecked-color: BLACK;
|
||||
}
|
||||
|
||||
/* Button */
|
||||
.button {
|
||||
-fx-padding: 0.7em 0.57em;
|
||||
-fx-font-size: 14px;
|
||||
}
|
||||
|
||||
.button-raised {
|
||||
-fx-padding: 0.7em 0.57em;
|
||||
-fx-font-size: 14px;
|
||||
-jfx-button-type: RAISED;
|
||||
-fx-background-color: rgb(77, 102, 204);
|
||||
-fx-pref-width: 200;
|
||||
-fx-text-fill: WHITE;
|
||||
}
|
||||
|
||||
/* The main scrollbar **track** CSS class */
|
||||
.mylistview .scroll-bar:horizontal .track,
|
||||
.mylistview .scroll-bar:vertical .track {
|
||||
-fx-background-color: transparent;
|
||||
-fx-border-color: transparent;
|
||||
-fx-background-radius: 0em;
|
||||
-fx-border-radius: 2em;
|
||||
}
|
||||
|
||||
/* The increment and decrement button CSS class of scrollbar */
|
||||
.mylistview .scroll-bar:horizontal .increment-button,
|
||||
.mylistview .scroll-bar:horizontal .decrement-button {
|
||||
-fx-background-color: transparent;
|
||||
-fx-background-radius: 0em;
|
||||
-fx-padding: 0 0 10 0;
|
||||
}
|
||||
|
||||
/* The increment and decrement button CSS class of scrollbar */
|
||||
|
||||
.mylistview .scroll-bar:vertical .increment-button,
|
||||
.mylistview .scroll-bar:vertical .decrement-button {
|
||||
-fx-background-color: transparent;
|
||||
-fx-background-radius: 0em;
|
||||
-fx-padding: 0 10 0 0;
|
||||
|
||||
}
|
||||
|
||||
.mylistview .scroll-bar .increment-arrow,
|
||||
.mylistview .scroll-bar .decrement-arrow {
|
||||
-fx-shape: " ";
|
||||
-fx-padding: 0;
|
||||
}
|
||||
|
||||
/* The main scrollbar **thumb** CSS class which we drag every time (movable) */
|
||||
.mylistview .scroll-bar:horizontal .thumb,
|
||||
.mylistview .scroll-bar:vertical .thumb {
|
||||
-fx-background-color: derive(black, 90%);
|
||||
-fx-background-insets: 2, 0, 0;
|
||||
-fx-background-radius: 2em;
|
||||
}
|
||||
|
||||
.jfx-list-cell-container {
|
||||
-fx-alignment: center-left;
|
||||
}
|
||||
|
||||
.jfx-list-cell-container > .label {
|
||||
-fx-text-fill: BLACK;
|
||||
}
|
||||
|
||||
.jfx-list-cell:odd:selected > .jfx-rippler > StackPane, .jfx-list-cell:even:selected > .jfx-rippler > StackPane {
|
||||
-fx-background-color: rgba(0, 0, 255, 0.2);
|
||||
}
|
||||
|
||||
.jfx-list-cell {
|
||||
-fx-background-insets: 0.0;
|
||||
-fx-text-fill: BLACK;
|
||||
}
|
||||
|
||||
.jfx-list-cell:odd, .jfx-list-cell:even {
|
||||
-fx-background-color: WHITE;
|
||||
}
|
||||
|
||||
.jfx-list-cell:filled:hover {
|
||||
-fx-text-fill: black;
|
||||
}
|
||||
|
||||
.jfx-list-cell .jfx-rippler {
|
||||
-jfx-rippler-fill: BLUE;
|
||||
}
|
||||
|
||||
.jfx-list-view {
|
||||
-fx-background-insets: 0;
|
||||
-jfx-cell-horizontal-margin: 0.0;
|
||||
-jfx-cell-vertical-margin: 5.0;
|
||||
-jfx-vertical-gap: 10;
|
||||
-jfx-expanded: false;
|
||||
-fx-pref-width: 200;
|
||||
}
|
||||
|
||||
.jfx-toggle-button {
|
||||
-jfx-toggle-color: RED;
|
||||
}
|
||||
|
||||
.jfx-tool-bar {
|
||||
-fx-font-size: 15;
|
||||
-fx-background-color: #5264AE;
|
||||
-fx-pref-width: 100%;
|
||||
-fx-pref-height: 64px;
|
||||
}
|
||||
|
||||
.jfx-tool-bar HBox {
|
||||
-fx-alignment: center;
|
||||
-fx-spacing: 25;
|
||||
-fx-padding: 0 10;
|
||||
}
|
||||
|
||||
.jfx-tool-bar Label {
|
||||
-fx-text-fill: WHITE;
|
||||
}
|
||||
|
||||
.jfx-popup-container {
|
||||
-fx-background-color: WHITE;
|
||||
}
|
||||
|
||||
.jfx-snackbar-content {
|
||||
-fx-background-color: #323232;
|
||||
-fx-padding: 5;
|
||||
-fx-spacing: 5;
|
||||
}
|
||||
|
||||
.jfx-snackbar-toast {
|
||||
-fx-text-fill: WHITE;
|
||||
}
|
||||
|
||||
.jfx-snackbar-action {
|
||||
-fx-text-fill: #ff4081;
|
||||
}
|
||||
|
||||
.jfx-list-cell-content-container {
|
||||
-fx-alignment: center-left;
|
||||
}
|
||||
|
||||
.jfx-list-cell-container .label {
|
||||
-fx-text-fill: BLACK;
|
||||
}
|
||||
|
||||
.combo-box-popup .list-view .jfx-list-cell:odd:selected .jfx-list-cell-container,
|
||||
.combo-box-popup .list-view .jfx-list-cell:even:selected .jfx-list-cell-container {
|
||||
-fx-background-color: rgba(0.0, 0.0, 255.0, 0.2);
|
||||
}
|
||||
|
||||
.combo-box-popup .list-view .jfx-list-cell {
|
||||
-fx-background-insets: 0.0;
|
||||
-fx-text-fill: BLACK;
|
||||
}
|
||||
|
||||
.combo-box-popup .list-view .jfx-list-cell:odd,
|
||||
.combo-box-popup .list-view .jfx-list-cell:even {
|
||||
-fx-background-color: WHITE;
|
||||
}
|
||||
|
||||
.combo-box-popup .list-view .jfx-list-cell:filled:hover {
|
||||
-fx-text-fill: black;
|
||||
}
|
||||
|
||||
.combo-box-popup .list-view .jfx-list-cell .jfx-rippler {
|
||||
-fx-rippler-fill: #5264AE;
|
||||
}
|
||||
|
||||
/*.combo-box .combo-box-button-container{
|
||||
-fx-border-color:BLACK;-fx-border-width: 0 0 1 0;
|
||||
}
|
||||
.combo-box .combo-box-selected-value-container{
|
||||
-fx-border-color:BLACK;
|
||||
} */
|
||||
|
||||
/*
|
||||
* TREE TABLE CSS
|
||||
*/
|
||||
|
||||
.tree-table-view {
|
||||
-fx-tree-table-color: rgba(255, 0, 0, 0.2);
|
||||
-fx-tree-table-rippler-color: rgba(255, 0, 0, 0.4);
|
||||
}
|
||||
|
||||
.tree-table-view:focused .tree-table-row-cell:selected {
|
||||
-fx-background-color: -fx-tree-table-color;
|
||||
-fx-table-cell-border-color: -fx-tree-table-color;
|
||||
-fx-text-fill: BLACK;
|
||||
}
|
||||
|
||||
.tree-table-view:focused .tree-table-row-cell:selected .tree-table-cell {
|
||||
-fx-text-fill: BLACK;
|
||||
}
|
||||
|
||||
.tree-table-view .jfx-rippler {
|
||||
-jfx-rippler-fill: -fx-tree-table-rippler-color;
|
||||
}
|
||||
|
||||
.tree-table-view .column-header,
|
||||
.tree-table-view .column-header-background,
|
||||
.tree-table-view .column-header-background .filler {
|
||||
-fx-background-color: TRANSPARENT;
|
||||
}
|
||||
|
||||
.tree-table-view .column-header {
|
||||
-fx-border-width: 0 1 0 1;
|
||||
-fx-border-color: #F3F3F3;
|
||||
}
|
||||
|
||||
.tree-table-view .column-header .label {
|
||||
-fx-text-fill: #949494;
|
||||
-fx-padding: 16 0 16 0;
|
||||
}
|
||||
|
||||
.tree-table-view .column-header .arrow, .tree-table-view .column-header .sort-order-dot {
|
||||
-fx-background-color: #949494;
|
||||
}
|
||||
|
||||
.tree-table-view .column-header:last-visible {
|
||||
-fx-border-width: 0 2 0 1;
|
||||
}
|
||||
|
||||
.tree-table-view .column-header-background {
|
||||
-fx-border-width: 0 0.0 1 0;
|
||||
-fx-border-color: #F3F3F3;
|
||||
}
|
||||
|
||||
.tree-table-view .tree-table-cell {
|
||||
-fx-border-width: 0 0 0 0;
|
||||
-fx-padding: 16 0 16 0;
|
||||
}
|
||||
|
||||
.tree-table-view .column-overlay {
|
||||
-fx-background-color: -fx-tree-table-color;
|
||||
}
|
||||
|
||||
.tree-table-view .column-resize-line, .tree-table-view .column-drag-header {
|
||||
-fx-background-color: -fx-tree-table-rippler-color;
|
||||
}
|
||||
|
||||
.tree-table-view:focused {
|
||||
-fx-background-color: -fx-tree-table-color, -fx-box-border, -fx-control-inner-background;
|
||||
-fx-background-insets: -1.4, 0, 1;
|
||||
-fx-background-radius: 1.4, 0, 0;
|
||||
/*....*/
|
||||
-fx-padding: 1; /* 0.083333em; */
|
||||
}
|
||||
|
||||
.tree-table-row-cell > .tree-disclosure-node > .arrow {
|
||||
-fx-background-color: -fx-text-fill;
|
||||
-fx-padding: 0.333333em 0.229em 0.333333em 0.229em; /* 4 */
|
||||
-fx-shape: "M 0 -3.5 L 4 0 L 0 3.5 z";
|
||||
}
|
||||
|
||||
.tree-table-row-cell .jfx-text-field {
|
||||
-fx-focus-color: rgba(240, 40, 40);
|
||||
}
|
||||
|
||||
.tree-table-row-group {
|
||||
-fx-background-color: rgba(230, 230, 230);
|
||||
}
|
||||
|
||||
.animated-option-button {
|
||||
-fx-pref-width: 50px;
|
||||
-fx-background-color: #44B449;
|
||||
-fx-background-radius: 50px;
|
||||
-fx-pref-height: 50px;
|
||||
-fx-text-fill: white;
|
||||
-fx-border-color: WHITE;
|
||||
-fx-border-radius: 50px;
|
||||
-fx-border-width: 4px;
|
||||
}
|
||||
|
||||
.animated-option-sub-button {
|
||||
-fx-background-color: #43609C;
|
||||
}
|
||||
|
||||
.animated-option-sub-button2 {
|
||||
-fx-background-color: rgb(203, 104, 96);
|
||||
}
|
||||
|
||||
.tree-table-view .menu-item:focused {
|
||||
-fx-background-color: -fx-tree-table-color;
|
||||
|
||||
}
|
||||
|
||||
.tree-table-view .menu-item .label {
|
||||
-fx-padding: 5 0 5 0;
|
||||
}
|
||||
|
||||
|
||||
1033
HMCL/src/main/resources/assets/css/jfoenix-main-demo.css
Normal file
1033
HMCL/src/main/resources/assets/css/jfoenix-main-demo.css
Normal file
File diff suppressed because it is too large
Load Diff
29
HMCL/src/main/resources/assets/fxml/download/dltype.fxml
Normal file
29
HMCL/src/main/resources/assets/fxml/download/dltype.fxml
Normal file
@@ -0,0 +1,29 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import com.jfoenix.controls.JFXListView?>
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.layout.BorderPane?>
|
||||
<?import javafx.scene.layout.StackPane?>
|
||||
<fx:root xmlns="http://javafx.com/javafx"
|
||||
xmlns:fx="http://javafx.com/fxml"
|
||||
type="StackPane"
|
||||
prefHeight="400.0" prefWidth="600.0">
|
||||
<JFXListView fx:id="list" styleClass="jfx-list-view" maxWidth="300" maxHeight="100">
|
||||
<BorderPane mouseTransparent="true">
|
||||
<left>
|
||||
<Label>Install New Game</Label>
|
||||
</left>
|
||||
<right>
|
||||
<fx:include source="/assets/svg/arrow-right.fxml"/>
|
||||
</right>
|
||||
</BorderPane>
|
||||
<BorderPane mouseTransparent="true">
|
||||
<left>
|
||||
<Label>Install Modpack (CurseForge supported)</Label>
|
||||
</left>
|
||||
<right>
|
||||
<fx:include source="/assets/svg/arrow-right.fxml"/>
|
||||
</right>
|
||||
</BorderPane>
|
||||
</JFXListView>
|
||||
</fx:root>
|
||||
54
HMCL/src/main/resources/assets/fxml/download/installers.fxml
Normal file
54
HMCL/src/main/resources/assets/fxml/download/installers.fxml
Normal file
@@ -0,0 +1,54 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import com.jfoenix.controls.JFXListView?>
|
||||
<?import javafx.scene.layout.StackPane?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.layout.BorderPane?>
|
||||
<?import com.jfoenix.controls.JFXButton?>
|
||||
<?import javafx.scene.layout.HBox?>
|
||||
<fx:root xmlns="http://javafx.com/javafx"
|
||||
xmlns:fx="http://javafx.com/fxml"
|
||||
type="StackPane">
|
||||
<BorderPane>
|
||||
<top>
|
||||
<HBox alignment="CENTER" style="-fx-padding: 40px;">
|
||||
<Label fx:id="lblGameVersion" alignment="CENTER" />
|
||||
</HBox>
|
||||
</top>
|
||||
<center>
|
||||
<JFXListView fx:id="list" styleClass="jfx-list-view" maxHeight="150" maxWidth="300">
|
||||
<BorderPane mouseTransparent="true">
|
||||
<left>
|
||||
<Label fx:id="lblForge">Install Forge</Label>
|
||||
</left>
|
||||
<right>
|
||||
<fx:include source="/assets/svg/arrow-right.fxml"/>
|
||||
</right>
|
||||
</BorderPane>
|
||||
<BorderPane mouseTransparent="true">
|
||||
<left>
|
||||
<Label fx:id="lblLiteLoader">Install LiteLoader</Label>
|
||||
</left>
|
||||
<right>
|
||||
<fx:include source="/assets/svg/arrow-right.fxml"/>
|
||||
</right>
|
||||
</BorderPane>
|
||||
<BorderPane mouseTransparent="true">
|
||||
<left>
|
||||
<Label fx:id="lblOptiFine">Install OptiFine</Label>
|
||||
</left>
|
||||
<right>
|
||||
<fx:include source="/assets/svg/arrow-right.fxml"/>
|
||||
</right>
|
||||
</BorderPane>
|
||||
</JFXListView>
|
||||
</center>
|
||||
<bottom>
|
||||
<HBox alignment="CENTER">
|
||||
<JFXButton fx:id="buttonLaunch" prefWidth="100" prefHeight="40" buttonType="RAISED" text="Install"
|
||||
style="-fx-text-fill:WHITE;-fx-background-color:#5264AE;-fx-font-size:14px;"/>
|
||||
</HBox>
|
||||
</bottom>
|
||||
</BorderPane>
|
||||
</fx:root>
|
||||
@@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import javafx.scene.control.*?>
|
||||
<?import javafx.scene.layout.*?>
|
||||
|
||||
<fx:root xmlns="http://javafx.com/javafx"
|
||||
xmlns:fx="http://javafx.com/fxml"
|
||||
type="BorderPane" pickOnBounds="false">
|
||||
<left>
|
||||
<VBox alignment="CENTER_LEFT" mouseTransparent="true">
|
||||
<Label fx:id="lblSelfVersion" style="-fx-font-size: 15;" />
|
||||
</VBox>
|
||||
</left>
|
||||
<center>
|
||||
<VBox alignment="CENTER" mouseTransparent="true">
|
||||
<Label alignment="CENTER" fx:id="lblGameVersion" style="-fx-color: gray;" />
|
||||
</VBox>
|
||||
</center>
|
||||
<right>
|
||||
<fx:include source="/assets/svg/arrow-right.fxml" />
|
||||
</right>
|
||||
</fx:root>
|
||||
13
HMCL/src/main/resources/assets/fxml/download/versions.fxml
Normal file
13
HMCL/src/main/resources/assets/fxml/download/versions.fxml
Normal file
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import com.jfoenix.controls.JFXListView?>
|
||||
<?import javafx.scene.layout.StackPane?>
|
||||
<?import com.jfoenix.controls.JFXSpinner?>
|
||||
<fx:root xmlns="http://javafx.com/javafx"
|
||||
xmlns:fx="http://javafx.com/fxml"
|
||||
type="StackPane"
|
||||
prefHeight="400.0" prefWidth="600.0">
|
||||
<JFXSpinner fx:id="spinner" style="-fx-radius:16" styleClass="materialDesign-purple, first-spinner" />
|
||||
<JFXListView fx:id="list" styleClass="jfx-list-view">
|
||||
</JFXListView>
|
||||
</fx:root>
|
||||
44
HMCL/src/main/resources/assets/fxml/main.fxml
Normal file
44
HMCL/src/main/resources/assets/fxml/main.fxml
Normal file
@@ -0,0 +1,44 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import javafx.scene.control.*?>
|
||||
<?import javafx.scene.layout.*?>
|
||||
<?import com.jfoenix.controls.*?>
|
||||
<BorderPane
|
||||
maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity"
|
||||
fx:controller="org.jackhuang.hmcl.ui.MainController"
|
||||
style="-fx-background-color: white;"
|
||||
xmlns="http://javafx.com/javafx/8.0.112" xmlns:fx="http://javafx.com/fxml/1">
|
||||
<center>
|
||||
<StackPane fx:id="page" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" />
|
||||
</center>
|
||||
<left>
|
||||
<BorderPane prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER">
|
||||
<top>
|
||||
<JFXComboBox fx:id="comboProfiles" prefWidth="150.0" BorderPane.alignment="CENTER" />
|
||||
</top>
|
||||
<center>
|
||||
<StackPane>
|
||||
<JFXListView fx:id="listVersions" styleClass="mylistview" style="-fx-background-color: #F1F1F1;" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" />
|
||||
<AnchorPane pickOnBounds="false">
|
||||
<JFXButton onMouseClicked="#installNewVersion" AnchorPane.bottomAnchor="16" AnchorPane.rightAnchor="16" buttonType="RAISED" prefWidth="40" prefHeight="40" style="-fx-text-fill:WHITE;-fx-background-color:#5264AE;-fx-font-size:14px;-fx-background-radius: 80px;">
|
||||
<graphic>
|
||||
<fx:include source="/assets/svg/plus.fxml" />
|
||||
</graphic>
|
||||
</JFXButton>
|
||||
</AnchorPane>
|
||||
</StackPane>
|
||||
</center>
|
||||
</BorderPane>
|
||||
</left>
|
||||
<bottom>
|
||||
<BorderPane prefHeight="50.0" prefWidth="200.0" BorderPane.alignment="CENTER">
|
||||
<right>
|
||||
<StackPane prefHeight="50.0" prefWidth="150.0" BorderPane.alignment="CENTER">
|
||||
<JFXSpinner fx:id="spinner" style="-fx-radius:16" styleClass="materialDesign-purple, first-spinner" />
|
||||
<JFXButton fx:id="buttonLaunch" prefWidth="100" prefHeight="40" buttonType="RAISED" text="Launch"
|
||||
style="-fx-text-fill:WHITE;-fx-background-color:#5264AE;-fx-font-size:14px;"/>
|
||||
</StackPane>
|
||||
</right>
|
||||
</BorderPane>
|
||||
</bottom>
|
||||
</BorderPane>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user