CVB++ 15.0
detail_enum_property.hpp
1#pragma once
2
3#pragma warning(push)
4#pragma warning(disable : 4800)
5#pragma warning(disable : 4251)
6#pragma warning(disable : 4244)
7#include <QComboBox>
8#include <QStringList>
9#include <QEvent>
10#pragma warning(pop)
11
12#include "../../global.hpp"
13#include "../../genapi/value_node.hpp"
14#include "../../genapi/enumeration_node.hpp"
15#include "../../genapi/enum_entry_node.hpp"
16#include "detail_property.hpp"
17
18namespace Cvb
19{
20
21 CVB_BEGIN_INLINE_NS
22
23 namespace UI
24 {
25 namespace Private
26 {
27
28 class EnumProperty : public Private::Property
29 {
30
31 Q_OBJECT
32
33 public:
34 EnumProperty(const ValueNodePtr &node, Property *parent)
35 : Property(node, PT_Enumeration, parent)
36 {
37 RetrieveEntries();
38 }
39
40 QWidget *CreateEditor(QWidget *parent) override
41 {
42 auto enumNode = std::dynamic_pointer_cast<EnumerationNode>(Node());
43 if (enumNode && enumNode->IsAvailable())
44 {
45 auto editor = new QComboBox(parent); // NOLINT(cppcoreguidelines-owning-memory)
46 editor->addItems(entriesList_);
47 auto dispName = DisplayNameForSymbolicValue(UI::CvbToQt(enumNode->Value()));
48 editor->setCurrentIndex(IndexForDisplayName(dispName));
49
50 QObject::connect(editor, QOverload<int>::of(&QComboBox::currentIndexChanged), this,
51 [=](int index) { SetValue(index); });
52
53 return editor;
54 }
55 return EmptyEditor();
56 }
57
58 bool SetEditorData(QWidget *editor, const QVariant &data) override
59 {
60 if (auto cb = qobject_cast<QComboBox *>(editor))
61 {
62 cb->setCurrentIndex(cb->findText(data.toString()));
63 return true;
64 }
65 return false;
66 }
67
68 QVariant EditorData(QWidget *editor) override
69 {
70 if (auto cb = qobject_cast<QComboBox *>(editor))
71 {
72 return QVariant(cb->currentText());
73 }
74 else
75 {
76 return QVariant();
77 }
78 }
79
80 QVariant Value(int column, int role = Qt::UserRole) override
81 {
82 switch (role)
83 {
84 case Qt::DisplayRole:
85 {
86 if (column == 0)
87 return Data(column, role);
88
89 auto enumNode = std::dynamic_pointer_cast<EnumerationNode>(Node());
90 if (enumNode && enumNode->IsAvailable())
91 {
92 auto dispName = DisplayNameForSymbolicValue(UI::CvbToQt(enumNode->Value()));
93 return QVariant(dispName);
94 }
95 return QVariant("-");
96 }
97 }
98 return QVariant();
99 }
100
101 void SetValue(const QVariant &value) override
102 {
103 auto enumNode = std::dynamic_pointer_cast<EnumerationNode>(Node());
104 if (enumNode && enumNode->IsAvailable())
105 {
106 auto curDispName = entriesList_.at(value.toInt());
107 try
108 {
109 enumNode->SetValue(UI::QtToCvb(SymbolicValueForDisplayName(curDispName)));
110 }
111 catch (const CvbException &)
112 {
113 // ignore the exception
114 }
115 }
116 }
117
118 QString HtmlDescription() override
119 {
120 auto txt = QString("<table><tr><td><b>Entries:</b></td></tr>");
121 txt.append("<table border=1 cellspacing=\"0\" cellpadding=\"5\">");
122 txt.append(
123 "<tr><th align=\"left\"><b>Display Name</b></th><th align=\"left\"><b>Symbolic</b></th><th "
124 "align=\"left\"><b>Integer</b></th><th align=\"left\"><b>ToolTip</b></b></th></tr>");
125
126 QMap<int64_t, QStringList>::const_iterator i = entriesMap_.constBegin();
127 while (i != entriesMap_.constEnd())
128 {
129 auto nInfo = i.value();
130 auto tooltip = nInfo.at(2);
131 if (tooltip.isEmpty())
132 tooltip = "-";
133 txt.append("<tr><td>" + nInfo.at(0) + "</td><td>" + nInfo.at(1) + "</td><td>" + QString::number(i.key())
134 + "</td><td>" + tooltip + "</td></tr>");
135
136 ++i;
137 }
138
139 txt.append("</table></table>");
140 return txt;
141 }
142
143 private:
144 void RetrieveEntries()
145 {
146 auto enumNode = std::dynamic_pointer_cast<EnumerationNode>(Node());
147
148 if (enumNode)
149 {
150 entriesList_.clear();
151 entriesMap_.clear();
152
153 auto entries = enumNode->Entries();
154
155 for (std::size_t i = 0; i < entries.size(); i++)
156 {
157 auto entry = entries.at(i);
158 if (entry->IsAvailable())
159 {
160 entriesList_.append(UI::CvbToQt(entry->DisplayName()));
161
162 QStringList entryInfo;
163 entryInfo << UI::CvbToQt(entry->DisplayName()) << UI::CvbToQt(entry->SymbolicValue())
164 << UI::CvbToQt(entry->ToolTip());
165 entriesMap_.insert(entry->NumericValue(), entryInfo);
166 }
167 }
168 }
169 }
170
171 QString SymbolicValueForDisplayName(const QString &name)
172 {
173 QMap<int64_t, QStringList>::const_iterator iter = entriesMap_.constBegin();
174 while (iter != entriesMap_.constEnd())
175 {
176 auto lst = iter.value();
177 if (lst.at(0) == name)
178 return lst.at(1);
179
180 ++iter;
181 }
182
183 return QString("");
184 }
185
186 QString DisplayNameForSymbolicValue(const QString &symbolicValue)
187 {
188 RetrieveEntries();
189
190 QMap<int64_t, QStringList>::const_iterator iter = entriesMap_.constBegin();
191 while (iter != entriesMap_.constEnd())
192 {
193 auto lst = iter.value();
194 if (lst.at(1) == symbolicValue)
195 return lst.at(0);
196 ++iter;
197 }
198 return QString("");
199 }
200
201 int IndexForDisplayName(const QString &displayName)
202 {
203 for (int i = 0; i < entriesList_.size(); i++)
204 {
205 if (entriesList_.at(i) == displayName)
206 return i;
207 }
208
209 return -1;
210 }
211
212 private:
213 QStringList entriesList_;
214 QMap<int64_t, QStringList> entriesMap_;
215
216 }; /* class EnumProperty */
217
218 } /* namespace Private */
219 } /* namespace UI */
220
221 CVB_END_INLINE_NS
222
223} /* namespace Cvb */
std::shared_ptr< ValueNode > ValueNodePtr
Convenience shared pointer for ValueNode.
Definition genapi.hpp:91
Namespace for user interface components.
Definition decl_image_scene.hpp:39
Cvb::String QtToCvb(const QString text) noexcept
Convenience converter for strings.
Definition ui.hpp:242
QString CvbToQt(const Cvb::String &text) noexcept
Convenience converter for strings.
Definition ui.hpp:257
Root namespace for the Image Manager interface.
Definition c_bayer_to_rgb.h:17