fixed broken start-stop-rerun issue
This commit is contained in:
@@ -14,6 +14,14 @@ class B93Funge : Funge {
|
||||
|
||||
private var cars = Array(height) { Array(width) { Value(' ') } }
|
||||
|
||||
override var values
|
||||
get() = cars.map { it.toList() }
|
||||
set(data) {
|
||||
for (y in 0 until cars.size)
|
||||
for (x in 0 until cars[y].size)
|
||||
cars[y][x] = data[y][x]
|
||||
}
|
||||
|
||||
override fun get(vec: Vec): Value {
|
||||
return cars[vec.y][vec.x]
|
||||
}
|
||||
|
||||
@@ -12,6 +12,8 @@ interface Funge {
|
||||
operator fun get(vec: Vec): Value
|
||||
operator fun set(vec: Vec, value: Value)
|
||||
|
||||
var values: List<List<Value>>
|
||||
|
||||
/**
|
||||
* Get the next position to be executed starting at [vec] and stepping by [delta]
|
||||
*/
|
||||
|
||||
@@ -22,7 +22,8 @@ class ActionView(val interp: Interpreter, val codeView: CodeView, val ioView: IO
|
||||
override val root = hbox {
|
||||
button("step") {
|
||||
setOnAction {
|
||||
interp.funge.setString(codeView.src)
|
||||
interp.funge.values = codeView.values
|
||||
|
||||
interp.step()
|
||||
}
|
||||
}
|
||||
@@ -31,13 +32,15 @@ class ActionView(val interp: Interpreter, val codeView: CodeView, val ioView: IO
|
||||
setOnAction {
|
||||
interp.reset()
|
||||
ioView.reset()
|
||||
codeView.src = interp.funge.toString()
|
||||
|
||||
codeView.values = interp.funge.values
|
||||
}
|
||||
}
|
||||
|
||||
button("run") {
|
||||
setOnAction {
|
||||
interp.funge.setString(codeView.src)
|
||||
interp.funge.values = codeView.values
|
||||
|
||||
runTimeline.rate = 10000.0
|
||||
runTimeline.playFromStart()
|
||||
}
|
||||
@@ -45,7 +48,8 @@ class ActionView(val interp: Interpreter, val codeView: CodeView, val ioView: IO
|
||||
|
||||
button("walk") {
|
||||
setOnAction {
|
||||
interp.funge.setString(codeView.src)
|
||||
interp.funge.values = codeView.values
|
||||
|
||||
runTimeline.rate = 50.0
|
||||
runTimeline.playFromStart()
|
||||
}
|
||||
@@ -53,7 +57,8 @@ class ActionView(val interp: Interpreter, val codeView: CodeView, val ioView: IO
|
||||
|
||||
button("crawl") {
|
||||
setOnAction {
|
||||
interp.funge.setString(codeView.src)
|
||||
interp.funge.values = codeView.values
|
||||
|
||||
runTimeline.rate = 4.0
|
||||
runTimeline.playFromStart()
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package befide.ide
|
||||
|
||||
import befide.befunge.core.Interpreter
|
||||
import befide.befunge.state.Value
|
||||
import befide.befunge.state.Vec
|
||||
import javafx.beans.property.ObjectProperty
|
||||
import javafx.beans.property.SimpleObjectProperty
|
||||
@@ -8,12 +9,14 @@ import javafx.scene.control.Label
|
||||
import tornadofx.*
|
||||
|
||||
class CodeLabel(val pos: Vec, val cursorPos: ObjectProperty<Vec>, val interp: Interpreter) : Label() {
|
||||
val charProperty = SimpleObjectProperty<Char>('\u0000')
|
||||
var char: Char by charProperty
|
||||
var valueProperty = SimpleObjectProperty<Value>(Value(' '))
|
||||
var value: Value by valueProperty
|
||||
|
||||
fun restyle() {
|
||||
styleClass.setAll("code")
|
||||
|
||||
val char = value.asChar ?: '\u2022'
|
||||
|
||||
if (char in "0123456789") styleClass.add("code-num")
|
||||
if (char in "gp") styleClass.add("code-funge")
|
||||
if (char in "<>^v?#") styleClass.add("code-dir")
|
||||
@@ -27,14 +30,14 @@ class CodeLabel(val pos: Vec, val cursorPos: ObjectProperty<Vec>, val interp: In
|
||||
}
|
||||
|
||||
init {
|
||||
textProperty().bind(charProperty.stringBinding { it?.toString() ?: " " })
|
||||
textProperty().bind(valueProperty.stringBinding { it?.asChar?.toString() ?: "\u2022" })
|
||||
|
||||
setOnMouseClicked {
|
||||
cursorPos.value = pos
|
||||
}
|
||||
|
||||
charProperty.addListener { _, _, _ -> restyle() }
|
||||
valueProperty.addListener { _, _, _ -> restyle() }
|
||||
|
||||
char = ' '
|
||||
restyle()
|
||||
}
|
||||
}
|
||||
@@ -1,14 +1,12 @@
|
||||
package befide.ide
|
||||
|
||||
import befide.befunge.core.Interpreter
|
||||
import befide.befunge.state.Value
|
||||
import befide.befunge.state.Vec
|
||||
import javafx.beans.property.ObjectProperty
|
||||
import javafx.beans.property.SimpleBooleanProperty
|
||||
import javafx.beans.property.SimpleObjectProperty
|
||||
import javafx.scene.input.KeyCode
|
||||
import tornadofx.*
|
||||
import tornadofx.getValue
|
||||
import tornadofx.setValue
|
||||
|
||||
operator fun <T> List<List<T>>.get(v: Vec): T = this[v.y][v.x]
|
||||
|
||||
@@ -21,6 +19,14 @@ class CodeView(val interp: Interpreter) : View() {
|
||||
|
||||
var labels: List<List<CodeLabel>> = List(25) { y -> List(80) { x -> CodeLabel(Vec(x, y), cursorPosProperty, interp) } }
|
||||
|
||||
var values: List<List<Value>>
|
||||
get() = labels.map { it.map { it.value } }
|
||||
set(data) {
|
||||
for (y in 0 until labels.size)
|
||||
for (x in 0 until labels[y].size)
|
||||
labels[y][x].value = data[y][x]
|
||||
}
|
||||
|
||||
init {
|
||||
cursorPosProperty.addListener { _, old, new ->
|
||||
labels[old].restyle()
|
||||
@@ -34,7 +40,7 @@ class CodeView(val interp: Interpreter) : View() {
|
||||
|
||||
interp.fungeChanged += {
|
||||
for (change in it.changes) {
|
||||
labels[change.vec].char = change.to.asChar ?: '\u2022'
|
||||
labels[change.vec].value = change.to
|
||||
labels[change.vec].restyle()
|
||||
}
|
||||
}
|
||||
@@ -47,9 +53,9 @@ class CodeView(val interp: Interpreter) : View() {
|
||||
var src: String
|
||||
get() = labels.joinToString("\n") { row ->
|
||||
row.dropLastWhile { lbl ->
|
||||
lbl.char.isWhitespace()
|
||||
lbl.value.asChar?.isWhitespace() ?: false
|
||||
}.joinToString("") { lbl ->
|
||||
lbl.char.toString()
|
||||
lbl.value.asChar?.toString() ?: "\u2022"
|
||||
}
|
||||
}
|
||||
set(value) {
|
||||
@@ -57,7 +63,8 @@ class CodeView(val interp: Interpreter) : View() {
|
||||
|
||||
for (row in labels) {
|
||||
for (lbl in row) {
|
||||
lbl.char = lines.getOrNull(lbl.pos.y)?.getOrNull(lbl.pos.x) ?: ' '
|
||||
val char = lines.getOrNull(lbl.pos.y)?.getOrNull(lbl.pos.x) ?: ' '
|
||||
lbl.value = Value(char)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -105,7 +112,7 @@ class CodeView(val interp: Interpreter) : View() {
|
||||
else -> cursorDelta
|
||||
}
|
||||
|
||||
labels[cursorPos].char = ch
|
||||
labels[cursorPos].value = Value(ch)
|
||||
|
||||
move()
|
||||
}
|
||||
@@ -113,7 +120,7 @@ class CodeView(val interp: Interpreter) : View() {
|
||||
ch == '\u0008' -> { // backspace
|
||||
move(-cursorDelta)
|
||||
|
||||
labels[cursorPos].char = ' '
|
||||
labels[cursorPos].value = Value(' ')
|
||||
}
|
||||
|
||||
else -> {
|
||||
|
||||
Reference in New Issue
Block a user