diff options
Diffstat (limited to 'src/main/java/net/sowgro')
8 files changed, 130 insertions, 100 deletions
diff --git a/src/main/java/net/sowgro/npehero/editor/DiffEditor.java b/src/main/java/net/sowgro/npehero/editor/DiffEditor.java index d3ecdc4..9a4365d 100755 --- a/src/main/java/net/sowgro/npehero/editor/DiffEditor.java +++ b/src/main/java/net/sowgro/npehero/editor/DiffEditor.java @@ -171,11 +171,13 @@ public class DiffEditor extends Page // Duplicates of NotesEditor2 methods, should be made generic and combined 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))); return b; diff --git a/src/main/java/net/sowgro/npehero/editor/DiffList.java b/src/main/java/net/sowgro/npehero/editor/DiffList.java index 7106609..acda994 100755 --- a/src/main/java/net/sowgro/npehero/editor/DiffList.java +++ b/src/main/java/net/sowgro/npehero/editor/DiffList.java @@ -36,7 +36,7 @@ public class DiffList extends Page TableColumn<Difficulty,String> titleCol = new TableColumn<>("Name"); TableColumn<Difficulty,String> validCol = new TableColumn<>("Valid?"); - titleCol.prefWidthProperty().bind(diffs.widthProperty().multiply(0.4)); + titleCol.prefWidthProperty().bind(diffs.widthProperty().multiply(0.5)); validCol.prefWidthProperty().bind(diffs.widthProperty().multiply(0.4)); diffs.getColumns().add(titleCol); 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; + } } diff --git a/src/main/java/net/sowgro/npehero/gameplay/Block.java b/src/main/java/net/sowgro/npehero/gameplay/Block.java index 9d68ab6..5d35ccc 100755 --- a/src/main/java/net/sowgro/npehero/gameplay/Block.java +++ b/src/main/java/net/sowgro/npehero/gameplay/Block.java @@ -16,24 +16,20 @@ public class Block extends Rectangle public Color color; public Note note; - public Block(Color color, double width, double height, int cornerRadius, boolean useDropShadow, Note note) + public Block(Color color, boolean useDropShadow, Note note) { this.note = note; this.color = color; super.setFill(color); - super.setWidth(width); - super.setHeight(height); - super.setArcHeight(cornerRadius); - super.setArcWidth(cornerRadius); if (useDropShadow) { enableDropShadow(); } } - public Block(Color color, double width, double height, int cornerRadius) { - this(color, width, height, cornerRadius, true, null); + public Block(Color color, Note note) { + this(color, true, note); } public void enableDropShadow() { diff --git a/src/main/java/net/sowgro/npehero/gameplay/SongPlayer.java b/src/main/java/net/sowgro/npehero/gameplay/SongPlayer.java index 91a3ecc..f3abf91 100755 --- a/src/main/java/net/sowgro/npehero/gameplay/SongPlayer.java +++ b/src/main/java/net/sowgro/npehero/gameplay/SongPlayer.java @@ -60,7 +60,7 @@ public class SongPlayer extends HBox { // create targets for (int i = 0; i < lanes.length; i++) { lanes[i] = new Lane(); - var tmp = new Target(level.colors[i], 50, 50, 20, Control.lanes[i].targetString()); + var tmp = new Target(level.colors[i], Control.lanes[i].targetString()); bindTarget(tmp); lanes[i].target = tmp; } @@ -79,7 +79,7 @@ public class SongPlayer extends HBox { } })); // schedule the game over screen to show at the end - timeline.getKeyFrames().add(new KeyFrame(Duration.seconds(songLength + START_DELAY), _ -> { + timeline.getKeyFrames().add(new KeyFrame(Duration.seconds(songLength + FALL_TIME + START_DELAY), _ -> { Driver.setMenu(new GameOver(level, diff, prev, scoreCounter.getScore())); cancel(); })); @@ -125,7 +125,7 @@ public class SongPlayer extends HBox { public void sendNote(Note note) { Lane lane = lanes[note.lane]; - Block block = new Block(lane.target.getColor(), 50, 50, 15); + Block block = new Block(lane.target.getColor(), note); block.setCache(true); block.setCacheHint(CacheHint.SPEED); block.xProperty().bind(lane.pane.widthProperty().subtract(block.widthProperty()).divide(2)); @@ -136,7 +136,7 @@ public class SongPlayer extends HBox { TranslateTransition anim = new TranslateTransition(Duration.seconds(FALL_TIME + 0.105)); anim.setInterpolator(Interpolator.LINEAR); - anim.byYProperty().bind(super.heightProperty().add(block.getHeight()).add(75)); + anim.byYProperty().bind(lane.pane.heightProperty().add(block.getHeight()).add(75)); anim.setNode(block); anim.play(); anim.setOnFinished(_ -> { @@ -157,7 +157,7 @@ public class SongPlayer extends HBox { */ private void bindTarget(Target target) { bindBlock(target.rect); -// target.rect.strokeWidthProperty().bind(super.widthProperty().divide(120)); + target.rect.strokeWidthProperty().bind(super.heightProperty().multiply(4/1080.0)); } private void bindBlock(Rectangle block) { diff --git a/src/main/java/net/sowgro/npehero/gameplay/Target.java b/src/main/java/net/sowgro/npehero/gameplay/Target.java index 45907d3..9f2b4ea 100755 --- a/src/main/java/net/sowgro/npehero/gameplay/Target.java +++ b/src/main/java/net/sowgro/npehero/gameplay/Target.java @@ -9,37 +9,26 @@ import javafx.scene.text.Text; public class Target extends StackPane { - private Color col; - private Color fill; - private Text label; + private final Color col; + private final Color fill; public Rectangle rect = new Rectangle(); - public Target(Color c, double a, double b, int r, String key) + + public Target(Color c, String key) { - label = new Text(key); + Text label = new Text(key); label.getStyleClass().add("t3"); label.scaleXProperty().bind(super.widthProperty().divide(50)); label.scaleYProperty().bind(label.scaleXProperty()); - super.getChildren().addAll(rect,label); + super.getChildren().addAll(rect, label); col = c; fill = new Color(c.darker().getRed(), c.darker().getGreen(), c.darker().getBlue(), 0.45); rect.setFill(fill); - rect.setWidth(a); - rect.setHeight(b); - rect.setArcHeight(r); - rect.setArcWidth(r); rect.setStroke(col); rect.setStrokeWidth(4); } - public void setColor(Color c) { - col = c; - fill = new Color(c.darker().getRed(), c.darker().getGreen(), c.darker().getBlue(), 0.45); - rect.setFill(fill); - rect.setStroke(c); - } - public Color getFillColor() { return fill; } diff --git a/src/main/java/net/sowgro/npehero/gui/LeaderboardView.java b/src/main/java/net/sowgro/npehero/gui/LeaderboardView.java index 9176d76..c22773e 100755 --- a/src/main/java/net/sowgro/npehero/gui/LeaderboardView.java +++ b/src/main/java/net/sowgro/npehero/gui/LeaderboardView.java @@ -16,7 +16,7 @@ import net.sowgro.npehero.main.*; public class LeaderboardView extends Page { - private HBox content = new HBox(); + private final HBox content = new HBox(); public LeaderboardView(Difficulty diff, Page prev) { @@ -46,12 +46,12 @@ public class LeaderboardView extends Page scores.prefWidthProperty().bind(content.prefWidthProperty().multiply(0.30)); scores.prefHeightProperty().bind(content.prefHeightProperty().multiply(0.75)); - scoreCol.setSortType(SortType.DESCENDING); + scoreCol.setSortType(SortType.ASCENDING); scores.getSortOrder().add(scoreCol); Button exit = new Button(); exit.setText("Back"); - exit.setOnAction(e -> { + exit.setOnAction(_ -> { Sound.playSfx(Sound.BACKWARD); Driver.setMenu(prev); }); diff --git a/src/main/java/net/sowgro/npehero/main/Control.java b/src/main/java/net/sowgro/npehero/main/Control.java index 69bf669..bb9710a 100644 --- a/src/main/java/net/sowgro/npehero/main/Control.java +++ b/src/main/java/net/sowgro/npehero/main/Control.java @@ -25,12 +25,13 @@ public enum Control { PLAY_PAUSE ("Play / Pause", KeyCode.P), CLEAR_SELECTION ("Clear Selection", KeyCode.ESCAPE), SELECT_ALL ("Select All", KeyCode.S), + SELECT_MULTIPLE ("Select Multiple (Hold)", KeyCode.CONTROL), LEGACY_PRINT ("Print Time", KeyCode.Q), LEGACY_STOP ("Stop Edit", KeyCode.ESCAPE); public static final List<Map.Entry<String, List<Control>>> sections = List.of( entry("Gameplay", List.of(LANE0, LANE1, LANE2, LANE3, LANE4)), - entry("Editor", List.of(DELETE_NOTE, NOTE_UP, NOTE_DOWN, SCROLL_LOCK, PLAY_PAUSE, CLEAR_SELECTION, SELECT_ALL)), + entry("Editor", List.of(DELETE_NOTE, NOTE_UP, NOTE_DOWN, SCROLL_LOCK, PLAY_PAUSE, CLEAR_SELECTION, SELECT_ALL, SELECT_MULTIPLE)), entry("Legacy Editor", List.of(LEGACY_PRINT, LEGACY_STOP)) ); |