mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2025-01-30 23:10:14 -05:00
simplify controllers (#4914)
* start moving towards just using `ShipDeviceIndex::SDLGamepad` * rename `ShipDeviceIndex` to `ShipDeviceType` * all sdl mappings are always `ShipDeviceType::SDLGamepad` * create new `physicaldevice` directory where the new stuff can live * `ConnectedPhysicalDeviceManager` * start to not need index mapping manager * somes fixes and stuff * remove more shipdeviceindex stuff * more removing and what not * axis thresholds * rename some stuff and remove device icons * back to all stuff visible * show connected device names * bring in mouse color from lus input editor window * lus * remove * more stuff * more lus * basic filtering * update lus * upstream LUS * make `Controller_ShouldRumble` make sense
This commit is contained in:
parent
8244d63719
commit
63046a89ec
@ -1 +1 @@
|
||||
Subproject commit 9a974e002f84cd1fe834ee9d2fa4ccf16d899e0f
|
||||
Subproject commit 2e7d1fe6fdc8ba7ea6ee0682b8f00f48b38a4e89
|
@ -46,13 +46,6 @@ void SohInputEditorWindow::InitElement() {
|
||||
addButtonName(BTN_DLEFT, "D-pad left");
|
||||
addButtonName(BTN_DRIGHT, "D-pad right");
|
||||
addButtonName(0, "None");
|
||||
|
||||
mDeviceIndexVisiblity.clear();
|
||||
mDeviceIndexVisiblity[Ship::ShipDeviceIndex::Keyboard] = true;
|
||||
mDeviceIndexVisiblity[Ship::ShipDeviceIndex::Blue] = true;
|
||||
for (auto index = 1; index < Ship::ShipDeviceIndex::Max; index++) {
|
||||
mDeviceIndexVisiblity[static_cast<Ship::ShipDeviceIndex>(index)] = false;
|
||||
}
|
||||
}
|
||||
|
||||
#define INPUT_EDITOR_WINDOW_GAME_INPUT_BLOCK_ID 95237929
|
||||
@ -176,6 +169,9 @@ void SohInputEditorWindow::DrawAnalogPreview(const char* label, ImVec2 stick, fl
|
||||
#define BUTTON_COLOR_KEYBOARD_BEIGE ImVec4(0.651f, 0.482f, 0.357f, 0.5f)
|
||||
#define BUTTON_COLOR_KEYBOARD_BEIGE_HOVERED ImVec4(0.651f, 0.482f, 0.357f, 1.0f)
|
||||
|
||||
#define BUTTON_COLOR_MOUSE_BEIGE ImVec4(0.5f, 0.5f, 0.5f, 0.5f)
|
||||
#define BUTTON_COLOR_MOUSE_BEIGE_HOVERED ImVec4(0.5f, 0.5f, 0.5f, 1.0f)
|
||||
|
||||
#define BUTTON_COLOR_GAMEPAD_BLUE ImVec4(0.0f, 0.255f, 0.976f, 0.5f)
|
||||
#define BUTTON_COLOR_GAMEPAD_BLUE_HOVERED ImVec4(0.0f, 0.255f, 0.976f, 1.0f)
|
||||
|
||||
@ -191,29 +187,21 @@ void SohInputEditorWindow::DrawAnalogPreview(const char* label, ImVec2 stick, fl
|
||||
#define BUTTON_COLOR_GAMEPAD_PURPLE ImVec4(0.431f, 0.369f, 0.706f, 0.5f)
|
||||
#define BUTTON_COLOR_GAMEPAD_PURPLE_HOVERED ImVec4(0.431f, 0.369f, 0.706f, 1.0f)
|
||||
|
||||
void SohInputEditorWindow::GetButtonColorsForLUSDeviceIndex(Ship::ShipDeviceIndex lusIndex, ImVec4& buttonColor,
|
||||
void SohInputEditorWindow::GetButtonColorsForDeviceType(Ship::PhysicalDeviceType lusIndex, ImVec4& buttonColor,
|
||||
ImVec4& buttonHoveredColor) {
|
||||
switch (lusIndex) {
|
||||
case Ship::ShipDeviceIndex::Keyboard:
|
||||
case Ship::PhysicalDeviceType::Keyboard:
|
||||
buttonColor = BUTTON_COLOR_KEYBOARD_BEIGE;
|
||||
buttonHoveredColor = BUTTON_COLOR_KEYBOARD_BEIGE_HOVERED;
|
||||
break;
|
||||
case Ship::ShipDeviceIndex::Blue:
|
||||
case Ship::PhysicalDeviceType::Mouse:
|
||||
buttonColor = BUTTON_COLOR_MOUSE_BEIGE;
|
||||
buttonHoveredColor = BUTTON_COLOR_MOUSE_BEIGE_HOVERED;
|
||||
break;
|
||||
case Ship::PhysicalDeviceType::SDLGamepad:
|
||||
buttonColor = BUTTON_COLOR_GAMEPAD_BLUE;
|
||||
buttonHoveredColor = BUTTON_COLOR_GAMEPAD_BLUE_HOVERED;
|
||||
break;
|
||||
case Ship::ShipDeviceIndex::Red:
|
||||
buttonColor = BUTTON_COLOR_GAMEPAD_RED;
|
||||
buttonHoveredColor = BUTTON_COLOR_GAMEPAD_RED_HOVERED;
|
||||
break;
|
||||
case Ship::ShipDeviceIndex::Orange:
|
||||
buttonColor = BUTTON_COLOR_GAMEPAD_ORANGE;
|
||||
buttonHoveredColor = BUTTON_COLOR_GAMEPAD_ORANGE_HOVERED;
|
||||
break;
|
||||
case Ship::ShipDeviceIndex::Green:
|
||||
buttonColor = BUTTON_COLOR_GAMEPAD_GREEN;
|
||||
buttonHoveredColor = BUTTON_COLOR_GAMEPAD_GREEN_HOVERED;
|
||||
break;
|
||||
default:
|
||||
buttonColor = BUTTON_COLOR_GAMEPAD_PURPLE;
|
||||
buttonHoveredColor = BUTTON_COLOR_GAMEPAD_PURPLE_HOVERED;
|
||||
@ -266,9 +254,6 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt
|
||||
if (mapping == nullptr) {
|
||||
return;
|
||||
}
|
||||
if (!mDeviceIndexVisiblity[mapping->GetShipDeviceIndex()]) {
|
||||
return;
|
||||
}
|
||||
|
||||
ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(0.0f, 0.5f));
|
||||
std::string icon = "";
|
||||
@ -287,7 +272,7 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt
|
||||
auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered);
|
||||
auto physicalInputDisplayName =
|
||||
StringHelper::Sprintf("%s %s", icon.c_str(), mapping->GetPhysicalInputName().c_str());
|
||||
GetButtonColorsForLUSDeviceIndex(mapping->GetShipDeviceIndex(), buttonColor, buttonHoveredColor);
|
||||
GetButtonColorsForDeviceType(mapping->GetPhysicalDeviceType(), buttonColor, buttonHoveredColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, buttonColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor);
|
||||
auto popupId = StringHelper::Sprintf("editButtonMappingPopup##%s", id.c_str());
|
||||
@ -324,19 +309,12 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt
|
||||
ImGui::PopStyleVar();
|
||||
ImGui::SameLine(0, 0);
|
||||
|
||||
#ifndef __WIIU__
|
||||
auto sdlAxisDirectionToButtonMapping = std::dynamic_pointer_cast<Ship::SDLAxisDirectionToButtonMapping>(mapping);
|
||||
auto indexMapping = Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetDeviceIndexMappingManager()
|
||||
->GetDeviceIndexMappingFromShipDeviceIndex(mapping->GetShipDeviceIndex());
|
||||
auto sdlIndexMapping = std::dynamic_pointer_cast<Ship::ShipDeviceIndexToSDLDeviceIndexMapping>(indexMapping);
|
||||
|
||||
if (sdlIndexMapping != nullptr && sdlAxisDirectionToButtonMapping != nullptr) {
|
||||
if (sdlAxisDirectionToButtonMapping != nullptr) {
|
||||
ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(0.0f, 0.5f));
|
||||
auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button);
|
||||
auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered);
|
||||
GetButtonColorsForLUSDeviceIndex(mapping->GetShipDeviceIndex(), buttonColor, buttonHoveredColor);
|
||||
GetButtonColorsForDeviceType(mapping->GetPhysicalDeviceType(), buttonColor, buttonHoveredColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, buttonColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor);
|
||||
ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(1.0f, 0.5f));
|
||||
@ -357,17 +335,19 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt
|
||||
ImGui::Text("Axis Threshold\n\nThe extent to which the joystick\nmust be moved or the trigger\npressed to "
|
||||
"initiate the assigned\nbutton action.\n\n");
|
||||
|
||||
auto globalSettings = Ship::Context::GetInstance()->GetControlDeck()->GetGlobalSDLDeviceSettings();
|
||||
|
||||
if (sdlAxisDirectionToButtonMapping->AxisIsStick()) {
|
||||
ImGui::Text("Stick axis threshold:");
|
||||
|
||||
int32_t stickAxisThreshold = sdlIndexMapping->GetStickAxisThresholdPercentage();
|
||||
int32_t stickAxisThreshold = globalSettings->GetStickAxisThresholdPercentage();
|
||||
if (stickAxisThreshold == 0) {
|
||||
ImGui::BeginDisabled();
|
||||
}
|
||||
ImGui::PushButtonRepeat(true);
|
||||
if (ImGui::Button(StringHelper::Sprintf("-##Stick Axis Threshold%s", id.c_str()).c_str())) {
|
||||
sdlIndexMapping->SetStickAxisThresholdPercentage(stickAxisThreshold - 1);
|
||||
sdlIndexMapping->SaveToConfig();
|
||||
globalSettings->SetStickAxisThresholdPercentage(stickAxisThreshold - 1);
|
||||
globalSettings->SaveToConfig();
|
||||
}
|
||||
ImGui::PopButtonRepeat();
|
||||
if (stickAxisThreshold == 0) {
|
||||
@ -377,8 +357,8 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt
|
||||
ImGui::SetNextItemWidth(SCALE_IMGUI_SIZE(160.0f));
|
||||
if (ImGui::SliderInt(StringHelper::Sprintf("##Stick Axis Threshold%s", id.c_str()).c_str(),
|
||||
&stickAxisThreshold, 0, 100, "%d%%", ImGuiSliderFlags_AlwaysClamp)) {
|
||||
sdlIndexMapping->SetStickAxisThresholdPercentage(stickAxisThreshold);
|
||||
sdlIndexMapping->SaveToConfig();
|
||||
globalSettings->SetStickAxisThresholdPercentage(stickAxisThreshold);
|
||||
globalSettings->SaveToConfig();
|
||||
}
|
||||
ImGui::SameLine(0.0f, 0.0f);
|
||||
if (stickAxisThreshold == 100) {
|
||||
@ -386,8 +366,8 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt
|
||||
}
|
||||
ImGui::PushButtonRepeat(true);
|
||||
if (ImGui::Button(StringHelper::Sprintf("+##Stick Axis Threshold%s", id.c_str()).c_str())) {
|
||||
sdlIndexMapping->SetStickAxisThresholdPercentage(stickAxisThreshold + 1);
|
||||
sdlIndexMapping->SaveToConfig();
|
||||
globalSettings->SetStickAxisThresholdPercentage(stickAxisThreshold + 1);
|
||||
globalSettings->SaveToConfig();
|
||||
}
|
||||
ImGui::PopButtonRepeat();
|
||||
if (stickAxisThreshold == 100) {
|
||||
@ -398,14 +378,14 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt
|
||||
if (sdlAxisDirectionToButtonMapping->AxisIsTrigger()) {
|
||||
ImGui::Text("Trigger axis threshold:");
|
||||
|
||||
int32_t triggerAxisThreshold = sdlIndexMapping->GetTriggerAxisThresholdPercentage();
|
||||
int32_t triggerAxisThreshold = globalSettings->GetTriggerAxisThresholdPercentage();
|
||||
if (triggerAxisThreshold == 0) {
|
||||
ImGui::BeginDisabled();
|
||||
}
|
||||
ImGui::PushButtonRepeat(true);
|
||||
if (ImGui::Button(StringHelper::Sprintf("-##Trigger Axis Threshold%s", id.c_str()).c_str())) {
|
||||
sdlIndexMapping->SetTriggerAxisThresholdPercentage(triggerAxisThreshold - 1);
|
||||
sdlIndexMapping->SaveToConfig();
|
||||
globalSettings->SetTriggerAxisThresholdPercentage(triggerAxisThreshold - 1);
|
||||
globalSettings->SaveToConfig();
|
||||
}
|
||||
ImGui::PopButtonRepeat();
|
||||
if (triggerAxisThreshold == 0) {
|
||||
@ -415,8 +395,8 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt
|
||||
ImGui::SetNextItemWidth(SCALE_IMGUI_SIZE(160.0f));
|
||||
if (ImGui::SliderInt(StringHelper::Sprintf("##Trigger Axis Threshold%s", id.c_str()).c_str(),
|
||||
&triggerAxisThreshold, 0, 100, "%d%%", ImGuiSliderFlags_AlwaysClamp)) {
|
||||
sdlIndexMapping->SetTriggerAxisThresholdPercentage(triggerAxisThreshold);
|
||||
sdlIndexMapping->SaveToConfig();
|
||||
globalSettings->SetTriggerAxisThresholdPercentage(triggerAxisThreshold);
|
||||
globalSettings->SaveToConfig();
|
||||
}
|
||||
ImGui::SameLine(0.0f, 0.0f);
|
||||
if (triggerAxisThreshold == 100) {
|
||||
@ -424,8 +404,8 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt
|
||||
}
|
||||
ImGui::PushButtonRepeat(true);
|
||||
if (ImGui::Button(StringHelper::Sprintf("+##Trigger Axis Threshold%s", id.c_str()).c_str())) {
|
||||
sdlIndexMapping->SetTriggerAxisThresholdPercentage(triggerAxisThreshold + 1);
|
||||
sdlIndexMapping->SaveToConfig();
|
||||
globalSettings->SetTriggerAxisThresholdPercentage(triggerAxisThreshold + 1);
|
||||
globalSettings->SaveToConfig();
|
||||
}
|
||||
ImGui::PopButtonRepeat();
|
||||
if (triggerAxisThreshold == 100) {
|
||||
@ -444,7 +424,6 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt
|
||||
ImGui::PopStyleVar();
|
||||
ImGui::SameLine(0, 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, buttonColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor);
|
||||
@ -539,9 +518,6 @@ void SohInputEditorWindow::DrawStickDirectionLineEditMappingButton(uint8_t port,
|
||||
if (mapping == nullptr) {
|
||||
return;
|
||||
}
|
||||
if (!mDeviceIndexVisiblity[mapping->GetShipDeviceIndex()]) {
|
||||
return;
|
||||
}
|
||||
|
||||
ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(0.0f, 0.5f));
|
||||
std::string icon = "";
|
||||
@ -560,7 +536,7 @@ void SohInputEditorWindow::DrawStickDirectionLineEditMappingButton(uint8_t port,
|
||||
auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered);
|
||||
auto physicalInputDisplayName =
|
||||
StringHelper::Sprintf("%s %s", icon.c_str(), mapping->GetPhysicalInputName().c_str());
|
||||
GetButtonColorsForLUSDeviceIndex(mapping->GetShipDeviceIndex(), buttonColor, buttonHoveredColor);
|
||||
GetButtonColorsForDeviceType(mapping->GetPhysicalDeviceType(), buttonColor, buttonHoveredColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, buttonColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor);
|
||||
auto popupId = StringHelper::Sprintf("editStickDirectionMappingPopup##%s", id.c_str());
|
||||
@ -885,7 +861,7 @@ void SohInputEditorWindow::DrawRumbleSection(uint8_t port) {
|
||||
ImGui::SetNextItemOpen(true, ImGuiCond_Once);
|
||||
auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button);
|
||||
auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered);
|
||||
GetButtonColorsForLUSDeviceIndex(mapping->GetShipDeviceIndex(), buttonColor, buttonHoveredColor);
|
||||
GetButtonColorsForDeviceType(mapping->GetPhysicalDeviceType(), buttonColor, buttonHoveredColor);
|
||||
// begin hackaround https://github.com/ocornut/imgui/issues/282#issuecomment-123763192
|
||||
// spaces to have background color for text in a tree node
|
||||
std::string spaces = "";
|
||||
@ -1256,209 +1232,6 @@ void SohInputEditorWindow::DrawGyroSection(uint8_t port) {
|
||||
}
|
||||
}
|
||||
|
||||
void SohInputEditorWindow::DrawButtonDeviceIcons(uint8_t portIndex, std::set<N64ButtonMask> bitmasks) {
|
||||
std::set<Ship::ShipDeviceIndex> allLusDeviceIndices;
|
||||
allLusDeviceIndices.insert(Ship::ShipDeviceIndex::Keyboard);
|
||||
for (auto [lusIndex, mapping] : Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetDeviceIndexMappingManager()
|
||||
->GetAllDeviceIndexMappingsFromConfig()) {
|
||||
allLusDeviceIndices.insert(lusIndex);
|
||||
}
|
||||
|
||||
std::vector<std::pair<Ship::ShipDeviceIndex, bool>> lusDeviceIndiciesWithMappings;
|
||||
for (auto lusIndex : allLusDeviceIndices) {
|
||||
for (auto [bitmask, button] :
|
||||
Ship::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->GetAllButtons()) {
|
||||
if (!bitmasks.contains(bitmask)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (button->HasMappingsForShipDeviceIndex(lusIndex)) {
|
||||
for (auto [id, mapping] : button->GetAllButtonMappings()) {
|
||||
if (mapping->GetShipDeviceIndex() == lusIndex) {
|
||||
lusDeviceIndiciesWithMappings.push_back(
|
||||
std::pair<Ship::ShipDeviceIndex, bool>(lusIndex, mapping->PhysicalDeviceIsConnected()));
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (auto [lusIndex, connected] : lusDeviceIndiciesWithMappings) {
|
||||
auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button);
|
||||
auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered);
|
||||
GetButtonColorsForLUSDeviceIndex(lusIndex, buttonColor, buttonHoveredColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, buttonColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor);
|
||||
ImGui::SameLine();
|
||||
if (lusIndex == Ship::ShipDeviceIndex::Keyboard) {
|
||||
ImGui::SmallButton(ICON_FA_KEYBOARD_O);
|
||||
} else {
|
||||
ImGui::SmallButton(connected ? ICON_FA_GAMEPAD : ICON_FA_CHAIN_BROKEN);
|
||||
}
|
||||
ImGui::PopStyleColor();
|
||||
ImGui::PopStyleColor();
|
||||
}
|
||||
}
|
||||
|
||||
void SohInputEditorWindow::DrawAnalogStickDeviceIcons(uint8_t portIndex, Ship::StickIndex stickIndex) {
|
||||
std::set<Ship::ShipDeviceIndex> allLusDeviceIndices;
|
||||
allLusDeviceIndices.insert(Ship::ShipDeviceIndex::Keyboard);
|
||||
for (auto [lusIndex, mapping] : Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetDeviceIndexMappingManager()
|
||||
->GetAllDeviceIndexMappingsFromConfig()) {
|
||||
allLusDeviceIndices.insert(lusIndex);
|
||||
}
|
||||
|
||||
std::vector<std::pair<Ship::ShipDeviceIndex, bool>> lusDeviceIndiciesWithMappings;
|
||||
for (auto lusIndex : allLusDeviceIndices) {
|
||||
auto controllerStick =
|
||||
stickIndex == Ship::StickIndex::LEFT_STICK
|
||||
? Ship::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->GetLeftStick()
|
||||
: Ship::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->GetRightStick();
|
||||
if (controllerStick->HasMappingsForShipDeviceIndex(lusIndex)) {
|
||||
for (auto [direction, mappings] : controllerStick->GetAllAxisDirectionMappings()) {
|
||||
bool foundMapping = false;
|
||||
for (auto [id, mapping] : mappings) {
|
||||
if (mapping->GetShipDeviceIndex() == lusIndex) {
|
||||
foundMapping = true;
|
||||
lusDeviceIndiciesWithMappings.push_back(
|
||||
std::pair<Ship::ShipDeviceIndex, bool>(lusIndex, mapping->PhysicalDeviceIsConnected()));
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (foundMapping) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (auto [lusIndex, connected] : lusDeviceIndiciesWithMappings) {
|
||||
auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button);
|
||||
auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered);
|
||||
GetButtonColorsForLUSDeviceIndex(lusIndex, buttonColor, buttonHoveredColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, buttonColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor);
|
||||
ImGui::SameLine();
|
||||
if (lusIndex == Ship::ShipDeviceIndex::Keyboard) {
|
||||
ImGui::SmallButton(ICON_FA_KEYBOARD_O);
|
||||
} else {
|
||||
ImGui::SmallButton(connected ? ICON_FA_GAMEPAD : ICON_FA_CHAIN_BROKEN);
|
||||
}
|
||||
ImGui::PopStyleColor();
|
||||
ImGui::PopStyleColor();
|
||||
}
|
||||
}
|
||||
|
||||
void SohInputEditorWindow::DrawRumbleDeviceIcons(uint8_t portIndex) {
|
||||
std::set<Ship::ShipDeviceIndex> allLusDeviceIndices;
|
||||
for (auto [lusIndex, mapping] : Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetDeviceIndexMappingManager()
|
||||
->GetAllDeviceIndexMappingsFromConfig()) {
|
||||
allLusDeviceIndices.insert(lusIndex);
|
||||
}
|
||||
|
||||
std::vector<std::pair<Ship::ShipDeviceIndex, bool>> lusDeviceIndiciesWithMappings;
|
||||
for (auto lusIndex : allLusDeviceIndices) {
|
||||
if (Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetControllerByPort(portIndex)
|
||||
->GetRumble()
|
||||
->HasMappingsForShipDeviceIndex(lusIndex)) {
|
||||
for (auto [id, mapping] : Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetControllerByPort(portIndex)
|
||||
->GetRumble()
|
||||
->GetAllRumbleMappings()) {
|
||||
if (mapping->GetShipDeviceIndex() == lusIndex) {
|
||||
lusDeviceIndiciesWithMappings.push_back(
|
||||
std::pair<Ship::ShipDeviceIndex, bool>(lusIndex, mapping->PhysicalDeviceIsConnected()));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (auto [lusIndex, connected] : lusDeviceIndiciesWithMappings) {
|
||||
auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button);
|
||||
auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered);
|
||||
GetButtonColorsForLUSDeviceIndex(lusIndex, buttonColor, buttonHoveredColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, buttonColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor);
|
||||
ImGui::SameLine();
|
||||
ImGui::SmallButton(connected ? ICON_FA_GAMEPAD : ICON_FA_CHAIN_BROKEN);
|
||||
ImGui::PopStyleColor();
|
||||
ImGui::PopStyleColor();
|
||||
}
|
||||
}
|
||||
|
||||
void SohInputEditorWindow::DrawGyroDeviceIcons(uint8_t portIndex) {
|
||||
auto mapping =
|
||||
Ship::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->GetGyro()->GetGyroMapping();
|
||||
if (mapping == nullptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button);
|
||||
auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered);
|
||||
GetButtonColorsForLUSDeviceIndex(mapping->GetShipDeviceIndex(), buttonColor, buttonHoveredColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, buttonColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor);
|
||||
ImGui::SameLine();
|
||||
ImGui::SmallButton(mapping->PhysicalDeviceIsConnected() ? ICON_FA_GAMEPAD : ICON_FA_CHAIN_BROKEN);
|
||||
ImGui::PopStyleColor();
|
||||
ImGui::PopStyleColor();
|
||||
}
|
||||
|
||||
void SohInputEditorWindow::DrawLEDDeviceIcons(uint8_t portIndex) {
|
||||
std::set<Ship::ShipDeviceIndex> allLusDeviceIndices;
|
||||
for (auto [lusIndex, mapping] : Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetDeviceIndexMappingManager()
|
||||
->GetAllDeviceIndexMappingsFromConfig()) {
|
||||
allLusDeviceIndices.insert(lusIndex);
|
||||
}
|
||||
|
||||
std::vector<std::pair<Ship::ShipDeviceIndex, bool>> lusDeviceIndiciesWithMappings;
|
||||
for (auto lusIndex : allLusDeviceIndices) {
|
||||
if (Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetControllerByPort(portIndex)
|
||||
->GetRumble()
|
||||
->HasMappingsForShipDeviceIndex(lusIndex)) {
|
||||
for (auto [id, mapping] : Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetControllerByPort(portIndex)
|
||||
->GetLED()
|
||||
->GetAllLEDMappings()) {
|
||||
if (mapping->GetShipDeviceIndex() == lusIndex) {
|
||||
lusDeviceIndiciesWithMappings.push_back(
|
||||
std::pair<Ship::ShipDeviceIndex, bool>(lusIndex, mapping->PhysicalDeviceIsConnected()));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (auto [lusIndex, connected] : lusDeviceIndiciesWithMappings) {
|
||||
auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button);
|
||||
auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered);
|
||||
GetButtonColorsForLUSDeviceIndex(lusIndex, buttonColor, buttonHoveredColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, buttonColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor);
|
||||
ImGui::SameLine();
|
||||
ImGui::SmallButton(connected ? ICON_FA_GAMEPAD : ICON_FA_CHAIN_BROKEN);
|
||||
ImGui::PopStyleColor();
|
||||
ImGui::PopStyleColor();
|
||||
}
|
||||
}
|
||||
|
||||
const ImGuiTableFlags PANEL_TABLE_FLAGS =
|
||||
ImGuiTableFlags_BordersH |
|
||||
ImGuiTableFlags_BordersV;
|
||||
@ -1651,66 +1424,52 @@ void SohInputEditorWindow::DrawDpadControlPanel() {
|
||||
Ship::GuiWindow::EndGroupPanel(0);
|
||||
}
|
||||
|
||||
void SohInputEditorWindow::DrawDeviceVisibilityButtons() {
|
||||
std::map<Ship::ShipDeviceIndex, std::pair<std::string, int32_t>> indexMappings;
|
||||
for (auto [lusIndex, mapping] : Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetDeviceIndexMappingManager()
|
||||
->GetAllDeviceIndexMappingsFromConfig()) {
|
||||
auto sdlIndexMapping = std::static_pointer_cast<Ship::ShipDeviceIndexToSDLDeviceIndexMapping>(mapping);
|
||||
if (sdlIndexMapping == nullptr) {
|
||||
continue;
|
||||
}
|
||||
|
||||
indexMappings[lusIndex] = { sdlIndexMapping->GetSDLControllerName(), -1 };
|
||||
}
|
||||
|
||||
for (auto [lusIndex, mapping] : Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetDeviceIndexMappingManager()
|
||||
->GetAllDeviceIndexMappings()) {
|
||||
auto sdlIndexMapping = std::static_pointer_cast<Ship::ShipDeviceIndexToSDLDeviceIndexMapping>(mapping);
|
||||
if (sdlIndexMapping == nullptr) {
|
||||
continue;
|
||||
}
|
||||
|
||||
indexMappings[lusIndex] = { sdlIndexMapping->GetSDLControllerName(), sdlIndexMapping->GetSDLDeviceIndex() };
|
||||
}
|
||||
void SohInputEditorWindow::DrawDeviceToggles(uint8_t portIndex) {
|
||||
ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true);
|
||||
|
||||
auto keyboardButtonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button);
|
||||
auto keyboardButtonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered);
|
||||
GetButtonColorsForLUSDeviceIndex(Ship::ShipDeviceIndex::Keyboard, keyboardButtonColor, keyboardButtonHoveredColor);
|
||||
GetButtonColorsForDeviceType(Ship::PhysicalDeviceType::Keyboard, keyboardButtonColor, keyboardButtonHoveredColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, keyboardButtonColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, keyboardButtonHoveredColor);
|
||||
bool keyboardVisible = mDeviceIndexVisiblity[Ship::ShipDeviceIndex::Keyboard];
|
||||
if(ImGui::Button(
|
||||
StringHelper::Sprintf("%s %s Keyboard", keyboardVisible ? ICON_FA_EYE : ICON_FA_EYE_SLASH, ICON_FA_KEYBOARD_O)
|
||||
.c_str())) {
|
||||
mDeviceIndexVisiblity[Ship::ShipDeviceIndex::Keyboard] = !keyboardVisible;
|
||||
}
|
||||
ImGui::Button(StringHelper::Sprintf("%s Keyboard", ICON_FA_KEYBOARD_O).c_str());
|
||||
ImGui::PopStyleColor();
|
||||
ImGui::PopStyleColor();
|
||||
|
||||
auto mouseButtonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button);
|
||||
auto mouseButtonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered);
|
||||
GetButtonColorsForDeviceType(Ship::PhysicalDeviceType::Mouse, mouseButtonColor, mouseButtonHoveredColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, mouseButtonColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, mouseButtonHoveredColor);
|
||||
ImGui::Button(StringHelper::Sprintf("%s Mouse", ICON_FA_KEYBOARD_O).c_str());
|
||||
ImGui::PopStyleColor();
|
||||
ImGui::PopStyleColor();
|
||||
|
||||
for (auto [lusIndex, info] : indexMappings) {
|
||||
auto [name, sdlIndex] = info;
|
||||
bool connected = sdlIndex != -1;
|
||||
ImGui::PopItemFlag();
|
||||
|
||||
auto connectedDeviceManager = Ship::Context::GetInstance()->GetControlDeck()->GetConnectedPhysicalDeviceManager();
|
||||
for (const auto& [instanceId, name] : connectedDeviceManager->GetConnectedSDLGamepadNames()) {
|
||||
ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true);
|
||||
auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button);
|
||||
auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered);
|
||||
GetButtonColorsForLUSDeviceIndex(lusIndex, buttonColor, buttonHoveredColor);
|
||||
|
||||
GetButtonColorsForDeviceType(Ship::PhysicalDeviceType::SDLGamepad, buttonColor, buttonHoveredColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, buttonColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor);
|
||||
bool visible = mDeviceIndexVisiblity[lusIndex];
|
||||
if(ImGui::Button(
|
||||
StringHelper::Sprintf("%s %s %s (%s)", visible ? ICON_FA_EYE : ICON_FA_EYE_SLASH, connected ? ICON_FA_GAMEPAD : ICON_FA_CHAIN_BROKEN, name.c_str(),
|
||||
connected ? StringHelper::Sprintf("SDL %d", sdlIndex).c_str() : "Disconnected")
|
||||
.c_str())) {
|
||||
mDeviceIndexVisiblity[lusIndex] = !visible;
|
||||
}
|
||||
auto notIgnored = !connectedDeviceManager->PortIsIgnoringInstanceId(portIndex, instanceId);
|
||||
ImGui::PopItemFlag();
|
||||
if(ImGui::Checkbox(StringHelper::Sprintf("###instanceId_%d", instanceId).c_str(), ¬Ignored)) {
|
||||
if (notIgnored) {
|
||||
connectedDeviceManager->UnignoreInstanceIdForPort(portIndex, instanceId);
|
||||
} else {
|
||||
connectedDeviceManager->IgnoreInstanceIdForPort(portIndex, instanceId);
|
||||
}
|
||||
};
|
||||
ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true);
|
||||
ImGui::SameLine();
|
||||
ImGui::Button(StringHelper::Sprintf("%s %s (SDL)", ICON_FA_GAMEPAD, name.c_str()).c_str());
|
||||
ImGui::PopStyleColor();
|
||||
ImGui::PopStyleColor();
|
||||
ImGui::PopItemFlag();
|
||||
}
|
||||
}
|
||||
|
||||
@ -1719,7 +1478,7 @@ void SohInputEditorWindow::DrawLinkTab() {
|
||||
if (ImGui::BeginTabItem(StringHelper::Sprintf("Link (P1)###port%d", portIndex).c_str())) {
|
||||
DrawClearAllButton(portIndex);
|
||||
DrawSetDefaultsButton(portIndex);
|
||||
DrawDeviceVisibilityButtons();
|
||||
DrawDeviceToggles(portIndex);
|
||||
|
||||
UpdateBitmaskToMappingIds(portIndex);
|
||||
UpdateStickDirectionToMappingIds(portIndex);
|
||||
@ -1729,7 +1488,6 @@ void SohInputEditorWindow::DrawLinkTab() {
|
||||
ImGui::PushStyleColor(ImGuiCol_HeaderActive, ImVec4(0.0f, 0.0f, 0.0f, 1.0f));
|
||||
|
||||
if (ImGui::CollapsingHeader("Buttons", NULL, ImGuiTreeNodeFlags_DefaultOpen)) {
|
||||
DrawButtonDeviceIcons(portIndex, mButtonsBitmasks);
|
||||
DrawButtonLine("A", portIndex, BTN_A, CHIP_COLOR_N64_BLUE);
|
||||
DrawButtonLine("B", portIndex, BTN_B, CHIP_COLOR_N64_GREEN);
|
||||
DrawButtonLine("Start", portIndex, BTN_START, CHIP_COLOR_N64_RED);
|
||||
@ -1744,57 +1502,36 @@ void SohInputEditorWindow::DrawLinkTab() {
|
||||
CHIP_COLOR_N64_YELLOW);
|
||||
DrawButtonLine(StringHelper::Sprintf("C %s", ICON_FA_ARROW_RIGHT).c_str(), portIndex, BTN_CRIGHT,
|
||||
CHIP_COLOR_N64_YELLOW);
|
||||
} else {
|
||||
DrawButtonDeviceIcons(portIndex, mButtonsBitmasks);
|
||||
}
|
||||
|
||||
if (ImGui::CollapsingHeader("D-Pad", NULL, ImGuiTreeNodeFlags_DefaultOpen)) {
|
||||
DrawButtonDeviceIcons(portIndex, mDpadBitmasks);
|
||||
DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_UP).c_str(), portIndex, BTN_DUP);
|
||||
DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_DOWN).c_str(), portIndex, BTN_DDOWN);
|
||||
DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_LEFT).c_str(), portIndex, BTN_DLEFT);
|
||||
DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_RIGHT).c_str(), portIndex, BTN_DRIGHT);
|
||||
} else {
|
||||
DrawButtonDeviceIcons(portIndex, mDpadBitmasks);
|
||||
}
|
||||
|
||||
if (ImGui::CollapsingHeader("Analog Stick", NULL, ImGuiTreeNodeFlags_DefaultOpen)) {
|
||||
DrawAnalogStickDeviceIcons(portIndex, Ship::LEFT_STICK);
|
||||
DrawStickSection(portIndex, Ship::LEFT, 0);
|
||||
} else {
|
||||
DrawAnalogStickDeviceIcons(portIndex, Ship::LEFT_STICK);
|
||||
}
|
||||
|
||||
if (ImGui::CollapsingHeader("Additional (\"Right\") Stick")) {
|
||||
DrawAnalogStickDeviceIcons(portIndex, Ship::RIGHT_STICK);
|
||||
DrawStickSection(portIndex, Ship::RIGHT, 1, CHIP_COLOR_N64_YELLOW);
|
||||
} else {
|
||||
DrawAnalogStickDeviceIcons(portIndex, Ship::RIGHT_STICK);
|
||||
}
|
||||
|
||||
if (ImGui::CollapsingHeader("Rumble")) {
|
||||
DrawRumbleDeviceIcons(portIndex);
|
||||
DrawRumbleSection(portIndex);
|
||||
} else {
|
||||
DrawRumbleDeviceIcons(portIndex);
|
||||
}
|
||||
|
||||
if (ImGui::CollapsingHeader("Gyro")) {
|
||||
DrawGyroDeviceIcons(portIndex);
|
||||
DrawGyroSection(portIndex);
|
||||
} else {
|
||||
DrawGyroDeviceIcons(portIndex);
|
||||
}
|
||||
|
||||
if (ImGui::CollapsingHeader("LEDs")) {
|
||||
DrawLEDDeviceIcons(portIndex);
|
||||
DrawLEDSection(portIndex);
|
||||
} else {
|
||||
DrawLEDDeviceIcons(portIndex);
|
||||
}
|
||||
|
||||
if (ImGui::CollapsingHeader("Modifier Buttons")) {
|
||||
DrawButtonDeviceIcons(portIndex, mModifierButtonsBitmasks);
|
||||
DrawButtonLine("M1", portIndex, BTN_CUSTOM_MODIFIER1);
|
||||
DrawButtonLine("M2", portIndex, BTN_CUSTOM_MODIFIER2);
|
||||
|
||||
@ -1827,15 +1564,10 @@ void SohInputEditorWindow::DrawLinkTab() {
|
||||
Ship::GuiWindow::EndGroupPanel(0);
|
||||
}
|
||||
ImGui::EndDisabled();
|
||||
} else {
|
||||
DrawButtonDeviceIcons(portIndex, mModifierButtonsBitmasks);
|
||||
}
|
||||
|
||||
if (ImGui::CollapsingHeader("Ocarina Controls")) {
|
||||
DrawButtonDeviceIcons(portIndex, mCustomOcarinaButtonsBitmasks);
|
||||
DrawOcarinaControlPanel();
|
||||
} else {
|
||||
DrawButtonDeviceIcons(portIndex, mCustomOcarinaButtonsBitmasks);
|
||||
}
|
||||
|
||||
if (ImGui::CollapsingHeader("Camera Controls")) {
|
||||
@ -1875,7 +1607,7 @@ void SohInputEditorWindow::DrawIvanTab() {
|
||||
if (ImGui::BeginTabItem(StringHelper::Sprintf("Ivan (P2)###port%d", portIndex).c_str())) {
|
||||
DrawClearAllButton(portIndex);
|
||||
DrawSetDefaultsButton(portIndex);
|
||||
DrawDeviceVisibilityButtons();
|
||||
DrawDeviceToggles(portIndex);
|
||||
|
||||
UpdateBitmaskToMappingIds(portIndex);
|
||||
UpdateStickDirectionToMappingIds(portIndex);
|
||||
@ -1885,7 +1617,6 @@ void SohInputEditorWindow::DrawIvanTab() {
|
||||
ImGui::PushStyleColor(ImGuiCol_HeaderActive, ImVec4(0.0f, 0.0f, 0.0f, 1.0f));
|
||||
|
||||
if (ImGui::CollapsingHeader("Buttons", NULL, ImGuiTreeNodeFlags_DefaultOpen)) {
|
||||
DrawButtonDeviceIcons(portIndex, mButtonsBitmasks);
|
||||
DrawButtonLine("A", portIndex, BTN_A, CHIP_COLOR_N64_BLUE);
|
||||
DrawButtonLine("B", portIndex, BTN_B, CHIP_COLOR_N64_GREEN);
|
||||
DrawButtonLine("Z", portIndex, BTN_Z);
|
||||
@ -1897,25 +1628,17 @@ void SohInputEditorWindow::DrawIvanTab() {
|
||||
CHIP_COLOR_N64_YELLOW);
|
||||
DrawButtonLine(StringHelper::Sprintf("C %s", ICON_FA_ARROW_RIGHT).c_str(), portIndex, BTN_CRIGHT,
|
||||
CHIP_COLOR_N64_YELLOW);
|
||||
} else {
|
||||
DrawButtonDeviceIcons(portIndex, mButtonsBitmasks);
|
||||
}
|
||||
|
||||
if (ImGui::CollapsingHeader("D-Pad", NULL, ImGuiTreeNodeFlags_DefaultOpen)) {
|
||||
DrawButtonDeviceIcons(portIndex, mDpadBitmasks);
|
||||
DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_UP).c_str(), portIndex, BTN_DUP);
|
||||
DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_DOWN).c_str(), portIndex, BTN_DDOWN);
|
||||
DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_LEFT).c_str(), portIndex, BTN_DLEFT);
|
||||
DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_RIGHT).c_str(), portIndex, BTN_DRIGHT);
|
||||
} else {
|
||||
DrawButtonDeviceIcons(portIndex, mDpadBitmasks);
|
||||
}
|
||||
|
||||
if (ImGui::CollapsingHeader("Analog Stick", NULL, ImGuiTreeNodeFlags_DefaultOpen)) {
|
||||
DrawAnalogStickDeviceIcons(portIndex, Ship::LEFT_STICK);
|
||||
DrawStickSection(portIndex, Ship::LEFT, 0);
|
||||
} else {
|
||||
DrawAnalogStickDeviceIcons(portIndex, Ship::LEFT_STICK);
|
||||
}
|
||||
|
||||
ImGui::PopStyleColor();
|
||||
@ -1931,7 +1654,7 @@ void SohInputEditorWindow::DrawDebugPortTab(uint8_t portIndex, std::string custo
|
||||
: customName.c_str())) {
|
||||
DrawClearAllButton(portIndex);
|
||||
DrawSetDefaultsButton(portIndex);
|
||||
DrawDeviceVisibilityButtons();
|
||||
DrawDeviceToggles(portIndex);
|
||||
|
||||
UpdateBitmaskToMappingIds(portIndex);
|
||||
UpdateStickDirectionToMappingIds(portIndex);
|
||||
@ -1941,7 +1664,6 @@ void SohInputEditorWindow::DrawDebugPortTab(uint8_t portIndex, std::string custo
|
||||
ImGui::PushStyleColor(ImGuiCol_HeaderActive, ImVec4(0.0f, 0.0f, 0.0f, 1.0f));
|
||||
|
||||
if (ImGui::CollapsingHeader("Buttons", NULL, ImGuiTreeNodeFlags_DefaultOpen)) {
|
||||
DrawButtonDeviceIcons(portIndex, mButtonsBitmasks);
|
||||
DrawButtonLine("A", portIndex, BTN_A, CHIP_COLOR_N64_BLUE);
|
||||
DrawButtonLine("B", portIndex, BTN_B, CHIP_COLOR_N64_GREEN);
|
||||
DrawButtonLine("Start", portIndex, BTN_START, CHIP_COLOR_N64_RED);
|
||||
@ -1956,25 +1678,16 @@ void SohInputEditorWindow::DrawDebugPortTab(uint8_t portIndex, std::string custo
|
||||
CHIP_COLOR_N64_YELLOW);
|
||||
DrawButtonLine(StringHelper::Sprintf("C %s", ICON_FA_ARROW_RIGHT).c_str(), portIndex, BTN_CRIGHT,
|
||||
CHIP_COLOR_N64_YELLOW);
|
||||
} else {
|
||||
DrawButtonDeviceIcons(portIndex, mButtonsBitmasks);
|
||||
}
|
||||
|
||||
if (ImGui::CollapsingHeader("D-Pad", NULL, ImGuiTreeNodeFlags_DefaultOpen)) {
|
||||
DrawButtonDeviceIcons(portIndex, mDpadBitmasks);
|
||||
DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_UP).c_str(), portIndex, BTN_DUP);
|
||||
DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_DOWN).c_str(), portIndex, BTN_DDOWN);
|
||||
DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_LEFT).c_str(), portIndex, BTN_DLEFT);
|
||||
DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_RIGHT).c_str(), portIndex, BTN_DRIGHT);
|
||||
} else {
|
||||
DrawButtonDeviceIcons(portIndex, mDpadBitmasks);
|
||||
}
|
||||
|
||||
if (ImGui::CollapsingHeader("Analog Stick", NULL, ImGuiTreeNodeFlags_DefaultOpen)) {
|
||||
DrawAnalogStickDeviceIcons(portIndex, Ship::LEFT_STICK);
|
||||
DrawStickSection(portIndex, Ship::LEFT, 0);
|
||||
} else {
|
||||
DrawAnalogStickDeviceIcons(portIndex, Ship::LEFT_STICK);
|
||||
}
|
||||
|
||||
ImGui::PopStyleColor();
|
||||
@ -2010,19 +1723,6 @@ void SohInputEditorWindow::DrawSetDefaultsButton(uint8_t portIndex) {
|
||||
}
|
||||
|
||||
if (ImGui::BeginPopup(popupId.c_str())) {
|
||||
std::map<Ship::ShipDeviceIndex, std::pair<std::string, int32_t>> indexMappings;
|
||||
for (auto [lusIndex, mapping] : Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetDeviceIndexMappingManager()
|
||||
->GetAllDeviceIndexMappings()) {
|
||||
auto sdlIndexMapping = std::static_pointer_cast<Ship::ShipDeviceIndexToSDLDeviceIndexMapping>(mapping);
|
||||
if (sdlIndexMapping == nullptr) {
|
||||
continue;
|
||||
}
|
||||
|
||||
indexMappings[lusIndex] = { sdlIndexMapping->GetSDLControllerName(), sdlIndexMapping->GetSDLDeviceIndex() };
|
||||
}
|
||||
|
||||
bool shouldClose = false;
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, BUTTON_COLOR_KEYBOARD_BEIGE);
|
||||
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, BUTTON_COLOR_KEYBOARD_BEIGE_HOVERED);
|
||||
@ -2041,49 +1741,42 @@ void SohInputEditorWindow::DrawSetDefaultsButton(uint8_t portIndex) {
|
||||
Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetControllerByPort(portIndex)
|
||||
->ClearAllMappingsForDevice(Ship::ShipDeviceIndex::Keyboard);
|
||||
->ClearAllMappingsForDeviceType(Ship::PhysicalDeviceType::Keyboard);
|
||||
Ship::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->AddDefaultMappings(
|
||||
Ship::ShipDeviceIndex::Keyboard);
|
||||
Ship::PhysicalDeviceType::Keyboard);
|
||||
shouldClose = true;
|
||||
ImGui::CloseCurrentPopup();
|
||||
}
|
||||
ImGui::EndPopup();
|
||||
}
|
||||
for (auto [lusIndex, info] : indexMappings) {
|
||||
auto [name, sdlIndex] = info;
|
||||
|
||||
auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button);
|
||||
auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered);
|
||||
GetButtonColorsForLUSDeviceIndex(lusIndex, buttonColor, buttonHoveredColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, buttonColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor);
|
||||
if (ImGui::Button(StringHelper::Sprintf("%s %s (%s)", ICON_FA_GAMEPAD, name.c_str(),
|
||||
StringHelper::Sprintf("SDL %d", sdlIndex).c_str())
|
||||
.c_str())) {
|
||||
ImGui::OpenPopup(StringHelper::Sprintf("Set Defaults for %s", name.c_str()).c_str());
|
||||
auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button);
|
||||
auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered);
|
||||
GetButtonColorsForDeviceType(Ship::PhysicalDeviceType::SDLGamepad, buttonColor, buttonHoveredColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_Button, buttonColor);
|
||||
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor);
|
||||
if (ImGui::Button(StringHelper::Sprintf("%s %s", ICON_FA_GAMEPAD, "Gamepad (SDL)").c_str())) {
|
||||
ImGui::OpenPopup("Set Defaults for Gamepad (SDL)");
|
||||
}
|
||||
ImGui::PopStyleColor();
|
||||
ImGui::PopStyleColor();
|
||||
if (ImGui::BeginPopupModal("Set Defaults for Gamepad (SDL)", NULL, ImGuiWindowFlags_AlwaysAutoResize)) {
|
||||
ImGui::Text("This will clear all existing mappings for\nGamepad (SDL) on port %d.\n\nContinue?", portIndex + 1);
|
||||
if (ImGui::Button("Cancel")) {
|
||||
shouldClose = true;
|
||||
ImGui::CloseCurrentPopup();
|
||||
}
|
||||
ImGui::PopStyleColor();
|
||||
ImGui::PopStyleColor();
|
||||
if (ImGui::BeginPopupModal(StringHelper::Sprintf("Set Defaults for %s", name.c_str()).c_str(), NULL,
|
||||
ImGuiWindowFlags_AlwaysAutoResize)) {
|
||||
ImGui::Text("This will clear all existing mappings for\n%s (SDL %d) on port %d.\n\nContinue?",
|
||||
name.c_str(), sdlIndex, portIndex + 1);
|
||||
if (ImGui::Button("Cancel")) {
|
||||
shouldClose = true;
|
||||
ImGui::CloseCurrentPopup();
|
||||
}
|
||||
if (ImGui::Button("Set defaults")) {
|
||||
Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetControllerByPort(portIndex)
|
||||
->ClearAllMappingsForDevice(lusIndex);
|
||||
Ship::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->AddDefaultMappings(
|
||||
lusIndex);
|
||||
shouldClose = true;
|
||||
ImGui::CloseCurrentPopup();
|
||||
}
|
||||
ImGui::EndPopup();
|
||||
if (ImGui::Button("Set defaults")) {
|
||||
Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetControllerByPort(portIndex)
|
||||
->ClearAllMappingsForDeviceType(Ship::PhysicalDeviceType::SDLGamepad);
|
||||
Ship::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->AddDefaultMappings(
|
||||
Ship::PhysicalDeviceType::SDLGamepad);
|
||||
shouldClose = true;
|
||||
ImGui::CloseCurrentPopup();
|
||||
}
|
||||
ImGui::EndPopup();
|
||||
}
|
||||
|
||||
if (ImGui::Button("Cancel") || shouldClose) {
|
||||
|
@ -83,7 +83,7 @@ class SohInputEditorWindow : public Ship::GuiWindow {
|
||||
void UpdateBitmaskToMappingIds(uint8_t port);
|
||||
void UpdateStickDirectionToMappingIds(uint8_t port);
|
||||
|
||||
void GetButtonColorsForLUSDeviceIndex(Ship::ShipDeviceIndex lusIndex, ImVec4& buttonColor,
|
||||
void GetButtonColorsForDeviceType(Ship::PhysicalDeviceType lusIndex, ImVec4& buttonColor,
|
||||
ImVec4& buttonHoveredColor);
|
||||
void DrawLinkTab();
|
||||
void DrawIvanTab();
|
||||
@ -92,15 +92,9 @@ class SohInputEditorWindow : public Ship::GuiWindow {
|
||||
std::set<N64ButtonMask> mDpadBitmasks;
|
||||
std::set<N64ButtonMask> mModifierButtonsBitmasks;
|
||||
std::set<N64ButtonMask> mCustomOcarinaButtonsBitmasks;
|
||||
void DrawButtonDeviceIcons(uint8_t portIndex, std::set<N64ButtonMask> bitmasks);
|
||||
void DrawAnalogStickDeviceIcons(uint8_t portIndex, Ship::StickIndex stickIndex);
|
||||
void DrawRumbleDeviceIcons(uint8_t portIndex);
|
||||
void DrawGyroDeviceIcons(uint8_t portIndex);
|
||||
void DrawLEDDeviceIcons(uint8_t portIndex);
|
||||
bool mInputEditorPopupOpen;
|
||||
void DrawSetDefaultsButton(uint8_t portIndex);
|
||||
void DrawClearAllButton(uint8_t portIndex);
|
||||
|
||||
std::map<Ship::ShipDeviceIndex, bool> mDeviceIndexVisiblity;
|
||||
void DrawDeviceVisibilityButtons();
|
||||
void DrawDeviceToggles(uint8_t portIndex);
|
||||
};
|
||||
|
@ -341,7 +341,6 @@ OTRGlobals::OTRGlobals() {
|
||||
BTN_CUSTOM_OCARINA_PITCH_DOWN,
|
||||
}));
|
||||
context->InitControlDeck(controlDeck);
|
||||
context->GetControlDeck()->SetSinglePlayerMappingMode(true);
|
||||
|
||||
context->InitCrashHandler();
|
||||
context->InitConsole();
|
||||
@ -1836,17 +1835,25 @@ extern "C" void AudioPlayer_Play(const uint8_t* buf, uint32_t len) {
|
||||
}
|
||||
|
||||
extern "C" int Controller_ShouldRumble(size_t slot) {
|
||||
for (auto [id, mapping] : Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetControllerByPort(static_cast<uint8_t>(slot))
|
||||
->GetRumble()
|
||||
->GetAllRumbleMappings()) {
|
||||
if (mapping->PhysicalDeviceIsConnected()) {
|
||||
return 1;
|
||||
}
|
||||
// don't rumble if we don't have rumble mappings
|
||||
if (Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetControllerByPort(static_cast<uint8_t>(slot))
|
||||
->GetRumble()
|
||||
->GetAllRumbleMappings().empty()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
// don't rumble if we don't have connected gamepads
|
||||
if (Ship::Context::GetInstance()
|
||||
->GetControlDeck()
|
||||
->GetConnectedPhysicalDeviceManager()
|
||||
->GetConnectedSDLGamepadsForPort(slot).empty()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// rumble
|
||||
return 1;
|
||||
}
|
||||
|
||||
extern "C" void* getN64WeirdFrame(s32 i) {
|
||||
|
Loading…
Reference in New Issue
Block a user