aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/net/sowgro/npehero/devmenu
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/net/sowgro/npehero/devmenu')
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/devmenu/DiffEditor.java131
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/devmenu/DiffList.java129
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/devmenu/LevelEditor.java116
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/devmenu/LevelList.java101
-rwxr-xr-xsrc/main/java/net/sowgro/npehero/devmenu/NotesEditor.java30
-rw-r--r--src/main/java/net/sowgro/npehero/devmenu/NotesEditor2.java373
6 files changed, 779 insertions, 101 deletions
diff --git a/src/main/java/net/sowgro/npehero/devmenu/DiffEditor.java b/src/main/java/net/sowgro/npehero/devmenu/DiffEditor.java
index 4bb55e4..74cfab6 100755
--- a/src/main/java/net/sowgro/npehero/devmenu/DiffEditor.java
+++ b/src/main/java/net/sowgro/npehero/devmenu/DiffEditor.java
@@ -1,52 +1,57 @@
package net.sowgro.npehero.devmenu;
-import java.io.FileNotFoundException;
-import java.io.UnsupportedEncodingException;
-
+import javafx.beans.binding.DoubleBinding;
+import javafx.geometry.Pos;
+import javafx.scene.control.ScrollPane;
+import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
+import javafx.scene.paint.Color;
import net.sowgro.npehero.Driver;
+import net.sowgro.npehero.gameplay.Block;
import net.sowgro.npehero.gui.LevelSurround;
-import net.sowgro.npehero.gui.MainMenu;
-import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
-import javafx.stage.Stage;
import net.sowgro.npehero.main.Difficulty;
+import net.sowgro.npehero.main.Note;
public class DiffEditor extends Pane
{
+ Difficulty diff;
+ ScrollPane scroll;
+
+ public Pane prev;
/*
* this class is a layout class, most of its purpose is to place UI elements like Buttons within Panes like VBoxes.
* the creation of these UI elements are mostly not commented due to their repetitive and self explanatory nature.
* style classes are defined in the style.css file.
*/
- public DiffEditor(Difficulty diff)
+ public DiffEditor(Difficulty diff, Pane prev)
{
- Stage primaryStage = new Stage();
+ this.diff = diff;
+ this.prev = prev;
- Text folderNameLabel = new Text("Folder name (ordered alphabetically)");
+ Text folderNameLabel = new Text("Folder name");
TextField folderName = new TextField(diff.thisDir.getName());
folderName.setDisable(true);
Text titleLabel = new Text("Title");
TextField title = new TextField(diff.title);
- Text bpmLabel = new Text("BPM");
- TextField bpm = new TextField(diff.bpm+"");
-
- Text numBeatsLabel = new Text("Number of beats (set by notes editor)");
- TextField numBeats = new TextField(diff.numBeats+"");
-
- Text priorityLabel = new Text("priority (lower first)");
+ Text priorityLabel = new Text("Order (lower first)");
TextField priority = new TextField(diff.priority+"");
Button editNotes = new Button("Edit notes");
editNotes.setOnAction(e -> {
+ Driver.setMenu(new NotesEditor2(diff, this));
+ });
+
+ Button oldEditNotes = new Button("Edit notes (legacy)");
+ oldEditNotes.setOnAction(_ -> {
try {
- new NotesEditor(diff);
- } catch (FileNotFoundException | UnsupportedEncodingException e1) {
+ Driver.setMenu(new NotesEditor(diff, this));
+ } catch (Exception e1) {
e1.printStackTrace();
}
});
@@ -54,28 +59,86 @@ public class DiffEditor extends Pane
Button editScores = new Button("Clear leaderboard");
editScores.setOnAction(e -> diff.getLeaderboard().clear());
- Button playLevel = new Button("Launch level");
- playLevel.setOnAction(e -> Driver.setMenu(new LevelSurround(diff.level, diff, new MainMenu())));
-
- Button refresh = new Button("Refresh");
- refresh.setOnAction( e -> {
- numBeats.setText(diff.numBeats+"");
- });
+ Button playLevel = new Button("Play level");
+ playLevel.setOnAction(e -> Driver.setMenu(new LevelSurround(diff.level, diff, this)));
Button save = new Button("Save");
- save.setOnAction(e -> { //assigns text feilds to values
+ save.setOnAction(e -> { //assigns text fields to values
diff.title = title.getText();
- diff.bpm = Double.parseDouble(bpm.getText());
- diff.numBeats = Integer.parseInt(numBeats.getText());
+// diff.bpm = Double.parseDouble(bpm.getText());
+// diff.numBeats = Integer.parseInt(numBeats.getText());
diff.priority = Integer.parseInt(priority.getText());
diff.writeMetadata();
});
- VBox main = new VBox();
- main.getChildren().addAll(folderNameLabel,folderName,titleLabel,title,bpmLabel,bpm,numBeatsLabel,numBeats,refresh,priorityLabel,priority,editNotes,editScores,playLevel,save);
-// Scene scene = new Scene(main);
-// primaryStage.setScene(scene);
-// primaryStage.show();
- super.getChildren().add(main);
+ HBox content = new HBox();
+ ScrollPane scroll = new ScrollPane(content);
+ this.scroll = scroll;
+ scroll.getStyleClass().remove("scroll-pane");
+ scroll.getStyleClass().add("box");
+ scroll.setPrefHeight(400);
+
+ Pane[] lanes = new Pane[5];
+ for (int i = 0; i < lanes.length; i++) {
+ lanes[i] = new Pane();
+ }
+
+ content.getChildren().addAll(lanes);
+
+ diff.notes.list.forEach(n -> lanes[n.lane].getChildren().add(drawNote(n)));
+
+ VBox notePreview = new VBox(scroll);
+ notePreview.getChildren().addAll(editNotes,oldEditNotes);
+ notePreview.setSpacing(10);
+
+ VBox left = new VBox();
+ left.getChildren().addAll(folderNameLabel,folderName,titleLabel,title,priorityLabel,priority,editScores,playLevel,save);
+ left.setSpacing(10);
+
+ HBox main = new HBox();
+ main.getChildren().addAll(left, notePreview);
+ main.setSpacing(30);
+
+ Button exit = new Button();
+ exit.setText("Back");
+ exit.setOnAction(e -> {
+ Driver.soundController.playSfx("backward");
+ Driver.setMenu(prev);
+ });
+
+ VBox centerBox = new VBox();
+ centerBox.setAlignment(Pos.CENTER);
+ centerBox.setSpacing(10);
+ centerBox.getChildren().addAll(main,exit);
+ centerBox.setMinWidth(400);
+
+ HBox rootBox = new HBox();
+ rootBox.prefWidthProperty().bind(super.prefWidthProperty());
+ rootBox.prefHeightProperty().bind(super.prefHeightProperty());
+ rootBox.getChildren().add(centerBox);
+ rootBox.setAlignment(Pos.CENTER);
+
+ super.getChildren().add(rootBox);
+ }
+
+ // Duplicates of NotesEditor2 methods, should be made generic and combined
+ private Block drawNote(Note n) {
+ Color color = diff.level.colors[n.lane];
+ Block b = new Block(color,20, 20, 5, false, n);
+ b.heightProperty().bind(scroll.widthProperty().divide(8));
+ b.widthProperty().bind(scroll.widthProperty().divide(8));
+ b.arcHeightProperty().bind(scroll.widthProperty().divide(25));
+ b.arcWidthProperty().bind(scroll.widthProperty().divide(25));
+ b.strokeWidthProperty().bind(scroll.widthProperty().divide(120));
+ b.layoutYProperty().bind(secondToScreenPos(n.time.add(0)));
+ return b;
+ }
+
+ private DoubleBinding secondToScreenPos(double second) {
+ return scroll.heightProperty().multiply(second * 0.9);
+ }
+
+ private DoubleBinding secondToScreenPos(DoubleBinding second) {
+ return scroll.heightProperty().multiply(second).multiply(0.9);
}
} \ No newline at end of file
diff --git a/src/main/java/net/sowgro/npehero/devmenu/DiffList.java b/src/main/java/net/sowgro/npehero/devmenu/DiffList.java
new file mode 100755
index 0000000..be4126d
--- /dev/null
+++ b/src/main/java/net/sowgro/npehero/devmenu/DiffList.java
@@ -0,0 +1,129 @@
+package net.sowgro.npehero.devmenu;
+
+import javafx.beans.property.ReadOnlyBooleanWrapper;
+import javafx.beans.property.ReadOnlyStringWrapper;
+import javafx.geometry.Insets;
+import javafx.geometry.Pos;
+import javafx.scene.control.*;
+import javafx.scene.layout.HBox;
+import javafx.scene.layout.Pane;
+import javafx.scene.layout.VBox;
+import net.sowgro.npehero.Driver;
+import net.sowgro.npehero.main.Difficulty;
+import net.sowgro.npehero.main.Level;
+
+public class DiffList extends Pane
+{
+ /*
+ * this class is a layout class, most of its purpose is to place UI elements like Buttons within Panes like VBoxes.
+ * the creation of these UI elements are mostly not commented due to their repetitive and self explanatory nature.
+ * style classes are defined in the style.css file.
+ */
+ public DiffList(Level level, Pane prev)
+ {
+ //sets up table view: requires special getters, setters and constructors to work
+ TableView<Difficulty> diffs = new TableView<>();
+
+ TableColumn<Difficulty,String> titleCol = new TableColumn<>("Name");
+ TableColumn<Difficulty,Boolean> validCol = new TableColumn<>("Valid?");
+
+ diffs.getColumns().add(titleCol);
+ diffs.getColumns().add(validCol);
+
+ titleCol.setCellValueFactory(data -> new ReadOnlyStringWrapper(data.getValue().getTitle()));
+ validCol.setCellValueFactory(data -> new ReadOnlyBooleanWrapper(data.getValue().isValid()));
+
+ diffs.setItems(level.getDiffList());
+
+ diffs.setRowFactory( _ -> {
+ TableRow<Difficulty> row = new TableRow<>();
+ row.setOnMouseClicked(event -> {
+ if (event.getClickCount() == 2 && (! row.isEmpty()) ) {
+ Difficulty rowData = row.getItem();
+ Driver.setMenu(new DiffEditor(rowData, this));
+ }
+ });
+ return row ;
+ });
+
+// diffs.prefWidthProperty().bind(super.prefWidthProperty().multiply(0.35));
+ diffs.setPrefWidth(400);
+ diffs.prefHeightProperty().bind(super.prefHeightProperty().multiply(0.67));
+
+ Button edit = new Button("Edit");
+ edit.setOnAction(e -> Driver.setMenu(new DiffEditor(diffs.getSelectionModel().getSelectedItem(), this)));
+ edit.setDisable(true);
+ edit.disableProperty().bind(diffs.getSelectionModel().selectedItemProperty().isNull());
+
+ Button remove = new Button("Delete");
+ remove.setOnAction(e -> level.removeDiff(diffs.getSelectionModel().getSelectedItem()));
+ remove.setDisable(true);
+ remove.disableProperty().bind(diffs.getSelectionModel().selectedItemProperty().isNull());
+
+ Button refresh = new Button("Refresh");
+ refresh.setOnAction(e -> {
+ level.readData();
+ diffs.setItems(level.getDiffList());
+ });
+
+ ToggleButton create = new ToggleButton("Create");
+
+ VBox buttons = new VBox();
+ buttons.getChildren().addAll(create, edit, remove, refresh);
+ buttons.setSpacing(10);
+
+ TextField newLevelEntry = new TextField();
+ Button newLevelButton = new Button("add");
+
+ HBox newLevel = new HBox(newLevelEntry,newLevelButton);
+ Label newLevelLabel = new Label("Name of new difficulty");
+ VBox newLevelBox = new VBox(newLevelLabel, newLevel);
+ newLevelBox.setSpacing(10);
+ newLevelBox.getStyleClass().add("box");
+ newLevelBox.setPadding(new Insets(10));
+
+ Pane sidebar = new Pane();
+
+ HBox main = new HBox();
+ main.getChildren().addAll(diffs,buttons, sidebar);
+ main.setSpacing(10);
+
+ Button exit = new Button();
+ exit.setText("Back");
+ exit.setOnAction(e -> {
+ Driver.soundController.playSfx("backward");
+ Driver.setMenu(prev);
+ });
+
+ VBox centerBox = new VBox();
+ centerBox.setAlignment(Pos.CENTER);
+ centerBox.setSpacing(10);
+ centerBox.getChildren().addAll(main,exit);
+
+ HBox rootBox = new HBox();
+ rootBox.prefWidthProperty().bind(super.prefWidthProperty());
+ rootBox.prefHeightProperty().bind(super.prefHeightProperty());
+ rootBox.getChildren().add(centerBox);
+ rootBox.setAlignment(Pos.CENTER);
+
+ create.setOnAction(_ -> {
+ if (create.isSelected()) {
+ sidebar.getChildren().add(newLevelBox);
+ }
+ else {
+ sidebar.getChildren().remove(newLevelBox);
+ }
+ });
+
+ newLevelButton.setOnAction(_ -> {
+ level.addDiff(newLevelEntry.getText());
+ newLevelEntry.clear();
+ refresh.fire();
+ sidebar.getChildren().clear();
+ create.setSelected(false);
+ });
+
+ super.getChildren().add(rootBox);
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/net/sowgro/npehero/devmenu/LevelEditor.java b/src/main/java/net/sowgro/npehero/devmenu/LevelEditor.java
index bd8bde6..e5ecf1c 100755
--- a/src/main/java/net/sowgro/npehero/devmenu/LevelEditor.java
+++ b/src/main/java/net/sowgro/npehero/devmenu/LevelEditor.java
@@ -4,18 +4,13 @@ import java.io.File;
import javafx.beans.property.ReadOnlyBooleanWrapper;
import javafx.beans.property.ReadOnlyStringWrapper;
-import javafx.scene.Scene;
-import javafx.scene.control.Button;
-import javafx.scene.control.ColorPicker;
-import javafx.scene.control.TableColumn;
-import javafx.scene.control.TableView;
-import javafx.scene.control.TextField;
+import javafx.geometry.Pos;
+import javafx.scene.control.*;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
import javafx.stage.FileChooser;
-import javafx.stage.Stage;
import javafx.stage.FileChooser.ExtensionFilter;
import net.sowgro.npehero.Driver;
import net.sowgro.npehero.main.Difficulty;
@@ -32,11 +27,14 @@ public class LevelEditor extends Pane
* the creation of these UI elements are mostly not commented due to their repetitive and self explanatory nature.
* style classes are defined in the style.css file.
*/
- public LevelEditor(Level level)
+ public LevelEditor(Level level, Pane prev)
{
Text folderNameLabel = new Text("Folder name");
- TextField folderName = new TextField(level.thisDir.getName());
- folderName.setDisable(true);
+ TextField folderName = new TextField();
+ if (level.thisDir != null) {
+ folderName.setText(level.thisDir.getName());
+ folderName.setDisable(true);
+ }
Text titleLabel = new Text("Title");
TextField title = new TextField(level.getTitle());
@@ -47,12 +45,22 @@ public class LevelEditor extends Pane
Text descLabel = new Text("Description");
TextField desc = new TextField(level.desc);
- Text colorsLabel = new Text("Colors (Left to right)");
- ColorPicker c1 = new ColorPicker(level.colors[0]);
- ColorPicker c2 = new ColorPicker(level.colors[1]);
- ColorPicker c3 = new ColorPicker(level.colors[2]);
- ColorPicker c4 = new ColorPicker(level.colors[3]);
- ColorPicker c5 = new ColorPicker(level.colors[4]);
+ Text colorsLabel = new Text("Colors");
+
+ ColorPicker[] colorsPickers = new ColorPicker[] {
+ new ColorPicker(level.colors[0]),
+ new ColorPicker(level.colors[1]),
+ new ColorPicker(level.colors[2]),
+ new ColorPicker(level.colors[3]),
+ new ColorPicker(level.colors[4])
+ };
+
+ for (ColorPicker cp : colorsPickers) {
+ cp.getStyleClass().add("button");
+ }
+
+ HBox colorPickerBox = new HBox();
+ colorPickerBox.getChildren().addAll(colorsPickers);
Text filesLabel = new Text("Files");
@@ -73,10 +81,10 @@ public class LevelEditor extends Pane
Text diffLabel = new Text("Difficulties");
- TableView<Difficulty> diffList = new TableView<Difficulty>();
-
- TableColumn<Difficulty,String> diffCol = new TableColumn<Difficulty,String>("Difficulty");
- TableColumn<Difficulty,Boolean> validCol = new TableColumn<Difficulty,Boolean>("Valid?");
+ TableView<Difficulty> diffList = new TableView<>();
+
+ TableColumn<Difficulty,String> diffCol = new TableColumn<>("Difficulty");
+ TableColumn<Difficulty,Boolean> validCol = new TableColumn<>("Valid?");
diffList.getColumns().add(diffCol);
diffList.getColumns().add(validCol);
@@ -85,39 +93,39 @@ public class LevelEditor extends Pane
validCol.setCellValueFactory(data -> new ReadOnlyBooleanWrapper(data.getValue().isValid));
diffList.setItems(level.getDiffList());
-
- Button edit = new Button("Edit");
- edit.setOnAction(e -> Driver.setMenu(new DiffEditor(diffList.getSelectionModel().getSelectedItem())));
-
- Button remove = new Button("Delete");
- remove.setOnAction(e -> level.removeDiff(diffList.getSelectionModel().getSelectedItem()));
-
- Button refresh = new Button("Refresh");
- refresh.setOnAction(e -> {
- level.readData();
- diffList.setItems(level.getDiffList());
+ diffList.setRowFactory( _ -> {
+ TableRow<Difficulty> row = new TableRow<>();
+ row.setOnMouseClicked(event -> {
+ if (event.getClickCount() == 2 && (! row.isEmpty()) ) {
+ Difficulty rowData = row.getItem();
+ Driver.setMenu(new DiffEditor(rowData, this));
+ }
+ });
+ return row ;
});
- HBox buttons = new HBox();
- buttons.getChildren().addAll(edit,remove,refresh);
-
TextField newDiff = new TextField("new");
Button newDiffButton = new Button("add");
newDiffButton.setOnAction(e -> level.addDiff(newDiff.getText()));
HBox newDiffBox = new HBox();
newDiffBox.getChildren().addAll(newDiff,newDiffButton);
+ Button newDiffs = new Button("Edit difficulties");
+ newDiffs.setOnAction(_ -> Driver.setMenu(new DiffList(level, this)));
+
+ diffList.setSelectionModel(null);
+
Button save = new Button("Save");
- save.setOnAction(e -> { //asigns feilds to values
+ save.setOnAction(e -> { //assigns fields to values
level.setTitle(title.getText());
level.setArtist(artist.getText());
level.desc = desc.getText();
- level.colors[0] = c1.getValue();
- level.colors[1] = c2.getValue();
- level.colors[2] = c3.getValue();
- level.colors[3] = c4.getValue();
- level.colors[4] = c5.getValue();
+ level.colors[0] = colorsPickers[0].getValue();
+ level.colors[1] = colorsPickers[1].getValue();
+ level.colors[2] = colorsPickers[2].getValue();
+ level.colors[3] = colorsPickers[3].getValue();
+ level.colors[4] = colorsPickers[4].getValue();
if (selectedBackground != null && selectedBackground.exists())
{
level.addFile(selectedBackground,"background.png");
@@ -135,14 +143,36 @@ public class LevelEditor extends Pane
VBox options = new VBox();
options.getChildren().addAll(folderNameLabel,folderName,titleLabel,title,artistLabel,artist,descLabel,desc,colorsLabel,
- c1,c2,c3,c4,c5,filesLabel,previewButton,backgroundButton,songButton,save);
+ colorPickerBox,filesLabel,previewButton,backgroundButton,songButton,save);
+ options.setSpacing(10);
VBox diffBox = new VBox();
- diffBox.getChildren().addAll(diffLabel,diffList,buttons,newDiffBox);
+ diffBox.getChildren().addAll(diffLabel,diffList,/*buttons,newDiffBox,*/ newDiffs);
+ diffBox.setSpacing(10);
HBox mainBox = new HBox();
mainBox.getChildren().addAll(options,diffBox);
+ mainBox.setSpacing(30);
+
+ Button exit = new Button();
+ exit.setText("Back");
+ exit.setOnAction(e -> {
+ Driver.soundController.playSfx("backward");
+ Driver.setMenu(prev);
+ });
+
+ VBox centerBox = new VBox();
+ centerBox.setAlignment(Pos.CENTER);
+ centerBox.setSpacing(10);
+ centerBox.getChildren().addAll(mainBox,exit);
+ centerBox.setMinWidth(400);
+
+ HBox rootBox = new HBox();
+ rootBox.prefWidthProperty().bind(super.prefWidthProperty());
+ rootBox.prefHeightProperty().bind(super.prefHeightProperty());
+ rootBox.getChildren().add(centerBox);
+ rootBox.setAlignment(Pos.CENTER);
- super.getChildren().add(mainBox);
+ super.getChildren().add(rootBox);
}
} \ No newline at end of file
diff --git a/src/main/java/net/sowgro/npehero/devmenu/LevelList.java b/src/main/java/net/sowgro/npehero/devmenu/LevelList.java
index c1c38af..e37e2ea 100755
--- a/src/main/java/net/sowgro/npehero/devmenu/LevelList.java
+++ b/src/main/java/net/sowgro/npehero/devmenu/LevelList.java
@@ -2,16 +2,14 @@ package net.sowgro.npehero.devmenu;
import javafx.beans.property.ReadOnlyBooleanWrapper;
import javafx.beans.property.ReadOnlyStringWrapper;
+import javafx.geometry.Insets;
+import javafx.geometry.Pos;
+import javafx.scene.control.*;
import javafx.scene.layout.Pane;
import net.sowgro.npehero.Driver;
-import javafx.scene.Scene;
-import javafx.scene.control.Button;
-import javafx.scene.control.TableColumn;
-import javafx.scene.control.TableView;
-import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
-import javafx.stage.Stage;
+import net.sowgro.npehero.gui.MainMenu;
import net.sowgro.npehero.main.Level;
import net.sowgro.npehero.main.LevelController;
@@ -25,10 +23,10 @@ public class LevelList extends Pane
public LevelList()
{
//sets up table view: requires special getters, setters and constructors to work
- TableView<Level> levels = new TableView<Level>();
+ TableView<Level> levels = new TableView<>();
- TableColumn<Level,String> titleCol = new TableColumn<Level,String>("Title");
- TableColumn<Level,String> artistCol = new TableColumn<Level,String>("Artist");
+ TableColumn<Level,String> titleCol = new TableColumn<>("Title");
+ TableColumn<Level,String> artistCol = new TableColumn<>("Artist");
TableColumn<Level,Boolean> validCol = new TableColumn<>("Valid?");
levels.getColumns().add(titleCol);
@@ -41,12 +39,30 @@ public class LevelList extends Pane
levels.setItems(LevelController.getLevelList());
+ levels.setRowFactory( _ -> {
+ TableRow<Level> row = new TableRow<>();
+ row.setOnMouseClicked(event -> {
+ if (event.getClickCount() == 2 && (! row.isEmpty()) ) {
+ Level rowData = row.getItem();
+ Driver.setMenu(new LevelEditor(rowData, this));
+ }
+ });
+ return row ;
+ });
+
+ levels.prefWidthProperty().bind(super.prefWidthProperty().multiply(0.35));
+ levels.setMinWidth(400);
+ levels.prefHeightProperty().bind(super.prefHeightProperty().multiply(0.75));
Button edit = new Button("Edit");
- edit.setOnAction(e -> Driver.setMenu(new LevelEditor(levels.getSelectionModel().getSelectedItem())));
+ edit.setOnAction(e -> Driver.setMenu(new LevelEditor(levels.getSelectionModel().getSelectedItem(), this)));
+ edit.setDisable(true);
+ edit.disableProperty().bind(levels.getSelectionModel().selectedItemProperty().isNull());
Button remove = new Button("Delete");
remove.setOnAction(e -> Driver.levelController.removeLevel(levels.getSelectionModel().getSelectedItem()));
+ remove.setDisable(true);
+ remove.disableProperty().bind(levels.getSelectionModel().selectedItemProperty().isNull());
Button refresh = new Button("Refresh");
refresh.setOnAction(e -> {
@@ -54,17 +70,64 @@ public class LevelList extends Pane
levels.setItems(LevelController.getLevelList());
});
- HBox buttons = new HBox();
- buttons.getChildren().addAll(edit,remove,refresh);
+ ToggleButton create = new ToggleButton("Create");
- TextField newLevel = new TextField("new");
+ VBox buttons = new VBox();
+ buttons.getChildren().addAll(create, edit, remove, refresh);
+ buttons.setSpacing(10);
+
+ TextField newLevelEntry = new TextField();
Button newLevelButton = new Button("add");
- newLevelButton.setOnAction(e -> Driver.levelController.addLevel(newLevel.getText()));
- HBox newLevelBox = new HBox();
- newLevelBox.getChildren().addAll(newLevel,newLevelButton);
- VBox main = new VBox();
- main.getChildren().addAll(levels,buttons,newLevelBox);
- super.getChildren().add(main);
+ HBox newLevel = new HBox(newLevelEntry,newLevelButton);
+ Label newLevelLabel = new Label("Name of new level");
+ VBox newLevelBox = new VBox(newLevelLabel, newLevel);
+ newLevelBox.setSpacing(10);
+ newLevelBox.getStyleClass().add("box");
+ newLevelBox.setPadding(new Insets(10));
+
+ Pane sidebar = new Pane();
+
+ HBox main = new HBox();
+ main.getChildren().addAll(levels,buttons,sidebar);
+ main.setSpacing(10);
+
+ Button exit = new Button();
+ exit.setText("Back");
+ exit.setOnAction(e -> {
+ Driver.soundController.playSfx("backward");
+ Driver.setMenu(new MainMenu());
+ });
+
+ VBox centerBox = new VBox();
+ centerBox.setAlignment(Pos.CENTER);
+ centerBox.setSpacing(10);
+ centerBox.getChildren().addAll(main,exit);
+ centerBox.setMinWidth(400);
+
+ HBox rootBox = new HBox();
+ rootBox.prefWidthProperty().bind(super.prefWidthProperty());
+ rootBox.prefHeightProperty().bind(super.prefHeightProperty());
+ rootBox.getChildren().add(centerBox);
+ rootBox.setAlignment(Pos.CENTER);
+
+ create.setOnAction(_ -> {
+ if (create.isSelected()) {
+ sidebar.getChildren().add(newLevelBox);
+ }
+ else {
+ sidebar.getChildren().remove(newLevelBox);
+ }
+ });
+
+ newLevelButton.setOnAction(_ -> {
+ Driver.levelController.addLevel(newLevelEntry.getText());
+ newLevelEntry.clear();
+ refresh.fire();
+ sidebar.getChildren().clear();
+ create.setSelected(false);
+ });
+
+ super.getChildren().add(rootBox);
}
} \ No newline at end of file
diff --git a/src/main/java/net/sowgro/npehero/devmenu/NotesEditor.java b/src/main/java/net/sowgro/npehero/devmenu/NotesEditor.java
index 39a2b8e..6f2721e 100755
--- a/src/main/java/net/sowgro/npehero/devmenu/NotesEditor.java
+++ b/src/main/java/net/sowgro/npehero/devmenu/NotesEditor.java
@@ -4,6 +4,8 @@ import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
+import javafx.geometry.Pos;
+import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import net.sowgro.npehero.gameplay.Timer;
import net.sowgro.npehero.Driver;
@@ -12,18 +14,17 @@ import javafx.scene.control.Button;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
-import javafx.stage.Stage;
import net.sowgro.npehero.main.Difficulty;
public class NotesEditor extends Pane
{
Text help;
- String t1 = "Press Start to begin recording. Use the same keys. Note: existing notes will be overwitten.";
+ String t1 = "Press Start to begin recording. Use the same keys. Note: existing notes will be overwritten.";
String t2 = "Now recording. Press Stop or ESC to finish";
Difficulty diff;
Timer timer;
PrintWriter writer;
- public NotesEditor(Difficulty diff) throws FileNotFoundException, UnsupportedEncodingException
+ public NotesEditor(Difficulty diff, Pane prev) throws FileNotFoundException, UnsupportedEncodingException
{
this.diff = diff;
@@ -41,9 +42,28 @@ public class NotesEditor extends Pane
VBox main = new VBox();
main.getChildren().addAll(help,cur,start,stop);
- super.getChildren().add(main);
+ Button exit = new Button();
+ exit.setText("Back");
+ exit.setOnAction(e -> {
+ Driver.soundController.playSfx("backward");
+ Driver.setMenu(prev);
+ });
- writer = new PrintWriter(diff.notes, "UTF-8");
+ VBox centerBox = new VBox();
+ centerBox.setAlignment(Pos.CENTER);
+ centerBox.setSpacing(10);
+ centerBox.getChildren().addAll(main,exit);
+ centerBox.setMinWidth(400);
+
+ HBox rootBox = new HBox();
+ rootBox.prefWidthProperty().bind(super.prefWidthProperty());
+ rootBox.prefHeightProperty().bind(super.prefHeightProperty());
+ rootBox.getChildren().add(centerBox);
+ rootBox.setAlignment(Pos.CENTER);
+
+ super.getChildren().add(rootBox);
+
+ writer = new PrintWriter(diff.notes.getFile(), "UTF-8");
Scene scene = Driver.primaryStage.getScene();
scene.setOnKeyPressed(e -> {
diff --git a/src/main/java/net/sowgro/npehero/devmenu/NotesEditor2.java b/src/main/java/net/sowgro/npehero/devmenu/NotesEditor2.java
new file mode 100644
index 0000000..fc44339
--- /dev/null
+++ b/src/main/java/net/sowgro/npehero/devmenu/NotesEditor2.java
@@ -0,0 +1,373 @@
+package net.sowgro.npehero.devmenu;
+
+import javafx.beans.binding.DoubleBinding;
+import javafx.beans.property.ListProperty;
+import javafx.beans.property.SimpleListProperty;
+import javafx.collections.FXCollections;
+import javafx.collections.ListChangeListener;
+import javafx.geometry.Insets;
+import javafx.geometry.Pos;
+import javafx.scene.control.*;
+import javafx.scene.layout.HBox;
+import javafx.scene.layout.Pane;
+import javafx.scene.layout.StackPane;
+import javafx.scene.layout.VBox;
+import javafx.scene.media.Media;
+import javafx.scene.media.MediaPlayer;
+import javafx.scene.paint.Color;
+import javafx.scene.shape.Line;
+import javafx.scene.shape.Polygon;
+import javafx.util.Duration;
+import net.sowgro.npehero.Driver;
+import net.sowgro.npehero.gameplay.Block;
+import net.sowgro.npehero.gameplay.Target;
+import net.sowgro.npehero.main.Difficulty;
+import net.sowgro.npehero.main.Note;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class NotesEditor2 extends Pane {
+ Difficulty diff;
+ ScrollPane scroll = new ScrollPane();
+ Pane[] lanes;
+ MediaPlayer m;
+ Polygon playhead;
+ ListProperty<Block> activeNotes = new SimpleListProperty<>(FXCollections.observableArrayList());
+ ListProperty<Note> noteList;
+
+ public NotesEditor2(Difficulty diff, DiffEditor prev) {
+
+ this.diff = diff;
+ noteList = diff.notes.deepCopyList();
+
+ m = new MediaPlayer(new Media(diff.level.song.toURI().toString()));
+
+ // Buttons
+ VBox actionBox = new VBox();
+ actionBox.setSpacing(10);
+
+ Label noteLabel = new Label("Notes");
+ ToggleButton addNote = new ToggleButton("Add");
+ Button delNote = new Button("Delete");
+ ToggleButton moveNote = new ToggleButton("Move");
+ actionBox.getChildren().addAll(noteLabel, addNote, delNote, moveNote);
+
+ Label selectionLabel = new Label("Selection");
+ Button selectAll = new Button("Select All");
+ Button clearSelect = new Button("Clear");
+ actionBox.getChildren().addAll(selectionLabel, selectAll, clearSelect);
+
+ Label playbackLabel = new Label("Playback");
+ ToggleButton play = new ToggleButton("Play");
+ Button reset = new Button("Reset");
+ ToggleButton scrollLock = new ToggleButton("Scroll Lock");
+ actionBox.getChildren().addAll(playbackLabel, play, reset, scrollLock);
+
+ delNote.disableProperty().bind(activeNotes.emptyProperty());
+ moveNote.disableProperty().bind(activeNotes.emptyProperty());
+ clearSelect.disableProperty().bind(activeNotes.emptyProperty());
+
+ ToggleGroup tg = new ToggleGroup();
+ addNote.setToggleGroup(tg);
+ moveNote.setToggleGroup(tg);
+
+ // Lanes
+ this.lanes = new Pane[5];
+ for (int i = 0; i < lanes.length; i++) {
+ lanes[i] = new Pane();
+ }
+ Block sizer = drawBlock(new Note(0, 0));
+ for (Pane lane : lanes) {
+ lane.prefWidthProperty().bind(sizer.widthProperty());
+ lane.prefHeightProperty().bind(sizer.heightProperty());
+ }
+ Pane rulerLane = new Pane();
+ Pane playheadLane = new Pane();
+ playheadLane.setOnMouseClicked(e -> {
+ m.seek(new Duration(screenPosToSecond(e.getY()) * 1000));
+ });
+
+ this.playhead = new Polygon();
+ playhead.getPoints().addAll(
+ 0.0, -10.0,
+ 20.0, -10.0,
+ 30.0, 0.0,
+ 20.0, 10.0,
+ 0.0, 10.0
+ );
+ playhead.setFill(Color.WHITE);
+ playheadLane.getChildren().add(playhead);
+
+ HBox content = new HBox();
+ content.setAlignment(Pos.CENTER);
+ content.setSpacing(10);
+ content.getChildren().addAll(playheadLane, rulerLane);
+ content.getChildren().addAll(lanes);
+
+ Line playheadLine = new Line();
+ playheadLine.setStartX(0);
+ playheadLine.endXProperty().bind(scroll.widthProperty().subtract(80));
+ playheadLine.setStartY(0);
+ playheadLine.setEndY(0);
+ playheadLine.setStroke(Color.WHITE);
+ playheadLine.layoutYProperty().bind(playhead.layoutYProperty());
+
+ Pane contentOverlay = new Pane(playheadLine);
+ contentOverlay.setPickOnBounds(false);
+
+ StackPane stackPane = new StackPane();
+ stackPane.getChildren().addAll(content, contentOverlay);
+
+ scroll.setContent(stackPane);
+ scroll.prefWidthProperty().bind(super.prefWidthProperty().multiply(0.35));
+ scroll.setMinWidth(400);
+ scroll.prefHeightProperty().bind(super.prefHeightProperty().multiply(0.75));
+ scroll.getStyleClass().remove("scroll-pane");
+ scroll.getStyleClass().add("box");
+ scroll.setPadding(new Insets(5));
+
+ Pane helpBox = new Pane();
+
+ HBox main = new HBox();
+ main.getChildren().addAll(scroll, actionBox, helpBox);
+ main.setSpacing(10);
+
+ Button exit = new Button();
+ exit.setText("Cancel");
+ exit.setOnAction(_ -> {
+ Driver.soundController.playSfx("backward");
+ Driver.setMenu(prev);
+ });
+
+ Button save = new Button();
+ save.setText("Done");
+ save.setOnAction(_ -> {
+ diff.notes.list = noteList;
+ Driver.soundController.playSfx("backward");
+ Driver.setMenu(new DiffEditor(diff, prev.prev));
+ });
+
+ HBox buttons = new HBox(save, exit);
+ buttons.setSpacing(10);
+ buttons.setAlignment(Pos.CENTER);
+
+ // Draw notes
+ noteList.forEach(n -> lanes[n.lane].getChildren().add(drawBlock(n)));
+ noteList.addListener((ListChangeListener<? super Note>) e -> {
+ // TODO
+ for (Pane lane : lanes) {
+ lane.getChildren().clear();
+ }
+ noteList.forEach(n -> lanes[n.lane].getChildren().add(drawBlock(n)));
+ });
+
+ // Draw and update ruler
+ AtomicInteger lastRuler = new AtomicInteger(-1);
+ content.heightProperty().addListener(_ -> {
+ int ruler1 = (int) screenPosToSecond(content.getHeight());
+ for (int i = lastRuler.get() + 1; i <= ruler1; i++) {
+ Label l = new Label(toMinAndSec(i)+" -");
+ l.layoutYProperty().bind(secondToScreenPos(i));
+ l.setTextFill(Color.WHITE);
+ rulerLane.getChildren().add(l);
+ }
+ lastRuler.set(ruler1);
+ });
+
+ VBox centerBox = new VBox();
+ centerBox.setAlignment(Pos.CENTER);
+ centerBox.setSpacing(10);
+ centerBox.getChildren().addAll(main, buttons);
+ centerBox.setMinWidth(400);
+
+ HBox rootBox = new HBox();
+ rootBox.prefWidthProperty().bind(super.prefWidthProperty());
+ rootBox.prefHeightProperty().bind(super.prefHeightProperty());
+ rootBox.getChildren().add(centerBox);
+ rootBox.setAlignment(Pos.CENTER);
+
+ // write notes on key press
+ rootBox.setOnKeyPressed(e -> {
+ switch (e.getCode()) {
+ case D -> WriteNote(0);
+ case F -> WriteNote(1);
+ case G -> WriteNote(2); // Problem with space to select
+ case J -> WriteNote(3);
+ case K -> WriteNote(4);
+ case EQUALS -> activeNotes.forEach(n -> n.note.time.setValue(n.note.time.get() - 0.01));
+ case MINUS -> activeNotes.forEach(n -> n.note.time.setValue(n.note.time.get() + 0.01));
+ case DELETE -> delNote.fire();
+ case ESCAPE -> clearSelect.fire();
+ };
+ });
+
+ m.currentTimeProperty().addListener(_ -> {
+ // TODO
+ playhead.layoutYProperty().bind(secondToScreenPos(m.getCurrentTime().toSeconds()));
+ });
+
+ play.setOnAction(_ -> {
+ if (play.isSelected()) {
+ m.play();
+ }
+ else {
+ m.pause();
+ }
+
+ });
+
+ scrollLock.setOnAction(_ -> {
+ if (scrollLock.isSelected()) {
+ // vvalue takes in a value between 0 and 1 NOT a pixel value
+ scroll.vvalueProperty().bind(playhead.layoutYProperty().subtract(scroll.heightProperty().divide(2)).divide(content.heightProperty().subtract(scroll.heightProperty())));
+ }
+ else {
+ scroll.vvalueProperty().unbind();
+ }
+
+
+ });
+
+ reset.setOnAction(_ -> {
+ m.seek(new Duration(0));
+ });
+
+ delNote.setOnAction(_ -> {
+ activeNotes.forEach(e -> {
+ noteList.remove(e.note);
+ });
+ activeNotes.clear();
+ });
+
+ clearSelect.setOnAction(_ -> {
+ activeNotes.forEach(e -> e.setFill(e.color));
+ activeNotes.clear();
+ });
+
+ selectAll.setOnAction(_ -> {
+ activeNotes.clear();
+ for (Pane lane : lanes) {
+ lane.getChildren().forEach(e -> activeNotes.add((Block) e));
+ }
+ activeNotes.forEach(e -> e.setFill(Color.WHITE));
+ });
+
+ Pane addHelp = addHelp();
+ Pane moveHelp = moveHelp();
+ addNote.setOnAction(_ -> {
+ if (addNote.isSelected()) {
+ helpBox.getChildren().clear();
+ helpBox.getChildren().add(addHelp);
+ }
+ else {
+ helpBox.getChildren().clear();
+ }
+ });
+
+ moveNote.setOnAction(_ -> {
+ if (moveNote.isSelected()) {
+ helpBox.getChildren().clear();
+ helpBox.getChildren().add(moveHelp);
+ }
+ else {
+ helpBox.getChildren().clear();
+ }
+ });
+
+ moveNote.disabledProperty().addListener(_ -> {
+ if (moveNote.isDisabled() && moveNote.isSelected()) {
+ moveNote.setSelected(false);
+ helpBox.getChildren().clear();
+ }
+ });
+
+ super.getChildren().add(rootBox);
+ }
+
+ private Block drawBlock(Note n) {
+ Color color = diff.level.colors[n.lane];
+ Block b = new Block(color,20, 20, 5, false, n);
+ b.heightProperty().bind(scroll.widthProperty().divide(8));
+ b.widthProperty().bind(scroll.widthProperty().divide(8));
+ b.arcHeightProperty().bind(scroll.widthProperty().divide(25));
+ b.arcWidthProperty().bind(scroll.widthProperty().divide(25));
+ b.strokeWidthProperty().bind(scroll.widthProperty().divide(120));
+ b.layoutYProperty().bind(secondToScreenPos(n.time.add(0)));
+ b.setOnMouseClicked(_ -> {
+ if (activeNotes.contains(b)) {
+ activeNotes.remove(b);
+ b.setFill(b.color);
+ }
+ else {
+ activeNotes.add(b);
+ b.setFill(Color.WHITE);
+ }
+ });
+ return b;
+ }
+
+ private String toMinAndSec(int t) {
+ int min = t / 60;
+ int sec = t % 60;
+
+ String min2 = min + "";
+ if (min2.length() == 1) {
+ min2 = "0" + min2;
+ }
+ String sec2 = sec + "";
+ if (sec2.length() == 1) {
+ sec2 = "0" + sec2;
+ }
+ return min2 + ":" + sec2;
+ }
+
+ private double screenPosToSecond(double screenYPos) {
+ return screenYPos / (scroll.getHeight() * 0.9);
+ }
+
+ private DoubleBinding secondToScreenPos(DoubleBinding second) {
+ return scroll.heightProperty().multiply(second).multiply(0.9);
+ }
+
+ private DoubleBinding secondToScreenPos(double second) {
+ return scroll.heightProperty().multiply(second).multiply(0.9);
+ }
+
+ private void WriteNote(int col) {
+ Note tmp = new Note(screenPosToSecond(playhead.getLayoutY()), col);
+ noteList.add(tmp);
+ }
+
+ private Pane addHelp() {
+ Label l1 = new Label("Use the following keys");
+ HBox hb = new HBox(
+ new Target(diff.level.colors[0], 40, 40, 10, 'd'),
+ new Target(diff.level.colors[1], 40, 40, 10, 'f'),
+ new Target(diff.level.colors[2], 40, 40, 10, 'g'),
+ new Target(diff.level.colors[3], 40, 40, 10, 'j'),
+ new Target(diff.level.colors[4], 40, 40, 10, 'k')
+ );
+ hb.setSpacing(10);
+ hb.setAlignment(Pos.CENTER_LEFT);
+ Label l2 = new Label("to write a new note at \nthe play head's position.");
+
+ VBox ret = new VBox(l1, hb, l2);
+ ret.setPadding(new Insets(10));
+ ret.getStyleClass().add("box");
+ return ret;
+ }
+
+ private Pane moveHelp() {
+ Label l1 = new Label("Use the");
+ HBox hb = new HBox(new Target(Color.BLACK, 40, 40, 10, '+'), new Label("and"), new Target(Color.BLACK, 40, 40, 10, '-'), new Label("keys"));
+ hb.setSpacing(10);
+ hb.setAlignment(Pos.CENTER_LEFT);
+ Label l2 = new Label("to move the selected \nnote(s) up and down.");
+
+ VBox ret = new VBox(l1, hb, l2);
+ ret.setPadding(new Insets(10));
+ ret.getStyleClass().add("box");
+ ret.setLayoutY(120);
+ return ret;
+ }
+}