CVB++ 15.1
Loading...
Searching...
No Matches
detail_integer_property.hpp
1#pragma once
2
3#include "../../global.hpp"
4#include "../../genapi/value_node.hpp"
5#include "../../genapi/integer_node.hpp"
6#include "detail_property.hpp"
7#include "detail_spinbox_slider.hpp"
8#include "detail_custom_lineedit.hpp"
9#include "detail_network.hpp"
10
11namespace Cvb
12{
13
14 CVB_BEGIN_INLINE_NS
15
16 namespace UI
17 {
18 namespace Private
19 {
20
21 inline QMetaType::Type GetTypeId(const QVariant &var)
22 {
23#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
24 return static_cast<QMetaType::Type>(var.typeId());
25#else
26 return static_cast<QMetaType::Type>(var.type());
27#endif
28 }
29
30 class IntegerProperty : public Private::Property
31 {
32
33 Q_OBJECT
34
35 public:
36 IntegerProperty(const ValueNodePtr &node, Property *parent)
37 : Property(node, PT_Integer, parent)
38 {
39 // SFNC
40 ipList_ << "Std::GevCurrentIPAddress" << "Std::GevCurrentSubnetMask" << "Std::GevCurrentDefaultGateway"
41 << "Std::GevPersistentIPAddress" << "Std::GevPersistentSubnetMask"
42 << "Std::GevPersistentDefaultGateway" << "Std::GevMCDA" << "Std::GevSCDA"
43 << "Std::GevPrimaryApplicationIPAddress";
44 // SI
45 ipList_ << "Cust::InterfaceSubnetIP" << "Cust::InterfaceSubnetMask" << "Cust::InterfaceGateway"
46 << "Cust::IPCfg_IP" << "Cust::IPCfg_Subnet" << "Cust::IPCfg_Gateway"
47 << "Cust::DeviceIP" << "Cust::DeviceGateway" << "Cust::StreamDestinationIP";
48
49 // SFNC
50 macList_ << "Std::GevMACAddress";
51 // SI
52 macList_ << "Cust::GevInterfaceMACAddress" << "Cust::InterfaceMAC" << "Cust::IPCfg_MAC" << "Cust::DeviceMAC";
53 }
54
55 QWidget *CreateEditor(QWidget *parent) override
56 {
57 auto intNode = std::dynamic_pointer_cast<IntegerNode>(Node());
58
59 if (!intNode)
60 return EmptyEditor();
61
62 if (!intNode->IsAvailable())
63 return EmptyEditor();
64
65 auto rep = intNode->Representation();
66 if (rep == GenApi::NumberRepresentation::IPv4 || ipList_.contains(UI::CvbToQt(intNode->Name())))
67 return CreateIpEditor(intNode, parent);
68 else if (rep == GenApi::NumberRepresentation::MAC || macList_.contains(UI::CvbToQt(intNode->Name())))
69 return CreateMacEditor(intNode, parent);
70 return CreateIntEditor(intNode, parent);
71 }
72
73 QWidget *CreateIntEditor(const IntegerNodePtr &node, QWidget *parent)
74 {
75 // No sliders necessary if min == max
76 if (node->Min() == node->Max())
77 {
78 auto editor = new SpinBox64(parent); // NOLINT(cppcoreguidelines-owning-memory)
79 editor->setMinimum(node->Min());
80 editor->setMaximum(node->Max());
81 editor->setValue(node->Value());
82 editor->setSingleStep(node->Increment());
83
84 QObject::connect(editor, &SpinBox64::ValueChanged, this, [this](qint64 value) { SetValue(QVariant(value)); });
85 return editor;
86 }
87
88 // Create sliders as well
89 auto editor = new SpinBoxSlider64(parent); // NOLINT(cppcoreguidelines-owning-memory)
90 editor->SetMinimum(node->Min());
91 editor->SetMaximum(node->Max());
92 editor->SetValue(node->Value());
93 editor->SetSingleStep(node->Increment());
94
95 QObject::connect(editor, &SpinBoxSlider64::ValueChanged, this,
96 [this](qint64 value) { SetValue(QVariant(value)); });
97
98 return editor;
99 }
100
101 QWidget *CreateIpEditor(const IntegerNodePtr &node, QWidget *parent)
102 {
103 auto editor = new IpLineEdit(parent); // NOLINT(cppcoreguidelines-owning-memory)
104 editor->SetText(QString::fromStdString(IPV4AddressIntToString(static_cast<std::uint32_t>(node->Value()))));
105
106 QObject::connect(editor, &IpLineEdit::TextChanged, this,
107 [this](const QString &text) { SetValue(QVariant(text)); });
108
109 return editor;
110 }
111
112 QWidget *CreateMacEditor(const IntegerNodePtr &node, QWidget *parent)
113 {
114 auto editor = new MacLineEdit(parent); // NOLINT(cppcoreguidelines-owning-memory)
115 MacAddress mac(node->Value());
116 editor->SetText(mac.ToQString());
117
118 QObject::connect(editor, &MacLineEdit::TextChanged, this,
119 [this](const QString &text) { SetValue(QVariant(text)); });
120
121 return editor;
122 }
123
124 bool SetEditorData(QWidget *editor, const QVariant &data) override
125 {
126 auto intNode = std::dynamic_pointer_cast<IntegerNode>(Node());
127
128 if (!intNode)
129 return false;
130
131 auto rep = intNode->Representation();
132 if (rep == GenApi::NumberRepresentation::IPv4 || ipList_.contains(UI::CvbToQt(intNode->Name())))
133 {
134 auto le = dynamic_cast<IpLineEdit *>(editor);
135 if (le)
136 {
137 le->SetText(data.toString());
138 return true;
139 }
140 }
141 else if (rep == GenApi::NumberRepresentation::MAC || macList_.contains(UI::CvbToQt(intNode->Name())))
142 {
143 auto le = dynamic_cast<MacLineEdit *>(editor);
144 if (le)
145 {
146 le->SetText(data.toString());
147 return true;
148 }
149 }
150 else
151 {
152 auto sb = dynamic_cast<SpinBoxSlider64 *>(editor);
153 if (sb)
154 {
155 sb->SetValue(data.toInt());
156 return true;
157 }
158 }
159 return false;
160 }
161
162 QVariant EditorData(QWidget *editor) override
163 {
164 auto intNode = std::dynamic_pointer_cast<IntegerNode>(Node());
165
166 auto rep = intNode->Representation();
167 if (rep == GenApi::NumberRepresentation::IPv4 || ipList_.contains(UI::CvbToQt(intNode->Name())))
168 {
169 auto le = dynamic_cast<IpLineEdit *>(editor);
170 if (le)
171 return QVariant(le->Text());
172 }
173 else if (rep == GenApi::NumberRepresentation::MAC || macList_.contains(UI::CvbToQt(intNode->Name())))
174 {
175 auto le = dynamic_cast<MacLineEdit *>(editor);
176 if (le)
177 return QVariant(le->Text());
178 }
179 else
180 {
181 auto sb = dynamic_cast<SpinBoxSlider64 *>(editor);
182 if (sb)
183 return QVariant(sb->Value());
184 }
185
186 return QVariant();
187 }
188
189 QVariant Value(int column, int role = Qt::UserRole) override
190 {
191 switch (role)
192 {
193 case Qt::DisplayRole:
194 {
195 if (column == 0)
196 return Data(column, role);
197
198 auto intNode = std::dynamic_pointer_cast<IntegerNode>(Node());
199 if (intNode && intNode->IsAvailable())
200 {
201 int32_t intValue = -1;
202 try
203 {
204 intValue = static_cast<std::uint32_t>(intNode->Value());
205 }
206 catch (const CvbException &e)
207 {
208 if (e.ErrorCode() == ErrorCodes::CVB_TIMEOUT)
209 TimeoutOccurred(); // send signal
210 return QVariant("-");
211 }
212
213 auto rep = intNode->Representation();
214 if (rep == GenApi::NumberRepresentation::IPv4 || ipList_.contains(UI::CvbToQt(intNode->Name())))
215 {
216 return QString::fromStdString(IPV4AddressIntToString(intValue));
217 }
218 else if (rep == GenApi::NumberRepresentation::MAC || macList_.contains(UI::CvbToQt(intNode->Name())))
219 {
220 MacAddress mac(intValue);
221 return mac.ToQString();
222 }
223 else
224 {
225 return QVariant::fromValue(intValue);
226 }
227 }
228 }
229 }
230 return QVariant();
231 }
232
233 void SetValue(const QVariant &value) override
234 {
235 if (auto intNode = std::dynamic_pointer_cast<IntegerNode>(Node()))
236 {
237 auto rep = intNode->Representation();
238 if (rep == GenApi::NumberRepresentation::IPv4 || ipList_.contains(UI::CvbToQt(intNode->Name())))
239 {
240 if (GetTypeId(value) == QMetaType::QString)
241 {
242 try
243 {
244 intNode->SetValue(IPV4AddressStringToInt(value.toString().toStdString()));
245 }
246 catch (const CvbException &)
247 {
248 // ignore the exception
249 }
250 }
251 }
252 else if (rep == GenApi::NumberRepresentation::MAC || macList_.contains(UI::CvbToQt(intNode->Name())))
253 {
254 if (GetTypeId(value) == QMetaType::QString)
255 {
256 MacAddress mac(value.toString());
257 try
258 {
259 intNode->SetValue(mac.ToInt64());
260 }
261 catch (const CvbException &)
262 {
263 // ignore the exception
264 }
265 }
266 }
267 else
268 {
269 if (GetTypeId(value) == QMetaType::LongLong)
270 {
271 try
272 {
273 intNode->SetValue(value.toLongLong());
274 }
275 catch (const CvbException &)
276 {
277 // ignore the exception
278 }
279 }
280 }
281 }
282 }
283
284 QString HtmlDescription() override
285 {
286 if (auto intNode = std::dynamic_pointer_cast<IntegerNode>(Node()))
287 {
288 auto txt = QString("<br><table>");
289 auto min = QString("-");
290 auto max = QString("-");
291 auto rep = QString("-");
292 auto inc = QString("");
293
294 auto representation = intNode->Representation();
295 if (representation != GenApi::NumberRepresentation::IPv4 && ipList_.contains(UI::CvbToQt(intNode->Name())))
296 rep = UI::CvbToQt(NodeRepresentation(GenApi::NumberRepresentation::IPv4));
297 else if (representation != GenApi::NumberRepresentation::MAC
298 && macList_.contains(UI::CvbToQt(intNode->Name())))
299 rep = UI::CvbToQt(NodeRepresentation(GenApi::NumberRepresentation::MAC));
300
301 inc = QString::number(intNode->Increment());
302 min = QString::number(intNode->Min());
303 max = QString::number(intNode->Max());
304
305 txt.append("<tr><td><b>Minimum:</b></td><td align=\"right\">" + min + "</td></tr>");
306 txt.append("<tr><td><b>Maximum:</b></td><td align=\"right\">" + max + "</td></tr>");
307 if (!inc.isEmpty())
308 txt.append("<tr><td><b>Increment:</b></td><td align=\"right\">" + inc + "</td></tr>");
309 txt.append("<tr><td><b>Representation:</b></td><td align=\"right\">" + rep + "</td></tr>");
310 txt.append("</table>");
311 return txt;
312 }
313 return QString();
314 }
315
316 private:
317 QStringList ipList_;
318 QStringList macList_;
319
320 }; /* class IntegerProperty */
321
322 } /* namespace Private */
323 } /* namespace UI */
324
325 CVB_END_INLINE_NS
326
327} /* namespace Cvb */
T max(T... args)
T min(T... args)
const int CVB_TIMEOUT
Timeout in function.
Definition exception.hpp:29
std::shared_ptr< IntegerNode > IntegerNodePtr
Convenience shared pointer for IntegerNode.
Definition genapi.hpp:63
std::shared_ptr< ValueNode > ValueNodePtr
Convenience shared pointer for ValueNode.
Definition genapi.hpp:91
@ MAC
MAC address in an edit control.
Definition genapi.hpp:159
@ IPv4
IPv4 address in an edit control.
Definition genapi.hpp:157
Namespace for user interface components.
Definition decl_image_scene.hpp:39
QString CvbToQt(const Cvb::String &text) noexcept
Convenience converter for strings.
Definition ui.hpp:257
Root namespace for the Image Manager interface.
Definition version.hpp:11