Settings page refined

This commit is contained in:
huangyuhui 2017-08-16 12:02:04 +08:00
parent 45ac758b52
commit 1394034160
21 changed files with 161 additions and 97 deletions

View File

@ -22,12 +22,10 @@ import javafx.stage.Stage
import org.jackhuang.hmcl.setting.Settings
import org.jackhuang.hmcl.task.Scheduler
import org.jackhuang.hmcl.ui.Controllers
import org.jackhuang.hmcl.ui.UTF8Control
import org.jackhuang.hmcl.util.DEFAULT_USER_AGENT
import org.jackhuang.hmcl.util.LOG
import org.jackhuang.hmcl.util.OS
import java.io.File
import java.util.*
import java.util.logging.Level
fun i18n(key: String): String {
@ -83,6 +81,6 @@ class Main : Application() {
Scheduler.shutdown()
}
val RESOURCE_BUNDLE = Settings.LANG.resourceBundle
val RESOURCE_BUNDLE = Settings.locale.resourceBundle
}
}

View File

@ -31,7 +31,7 @@ object LauncherHelper {
repository = repository,
versionId = profile.selectedVersion,
options = profile.getVersionSetting(profile.selectedVersion).toLaunchOptions(profile.gameDir),
account = account.logIn(Settings.PROXY)
account = account.logIn(Settings.proxy)
)
profile.dependency.checkGameCompletionAsync(version)

View File

