Compare commits
5 commits
fa81d2428e
...
1421257c4f
Author | SHA1 | Date | |
---|---|---|---|
1421257c4f | |||
df5fa7a39e | |||
c5b4747685 | |||
7ddc8e0748 | |||
7392d961c7 |
13 changed files with 69 additions and 92 deletions
|
@ -136,10 +136,6 @@ SaveTool::SaveTool(const Arguments& arguments):
|
||||||
case Framelimit::HalfVsync:
|
case Framelimit::HalfVsync:
|
||||||
setSwapInterval(2);
|
setSwapInterval(2);
|
||||||
break;
|
break;
|
||||||
case Framelimit::FpsCap:
|
|
||||||
setSwapInterval(0);
|
|
||||||
setMinimalLoopPeriod(1000/_fpsCap);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
curl_global_init(CURL_GLOBAL_DEFAULT);
|
curl_global_init(CURL_GLOBAL_DEFAULT);
|
||||||
|
@ -184,9 +180,8 @@ SaveTool::~SaveTool() {
|
||||||
case Framelimit::HalfVsync:
|
case Framelimit::HalfVsync:
|
||||||
_conf.setValue("frame_limit"_s, "half_vsync"_s);
|
_conf.setValue("frame_limit"_s, "half_vsync"_s);
|
||||||
break;
|
break;
|
||||||
case Framelimit::FpsCap:
|
default:
|
||||||
_conf.setValue<UnsignedInt>("frame_limit"_s, _fpsCap);
|
_conf.setValue("frame_limit"_s, "vsync"_s);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_conf.save();
|
_conf.save();
|
||||||
|
@ -329,11 +324,11 @@ void SaveTool::drawDisclaimer() {
|
||||||
|
|
||||||
ImGui::TextUnformatted("Before you start using the app, there are a few things you should know:");
|
ImGui::TextUnformatted("Before you start using the app, there are a few things you should know:");
|
||||||
|
|
||||||
ImGui::PushTextWrapPos(windowSize().x() * 0.67f);
|
ImGui::PushTextWrapPos(float(windowSize().x()) * 0.67f);
|
||||||
|
|
||||||
ImGui::Bullet();
|
ImGui::Bullet();
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::TextUnformatted("For this application to work properly, it is recommended to disable Steam Cloud syncing for the game. To disable it, right-click the game in your Steam library, click \"Properties\", go to the \"General\" tab, and uncheck \"Keep game saves in the Steam Cloud for M.A.S.S. Builder\".");
|
ImGui::TextUnformatted(R"(For this application to work properly, it is recommended to disable Steam Cloud syncing for the game. To disable it, right-click the game in your Steam library, click "Properties", go to the "General" tab, and uncheck "Keep game saves in the Steam Cloud for M.A.S.S. Builder".)");
|
||||||
|
|
||||||
ImGui::Bullet();
|
ImGui::Bullet();
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
|
|
@ -262,10 +262,8 @@ class SaveTool: public Platform::Sdl2Application, public efsw::FileWatchListener
|
||||||
|
|
||||||
enum class Framelimit: UnsignedByte {
|
enum class Framelimit: UnsignedByte {
|
||||||
Vsync,
|
Vsync,
|
||||||
HalfVsync,
|
HalfVsync
|
||||||
FpsCap
|
|
||||||
} _framelimit{Framelimit::Vsync};
|
} _framelimit{Framelimit::Vsync};
|
||||||
UnsignedInt _fpsCap{60};
|
|
||||||
|
|
||||||
bool _skipDisclaimer{false};
|
bool _skipDisclaimer{false};
|
||||||
bool _checkUpdatesOnStartup{true};
|
bool _checkUpdatesOnStartup{true};
|
||||||
|
|
|
@ -38,8 +38,8 @@ void SaveTool::initEvent(SDL_Event& event) {
|
||||||
ImGui::CloseCurrentPopup();
|
ImGui::CloseCurrentPopup();
|
||||||
break;
|
break;
|
||||||
case ProfileManagerFailure:
|
case ProfileManagerFailure:
|
||||||
Utility::Error{} << "Error initialising ProfileManager:" << _profileManager->lastError();
|
SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error ",
|
||||||
SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error initialising ProfileManager", _profileManager->lastError().data(), window());
|
_profileManager->lastError().data(), window());
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -73,15 +73,11 @@ void SaveTool::initialiseConfiguration() {
|
||||||
|
|
||||||
if(_conf.hasValue("frame_limit"_s)) {
|
if(_conf.hasValue("frame_limit"_s)) {
|
||||||
std::string frame_limit = _conf.value("frame_limit"_s);
|
std::string frame_limit = _conf.value("frame_limit"_s);
|
||||||
if(frame_limit == "vsync"_s) {
|
if(frame_limit == "half_vsync"_s) {
|
||||||
_framelimit = Framelimit::Vsync;
|
|
||||||
}
|
|
||||||
else if(frame_limit == "half_vsync"_s) {
|
|
||||||
_framelimit = Framelimit::HalfVsync;
|
_framelimit = Framelimit::HalfVsync;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
_framelimit = Framelimit::FpsCap;
|
_framelimit = Framelimit::Vsync;
|
||||||
_fpsCap = std::stoul(frame_limit);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -102,7 +98,8 @@ void SaveTool::initialiseGui() {
|
||||||
ImFontConfig font_config;
|
ImFontConfig font_config;
|
||||||
font_config.FontDataOwnedByAtlas = false;
|
font_config.FontDataOwnedByAtlas = false;
|
||||||
std::strcpy(font_config.Name, "Source Sans Pro");
|
std::strcpy(font_config.Name, "Source Sans Pro");
|
||||||
io.Fonts->AddFontFromMemoryTTF(const_cast<char*>(reg_font.data()), reg_font.size(), 20.0f, &font_config);
|
io.Fonts->AddFontFromMemoryTTF(const_cast<char*>(reg_font.data()), int(reg_font.size()),
|
||||||
|
20.0f, &font_config);
|
||||||
|
|
||||||
auto icon_font = _rs.getRaw(FONT_ICON_FILE_NAME_FAS);
|
auto icon_font = _rs.getRaw(FONT_ICON_FILE_NAME_FAS);
|
||||||
static const ImWchar icon_range[] = { ICON_MIN_FA, ICON_MAX_FA, 0 };
|
static const ImWchar icon_range[] = { ICON_MIN_FA, ICON_MAX_FA, 0 };
|
||||||
|
@ -112,11 +109,13 @@ void SaveTool::initialiseGui() {
|
||||||
icon_config.PixelSnapH = true;
|
icon_config.PixelSnapH = true;
|
||||||
icon_config.OversampleH = icon_config.OversampleV = 1;
|
icon_config.OversampleH = icon_config.OversampleV = 1;
|
||||||
icon_config.GlyphMinAdvanceX = 18.0f;
|
icon_config.GlyphMinAdvanceX = 18.0f;
|
||||||
io.Fonts->AddFontFromMemoryTTF(const_cast<char*>(icon_font.data()), icon_font.size(), 16.0f, &icon_config, icon_range);
|
io.Fonts->AddFontFromMemoryTTF(const_cast<char*>(icon_font.data()), int(icon_font.size()),
|
||||||
|
16.0f, &icon_config, icon_range);
|
||||||
|
|
||||||
auto brand_font = _rs.getRaw(FONT_ICON_FILE_NAME_FAB);
|
auto brand_font = _rs.getRaw(FONT_ICON_FILE_NAME_FAB);
|
||||||
static const ImWchar brand_range[] = { ICON_MIN_FAB, ICON_MAX_FAB, 0 };
|
static const ImWchar brand_range[] = { ICON_MIN_FAB, ICON_MAX_FAB, 0 };
|
||||||
io.Fonts->AddFontFromMemoryTTF(const_cast<char*>(brand_font.data()), brand_font.size(), 16.0f, &icon_config, brand_range);
|
io.Fonts->AddFontFromMemoryTTF(const_cast<char*>(brand_font.data()), int(brand_font.size()),
|
||||||
|
16.0f, &icon_config, brand_range);
|
||||||
|
|
||||||
auto mono_font = _rs.getRaw("SourceCodePro-Regular.ttf"_s);
|
auto mono_font = _rs.getRaw("SourceCodePro-Regular.ttf"_s);
|
||||||
ImVector<ImWchar> range;
|
ImVector<ImWchar> range;
|
||||||
|
@ -124,7 +123,8 @@ void SaveTool::initialiseGui() {
|
||||||
builder.AddRanges(io.Fonts->GetGlyphRangesDefault());
|
builder.AddRanges(io.Fonts->GetGlyphRangesDefault());
|
||||||
builder.AddChar(u'š'); // This allows displaying Vladimír Vondruš' name in Corrade's and Magnum's licences.
|
builder.AddChar(u'š'); // This allows displaying Vladimír Vondruš' name in Corrade's and Magnum's licences.
|
||||||
builder.BuildRanges(&range);
|
builder.BuildRanges(&range);
|
||||||
io.Fonts->AddFontFromMemoryTTF(const_cast<char*>(mono_font.data()), mono_font.size(), 18.0f, &font_config, range.Data);
|
io.Fonts->AddFontFromMemoryTTF(const_cast<char*>(mono_font.data()), int(mono_font.size()),
|
||||||
|
18.0f, &font_config, range.Data);
|
||||||
|
|
||||||
_imgui = ImGuiIntegration::Context(*ImGui::GetCurrentContext(), windowSize());
|
_imgui = ImGuiIntegration::Context(*ImGui::GetCurrentContext(), windowSize());
|
||||||
|
|
||||||
|
|
|
@ -203,7 +203,7 @@ void SaveTool::drawGeneralInfo() {
|
||||||
ImGui::Text("Last mission: 0x%x", _currentProfile->lastMissionId());
|
ImGui::Text("Last mission: 0x%x", _currentProfile->lastMissionId());
|
||||||
}
|
}
|
||||||
drawTooltip("This is the last mission selected in the mission selection screen, not the last mission played.",
|
drawTooltip("This is the last mission selected in the mission selection screen, not the last mission played.",
|
||||||
windowSize().x() * 0.35f);
|
float(windowSize().x()) * 0.35f);
|
||||||
|
|
||||||
const Float footer_height_to_reserve = ImGui::GetStyle().ItemSpacing.y + ImGui::GetFrameHeightWithSpacing();
|
const Float footer_height_to_reserve = ImGui::GetStyle().ItemSpacing.y + ImGui::GetFrameHeightWithSpacing();
|
||||||
ImGui::Dummy({ImGui::GetContentRegionAvail().x, ImGui::GetContentRegionAvail().y - footer_height_to_reserve});
|
ImGui::Dummy({ImGui::GetContentRegionAvail().x, ImGui::GetContentRegionAvail().y - footer_height_to_reserve});
|
||||||
|
@ -643,7 +643,7 @@ auto SaveTool::drawDeleteMassPopup(int mass_index) -> ImGuiID {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::PushTextWrapPos(windowSize().x() * 0.40f);
|
ImGui::PushTextWrapPos(float(windowSize().x()) * 0.40f);
|
||||||
if(_massManager->hangar(mass_index).state() == Mass::State::Invalid) {
|
if(_massManager->hangar(mass_index).state() == Mass::State::Invalid) {
|
||||||
ImGui::Text("Are you sure you want to delete the invalid M.A.S.S. data in hangar %.2i ? This operation is irreversible.",
|
ImGui::Text("Are you sure you want to delete the invalid M.A.S.S. data in hangar %.2i ? This operation is irreversible.",
|
||||||
mass_index + 1);
|
mass_index + 1);
|
||||||
|
@ -687,7 +687,7 @@ auto SaveTool::drawDeleteStagedMassPopup(Containers::StringView filename) -> ImG
|
||||||
return ImGui::GetID("Confirmation##DeleteStagedMassConfirmation");
|
return ImGui::GetID("Confirmation##DeleteStagedMassConfirmation");
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::PushTextWrapPos(windowSize().x() * 0.40f);
|
ImGui::PushTextWrapPos(float(windowSize().x()) * 0.40f);
|
||||||
ImGui::Text("Are you sure you want to delete the staged M.A.S.S. named %s ? This operation is irreversible.",
|
ImGui::Text("Are you sure you want to delete the staged M.A.S.S. named %s ? This operation is irreversible.",
|
||||||
_massManager->stagedMasses().at(filename).data());
|
_massManager->stagedMasses().at(filename).data());
|
||||||
ImGui::PopTextWrapPos();
|
ImGui::PopTextWrapPos();
|
||||||
|
|
|
@ -90,7 +90,7 @@ void SaveTool::drawMassViewer() {
|
||||||
_selectedWeaponPart = 0;
|
_selectedWeaponPart = 0;
|
||||||
_selectedWeaponDecal = 0;
|
_selectedWeaponDecal = 0;
|
||||||
_selectedWeaponAccessory = 0;
|
_selectedWeaponAccessory = 0;
|
||||||
};
|
}
|
||||||
|
|
||||||
ImGui::EndTable();
|
ImGui::EndTable();
|
||||||
}
|
}
|
||||||
|
@ -166,7 +166,7 @@ void SaveTool::drawGlobalStyles() {
|
||||||
ImGui::TextWrapped("In-game values are multiplied by 100. For example, 0.500 here is equal to 50 in-game.");
|
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->globalStyles().size(); i++) {
|
for(UnsignedInt i = 0; i < _currentMass->globalStyles().size(); i++) {
|
||||||
ImGui::PushID(i);
|
ImGui::PushID(int(i));
|
||||||
DCSResult result;
|
DCSResult result;
|
||||||
result = drawCustomStyle(_currentMass->globalStyles()[i]);
|
result = drawCustomStyle(_currentMass->globalStyles()[i]);
|
||||||
switch(result) {
|
switch(result) {
|
||||||
|
|
|
@ -43,7 +43,7 @@ void SaveTool::drawArmour() {
|
||||||
};
|
};
|
||||||
|
|
||||||
for(UnsignedInt i = 0; i < _currentMass->armourParts().size(); i++) {
|
for(UnsignedInt i = 0; i < _currentMass->armourParts().size(); i++) {
|
||||||
ImGui::PushID(i);
|
ImGui::PushID(int(i));
|
||||||
|
|
||||||
auto& part = _currentMass->armourParts()[i];
|
auto& part = _currentMass->armourParts()[i];
|
||||||
|
|
||||||
|
@ -126,7 +126,7 @@ void SaveTool::drawArmour() {
|
||||||
drawAlignedText("Showing/editing decal");
|
drawAlignedText("Showing/editing decal");
|
||||||
for(UnsignedInt j = 0; j < part.decals.size(); j++) {
|
for(UnsignedInt j = 0; j < part.decals.size(); j++) {
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::RadioButton(std::to_string(j + 1).c_str(), &_selectedArmourDecals[i], j);
|
ImGui::RadioButton(std::to_string(j + 1).c_str(), &_selectedArmourDecals[i], int(j));
|
||||||
}
|
}
|
||||||
|
|
||||||
drawDecalEditor(part.decals[_selectedArmourDecals[i]]);
|
drawDecalEditor(part.decals[_selectedArmourDecals[i]]);
|
||||||
|
@ -141,7 +141,7 @@ void SaveTool::drawArmour() {
|
||||||
drawAlignedText("Showing/editing accessory");
|
drawAlignedText("Showing/editing accessory");
|
||||||
for(UnsignedInt j = 0; j < part.accessories.size(); j++) {
|
for(UnsignedInt j = 0; j < part.accessories.size(); j++) {
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::RadioButton(std::string{char(65 + j)}.c_str(), &_selectedArmourAccessories[i], j);
|
ImGui::RadioButton(std::string{char(65 + j)}.c_str(), &_selectedArmourAccessories[i], int(j));
|
||||||
}
|
}
|
||||||
|
|
||||||
drawAccessoryEditor(part.accessories[_selectedArmourAccessories[i]], _currentMass->armourCustomStyles());
|
drawAccessoryEditor(part.accessories[_selectedArmourAccessories[i]], _currentMass->armourCustomStyles());
|
||||||
|
@ -301,7 +301,7 @@ void SaveTool::drawCustomArmourStyles() {
|
||||||
ImGui::TextWrapped("In-game values are multiplied by 100. For example, 0.500 here is equal to 50 in-game.");
|
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->armourCustomStyles().size(); i++) {
|
for(UnsignedInt i = 0; i < _currentMass->armourCustomStyles().size(); i++) {
|
||||||
ImGui::PushID(i);
|
ImGui::PushID(int(i));
|
||||||
DCSResult result;
|
DCSResult result;
|
||||||
result = drawCustomStyle(_currentMass->armourCustomStyles()[i]);
|
result = drawCustomStyle(_currentMass->armourCustomStyles()[i]);
|
||||||
switch(result) {
|
switch(result) {
|
||||||
|
|
|
@ -291,7 +291,7 @@ void SaveTool::drawCustomFrameStyles() {
|
||||||
ImGui::TextWrapped("In-game values are multiplied by 100. For example, 0.500 here is equal to 50 in-game.");
|
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++) {
|
for(UnsignedInt i = 0; i < _currentMass->frameCustomStyles().size(); i++) {
|
||||||
ImGui::PushID(i);
|
ImGui::PushID(int(i));
|
||||||
DCSResult result;
|
DCSResult result;
|
||||||
result = drawCustomStyle(_currentMass->frameCustomStyles()[i]);
|
result = drawCustomStyle(_currentMass->frameCustomStyles()[i]);
|
||||||
switch(result) {
|
switch(result) {
|
||||||
|
|
|
@ -269,7 +269,7 @@ void SaveTool::drawWeaponCategory(Containers::StringView name, Containers::Array
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
|
|
||||||
ImGui::PushID(i);
|
ImGui::PushID(int(i));
|
||||||
|
|
||||||
if(ImGui::Selectable(weapon.name.data(), _currentWeapon == &weapon)) {
|
if(ImGui::Selectable(weapon.name.data(), _currentWeapon == &weapon)) {
|
||||||
_currentWeapon = &weapon;
|
_currentWeapon = &weapon;
|
||||||
|
@ -309,7 +309,7 @@ void SaveTool::drawWeaponCategory(Containers::StringView name, Containers::Array
|
||||||
|
|
||||||
ImGui::PopID();
|
ImGui::PopID();
|
||||||
|
|
||||||
if(weapon.attached == true) {
|
if(weapon.attached) {
|
||||||
ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, 0x1F008CFFu);
|
ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, 0x1F008CFFu);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -454,7 +454,9 @@ void SaveTool::drawWeaponEditor(Weapon& weapon) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}();
|
}();
|
||||||
|
|
||||||
CORRADE_INTERNAL_ASSERT(map);
|
if(!map) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if(map->find(part.id) != map->cend()) {
|
if(map->find(part.id) != map->cend()) {
|
||||||
ImGui::TextUnformatted(map->at(part.id).data());
|
ImGui::TextUnformatted(map->at(part.id).data());
|
||||||
|
@ -531,7 +533,7 @@ void SaveTool::drawWeaponEditor(Weapon& weapon) {
|
||||||
drawAlignedText("Showing/editing decal");
|
drawAlignedText("Showing/editing decal");
|
||||||
for(UnsignedLong i = 0; i < part.decals.size(); i++) {
|
for(UnsignedLong i = 0; i < part.decals.size(); i++) {
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::RadioButton(std::to_string(i + 1).c_str(), &_selectedWeaponDecal, i);
|
ImGui::RadioButton(std::to_string(i + 1).c_str(), &_selectedWeaponDecal, int(i));
|
||||||
}
|
}
|
||||||
|
|
||||||
drawDecalEditor(part.decals[_selectedWeaponDecal]);
|
drawDecalEditor(part.decals[_selectedWeaponDecal]);
|
||||||
|
@ -546,7 +548,7 @@ void SaveTool::drawWeaponEditor(Weapon& weapon) {
|
||||||
drawAlignedText("Showing/editing accessory");
|
drawAlignedText("Showing/editing accessory");
|
||||||
for(UnsignedLong i = 0; i < part.accessories.size(); i++) {
|
for(UnsignedLong i = 0; i < part.accessories.size(); i++) {
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::RadioButton(std::string{char(65 + i)}.c_str(), &_selectedWeaponAccessory, i);
|
ImGui::RadioButton(std::string{char(65 + i)}.c_str(), &_selectedWeaponAccessory, int(i));
|
||||||
}
|
}
|
||||||
|
|
||||||
drawAccessoryEditor(part.accessories[_selectedWeaponAccessory], weapon.customStyles);
|
drawAccessoryEditor(part.accessories[_selectedWeaponAccessory], weapon.customStyles);
|
||||||
|
|
|
@ -85,7 +85,7 @@ void SaveTool::drawProfileManager() {
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
|
|
||||||
ImGui::TableSetColumnIndex(0);
|
ImGui::TableSetColumnIndex(0);
|
||||||
ImGui::PushID(i);
|
ImGui::PushID(int(i));
|
||||||
if(ImGui::Selectable(profile.companyName().data(), false,
|
if(ImGui::Selectable(profile.companyName().data(), false,
|
||||||
ImGuiSelectableFlags_SpanAllColumns|ImGuiSelectableFlags_AllowItemOverlap))
|
ImGuiSelectableFlags_SpanAllColumns|ImGuiSelectableFlags_AllowItemOverlap))
|
||||||
{
|
{
|
||||||
|
@ -138,7 +138,7 @@ auto SaveTool::drawBackupListPopup() -> ImGuiID {
|
||||||
if(ImGui::BeginPopupModal("Restore backup", nullptr,
|
if(ImGui::BeginPopupModal("Restore backup", nullptr,
|
||||||
ImGuiWindowFlags_NoCollapse|ImGuiWindowFlags_NoMove|ImGuiWindowFlags_AlwaysAutoResize))
|
ImGuiWindowFlags_NoCollapse|ImGuiWindowFlags_NoMove|ImGuiWindowFlags_AlwaysAutoResize))
|
||||||
{
|
{
|
||||||
ImGui::PushTextWrapPos(windowSize().x() * 0.40f);
|
ImGui::PushTextWrapPos(float(windowSize().x()) * 0.40f);
|
||||||
ImGui::Text("Are you sure you want to restore the %s backup from %.4i-%.2i-%.2i %.2i:%.2i:%.2i ? Any existing data will be overwritten.",
|
ImGui::Text("Are you sure you want to restore the %s backup from %.4i-%.2i-%.2i %.2i:%.2i:%.2i ? Any existing data will be overwritten.",
|
||||||
_profileManager->backups()[backup_index].company.data(),
|
_profileManager->backups()[backup_index].company.data(),
|
||||||
_profileManager->backups()[backup_index].timestamp.year,
|
_profileManager->backups()[backup_index].timestamp.year,
|
||||||
|
@ -181,7 +181,7 @@ auto SaveTool::drawBackupListPopup() -> ImGuiID {
|
||||||
if(ImGui::BeginPopupModal("Delete backup", nullptr,
|
if(ImGui::BeginPopupModal("Delete backup", nullptr,
|
||||||
ImGuiWindowFlags_NoCollapse|ImGuiWindowFlags_NoMove|ImGuiWindowFlags_AlwaysAutoResize))
|
ImGuiWindowFlags_NoCollapse|ImGuiWindowFlags_NoMove|ImGuiWindowFlags_AlwaysAutoResize))
|
||||||
{
|
{
|
||||||
ImGui::PushTextWrapPos(windowSize().x() * 0.40f);
|
ImGui::PushTextWrapPos(float(windowSize().x()) * 0.40f);
|
||||||
ImGui::Text("Are you sure you want to delete the %s backup from %.4i-%.2i-%.2i %.2i:%.2i:%.2i ? This operation is irreversible.",
|
ImGui::Text("Are you sure you want to delete the %s backup from %.4i-%.2i-%.2i %.2i:%.2i:%.2i ? This operation is irreversible.",
|
||||||
_profileManager->backups()[backup_index].company.data(),
|
_profileManager->backups()[backup_index].company.data(),
|
||||||
_profileManager->backups()[backup_index].timestamp.year,
|
_profileManager->backups()[backup_index].timestamp.year,
|
||||||
|
@ -284,7 +284,7 @@ auto SaveTool::drawBackupListPopup() -> ImGuiID {
|
||||||
ImGui::TextUnformatted(backup.type == ProfileType::Demo ? "Demo" : "Full");
|
ImGui::TextUnformatted(backup.type == ProfileType::Demo ? "Demo" : "Full");
|
||||||
|
|
||||||
ImGui::TableSetColumnIndex(3);
|
ImGui::TableSetColumnIndex(3);
|
||||||
ImGui::PushID(i);
|
ImGui::PushID(int(i));
|
||||||
if(ImGui::SmallButton(ICON_FA_UNDO)) {
|
if(ImGui::SmallButton(ICON_FA_UNDO)) {
|
||||||
backup_index = i;
|
backup_index = i;
|
||||||
ImGui::OpenPopup(restore_backup_popup_id);
|
ImGui::OpenPopup(restore_backup_popup_id);
|
||||||
|
@ -380,7 +380,7 @@ auto SaveTool::drawDeleteProfilePopup(std::size_t profile_index) -> ImGuiID {
|
||||||
delete_builds = false;
|
delete_builds = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::PushTextWrapPos(windowSize().x() * 0.40f);
|
ImGui::PushTextWrapPos(float(windowSize().x()) * 0.40f);
|
||||||
ImGui::Text("Are you sure you want to delete the %s profile named %s ? This operation is irreversible.",
|
ImGui::Text("Are you sure you want to delete the %s profile named %s ? This operation is irreversible.",
|
||||||
_profileManager->profiles()[profile_index].isDemo() ? "demo" : "full game",
|
_profileManager->profiles()[profile_index].isDemo() ? "demo" : "full game",
|
||||||
_profileManager->profiles()[profile_index].companyName().data());
|
_profileManager->profiles()[profile_index].companyName().data());
|
||||||
|
|
|
@ -75,7 +75,7 @@ void SaveTool::updateCheckEvent(SDL_Event& event) {
|
||||||
}
|
}
|
||||||
bool operator>(const Version& other) const {
|
bool operator>(const Version& other) const {
|
||||||
if((fullVersion > other.fullVersion) ||
|
if((fullVersion > other.fullVersion) ||
|
||||||
(fullVersion == other.fullVersion && prerelease == false && other.prerelease == true))
|
(fullVersion == other.fullVersion && !prerelease && other.prerelease))
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -83,7 +83,7 @@ void SaveTool::updateCheckEvent(SDL_Event& event) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
operator Containers::String() const {
|
explicit operator Containers::String() const {
|
||||||
return Utility::format("{}.{}.{}{}", major, minor, patch, prerelease ? "-pre" : "");
|
return Utility::format("{}.{}.{}{}", major, minor, patch, prerelease ? "-pre" : "");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -99,14 +99,14 @@ void SaveTool::updateCheckEvent(SDL_Event& event) {
|
||||||
_queue.addToast(Toast::Type::Warning, "Your version is out of date.\nCheck the settings for more information."_s,
|
_queue.addToast(Toast::Type::Warning, "Your version is out of date.\nCheck the settings for more information."_s,
|
||||||
std::chrono::milliseconds{5000});
|
std::chrono::milliseconds{5000});
|
||||||
_updateAvailable = true;
|
_updateAvailable = true;
|
||||||
_latestVersion = latest_ver;
|
_latestVersion = Containers::String{latest_ver};
|
||||||
_releaseLink = Utility::format("https://williamjcm.ovh/git/williamjcm/MassBuilderSaveTool/releases/tag/v{}", components.front());
|
_releaseLink = Utility::format("https://williamjcm.ovh/git/williamjcm/MassBuilderSaveTool/releases/tag/v{}", components.front());
|
||||||
_downloadLink = components.back();
|
_downloadLink = components.back();
|
||||||
}
|
}
|
||||||
else if(latest_ver == current_ver || (current_ver > latest_ver && current_ver.prerelease == true)) {
|
else if(latest_ver == current_ver || (current_ver > latest_ver && current_ver.prerelease)) {
|
||||||
_queue.addToast(Toast::Type::Success, "The application is already up to date."_s);
|
_queue.addToast(Toast::Type::Success, "The application is already up to date."_s);
|
||||||
}
|
}
|
||||||
else if(current_ver > latest_ver && current_ver.prerelease == false) {
|
else if(current_ver > latest_ver && !current_ver.prerelease) {
|
||||||
_queue.addToast(Toast::Type::Warning, "Your version is more recent than the latest one in the repo. How???"_s);
|
_queue.addToast(Toast::Type::Warning, "Your version is more recent than the latest one in the repo. How???"_s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
#include "SaveTool.h"
|
#include "SaveTool.h"
|
||||||
|
|
||||||
#include <Corrade/version.h>
|
#include <Corrade/version.h>
|
||||||
#include <Corrade/Containers/StringView.h>
|
|
||||||
|
|
||||||
#include <Magnum/version.h>
|
#include <Magnum/version.h>
|
||||||
#include <Magnum/versionIntegration.h>
|
#include <Magnum/versionIntegration.h>
|
||||||
|
@ -32,7 +31,7 @@ extern const ImVec2 center_pivot;
|
||||||
|
|
||||||
void SaveTool::drawAbout() {
|
void SaveTool::drawAbout() {
|
||||||
ImGui::SetNextWindowPos(ImVec2{Vector2{windowSize() / 2.0f}}, ImGuiCond_Always, center_pivot);
|
ImGui::SetNextWindowPos(ImVec2{Vector2{windowSize() / 2.0f}}, ImGuiCond_Always, center_pivot);
|
||||||
ImGui::SetNextWindowSize({windowSize().x() * 0.8f, windowSize().y() * 0.75f}, ImGuiCond_Always);
|
ImGui::SetNextWindowSize({float(windowSize().x()) * 0.8f, float(windowSize().y()) * 0.75f}, ImGuiCond_Always);
|
||||||
|
|
||||||
ImGui::OpenPopup("About##AboutPopup");
|
ImGui::OpenPopup("About##AboutPopup");
|
||||||
if(!ImGui::BeginPopupModal("About##AboutPopup", &_aboutPopup,
|
if(!ImGui::BeginPopupModal("About##AboutPopup", &_aboutPopup,
|
||||||
|
@ -84,7 +83,7 @@ void SaveTool::drawAbout() {
|
||||||
if(ImGui::CollapsingHeader("Licence")) {
|
if(ImGui::CollapsingHeader("Licence")) {
|
||||||
ImGui::TextWrapped("This application is made available under the terms of the GNU General Public License, version 3, the full text of which is available below:");
|
ImGui::TextWrapped("This application is made available under the terms of the GNU General Public License, version 3, the full text of which is available below:");
|
||||||
|
|
||||||
if(ImGui::BeginChild("##GPL", {0.0f, windowSize().y() * 0.3f}, true)) {
|
if(ImGui::BeginChild("##GPL", {0.0f, float(windowSize().y()) * 0.3f}, true)) {
|
||||||
static auto licence = _rs.getRaw("COPYING");
|
static auto licence = _rs.getRaw("COPYING");
|
||||||
ImGui::PushFont(ImGui::GetIO().Fonts->Fonts[1]);
|
ImGui::PushFont(ImGui::GetIO().Fonts->Fonts[1]);
|
||||||
ImGui::TextEx(licence.data(), licence.data() + licence.size(), ImGuiTextFlags_None);
|
ImGui::TextEx(licence.data(), licence.data() + licence.size(), ImGuiTextFlags_None);
|
||||||
|
@ -114,7 +113,7 @@ void SaveTool::drawAbout() {
|
||||||
ImGui::TextUnformatted("Licence: MIT");
|
ImGui::TextUnformatted("Licence: MIT");
|
||||||
|
|
||||||
static auto corrade_licence = _rs.getRaw("COPYING.Corrade");
|
static auto corrade_licence = _rs.getRaw("COPYING.Corrade");
|
||||||
if(ImGui::BeginChild("##CorradeLicence", {0.0f, windowSize().y() * 0.3f}, true)) {
|
if(ImGui::BeginChild("##CorradeLicence", {0.0f, float(windowSize().y()) * 0.3f}, true)) {
|
||||||
ImGui::PushFont(ImGui::GetIO().Fonts->Fonts[1]);
|
ImGui::PushFont(ImGui::GetIO().Fonts->Fonts[1]);
|
||||||
ImGui::TextEx(corrade_licence.data(), corrade_licence.data() + corrade_licence.size(), ImGuiTextFlags_None);
|
ImGui::TextEx(corrade_licence.data(), corrade_licence.data() + corrade_licence.size(), ImGuiTextFlags_None);
|
||||||
ImGui::PopFont();
|
ImGui::PopFont();
|
||||||
|
@ -142,7 +141,7 @@ void SaveTool::drawAbout() {
|
||||||
ImGui::TextUnformatted("Licence: MIT");
|
ImGui::TextUnformatted("Licence: MIT");
|
||||||
|
|
||||||
static auto magnum_licence = _rs.getRaw("COPYING.Magnum");
|
static auto magnum_licence = _rs.getRaw("COPYING.Magnum");
|
||||||
if(ImGui::BeginChild("##MagnumLicence", {0.0f, windowSize().y() * 0.3f}, true)) {
|
if(ImGui::BeginChild("##MagnumLicence", {0.0f, float(windowSize().y()) * 0.3f}, true)) {
|
||||||
ImGui::PushFont(ImGui::GetIO().Fonts->Fonts[1]);
|
ImGui::PushFont(ImGui::GetIO().Fonts->Fonts[1]);
|
||||||
ImGui::TextEx(magnum_licence.data(), magnum_licence.data() + magnum_licence.size(), ImGuiTextFlags_None);
|
ImGui::TextEx(magnum_licence.data(), magnum_licence.data() + magnum_licence.size(), ImGuiTextFlags_None);
|
||||||
ImGui::PopFont();
|
ImGui::PopFont();
|
||||||
|
@ -168,7 +167,7 @@ void SaveTool::drawAbout() {
|
||||||
ImGui::TextUnformatted("Licence: MIT");
|
ImGui::TextUnformatted("Licence: MIT");
|
||||||
|
|
||||||
static auto imgui_licence = _rs.getRaw("LICENSE.ImGui");
|
static auto imgui_licence = _rs.getRaw("LICENSE.ImGui");
|
||||||
if(ImGui::BeginChild("##ImGuiLicence", {0.0f, windowSize().y() * 0.3f}, true)) {
|
if(ImGui::BeginChild("##ImGuiLicence", {0.0f, float(windowSize().y()) * 0.3f}, true)) {
|
||||||
ImGui::PushFont(ImGui::GetIO().Fonts->Fonts[1]);
|
ImGui::PushFont(ImGui::GetIO().Fonts->Fonts[1]);
|
||||||
ImGui::TextEx(imgui_licence.data(), imgui_licence.data() + imgui_licence.size(), ImGuiTextFlags_None);
|
ImGui::TextEx(imgui_licence.data(), imgui_licence.data() + imgui_licence.size(), ImGuiTextFlags_None);
|
||||||
ImGui::PopFont();
|
ImGui::PopFont();
|
||||||
|
@ -194,7 +193,7 @@ void SaveTool::drawAbout() {
|
||||||
ImGui::TextUnformatted("Licence: zlib");
|
ImGui::TextUnformatted("Licence: zlib");
|
||||||
|
|
||||||
static auto sdl_licence = _rs.getRaw("LICENSE.SDL");
|
static auto sdl_licence = _rs.getRaw("LICENSE.SDL");
|
||||||
if(ImGui::BeginChild("##SDLLicence", {0.0f, windowSize().y() * 0.3f}, true)) {
|
if(ImGui::BeginChild("##SDLLicence", {0.0f, float(windowSize().y()) * 0.3f}, true)) {
|
||||||
ImGui::PushFont(ImGui::GetIO().Fonts->Fonts[1]);
|
ImGui::PushFont(ImGui::GetIO().Fonts->Fonts[1]);
|
||||||
ImGui::TextEx(sdl_licence.data(), sdl_licence.data() + sdl_licence.size(), ImGuiTextFlags_None);
|
ImGui::TextEx(sdl_licence.data(), sdl_licence.data() + sdl_licence.size(), ImGuiTextFlags_None);
|
||||||
ImGui::PopFont();
|
ImGui::PopFont();
|
||||||
|
@ -220,7 +219,7 @@ void SaveTool::drawAbout() {
|
||||||
ImGui::TextUnformatted("Licence: 3-clause BSD");
|
ImGui::TextUnformatted("Licence: 3-clause BSD");
|
||||||
|
|
||||||
static auto libzip_licence = _rs.getRaw("LICENSE.libzip");
|
static auto libzip_licence = _rs.getRaw("LICENSE.libzip");
|
||||||
if(ImGui::BeginChild("##libzipLicence", {0.0f, windowSize().y() * 0.3f}, true)) {
|
if(ImGui::BeginChild("##libzipLicence", {0.0f, float(windowSize().y()) * 0.3f}, true)) {
|
||||||
ImGui::PushFont(ImGui::GetIO().Fonts->Fonts[1]);
|
ImGui::PushFont(ImGui::GetIO().Fonts->Fonts[1]);
|
||||||
ImGui::TextEx(libzip_licence.data(), libzip_licence.data() + libzip_licence.size(), ImGuiTextFlags_None);
|
ImGui::TextEx(libzip_licence.data(), libzip_licence.data() + libzip_licence.size(), ImGuiTextFlags_None);
|
||||||
ImGui::PopFont();
|
ImGui::PopFont();
|
||||||
|
@ -245,7 +244,7 @@ void SaveTool::drawAbout() {
|
||||||
ImGui::TextUnformatted("Licence: MIT");
|
ImGui::TextUnformatted("Licence: MIT");
|
||||||
|
|
||||||
static auto efsw_licence = _rs.getRaw("LICENSE.efsw");
|
static auto efsw_licence = _rs.getRaw("LICENSE.efsw");
|
||||||
if(ImGui::BeginChild("##efswLicence", {0.0f, windowSize().y() * 0.3f}, true)) {
|
if(ImGui::BeginChild("##efswLicence", {0.0f, float(windowSize().y()) * 0.3f}, true)) {
|
||||||
ImGui::PushFont(ImGui::GetIO().Fonts->Fonts[1]);
|
ImGui::PushFont(ImGui::GetIO().Fonts->Fonts[1]);
|
||||||
ImGui::TextEx(efsw_licence.data(), efsw_licence.data() + efsw_licence.size(), ImGuiTextFlags_None);
|
ImGui::TextEx(efsw_licence.data(), efsw_licence.data() + efsw_licence.size(), ImGuiTextFlags_None);
|
||||||
ImGui::PopFont();
|
ImGui::PopFont();
|
||||||
|
@ -270,7 +269,7 @@ void SaveTool::drawAbout() {
|
||||||
ImGui::TextUnformatted("Licence: MIT/X derivative");
|
ImGui::TextUnformatted("Licence: MIT/X derivative");
|
||||||
|
|
||||||
static auto curl_licence = _rs.getRaw("LICENSE.curl");
|
static auto curl_licence = _rs.getRaw("LICENSE.curl");
|
||||||
if(ImGui::BeginChild("##libcurlLicence", {0.0f, windowSize().y() * 0.3f}, true)) {
|
if(ImGui::BeginChild("##libcurlLicence", {0.0f, float(windowSize().y()) * 0.3f}, true)) {
|
||||||
ImGui::PushFont(ImGui::GetIO().Fonts->Fonts[1]);
|
ImGui::PushFont(ImGui::GetIO().Fonts->Fonts[1]);
|
||||||
ImGui::TextEx(curl_licence.data(), curl_licence.data() + curl_licence.size(), ImGuiTextFlags_None);
|
ImGui::TextEx(curl_licence.data(), curl_licence.data() + curl_licence.size(), ImGuiTextFlags_None);
|
||||||
ImGui::PopFont();
|
ImGui::PopFont();
|
||||||
|
|
|
@ -58,11 +58,10 @@ void SaveTool::drawMainMenu() {
|
||||||
drawAlignedText("Frame limiter:");
|
drawAlignedText("Frame limiter:");
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
|
||||||
static UnsignedByte selection = static_cast<UnsignedByte>(_framelimit);
|
static auto selection = static_cast<UnsignedByte>(_framelimit);
|
||||||
static const char* framelimit_labels[3] = {
|
static const char* framelimit_labels[2] = {
|
||||||
"V-sync",
|
"V-sync",
|
||||||
"Half V-sync",
|
"Half V-sync"
|
||||||
"FPS cap, no V-sync"
|
|
||||||
};
|
};
|
||||||
|
|
||||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvailWidth());
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvailWidth());
|
||||||
|
@ -77,26 +76,10 @@ void SaveTool::drawMainMenu() {
|
||||||
_framelimit = Framelimit::HalfVsync;
|
_framelimit = Framelimit::HalfVsync;
|
||||||
setSwapInterval(2);
|
setSwapInterval(2);
|
||||||
}
|
}
|
||||||
if(ImGui::Selectable(framelimit_labels[2], _framelimit == Framelimit::FpsCap)) {
|
|
||||||
selection = 2;
|
|
||||||
_framelimit = Framelimit::FpsCap;
|
|
||||||
setSwapInterval(0);
|
|
||||||
setMinimalLoopPeriod(1000 / _fpsCap);
|
|
||||||
}
|
|
||||||
|
|
||||||
ImGui::EndCombo();
|
ImGui::EndCombo();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(_framelimit == Framelimit::FpsCap) {
|
|
||||||
static constexpr UnsignedInt min_fps = 15;
|
|
||||||
static constexpr UnsignedInt max_fps = 150;
|
|
||||||
|
|
||||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvailWidth());
|
|
||||||
if(ImGui::SliderScalar("##FpsSlider", ImGuiDataType_U32, &_fpsCap, &min_fps, &max_fps, "%u FPS", ImGuiSliderFlags_AlwaysClamp)) {
|
|
||||||
setMinimalLoopPeriod(1000 / _fpsCap);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ImGui::Checkbox("Cheat mode", &_cheatMode);
|
ImGui::Checkbox("Cheat mode", &_cheatMode);
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::AlignTextToFramePadding();
|
ImGui::AlignTextToFramePadding();
|
||||||
|
@ -149,11 +132,11 @@ void SaveTool::drawMainMenu() {
|
||||||
|
|
||||||
if(ImGui::BeginMenu(ICON_FA_DISCORD " Discord communities")) {
|
if(ImGui::BeginMenu(ICON_FA_DISCORD " Discord communities")) {
|
||||||
if(ImGui::MenuItem("Official server")) {
|
if(ImGui::MenuItem("Official server")) {
|
||||||
openUri("https://discord.gg/quS7E46");
|
openUri("https://discord.gg/sekai-project");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(ImGui::MenuItem("Community server")) {
|
if(ImGui::MenuItem("Community server")) {
|
||||||
openUri("https://discord.gg/YSSRTRB");
|
openUri("https://discord.gg/massbuildercommunity");
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::EndMenu();
|
ImGui::EndMenu();
|
||||||
|
|
|
@ -36,7 +36,7 @@ int main(int argc, char** argv) {
|
||||||
Warning warning_intercept{&warning_intercept_stream};
|
Warning warning_intercept{&warning_intercept_stream};
|
||||||
Error error_intercept{&error_intercept_stream};
|
Error error_intercept{&error_intercept_stream};
|
||||||
|
|
||||||
LOG_INFO("M.A.S.S. Builder Save Tool version " SAVETOOL_VERSION);
|
LOG_INFO("Initialising M.A.S.S. Builder Save Tool version " SAVETOOL_VERSION ".");
|
||||||
|
|
||||||
auto str = std::setlocale(LC_ALL, ".utf-8");
|
auto str = std::setlocale(LC_ALL, ".utf-8");
|
||||||
if(str) {
|
if(str) {
|
||||||
|
|
Loading…
Reference in a new issue