lsnes/ui/settings/input.cpp
2013-05-03 17:47:34 +03:00

150 lines
5.3 KiB
C++
Executable file

InputSettings *inputSettings = 0;
InputSettings::InputSettings() : activeInput(0) {
title.setFont(application->titleFont);
title.setText("Input Settings");
inputList.setHeaderText("Name", "Mapping");
inputList.setHeaderVisible();
assignPrimary.setVisible(false);
assignSecondary.setVisible(false);
assignTertiary.setVisible(false);
clearButton.setText("Clear");
for(unsigned n = 0; n < inputManager->inputList.size(); n++) {
primary.append(inputManager->inputList[n].name);
}
primaryChange();
append(title, { ~0, 0 }, 5);
append(selectionLayout, { ~0, 0 }, 5);
selectionLayout.append(primary, { ~0, 0 }, 5);
selectionLayout.append(secondary, { ~0, 0 }, 5);
selectionLayout.append(tertiary, { ~0, 0 }, 0);
append(inputList, { ~0, ~0 }, 5);
append(controlLayout, { ~0, 0 }, 0);
controlLayout.append(assignPrimary, { 100, 0 }, 5);
controlLayout.append(assignSecondary, { 100, 0 }, 5);
controlLayout.append(assignTertiary, { 100, 0 }, 5);
controlLayout.append(spacer, { ~0, 0 }, 0);
controlLayout.append(clearButton, { 80, 0 }, 0);
primary.onChange = { &InputSettings::primaryChange, this };
secondary.onChange = { &InputSettings::secondaryChange, this };
tertiary.onChange = { &InputSettings::tertiaryChange, this };
inputList.onChange = { &InputSettings::synchronize, this };
inputList.onActivate = { &InputSettings::assignInput, this };
assignPrimary.onActivate = [&] { assignMouseInput(0); };
assignSecondary.onActivate = [&] { assignMouseInput(1); };
assignTertiary.onActivate = [&] { assignMouseInput(2); };
clearButton.onActivate = { &InputSettings::clearInput, this };
synchronize();
}
void InputSettings::synchronize() {
PrimaryInput &pinput = inputManager->inputList[primary.selection()];
SecondaryInput &sinput = pinput[secondary.selection()];
TertiaryInput &tinput = sinput[tertiary.selection()];
secondary.setEnabled(pinput.size() > 1);
tertiary.setEnabled(sinput.size() > 1);
clearButton.setEnabled(inputList.selected());
}
void InputSettings::primaryChange() {
secondary.reset();
tertiary.reset();
PrimaryInput &input = inputManager->inputList[primary.selection()];
for(unsigned n = 0; n < input.size(); n++) {
secondary.append(input[n].name);
}
secondaryChange();
}
void InputSettings::secondaryChange() {
tertiary.reset();
PrimaryInput &pinput = inputManager->inputList[primary.selection()];
SecondaryInput &input = pinput[secondary.selection()];
for(unsigned n = 0; n < input.size(); n++) {
tertiary.append(input[n].name);
}
tertiaryChange();
}
void InputSettings::tertiaryChange() {
inputList.reset();
PrimaryInput &pinput = inputManager->inputList[primary.selection()];
SecondaryInput &sinput = pinput[secondary.selection()];
TertiaryInput &input = sinput[tertiary.selection()];
for(unsigned n = 0; n < input.size(); n++) {
inputList.append(input[n].name, input[n].mapping);
}
synchronize();
inputList.autoSizeColumns();
}
void InputSettings::assignInput() {
PrimaryInput &pinput = inputManager->inputList[primary.selection()];
SecondaryInput &sinput = pinput[secondary.selection()];
TertiaryInput &tinput = sinput[tertiary.selection()];
activeInput = &tinput[inputList.selection()];
settingsWindow->setStatusText({ "Set asssignment for [", tinput.name, "::", activeInput->name, "] ..." });
settingsWindow->panelList.setEnabled(false);
primary.setEnabled(false);
secondary.setEnabled(false);
tertiary.setEnabled(false);
inputList.setEnabled(false);
if(dynamic_cast<AnalogInput*>(activeInput)) {
assignPrimary.setText("Mouse X-axis");
assignSecondary.setText("Mouse Y-axis");
assignPrimary.setVisible(true);
assignSecondary.setVisible(true);
}
if(dynamic_cast<DigitalInput*>(activeInput)) {
assignPrimary.setText("Mouse Left");
assignSecondary.setText("Mouse Middle");
assignTertiary.setText("Mouse Right");
assignPrimary.setVisible(true);
assignSecondary.setVisible(true);
assignTertiary.setVisible(true);
}
}
void InputSettings::assignMouseInput(unsigned n) {
if(activeInput == 0) return;
if(dynamic_cast<AnalogInput*>(activeInput)) {
return inputEvent(mouse(0).axis(n), 1u, true);
}
if(dynamic_cast<DigitalInput*>(activeInput)) {
return inputEvent(mouse(0).button(n), 1u, true);
}
}
void InputSettings::clearInput() {
PrimaryInput &pinput = inputManager->inputList[primary.selection()];
SecondaryInput &sinput = pinput[secondary.selection()];
TertiaryInput &tinput = sinput[tertiary.selection()];
activeInput = &tinput[inputList.selection()];
inputEvent(Scancode::None, 1u);
}
void InputSettings::inputEvent(int16_t scancode, int16_t value, bool allowMouseInput) {
if(activeInput == 0) return;
if(allowMouseInput == false && (Mouse::isAnyButton(scancode) || Mouse::isAnyAxis(scancode))) return;
if(activeInput->bind(scancode, value) == false) return;
activeInput = 0;
tertiaryChange();
settingsWindow->setStatusText("");
settingsWindow->panelList.setEnabled(true);
primary.setEnabled(true);
inputList.setEnabled(true);
assignPrimary.setVisible(false);
assignSecondary.setVisible(false);
assignTertiary.setVisible(false);
synchronize();
}