#include "content/views/view_settings.hpp" #include #include #include namespace hex::plugin::builtin { ViewSettings::ViewSettings() : View("hex.builtin.view.settings.name") { EventManager::subscribe(this, [this](const std::string &name) { if (name == "Settings") { TaskManager::doLater([this] { ImGui::OpenPopup(View::toWindowName("hex.builtin.view.settings.name").c_str()); this->getWindowOpenState() = true; }); } }); ContentRegistry::Interface::addMenuItemSeparator({ "hex.builtin.menu.help" }, 4000); ContentRegistry::Interface::addMenuItem({ "hex.builtin.menu.help", "hex.builtin.view.settings.name"_lang }, 4050, Shortcut::None, [&, this] { TaskManager::doLater([] { ImGui::OpenPopup(View::toWindowName("hex.builtin.view.settings.name").c_str()); }); this->getWindowOpenState() = true; }); } ViewSettings::~ViewSettings() { EventManager::unsubscribe(this); } void ViewSettings::drawContent() { if (ImGui::BeginPopupModal(View::toWindowName("hex.builtin.view.settings.name").c_str(), &this->getWindowOpenState(), ImGuiWindowFlags_NoResize)) { if (ImGui::BeginTabBar("settings")) { auto &entries = ContentRegistry::Settings::impl::getEntries(); std::vector::const_iterator> sortedCategories; for (auto it = entries.cbegin(); it != entries.cend(); it++) { sortedCategories.emplace_back(it); } std::sort(sortedCategories.begin(), sortedCategories.end(), [](auto &item0, auto &item1) { return item0->first.slot < item1->first.slot; }); const auto &descriptions = ContentRegistry::Settings::impl::getCategoryDescriptions(); for (auto &it : sortedCategories) { auto &[category, settings] = *it; if (ImGui::BeginTabItem(LangEntry(category.name))) { const std::string &categoryDesc = descriptions.contains(category.name) ? descriptions.at(category.name) : category.name; LangEntry descriptionEntry{categoryDesc}; ImGui::TextFormattedWrapped("{}", descriptionEntry); ImGui::InfoTooltip(descriptionEntry); ImGui::Separator(); for (auto &[name, requiresRestart, callback] : settings) { auto &setting = ContentRegistry::Settings::impl::getSettingsData()[category.name][name]; if (callback(LangEntry(name), setting)) { log::debug("Setting [{}]: {} was changed to {}", category.name, name, [&] -> std::string{ if (setting.is_number()) return std::to_string(setting.get()); else if (setting.is_string()) return setting.get(); else return ""; }()); EventManager::post(); if (requiresRestart) this->m_restartRequested = true; } } ImGui::EndTabItem(); } } ImGui::EndTabBar(); } ImGui::EndPopup(); } else this->getWindowOpenState() = false; if (!this->getWindowOpenState() && this->m_restartRequested) { View::showYesNoQuestionPopup("hex.builtin.view.settings.restart_question"_lang, ImHexApi::System::restartImHex, [] {}); } } }