feat: Add option to create auto backups of files before they're modified

This commit is contained in:
WerWolv
2025-12-07 21:37:14 +01:00
parent c2e07bf7b2
commit 855e4c4913
8 changed files with 86 additions and 10 deletions

View File

@@ -70,13 +70,16 @@ namespace hex::plugin::builtin {
if (m_loadedIntoMemory)
std::memcpy(m_data.data() + offset, buffer, size);
else
else {
this->createBackupIfNeeded(m_file.getPath());
m_file.writeBufferAtomic(offset, static_cast<const u8*>(buffer), size);
}
}
void FileProvider::save() {
if (m_loadedIntoMemory) {
m_ignoreNextChangeEvent = true;
this->createBackupIfNeeded(m_file.getPath());
m_file.open();
m_file.writeVectorAtomic(0x00, m_data);
m_file.setSize(m_data.size());
@@ -113,8 +116,10 @@ namespace hex::plugin::builtin {
void FileProvider::resizeRaw(u64 newSize) {
if (m_loadedIntoMemory)
m_data.resize(newSize);
else
else {
this->createBackupIfNeeded(m_file.getPath());
m_file.setSize(newSize);
}
m_fileSize = newSize;
}

View File

@@ -227,9 +227,9 @@ namespace hex::plugin::builtin {
if (value == 0)
return "hex.ui.common.off"_lang;
else if (value < 60)
return fmt::format("hex.builtin.setting.general.auto_backup_time.format.simple"_lang, value);
return fmt::format("hex.builtin.setting.general.backups.auto_backup_time.format.simple"_lang, value);
else
return fmt::format("hex.builtin.setting.general.auto_backup_time.format.extended"_lang, value / 60, value % 60);
return fmt::format("hex.builtin.setting.general.backups.auto_backup_time.format.extended"_lang, value / 60, value % 60);
}();
if (ImGui::SliderInt(name.data(), &m_value, 0, (30 * 60) / 30, format.c_str(), ImGuiSliderFlags_AlwaysClamp | ImGuiSliderFlags_NoInput)) {
@@ -756,7 +756,6 @@ namespace hex::plugin::builtin {
ContentRegistry::Settings::add<Widgets::Checkbox>("hex.builtin.setting.general", "", "hex.builtin.setting.general.show_tips", false);
ContentRegistry::Settings::add<Widgets::Checkbox>("hex.builtin.setting.general", "", "hex.builtin.setting.general.save_recent_providers", true);
ContentRegistry::Settings::add<AutoBackupWidget>("hex.builtin.setting.general", "", "hex.builtin.setting.general.auto_backup_time");
ContentRegistry::Settings::add<Widgets::SliderDataSize>("hex.builtin.setting.general", "", "hex.builtin.setting.general.max_mem_file_size", 512_MiB, 0_bytes, 32_GiB, 1_MiB)
.setTooltip("hex.builtin.setting.general.max_mem_file_size.desc");
ContentRegistry::Settings::add<Widgets::SliderInteger>("hex.builtin.setting.general", "hex.builtin.setting.general.patterns", "hex.builtin.setting.general.pattern_data_max_filter_items", 128, 32, 1024);
@@ -773,6 +772,20 @@ namespace hex::plugin::builtin {
ContentRegistry::Settings::add<ServerContactWidget>("hex.builtin.setting.general", "hex.builtin.setting.general.network", "hex.builtin.setting.general.server_contact");
ContentRegistry::Settings::add<Widgets::Checkbox>("hex.builtin.setting.general", "hex.builtin.setting.general.network", "hex.builtin.setting.general.upload_crash_logs", true);
#endif
ContentRegistry::Settings::add<AutoBackupWidget>("hex.builtin.setting.general", "hex.builtin.setting.general.backups", "hex.builtin.setting.general.backups.auto_backup_time");
ContentRegistry::Settings::add<Widgets::Spacer>("hex.builtin.setting.general", "hex.builtin.setting.general.backups", "hex.builtin.setting.general.backups.spacer");
auto fileBackupEnabledWidget = ContentRegistry::Settings::add<Widgets::Checkbox>("hex.builtin.setting.general", "hex.builtin.setting.general.backups", "hex.builtin.setting.general.backups.file_backup.enable", true);
ContentRegistry::Settings::add<Widgets::SliderDataSize>("hex.builtin.setting.general", "hex.builtin.setting.general.backups", "hex.builtin.setting.general.backups.file_backup.max_size", 512_MiB, 0_bytes, 32_GiB, 1_MiB)
.setEnabledCallback([=] {
return static_cast<Widgets::Checkbox&>(fileBackupEnabledWidget.getWidget()).isChecked();
});
ContentRegistry::Settings::add<Widgets::TextBox>("hex.builtin.setting.general", "hex.builtin.setting.general.backups", "hex.builtin.setting.general.backups.file_backup.extension", ".bak")
.setEnabledCallback([=] {
return static_cast<Widgets::Checkbox&>(fileBackupEnabledWidget.getWidget()).isChecked();
});
}
/* Interface */