diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/asset/model/Asset.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/asset/model/Asset.kt index 186ac855..2a0eead1 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/asset/model/Asset.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/asset/model/Asset.kt @@ -1,7 +1,16 @@ package com.bartlomiejpluta.base.editor.asset.model -interface Asset { - val uid: String - val source: String - var name: String +import javafx.beans.binding.Bindings.createObjectBinding +import javafx.beans.property.ObjectProperty +import javafx.beans.property.SimpleStringProperty +import tornadofx.getValue +import tornadofx.setValue +import java.io.File + +abstract class Asset(directory: ObjectProperty, val uid: String, val source: String, name: String) { + val nameProperty = SimpleStringProperty(name) + var name by nameProperty + + val fileProperty = createObjectBinding({ File(directory.value, source) }, directory) + val file by fileProperty } \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/asset/view/select/SelectGraphicAssetFragment.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/asset/view/select/SelectGraphicAssetFragment.kt new file mode 100644 index 00000000..9b358ad5 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/asset/view/select/SelectGraphicAssetFragment.kt @@ -0,0 +1,43 @@ +package com.bartlomiejpluta.base.editor.asset.view.select + +import com.bartlomiejpluta.base.editor.asset.model.Asset +import javafx.beans.property.ObjectProperty +import javafx.collections.ObservableList +import tornadofx.* + +class SelectGraphicAssetFragment : Fragment("Select Asset") { + val assets: ObservableList by param() + val asset: ObjectProperty by param() + + private val selectGraphicAssetView = find( + SelectGraphicAssetView::assets to assets, + SelectGraphicAssetView::asset to asset + ) + + private var onCompleteConsumer: ((Asset) -> Unit)? = null + + fun onComplete(onCompleteConsumer: ((Asset) -> Unit)) { + this.onCompleteConsumer = onCompleteConsumer + } + + override val root = form { + fieldset { + this += selectGraphicAssetView.root + } + + buttonbar { + button("Ok") { + enableWhen(asset.isNotNull) + + action { + onCompleteConsumer?.let { it(asset.value) } + close() + } + } + + button("Cancel") { + action { close() } + } + } + } +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/asset/view/select/SelectGraphicAssetView.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/asset/view/select/SelectGraphicAssetView.kt new file mode 100644 index 00000000..44fc7458 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/asset/view/select/SelectGraphicAssetView.kt @@ -0,0 +1,39 @@ +package com.bartlomiejpluta.base.editor.asset.view.select + +import com.bartlomiejpluta.base.editor.asset.model.Asset +import javafx.beans.binding.Bindings.createObjectBinding +import javafx.beans.property.ObjectProperty +import javafx.collections.ObservableList +import javafx.scene.control.ListView +import javafx.scene.image.Image +import javafx.scene.image.WritableImage +import tornadofx.* + +class SelectGraphicAssetView : View() { + val assets: ObservableList by param() + val asset: ObjectProperty by param() + + private var assetsListView: ListView by singleAssign() + + private val image = createObjectBinding({ + asset.value?.file?.inputStream()?.use { Image(it) } ?: PLACEHOLDER_IMAGE + }, asset) + + override val root = hbox { + + assetsListView = listview(assets) { + cellFormat { text = it.name } + bindSelected(asset) + } + + scrollpane { + prefWidth = 480.0 + prefHeight = 480.0 + imageview(image) + } + } + + companion object { + private val PLACEHOLDER_IMAGE = WritableImage(100, 100) + } +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/asset/GameMapAsset.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/asset/GameMapAsset.kt index 2d2c810f..59b15954 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/asset/GameMapAsset.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/asset/GameMapAsset.kt @@ -1,13 +1,7 @@ package com.bartlomiejpluta.base.editor.map.asset import com.bartlomiejpluta.base.editor.asset.model.Asset -import javafx.beans.property.SimpleStringProperty -import tornadofx.getValue -import tornadofx.setValue +import com.bartlomiejpluta.base.editor.project.model.Project -class GameMapAsset(override val uid: String, name: String) : Asset { - override val source = "$uid.dat" - - val nameProperty = SimpleStringProperty(name) - override var name by nameProperty -} \ No newline at end of file +class GameMapAsset(project: Project, uid: String, name: String) : + Asset(project.mapsDirectoryProperty, uid, "$uid.dat", name) \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/context/DefaultProjectContext.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/context/DefaultProjectContext.kt index e814f2ad..74a90f9b 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/context/DefaultProjectContext.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/context/DefaultProjectContext.kt @@ -69,7 +69,7 @@ class DefaultProjectContext : ProjectContext { override fun importMap(name: String, map: GameMap) { project?.let { UID.next(it.maps.map(Asset::uid)).let { uid -> - val asset = GameMapAsset(uid, name) + val asset = GameMapAsset(it, uid, name) map.uid = uid it.maps += asset @@ -101,7 +101,7 @@ class DefaultProjectContext : ProjectContext { val source = "$uid.${builder.file.extension}" val targetFile = File(it.tileSetsDirectory, source) builder.file.copyTo(targetFile) - it.tileSets += TileSetAsset(uid, source, builder.name, builder.rows, builder.columns) + it.tileSets += TileSetAsset(it, uid, source, builder.name, builder.rows, builder.columns) save() } diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/ProtobufProjectDeserializer.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/ProtobufProjectDeserializer.kt index 05c03e92..47dbf579 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/ProtobufProjectDeserializer.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/serial/ProtobufProjectDeserializer.kt @@ -14,15 +14,20 @@ class ProtobufProjectDeserializer : ProjectDeserializer { val proto = ProjectProto.Project.parseFrom(input) val project = Project() project.name = proto.name - project.maps.addAll(proto.mapsList.map(this::deserializeMap)) - project.tileSets.addAll(proto.tileSetsList.map(this::deserializeTileSet)) + project.maps.addAll(proto.mapsList.map { deserializeMap(project, it) }) + project.tileSets.addAll(proto.tileSetsList.map { deserializeTileSet(project, it) }) return project } - private fun deserializeMap(map: ProjectProto.GameMapAsset) = GameMapAsset(uid = map.uid, name = map.name) + private fun deserializeMap(project: Project, map: ProjectProto.GameMapAsset) = GameMapAsset( + project = project, + uid = map.uid, + name = map.name + ) - private fun deserializeTileSet(tileSet: ProjectProto.TileSetAsset) = TileSetAsset( + private fun deserializeTileSet(project: Project, tileSet: ProjectProto.TileSetAsset) = TileSetAsset( + project = project, uid = tileSet.uid, source = tileSet.source, name = tileSet.name, diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/tileset/asset/TileSetAsset.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/tileset/asset/TileSetAsset.kt index ca65cf38..31759808 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/tileset/asset/TileSetAsset.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/tileset/asset/TileSetAsset.kt @@ -1,16 +1,7 @@ package com.bartlomiejpluta.base.editor.tileset.asset import com.bartlomiejpluta.base.editor.asset.model.Asset -import javafx.beans.property.SimpleStringProperty -import tornadofx.* +import com.bartlomiejpluta.base.editor.project.model.Project -class TileSetAsset( - override val uid: String, - override val source: String, - name: String, - val rows: Int, - val columns: Int -) : Asset { - val nameProperty = SimpleStringProperty(name) - override var name by nameProperty -} +class TileSetAsset(project: Project, uid: String, source: String, name: String, val rows: Int, val columns: Int) : + Asset(project.tileSetsDirectoryProperty, uid, source, name)