diff options
author | Daniel Wilhelm <daniel@wili.li> | 2014-04-18 17:15:16 +0200 |
---|---|---|
committer | Daniel Wilhelm <daniel@wili.li> | 2014-04-18 17:15:16 +0200 |
commit | bd6336c629841c6db3a6ca53a936d629d34db53b (patch) | |
tree | 3721ef997864108df175ce677a8a7d4342a6f1d2 /wx+/choice_enum.h | |
parent | 4.0 (diff) | |
download | FreeFileSync-bd6336c629841c6db3a6ca53a936d629d34db53b.tar.gz FreeFileSync-bd6336c629841c6db3a6ca53a936d629d34db53b.tar.bz2 FreeFileSync-bd6336c629841c6db3a6ca53a936d629d34db53b.zip |
4.1
Diffstat (limited to 'wx+/choice_enum.h')
-rw-r--r-- | wx+/choice_enum.h | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/wx+/choice_enum.h b/wx+/choice_enum.h new file mode 100644 index 00000000..4565bf81 --- /dev/null +++ b/wx+/choice_enum.h @@ -0,0 +1,120 @@ +// ************************************************************************** +// * 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) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * +// ************************************************************************** + +#ifndef WX_CHOICE_ENUM_H_INCLUDED +#define WX_CHOICE_ENUM_H_INCLUDED + +#include <vector> +#include <wx/choice.h> + +//handle mapping of enum values to wxChoice controls +/* +Example: + +Member variable: + zen::EnumDescrList<EnumOnError> enumDescrMap; + +Constructor code: + enumDescrMap. + add(ON_ERROR_POPUP , _("Show pop-up") , _("Show pop-up on errors or warnings")). + 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 <class Enum> +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<std::pair<Enum, std::pair<wxString, wxString> > > DescrList; + DescrList descrList; +}; +template <class Enum> void setEnumVal(const EnumDescrList<Enum>& mapping, wxChoice& ctrl, Enum value); +template <class Enum> Enum getEnumVal(const EnumDescrList<Enum>& mapping, const wxChoice& ctrl); +template <class Enum> void updateTooltipEnumVal(const EnumDescrList<Enum>& mapping, wxChoice& ctrl); + + + + + + + + + + + + + + + + + + + +//--------------- inline impelementation ------------------------------------------- +template <class Enum> +void setEnumVal(const EnumDescrList<Enum>& mapping, wxChoice& ctrl, Enum value) +{ + ctrl.Clear(); + + int selectedPos = 0; + for (typename EnumDescrList<Enum>::DescrList::const_iterator i = mapping.descrList.begin(); i != mapping.descrList.end(); ++i) + { + ctrl.Append(i->second.first); + if (i->first == value) + { + selectedPos = i - mapping.descrList.begin(); + + if (!i->second.second.empty()) + ctrl.SetToolTip(i->second.second); + } + } + + ctrl.SetSelection(selectedPos); +} + +template <class Enum> +Enum getEnumVal(const EnumDescrList<Enum>& mapping, const wxChoice& ctrl) +{ + const int selectedPos = ctrl.GetSelection(); + + if (0 <= selectedPos && selectedPos < static_cast<int>(mapping.descrList.size())) + return mapping.descrList[selectedPos].first; + else + { + assert(false); + return Enum(0); + } +} + +template <class Enum> void updateTooltipEnumVal(const EnumDescrList<Enum>& mapping, wxChoice& ctrl) +{ + const Enum value = getEnumVal(mapping, ctrl); + + for (typename EnumDescrList<Enum>::DescrList::const_iterator i = mapping.descrList.begin(); i != mapping.descrList.end(); ++i) + if (i->first == value) + ctrl.SetToolTip(i->second.second); +} + +} + + +#endif //WX_CHOICE_ENUM_H_INCLUDED |