// MassBuilderSaveTool // Copyright (C) 2021-2022 Guillaume Jacquemin // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include "../FontAwesome/IconsFontAwesome5.h" #include "../Maps/StyleNames.h" #include "SaveTool.h" void SaveTool::drawFrameInfo() { if(!_currentMass || _currentMass->state() != Mass::State::Valid) { return; } if(!ImGui::BeginChild("##FrameInfo")) { ImGui::EndChild(); return; } ImGui::BeginGroup(); if(ImGui::BeginChild("##JointSliders", {(ImGui::GetContentRegionAvail().x / 2.0f) - (ImGui::GetStyle().WindowPadding.x / 2.0f), 300.0f}, true, ImGuiWindowFlags_MenuBar)) { if(ImGui::BeginMenuBar()) { ImGui::TextUnformatted("Joint sliders"); ImGui::EndMenuBar(); } drawJointSliders(); } ImGui::EndChild(); if(ImGui::BeginChild("##FrameStyles", {(ImGui::GetContentRegionAvail().x / 2.0f) - (ImGui::GetStyle().WindowPadding.x / 2.0f), 0.0f}, true, ImGuiWindowFlags_MenuBar)) { if(ImGui::BeginMenuBar()) { ImGui::TextUnformatted("Frame styles"); ImGui::EndMenuBar(); } drawFrameStyles(); } ImGui::EndChild(); ImGui::EndGroup(); ImGui::SameLine(); if(ImGui::BeginChild("##EyeFlare", {0.0f, 0.0f}, true, ImGuiWindowFlags_MenuBar)) { if(ImGui::BeginMenuBar()) { ImGui::TextUnformatted("Eye flare colour"); drawHelpMarker("Right-click the picker for more options.", 250.0f); ImGui::EndMenuBar(); } drawEyeColourPicker(); } ImGui::EndChild(); ImGui::EndChild(); } void SaveTool::drawJointSliders() { if(!_currentMass || _currentMass->state() != Mass::State::Valid) { return; } ImGui::TextWrapped("In-game values are multiplied by 100.\nFor example, 0.500 here is equal to 50 in-game."); if(ImGui::BeginTable("##JointSliderTable", 2, ImGuiTableFlags_Borders)) { ImGui::TableSetupColumn("##SliderLabel", ImGuiTableColumnFlags_WidthFixed); ImGui::TableSetupColumn("##Sliders", ImGuiTableColumnFlags_WidthStretch); ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); drawAlignedText("Neck"); ImGui::TableSetColumnIndex(1); ImGui::SetNextItemWidth(-1.0f); if(ImGui::SliderFloat("##NeckSlider", &_currentMass->jointSliders().neck, 0.0f, 1.0f)) { _jointsDirty = true; } ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); drawAlignedText("Body"); ImGui::TableSetColumnIndex(1); ImGui::SetNextItemWidth(-1.0f); if(ImGui::SliderFloat("##BodySlider", &_currentMass->jointSliders().body, 0.0f, 1.0f)) { _jointsDirty = true; } ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); drawAlignedText("Shoulders"); ImGui::TableSetColumnIndex(1); ImGui::SetNextItemWidth(-1.0f); if(ImGui::SliderFloat("##ShouldersSlider", &_currentMass->jointSliders().shoulders, 0.0f, 1.0f)) { _jointsDirty = true; } ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); drawAlignedText("Hips"); ImGui::TableSetColumnIndex(1); ImGui::SetNextItemWidth(-1.0f); if(ImGui::SliderFloat("##HipsSlider", &_currentMass->jointSliders().hips, 0.0f, 1.0f)) { _jointsDirty = true; } ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); drawAlignedText("Arms"); ImGui::TableSetColumnIndex(1); ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, ImVec2{2.0f, 1.0f}); if(ImGui::BeginTable("##UpperLowerArmsLayoutTable", 2)) { ImGui::TableSetupColumn("##UpperArms", ImGuiTableColumnFlags_WidthStretch); ImGui::TableSetupColumn("##LowerArms", ImGuiTableColumnFlags_WidthStretch); ImGui::TableNextColumn(); ImGui::SetNextItemWidth(-1.0f); if(ImGui::SliderFloat("##UpperArmsSlider", &_currentMass->jointSliders().upperArms, 0.0f, 1.0f, "Upper: %.3f")) { _jointsDirty = true; } ImGui::TableNextColumn(); ImGui::SetNextItemWidth(-1.0f); if(ImGui::SliderFloat("##LowerArmsSlider", &_currentMass->jointSliders().lowerArms, 0.0f, 1.0f, "Lower: %.3f")) { _jointsDirty = true; } ImGui::EndTable(); } ImGui::PopStyleVar(); ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); drawAlignedText("Legs"); ImGui::TableSetColumnIndex(1); ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, ImVec2{2.0f, 1.0f}); if(ImGui::BeginTable("##UpperLowerLegsLayoutTable", 2)) { ImGui::TableSetupColumn("##UpperLegs", ImGuiTableColumnFlags_WidthStretch); ImGui::TableSetupColumn("##LowerLegs", ImGuiTableColumnFlags_WidthStretch); ImGui::TableNextColumn(); ImGui::SetNextItemWidth(-1.0f); if(ImGui::SliderFloat("##UpperLegsSlider", &_currentMass->jointSliders().upperLegs, 0.0f, 1.0f, "Upper: %.3f")) { _jointsDirty = true; } ImGui::TableNextColumn(); ImGui::SetNextItemWidth(-1.0f); if(ImGui::SliderFloat("##LowerLegsSlider", &_currentMass->jointSliders().lowerLegs, 0.0f, 1.0f, "Lower: %.3f")) { _jointsDirty = true; } ImGui::EndTable(); } ImGui::PopStyleVar(); ImGui::EndTable(); } if(!_jointsDirty) { ImGui::BeginDisabled(); ImGui::Button(ICON_FA_SAVE " Save"); ImGui::SameLine(); ImGui::Button(ICON_FA_UNDO " Reset"); ImGui::EndDisabled(); } else { if(drawUnsafeWidget([]{ return ImGui::Button(ICON_FA_SAVE " Save"); })) { _modifiedBySaveTool = true; if(!_currentMass->writeJointSliders()) { _modifiedBySaveTool = false; _queue.addToast(Toast::Type::Error, _currentMass->lastError()); } _jointsDirty = false; } ImGui::SameLine(); if(ImGui::Button(ICON_FA_UNDO " Reset")) { _currentMass->getJointSliders(); _jointsDirty = false; } } } void SaveTool::drawFrameStyles() { if(!_currentMass || _currentMass->state() != Mass::State::Valid) { return; } for(Int i = 0; i < 4; i++) { drawAlignedText("Slot %d:", i + 1); ImGui::SameLine(); ImGui::PushID(i); if(ImGui::BeginCombo("##Style", getStyleName(_currentMass->frameStyles()[i], _currentMass->frameCustomStyles()).data())) { for(const auto& style : style_names) { if(ImGui::Selectable(getStyleName(style.first, _currentMass->frameCustomStyles()).data(), _currentMass->frameStyles()[i] == style.first)) { _currentMass->frameStyles()[i] = style.first; _stylesDirty = true; } } ImGui::EndCombo(); } ImGui::PopID(); } if(!_stylesDirty) { ImGui::BeginDisabled(); ImGui::Button(ICON_FA_SAVE " Save"); ImGui::SameLine(); ImGui::Button(ICON_FA_UNDO " Reset"); ImGui::EndDisabled(); } else { if(drawUnsafeWidget([]{ return ImGui::Button(ICON_FA_SAVE " Save"); })) { _modifiedBySaveTool = true; if(!_currentMass->writeFrameStyles()) { _modifiedBySaveTool = false; _queue.addToast(Toast::Type::Error, _currentMass->lastError()); } _stylesDirty = false; } ImGui::SameLine(); if(ImGui::Button(ICON_FA_UNDO " Reset")) { _currentMass->getFrameStyles(); _stylesDirty = false; } } } void SaveTool::drawEyeColourPicker() { if(!_currentMass || _currentMass->state() != Mass::State::Valid) { return; } if(ImGui::ColorPicker3("##EyeFlarePicker", &_currentMass->eyeFlareColour().x())) { _eyeFlareDirty = true; } if(!_eyeFlareDirty) { ImGui::BeginDisabled(); ImGui::Button(ICON_FA_SAVE " Save"); ImGui::SameLine(); ImGui::Button(ICON_FA_UNDO " Reset"); ImGui::EndDisabled(); } else { if(drawUnsafeWidget([]{ return ImGui::Button(ICON_FA_SAVE " Save"); })) { _modifiedBySaveTool = true; if(!_currentMass->writeEyeFlareColour()) { _modifiedBySaveTool = false; _queue.addToast(Toast::Type::Error, _currentMass->lastError()); } _eyeFlareDirty = false; } ImGui::SameLine(); if(ImGui::Button(ICON_FA_UNDO " Reset")) { _currentMass->getEyeFlareColour(); _eyeFlareDirty = false; } } } void SaveTool::drawCustomFrameStyles() { if(!_currentMass || _currentMass->state() != Mass::State::Valid) { return; } if(!ImGui::BeginChild("##FrameStyles")) { ImGui::EndChild(); return; } ImGui::TextWrapped("In-game values are multiplied by 100. For example, 0.500 here is equal to 50 in-game."); for(UnsignedInt i = 0; i < _currentMass->frameCustomStyles().size(); i++) { ImGui::PushID(int(i)); DCSResult result; result = drawCustomStyle(_currentMass->frameCustomStyles()[i]); switch(result) { case DCS_ResetStyle: _currentMass->getFrameCustomStyles(); break; case DCS_Save: _modifiedBySaveTool = true; if(!_currentMass->writeFrameCustomStyle(i)) { _modifiedBySaveTool = false; _queue.addToast(Toast::Type::Error, _currentMass->lastError()); } break; default: break; } ImGui::PopID(); } ImGui::EndChild(); }