[Editor] Enable saving script/code files

This commit is contained in:
2021-02-23 22:19:37 +01:00
parent 2c9ad00170
commit 098682566f
5 changed files with 38 additions and 15 deletions

View File

@@ -5,22 +5,13 @@ import tornadofx.setValue
import tornadofx.toProperty import tornadofx.toProperty
import java.io.File import java.io.File
class Code(file: File) { class Code(file: File, type: CodeType, code: String) {
val fileProperty = file.toProperty() val fileProperty = file.toProperty()
val file by fileProperty val file by fileProperty
val typeProperty = deduceCodeType(file).toProperty() val typeProperty = type.toProperty()
val type by typeProperty val type by typeProperty
val codeProperty = file.readText().toProperty() val codeProperty = code.toProperty()
var code by codeProperty var code by codeProperty
companion object {
private fun deduceCodeType(file: File): CodeType {
return when (file.extension.toLowerCase()) {
"java" -> CodeType.JAVA
else -> throw IllegalStateException("Unsupported script type")
}
}
}
} }

View File

@@ -5,6 +5,7 @@ import com.bartlomiejpluta.base.editor.code.highlighting.JavaSyntaxHighlighter
import com.bartlomiejpluta.base.editor.code.model.CodeType import com.bartlomiejpluta.base.editor.code.model.CodeType
import com.bartlomiejpluta.base.editor.code.viewmodel.CodeVM import com.bartlomiejpluta.base.editor.code.viewmodel.CodeVM
import com.bartlomiejpluta.base.editor.command.context.UndoableScope import com.bartlomiejpluta.base.editor.command.context.UndoableScope
import com.bartlomiejpluta.base.editor.project.context.ProjectContext
import javafx.beans.binding.Bindings import javafx.beans.binding.Bindings
import org.kordamp.ikonli.javafx.FontIcon import org.kordamp.ikonli.javafx.FontIcon
import tornadofx.* import tornadofx.*
@@ -12,9 +13,11 @@ import tornadofx.*
class CodeEditorView : View() { class CodeEditorView : View() {
override val scope = super.scope as UndoableScope override val scope = super.scope as UndoableScope
private val javaSyntaxHighlighter: JavaSyntaxHighlighter by di() private val projectContext: ProjectContext by di()
private val codeVM = find<CodeVM>()
private val javaSyntaxHighlighter: JavaSyntaxHighlighter by di()
private val codeVM = find<CodeVM>()
private val highlighter = Bindings.createObjectBinding({ private val highlighter = Bindings.createObjectBinding({
when (codeVM.type!!) { when (codeVM.type!!) {
@@ -28,6 +31,14 @@ class CodeEditorView : View() {
top = toolbar { top = toolbar {
button(graphic = FontIcon("fa-floppy-o")) { button(graphic = FontIcon("fa-floppy-o")) {
shortcut("Ctrl+S") shortcut("Ctrl+S")
enableWhen(codeVM.dirty)
action {
codeVM.item?.let {
codeVM.commit()
projectContext.saveScript(it)
}
}
} }
button(graphic = FontIcon("fa-undo")) { button(graphic = FontIcon("fa-undo")) {

View File

@@ -87,7 +87,7 @@ class MainController : Controller() {
fun openScript(file: File) { fun openScript(file: File) {
if (openItems.count { (_, item) -> item is Code && item.file.absolutePath == file.absolutePath } == 0) { if (openItems.count { (_, item) -> item is Code && item.file.absolutePath == file.absolutePath } == 0) {
val code = Code(file) val code = projectContext.loadScript(file)
val vm = CodeVM(code) val vm = CodeVM(code)
val scope = UndoableScope() val scope = UndoableScope()
setInScope(vm, scope) setInScope(vm, scope)

View File

@@ -1,6 +1,8 @@
package com.bartlomiejpluta.base.editor.project.context package com.bartlomiejpluta.base.editor.project.context
import com.bartlomiejpluta.base.editor.asset.model.Asset import com.bartlomiejpluta.base.editor.asset.model.Asset
import com.bartlomiejpluta.base.editor.code.model.Code
import com.bartlomiejpluta.base.editor.code.model.CodeType
import com.bartlomiejpluta.base.editor.image.asset.ImageAsset import com.bartlomiejpluta.base.editor.image.asset.ImageAsset
import com.bartlomiejpluta.base.editor.image.asset.ImageAssetData import com.bartlomiejpluta.base.editor.image.asset.ImageAssetData
import com.bartlomiejpluta.base.editor.map.asset.GameMapAsset import com.bartlomiejpluta.base.editor.map.asset.GameMapAsset
@@ -154,4 +156,19 @@ class DefaultProjectContext : ProjectContext {
asset.file.delete() asset.file.delete()
} ?: throw IllegalStateException("There is no open project in the context") } ?: throw IllegalStateException("There is no open project in the context")
} }
override fun loadScript(file: File): Code {
val type = when (file.extension.toLowerCase()) {
"java" -> CodeType.JAVA
else -> throw IllegalStateException("Unsupported script type")
}
val code = file.readText()
return Code(file, type, code)
}
override fun saveScript(code: Code) {
code.file.writeText(code.code)
}
} }

View File

@@ -1,6 +1,7 @@
package com.bartlomiejpluta.base.editor.project.context package com.bartlomiejpluta.base.editor.project.context
import com.bartlomiejpluta.base.editor.asset.model.Asset import com.bartlomiejpluta.base.editor.asset.model.Asset
import com.bartlomiejpluta.base.editor.code.model.Code
import com.bartlomiejpluta.base.editor.image.asset.ImageAsset import com.bartlomiejpluta.base.editor.image.asset.ImageAsset
import com.bartlomiejpluta.base.editor.image.asset.ImageAssetData import com.bartlomiejpluta.base.editor.image.asset.ImageAssetData
import com.bartlomiejpluta.base.editor.map.model.map.GameMap import com.bartlomiejpluta.base.editor.map.model.map.GameMap
@@ -30,4 +31,7 @@ interface ProjectContext {
fun loadImage(uid: String): Image fun loadImage(uid: String): Image
fun deleteAsset(asset: Asset) fun deleteAsset(asset: Asset)
fun loadScript(file: File): Code
fun saveScript(code: Code)
} }