// ************************************************************************** // * This file is part of the FreeFileSync project. It is distributed under * // * GNU General Public License: http://www.gnu.org/licenses/gpl.html * // * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** #ifndef WX_CHOICE_ENUM_H_INCLUDED #define WX_CHOICE_ENUM_H_INCLUDED #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 = wxEmptyString) { descrList.push_back(std::make_pair(value, std::make_pair(text, tooltip))); return *this; } typedef std::vector>> DescrList; DescrList descrList; }; 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(const EnumDescrList& mapping, wxChoice& ctrl, Enum value) { ctrl.Clear(); int selectedPos = 0; for (auto it = mapping.descrList.begin(); it != mapping.descrList.end(); ++it) { ctrl.Append(it->second.first); if (it->first == value) { selectedPos = it - mapping.descrList.begin(); if (!it->second.second.empty()) ctrl.SetToolTip(it->second.second); } } ctrl.SetSelection(selectedPos); } template Enum getEnumVal(const EnumDescrList& mapping, const wxChoice& ctrl) { const int selectedPos = ctrl.GetSelection(); if (0 <= selectedPos && selectedPos < static_cast(mapping.descrList.size())) return mapping.descrList[selectedPos].first; else { assert(false); return Enum(0); } } template void updateTooltipEnumVal(const EnumDescrList& mapping, wxChoice& ctrl) { const Enum value = getEnumVal(mapping, ctrl); for (const auto& item : mapping.descrList) if (item.first == value) ctrl.SetToolTip(item.second.second); } } #endif //WX_CHOICE_ENUM_H_INCLUDED