diff options
Diffstat (limited to 'src/main/java/net/sowgro/npehero/editor/NotesEditor2.java')
-rw-r--r-- | src/main/java/net/sowgro/npehero/editor/NotesEditor2.java | 164 |
1 files changed, 103 insertions, 61 deletions
diff --git a/src/main/java/net/sowgro/npehero/editor/NotesEditor2.java b/src/main/java/net/sowgro/npehero/editor/NotesEditor2.java index f5b63e2..5ba7d88 100644 --- a/src/main/java/net/sowgro/npehero/editor/NotesEditor2.java +++ b/src/main/java/net/sowgro/npehero/editor/NotesEditor2.java @@ -1,5 +1,7 @@ package net.sowgro.npehero.editor; +import javafx.animation.Interpolator; +import javafx.animation.TranslateTransition; import javafx.beans.binding.DoubleBinding; import javafx.beans.property.DoubleProperty; import javafx.beans.property.ListProperty; @@ -38,17 +40,19 @@ public class NotesEditor2 extends Page { Pane[] lanes; MediaPlayer m; Polygon playhead; - ListProperty<Block> activeNotes = new SimpleListProperty<>(FXCollections.observableArrayList()); + ListProperty<Block> selectedNotes = new SimpleListProperty<>(FXCollections.observableArrayList()); ListProperty<Note> noteList; DiffEditor prev; DoubleProperty newEndTime = new SimpleDoubleProperty(0); + CheckBox selectMultiple; - private HBox content = new HBox(); + private final HBox content = new HBox(); public NotesEditor2(Difficulty diff, DiffEditor prev) { this.diff = diff; noteList = diff.notes.deepCopyList(); m = new MediaPlayer(diff.level.song); + m.volumeProperty().bind(Settings.musicVol); this.prev = prev; // Buttons @@ -62,9 +66,10 @@ public class NotesEditor2 extends Page { actionBox.getChildren().addAll(noteLabel, addNote, delNote, moveNote); Label selectionLabel = new Label("Selection"); + selectMultiple = new CheckBox("Select multiple"); Button selectAll = new Button("Select All"); Button clearSelect = new Button("Clear"); - actionBox.getChildren().addAll(selectionLabel, selectAll, clearSelect); + actionBox.getChildren().addAll(selectionLabel, selectMultiple, selectAll, clearSelect); Label playbackLabel = new Label("Playback"); ToggleButton play = new ToggleButton("Play"); @@ -73,9 +78,9 @@ public class NotesEditor2 extends Page { Button setEnd = new Button("End Here"); actionBox.getChildren().addAll(playbackLabel, play, reset, scrollLock, setEnd); - delNote.disableProperty().bind(activeNotes.emptyProperty()); - moveNote.disableProperty().bind(activeNotes.emptyProperty()); - clearSelect.disableProperty().bind(activeNotes.emptyProperty()); + delNote.disableProperty().bind(selectedNotes.emptyProperty()); + moveNote.disableProperty().bind(selectedNotes.emptyProperty()); + clearSelect.disableProperty().bind(selectedNotes.emptyProperty()); ToggleGroup tg = new ToggleGroup(); addNote.setToggleGroup(tg); @@ -108,11 +113,17 @@ public class NotesEditor2 extends Page { ); playhead.setFill(Color.WHITE); playheadLane.getChildren().add(playhead); + // TODO // playhead.setOnMouseDragged(e -> { // scroll.get // playhead.layoutYProperty().bind(secondToScreenPos()); // }); + Block trailBlazer = new Block(Color.BLACK, false, null); + trailBlazer.layoutYProperty().bind(playhead.translateYProperty().add(scroll.heightProperty().divide(2))); + trailBlazer.setVisible(false); + playheadLane.getChildren().add(trailBlazer); + HBox scrollContent = new HBox(); scrollContent.setAlignment(Pos.CENTER); scrollContent.setSpacing(10); @@ -125,7 +136,11 @@ public class NotesEditor2 extends Page { playheadLine.setStartY(0); playheadLine.setEndY(0); playheadLine.setStroke(Color.WHITE); - playheadLine.layoutYProperty().bind(playhead.layoutYProperty()); + playheadLine.layoutYProperty().bind(playhead.translateYProperty()); +// playheadLine.layoutYProperty().bind(secondToScreenPos(m.getCurrentTime().toSeconds())); +// m.currentTimeProperty().addListener((_, _, _) -> { +// playheadLine.layoutYProperty().bind(secondToScreenPos(m.getCurrentTime().toSeconds())); +// }); Line endLine = new Line(); endLine.setStartX(0); @@ -141,10 +156,9 @@ public class NotesEditor2 extends Page { stackPane.getChildren().addAll(scrollContent, contentOverlay); scroll.setContent(stackPane); -// scroll.prefWidthProperty().bind(super.prefWidthProperty().multiply(0.35)); -// scroll.setMinWidth(400); scroll.prefHeightProperty().bind(content.heightProperty().multiply(0.75)); - scroll.prefWidthProperty().bind(scroll.prefHeightProperty().multiply(0.70)); + scroll.prefWidthProperty().bind(scroll.heightProperty().multiply(0.72)); + scroll.minWidthProperty().bind(scroll.heightProperty().multiply(0.72)); scroll.getStyleClass().remove("scroll-pane"); scroll.getStyleClass().add("box"); scroll.setPadding(new Insets(5)); @@ -176,8 +190,9 @@ public class NotesEditor2 extends Page { diff.endTime = newEndTime.get(); diff.bpm = 0.0; try { - diff.readMetadata(); + diff.writeMetadata(); } catch (IOException e) { + e.printStackTrace(); // TODO } Sound.playSfx(Sound.BACKWARD); @@ -236,24 +251,31 @@ public class NotesEditor2 extends Page { // write notes on key press content.addEventFilter(KeyEvent.KEY_PRESSED, e -> { KeyCode k = e.getCode(); - if (k == Control.LANE0.getKey()) { WriteNote(0); } - if (k == Control.LANE1.getKey()) { WriteNote(1); } - if (k == Control.LANE2.getKey()) { WriteNote(2); } - if (k == Control.LANE3.getKey()) { WriteNote(3); } - if (k == Control.LANE4.getKey()) { WriteNote(4); } - if (k == Control.NOTE_DOWN.getKey()) { MoveNoteDown(); } - if (k == Control.NOTE_UP.getKey()) { MoveNoteUp(); } - if (k == Control.DELETE_NOTE.getKey()) { delNote.fire(); } - if (k == Control.CLEAR_SELECTION.getKey()) { clearSelect.fire(); } - if (k == Control.SCROLL_LOCK.getKey()) { scrollLock.fire(); } - if (k == Control.PLAY_PAUSE.getKey()) { play.fire(); } - if (k == Control.SELECT_ALL.getKey()) { selectAll.fire(); } - e.consume(); + if (k == Control.LANE0.getKey()) { e.consume(); WriteNote(0); } + if (k == Control.LANE1.getKey()) { e.consume(); WriteNote(1); } + if (k == Control.LANE2.getKey()) { e.consume(); WriteNote(2); } + if (k == Control.LANE3.getKey()) { e.consume(); WriteNote(3); } + if (k == Control.LANE4.getKey()) { e.consume(); WriteNote(4); } + if (k == Control.NOTE_DOWN.getKey()) { e.consume(); MoveNoteDown(); } + if (k == Control.NOTE_UP.getKey()) { e.consume(); MoveNoteUp(); } + if (k == Control.DELETE_NOTE.getKey()) { e.consume(); delNote.fire(); } + if (k == Control.CLEAR_SELECTION.getKey()) { e.consume(); clearSelect.fire(); } + if (k == Control.SCROLL_LOCK.getKey()) { e.consume(); scrollLock.fire(); } + if (k == Control.PLAY_PAUSE.getKey()) { e.consume(); play.fire(); } + if (k == Control.SELECT_ALL.getKey()) { e.consume(); selectAll.fire(); } + if (k == Control.SELECT_MULTIPLE.getKey()) { e.consume(); selectMultiple.fire(); } + }); + content.addEventFilter(KeyEvent.KEY_RELEASED, e -> { + KeyCode k = e.getCode(); + if (k == Control.SELECT_MULTIPLE.getKey()) { e.consume(); selectMultiple.fire(); } }); - m.currentTimeProperty().addListener(_ -> { - // TODO - playhead.layoutYProperty().bind(secondToScreenPos(m.getCurrentTime().toSeconds())); + m.currentTimeProperty().addListener((_ ,oldValue ,newValue) -> { + var diffr = newValue.toSeconds() - oldValue.toSeconds(); + TranslateTransition anim = new TranslateTransition(Duration.seconds(0.09), playhead); + anim.byYProperty().bind(secondToScreenPos(diffr)); + anim.setInterpolator(Interpolator.LINEAR); + anim.play(); }); play.setOnAction(_ -> { @@ -271,7 +293,7 @@ public class NotesEditor2 extends Page { Sound.playSfx(Sound.FORWARD); 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(scrollContent.heightProperty().subtract(scroll.heightProperty()))); + scroll.vvalueProperty().bind(playhead.translateYProperty().subtract(scroll.heightProperty().divide(2)).divide(scrollContent.heightProperty().subtract(scroll.heightProperty()))); } else { scroll.vvalueProperty().unbind(); @@ -287,25 +309,25 @@ public class NotesEditor2 extends Page { delNote.setOnAction(_ -> { Sound.playSfx(Sound.FORWARD); - activeNotes.forEach(e -> { + selectedNotes.forEach(e -> { noteList.remove(e.note); }); - activeNotes.clear(); + selectedNotes.clear(); }); clearSelect.setOnAction(_ -> { Sound.playSfx(Sound.FORWARD); - activeNotes.forEach(e -> e.setFill(e.color)); - activeNotes.clear(); +// selectedNotes.forEach(e -> e.setStroke(Color.TRANSPARENT)); + selectedNotes.clear(); }); selectAll.setOnAction(_ -> { Sound.playSfx(Sound.FORWARD); - activeNotes.clear(); + selectedNotes.clear(); for (Pane lane : lanes) { - lane.getChildren().forEach(e -> activeNotes.add((Block) e)); + lane.getChildren().forEach(e -> selectedNotes.add((Block) e)); } - activeNotes.forEach(e -> e.setFill(Color.WHITE)); +// selectedNotes.forEach(e -> e.setStroke(Color.WHITE)); }); Pane addHelp = addHelp(); @@ -341,7 +363,7 @@ public class NotesEditor2 extends Page { setEnd.setOnAction(_ -> { Sound.playSfx(Sound.FORWARD); - double tmp = screenPosToSecond(playhead.getLayoutY()); + double tmp = screenPosToSecond(playhead.getTranslateY()); if (Math.round(tmp*10)/10 == Math.round(m.getTotalDuration().toSeconds() * 10)/10) { newEndTime.set(0); } @@ -350,12 +372,11 @@ public class NotesEditor2 extends Page { } }); - activeNotes.addListener((_, _, _) -> { - if (activeNotes.isEmpty()) { - selectionLabel.setText("Selection"); - } - else { - selectionLabel.setText("Selection (" + activeNotes.size() + ")"); + selectedNotes.addListener((ListChangeListener<? super Block>) (arg) -> { + selectionLabel.setText("Selection (" + selectedNotes.size() + ")"); + while (arg.next()) { + arg.getAddedSubList().forEach(n -> n.setStroke(Color.WHITE)); + arg.getRemoved().forEach(n -> n.setStroke(Color.TRANSPARENT)); } }); } @@ -381,21 +402,27 @@ public class NotesEditor2 extends Page { 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)); + Block b = new Block(color, false, n); + var sizeBind = scroll.widthProperty().divide(8); + b.heightProperty().bind(sizeBind); + b.widthProperty().bind(sizeBind); + var arcBind = scroll.widthProperty().divide(30); + b.arcHeightProperty().bind(arcBind); + b.arcWidthProperty().bind(arcBind); 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); + if (selectedNotes.contains(b)) { + selectedNotes.remove(b); +// b.setStroke(Color.TRANSPARENT); } else { - activeNotes.add(b); - b.setFill(Color.WHITE); + if (!selectMultiple.isSelected()) { +// selectedNotes.forEach(e -> e.setStroke(Color.TRANSPARENT)); + selectedNotes.clear(); + } + selectedNotes.add(b); +// b.setStroke(Color.WHITE); } }); return b; @@ -429,26 +456,26 @@ public class NotesEditor2 extends Page { } private void WriteNote(int col) { - Note tmp = new Note(screenPosToSecond(playhead.getLayoutY()), col); + Note tmp = new Note(screenPosToSecond(playhead.getTranslateY()), col); noteList.add(tmp); } private void MoveNoteUp() { - activeNotes.forEach(n -> n.note.time.setValue(n.note.time.get() - 0.01)); + selectedNotes.forEach(n -> n.note.time.setValue(n.note.time.get() - 0.01)); } private void MoveNoteDown() { - activeNotes.forEach(n -> n.note.time.setValue(n.note.time.get() + 0.01)); + selectedNotes.forEach(n -> n.note.time.setValue(n.note.time.get() + 0.01)); } private Pane addHelp() { Label l1 = new Label("Use the following keys"); HBox hb = new HBox( - new Target(diff.level.colors[0], 40, 40, 10, Control.LANE0.targetString()), - new Target(diff.level.colors[1], 40, 40, 10, Control.LANE1.targetString()), - new Target(diff.level.colors[2], 40, 40, 10, Control.LANE2.targetString()), - new Target(diff.level.colors[3], 40, 40, 10, Control.LANE3.targetString()), - new Target(diff.level.colors[4], 40, 40, 10, Control.LANE4.targetString()) + createTarget(diff.level.colors[0], Control.LANE0), + createTarget(diff.level.colors[1], Control.LANE1), + createTarget(diff.level.colors[2], Control.LANE2), + createTarget(diff.level.colors[3], Control.LANE3), + createTarget(diff.level.colors[4], Control.LANE4) ); hb.setSpacing(10); hb.setAlignment(Pos.CENTER_LEFT); @@ -462,7 +489,12 @@ public class NotesEditor2 extends Page { private Pane moveHelp() { Label l1 = new Label("Use the"); - HBox hb = new HBox(new Target(Color.BLACK, 40, 40, 10, Control.NOTE_UP.targetString()), new Label("and"), new Target(Color.BLACK, 40, 40, 10, Control.NOTE_DOWN.targetString()), new Label("keys")); + HBox hb = new HBox( + createTarget(Color.BLACK, Control.NOTE_UP), + new Label("and"), + createTarget(Color.BLACK, Control.NOTE_DOWN), + new Label("keys") + ); hb.setSpacing(10); hb.setAlignment(Pos.CENTER_LEFT); Label l2 = new Label("to move the selected \nnote(s) up and down."); @@ -473,4 +505,14 @@ public class NotesEditor2 extends Page { ret.setLayoutY(120); return ret; } + + private Target createTarget(Color color, Control control) { + Target target = new Target(color, control.targetString()); + target.rect.setWidth(40); + target.rect.setHeight(40); + target.rect.setArcHeight(5); + target.rect.setArcWidth(5); + target.rect.setStrokeWidth(3); + return target; + } } |