use of org.terasology.engine.input.RegisterBindButton in project Terasology by MovingBlocks.
the class InputSettingsScreen method addInputSection.
private void addInputSection(InputCategory category, ColumnLayout layout, Map<SimpleUri, RegisterBindButton> inputsById) {
if (category != null) {
layout.addWidget(new UISpace(new Vector2i(0, 16)));
UILabel categoryHeader = new UILabel(translationSystem.translate(category.displayName()));
categoryHeader.setFamily("subheading");
layout.addWidget(categoryHeader);
Set<SimpleUri> processedBinds = Sets.newHashSet();
for (String bindId : category.ordering()) {
SimpleUri bindUri = new SimpleUri(bindId);
if (bindUri.isValid()) {
RegisterBindButton bind = inputsById.get(new SimpleUri(bindId));
if (bind != null) {
addInputBindRow(bindUri, bind, layout);
processedBinds.add(bindUri);
}
}
}
List<ExtensionBind> extensionBindList = Lists.newArrayList();
for (Map.Entry<SimpleUri, RegisterBindButton> bind : inputsById.entrySet()) {
if (bind.getValue().category().equals(category.id()) && !processedBinds.contains(bind.getKey())) {
extensionBindList.add(new ExtensionBind(bind.getKey(), bind.getValue()));
}
}
Collections.sort(extensionBindList);
for (ExtensionBind extension : extensionBindList) {
addInputBindRow(extension.uri, extension.bind, layout);
}
}
}
use of org.terasology.engine.input.RegisterBindButton in project Terasology by MovingBlocks.
the class InputSettingsScreen method initialise.
@Override
public void initialise() {
setAnimationSystem(MenuAnimationSystems.createDefaultSwipeAnimation());
ColumnLayout mainLayout = find("main", ColumnLayout.class);
UIButton azerty = find("azerty", UIButton.class);
if (azerty != null) {
azerty.subscribe(event -> {
BindCommands.AZERTY.forEach(this::setPrimaryBind);
bindsManager.registerBinds();
});
}
UIButton dvorak = find("dvorak", UIButton.class);
if (dvorak != null) {
dvorak.subscribe(event -> {
BindCommands.DVORAK.forEach(this::setPrimaryBind);
bindsManager.registerBinds();
});
}
UIButton neo = find("neo", UIButton.class);
if (neo != null) {
neo.subscribe(event -> {
BindCommands.NEO.forEach(this::setPrimaryBind);
bindsManager.registerBinds();
});
}
UISlider mouseSensitivity = new UISlider("mouseSensitivity");
mouseSensitivity.bindValue(BindHelper.bindBeanProperty("mouseSensitivity", inputDeviceConfiguration, Float.TYPE));
mouseSensitivity.setIncrement(0.025f);
mouseSensitivity.setPrecision(3);
UICheckbox mouseInverted = new UICheckbox("mouseYAxisInverted");
mouseInverted.bindChecked(BindHelper.bindBeanProperty("mouseYAxisInverted", inputDeviceConfiguration, Boolean.TYPE));
if (mainLayout != null) {
mainLayout.addWidget(new UILabel("mouseLabel", "subheading", translationSystem.translate("${engine:menu" + "#category-mouse}")));
mainLayout.addWidget(new RowLayout(new UILabel(translationSystem.translate("${engine:menu#mouse" + "-sensitivity}") + ":"), mouseSensitivity).setColumnRatios(0.4f).setHorizontalSpacing(horizontalSpacing));
mainLayout.addWidget(new RowLayout(new UILabel(translationSystem.translate("${engine:menu#invert-mouse}") + ":"), mouseInverted).setColumnRatios(0.4f).setHorizontalSpacing(horizontalSpacing));
}
Map<String, InputCategory> inputCategories = Maps.newHashMap();
Map<SimpleUri, RegisterBindButton> inputsById = Maps.newHashMap();
DependencyResolver resolver = new DependencyResolver(moduleManager.getRegistry());
for (Name moduleId : moduleManager.getRegistry().getModuleIds()) {
Module module = moduleManager.getRegistry().getLatestModuleVersion(moduleId);
ResolutionResult result = resolver.resolve(moduleId);
if (result.isSuccess()) {
try (ModuleEnvironment environment = moduleManager.loadEnvironment(result.getModules(), false)) {
for (Class<?> holdingType : environment.getTypesAnnotatedWith(InputCategory.class, new FromModule(environment, moduleId))) {
InputCategory inputCategory = holdingType.getAnnotation(InputCategory.class);
inputCategories.put(module.getId() + ":" + inputCategory.id(), inputCategory);
}
for (Class<?> bindEvent : environment.getTypesAnnotatedWith(RegisterBindButton.class, new FromModule(environment, moduleId))) {
if (BindButtonEvent.class.isAssignableFrom(bindEvent)) {
RegisterBindButton bindRegister = bindEvent.getAnnotation(RegisterBindButton.class);
inputsById.put(new SimpleUri(module.getId(), bindRegister.id()), bindRegister);
}
}
}
}
}
if (mainLayout != null) {
addInputSection(inputCategories.remove("engine:movement"), mainLayout, inputsById);
addInputSection(inputCategories.remove("engine:interaction"), mainLayout, inputsById);
addInputSection(inputCategories.remove("engine:inventory"), mainLayout, inputsById);
addInputSection(inputCategories.remove("engine:general"), mainLayout, inputsById);
for (InputCategory category : inputCategories.values()) {
addInputSection(category, mainLayout, inputsById);
}
mainLayout.addWidget(new UISpace(new Vector2i(1, 16)));
List<String> controllers = inputSystem.getControllerDevice().getControllers();
for (String name : controllers) {
ControllerInfo cfg = inputDeviceConfiguration.getController(name);
addInputSection(mainLayout, name, cfg);
}
}
WidgetUtil.trySubscribe(this, "reset", button -> {
inputDeviceConfiguration.reset();
bindsManager.getBindsConfig().setBinds(bindsManager.getDefaultBindsConfig());
});
WidgetUtil.trySubscribe(this, "back", button -> triggerBackAnimation());
}
use of org.terasology.engine.input.RegisterBindButton in project Terasology by MovingBlocks.
the class BindingScraper method main.
/**
* @param args (ignored)
* @throws Exception if the module environment cannot be loaded
*/
public static void main(String[] args) throws Exception {
ModuleManager moduleManager = ModuleManagerFactory.create();
// Holds normal input mappings where there is only one key
Multimap<InputCategory, String> categories = ArrayListMultimap.create();
Multimap<String, Input> keys = ArrayListMultimap.create();
Map<String, String> desc = new HashMap<>();
for (Class<?> holdingType : moduleManager.getEnvironment().getTypesAnnotatedWith(InputCategory.class)) {
InputCategory inputCategory = holdingType.getAnnotation(InputCategory.class);
categories.put(inputCategory, null);
for (String button : inputCategory.ordering()) {
categories.put(inputCategory, button);
}
}
for (Class<?> buttonEvent : moduleManager.getEnvironment().getTypesAnnotatedWith(RegisterBindButton.class)) {
DefaultBinding defBinding = buttonEvent.getAnnotation(DefaultBinding.class);
RegisterBindButton info = buttonEvent.getAnnotation(RegisterBindButton.class);
String cat = info.category();
String id = "engine:" + info.id();
desc.put(id, info.description());
if (cat.isEmpty()) {
InputCategory inputCategory = findEntry(categories, id);
if (inputCategory == null) {
System.out.println("Invalid category for: " + info.id());
}
} else {
InputCategory inputCategory = findCategory(categories, cat);
if (inputCategory != null) {
categories.put(inputCategory, id);
} else {
System.out.println("Invalid category for: " + info.id());
}
}
if (defBinding != null) {
// This handles bindings with just one key
Input input = defBinding.type().getInput(defBinding.id());
keys.put(id, input);
} else {
// See if there is a multi-mapping for this button
DefaultBindings multiBinding = buttonEvent.getAnnotation(DefaultBindings.class);
// Annotation math magic. We're expecting a DefaultBindings containing one DefaultBinding pair
if (multiBinding != null && multiBinding.value().length == 2) {
DefaultBinding[] bindings = multiBinding.value();
Input primary = bindings[0].type().getInput(bindings[0].id());
Input secondary = bindings[1].type().getInput(bindings[1].id());
keys.put(id, primary);
keys.put(id, secondary);
}
}
}
for (InputCategory row : categories.keySet()) {
System.out.println("# " + row.displayName());
categories.get(row).stream().filter(entry -> entry != null).forEach(entry -> System.out.println(desc.get(entry) + ": " + keys.get(entry)));
}
}
use of org.terasology.engine.input.RegisterBindButton in project Terasology by MovingBlocks.
the class BindsSubsystem method addButtonDefaultsFor.
private void addButtonDefaultsFor(Name moduleId, Iterable<Class<?>> classes, BindsConfiguration config) {
for (Class<?> buttonEvent : classes) {
if (ButtonEvent.class.isAssignableFrom(buttonEvent)) {
RegisterBindButton info = buttonEvent.getAnnotation(RegisterBindButton.class);
SimpleUri bindUri = new SimpleUri(moduleId, info.id());
if (!config.hasBinds(bindUri)) {
addDefaultBindings(bindUri, buttonEvent, config);
}
}
}
}
use of org.terasology.engine.input.RegisterBindButton in project Terasology by MovingBlocks.
the class BindsSubsystem method registerButtonBinds.
private void registerButtonBinds(ModuleEnvironment environment) {
Iterable<Class<?>> classes = environment.getTypesAnnotatedWith(RegisterBindButton.class);
for (Class<?> registerBindClass : classes) {
RegisterBindButton info = registerBindClass.getAnnotation(RegisterBindButton.class);
SimpleUri bindUri = new SimpleUri(environment.getModuleProviding(registerBindClass), info.id());
if (BindButtonEvent.class.isAssignableFrom(registerBindClass)) {
try {
BindableButton bindButton = registerBindButton(bindUri, info.description(), (BindButtonEvent) registerBindClass.newInstance());
bindButton.setMode(info.mode());
bindButton.setRepeating(info.repeating());
bindsConfiguration.getBinds(bindUri).stream().filter(input -> input != null).forEach(input -> linkBindButtonToInput(input, bindUri));
logger.debug("Registered button bind: {}", bindUri);
} catch (InstantiationException | IllegalAccessException e) {
logger.error("Failed to register button bind \"{}\"", e);
}
} else {
logger.error("Failed to register button bind \"{}\", does not extend BindButtonEvent", bindUri);
}
}
}
Aggregations