diff --git a/src/com/limelight/gui/SettingsFrame.java b/src/com/limelight/gui/SettingsFrame.java index 43a0623..6c2df07 100644 --- a/src/com/limelight/gui/SettingsFrame.java +++ b/src/com/limelight/gui/SettingsFrame.java @@ -28,6 +28,7 @@ import com.limelight.input.ControllerListener; import com.limelight.input.Gamepad; import com.limelight.input.GamepadHandler; import com.limelight.input.GamepadMapping; +import com.limelight.input.GamepadMapping.Mapping; import com.limelight.settings.GamepadSettingsManager; public class SettingsFrame extends JFrame { @@ -62,42 +63,54 @@ public class SettingsFrame extends JFrame { ControllerComponent[] components = ControllerComponent.values(); for (int i = 0; i < components.length; i++) { + Mapping mapping = config.getMappedComponent(components[i]); + ControllerComponent comp = null; + if (mapping == null) { + comp = components[i]; + } else { + comp = mapping.contComp; + } Box componentBox = Box.createHorizontalBox(); componentBox.add(Box.createHorizontalStrut(10)); - componentBox.add(components[i].getLabel()); + componentBox.add(comp.getLabel()); componentBox.add(Box.createHorizontalGlue()); - componentBox.add(components[i].getMapButton()); + componentBox.add(comp.getMapButton()); componentBox.add(Box.createHorizontalStrut(5)); - componentBox.add(components[i].getInvertBox()); + componentBox.add(comp.getInvertBox()); componentBox.add(Box.createHorizontalStrut(5)); - componentBox.add(components[i].getTriggerBox()); + componentBox.add(comp.getTriggerBox()); componentBox.add(Box.createHorizontalStrut(10)); Dimension buttonSize = new Dimension(110,32); - components[i].getMapButton().setMaximumSize(buttonSize); - components[i].getMapButton().setMinimumSize(buttonSize); - components[i].getMapButton().setPreferredSize(buttonSize); + comp.getMapButton().setMaximumSize(buttonSize); + comp.getMapButton().setMinimumSize(buttonSize); + comp.getMapButton().setPreferredSize(buttonSize); - components[i].getMapButton().addActionListener(createListener()); - components[i].getMapButton().setText(config.getMapping(components[i])); + comp.getMapButton().addActionListener(createListener()); + comp.getMapButton().setText(config.getMapping(comp)); - components[i].getInvertBox().addItemListener(new ItemListener() { + if (mapping != null) { + comp.getInvertBox().setSelected(mapping.invert); + comp.getTriggerBox().setSelected(mapping.trigger); + } + + comp.getInvertBox().addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { JCheckBox clicked = (JCheckBox)e.getItem(); ControllerComponent contComp = ControllerComponent.valueOf(clicked.getName()); - contComp.invert(e.getStateChange() == ItemEvent.SELECTED); + config.getMappedComponent(contComp).invert = (e.getStateChange() == ItemEvent.SELECTED); configChanged = true; } }); - components[i].getTriggerBox().addItemListener(new ItemListener() { + comp.getTriggerBox().addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { JCheckBox clicked = (JCheckBox)e.getItem(); ControllerComponent contComp = ControllerComponent.valueOf(clicked.getName()); - contComp.trigger(e.getStateChange() == ItemEvent.SELECTED); + config.getMappedComponent(contComp).trigger = (e.getStateChange() == ItemEvent.SELECTED); configChanged = true; } }); @@ -140,6 +153,7 @@ public class SettingsFrame extends JFrame { if (shouldStartHandler) { GamepadHandler.startUp(); } + dispose(); } }); @@ -215,13 +229,17 @@ public class SettingsFrame extends JFrame { consumeEvents.setName("Consume Events Thread"); consumeEvents.start(); - ControllerComponent oldConfig = config.getControllerComponent(newMapping); + Mapping oldConfig = config.getMapping(newMapping); if (oldConfig != null) { config.removeMapping(newMapping); - oldConfig.getMapButton().setText(""); + oldConfig.contComp.getMapButton().setText(""); } - - config.insertMapping(contComp, newMapping); + + Mapping newConfig = config.getMappedComponent(contComp); + if (newConfig == null) { + newConfig = config.new Mapping(contComp, false, false); + } + config.insertMapping(newConfig, newMapping); contComp.getMapButton().setText(newMapping.getName()); configChanged = true; contComp.getMapButton().setSelected(false); diff --git a/src/com/limelight/input/ControllerComponent.java b/src/com/limelight/input/ControllerComponent.java index f5fda6e..2bf5fd4 100644 --- a/src/com/limelight/input/ControllerComponent.java +++ b/src/com/limelight/input/ControllerComponent.java @@ -19,8 +19,6 @@ public enum ControllerComponent implements Serializable { private JCheckBox invertBox; private JCheckBox triggerBox; private boolean analog; - private boolean invert; - private boolean trigger; private ControllerComponent(String name, boolean analog) { this.label = new JLabel(name); @@ -32,8 +30,6 @@ public enum ControllerComponent implements Serializable { this.triggerBox.setName(this.name()); this.triggerBox.setToolTipText("If this component should act as a trigger."); this.analog = analog; - this.invert = false; - this.trigger = false; } public JLabel getLabel() { @@ -56,19 +52,7 @@ public enum ControllerComponent implements Serializable { return analog; } - public boolean isTrigger() { - return trigger; - } - - public void trigger(boolean isTrigger) { - trigger = isTrigger; - } - - public void invert(boolean invert) { - this.invert = invert; - } - - public boolean invert() { - return invert; + public boolean sameAs(ControllerComponent other) { + return this.name().equals(other.name()); } } diff --git a/src/com/limelight/input/Gamepad.java b/src/com/limelight/input/Gamepad.java index 69c5e95..e3f9d8f 100644 --- a/src/com/limelight/input/Gamepad.java +++ b/src/com/limelight/input/Gamepad.java @@ -1,5 +1,6 @@ package com.limelight.input; +import com.limelight.input.GamepadMapping.Mapping; import com.limelight.nvstream.NvConnection; import com.limelight.nvstream.input.ControllerPacket; @@ -104,22 +105,22 @@ public class Gamepad { } private void handleComponent(Component comp, float value) { - ControllerComponent contComp = config.getControllerComponent(comp); - if (contComp != null) { - if (contComp.isAnalog()) { - handleAnalog(contComp, sanitizeValue(contComp, value)); + Mapping mapping = config.getMapping(comp); + if (mapping != null) { + if (mapping.contComp.isAnalog()) { + handleAnalog(mapping.contComp, sanitizeValue(mapping, value)); } else { - handleButtons(contComp, sanitizeValue(contComp, value)); + handleButtons(mapping.contComp, sanitizeValue(mapping, value)); } } } - private float sanitizeValue(ControllerComponent contComp, float value) { + private float sanitizeValue(Mapping mapping, float value) { float sanitized = value; - if (contComp.invert()) { + if (mapping.invert) { sanitized = -sanitized; } - if (contComp.isTrigger()) { + if (mapping.trigger) { sanitized = (sanitized + 1)/2; } return sanitized; diff --git a/src/com/limelight/input/GamepadMapping.java b/src/com/limelight/input/GamepadMapping.java index 919f262..0d6629f 100644 --- a/src/com/limelight/input/GamepadMapping.java +++ b/src/com/limelight/input/GamepadMapping.java @@ -9,17 +9,17 @@ import net.java.games.input.Component; public class GamepadMapping implements Serializable { private static final long serialVersionUID = -185035113915743149L; - private HashMap mapping; - + private HashMap mapping; + public GamepadMapping() { - mapping = new HashMap(); + mapping = new HashMap(); } - public void insertMapping(ControllerComponent contComp, Component comp) { - mapping.put(comp.getIdentifier().getName(), contComp); + public void insertMapping(Mapping toMap, Component comp) { + mapping.put(comp.getIdentifier().getName(), toMap); } - public ControllerComponent getControllerComponent(Component comp) { + public Mapping getMapping(Component comp) { return mapping.get(comp.getIdentifier().getName()); } @@ -27,6 +27,21 @@ public class GamepadMapping implements Serializable { mapping.remove(comp.getIdentifier().getName()); } + /** + * Gets the mapped ControllerComponent for the specified ControllerComponent.
+ * NOTE: Use sparingly takes O(N) time. + * @param contComp the component to get a mapping for + * @return a mapping or an null if there is none + */ + public Mapping getMappedComponent(ControllerComponent contComp) { + for (Entry entry : mapping.entrySet()) { + if (entry.getValue().contComp.sameAs(contComp)) { + return entry.getValue(); + } + } + return null; + } + /** * Gets the mapping for the specified component.
* NOTE: Use sparingly takes O(N) time. @@ -34,11 +49,25 @@ public class GamepadMapping implements Serializable { * @return a mapping or an empty string if there is none */ public String getMapping(ControllerComponent contComp) { - for (Entry entry : mapping.entrySet()) { - if (entry.getValue().equals(contComp)) { + for (Entry entry : mapping.entrySet()) { + if (entry.getValue().contComp.sameAs(contComp)) { return entry.getKey(); } } return ""; } + + public class Mapping implements Serializable { + private static final long serialVersionUID = -8407172977953214242L; + + public ControllerComponent contComp; + public boolean invert; + public boolean trigger; + + public Mapping(ControllerComponent contComp, boolean invert, boolean trigger) { + this.contComp = contComp; + this.invert = invert; + this.trigger = trigger; + } + } }