/* * Copyright 2014 MovingBlocks * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.terasology.rendering.nui.layers.mainMenu.inputSettings; import org.terasology.audio.StaticSound; import org.terasology.input.Input; import org.terasology.input.InputType; import org.terasology.input.MouseInput; import org.terasology.input.events.MouseButtonEvent; import org.terasology.input.events.MouseWheelEvent; import org.terasology.math.geom.Vector2i; import org.terasology.rendering.assets.font.Font; import org.terasology.rendering.nui.BaseInteractionListener; import org.terasology.rendering.nui.Canvas; import org.terasology.rendering.nui.CoreWidget; import org.terasology.rendering.nui.InteractionListener; import org.terasology.rendering.nui.TextLineBuilder; import org.terasology.rendering.nui.databinding.Binding; import org.terasology.rendering.nui.databinding.DefaultBinding; import org.terasology.rendering.nui.events.NUIKeyEvent; import org.terasology.rendering.nui.events.NUIMouseClickEvent; import org.terasology.rendering.nui.events.NUIMouseOverEvent; import java.util.List; /** */ public class UIInputBind extends CoreWidget { private boolean capturingInput; private Input newInput; private Binding<Input> input = new DefaultBinding<>(); private Binding<StaticSound> clickSound = new DefaultBinding<>(); private Binding<Float> clickVolume = new DefaultBinding<>(1.0f); private InteractionListener interactionListener = new BaseInteractionListener() { @Override public void onMouseOver(NUIMouseOverEvent event) { super.onMouseOver(event); if (event.isTopMostElement()) { focusManager.setFocus(UIInputBind.this); } } @Override public boolean onMouseClick(NUIMouseClickEvent event) { if (event.getMouseButton() == MouseInput.MOUSE_LEFT) { if (getClickSound() != null) { getClickSound().play(getClickVolume()); } capturingInput = true; return true; } return false; } }; public UIInputBind() { } @Override public void onDraw(Canvas canvas) { if (!capturingInput) { if (newInput != null) { canvas.drawText(newInput.getDisplayName()); } } else { canvas.drawText("???"); } canvas.addInteractionRegion(interactionListener); } @Override public Vector2i getPreferredContentSize(Canvas canvas, Vector2i areaHint) { Font font = canvas.getCurrentStyle().getFont(); String text = ""; if (capturingInput) { text = "???"; } else if (newInput != null) { text = newInput.getDisplayName(); } List<String> lines = TextLineBuilder.getLines(font, text, areaHint.getX()); return font.getSize(lines); } @Override public void onMouseButtonEvent(MouseButtonEvent event) { if (capturingInput && event.isDown()) { setNewInput(InputType.MOUSE_BUTTON.getInput(event.getButton().getId())); capturingInput = false; event.consume(); } } @Override public void onMouseWheelEvent(MouseWheelEvent event) { if (capturingInput) { MouseInput mouseInput = MouseInput.find(InputType.MOUSE_WHEEL, event.getWheelTurns()); setNewInput(InputType.MOUSE_WHEEL.getInput(mouseInput.getId())); capturingInput = false; event.consume(); } } @Override public boolean onKeyEvent(NUIKeyEvent event) { if (event.isDown()) { if (capturingInput) { setNewInput(InputType.KEY.getInput(event.getKey().getId())); capturingInput = false; return true; } } return false; } @Override public void update(float delta) { } @Override public String getMode() { if (capturingInput) { return ACTIVE_MODE; } else if (interactionListener.isMouseOver()) { return HOVER_MODE; } return DEFAULT_MODE; } public void bindInput(Binding<Input> binding) { input = binding; newInput = input.get(); } public Input getInput() { return input.get(); } public void setInput(Input val) { input.set(val); } public void bindClickSound(Binding<StaticSound> binding) { clickSound = binding; } public StaticSound getClickSound() { return clickSound.get(); } public void setClickSound(StaticSound val) { clickSound.set(val); } public void bindClickVolume(Binding<Float> binding) { clickVolume = binding; } public float getClickVolume() { return clickVolume.get(); } public void setClickVolume(float val) { clickVolume.set(val); } public void setNewInput(Input newInput) { this.newInput = newInput; } public Input getNewInput() { return newInput; } public void saveInput() { setInput(newInput); } }