mirror of
https://github.com/packwiz/packwiz-installer.git
synced 2025-10-17 00:14:33 +02:00
Compare commits
7 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
60887a4312 | ||
|
a368268038 | ||
|
8beded7b41 | ||
|
91060dcd54 | ||
|
e06ee21f3b | ||
|
b3370739a5 | ||
|
ecc6f0440a |
30
.gitignore
vendored
30
.gitignore
vendored
@@ -1,9 +1,9 @@
|
|||||||
|
|
||||||
# Created by https://www.gitignore.io/api/java,gradle,intellij
|
# Created by https://www.toptal.com/developers/gitignore/api/java,gradle,intellij+all
|
||||||
# Edit at https://www.gitignore.io/?templates=java,gradle,intellij
|
# Edit at https://www.toptal.com/developers/gitignore?templates=java,gradle,intellij+all
|
||||||
|
|
||||||
### Intellij ###
|
### Intellij+all ###
|
||||||
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
|
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
|
||||||
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||||
|
|
||||||
# User-specific stuff
|
# User-specific stuff
|
||||||
@@ -33,6 +33,9 @@
|
|||||||
# When using Gradle or Maven with auto-import, you should exclude module files,
|
# When using Gradle or Maven with auto-import, you should exclude module files,
|
||||||
# since they will be recreated, and may cause churn. Uncomment if using
|
# since they will be recreated, and may cause churn. Uncomment if using
|
||||||
# auto-import.
|
# auto-import.
|
||||||
|
# .idea/artifacts
|
||||||
|
# .idea/compiler.xml
|
||||||
|
# .idea/jarRepositories.xml
|
||||||
# .idea/modules.xml
|
# .idea/modules.xml
|
||||||
# .idea/*.iml
|
# .idea/*.iml
|
||||||
# .idea/modules
|
# .idea/modules
|
||||||
@@ -72,13 +75,18 @@ fabric.properties
|
|||||||
# Android studio 3.1+ serialized cache file
|
# Android studio 3.1+ serialized cache file
|
||||||
.idea/caches/build_file_checksums.ser
|
.idea/caches/build_file_checksums.ser
|
||||||
|
|
||||||
### Intellij Patch ###
|
### Intellij+all Patch ###
|
||||||
# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
|
# Ignores the whole .idea folder and all .iml files
|
||||||
|
# See https://github.com/joeblau/gitignore.io/issues/186 and https://github.com/joeblau/gitignore.io/issues/360
|
||||||
|
|
||||||
# *.iml
|
.idea/
|
||||||
# modules.xml
|
|
||||||
# .idea/misc.xml
|
# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023
|
||||||
# *.ipr
|
|
||||||
|
*.iml
|
||||||
|
modules.xml
|
||||||
|
.idea/misc.xml
|
||||||
|
*.ipr
|
||||||
|
|
||||||
# Sonarlint plugin
|
# Sonarlint plugin
|
||||||
.idea/sonarlint
|
.idea/sonarlint
|
||||||
@@ -127,4 +135,4 @@ gradle-app.setting
|
|||||||
### Gradle Patch ###
|
### Gradle Patch ###
|
||||||
**/build/
|
**/build/
|
||||||
|
|
||||||
# End of https://www.gitignore.io/api/java,gradle,intellij
|
# End of https://www.toptal.com/developers/gitignore/api/java,gradle,intellij+all
|
||||||
|
5
.idea/codeStyles/codeStyleConfig.xml
generated
5
.idea/codeStyles/codeStyleConfig.xml
generated
@@ -1,5 +0,0 @@
|
|||||||
<component name="ProjectCodeStyleConfiguration">
|
|
||||||
<state>
|
|
||||||
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
|
|
||||||
</state>
|
|
||||||
</component>
|
|
6
.idea/compiler.xml
generated
6
.idea/compiler.xml
generated
@@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="CompilerConfiguration">
|
|
||||||
<bytecodeTargetLevel target="1.8" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
36
.idea/inspectionProfiles/Project_Default.xml
generated
36
.idea/inspectionProfiles/Project_Default.xml
generated
@@ -1,36 +0,0 @@
|
|||||||
<component name="InspectionProjectProfileManager">
|
|
||||||
<profile version="1.0">
|
|
||||||
<option name="myName" value="Project Default" />
|
|
||||||
<inspection_tool class="JavaDoc" enabled="true" level="WARNING" enabled_by_default="true">
|
|
||||||
<option name="TOP_LEVEL_CLASS_OPTIONS">
|
|
||||||
<value>
|
|
||||||
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
|
|
||||||
<option name="REQUIRED_TAGS" value="" />
|
|
||||||
</value>
|
|
||||||
</option>
|
|
||||||
<option name="INNER_CLASS_OPTIONS">
|
|
||||||
<value>
|
|
||||||
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
|
|
||||||
<option name="REQUIRED_TAGS" value="" />
|
|
||||||
</value>
|
|
||||||
</option>
|
|
||||||
<option name="METHOD_OPTIONS">
|
|
||||||
<value>
|
|
||||||
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
|
|
||||||
<option name="REQUIRED_TAGS" value="@return@param@throws or @exception" />
|
|
||||||
</value>
|
|
||||||
</option>
|
|
||||||
<option name="FIELD_OPTIONS">
|
|
||||||
<value>
|
|
||||||
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
|
|
||||||
<option name="REQUIRED_TAGS" value="" />
|
|
||||||
</value>
|
|
||||||
</option>
|
|
||||||
<option name="IGNORE_DEPRECATED" value="false" />
|
|
||||||
<option name="IGNORE_JAVADOC_PERIOD" value="true" />
|
|
||||||
<option name="IGNORE_DUPLICATED_THROWS" value="false" />
|
|
||||||
<option name="IGNORE_POINT_TO_ITSELF" value="false" />
|
|
||||||
<option name="myAdditionalJavadocTags" value="wbp.parser.entryPoint" />
|
|
||||||
</inspection_tool>
|
|
||||||
</profile>
|
|
||||||
</component>
|
|
20
.idea/jarRepositories.xml
generated
20
.idea/jarRepositories.xml
generated
@@ -1,20 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="RemoteRepositoriesConfiguration">
|
|
||||||
<remote-repository>
|
|
||||||
<option name="id" value="central" />
|
|
||||||
<option name="name" value="Maven Central repository" />
|
|
||||||
<option name="url" value="https://repo1.maven.org/maven2" />
|
|
||||||
</remote-repository>
|
|
||||||
<remote-repository>
|
|
||||||
<option name="id" value="jboss.community" />
|
|
||||||
<option name="name" value="JBoss Community repository" />
|
|
||||||
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
|
|
||||||
</remote-repository>
|
|
||||||
<remote-repository>
|
|
||||||
<option name="id" value="BintrayJCenter" />
|
|
||||||
<option name="name" value="BintrayJCenter" />
|
|
||||||
<option name="url" value="https://jcenter.bintray.com/" />
|
|
||||||
</remote-repository>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
10
.idea/misc.xml
generated
10
.idea/misc.xml
generated
@@ -1,10 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="EntryPointsManager">
|
|
||||||
<list size="1">
|
|
||||||
<item index="0" class="java.lang.String" itemvalue="com.google.gson.annotations.SerializedName" />
|
|
||||||
</list>
|
|
||||||
</component>
|
|
||||||
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
|
||||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="false" project-jdk-name="11" project-jdk-type="JavaSDK" />
|
|
||||||
</project>
|
|
2
.idea/packwiz-installer.iml
generated
2
.idea/packwiz-installer.iml
generated
@@ -1,2 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<module type="JAVA_MODULE" version="4" />
|
|
6
.idea/vcs.xml
generated
6
.idea/vcs.xml
generated
@@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="VcsDirectoryMappings">
|
|
||||||
<mapping directory="" vcs="Git" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
@@ -176,7 +176,10 @@ internal class DownloadTask private constructor(val metadata: IndexFile.File, de
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (fileSource.hashIsEqual(hash)) {
|
if (fileSource.hashIsEqual(hash)) {
|
||||||
Files.createDirectories(destPath.parent)
|
// isDirectory follows symlinks, but createDirectories doesn't
|
||||||
|
if (!Files.isDirectory(destPath.parent)) {
|
||||||
|
Files.createDirectories(destPath.parent)
|
||||||
|
}
|
||||||
Files.copy(data.inputStream(), destPath, StandardCopyOption.REPLACE_EXISTING)
|
Files.copy(data.inputStream(), destPath, StandardCopyOption.REPLACE_EXISTING)
|
||||||
data.clear()
|
data.clear()
|
||||||
} else {
|
} else {
|
||||||
|
@@ -18,6 +18,9 @@ import kotlin.system.exitProcess
|
|||||||
|
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
class Main(args: Array<String>) {
|
class Main(args: Array<String>) {
|
||||||
|
// Don't attempt to start a GUI if we are headless
|
||||||
|
var guiEnabled = !GraphicsEnvironment.isHeadless()
|
||||||
|
|
||||||
private fun startup(args: Array<String>) {
|
private fun startup(args: Array<String>) {
|
||||||
val options = Options()
|
val options = Options()
|
||||||
addNonBootstrapOptions(options)
|
addNonBootstrapOptions(options)
|
||||||
@@ -28,19 +31,24 @@ class Main(args: Array<String>) {
|
|||||||
parser.parse(options, args)
|
parser.parse(options, args)
|
||||||
} catch (e: ParseException) {
|
} catch (e: ParseException) {
|
||||||
e.printStackTrace()
|
e.printStackTrace()
|
||||||
try {
|
if (guiEnabled) {
|
||||||
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName())
|
EventQueue.invokeAndWait {
|
||||||
} catch (e1: Exception) {
|
try {
|
||||||
// Ignore the exceptions, just continue using the ugly L&F
|
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName())
|
||||||
|
} catch (ignored: Exception) {
|
||||||
|
// Ignore the exceptions, just continue using the ugly L&F
|
||||||
|
}
|
||||||
|
JOptionPane.showMessageDialog(null, e.message, "packwiz-installer", JOptionPane.ERROR_MESSAGE)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
JOptionPane.showMessageDialog(null, e.message, "packwiz-installer", JOptionPane.ERROR_MESSAGE)
|
|
||||||
exitProcess(1)
|
exitProcess(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
// if "headless", GUI creation will fail anyway!
|
if (guiEnabled && cmd.hasOption("no-gui")) {
|
||||||
val ui = if (cmd.hasOption("no-gui") || GraphicsEnvironment.isHeadless()) {
|
guiEnabled = false
|
||||||
CLIHandler()
|
}
|
||||||
} else InstallWindow()
|
|
||||||
|
val ui = if (guiEnabled) InstallWindow() else CLIHandler()
|
||||||
|
|
||||||
val unparsedArgs = cmd.args
|
val unparsedArgs = cmd.args
|
||||||
if (unparsedArgs.size > 1) {
|
if (unparsedArgs.size > 1) {
|
||||||
@@ -49,15 +57,13 @@ class Main(args: Array<String>) {
|
|||||||
ui.handleExceptionAndExit(RuntimeException("URI to install from must be specified!"))
|
ui.handleExceptionAndExit(RuntimeException("URI to install from must be specified!"))
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd.getOptionValue("title")?.also {
|
cmd.getOptionValue("title")?.also(ui::setTitle)
|
||||||
ui.setTitle(it)
|
|
||||||
}
|
|
||||||
|
|
||||||
val inputStateHandler = InputStateHandler()
|
val inputStateHandler = InputStateHandler()
|
||||||
ui.show(inputStateHandler)
|
ui.show(inputStateHandler)
|
||||||
|
|
||||||
val uOptions = UpdateManager.Options().apply {
|
val uOptions = UpdateManager.Options().apply {
|
||||||
side = cmd.getOptionValue("side")?.let { UpdateManager.Options.Side.from(it) } ?: side
|
side = cmd.getOptionValue("side")?.let((UpdateManager.Options.Side)::from) ?: side
|
||||||
packFolder = cmd.getOptionValue("pack-folder") ?: packFolder
|
packFolder = cmd.getOptionValue("pack-folder") ?: packFolder
|
||||||
manifestFile = cmd.getOptionValue("meta-file") ?: manifestFile
|
manifestFile = cmd.getOptionValue("meta-file") ?: manifestFile
|
||||||
}
|
}
|
||||||
@@ -113,11 +119,13 @@ class Main(args: Array<String>) {
|
|||||||
startup(args)
|
startup(args)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
e.printStackTrace()
|
e.printStackTrace()
|
||||||
EventQueue.invokeLater {
|
if (guiEnabled) {
|
||||||
JOptionPane.showMessageDialog(null,
|
EventQueue.invokeLater {
|
||||||
|
JOptionPane.showMessageDialog(null,
|
||||||
"A fatal error occurred: \n" + e.javaClass.canonicalName + ": " + e.message,
|
"A fatal error occurred: \n" + e.javaClass.canonicalName + ": " + e.message,
|
||||||
"packwiz-installer", JOptionPane.ERROR_MESSAGE)
|
"packwiz-installer", JOptionPane.ERROR_MESSAGE)
|
||||||
exitProcess(1)
|
exitProcess(1)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// In case the EventQueue is broken, exit after 1 minute
|
// In case the EventQueue is broken, exit after 1 minute
|
||||||
Thread.sleep(60 * 1000.toLong())
|
Thread.sleep(60 * 1000.toLong())
|
||||||
|
@@ -255,8 +255,7 @@ class UpdateManager internal constructor(private val opts: Options, val ui: IUse
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
if (!indexFileSource.hashIsEqual(indexHash)) {
|
if (!indexFileSource.hashIsEqual(indexHash)) {
|
||||||
// TODO: throw exception
|
ui.handleExceptionAndExit(RuntimeException("Your index hash is invalid! Please run packwiz refresh on the pack again"))
|
||||||
println("I was meant to put an error message here but I'll do that later")
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if (stateHandler.cancelButton) {
|
if (stateHandler.cancelButton) {
|
||||||
|
@@ -4,6 +4,7 @@ import link.infra.packwiz.installer.metadata.SpaceSafeURI
|
|||||||
import link.infra.packwiz.installer.request.IRequestHandler
|
import link.infra.packwiz.installer.request.IRequestHandler
|
||||||
import okio.Source
|
import okio.Source
|
||||||
import okio.source
|
import okio.source
|
||||||
|
import java.net.HttpURLConnection
|
||||||
|
|
||||||
open class RequestHandlerHTTP : IRequestHandler {
|
open class RequestHandlerHTTP : IRequestHandler {
|
||||||
override fun matchesHandler(loc: SpaceSafeURI): Boolean {
|
override fun matchesHandler(loc: SpaceSafeURI): Boolean {
|
||||||
@@ -12,14 +13,17 @@ open class RequestHandlerHTTP : IRequestHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun getFileSource(loc: SpaceSafeURI): Source? {
|
override fun getFileSource(loc: SpaceSafeURI): Source? {
|
||||||
val conn = loc.toURL().openConnection()
|
val conn = loc.toURL().openConnection() as HttpURLConnection
|
||||||
// TODO: when do we send specific headers??? should there be a way to signal this?
|
// TODO: when do we send specific headers??? should there be a way to signal this?
|
||||||
// github *sometimes* requires it, sometimes not!
|
conn.addRequestProperty("Accept", "application/octet-stream")
|
||||||
//conn.addRequestProperty("Accept", "application/octet-stream");
|
// TODO: include version?
|
||||||
|
conn.addRequestProperty("User-Agent", "packwiz-installer")
|
||||||
|
|
||||||
conn.apply {
|
conn.apply {
|
||||||
// 30 second read timeout
|
// 30 second read timeout
|
||||||
readTimeout = 30 * 1000
|
readTimeout = 30 * 1000
|
||||||
|
requestMethod = "GET"
|
||||||
}
|
}
|
||||||
return conn.getInputStream().source()
|
return conn.inputStream.source()
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -10,10 +10,10 @@ import javax.swing.border.EmptyBorder
|
|||||||
import kotlin.system.exitProcess
|
import kotlin.system.exitProcess
|
||||||
|
|
||||||
class InstallWindow : IUserInterface {
|
class InstallWindow : IUserInterface {
|
||||||
private val frmPackwizlauncher: JFrame
|
private lateinit var frmPackwizlauncher: JFrame
|
||||||
private val lblProgresslabel: JLabel
|
private lateinit var lblProgresslabel: JLabel
|
||||||
private val progressBar: JProgressBar
|
private lateinit var progressBar: JProgressBar
|
||||||
private val btnOptions: JButton
|
private lateinit var btnOptions: JButton
|
||||||
|
|
||||||
private var inputStateHandler: InputStateHandler? = null
|
private var inputStateHandler: InputStateHandler? = null
|
||||||
private var title = "Updating modpack..."
|
private var title = "Updating modpack..."
|
||||||
@@ -23,55 +23,57 @@ class InstallWindow : IUserInterface {
|
|||||||
// TODO: separate JFrame junk from IUserInterface junk?
|
// TODO: separate JFrame junk from IUserInterface junk?
|
||||||
|
|
||||||
init {
|
init {
|
||||||
frmPackwizlauncher = JFrame().apply {
|
EventQueue.invokeAndWait {
|
||||||
title = this@InstallWindow.title
|
frmPackwizlauncher = JFrame().apply {
|
||||||
setBounds(100, 100, 493, 95)
|
title = this@InstallWindow.title
|
||||||
defaultCloseOperation = JFrame.EXIT_ON_CLOSE
|
setBounds(100, 100, 493, 95)
|
||||||
setLocationRelativeTo(null)
|
defaultCloseOperation = JFrame.EXIT_ON_CLOSE
|
||||||
|
setLocationRelativeTo(null)
|
||||||
|
|
||||||
// Progress bar and loading text
|
// Progress bar and loading text
|
||||||
add(JPanel().apply {
|
add(JPanel().apply {
|
||||||
border = EmptyBorder(10, 10, 10, 10)
|
border = EmptyBorder(10, 10, 10, 10)
|
||||||
layout = BorderLayout(0, 0)
|
layout = BorderLayout(0, 0)
|
||||||
|
|
||||||
progressBar = JProgressBar().apply {
|
progressBar = JProgressBar().apply {
|
||||||
isIndeterminate = true
|
isIndeterminate = true
|
||||||
}
|
|
||||||
add(progressBar, BorderLayout.CENTER)
|
|
||||||
|
|
||||||
lblProgresslabel = JLabel("Loading...")
|
|
||||||
add(lblProgresslabel, BorderLayout.SOUTH)
|
|
||||||
}, BorderLayout.CENTER)
|
|
||||||
|
|
||||||
// Buttons
|
|
||||||
add(JPanel().apply {
|
|
||||||
border = EmptyBorder(0, 5, 0, 5)
|
|
||||||
layout = GridBagLayout()
|
|
||||||
|
|
||||||
btnOptions = JButton("Optional mods...").apply {
|
|
||||||
alignmentX = Component.CENTER_ALIGNMENT
|
|
||||||
|
|
||||||
addActionListener {
|
|
||||||
text = "Loading..."
|
|
||||||
isEnabled = false
|
|
||||||
inputStateHandler?.pressOptionsButton()
|
|
||||||
}
|
}
|
||||||
}
|
add(progressBar, BorderLayout.CENTER)
|
||||||
add(btnOptions, GridBagConstraints().apply {
|
|
||||||
gridx = 0
|
|
||||||
gridy = 0
|
|
||||||
})
|
|
||||||
|
|
||||||
add(JButton("Cancel").apply {
|
lblProgresslabel = JLabel("Loading...")
|
||||||
addActionListener {
|
add(lblProgresslabel, BorderLayout.SOUTH)
|
||||||
isEnabled = false
|
}, BorderLayout.CENTER)
|
||||||
inputStateHandler?.pressCancelButton()
|
|
||||||
|
// Buttons
|
||||||
|
add(JPanel().apply {
|
||||||
|
border = EmptyBorder(0, 5, 0, 5)
|
||||||
|
layout = GridBagLayout()
|
||||||
|
|
||||||
|
btnOptions = JButton("Optional mods...").apply {
|
||||||
|
alignmentX = Component.CENTER_ALIGNMENT
|
||||||
|
|
||||||
|
addActionListener {
|
||||||
|
text = "Loading..."
|
||||||
|
isEnabled = false
|
||||||
|
inputStateHandler?.pressOptionsButton()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}, GridBagConstraints().apply {
|
add(btnOptions, GridBagConstraints().apply {
|
||||||
gridx = 0
|
gridx = 0
|
||||||
gridy = 1
|
gridy = 0
|
||||||
})
|
})
|
||||||
}, BorderLayout.EAST)
|
|
||||||
|
add(JButton("Cancel").apply {
|
||||||
|
addActionListener {
|
||||||
|
isEnabled = false
|
||||||
|
inputStateHandler?.pressCancelButton()
|
||||||
|
}
|
||||||
|
}, GridBagConstraints().apply {
|
||||||
|
gridx = 0
|
||||||
|
gridy = 1
|
||||||
|
})
|
||||||
|
}, BorderLayout.EAST)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -178,9 +180,16 @@ class InstallWindow : IUserInterface {
|
|||||||
override fun showOptions(options: List<IOptionDetails>): Future<Boolean> {
|
override fun showOptions(options: List<IOptionDetails>): Future<Boolean> {
|
||||||
val future = CompletableFuture<Boolean>()
|
val future = CompletableFuture<Boolean>()
|
||||||
EventQueue.invokeLater {
|
EventQueue.invokeLater {
|
||||||
OptionsSelectWindow(options, future, frmPackwizlauncher).apply {
|
if (options.isEmpty()) {
|
||||||
defaultCloseOperation = JDialog.DISPOSE_ON_CLOSE
|
JOptionPane.showMessageDialog(null,
|
||||||
isVisible = true
|
"This modpack has no optional mods!",
|
||||||
|
"Optional mods", JOptionPane.INFORMATION_MESSAGE)
|
||||||
|
future.complete(false)
|
||||||
|
} else {
|
||||||
|
OptionsSelectWindow(options, future, frmPackwizlauncher).apply {
|
||||||
|
defaultCloseOperation = JDialog.DISPOSE_ON_CLOSE
|
||||||
|
isVisible = true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return future
|
return future
|
||||||
@@ -199,7 +208,7 @@ class InstallWindow : IUserInterface {
|
|||||||
|
|
||||||
override fun disableOptionsButton() {
|
override fun disableOptionsButton() {
|
||||||
btnOptions.apply {
|
btnOptions.apply {
|
||||||
text = "Optional mods..."
|
text = "No optional mods"
|
||||||
isEnabled = false
|
isEnabled = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user