From b4214b0489160945753a848a2b0f4c5a47b7cf76 Mon Sep 17 00:00:00 2001 From: Victor Date: Thu, 7 Sep 2017 18:45:15 +0300 Subject: [PATCH] Add library nodes --- .../com/annimon/hotarufx/ui/LibraryItem.java | 54 +++++ .../ui/controller/EditorController.java | 19 +- .../annimon/hotarufx/visual/Composition.java | 2 +- app/src/main/resources/fxml/Editor.fxml | 210 +++++++++++++++++- 4 files changed, 278 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/com/annimon/hotarufx/ui/LibraryItem.java diff --git a/app/src/main/java/com/annimon/hotarufx/ui/LibraryItem.java b/app/src/main/java/com/annimon/hotarufx/ui/LibraryItem.java new file mode 100644 index 0000000..3446586 --- /dev/null +++ b/app/src/main/java/com/annimon/hotarufx/ui/LibraryItem.java @@ -0,0 +1,54 @@ +package com.annimon.hotarufx.ui; + +import javafx.beans.binding.ObjectBinding; +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.property.StringProperty; +import javafx.scene.Node; +import javafx.scene.control.Button; +import javafx.scene.control.Tooltip; + +public class LibraryItem extends Button { + + private final StringProperty code = new SimpleStringProperty(""); + + public LibraryItem() { + init(); + } + + public LibraryItem(String text) { + super(text); + init(); + } + + public LibraryItem(String text, Node graphic) { + super(text, graphic); + init(); + } + + private void init() { + setMnemonicParsing(false); + tooltipProperty().bind(new ObjectBinding() { + { bind(code); } + @Override + protected Tooltip computeValue() { + return new Tooltip(code.get()); + } + }); + } + + public String getCode() { + return code.get(); + } + + public StringProperty codeProperty() { + return code; + } + + public void setCode(String code) { + this.code.set(code + .replace("\\n", "\n") + .replaceAll("\\n\\s+", "\n") + .replace('_', ' ') + ); + } +} diff --git a/app/src/main/java/com/annimon/hotarufx/ui/controller/EditorController.java b/app/src/main/java/com/annimon/hotarufx/ui/controller/EditorController.java index 64350b0..4f8c4d7 100644 --- a/app/src/main/java/com/annimon/hotarufx/ui/controller/EditorController.java +++ b/app/src/main/java/com/annimon/hotarufx/ui/controller/EditorController.java @@ -5,13 +5,14 @@ import com.annimon.hotarufx.bundles.BundleLoader; import com.annimon.hotarufx.bundles.CompositionBundle; import com.annimon.hotarufx.bundles.NodesBundle; import com.annimon.hotarufx.io.DocumentListener; +import com.annimon.hotarufx.io.DocumentManager; +import com.annimon.hotarufx.io.FileManager; import com.annimon.hotarufx.io.IOStream; import com.annimon.hotarufx.lexer.HotaruLexer; import com.annimon.hotarufx.lib.Context; import com.annimon.hotarufx.parser.HotaruParser; import com.annimon.hotarufx.parser.visitors.InterpreterVisitor; -import com.annimon.hotarufx.io.DocumentManager; -import com.annimon.hotarufx.io.FileManager; +import com.annimon.hotarufx.ui.LibraryItem; import com.annimon.hotarufx.ui.SyntaxHighlighter; import java.io.IOException; import java.io.InputStream; @@ -29,6 +30,7 @@ import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.TextArea; import javafx.scene.control.TitledPane; +import javafx.scene.layout.Pane; import javafx.stage.Modality; import javafx.stage.Stage; import lombok.val; @@ -43,6 +45,9 @@ public class EditorController implements Initializable, DocumentListener { @FXML private CodeArea editor; + @FXML + private Pane library; + @FXML private TextArea log; @FXML @@ -156,6 +161,7 @@ public class EditorController implements Initializable, DocumentListener { initUndoRedo(); openSample(); editor.getUndoManager().forgetHistory(); + initializeLibrary(); Platform.runLater(editor::requestFocus); } @@ -168,6 +174,15 @@ public class EditorController implements Initializable, DocumentListener { redoButton.setOnAction(a -> editor.redo()); } + private void initializeLibrary() { + library.getChildren().stream() + .map(LibraryItem.class::cast) + .forEach(item -> item.setOnAction(a -> { + editor.insertText(editor.getCaretPosition(), item.getCode()); + editor.requestFocus(); + })); + } + public void setPrimaryStage(Stage primaryStage) { this.primaryStage = primaryStage; } diff --git a/app/src/main/java/com/annimon/hotarufx/visual/Composition.java b/app/src/main/java/com/annimon/hotarufx/visual/Composition.java index ebaf5c3..51cca3f 100644 --- a/app/src/main/java/com/annimon/hotarufx/visual/Composition.java +++ b/app/src/main/java/com/annimon/hotarufx/visual/Composition.java @@ -41,6 +41,6 @@ public class Composition { } public Scene produceAnimationScene() { - return new Scene(scene.getGroup(), sceneWidth, sceneHeight, Color.WHITE); + return new Scene(scene.getGroup(), sceneWidth, sceneHeight); } } diff --git a/app/src/main/resources/fxml/Editor.fxml b/app/src/main/resources/fxml/Editor.fxml index 96c87e5..c819593 100644 --- a/app/src/main/resources/fxml/Editor.fxml +++ b/app/src/main/resources/fxml/Editor.fxml @@ -1,12 +1,20 @@ - - + + + + + + + + + + + - - + + + + + + + + circle({\n + __cx: 0,\n + __cy: 0,\n + __radius: 100,\n + __fill: '#c0c033',\n + __strokeWidth: 4,\n + __stroke: "#ddd"\n + }) + + + + + + + + rectangle({\n + __x: -50,\n + __y: -75,\n + __width: 100,\n + __height: 150,\n + __fill: '#4233c0'\n + __strokeWidth: 4,\n + __stroke: '#819bed',\n + __rotate: 30\n + }) + + + + + + + + rectangle({\n + __x: -175,\n + __y: -100,\n + __width: 350,\n + __height: 200,\n + __arcWidth: 25,\n + __arcHeight: 25,\n + __fill: '#4233c0'\n + __strokeWidth: 4,\n + __stroke: '#819bed'\n + }) + + + + + + + + ellipse({\n + __cx: 0,\n + __cy: 0,\n + __radiusX: 150,\n + __radiusY: 200,\n + __fill: '#9f40b8',\n + __strokeWidth: 4,\n + __stroke: '#f29797'\n + }) + + + + + + + + text({\n + __x: -50,\n + __y: 0,\n + __text: 'txt',\n + __fill: 'white',\n + __stroke: 'red',\n + __font: 100,\n + __underline: true\n + }) + + + + + + + + points = [\n + __-50, -50,\n + __0, -25,\n + __50, -50,\n + __50, 50,\n + __0, 25,\n + __-50, 50\n + ]\n + polygon(points, {\n + __fill: '#58c033',\n + __strokeWidth: 4,\n + __stroke: '#259b3e'\n + }) + + + + + + + + points = [\n + __-50, -50,\n + __0, -25,\n + __50, -50,\n + __50, 50,\n + __0, 25,\n + __-50, 50\n + __-50,-50\n + ]\n + polyline(points, {\n + __strokeWidth: 4,\n + __stroke: '#cf3636'\n + }) + + + + + + + + svgPath({\n + __content: "M23.6,0c-3.4,0-6.3,2.7-7.6,5.6C14.7,2.7,11.8,0,8.4,0C3.8,0,0,3.8,0,8.4c0,9.4,9.5,11.9,16,21.2 6.1-9.3,16-12.1,16-21.2C32,3.8,28.2,0,23.6,0z",\n + __fill: "#c91720",\n + __strokeWidth: 2,\n + __stroke: "#edabab"\n + }) + + + + + + + + line({\n + __startX: -600\n + __startY: -300\n + __endX: 600\n + __endY: 300,\n + __stroke: "#AAA",\n + __strokeWidth: 5\n + }) + + + + + + + + arc({\n + __cx: 0\n + __cy: 0\n + __radiusX: 50,\n + __radiusY: 50,\n + __startAngle: 60,\n + __length: 240\n + __fill: "#1b8118",\n + __strokeWidth: 4,\n + __stroke: "#4cbc72"\n + }) + + + +