diff --git a/src/gui2/summaryview.cc b/src/gui2/summaryview.cc index 6eaf3c42..4fee715a 100644 --- a/src/gui2/summaryview.cc +++ b/src/gui2/summaryview.cc @@ -19,6 +19,8 @@ using namespace hex; +static DynamicSettingFactory settings("fluxengine.settings"); + SummaryView::SummaryView(): View::Window("fluxengine.view.summary.name", ICON_VS_DEBUG_LINE_BY_LINE) { @@ -44,12 +46,8 @@ static void loadFluxFile() {}, [](const auto& path) { - hex::ContentRegistry::Settings::write( - FLUXENGINE_CONFIG, - "fluxengine.settings.device", - DEVICE_FLUXFILE); - hex::ContentRegistry::Settings::write( - FLUXENGINE_CONFIG, "fluxengine.settings.fluxfile", path); + settings.get("device") = DEVICE_FLUXFILE; + settings.get("fluxfile") = path; }); } @@ -195,8 +193,7 @@ static void drawDeviceBox() /* Device name */ std::set applicableOptions = {ANY_SOURCESINK}; - auto deviceNameSetting = - DynamicSetting("fluxengine.settings", "device"); + auto deviceNameSetting = settings.get("device"); auto selectedDevice = findOrDefault(Datastore::getDevices(), (std::string)deviceNameSetting, {.label = "No device configured"}); @@ -222,7 +219,7 @@ static void drawDeviceBox() applicableOptions.insert(HARDWARE_SOURCESINK); } ImGui::SameLine(); - if (ImGui::BeginCombo("##format", nullptr, ImGuiComboFlags_NoPreview)) + if (ImGui::BeginCombo("##devices", nullptr, ImGuiComboFlags_NoPreview)) { ON_SCOPE_EXIT { @@ -244,8 +241,7 @@ static void drawDeviceBox() ImGui::AlignTextToFramePadding(); ImGui::Text(fmt::format("{}:", label)); ImGui::SameLine(); - auto pathSetting = - DynamicSetting("fluxengine.settings", setting); + auto pathSetting = settings.get(setting); auto pathString = (std::string)pathSetting; ImGui::SetNextItemWidth(-FLT_MIN); if (ImGui::InputText(id.c_str(), @@ -288,31 +284,46 @@ void drawFormatBox() /* Format name */ - auto formatName = - hex::ContentRegistry::Settings::read(FLUXENGINE_CONFIG, - "fluxengine.settings.format.selected", - DEVICE_FLUXFILE); - auto format = findOrDefault(formats, formatName); - if (!format) + auto formatSetting = + settings.get("format.selected", "ibm"); + auto selectedFormat = + findOrDefault(formats, (std::string)formatSetting); + if (!selectedFormat) { - ImGui::Text("***bad***"); - return; + formatSetting = "ibm"; + selectedFormat = formats.at(formatSetting); } ImGui::Text(fmt::format("{}:", "fluxengine.view.summary.format"_lang)); ImGui::SameLine(); ImGui::BeginGroup(); - ImGui::Text(format->shortname()); - ImGui::Text(format->comment()); + ImGui::TextWrapped(selectedFormat->shortname().c_str()); + ImGui::TextWrapped(selectedFormat->comment().c_str()); ImGui::EndGroup(); - auto formatOptionsSetting = - DynamicSetting("fluxengine.settings", formatName); - emitOptions(formatOptionsSetting, format, {}); + ImGui::SameLine(); + if (ImGui::BeginCombo("##formats", nullptr, ImGuiComboFlags_NoPreview)) + { + ON_SCOPE_EXIT + { + ImGui::EndCombo(); + }; - ImGui::Button( - fmt::format("{}##format", "fluxengine.view.summary.edit"_lang) - .c_str()); + for (auto& [name, format] : formats) + if (!format->is_extension()) + { + auto label = format->shortname(); + if (label.empty()) + label = name; + if (ImGui::Selectable( + fmt::format("{}##{}", label, name).c_str(), false)) + formatSetting = name; + } + } + + auto formatOptionsSetting = DynamicSetting( + "fluxengine.settings", (std::string)formatSetting); + emitOptions(formatOptionsSetting, selectedFormat, {}); } } diff --git a/src/gui2/utils.h b/src/gui2/utils.h index 47f7912d..6d187496 100644 --- a/src/gui2/utils.h +++ b/src/gui2/utils.h @@ -56,3 +56,18 @@ private: const T _defaultValue; std::optional _cachedValue; }; + +class DynamicSettingFactory +{ +public: + DynamicSettingFactory(const std::string& path): _path(path) {} + + template + DynamicSetting get(std::string_view leaf, T defaultValue = T()) + { + return DynamicSetting(_path, leaf, defaultValue); + } + +public: + std::string _path; +}; \ No newline at end of file