diff options
| author | sowgro <tpoke.ferrari@gmail.com> | 2024-07-16 01:23:01 -0400 | 
|---|---|---|
| committer | sowgro <tpoke.ferrari@gmail.com> | 2024-07-16 01:23:01 -0400 | 
| commit | d8b8d88e97cfd732ea0e81847762e93412377dd9 (patch) | |
| tree | 018b4a1c8636b7d49af2e69d8b943680de21831d /src/main | |
| parent | 2d42d77c883453e4f03ca0a47068f9d1f6c61aa6 (diff) | |
| download | NPEhero-d8b8d88e97cfd732ea0e81847762e93412377dd9.tar.gz NPEhero-d8b8d88e97cfd732ea0e81847762e93412377dd9.tar.bz2 NPEhero-d8b8d88e97cfd732ea0e81847762e93412377dd9.zip | |
Add customizable keybindings
Diffstat (limited to 'src/main')
10 files changed, 308 insertions, 110 deletions
| diff --git a/src/main/java/net/sowgro/npehero/Driver.java b/src/main/java/net/sowgro/npehero/Driver.java index 6d23390..2a1bdc3 100755 --- a/src/main/java/net/sowgro/npehero/Driver.java +++ b/src/main/java/net/sowgro/npehero/Driver.java @@ -1,7 +1,6 @@  package net.sowgro.npehero;  import javafx.application.Application; -import javafx.application.Platform;  import javafx.geometry.Side;  import javafx.scene.Scene;  import javafx.scene.control.ScrollPane; @@ -16,6 +15,7 @@ import javafx.scene.layout.BackgroundRepeat;  import javafx.scene.layout.BackgroundSize;  import javafx.scene.layout.Pane;  import javafx.stage.Stage; +import net.sowgro.npehero.main.Control;  import net.sowgro.npehero.gui.MainMenu;  import net.sowgro.npehero.main.LevelController;  import net.sowgro.npehero.main.SettingsController; @@ -46,6 +46,7 @@ public class Driver extends Application      {          SettingsController.read();          LevelController.readData(); +        Control.readFromFile();          primaryStage = newPrimaryStage; diff --git a/src/main/java/net/sowgro/npehero/devmenu/DebugMenu.java b/src/main/java/net/sowgro/npehero/devmenu/DebugMenu.java deleted file mode 100755 index aecd438..0000000 --- a/src/main/java/net/sowgro/npehero/devmenu/DebugMenu.java +++ /dev/null @@ -1,41 +0,0 @@ -package net.sowgro.npehero.devmenu; - -import net.sowgro.npehero.Driver; -import javafx.scene.Scene; -import javafx.scene.control.Button; -import javafx.scene.layout.VBox; -import javafx.stage.Stage; - -public class DebugMenu  -{ -    public Stage primaryStage = new Stage(); - -    /* -     * 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. -     */ -    VBox primaryPane = new VBox(); -    public DebugMenu() -    { -        Button testVol = new Button(); -        testVol.setText("print volumes"); -        testVol.setOnAction(e -> System.out.println("setc:"+Driver.settingsController.effectsVol+" sndc:"+Driver.soundController.songMediaPlayer.getVolume())); - -        primaryPane.getChildren().addAll(testVol); -         -        Scene primaryScene = new Scene(primaryPane); -        primaryStage.setScene(primaryScene); -        primaryStage.setTitle("debug"); -    } - -    public void show() -    { -        primaryStage.show(); -    } - -    public void addButton(Button b) -    { -        primaryPane.getChildren().add(b); -    } -} diff --git a/src/main/java/net/sowgro/npehero/devmenu/NotesEditor.java b/src/main/java/net/sowgro/npehero/devmenu/NotesEditor.java index 7e78701..985b2d0 100755 --- a/src/main/java/net/sowgro/npehero/devmenu/NotesEditor.java +++ b/src/main/java/net/sowgro/npehero/devmenu/NotesEditor.java @@ -5,6 +5,7 @@ import java.io.PrintWriter;  import java.io.UnsupportedEncodingException;  import javafx.geometry.Pos; +import javafx.scene.input.KeyEvent;  import javafx.scene.layout.HBox;  import javafx.scene.layout.Pane;  import javafx.scene.media.Media; @@ -12,9 +13,9 @@ import net.sowgro.npehero.gameplay.Timer;  import net.sowgro.npehero.Driver;  import javafx.scene.Scene;  import javafx.scene.control.Button; -import javafx.scene.input.KeyCode;  import javafx.scene.layout.VBox;  import javafx.scene.text.Text; +import net.sowgro.npehero.main.Control;  import net.sowgro.npehero.main.Difficulty;  import net.sowgro.npehero.main.SoundController; @@ -22,7 +23,7 @@ public class NotesEditor extends Pane  {      Text help;      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"; +    String t2 = "Now recording. Press Stop or " + Control.LEGACY_STOP.getKey().toString() + " to finish";      Difficulty diff;      Timer timer;      PrintWriter writer; @@ -68,31 +69,32 @@ public class NotesEditor extends Pane          writer = new PrintWriter(diff.notes.getFile(), "UTF-8");          Scene scene = Driver.primaryStage.getScene(); -        scene.setOnKeyPressed(e -> { -			if (e.getCode() == KeyCode.D) { +        scene.addEventFilter(KeyEvent.KEY_PRESSED, e -> { +			if (e.getCode() == Control.LANE0.getKey()) {  				writer.println("d"+timer);                  cur.setText("d"+timer);  			} -			if (e.getCode() == KeyCode.F) { +			if (e.getCode() == Control.LANE1.getKey()) {  				writer.println("f"+timer);                  cur.setText("f"+timer);  			} -			if (e.getCode() == KeyCode.SPACE) { +			if (e.getCode() == Control.LANE2.getKey()) {  				writer.println("s"+timer);                  cur.setText("s"+timer);  			} -			if (e.getCode() == KeyCode.J) { +			if (e.getCode() == Control.LANE3.getKey()) {  				writer.println("j"+timer);                  cur.setText("j"+timer);  			} -			if (e.getCode() == KeyCode.K) { +			if (e.getCode() == Control.LANE4.getKey()) {  				writer.println("k"+timer);                  cur.setText("k"+timer);  			} -            if (e.getCode() == KeyCode.ESCAPE) +            if (e.getCode() == Control.LEGACY_STOP.getKey())              {                  stop();              } +            e.consume();  		});          Driver.primaryStage.setOnCloseRequest(e -> stop()); diff --git a/src/main/java/net/sowgro/npehero/devmenu/NotesEditor2.java b/src/main/java/net/sowgro/npehero/devmenu/NotesEditor2.java index 99aacec..cd76801 100644 --- a/src/main/java/net/sowgro/npehero/devmenu/NotesEditor2.java +++ b/src/main/java/net/sowgro/npehero/devmenu/NotesEditor2.java @@ -8,6 +8,8 @@ import javafx.collections.ListChangeListener;  import javafx.geometry.Insets;  import javafx.geometry.Pos;  import javafx.scene.control.*; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyEvent;  import javafx.scene.layout.HBox;  import javafx.scene.layout.Pane;  import javafx.scene.layout.StackPane; @@ -24,6 +26,7 @@ import net.sowgro.npehero.gameplay.Target;  import net.sowgro.npehero.main.Difficulty;  import net.sowgro.npehero.main.Note;  import net.sowgro.npehero.main.SoundController; +import net.sowgro.npehero.main.Control;  import java.util.concurrent.atomic.AtomicInteger; @@ -146,6 +149,7 @@ public class NotesEditor2 extends Pane {          save.setText("Done");          save.setOnAction(_ -> {              diff.notes.list = noteList; +            diff.notes.writeFile();              m.stop();              SoundController.playSfx(SoundController.BACKWARD);              Driver.setMenu(new DiffEditor(diff, prev.prev)); @@ -192,18 +196,21 @@ public class NotesEditor2 extends Pane {          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(); -            }; +        rootBox.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();          });          m.currentTimeProperty().addListener(_ -> { @@ -343,14 +350,22 @@ public class NotesEditor2 extends Pane {          noteList.add(tmp);      } +    private void MoveNoteUp() { +        activeNotes.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)); +    } +      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') +                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())          );          hb.setSpacing(10);          hb.setAlignment(Pos.CENTER_LEFT); @@ -364,7 +379,7 @@ public class NotesEditor2 extends Pane {      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")); +        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"));          hb.setSpacing(10);          hb.setAlignment(Pos.CENTER_LEFT);          Label l2 = new Label("to move the selected \nnote(s) up and down."); diff --git a/src/main/java/net/sowgro/npehero/gameplay/SongPlayer.java b/src/main/java/net/sowgro/npehero/gameplay/SongPlayer.java index d4fbbbf..dc74b30 100755 --- a/src/main/java/net/sowgro/npehero/gameplay/SongPlayer.java +++ b/src/main/java/net/sowgro/npehero/gameplay/SongPlayer.java @@ -10,12 +10,13 @@ import java.util.Queue;  import javax.sound.sampled.LineUnavailableException;  import javax.sound.sampled.UnsupportedAudioFileException; +import javafx.scene.input.KeyEvent;  import javafx.scene.media.Media;  import net.sowgro.npehero.Driver; +import net.sowgro.npehero.main.Control;  import net.sowgro.npehero.gui.GameOver;  import javafx.geometry.Pos;  import javafx.scene.CacheHint; -import javafx.scene.input.KeyCode;  import javafx.scene.layout.HBox;  import javafx.scene.layout.Pane;  import javafx.scene.layout.StackPane; @@ -62,23 +63,23 @@ public class SongPlayer extends Pane {  	HBox buttonBox = new HBox();	//used to align the buttons horizontally  	VBox place = new VBox();		//used to place the buttons within the frame -	Target dButton = new Target(Color.RED, 50, 50, 5, 'd');	//Initializes the button, each parameter is a placeholder that is changed later +	Target dButton = new Target(Color.RED, 50, 50, 5, Control.LANE0.targetString());	//Initializes the button, each parameter is a placeholder that is changed later  	Queue<NoteInfo> dSends = new LinkedList<NoteInfo>(); 		//Queue that dictates when to send the notes  	ArrayList<Block> dLane = new ArrayList<Block>(); 			//Array list containing all the notes currently on the field for that lane  																//process is repeated for the following four buttons -	Target fButton = new Target(Color.BLUE, 50, 50, 5, 'f'); +	Target fButton = new Target(Color.BLUE, 50, 50, 5, Control.LANE1.targetString());  	Queue<NoteInfo> fSends = new LinkedList<NoteInfo>();  	ArrayList<Block> fLane = new ArrayList<Block>(); -	Target sButton = new Target(Color.GREEN, 50, 50, 5, '_'); +	Target sButton = new Target(Color.GREEN, 50, 50, 5, Control.LANE2.targetString());  	Queue<NoteInfo> spaceSends = new LinkedList<NoteInfo>();  	ArrayList<Block> spaceLane = new ArrayList<Block>(); -	Target jButton = new Target(Color.PURPLE, 50, 50, 5, 'j'); +	Target jButton = new Target(Color.PURPLE, 50, 50, 5, Control.LANE3.targetString());  	Queue<NoteInfo> jSends = new LinkedList<NoteInfo>();  	ArrayList<Block> jLane = new ArrayList<Block>(); -	Target kButton = new Target(Color.YELLOW, 50, 50, 5, 'k'); +	Target kButton = new Target(Color.YELLOW, 50, 50, 5, Control.LANE4.targetString());  	Queue<NoteInfo> kSends = new LinkedList<NoteInfo>();  	ArrayList<Block> kLane = new ArrayList<Block>(); @@ -132,34 +133,35 @@ public class SongPlayer extends Pane {  		genButton(sButton);  		genButton(jButton);  		genButton(kButton); -		 -		Driver.primaryStage.getScene().setOnKeyPressed(e -> { + +		Driver.primaryStage.addEventFilter(KeyEvent.KEY_PRESSED, e -> {  			/**  			 * The keyboard detection for the game: when a key is pressed it  			 * calls the checkNote() method for the corresponding lane  			 */ -			//System.out.println(timer.time()); -			if (super.isVisible()) -			{ -				if (e.getCode() == KeyCode.D) { +			System.out.println(e.getCode()); +//			if (super.isVisible()) +//			{ +				if (e.getCode() == Control.LANE0.getKey()) {  					checkNote(dLane, dButton);  				} -				if (e.getCode() == KeyCode.F) { +				if (e.getCode() == Control.LANE1.getKey()) {  					checkNote(fLane, fButton);  				} -				if (e.getCode() == KeyCode.G) { +				if (e.getCode() == Control.LANE2.getKey()) {  					checkNote(spaceLane, sButton);  				} -				if (e.getCode() == KeyCode.J) { +				if (e.getCode() == Control.LANE3.getKey()) {  					checkNote(jLane, jButton);  				} -				if (e.getCode() == KeyCode.K) { +				if (e.getCode() == Control.LANE4.getKey()) {  					checkNote(kLane, kButton);  				} -				if (e.getCode() == KeyCode.Q) { +				if (e.getCode() == Control.LEGACY_PRINT.getKey()) {  					System.out.println("" + timer.time());  				} -			} +//			} +			e.consume();  			//prints the user's current score and combo, for debugging purposes  			//System.out.println("Score: " + scoreCounter.getScore() + "\nCombo: " + scoreCounter.getCombo() + "\n");  		}); diff --git a/src/main/java/net/sowgro/npehero/gameplay/Target.java b/src/main/java/net/sowgro/npehero/gameplay/Target.java index 3dc8564..229abcb 100755 --- a/src/main/java/net/sowgro/npehero/gameplay/Target.java +++ b/src/main/java/net/sowgro/npehero/gameplay/Target.java @@ -13,9 +13,9 @@ public class Target extends StackPane      private Color fill;      private Text label;      public Rectangle rect = new Rectangle(); -    public Target(Color c, double a, double b, int r, char key) +    public Target(Color c, double a, double b, int r, String key)      { -        label = new Text(key+""); +        label = new Text(key);          label.getStyleClass().add("t3");          label.scaleXProperty().bind(super.widthProperty().divide(50));          label.scaleYProperty().bind(label.scaleXProperty()); diff --git a/src/main/java/net/sowgro/npehero/gui/ControlEditor.java b/src/main/java/net/sowgro/npehero/gui/ControlEditor.java new file mode 100644 index 0000000..637a9d8 --- /dev/null +++ b/src/main/java/net/sowgro/npehero/gui/ControlEditor.java @@ -0,0 +1,117 @@ +package net.sowgro.npehero.gui; + +import javafx.beans.property.ReadOnlyObjectWrapper; +import javafx.beans.property.ReadOnlyStringWrapper; +import javafx.event.EventHandler; +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.control.*; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyEvent; +import javafx.scene.input.MouseEvent; +import javafx.scene.layout.GridPane; +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.Control; +import net.sowgro.npehero.main.SoundController; +import org.w3c.dom.events.Event; + +public class ControlEditor extends Pane { +    public ControlEditor() { + +        GridPane controls = new GridPane(); +        ScrollPane scrollPane = new ScrollPane(controls); +        scrollPane.getStyleClass().remove("scroll-pane"); +        scrollPane.getStyleClass().add("box"); +        scrollPane.setPadding(new Insets(10)); +        controls.setPadding(new Insets(10)); +        controls.setHgap(40); +        controls.setVgap(20); + + +        scrollPane.prefWidthProperty().bind(super.prefWidthProperty().multiply(0.35)); +        scrollPane.setMinWidth(400); +        scrollPane.prefHeightProperty().bind(super.prefHeightProperty().multiply(0.75)); + +        Button exit = new Button(); +        exit.setText("Back"); +        exit.setOnAction(e -> { +            SoundController.playSfx(SoundController.BACKWARD); +            Driver.setMenu(new Settings()); +        }); + +        VBox centerBox = new VBox(); +        centerBox.setAlignment(Pos.CENTER); +        centerBox.setSpacing(10); +        centerBox.getChildren().addAll(scrollPane,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); + +        ToggleGroup tg = new ToggleGroup(); +        for (int i = 0; i < Control.values().length; i++) { +            Control control = Control.values()[i]; + + +            // label +            Label label = new Label(control.label); +            controls.add(label, 0, i); + +            // control button +            ToggleButton controlButton = new ToggleButton("<err>"); +            controlButton.setText(keyToString(control.keyProperty.get())); +            control.keyProperty.addListener(_ -> { +                System.out.println(control.label + " set to " + control.keyProperty.get()); +                System.out.println(controlButton.getText()); +                controlButton.setText(keyToString(control.keyProperty.get())); +                net.sowgro.npehero.main.Control.writeToFile(); +            }); +            controlButton.setOnMouseClicked(_ -> { +                EventHandler<KeyEvent> keyListener = new EventHandler<>() { +                    @Override +                    public void handle(KeyEvent k) { +                        control.keyProperty.set(k.getCode()); +                        rootBox.removeEventFilter(KeyEvent.KEY_PRESSED, this); +                        controlButton.setSelected(false); +                        k.consume(); +                    } +                }; +                if (controlButton.isSelected()) { +                    System.out.println("Event registered"); +                    rootBox.addEventFilter(KeyEvent.KEY_PRESSED, keyListener); +                } +                else { +                    System.out.println("Event un-registered"); +                    rootBox.removeEventFilter(KeyEvent.KEY_PRESSED, keyListener); +                } +            }); +            tg.getToggles().add(controlButton); +            controls.add(controlButton, 1, i); + +            // label button +            Button resetButton = new Button("Reset"); +            resetButton.setOnMouseClicked(_ -> { +                control.keyProperty.set(control.defaultKey); +            }); +            controls.add(resetButton, 2, i); + +        } + +        super.getChildren().add(rootBox); +    } + +    public String keyToString(KeyCode key) { +        if (key == null) { +            return "<unset>"; +        } +        else { +            return key.toString(); +        } +    } +} diff --git a/src/main/java/net/sowgro/npehero/gui/Settings.java b/src/main/java/net/sowgro/npehero/gui/Settings.java index 8d345a0..cc6815c 100755 --- a/src/main/java/net/sowgro/npehero/gui/Settings.java +++ b/src/main/java/net/sowgro/npehero/gui/Settings.java @@ -4,7 +4,6 @@ import javafx.geometry.Insets;  import javafx.geometry.Pos;  import javafx.scene.control.Button;  import javafx.scene.control.Slider; -import javafx.scene.control.ToggleButton;  import javafx.scene.layout.BorderPane;  import javafx.scene.layout.HBox;  import javafx.scene.layout.Pane; @@ -70,26 +69,20 @@ public class Settings extends Pane          fullBox.setPadding(new Insets(10)); -        Text devLabel = new Text("Advanced"); -        devLabel.getStyleClass().add("t3"); +        Text controlsLabel = new Text("Key Bindings"); +        controlsLabel.getStyleClass().add("t3"); -        Button devMenu = new Button(); -        devMenu.setText("Debug Menu"); -        devMenu.setOnAction(e -> { +        Button controlsButton = new Button(); +        controlsButton.setText("Edit"); +        controlsButton.setOnAction(_ -> {              SoundController.playSfx(SoundController.FORWARD); -//            Driver.debug.show(); +            Driver.setMenu(new ControlEditor());          }); -        VBox devBox = new VBox(); -        devBox.getStyleClass().add("box"); -        devBox.getChildren().addAll(devLabel,devMenu); -        devBox.setVisible(false); -        devBox.setManaged(false); -        devBox.setPadding(new Insets(10)); - -        ToggleButton advanced = new ToggleButton("Advanced"); -        advanced.selectedProperty().bindBidirectional(devBox.managedProperty()); -        advanced.selectedProperty().bindBidirectional(devBox.visibleProperty()); +        VBox controlsBox = new VBox(); +        controlsBox.getStyleClass().add("box"); +        controlsBox.getChildren().addAll(controlsLabel, controlsButton); +        controlsBox.setPadding(new Insets(10));          Button exit = new Button();          exit.setText("Back"); @@ -101,13 +94,11 @@ public class Settings extends Pane          BorderPane buttonBox = new BorderPane();          buttonBox.setLeft(exit); -        buttonBox.setRight(advanced); -          VBox options = new VBox();          options.setSpacing(10);          options.setAlignment(Pos.CENTER); -        options.getChildren().addAll(musicBox,SFXBox,fullBox,devBox,buttonBox); +        options.getChildren().addAll(musicBox,SFXBox,fullBox,controlsBox,buttonBox);          options.maxWidthProperty().bind(super.prefWidthProperty().multiply(0.25));           options.setMinWidth(400);          options.prefHeightProperty().bind(super.prefHeightProperty()); @@ -120,3 +111,4 @@ public class Settings extends Pane          super.getChildren().add(rootBox);      }  } + diff --git a/src/main/java/net/sowgro/npehero/main/Control.java b/src/main/java/net/sowgro/npehero/main/Control.java new file mode 100644 index 0000000..7bbcfb1 --- /dev/null +++ b/src/main/java/net/sowgro/npehero/main/Control.java @@ -0,0 +1,108 @@ +package net.sowgro.npehero.main; + +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleObjectProperty; +import javafx.scene.input.KeyCode; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; + +import java.io.*; + +public enum Control { + +    LANE0           ("Lane 0", KeyCode.D), +    LANE1           ("Lane 1", KeyCode.F), +    LANE2           ("Lane 2", KeyCode.SPACE), +    LANE3           ("Lane 3", KeyCode.J), +    LANE4           ("Lane 4", KeyCode.K), +    DELETE_NOTE     ("Delete note", KeyCode.DELETE), +    NOTE_UP         ("Move note up", KeyCode.EQUALS), +    NOTE_DOWN       ("Move note down", KeyCode.MINUS), +    SCROLL_LOCK     ("Scroll lock", KeyCode.L), +    PLAY_PAUSE      ("Play / Pause", KeyCode.P), +    CLEAR_SELECTION ("Clear selection", KeyCode.ESCAPE), +    SELECT_ALL      ("Select All", KeyCode.S), +    LEGACY_PRINT    ("Print time (Legacy)", KeyCode.Q), +    LEGACY_STOP     ("Stop edit (Legacy)", KeyCode.ESCAPE); + +    public final String label; +    public final KeyCode defaultKey; +    public final ObjectProperty<KeyCode> keyProperty = new SimpleObjectProperty<>(); + +    private static final String fileName = "controls.json"; + +    Control(String label, KeyCode key) { +        this.label = label; +        this.defaultKey = key; +        this.keyProperty.set(key); +    } + +    public KeyCode getKey() { +        return keyProperty.get(); +    } + +    public void setKey(KeyCode key) { +        keyProperty.set(key); +    } + +    /** +     * The key KeyCode represented as 2 or fewer characters for use in a block target. +     * @return the resulting string +     */ +    public String targetString() { +        KeyCode key = getKey(); +        return switch (key) { +            case UP    -> "↑"; +            case DOWN  -> "↓"; +            case LEFT  -> "←"; +            case RIGHT -> "→"; +            case SPACE -> "_"; +            case null  -> " "; +            default    -> { +                String s = key.toString(); +                if (s.length() > 2) { +                    yield s.charAt(0) + "."; +                } +                else { +                    yield s; +                } +            } +        }; +    } + +    public static void writeToFile() { +        try { +            File file = new File("controls.json"); +            FileWriter fileWriter = new FileWriter(file); +            JSONObject jsonObject = new JSONObject(); +            for (Control control : Control.values()) { +                jsonObject.put(control.toString(), control.getKey().toString()); +            } +            jsonObject.writeJSONString(fileWriter); +            fileWriter.flush(); +        } +        catch (IOException e) { +            e.printStackTrace(); +        } +    } + +    public static void readFromFile() { +        File file = new File("controls.json"); +        JSONParser jsonParser = new JSONParser(); + +        try { +            FileReader reader = new FileReader(file); +            Object obj = jsonParser.parse(reader); +            JSONObject jsonObject = (JSONObject)(obj); +            for (Control control : Control.values()) { +                if (jsonObject.containsKey(control.toString())) { +                    control.setKey(KeyCode.valueOf((String) jsonObject.get(control.toString()))); +                } +            } +        } +        catch (Exception e) { +            e.printStackTrace(); +        } +    } + +} diff --git a/src/main/java/net/sowgro/npehero/main/Notes.java b/src/main/java/net/sowgro/npehero/main/Notes.java index 04524c3..b0979de 100644 --- a/src/main/java/net/sowgro/npehero/main/Notes.java +++ b/src/main/java/net/sowgro/npehero/main/Notes.java @@ -72,7 +72,9 @@ public class Notes {                  }                  writer.println(lane + note.time.get()); - +                writer.flush(); +                writer.close(); +                // still not working              }          }          catch (IOException e) { | 
