diff --git a/.idea/artifacts/ide_jar.xml b/.idea/artifacts/ide_jar.xml new file mode 100644 index 0000000..3333997 --- /dev/null +++ b/.idea/artifacts/ide_jar.xml @@ -0,0 +1,18 @@ + + + $PROJECT_DIR$/out/artifacts/ide_jar + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/befunge/src/main/kotlin/befide/befunge/b93/B93Interpreter.kt b/befunge/src/main/kotlin/befide/befunge/b93/B93Interpreter.kt index 9f73f8c..e8c999f 100644 --- a/befunge/src/main/kotlin/befide/befunge/b93/B93Interpreter.kt +++ b/befunge/src/main/kotlin/befide/befunge/b93/B93Interpreter.kt @@ -29,7 +29,7 @@ class B93Interpreter : Interpreter { override val stdInput = LinkedList() override val stdOutput = LinkedList() private var outBuf: StringBuffer = StringBuffer() - private var bufLimit = 10 + private var bufLimit = 0 private val fungeMods = HashMap() diff --git a/ide/src/main/kotlin/befide/ide/ActionView.kt b/ide/src/main/kotlin/befide/ide/ActionView.kt index 29475a7..616b952 100644 --- a/ide/src/main/kotlin/befide/ide/ActionView.kt +++ b/ide/src/main/kotlin/befide/ide/ActionView.kt @@ -3,8 +3,11 @@ package befide.ide import befide.befunge.core.Interpreter import javafx.animation.Animation import javafx.animation.Timeline +import javafx.beans.property.SimpleBooleanProperty import javafx.util.Duration import tornadofx.* +import tornadofx.getValue +import tornadofx.setValue class ActionView(val interp: Interpreter, val codeView: CodeView, val ioView: IOView) : View() { var runTimeline: Timeline = timeline(false) { @@ -19,55 +22,87 @@ class ActionView(val interp: Interpreter, val codeView: CodeView, val ioView: IO cycleCount = Animation.INDEFINITE } + val isRunningProperty = SimpleBooleanProperty(false) + var isRunning by isRunningProperty + + val canResetProperty = SimpleBooleanProperty(false) + var canReset by canResetProperty + + fun start(rate: Double) { + stop() + + isRunning = true + canReset = true + + interp.funge.values = codeView.values + + runTimeline.rate = rate + runTimeline.playFromStart() + } + + fun step() { + canReset = true + + interp.funge.values = codeView.values + + interp.step() + } + + fun stop() { + isRunning = false + + runTimeline.stop() + } + + fun reset() { + stop() + interp.reset() + ioView.reset() + canReset = false + } + + fun clearCode() { + reset() + codeView.clear() + } + override val root = hbox { button("step") { - setOnAction { - interp.funge.values = codeView.values - - interp.step() - } + setOnAction { step() } + disableWhen(isRunningProperty) } - button("reset") { - setOnAction { - interp.reset() - ioView.reset() - - codeView.values = interp.funge.values - } - } + separator { } button("run") { - setOnAction { - interp.funge.values = codeView.values - - runTimeline.rate = 10000.0 - runTimeline.playFromStart() - } + setOnAction { start(10000.0) } } button("walk") { - setOnAction { - interp.funge.values = codeView.values - - runTimeline.rate = 50.0 - runTimeline.playFromStart() - } + setOnAction { start(50.0) } } button("crawl") { - setOnAction { - interp.funge.values = codeView.values - - runTimeline.rate = 4.0 - runTimeline.playFromStart() - } + setOnAction { start(4.0) } } + separator {} + button("stop") { - setOnAction { - runTimeline.stop() - } + setOnAction { stop() } + enableWhen(isRunningProperty) + } + + spacer() + + button("reset") { + setOnAction { reset() } + enableWhen(canResetProperty.and(isRunningProperty.not())) + } + + button("clear") { + setOnAction { clearCode() } + disableWhen(isRunningProperty) } } } \ No newline at end of file diff --git a/ide/src/main/kotlin/befide/ide/CodeView.kt b/ide/src/main/kotlin/befide/ide/CodeView.kt index 02333e8..a9ed445 100644 --- a/ide/src/main/kotlin/befide/ide/CodeView.kt +++ b/ide/src/main/kotlin/befide/ide/CodeView.kt @@ -50,6 +50,14 @@ class CodeView(val interp: Interpreter) : View() { cursorPos = interp.funge.nextVec(cursorPos, delta ?: cursorDelta) } + fun clear() { + for (row in labels) { + for (lbl in row) { + lbl.value = Value(' ') + } + } + } + var src: String get() = labels.joinToString("\n") { row -> row.dropLastWhile { lbl -> diff --git a/ide/src/main/kotlin/befide/ide/EditorView.kt b/ide/src/main/kotlin/befide/ide/EditorView.kt index 013c3a9..188536c 100644 --- a/ide/src/main/kotlin/befide/ide/EditorView.kt +++ b/ide/src/main/kotlin/befide/ide/EditorView.kt @@ -23,9 +23,11 @@ class EditorView : View("Befide") { } init { - codeView.src = """v ;00000000; ->>>>>>>>>>>>>55+0g68*-90g68*-2*+80g68*-4*+70g68*-8*+v -@.+***288-*86g03+**88-*86g04+**84-*86g05+**44-*86g06<""" + primaryStage.isResizable = false + +// codeView.src = """v ;00000000; +//>>>>>>>>>>>>>55+0g68*-90g68*-2*+80g68*-4*+70g68*-8*+v +//@.+***288-*86g03+**88-*86g04+**84-*86g05+**44-*86g06<""" // codeView.src = """ 2>:3g" "-!v\ g30 < // |!`"O":+1_:.:03p>03g+:"O"`| diff --git a/ide/src/main/kotlin/befide/ide/Main.kt b/ide/src/main/kotlin/befide/ide/Main.kt index bb1bf07..a4dee96 100644 --- a/ide/src/main/kotlin/befide/ide/Main.kt +++ b/ide/src/main/kotlin/befide/ide/Main.kt @@ -7,3 +7,7 @@ class MainApp : App(EditorView::class) { importStylesheet(resources["style.css"]) } } + +fun main(args: Array) { + launch(args) +} \ No newline at end of file diff --git a/ide/src/main/kotlin/befide/ide/StackView.kt b/ide/src/main/kotlin/befide/ide/StackView.kt index 554474d..25f2ae2 100644 --- a/ide/src/main/kotlin/befide/ide/StackView.kt +++ b/ide/src/main/kotlin/befide/ide/StackView.kt @@ -3,7 +3,12 @@ package befide.ide import befide.befunge.b93.padEnd import befide.befunge.core.Interpreter import befide.befunge.state.Value +import javafx.beans.property.SimpleListProperty +import javafx.beans.property.SimpleObjectProperty import javafx.beans.property.SimpleStringProperty +import javafx.collections.FXCollections +import javafx.scene.layout.Priority +import javafx.scene.text.Font import tornadofx.* import tornadofx.getValue import tornadofx.setValue @@ -11,39 +16,27 @@ import tornadofx.setValue class StackView(val interp: Interpreter) : View() { val charOutProperty = SimpleStringProperty() var charOut by charOutProperty - val longOutProperty = SimpleStringProperty() - var longOut by longOutProperty - - override val root = hbox { - textarea(charOutProperty) { - maxWidth = 1.0 - paddingHorizontal = 1 - prefRowCount = interp.funge.height - isEditable = false - } - textarea(longOutProperty) { - prefRowCount = interp.funge.height - prefWidth = 90.0 - isEditable = false - } + override val root = textarea(charOutProperty) { + addClass("stack-pane") + prefWidth = 150.0 + isEditable = false } private fun getStackStr(mapping: (Value) -> T): String { - return interp.stack.takeLast(interp.funge.height) + val num = interp.funge.height - 3 + return interp.stack.takeLast(num) .map(mapping) - .padEnd(interp.funge.height, "") + .padEnd(num, "") // .reversed() .joinToString("\n") } init { - charOut = getStackStr { it.asChar ?: '*' } - longOut = getStackStr { it.value } + charOut = getStackStr { "${it.asChar ?: '\u2022'} (${it.value})" } - interp.stackChanged += { - charOut = getStackStr { it.asChar ?: '*' } - longOut = getStackStr { it.value } + interp.stackChanged += { _ -> + charOut = getStackStr { "${it.asChar ?: '\u2022'} (${it.value})" } } } } diff --git a/ide/src/main/resources/META-INF/MANIFEST.MF b/ide/src/main/resources/META-INF/MANIFEST.MF new file mode 100644 index 0000000..e63a41c --- /dev/null +++ b/ide/src/main/resources/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: befide.ide.MainApp + diff --git a/ide/src/main/resources/befide/ide/style.css b/ide/src/main/resources/befide/ide/style.css index c5476d1..6b5fe11 100644 --- a/ide/src/main/resources/befide/ide/style.css +++ b/ide/src/main/resources/befide/ide/style.css @@ -3,7 +3,7 @@ -fx-font-fill: black; } -.code, .text-area { +.code, .text-area, .stack-pane { -fx-font-family: Consolas, monospace; -fx-text-fill: black; -fx-font-size: 18; @@ -14,7 +14,6 @@ -fx-border-radius: 2px; -fx-border-width: 1px; -fx-background-color: #fff; - -fx-graphic: none; } .code-num {