@ -37,7 +37,7 @@ class Config {
Settings.save()
}
@SerializedName("commonpath")
var commonpath: File = Main.getMinecraftDirectory()
var commonpath: String = Main.getMinecraftDirectory().absolutePath
set(value) {
field = value
Settings.save()

View File

@ -19,12 +19,10 @@ package org.jackhuang.hmcl.setting
import com.google.gson.*
import javafx.beans.InvalidationListener
import org.jackhuang.hmcl.download.BMCLAPIDownloadProvider
import org.jackhuang.hmcl.download.DefaultDependencyManager
import org.jackhuang.hmcl.game.HMCLGameRepository
import org.jackhuang.hmcl.mod.ModManager
import org.jackhuang.hmcl.util.*
import org.jackhuang.hmcl.util.property.ImmediateBooleanProperty
import org.jackhuang.hmcl.util.property.ImmediateObjectProperty
import org.jackhuang.hmcl.util.property.ImmediateStringProperty
import java.io.File
@ -41,7 +39,7 @@ class Profile(var name: String = "Default", initialGameDir: File = File(".minecr
var gameDir: File by gameDirProperty
var repository = HMCLGameRepository(initialGameDir)
val dependency: DefaultDependencyManager get() = DefaultDependencyManager(repository, Settings.DOWNLOAD_PROVIDER, Settings.PROXY)
val dependency: DefaultDependencyManager get() = DefaultDependencyManager(repository, Settings.downloadProvider, Settings.proxy)
var modManager = ModManager(repository)
init {

View File

@ -33,6 +33,7 @@ import org.jackhuang.hmcl.auth.Account
import org.jackhuang.hmcl.util.*
import org.jackhuang.hmcl.event.EVENT_BUS
import org.jackhuang.hmcl.util.property.ImmediateObjectProperty
import org.jackhuang.hmcl.util.property.ImmediateStringProperty
import java.net.Authenticator
import java.net.InetSocketAddress
import java.net.PasswordAuthentication
@ -46,14 +47,14 @@ object Settings {
.registerTypeAdapter(File::class.java, FileTypeAdapter)
.setPrettyPrinting().create()
val DEFAULT_PROFILE = "Default"
val HOME_PROFILE = "Home"
const val DEFAULT_PROFILE = "Default"
const val HOME_PROFILE = "Home"
val SETTINGS_FILE = File("hmcl.json").absoluteFile
val SETTINGS_FILE: File = File("hmcl.json").absoluteFile
private val SETTINGS: Config
private val ACCOUNTS = mutableMapOf<String, Account>()
private val accounts = mutableMapOf<String, Account>()
init {
SETTINGS = initSettings();
@ -72,7 +73,7 @@ object Settings {
continue
}
ACCOUNTS[name] = account
accounts[name] = account
}
save()
@ -117,7 +118,7 @@ object Settings {
fun save() {
try {
SETTINGS.accounts.clear()
for ((name, account) in ACCOUNTS) {
for ((name, account) in accounts) {
val storage = account.toStorage()
storage["type"] = Accounts.getAccountType(account)
SETTINGS.accounts[name] = storage
@ -129,37 +130,46 @@ object Settings {
}
}
var LANG: Locales.SupportedLocale = Locales.getLocaleByName(SETTINGS.localization)
val commonPathProperty = object : ImmediateStringProperty(this, "commonPath", SETTINGS.commonpath) {
override fun invalidated() {
super.invalidated()
SETTINGS.commonpath = get()
}
}
var commonPath: String by commonPathProperty
var locale: Locales.SupportedLocale = Locales.getLocaleByName(SETTINGS.localization)
set(value) {
field = value
SETTINGS.localization = Locales.getNameByLocal(value)
}
var PROXY: Proxy = Proxy.NO_PROXY
var PROXY_TYPE: Proxy.Type? = Proxies.getProxyType(SETTINGS.proxyType)
var proxy: Proxy = Proxy.NO_PROXY
var proxyType: Proxy.Type? = Proxies.getProxyType(SETTINGS.proxyType)
set(value) {
field = value
SETTINGS.proxyType = Proxies.PROXIES.indexOf(value)
loadProxy()
}
var PROXY_HOST: String? get() = SETTINGS.proxyHost; set(value) { SETTINGS.proxyHost = value }
var PROXY_PORT: String? get() = SETTINGS.proxyPort; set(value) { SETTINGS.proxyPort = value }
var PROXY_USER: String? get() = SETTINGS.proxyUserName; set(value) { SETTINGS.proxyUserName = value }
var PROXY_PASS: String? get() = SETTINGS.proxyPassword; set(value) { SETTINGS.proxyPassword = value }
var proxyHost: String? get() = SETTINGS.proxyHost; set(value) { SETTINGS.proxyHost = value }
var proxyPort: String? get() = SETTINGS.proxyPort; set(value) { SETTINGS.proxyPort = value }
var proxyUser: String? get() = SETTINGS.proxyUserName; set(value) { SETTINGS.proxyUserName = value }
var proxyPass: String? get() = SETTINGS.proxyPassword; set(value) { SETTINGS.proxyPassword = value }
private fun loadProxy() {
val host = PROXY_HOST
val port = PROXY_PORT?.toIntOrNull()
val host = proxyHost
val port = proxyPort?.toIntOrNull()
if (host == null || host.isBlank() || port == null)
PROXY = Proxy.NO_PROXY
proxy = Proxy.NO_PROXY
else {
System.setProperty("http.proxyHost", PROXY_HOST)
System.setProperty("http.proxyPort", PROXY_PORT)
PROXY = Proxy(PROXY_TYPE, InetSocketAddress(host, port))
System.setProperty("http.proxyHost", proxyHost)
System.setProperty("http.proxyPort", proxyPort)
proxy = Proxy(proxyType, InetSocketAddress(host, port))
val user = PROXY_USER
val pass = PROXY_PASS
val user = proxyUser
val pass = proxyPass
if (user != null && user.isNotBlank() && pass != null && pass.isNotBlank()) {
System.setProperty("http.proxyUser", user)
System.setProperty("http.proxyPassword", pass)
@ -175,7 +185,7 @@ object Settings {
init { loadProxy() }
var DOWNLOAD_PROVIDER: DownloadProvider
var downloadProvider: DownloadProvider
get() = when (SETTINGS.downloadtype) {
0 -> MojangDownloadProvider
1 -> BMCLAPIDownloadProvider
@ -196,15 +206,15 @@ object Settings {
val selectedAccountProperty = object : ImmediateObjectProperty<Account?>(this, "selectedAccount", getAccount(SETTINGS.selectedAccount)) {
override fun get(): Account? {
val a = super.get()
if (a == null || !ACCOUNTS.containsKey(a.username)) {
val acc = if (ACCOUNTS.isEmpty()) null else ACCOUNTS.values.first()
if (a == null || !accounts.containsKey(a.username)) {
val acc = if (accounts.isEmpty()) null else accounts.values.first()
set(acc)
return acc
} else return a
}
override fun set(newValue: Account?) {
if (newValue == null || ACCOUNTS.containsKey(newValue.username)) {
if (newValue == null || accounts.containsKey(newValue.username)) {
super.set(newValue)
}
}
@ -218,19 +228,19 @@ object Settings {
var selectedAccount: Account? by selectedAccountProperty
fun addAccount(account: Account) {
ACCOUNTS[account.username] = account
accounts[account.username] = account
}
fun getAccount(name: String): Account? {
return ACCOUNTS[name]
return accounts[name]
}
fun getAccounts(): Map<String, Account> {
return Collections.unmodifiableMap(ACCOUNTS)
return Collections.unmodifiableMap(accounts)
}
fun deleteAccount(name: String) {
ACCOUNTS.remove(name)
accounts.remove(name)
selectedAccountProperty.get()
}

View File

@ -23,7 +23,7 @@ import org.jackhuang.hmcl.auth.OfflineAccount
import org.jackhuang.hmcl.auth.yggdrasil.YggdrasilAccount
import org.jackhuang.hmcl.download.BMCLAPIDownloadProvider
import org.jackhuang.hmcl.download.MojangDownloadProvider
import org.jackhuang.hmcl.ui.UTF8Control
import org.jackhuang.hmcl.ui.construct.UTF8Control
import java.net.Proxy
import java.util.*

View File

@ -207,10 +207,10 @@ class VersionSetting() {
fullscreen = fullscreen,
serverIp = serverIp,
wrapper = wrapper,
proxyHost = Settings.PROXY_HOST,
proxyPort = Settings.PROXY_PORT,
proxyUser = Settings.PROXY_USER,
proxyPass = Settings.PROXY_PASS,
proxyHost = Settings.proxyHost,
proxyPort = Settings.proxyPort,
proxyUser = Settings.proxyUser,
proxyPass = Settings.proxyPass,
precalledCommand = precalledCommand,
noGeneratedJVMArgs = noJVMArgs
)

View File

@ -143,7 +143,7 @@ class AccountsPage() : StackPane(), DecoratorPage {
else -> throw UnsupportedOperationException()
}
account.logIn(Settings.PROXY)
account.logIn(Settings.proxy)
account
} catch (e: Exception) {
e

View File

@ -18,19 +18,11 @@
package org.jackhuang.hmcl.ui
import com.jfoenix.controls.JFXComboBox
import javafx.beans.value.ChangeListener
import javafx.scene.layout.*
import javafx.scene.paint.Paint
import org.jackhuang.hmcl.ProfileChangedEvent
import org.jackhuang.hmcl.ProfileLoadingEvent
import org.jackhuang.hmcl.auth.Account
import org.jackhuang.hmcl.event.EVENT_BUS
import org.jackhuang.hmcl.event.RefreshedVersionsEvent
import org.jackhuang.hmcl.game.LauncherHelper
import org.jackhuang.hmcl.game.minecraftVersion
import org.jackhuang.hmcl.i18n
import org.jackhuang.hmcl.setting.Settings
import org.jackhuang.hmcl.ui.download.DownloadWizardProvider
import org.jackhuang.hmcl.ui.construct.IconedItem
import org.jackhuang.hmcl.ui.construct.RipplerContainer
class LeftPaneController(private val leftPane: AdvancedListBox) {
val versionsPane = VBox()

View File

@ -22,24 +22,20 @@ import com.jfoenix.controls.JFXMasonryPane
import javafx.application.Platform
import javafx.beans.property.SimpleStringProperty
import javafx.beans.property.StringProperty
import javafx.beans.value.ChangeListener
import javafx.fxml.FXML
import javafx.scene.Node
import javafx.scene.control.ToggleGroup
import javafx.scene.layout.StackPane
import javafx.scene.paint.Paint
import org.jackhuang.hmcl.ProfileChangedEvent
import org.jackhuang.hmcl.ProfileLoadingEvent
import org.jackhuang.hmcl.auth.Account
import org.jackhuang.hmcl.event.EVENT_BUS
import org.jackhuang.hmcl.event.RefreshedVersionsEvent
import org.jackhuang.hmcl.game.LauncherHelper
import org.jackhuang.hmcl.game.Version
import org.jackhuang.hmcl.game.minecraftVersion
import org.jackhuang.hmcl.i18n
import org.jackhuang.hmcl.setting.Profile
import org.jackhuang.hmcl.setting.Settings
import org.jackhuang.hmcl.ui.download.DownloadWizardProvider
import org.jackhuang.hmcl.ui.construct.RipplerContainer
import org.jackhuang.hmcl.ui.wizard.DecoratorPage
/**

View File

@ -59,9 +59,7 @@ object SVG {
fun expand(fill: String = "white", width: Double = 20.0, height: Double = 20.0) = createSVGPath("M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z", fill, width, height)
fun collapse(fill: String = "white", width: Double = 20.0, height: Double = 20.0) = createSVGPath("M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z", fill, width, height)
fun navigate(fill: String = "white", width: Double = 20.0, height: Double = 20.0) = createSVGPath("M14,3V5H17.59L7.76,14.83L9.17,16.24L19,6.41V10H21V3M19,19H5V5H12V3H5C3.89,3 3,3.89 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V12H19V19Z", fill, width, height)
fun launch(fill: String = "white", width: Double = 20.0, height: Double = 20.0) = createSVGPath("M1008 6.286q18.857 13.714 15.429 36.571l-146.286 877.714q-2.857 16.571-18.286 25.714-8 4.571-17.714 4.571-6.286 "
+ "0-13.714-2.857l-258.857-105.714-138.286 168.571q-10.286 13.143-28 13.143-7.429 "
+ "0-12.571-2.286-10.857-4-17.429-13.429t-6.571-20.857v-199.429l493.714-605.143-610.857 "
+ "528.571-225.714-92.571q-21.143-8-22.857-31.429-1.143-22.857 18.286-33.714l950.857-548.571q8.571-5.143 18.286-5.143"
+ " 11.429 0 20.571 6.286z", fill, width, height)
fun launch(fill: String = "white", width: Double = 20.0, height: Double = 20.0) = createSVGPath("M1008 6.286q18.857 13.714 15.429 36.571l-146.286 877.714q-2.857 16.571-18.286 25.714-8 4.571-17.714 4.571-6.286 0-13.714-2.857l-258.857-105.714-138.286 168.571q-10.286 13.143-28 13.143-7.429 0-12.571-2.286-10.857-4-17.429-13.429t-6.571-20.857v-199.429l493.714-605.143-610.857 528.571-225.714-92.571q-21.143-8-22.857-31.429-1.143-22.857 18.286-33.714l950.857-548.571q8.571-5.143 18.286-5.14311.429 0 20.571 6.286z", fill, width, height)
fun pencil(fill: String = "white", width: Double = 20.0, height: Double = 20.0) = createSVGPath("M20.71,4.04C21.1,3.65 21.1,3 20.71,2.63L18.37,0.29C18,-0.1 17.35,-0.1 16.96,0.29L15,2.25L18.75,6M17.75,7L14,3.25L4,13.25V17H7.75L17.75,7Z", fill, width, height)
}

View File

@ -19,7 +19,6 @@ package org.jackhuang.hmcl.ui
import com.jfoenix.controls.JFXComboBox
import com.jfoenix.controls.JFXTextField
import javafx.beans.binding.Bindings
import javafx.beans.property.SimpleStringProperty
import javafx.beans.property.StringProperty
import javafx.collections.FXCollections
@ -31,6 +30,7 @@ import org.jackhuang.hmcl.setting.DownloadProviders
import org.jackhuang.hmcl.setting.Locales
import org.jackhuang.hmcl.setting.Proxies
import org.jackhuang.hmcl.setting.Settings
import org.jackhuang.hmcl.ui.construct.FileItem
import org.jackhuang.hmcl.ui.wizard.DecoratorPage
class SettingsPage : StackPane(), DecoratorPage {
@ -43,6 +43,8 @@ class SettingsPage : StackPane(), DecoratorPage {
@FXML lateinit var cboProxyType: JFXComboBox<*>
@FXML lateinit var cboLanguage: JFXComboBox<*>
@FXML lateinit var cboDownloadSource: JFXComboBox<*>
@FXML lateinit var fileCommonLocation: FileItem
@FXML lateinit var fileBackgroundLocation: FileItem
init {
loadFXML("/assets/fxml/setting.fxml")
@ -50,45 +52,47 @@ class SettingsPage : StackPane(), DecoratorPage {
cboLanguage.limitWidth(400.0)
cboDownloadSource.limitWidth(400.0)
txtProxyHost.text = Settings.PROXY_HOST
txtProxyHost.text = Settings.proxyHost
txtProxyHost.textProperty().addListener { _, _, newValue ->
Settings.PROXY_HOST = newValue
Settings.proxyHost = newValue
}
txtProxyPort.text = Settings.PROXY_PORT
txtProxyPort.text = Settings.proxyPort
txtProxyPort.textProperty().addListener { _, _, newValue ->
Settings.PROXY_PORT = newValue
Settings.proxyPort = newValue
}
txtProxyUsername.text = Settings.PROXY_USER
txtProxyUsername.text = Settings.proxyUser
txtProxyUsername.textProperty().addListener { _, _, newValue ->
Settings.PROXY_USER = newValue
Settings.proxyUser = newValue
}
txtProxyPassword.text = Settings.PROXY_PASS
txtProxyPassword.text = Settings.proxyPass
txtProxyPassword.textProperty().addListener { _, _, newValue ->
Settings.PROXY_PASS = newValue
Settings.proxyPass = newValue
}
cboDownloadSource.selectionModel.select(DownloadProviders.DOWNLOAD_PROVIDERS.indexOf(Settings.DOWNLOAD_PROVIDER))
cboDownloadSource.selectionModel.select(DownloadProviders.DOWNLOAD_PROVIDERS.indexOf(Settings.downloadProvider))
cboDownloadSource.selectionModel.selectedIndexProperty().addListener { _, _, newValue ->
Settings.DOWNLOAD_PROVIDER = DownloadProviders.getDownloadProvider(newValue.toInt())
Settings.downloadProvider = DownloadProviders.getDownloadProvider(newValue.toInt())
}
val list = FXCollections.observableArrayList<Label>()
for (locale in Locales.LOCALES) {
list += Label(locale.getName(Settings.LANG.resourceBundle))
list += Label(locale.getName(Settings.locale.resourceBundle))
}
cboLanguage.items = list
cboLanguage.selectionModel.select(Locales.LOCALES.indexOf(Settings.LANG))
cboLanguage.selectionModel.select(Locales.LOCALES.indexOf(Settings.locale))
cboLanguage.selectionModel.selectedIndexProperty().addListener { _, _, newValue ->
Settings.LANG = Locales.getLocale(newValue.toInt())
Settings.locale = Locales.getLocale(newValue.toInt())
}
cboProxyType.selectionModel.select(Proxies.PROXIES.indexOf(Settings.PROXY_TYPE))
cboProxyType.selectionModel.select(Proxies.PROXIES.indexOf(Settings.proxyType))
cboProxyType.selectionModel.selectedIndexProperty().addListener { _, _, newValue ->
Settings.PROXY_TYPE = Proxies.getProxyType(newValue.toInt())
Settings.proxyType = Proxies.getProxyType(newValue.toInt())
}
fileCommonLocation.setProperty(Settings.commonPathProperty)
}

View File

@ -28,6 +28,7 @@ import javafx.stage.DirectoryChooser
import org.jackhuang.hmcl.i18n
import org.jackhuang.hmcl.setting.VersionSetting
import org.jackhuang.hmcl.ui.construct.ComponentList
import org.jackhuang.hmcl.ui.construct.NumberValidator
import org.jackhuang.hmcl.util.OS
class VersionSettingsController {

View File

@ -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.construct
import com.jfoenix.controls.JFXButton
import javafx.beans.property.Property
import javafx.beans.property.SimpleStringProperty
import javafx.scene.control.Label
import javafx.scene.control.Tooltip
import javafx.scene.layout.BorderPane
import javafx.scene.layout.VBox
import javafx.stage.DirectoryChooser
import org.jackhuang.hmcl.ui.Controllers
import org.jackhuang.hmcl.ui.SVG
import org.jackhuang.hmcl.util.*
class FileItem : BorderPane() {
val nameProperty = SimpleStringProperty(this, "name")
var name: String by nameProperty
val titleProperty = SimpleStringProperty(this, "title")
var title: String by titleProperty
val tooltipProperty = SimpleStringProperty(this, "tooltip")
var tooltip: String by tooltipProperty
private lateinit var property: Property<String>
private val x = Label()
init {
left = VBox().apply {
children += Label().apply { textProperty().bind(nameProperty) }
children += x.apply { style += "-fx-text-fill: gray;" }
}
right = JFXButton().apply {
graphic = SVG.pencil("black", 15.0, 15.0)
styleClass += "toggle-icon4"
setOnMouseClicked {
val chooser = DirectoryChooser()
chooser.titleProperty().bind(titleProperty)
val selectedDir = chooser.showDialog(Controllers.stage)
if (selectedDir != null)
property.value = selectedDir.absolutePath
chooser.titleProperty().unbind()
}
}
Tooltip.install(this, Tooltip().apply {
textProperty().bind(tooltipProperty)
})
}
fun setProperty(property: Property<String>) {
this.property = property
x.textProperty().bind(property)
}
}

View File

@ -15,7 +15,7 @@
* 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
package org.jackhuang.hmcl.ui.construct
import javafx.geometry.Pos
import javafx.scene.Node

View File

@ -15,7 +15,7 @@
* 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
package org.jackhuang.hmcl.ui.construct
import com.jfoenix.validation.base.ValidatorBase
import javafx.scene.control.TextInputControl

View File

@ -15,7 +15,7 @@
* 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
package org.jackhuang.hmcl.ui.construct
import javafx.scene.canvas.GraphicsContext
import javafx.scene.paint.Color

View File

@ -15,25 +15,21 @@
* 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
package org.jackhuang.hmcl.ui.construct
import com.jfoenix.controls.JFXRippler
import javafx.animation.Transition
import javafx.beans.DefaultProperty
import javafx.beans.NamedArg
import javafx.beans.Observable
import javafx.beans.binding.Bindings
import javafx.beans.property.SimpleBooleanProperty
import javafx.beans.property.SimpleObjectProperty
import javafx.geometry.Insets
import javafx.geometry.Pos
import javafx.scene.Node
import javafx.scene.control.Label
import javafx.scene.layout.*
import javafx.scene.paint.Color
import javafx.scene.paint.Paint
import javafx.scene.shape.Rectangle
import javafx.scene.shape.Shape
import org.jackhuang.hmcl.util.getValue
import org.jackhuang.hmcl.util.setValue
import java.util.concurrent.Callable

View File

@ -15,7 +15,7 @@
* 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
package org.jackhuang.hmcl.ui.construct
import java.io.InputStreamReader
import java.util.PropertyResourceBundle

View File

@ -7,6 +7,7 @@
<?import javafx.collections.FXCollections?>
<?import com.jfoenix.controls.JFXTextField?>
<?import org.jackhuang.hmcl.ui.construct.ComponentList?>
<?import org.jackhuang.hmcl.ui.construct.FileItem?>
<fx:root xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
type="StackPane">
@ -15,8 +16,8 @@
fitToHeight="true" fitToWidth="true">
<VBox fx:id="rootPane" style="-fx-padding: 20;">
<ComponentList fx:id="settingsPane">
<BorderPane><left><Label text="%launcher.common_location" /></left><right></right></BorderPane>
<BorderPane><left><Label text="%launcher.background_location" /></left><right></right></BorderPane>
<FileItem fx:id="fileCommonLocation" name="%launcher.common_location" title="%launcher.choose_commonpath" tooltip="%launcher.commpath_tooltip" />
<!--FileItem fx:id="fileBackgroundLocation" name="%launcher.background_location" title="%launcher.choose_bgpath" tooltip="%launcher.background_tooltip" /-->
<BorderPane><left><Label text="%launcher.download_source" /></left><right><JFXComboBox fx:id="cboDownloadSource">
<items>
<FXCollections fx:factory="observableArrayList">

View File

@ -35,13 +35,10 @@
</VBox>
</ComponentList>
<VBox>
<BorderPane> <!-- Max Memory -->
<left><Label text="%settings.max_memory" BorderPane.alignment="CENTER_LEFT" /></left>
<right><JFXTextField fx:id="txtMaxMemory" BorderPane.alignment="CENTER_RIGHT" /></right>
</BorderPane>
<Label fx:id="lblPhysicalMemory" style="-fx-text-fill: gray;" />
</VBox>
<BorderPane> <!-- Max Memory -->
<left><VBox><Label text="%settings.max_memory" BorderPane.alignment="CENTER_LEFT" /><Label fx:id="lblPhysicalMemory" style="-fx-text-fill: gray;" /></VBox></left>
<right><JFXTextField fx:id="txtMaxMemory" BorderPane.alignment="CENTER_RIGHT" /></right>
</BorderPane>
<BorderPane> <!-- Launcher Visibility -->
<left><Label text="%advancedsettings.launcher_visible" BorderPane.alignment="CENTER_LEFT" /></left>