#pragma once #include #include #include #define SCWX_ENUM_MAP_FROM_VALUE(Iterator, ToName) \ [](const std::string& text) -> std::string \ { \ for (auto enumValue : Iterator) \ { \ const std::string enumName = ToName(enumValue); \ \ if (boost::iequals(text, enumName)) \ { \ /* Return label */ \ return enumName; \ } \ } \ \ /* Label not found, return unknown */ \ return "?"; \ } #define SCWX_SETTINGS_COMBO_BOX(settingsInterface, comboBox, Iterator, ToName) \ for (const auto& enumValue : Iterator) \ { \ comboBox->addItem(QString::fromStdString(ToName(enumValue))); \ } \ \ settingsInterface.SetMapFromValueFunction( \ SCWX_ENUM_MAP_FROM_VALUE(Iterator, ToName)); \ settingsInterface.SetMapToValueFunction( \ [](std::string text) -> std::string \ { \ boost::to_lower(text); \ return text; \ }); \ \ settingsInterface.SetEditWidget(comboBox); namespace scwx { namespace qt { namespace ui { class SettingsPageWidget : public QWidget { Q_OBJECT public: explicit SettingsPageWidget(QWidget* parent = nullptr); ~SettingsPageWidget(); bool CommitChanges(); void DiscardChanges(); void ResetToDefault(); protected: void AddSettingsInterface(settings::SettingsInterfaceBase* setting); /** * Commits and resets all settings within a category upon page commit or * reset. The use of SettingsInterface is preferred, as it allows the binding * of widgets to these actions. * * @param [in] category Settings category */ void AddSettingsCategory(settings::SettingsCategory* category); private: class Impl; std::shared_ptr p; }; } // namespace ui } // namespace qt } // namespace scwx