Tim Allen 47d4bd4d81 Update to v096r01 release.
byuu says:

Changelog:

- restructured the project and removed a whole bunch of old/dead
  directives from higan/GNUmakefile
- huge amounts of work on hiro/cocoa (compiles but ~70% of the
  functionality is commented out)
- fixed a masking error in my ARM CPU disassembler [Lioncash]
- SFC: decided to change board cic=(411,413) back to board
  region=(ntsc,pal) ... the former was too obtuse

If you rename Boolean (it's a problem with an include from ruby, not
from hiro) and disable all the ruby drivers, you can compile an
OS X binary, but obviously it's not going to do anything.

It's a boring WIP, I just wanted to push out the project structure
change now at the start of this WIP cycle.
2015-12-30 17:54:59 +11:00

147 lines
5.0 KiB
C++

InputSettings::InputSettings(TabFrame* parent) : TabFrameItem(parent) {
setImage(Icon::Device::Joypad);
setText("Input");
layout.setMargin(5);
for(auto& emulator : inputManager->emulators) {
emulatorList.append(ComboButtonItem().setText(emulator.name));
}
emulatorList.onChange([&] { reloadPorts(); });
portList.onChange([&] { reloadDevices(); });
deviceList.onChange([&] { reloadMappings(); });
mappingList.onActivate([&] { assignMapping(); });
mappingList.onChange([&] { updateControls(); });
assignMouse1.setVisible(false).onActivate([&] { assignMouseInput(0); });
assignMouse2.setVisible(false).onActivate([&] { assignMouseInput(1); });
assignMouse3.setVisible(false).onActivate([&] { assignMouseInput(2); });
resetButton.setText("Reset").onActivate([&] {
if(MessageDialog("Are you sure you want to erase all mappings for this device?").setParent(*settingsManager).question() == "Yes") {
for(auto& mapping : activeDevice().mappings) mapping->unbind();
refreshMappings();
}
});
eraseButton.setText("Erase").onActivate([&] {
if(auto mapping = mappingList.selected()) {
activeDevice().mappings[mapping->offset()]->unbind();
refreshMappings();
}
});
reloadPorts();
}
auto InputSettings::updateControls() -> void {
eraseButton.setEnabled((bool)mappingList.selected());
assignMouse1.setVisible(false);
assignMouse2.setVisible(false);
assignMouse3.setVisible(false);
if(auto mapping = mappingList.selected()) {
auto input = activeDevice().mappings[mapping->offset()];
if(input->isDigital()) {
assignMouse1.setVisible().setText("Mouse Left");
assignMouse2.setVisible().setText("Mouse Middle");
assignMouse3.setVisible().setText("Mouse Right");
} else if(input->isAnalog()) {
assignMouse1.setVisible().setText("Mouse X-axis");
assignMouse2.setVisible().setText("Mouse Y-axis");
}
}
}
auto InputSettings::activeEmulator() -> InputEmulator& {
return inputManager->emulators[emulatorList.selected().offset()];
}
auto InputSettings::activePort() -> InputPort& {
return activeEmulator().ports[portList.selected().offset()];
}
auto InputSettings::activeDevice() -> InputDevice& {
auto index = deviceList.selected().property("index").natural();
return activePort().devices[index];
}
auto InputSettings::reloadPorts() -> void {
portList.reset();
for(auto& port : activeEmulator().ports) {
portList.append(ComboButtonItem().setText(port.name));
}
reloadDevices();
}
auto InputSettings::reloadDevices() -> void {
deviceList.reset();
for(auto n : range(activePort().devices)) {
auto& device = activePort().devices[n];
if(!device.mappings) continue; //do not display devices that have no configurable inputs
deviceList.append(ComboButtonItem().setText(device.name).setProperty("index", n));
}
reloadMappings();
}
auto InputSettings::reloadMappings() -> void {
eraseButton.setEnabled(false);
mappingList.reset();
mappingList.append(ListViewHeader().setVisible()
.append(ListViewColumn().setText("Name"))
.append(ListViewColumn().setText("Mapping").setExpandable())
.append(ListViewColumn().setText("Device").setForegroundColor({0, 128, 0}))
);
for(auto& mapping : activeDevice().mappings) {
mappingList.append(ListViewItem()
.append(ListViewCell().setText(mapping->name))
.append(ListViewCell())
.append(ListViewCell())
);
}
refreshMappings();
}
auto InputSettings::refreshMappings() -> void {
uint position = 0;
for(auto& mapping : activeDevice().mappings) {
mappingList.item(position)->cell(1)->setText(mapping->assignmentName());
mappingList.item(position)->cell(2)->setText(mapping->deviceName());
position++;
}
mappingList.resizeColumns();
}
auto InputSettings::assignMapping() -> void {
inputManager->poll(); //clear any pending events first
if(auto mapping = mappingList.selected()) {
activeMapping = activeDevice().mappings[mapping->offset()];
settingsManager->layout.setEnabled(false);
settingsManager->statusBar.setText({"Press a key or button to map [", activeMapping->name, "] ..."});
}
}
auto InputSettings::assignMouseInput(uint id) -> void {
if(auto mouse = inputManager->findMouse()) {
if(auto mapping = mappingList.selected()) {
activeMapping = activeDevice().mappings[mapping->offset()];
if(activeMapping->isDigital()) {
return inputEvent(mouse, HID::Mouse::GroupID::Button, id, 0, 1, true);
} else if(activeMapping->isAnalog()) {
return inputEvent(mouse, HID::Mouse::GroupID::Axis, id, 0, +32767, true);
}
}
}
}
auto InputSettings::inputEvent(shared_pointer<HID::Device> device, uint group, uint input, int16 oldValue, int16 newValue, bool allowMouseInput) -> void {
if(!activeMapping) return;
if(device->isMouse() && !allowMouseInput) return;
if(activeMapping->bind(device, group, input, oldValue, newValue)) {
activeMapping = nullptr;
settingsManager->statusBar.setText("");
settingsManager->layout.setEnabled(true);
refreshMappings();
}
}