// ***************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: https://www.gnu.org/licenses/gpl-3.0 * // * Copyright (C) Zenju (zenju AT freefilesync DOT org) - All Rights Reserved * // ***************************************************************************** #ifndef CHOICE_ENUM_H_132413545345687 #define CHOICE_ENUM_H_132413545345687 #include #include #include //handle mapping of enum values to wxChoice controls /* Example: Member variable: zen::EnumDescrList enumDescrMap; Constructor code: enumDescrMap. add(ON_ERROR_POPUP, "Show pop-up", "Show pop-up on errors or warnings"). <- add localization add(ON_ERROR_IGNORE, "Ignore errors", "Hide all error and warning messages"). add(ON_ERROR_EXIT, "Exit instantly", "Abort synchronization immediately"); Set enum value: setEnumVal(enumDescrMap, *m_choiceHandleError, value); Get enum value: value = getEnumVal(enumDescrMap, *m_choiceHandleError) Update enum tooltips (after user changed selection): updateTooltipEnumVal(enumDescrMap, *m_choiceHandleError); */ namespace zen { template struct EnumDescrList { EnumDescrList& add(Enum value, const wxString& text, const wxString& tooltip = {}) { descrList.push_back({value, {text, tooltip}}); return *this; } using DescrList = std::vector>>; DescrList descrList; std::unordered_map> itemsSetLast; }; template void setEnumVal(const EnumDescrList& mapping, wxChoice& ctrl, Enum value); template Enum getEnumVal(const EnumDescrList& mapping, const wxChoice& ctrl); template void updateTooltipEnumVal(const EnumDescrList& mapping, wxChoice& ctrl); //--------------- impelementation ------------------------------------------- template void setEnumVal(EnumDescrList& mapping, wxChoice& ctrl, Enum value) { auto& itemsSetLast = mapping.itemsSetLast[&ctrl]; std::vector items; for (auto it = mapping.descrList.begin(); it != mapping.descrList.end(); ++it) items.push_back(it->second.first); if (items != itemsSetLast) { ctrl.Set(items); //expensive as fuck! => only call when absolutely needed! itemsSetLast = std::move(items); } //----------------------------------------------------------------- const auto it = std::find_if(mapping.descrList.begin(), mapping.descrList.end(), [&](const auto& mapItem) { return mapItem.first == value; }); if (it != mapping.descrList.end()) { if (const wxString& tooltip = it->second.second; !tooltip.empty()) ctrl.SetToolTip(tooltip); else ctrl.UnsetToolTip(); const int selectedPos = it - mapping.descrList.begin(); ctrl.SetSelection(selectedPos); } else assert(false); } template Enum getEnumVal(const EnumDescrList& mapping, const wxChoice& ctrl) { const int selectedPos = ctrl.GetSelection(); if (0 <= selectedPos && selectedPos < std::ssize(mapping.descrList)) return mapping.descrList[selectedPos].first; else { assert(false); return Enum(0); } } template void updateTooltipEnumVal(const EnumDescrList& mapping, wxChoice& ctrl) { const int selectedPos = ctrl.GetSelection(); if (0 <= selectedPos && selectedPos < std::ssize(mapping.descrList)) { if (const auto& [text, tooltip] = mapping.descrList[selectedPos].second; !tooltip.empty()) ctrl.SetToolTip(tooltip); else ctrl.UnsetToolTip(); } else assert(false); } } #endif //CHOICE_ENUM_H_132413545345687