mirror of
https://github.com/HMCL-dev/HMCL.git
synced 2025-09-16 15:26:27 -04:00
Allow draging files to mod pane
This commit is contained in:
parent
bc53e944af
commit
cbf2a4e7a8
@ -20,6 +20,8 @@ package org.jackhuang.hmcl.ui
|
|||||||
import com.jfoenix.effects.JFXDepthManager
|
import com.jfoenix.effects.JFXDepthManager
|
||||||
import javafx.fxml.FXML
|
import javafx.fxml.FXML
|
||||||
import javafx.scene.control.ScrollPane
|
import javafx.scene.control.ScrollPane
|
||||||
|
import javafx.scene.input.TransferMode
|
||||||
|
import javafx.scene.layout.StackPane
|
||||||
import javafx.scene.layout.VBox
|
import javafx.scene.layout.VBox
|
||||||
import javafx.stage.FileChooser
|
import javafx.stage.FileChooser
|
||||||
import org.jackhuang.hmcl.i18n
|
import org.jackhuang.hmcl.i18n
|
||||||
@ -29,12 +31,29 @@ import org.jackhuang.hmcl.task.task
|
|||||||
|
|
||||||
class ModController {
|
class ModController {
|
||||||
@FXML lateinit var scrollPane: ScrollPane
|
@FXML lateinit var scrollPane: ScrollPane
|
||||||
@FXML lateinit var rootPane: VBox
|
@FXML lateinit var rootPane: StackPane
|
||||||
|
@FXML lateinit var contentPane: VBox
|
||||||
private lateinit var modManager: ModManager
|
private lateinit var modManager: ModManager
|
||||||
private lateinit var versionId: String
|
private lateinit var versionId: String
|
||||||
|
|
||||||
fun initialize() {
|
fun initialize() {
|
||||||
scrollPane.smoothScrolling()
|
scrollPane.smoothScrolling()
|
||||||
|
|
||||||
|
rootPane.setOnDragOver { event ->
|
||||||
|
if (event.gestureSource != rootPane && event.dragboard.hasFiles())
|
||||||
|
event.acceptTransferModes(*TransferMode.COPY_OR_MOVE)
|
||||||
|
event.consume()
|
||||||
|
}
|
||||||
|
rootPane.setOnDragDropped { event ->
|
||||||
|
val mods = event.dragboard.files
|
||||||
|
?.filter { it.extension in listOf("jar", "zip", "litemod") }
|
||||||
|
if (mods != null && mods.isNotEmpty()) {
|
||||||
|
mods.forEach { modManager.addMod(versionId, it) }
|
||||||
|
loadMods(modManager, versionId)
|
||||||
|
event.isDropCompleted = true
|
||||||
|
}
|
||||||
|
event.consume()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun loadMods(modManager: ModManager, versionId: String) {
|
fun loadMods(modManager: ModManager, versionId: String) {
|
||||||
@ -43,9 +62,9 @@ class ModController {
|
|||||||
task {
|
task {
|
||||||
modManager.refreshMods(versionId)
|
modManager.refreshMods(versionId)
|
||||||
}.subscribe(Scheduler.JAVAFX) {
|
}.subscribe(Scheduler.JAVAFX) {
|
||||||
rootPane.children.clear()
|
contentPane.children.clear()
|
||||||
for (modInfo in modManager.getMods(versionId)) {
|
for (modInfo in modManager.getMods(versionId)) {
|
||||||
rootPane.children += ModItem(modInfo) {
|
contentPane.children += ModItem(modInfo) {
|
||||||
modManager.removeMods(versionId, modInfo)
|
modManager.removeMods(versionId, modInfo)
|
||||||
loadMods(modManager, versionId)
|
loadMods(modManager, versionId)
|
||||||
}.apply {
|
}.apply {
|
||||||
|
@ -6,14 +6,15 @@
|
|||||||
<?import com.jfoenix.controls.JFXButton?>
|
<?import com.jfoenix.controls.JFXButton?>
|
||||||
<StackPane xmlns="http://javafx.com/javafx"
|
<StackPane xmlns="http://javafx.com/javafx"
|
||||||
xmlns:fx="http://javafx.com/fxml"
|
xmlns:fx="http://javafx.com/fxml"
|
||||||
|
fx:id="rootPane"
|
||||||
fx:controller="org.jackhuang.hmcl.ui.ModController">
|
fx:controller="org.jackhuang.hmcl.ui.ModController">
|
||||||
<ScrollPane fx:id="scrollPane" fitToWidth="true" fitToHeight="true">
|
<ScrollPane fx:id="scrollPane" fitToWidth="true" fitToHeight="true">
|
||||||
<VBox fx:id="rootPane" spacing="10" style="-fx-padding: 20;">
|
<VBox fx:id="contentPane" spacing="10" style="-fx-padding: 20;">
|
||||||
|
|
||||||
</VBox>
|
</VBox>
|
||||||
</ScrollPane>
|
</ScrollPane>
|
||||||
<VBox style="-fx-padding: 15;" spacing="15" pickOnBounds="false" alignment="BOTTOM_RIGHT">
|
<VBox style="-fx-padding: 15;" spacing="15" pickOnBounds="false" alignment="BOTTOM_RIGHT">
|
||||||
<JFXButton prefWidth="40" prefHeight="40" buttonType="RAISED" fx:id="btnAdd" onMouseClicked="#onAdd"
|
<JFXButton prefWidth="40" prefHeight="40" buttonType="RAISED" onMouseClicked="#onAdd"
|
||||||
style="-fx-background-color:#5264AE;-fx-background-radius: 50px;">
|
style="-fx-background-color:#5264AE;-fx-background-radius: 50px;">
|
||||||
<graphic>
|
<graphic>
|
||||||
<fx:include source="/assets/svg/plus.fxml" />
|
<fx:include source="/assets/svg/plus.fxml" />
|
||||||
|
@ -30,6 +30,7 @@ class ModManager(private val repository: GameRepository) {
|
|||||||
private val modCache = SimpleMultimap<String, ModInfo>(::HashMap, ::TreeSet)
|
private val modCache = SimpleMultimap<String, ModInfo>(::HashMap, ::TreeSet)
|
||||||
|
|
||||||
fun refreshMods(id: String): Collection<ModInfo> {
|
fun refreshMods(id: String): Collection<ModInfo> {
|
||||||
|
modCache.removeAll(id)
|
||||||
val modsDirectory = repository.getRunDirectory(id).resolve("mods")
|
val modsDirectory = repository.getRunDirectory(id).resolve("mods")
|
||||||
val puter = { modFile: File -> ignoreException { modCache.put(id, ModInfo.fromFile(modFile)) } }
|
val puter = { modFile: File -> ignoreException { modCache.put(id, ModInfo.fromFile(modFile)) } }
|
||||||
modsDirectory.listFiles()?.forEach { modFile ->
|
modsDirectory.listFiles()?.forEach { modFile ->
|
||||||
|
Loading…
x
Reference in New Issue
Block a user