Key bindings can be updated with any key.
- Changed key press from FXML key event to a listener - UP, DOWN, ENTER keys now work - Keys no longer change cells or press buttons - Added placeholder buttons Cancel, Reset and Save - Added some JavaDoc #story[1197]
This commit is contained in:
@@ -6,13 +6,16 @@ import javafx.event.ActionEvent;
|
|||||||
import javafx.event.EventHandler;
|
import javafx.event.EventHandler;
|
||||||
import javafx.fxml.FXML;
|
import javafx.fxml.FXML;
|
||||||
import javafx.scene.control.Button;
|
import javafx.scene.control.Button;
|
||||||
import javafx.scene.control.Label;
|
|
||||||
import javafx.scene.control.ListView;
|
import javafx.scene.control.ListView;
|
||||||
import javafx.scene.input.KeyEvent;
|
import javafx.scene.input.KeyEvent;
|
||||||
|
import javafx.scene.layout.AnchorPane;
|
||||||
import visualiser.gameController.Keys.ControlKey;
|
import visualiser.gameController.Keys.ControlKey;
|
||||||
import visualiser.gameController.Keys.KeyFactory;
|
import visualiser.gameController.Keys.KeyFactory;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Controller for the scene used to display and update current key bindings.
|
||||||
|
*/
|
||||||
public class KeyBindingsController {
|
public class KeyBindingsController {
|
||||||
@FXML Button btnSave;
|
@FXML Button btnSave;
|
||||||
@FXML Button btnCancel;
|
@FXML Button btnCancel;
|
||||||
@@ -20,18 +23,21 @@ public class KeyBindingsController {
|
|||||||
@FXML ListView lstControl;
|
@FXML ListView lstControl;
|
||||||
@FXML ListView lstKey;
|
@FXML ListView lstKey;
|
||||||
@FXML ListView lstDescription;
|
@FXML ListView lstDescription;
|
||||||
@FXML Label lblTitle;
|
@FXML AnchorPane anchor;
|
||||||
String currentButton = null;
|
String currentButton = null;
|
||||||
KeyFactory keyFactory = KeyFactory.getFactory();
|
KeyFactory keyFactory = KeyFactory.getFactory();
|
||||||
|
|
||||||
public void initialize(){
|
public void initialize(){
|
||||||
|
|
||||||
|
// headings for each column
|
||||||
lstKey.getItems().add("Key");
|
lstKey.getItems().add("Key");
|
||||||
lstControl.getItems().add("Command");
|
lstControl.getItems().add("Command");
|
||||||
lstDescription.getItems().add("Description");
|
lstDescription.getItems().add("Description");
|
||||||
|
lstKey.getSelectionModel().select(0);
|
||||||
|
lstControl.getSelectionModel().select(0);
|
||||||
|
lstDescription.getSelectionModel().select(0);
|
||||||
|
|
||||||
|
// populate columns with current key bindings and buttons to update
|
||||||
|
|
||||||
for (Map.Entry<String, ControlKey> entry : keyFactory.getKeyState().entrySet()) {
|
for (Map.Entry<String, ControlKey> entry : keyFactory.getKeyState().entrySet()) {
|
||||||
Button button = new Button(entry.getKey());
|
Button button = new Button(entry.getKey());
|
||||||
button.setMinWidth(120);
|
button.setMinWidth(120);
|
||||||
@@ -46,10 +52,7 @@ public class KeyBindingsController {
|
|||||||
lstDescription.getItems().add(entry.getValue().getProtocolCode());
|
lstDescription.getItems().add(entry.getValue().getProtocolCode());
|
||||||
}
|
}
|
||||||
|
|
||||||
lstKey.getSelectionModel().select(0);
|
// stop the columns from being selectable, so only the buttons are
|
||||||
lstControl.getSelectionModel().select(0);
|
|
||||||
lstDescription.getSelectionModel().select(0);
|
|
||||||
|
|
||||||
lstKey.getSelectionModel().selectedItemProperty()
|
lstKey.getSelectionModel().selectedItemProperty()
|
||||||
.addListener((observable, oldvalue, newValue) -> {
|
.addListener((observable, oldvalue, newValue) -> {
|
||||||
Platform.runLater(new Runnable() {
|
Platform.runLater(new Runnable() {
|
||||||
@@ -75,11 +78,39 @@ public class KeyBindingsController {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// add CSS stylesheet once the scene has been created
|
||||||
lstKey.sceneProperty().addListener((obs, oldScene, newScene) -> {
|
lstKey.sceneProperty().addListener((obs, oldScene, newScene) -> {
|
||||||
if (newScene != null) {
|
if (newScene != null) {
|
||||||
newScene.getStylesheets().add("/css/keyBindings.css");
|
newScene.getStylesheets().add("/css/keyBindings.css");
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
setKeyListener();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a listener for the base anchorpane for key presses.
|
||||||
|
* It updates the current key bindings if required.
|
||||||
|
*/
|
||||||
|
public void setKeyListener(){
|
||||||
|
anchor.addEventFilter(KeyEvent.KEY_PRESSED, event -> {
|
||||||
|
// if a button was clicked
|
||||||
|
if (currentButton != null) {
|
||||||
|
// update text on the button
|
||||||
|
ObservableList buttons = lstKey.getItems();
|
||||||
|
for (int i = 1; i < buttons.size(); i++) {
|
||||||
|
if (currentButton == ((Button)buttons.get(i)).getText()) {
|
||||||
|
((Button)buttons.get(i)).setText(event.getCode().toString
|
||||||
|
());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// update the control key
|
||||||
|
keyFactory.updateKey(currentButton, event.getCode().toString());
|
||||||
|
// remove current button selection
|
||||||
|
currentButton = null;
|
||||||
|
}
|
||||||
|
event.consume();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -95,22 +126,4 @@ public class KeyBindingsController {
|
|||||||
System.out.println("save clicked");
|
System.out.println("save clicked");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onKey(KeyEvent e){
|
|
||||||
System.out.println("key pressed");
|
|
||||||
// if a button was clicked
|
|
||||||
if (currentButton!=null){
|
|
||||||
// update text on the button
|
|
||||||
ObservableList buttons = lstKey.getItems();
|
|
||||||
for (int i = 1; i < buttons.size(); i++) {
|
|
||||||
if (currentButton == ((Button)buttons.get(i)).getText()) {
|
|
||||||
((Button)buttons.get(i)).setText(e.getCode().toString());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// update the control key
|
|
||||||
keyFactory.updateKey(currentButton, e.getCode().toString());
|
|
||||||
// remove current button selection
|
|
||||||
currentButton = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,8 +52,14 @@ public class KeyFactory {
|
|||||||
return keyState;
|
return keyState;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the key bound to a particular command in the keystate.
|
||||||
|
* @param oldKey the existing key to updated
|
||||||
|
* @param newKey the new key value to replace the old
|
||||||
|
*/
|
||||||
public void updateKey(String oldKey, String newKey){
|
public void updateKey(String oldKey, String newKey){
|
||||||
ControlKey controlKey = keyState.get(oldKey);
|
ControlKey controlKey = keyState.get(oldKey);
|
||||||
|
keyState.remove(oldKey, controlKey);
|
||||||
keyState.put(newKey, controlKey);
|
keyState.put(newKey, controlKey);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,9 +6,7 @@
|
|||||||
<?import javafx.scene.layout.AnchorPane?>
|
<?import javafx.scene.layout.AnchorPane?>
|
||||||
<?import javafx.scene.text.Font?>
|
<?import javafx.scene.text.Font?>
|
||||||
|
|
||||||
<AnchorPane id="anchor" maxHeight="-Infinity" maxWidth="-Infinity"
|
<AnchorPane id="anchor" fx:id="anchor" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="471.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="visualiser.Controllers.KeyBindingsController">
|
||||||
minHeight="-Infinity"
|
|
||||||
minWidth="-Infinity" onKeyPressed="#onKey" prefHeight="471.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="visualiser.Controllers.KeyBindingsController">
|
|
||||||
<children>
|
<children>
|
||||||
<Label fx:id="lblTitle" layoutX="172.0" layoutY="14.0" text="Key Bindings">
|
<Label fx:id="lblTitle" layoutX="172.0" layoutY="14.0" text="Key Bindings">
|
||||||
<font>
|
<font>
|
||||||
|
|||||||
Reference in New Issue
Block a user