Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
GNEOptionsEditorRow.cpp
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2001-2025 German Aerospace Center (DLR) and others.
4// This program and the accompanying materials are made available under the
5// terms of the Eclipse Public License 2.0 which is available at
6// https://www.eclipse.org/legal/epl-2.0/
7// This Source Code may also be made available under the following Secondary
8// Licenses when the conditions for such availability set forth in the Eclipse
9// Public License 2.0 are satisfied: GNU General Public License, version 2
10// or later which is available at
11// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13/****************************************************************************/
18// Row used in GNEOptionsEditor to edit options
19/****************************************************************************/
20
27
28#include "GNEOptionsEditorRow.h"
29#include "GNEOptionsEditor.h"
30
31// ===========================================================================
32// Defines
33// ===========================================================================
34
35#define MARGIN 4
36#define MINNAMEWIDTH 200
37
38// ===========================================================================
39// FOX callback mapping
40// ===========================================================================
41
46
50
51// Object implementation
52FXIMPLEMENT_ABSTRACT(GNEOptionsEditorRow::OptionRow, FXHorizontalFrame, OptionRowMap, ARRAYNUMBER(OptionRowMap))
53FXIMPLEMENT_ABSTRACT(GNEOptionsEditorRow::OptionFilename, GNEOptionsEditorRow::OptionRow, OptionFilenameMap, ARRAYNUMBER(OptionFilenameMap))
54
55// ===========================================================================
56// method definitions
57// ===========================================================================
58
59// ---------------------------------------------------------------------------
60// GNEOptionsEditorRow::OptionRow - methods
61// ---------------------------------------------------------------------------
62
63GNEOptionsEditorRow::OptionRow::OptionRow(GNEOptionsEditor* optionsEditor, FXComposite* parent, const std::string& topic,
64 const std::string& name, const std::string& description, const std::string& defaultValue) :
65 FXHorizontalFrame(parent, GUIDesignAuxiliarHorizontalFrame),
66 myOptionsEditor(optionsEditor),
67 myTopic(topic),
68 myName(name),
69 myDescription(description),
70 myDefaultValue(defaultValue) {
71 // build label with name (default width 150)
72 myNameLabel = new MFXLabelTooltip(this, myOptionsEditor->myDialog->getApplicationWindow()->getStaticTooltipMenu(),
73 name.c_str(), nullptr, GUIDesignLabelThickedFixed(MINNAMEWIDTH));
74 // set description as tooltip
75 myNameLabel->setTipText(description.c_str());
76 // create content frame
77 myContentFrame = new FXHorizontalFrame(this, GUIDesignAuxiliarHorizontalFrame);
78 // Create reset button
79 myResetButton = GUIDesigns::buildFXButton(this, "", "", TL("Reset value"), GUIIconSubSys::getIcon(GUIIcon::RESET), this, MID_GNE_RESET, GUIDesignButtonIcon);
80}
81
82
83void
85 const int nameWidth = myNameLabel->getFont()->getTextWidth(myNameLabel->getText().text(), myNameLabel->getText().length() + MARGIN);
86 if (nameWidth > MINNAMEWIDTH) {
87 myNameLabel->setWidth(nameWidth);
88 }
89}
90
91
92const std::string&
94 return myTopic;
95}
96
97
98const std::string
102
103
104const std::string
108
109
110void
112 if (getValue() != myDefaultValue) {
113 myResetButton->enable();
114 } else {
115 myResetButton->disable();
116 }
117}
118
119// ---------------------------------------------------------------------------
120// GNEOptionsEditorRow::OptionString - methods
121// ---------------------------------------------------------------------------
122
124 const std::string& topic, const std::string& name, const std::string& description, const std::string& defaultValue) :
125 OptionRow(optionsEditor, parent, topic, name, description, defaultValue) {
128 updateOption();
129}
130
131
132void
134 myStringTextField->setText(myOptionsEditor->myOptionsContainer.getString(myName).c_str());
135 updateResetButton();
136}
137
138
139void
141 myStringTextField->setText(myOptionsEditor->myOriginalOptionsContainer.getString(myName).c_str());
142 onCmdSetOption(nullptr, 0, nullptr);
143}
144
145
146long
148 myOptionsEditor->myOptionsContainer.resetWritable();
149 myOptionsEditor->myOptionsContainer.set(myName, myStringTextField->getText().text());
150 myOptionsEditor->myOptionsModified = true;
151 updateResetButton();
152 return 1;
153}
154
155
156long
158 myStringTextField->setText(myDefaultValue.c_str());
159 updateResetButton();
160 return 1;
161}
162
163
164std::string
166 return myStringTextField->getText().text();
167}
168
169
171 const std::string& topic, const std::string& name, const std::string& description, const std::string& defaultValue) :
172 OptionRow(optionsEditor, parent, topic, name, description, defaultValue) {
174 updateOption();
175}
176
177
178void
180 myStringVectorTextField->setText(toString(myOptionsEditor->myOptionsContainer.getStringVector(myName)).c_str());
181 updateResetButton();
182}
183
184
185void
187 myStringVectorTextField->setText(toString(myOptionsEditor->myOriginalOptionsContainer.getStringVector(myName)).c_str());
188 onCmdSetOption(nullptr, 0, nullptr);
189}
190
191
192long
194 myOptionsEditor->myOptionsContainer.resetWritable();
195 myOptionsEditor->myOptionsContainer.set(myName, myStringVectorTextField->getText().text());
196 myOptionsEditor->myOptionsModified = true;
197 updateResetButton();
198 return 1;
199}
200
201
202long
204 myStringVectorTextField->setText(myDefaultValue.c_str());
205 updateResetButton();
206 return 1;
207}
208
209
210std::string
212 return myStringVectorTextField->getText().text();
213}
214
215// ---------------------------------------------------------------------------
216// GNEOptionsEditorRow::OptionBool - methods
217// ---------------------------------------------------------------------------
218
220 const std::string& topic, const std::string& name, const std::string& description, const std::string& defaultValue) :
221 OptionRow(optionsEditor, parent, topic, name, description, defaultValue) {
223 updateOption();
224}
225
226
227void
229 if (myOptionsEditor->myOptionsContainer.getBool(myName)) {
230 myCheckButton->setCheck(TRUE);
231 myCheckButton->setText(TL("true"));
232 } else {
233 myCheckButton->setCheck(FALSE);
234 myCheckButton->setText(TL("false"));
235 }
236 updateResetButton();
237}
238
239
240void
242 if (myOptionsEditor->myOriginalOptionsContainer.getBool(myName)) {
243 myCheckButton->setCheck(TRUE);
244 myCheckButton->setText(TL("true"));
245 } else {
246 myCheckButton->setCheck(FALSE);
247 myCheckButton->setText(TL("false"));
248 }
249 onCmdSetOption(nullptr, 0, nullptr);
250}
251
252
253long
255 myOptionsEditor->myOptionsContainer.resetWritable();
256 if (myCheckButton->getCheck()) {
257 myOptionsEditor->myOptionsContainer.set(myName, "true");
258 myCheckButton->setText(TL("true"));
259 } else {
260 myOptionsEditor->myOptionsContainer.set(myName, "false");
261 myCheckButton->setText(TL("false"));
262 }
263 myOptionsEditor->myOptionsModified = true;
264 // special checks for Debug flags
265 if ((myName == "gui-testing-debug") && myOptionsEditor->myOptionsContainer.isSet("gui-testing-debug")) {
266 MsgHandler::enableDebugMessages(myOptionsEditor->myOptionsContainer.getBool("gui-testing-debug"));
267 }
268 if ((myName == "gui-testing-debug-gl") && myOptionsEditor->myOptionsContainer.isSet("gui-testing-debug-gl")) {
269 MsgHandler::enableDebugGLMessages(myOptionsEditor->myOptionsContainer.getBool("gui-testing-debug-gl"));
270 }
271 updateResetButton();
272 return 1;
273}
274
275
276long
278 if (myDefaultValue.empty()) {
279 myCheckButton->setCheck(FALSE);
280 myCheckButton->setText(TL("false"));
281 } else if (StringUtils::toBool(myDefaultValue)) {
282 myCheckButton->setCheck(TRUE);
283 myCheckButton->setText(TL("true"));
284 } else {
285 myCheckButton->setCheck(FALSE);
286 myCheckButton->setText(TL("false"));
287 }
288 updateResetButton();
289 return 1;
290}
291
292
293std::string
295 return myCheckButton->getCheck() ? "true" : "false";
296}
297
298// ---------------------------------------------------------------------------
299// GNEOptionsEditorRow::OptionInt - methods
300// ---------------------------------------------------------------------------
301
303 const std::string& topic, const std::string& name, const std::string& description, const std::string& defaultValue) :
304 OptionRow(optionsEditor, parent, topic, name, description, defaultValue) {
306 updateOption();
307}
308
309
310void
312 myIntTextField->setText(toString(myOptionsEditor->myOptionsContainer.getInt(myName)).c_str());
313 updateResetButton();
314}
315
316
317void
319 myIntTextField->setText(toString(myOptionsEditor->myOriginalOptionsContainer.getInt(myName)).c_str());
320 onCmdSetOption(nullptr, 0, nullptr);
321}
322
323
324long
326 if (myIntTextField->getText().empty()) {
327 myIntTextField->setText(myDefaultValue.c_str());
328 } else {
329 myOptionsEditor->myOptionsContainer.resetWritable();
330 myOptionsEditor->myOptionsContainer.set(myName, myIntTextField->getText().text());
331 myOptionsEditor->myOptionsModified = true;
332 }
333 updateResetButton();
334 return 1;
335}
336
337
338long
340 myIntTextField->setText(myDefaultValue.c_str());
341 updateResetButton();
342 return 1;
343}
344
345
346std::string
348 return myIntTextField->getText().text();
349}
350
351// ---------------------------------------------------------------------------
352// GNEOptionsEditorRow::OptionIntVector - methods
353// ---------------------------------------------------------------------------
354
356 const std::string& topic, const std::string& name, const std::string& description, const std::string& defaultValue) :
357 OptionRow(optionsEditor, parent, topic, name, description, defaultValue) {
360 updateOption();
361}
362
363
364void
366 myIntVectorTextField->setText(toString(myOptionsEditor->myOptionsContainer.getIntVector(myName)).c_str());
367 updateResetButton();
368}
369
370
371void
373 myIntVectorTextField->setText(toString(myOptionsEditor->myOriginalOptionsContainer.getIntVector(myName)).c_str());
374 onCmdSetOption(nullptr, 0, nullptr);
375}
376
377
378long
380 try {
381 // check that int vector can be parsed
382 const auto intVector = StringTokenizer(myIntVectorTextField->getText().text()).getVector();
383 for (const auto& intValue : intVector) {
384 StringUtils::toInt(intValue);
385 }
386 myOptionsEditor->myOptionsContainer.resetWritable();
387 myOptionsEditor->myOptionsContainer.set(myName, myIntVectorTextField->getText().text());
388 myIntVectorTextField->setTextColor(GUIDesignTextColorBlack);
389 myOptionsEditor->myOptionsModified = true;
390 } catch (...) {
391 myIntVectorTextField->setTextColor(GUIDesignTextColorRed);
392 }
393 updateResetButton();
394 return 1;
395}
396
397
398long
400 myIntVectorTextField->setText(myDefaultValue.c_str());
401 updateResetButton();
402 return 1;
403}
404
405
406std::string
408 return myIntVectorTextField->getText().text();
409}
410
411// ---------------------------------------------------------------------------
412// GNEOptionsEditorRow::OptionFloat - methods
413// ---------------------------------------------------------------------------
414
415GNEOptionsEditorRow::OptionFloat::OptionFloat(GNEOptionsEditor* optionsEditor, FXComposite* parent, const std::string& topic,
416 const std::string& name, const std::string& description, const std::string& defaultValue) :
417 OptionRow(optionsEditor, parent, topic, name, description, parseFloat(defaultValue)) {
420 updateOption();
421}
422
423
424void
426 myFloatTextField->setText(toString(myOptionsEditor->myOptionsContainer.getFloat(myName)).c_str());
427 updateResetButton();
428}
429
430
431void
433 myFloatTextField->setText(toString(myOptionsEditor->myOriginalOptionsContainer.getFloat(myName)).c_str());
434 onCmdSetOption(nullptr, 0, nullptr);
435}
436
437
438long
440 // avoid empty values
441 if (myFloatTextField->getText().empty()) {
442 myFloatTextField->setText(myDefaultValue.c_str());
443 } else {
444 myOptionsEditor->myOptionsContainer.resetWritable();
445 myOptionsEditor->myOptionsContainer.set(myName, myFloatTextField->getText().text());
446 myOptionsEditor->myOptionsModified = true;
447 }
448 updateResetButton();
449 return 1;
450}
451
452
453long
455 myFloatTextField->setText(myDefaultValue.c_str());
456 updateResetButton();
457 return 1;
458}
459
460
461std::string
463 return myFloatTextField->getText().text();
464}
465
466
467std::string
468GNEOptionsEditorRow::OptionFloat::parseFloat(const std::string& value) const {
469 try {
470 return toString(StringUtils::toDouble(value));
471 } catch (...) {
472 return value;
473 }
474}
475
476// ---------------------------------------------------------------------------
477// GNEOptionsEditorRow::OptionTime - methods
478// ---------------------------------------------------------------------------
479
480GNEOptionsEditorRow::OptionTime::OptionTime(GNEOptionsEditor* optionsEditor, FXComposite* parent, const std::string& topic,
481 const std::string& name, const std::string& description, const std::string& defaultValue) :
482 OptionRow(optionsEditor, parent, topic, name, description, parseTime(defaultValue)) {
485 updateOption();
486}
487
488
489void
491 myTimeTextField->setText(toString(myOptionsEditor->myOptionsContainer.getString(myName)).c_str());
492 updateResetButton();
493}
494
495
496void
498 myTimeTextField->setText(toString(myOptionsEditor->myOriginalOptionsContainer.getString(myName)).c_str());
499 onCmdSetOption(nullptr, 0, nullptr);
500}
501
502
503long
505 // avoid empty values
506 if (myTimeTextField->getText().empty()) {
507 myTimeTextField->setText(myDefaultValue.c_str());
508 } else {
509 myOptionsEditor->myOptionsContainer.resetWritable();
510 myOptionsEditor->myOptionsContainer.set(myName, myTimeTextField->getText().text());
511 myOptionsEditor->myOptionsModified = true;
512 }
513 updateResetButton();
514 return 1;
515}
516
517
518long
520 myTimeTextField->setText(myDefaultValue.c_str());
521 updateResetButton();
522 return 1;
523}
524
525
526std::string
528 return myTimeTextField->getText().text();
529}
530
531
532std::string
533GNEOptionsEditorRow::OptionTime::parseTime(const std::string& value) const {
534 try {
535 return time2string(string2time(value));
536 } catch (...) {
537 return value;
538 }
539}
540
541// ---------------------------------------------------------------------------
542// GNEOptionsEditorRow::OptionFilename - methods
543// ---------------------------------------------------------------------------
544
545GNEOptionsEditorRow::OptionFilename::OptionFilename(GNEOptionsEditor* optionsEditor, FXComposite* parent, const std::string& topic,
546 const std::string& name, const std::string& description, const std::string& defaultValue) :
547 OptionRow(optionsEditor, parent, topic, name, description, defaultValue) {
551 updateOption();
552}
553
554
555void
557 myFilenameTextField->setText(myOptionsEditor->myOptionsContainer.getString(myName).c_str());
558 updateResetButton();
559}
560
561
562void
564 myFilenameTextField->setText(myOptionsEditor->myOriginalOptionsContainer.getString(myName).c_str());
565 onCmdSetOption(nullptr, 0, nullptr);
566}
567
568
569long
571 // get open mode
572 GNEFileDialog::OpenMode openMode = (myName.find("output") != std::string::npos) ? GNEFileDialog::OpenMode::SAVE : GNEFileDialog::OpenMode::LOAD_SINGLE;
573 // open dialog
574 const auto XMLFileDialog = GNEFileDialog(myOptionsEditor->myDialog->getApplicationWindow(), TL("XML file"),
575 SUMOXMLDefinitions::XMLFileExtensions.getStrings(), openMode,
577 // check that file is valid
578 if (XMLFileDialog.getResult() == GNEDialog::Result::ACCEPT) {
579 myFilenameTextField->setText(XMLFileDialog.getFilename().c_str(), TRUE);
580 }
581 updateResetButton();
582 return 1;
583}
584
585
586long
588 if (SUMOXMLDefinitions::isValidFilename(myFilenameTextField->getText().text())) {
589 myOptionsEditor->myOptionsContainer.resetWritable();
590 myOptionsEditor->myOptionsContainer.set(myName, myFilenameTextField->getText().text());
591 myFilenameTextField->setTextColor(GUIDesignTextColorBlack);
592 myOptionsEditor->myOptionsModified = true;
593 } else {
594 myFilenameTextField->setTextColor(GUIDesignTextColorRed);
595 }
596 updateResetButton();
597 return 1;
598}
599
600
601long
603 myFilenameTextField->setText(myDefaultValue.c_str());
604 updateResetButton();
605 return 1;
606}
607
608
610
611
612std::string
614 return myFilenameTextField->getText().text();
615}
616
617/****************************************************************************/
FXDEFMAP(GNEOptionsEditorRow::OptionRow) OptionRowMap[]
#define MINNAMEWIDTH
#define MARGIN
@ MID_GNE_SET_ATTRIBUTE
attribute edited
Definition GUIAppEnum.h:991
@ MID_GNE_SET_ATTRIBUTE_DIALOG
attribute edited trough dialog
@ MID_GNE_RESET
reset element
Definition GUIAppEnum.h:999
#define GUIDesignTextColorRed
red color (for invalid text)
Definition GUIDesigns.h:44
#define GUIDesignButtonIcon
button only with icon
Definition GUIDesigns.h:109
#define GUIDesignTextField
Definition GUIDesigns.h:74
#define GUIDesignAuxiliarHorizontalFrame
design for auxiliar (Without borders) horizontal frame used to pack another frames
Definition GUIDesigns.h:430
#define GUIDesignTextFieldNCol
Num of column of text field.
Definition GUIDesigns.h:92
#define GUIDesignTextColorBlack
black color (for correct text)
Definition GUIDesigns.h:38
#define GUIDesignCheckButton
checkButton placed in left position
Definition GUIDesigns.h:194
#define GUIDesignTextFieldRestricted(type)
text field extended over Frame with thick frame (int)
Definition GUIDesigns.h:77
#define GUIDesignLabelThickedFixed(width)
label thicked, icon before text, text centered and custom width
Definition GUIDesigns.h:254
@ OPEN
open icons
#define TL(string)
Definition MsgHandler.h:305
SUMOTime string2time(const std::string &r)
convert string to SUMOTime
Definition SUMOTime.cpp:46
std::string time2string(SUMOTime t, bool humanReadable)
convert SUMOTime to string (independently of global format setting)
Definition SUMOTime.cpp:91
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:46
OpenMode
file open mode
OptionsCont & myOptionsContainer
reference to edited Option container
std::string getValue() const
get value
long onCmdSetOption(FXObject *, FXSelector, void *)
called when user set value in textField/button/checkBox
long onCmdResetOption(FXObject *, FXSelector, void *)
called when user press reset button
FXCheckButton * myCheckButton
menu check
OptionBool(GNEOptionsEditor *optionsEditor, FXComposite *parent, const std::string &topic, const std::string &name, const std::string &description, const std::string &defaultValue)
constructor
FXButton * myOpenFilenameButton
open filename button
long onCmdSetOption(FXObject *, FXSelector, void *)
called when user set value in textField/button/checkBox
long onCmdResetOption(FXObject *, FXSelector, void *)
called when user press reset button
std::string getValue() const
get value
long onCmdOpenDialog(FXObject *, FXSelector, void *)
called when user press open dialog button
FXTextField * myFilenameTextField
text field
long onCmdSetOption(FXObject *, FXSelector, void *)
called when user set value in textField/button/checkBox
std::string parseFloat(const std::string &value) const
parse float xx to xx.00
std::string getValue() const
get value
long onCmdResetOption(FXObject *, FXSelector, void *)
called when user press reset button
FXTextField * myFloatTextField
text field
OptionFloat(GNEOptionsEditor *optionsEditor, FXComposite *parent, const std::string &topic, const std::string &name, const std::string &description, const std::string &defaultValue)
constructor
FXTextField * myIntTextField
text field
long onCmdResetOption(FXObject *, FXSelector, void *)
called when user press reset button
OptionInt(GNEOptionsEditor *optionsEditor, FXComposite *parent, const std::string &topic, const std::string &name, const std::string &description, const std::string &defaultValue)
long onCmdSetOption(FXObject *, FXSelector, void *)
called when user set value in textField/button/checkBox
std::string getValue() const
get value
OptionIntVector(GNEOptionsEditor *optionsEditor, FXComposite *parent, const std::string &topic, const std::string &name, const std::string &description, const std::string &defaultValue)
long onCmdSetOption(FXObject *, FXSelector, void *)
called when user set value in textField/button/checkBox
long onCmdResetOption(FXObject *, FXSelector, void *)
called when user press reset button
GNEOptionsEditor * myOptionsEditor
FOX needs this.
MFXLabelTooltip * myNameLabel
tooltip label for name
const std::string getDescriptionLower() const
get description (Lower)
const std::string & getTopic() const
get topic
void updateResetButton()
update reset button
virtual long onCmdSetOption(FXObject *, FXSelector, void *)=0
called when user set value in textField/button/checkBox
const std::string getNameLower() const
get name (Lower)
FXHorizontalFrame * myContentFrame
content frame
void adjustNameSize()
adjust input name size
virtual long onCmdResetOption(FXObject *, FXSelector, void *)=0
called when user press reset button
long onCmdSetOption(FXObject *, FXSelector, void *)
called when user set value in textField/button/checkBox
long onCmdResetOption(FXObject *, FXSelector, void *)
called when user press reset button
std::string getValue() const
get value
OptionString(GNEOptionsEditor *optionsEditor, FXComposite *parent, const std::string &topic, const std::string &name, const std::string &description, const std::string &defaultValue)
constructor
FXTextField * myStringTextField
text field
long onCmdResetOption(FXObject *, FXSelector, void *)
called when user press reset button
OptionStringVector(GNEOptionsEditor *optionsEditor, FXComposite *parent, const std::string &topic, const std::string &name, const std::string &description, const std::string &defaultValue)
constructor
long onCmdSetOption(FXObject *, FXSelector, void *)
called when user set value in textField/button/checkBox
FXTextField * myTimeTextField
text field
long onCmdSetOption(FXObject *, FXSelector, void *)
called when user set value in textField/button/checkBox
std::string getValue() const
get value
std::string parseTime(const std::string &value) const
parse float xx to xx.00
long onCmdResetOption(FXObject *, FXSelector, void *)
called when user press reset button
OptionTime(GNEOptionsEditor *optionsEditor, FXComposite *parent, const std::string &topic, const std::string &name, const std::string &description, const std::string &defaultValue)
constructor
static FXButton * buildFXButton(FXComposite *p, const std::string &text, const std::string &tip, const std::string &help, FXIcon *ic, FXObject *tgt, FXSelector sel, FXuint opts=BUTTON_NORMAL, FXint x=0, FXint y=0, FXint w=0, FXint h=0, FXint pl=DEFAULT_PAD, FXint pr=DEFAULT_PAD, FXint pt=DEFAULT_PAD, FXint pb=DEFAULT_PAD)
build button
static FXIcon * getIcon(const GUIIcon which)
returns a icon previously defined in the enum GUIIcon
static void enableDebugGLMessages(bool enable)
enable/disable gl-debug messages
static void enableDebugMessages(bool enable)
enable/disable debug messages
double getFloat(const std::string &name) const
Returns the double-value of the named option (only for Option_Float)
const IntVector & getIntVector(const std::string &name) const
Returns the list of integer-value of the named option (only for Option_IntVector)
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
static StringBijection< XMLFileExtension > XMLFileExtensions
XML file Extensions.
static bool isValidFilename(const std::string &value)
whether the given string is a valid attribute for a filename (for example, a name)
std::vector< std::string > getVector()
return vector of strings
static std::string to_lower_case(const std::string &str)
Transfers the content to lower case.
static double toDouble(const std::string &sData)
converts a string into the double value described by it by calling the char-type converter
static int toInt(const std::string &sData)
converts a string into the integer value described by it by calling the char-type converter,...
static bool toBool(const std::string &sData)
converts a string into the bool value described by it by calling the char-type converter
Definition json.hpp:4471