1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
// **************************************************************************
// * This file is part of the FreeFileSync project. It is distributed under *
// * GNU General Public License: http://www.gnu.org/licenses/gpl-3.0 *
// * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef CHOICE_ENUM_H_132413545345687
#define CHOICE_ENUM_H_132413545345687
#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 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 <class Enum>
struct EnumDescrList
{
EnumDescrList& add(Enum value, const wxString& text, const wxString& tooltip = {})
{
descrList.emplace_back(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);
//--------------- impelementation -------------------------------------------
template <class Enum>
void setEnumVal(const EnumDescrList<Enum>& 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 <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 (const auto& item : mapping.descrList)
if (item.first == value)
ctrl.SetToolTip(item.second.second);
}
}
#endif //CHOICE_ENUM_H_132413545345687
|