315 lines
10 KiB
C++
315 lines
10 KiB
C++
// 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 <https://www.gnu.org/licenses/>.
|
|
|
|
#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::GetContentRegionAvailWidth() / 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::GetContentRegionAvailWidth() / 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(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();
|
|
}
|