diff options
author | Daniel Wilhelm <daniel@wili.li> | 2014-04-18 17:12:17 +0200 |
---|---|---|
committer | Daniel Wilhelm <daniel@wili.li> | 2014-04-18 17:12:17 +0200 |
commit | b654dbfa5f3e4a4d02f72023f7c5895635aa6396 (patch) | |
tree | 8c1dfe7f638c0fc7afc1d08bc2fc0fd0f8646e5e /shared/wx_choice_enum.h | |
parent | 3.17 (diff) | |
download | FreeFileSync-b654dbfa5f3e4a4d02f72023f7c5895635aa6396.tar.gz FreeFileSync-b654dbfa5f3e4a4d02f72023f7c5895635aa6396.tar.bz2 FreeFileSync-b654dbfa5f3e4a4d02f72023f7c5895635aa6396.zip |
3.18
Diffstat (limited to 'shared/wx_choice_enum.h')
-rw-r--r-- | shared/wx_choice_enum.h | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/shared/wx_choice_enum.h b/shared/wx_choice_enum.h new file mode 100644 index 00000000..9f832394 --- /dev/null +++ b/shared/wx_choice_enum.h @@ -0,0 +1,129 @@ +// ************************************************************************** +// * 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 <wx/choice.h> +#include <vector> + +//handle mapping of enum values to wxChoice controls + +/* +Example: + +Member variable: + zen::EnumDescrList<EnumOnError> enumDescrMap; + +Constructor code: + enumDescrMap. + add(ON_ERROR_POPUP , _("Show popup") , _("Show popup 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 |