81 FXScrollWindow* scrollWindow =
new FXScrollWindow(
this, LAYOUT_FILL);
95 for (
const auto& newParameter : newParameters) {
96 addParameter(newParameter);
104 myParameterRows.back()->enableRow(newParameter.first, newParameter.second);
106 myParameterRows.push_back(
new ParameterRow(
this, myVerticalFrameRow));
108 myParameterRows.back()->toggleAddButton();
115 for (
const auto& parameterRow : myParameterRows) {
119 myParameterRows.clear();
121 myParameterRows.push_back(
new ParameterRow(
this, myVerticalFrameRow));
123 myParameterRows.back()->toggleAddButton();
127const std::vector<GNEMultipleParametersDialog::ParametersValues::ParameterRow*>
129 return myParameterRows;
136 for (
const auto& row : myParameterRows) {
137 if (row->keyField->getText().text() == key) {
148 if (myParameterRows.size() > 0) {
149 myKeyLabel->setWidth(myParameterRows.front()->keyField->getWidth());
151 return FXGroupBox::onPaint(o, f, p);
158 for (
int i = 0; i < (int)myParameterRows.size(); i++) {
159 if (myParameterRows.at(i)->keyField == obj) {
163 myParameterRows.at(i)->valueChanged =
true;
166 myParameterRows.at(i)->keyField->killFocus();
168 }
else if (myParameterRows.at(i)->valueField == obj) {
170 myParameterRows.at(i)->valueChanged =
true;
180 if (myParameterRows.back()->button == obj) {
182 addParameter(std::make_pair(
"",
""));
186 for (
int i = 0; i < (int)myParameterRows.size(); i++) {
187 if (myParameterRows.at(i)->button == obj) {
189 delete myParameterRows.at(i);
191 myParameterRows.erase(myParameterRows.begin() + i);
202 valueChanged(false) {
208 if (verticalFrameParent->id()) {
218 delete horizontalFrame;
225 keyField->setText(
"");
227 valueField->setText(
"");
228 valueField->disable();
237 keyField->setText(parameter.c_str());
245 valueField->setText(value.c_str());
246 valueField->enable();
256 keyField->setText(
"");
258 valueField->setText(
"");
259 valueField->disable();
275 keyField->setText(other.
keyField->getText());
276 valueField->setText(other.
valueField->getText());
285 myParameterDialogParent(ParameterDialogParent) {
301 FXFileDialog opendialog(
this,
TL(
"Open Parameter Template"));
303 opendialog.setSelectMode(SELECTFILE_EXISTING);
308 if (opendialog.execute()) {
310 std::string file = opendialog.getFilename().text();
312 const int numberOfParametersbeforeLoad = (int)myParameterDialogParent->myParametersValues->getParameterRows().size();
319 WRITE_MESSAGEF(
TL(
"Loaded % Parameters."),
toString((
int)myParameterDialogParent->myParametersValues->getParameterRows().size() - numberOfParametersbeforeLoad));
329 TL(
"Save Parameter Template file"),
342 for (
const auto& row : myParameterDialogParent->myParametersValues->getParameterRows()) {
344 if (row != myParameterDialogParent->myParametersValues->getParameterRows().back()) {
365 myParameterDialogParent->myParametersValues->clearParameters();
373 std::vector<std::pair<std::string, std::string> > nonEmptyKeyValues;
374 std::vector<std::string> emptyKeyValues;
376 for (
const auto& parameterRow : myParameterDialogParent->myParametersValues->getParameterRows()) {
378 if (!parameterRow->keyField->getText().empty()) {
379 nonEmptyKeyValues.push_back(std::make_pair(parameterRow->keyField->getText().text(), parameterRow->valueField->getText().text()));
380 }
else if (!parameterRow->valueField->getText().empty()) {
381 emptyKeyValues.push_back(parameterRow->valueField->getText().text());
385 std::sort(nonEmptyKeyValues.begin(), nonEmptyKeyValues.end());
387 std::sort(emptyKeyValues.begin(), emptyKeyValues.end());
389 for (
const auto& emptyKeyValue : emptyKeyValues) {
390 nonEmptyKeyValues.push_back(std::make_pair(
"", emptyKeyValue));
393 myParameterDialogParent->myParametersValues->setParameters(nonEmptyKeyValues);
401 std::ostringstream help;
403 <<
TL(
"- Parameters are defined by a Key and a Value.") <<
"\n"
404 <<
TL(
"- In Netedit can be defined using format key1=parameter1|key2=parameter2|...") <<
"\n"
405 <<
TL(
" - Duplicated and empty Keys aren't valid.") <<
"\n"
406 <<
TL(
" - Whitespace and certain characters aren't allowed (@$%^&/|\\....)");
408 GNEHelpBasicDialog(myParameterDialogParent->myAttributesEditor->getFrameParent()->getViewNet()->getViewParent()->getGNEAppWindows(),
409 TL(
"Parameters Help"), help);
416 myParametersOperationsParent(ParametersOperationsParent) {
438 if (key.size() == 0) {
441 WRITE_WARNINGF(
TL(
"Key '%' of Parameter contains invalid characters"), key);
443 }
else if (myParametersOperationsParent->myParameterDialogParent->myParametersValues->keyExist(key)) {
447 myParametersOperationsParent->myParameterDialogParent->myParametersValues->addParameter(std::make_pair(key, value));
468 return (myOnlyForExistentKeys->getCheck() == TRUE);
476 GNEDialog(attributesEditor->getFrameParent()->getViewNet()->getViewParent()->getGNEAppWindows(),
509 if (inspectedElements.isInspectingElements()) {
513 std::vector<std::pair<std::string, std::string> > parametersChanged;
515 std::vector<std::string> keepKeys;
521 keepKeys.push_back(parameterRow->keyField->getText().text());
523 if (parameterRow->valueChanged) {
524 if (parameterRow->keyField->getText().empty()) {
534 parametersChanged.push_back(std::make_pair(parameterRow->keyField->getText().text(), parameterRow->valueField->getText().text()));
539 std::sort(parametersChanged.begin(), parametersChanged.end());
541 for (
auto i = parametersChanged.begin(); i != parametersChanged.end(); i++) {
542 if (((i + 1) != parametersChanged.end()) && (i->first) == (i + 1)->first) {
549 undoList->
begin(inspectedElements.getFirstAC(),
"change parameters");
551 for (
const auto& AC : inspectedElements.getACs()) {
553 AC->removeACParametersKeys(keepKeys, undoList);
555 for (
const auto& parameter : parametersChanged) {
559 AC->addACParameters(parameter.first, parameter.second, undoList);
567 getApp()->stopModal(
this, TRUE);
575 getApp()->stopModal(
this, FALSE);
583 std::map<std::string, std::vector<std::string> > keyValuesMap;
586 for (
const auto& keyAttribute : AC->getACParametersMap()) {
587 keyValuesMap[keyAttribute.first].push_back(keyAttribute.second);
591 std::vector<std::pair<std::string, std::string> > keyValues;
592 for (
const auto& keyAttribute : keyValuesMap) {
594 std::set<std::string> valuesNonDuplicated;
595 for (
const auto& value : keyAttribute.second) {
596 valuesNonDuplicated.insert(value);
600 for (
const auto& value : valuesNonDuplicated) {
601 values.append(value +
" ");
603 if (!values.empty()) {
607 keyValues.push_back(std::make_pair(keyAttribute.first, values));
FXDEFMAP(GNEMultipleParametersDialog) GNEMultipleParametersDialogMap[]
@ MID_GNE_SET_ATTRIBUTE
attribute edited
@ MID_GNE_REMOVE_ATTRIBUTE
attribute removed
@ MID_GNE_BUTTON_CANCEL
cancel button
@ MID_GNE_BUTTON_RESET
reset button
@ MID_GNE_BUTTON_SAVE
save button
@ MID_GNE_BUTTON_SORT
sort button
@ MID_GNE_BUTTON_LOAD
load button
@ MID_GNE_BUTTON_CLEAR
clear button
@ MID_GNE_BUTTON_ACCEPT
accept button
@ MID_GNE_SET_ATTRIBUTE_BOOL
bool attribute edited
#define GUIDesignGroupBoxFrame100
Group box design for elements of width 100.
#define GUIDesignTextColorRed
red color (for invalid text)
#define GUIDesignButtonIcon
button only with icon
#define GUIDesignTextField
#define GUIDesignAuxiliarHorizontalFrame
design for auxiliar (Without borders) horizontal frame used to pack another frames
#define GUIDesignTextFieldNCol
Num of column of text field.
#define GUIDesignAuxiliarVerticalFrame
design for auxiliar (Without borders) horizontal frame used to pack another frames
#define GUIDesignTextColorBlue
blue color (for default text)
#define GUIDesignLabelThick(justify)
label extended over frame with thick and with text justify to left
#define GUIDesignTextColorBlack
black color (for correct text)
#define GUIDesignGroupBoxFrameFill
Group box design extended over frame (X and Y)
#define GUIDesignButtonFixed(width)
button rectangular with thick and raise frame with the given width
#define GUIDesignAuxiliarFrame
design for auxiliar (Without borders) frame extended in all directions
#define GUIDesignLabelThickedFixed(width)
label thicked, icon before text, text centered and custom width
#define GUIDesignCheckButtonExtraHeight
checkButton placed in left position with double size
#define GUIDesignLabelIconThick
label squared over frame with thick and with text justify to center
FXString gCurrentFolder
The folder used as last.
GUIIcon
An enumeration of icons used by the gui applications.
#define WRITE_WARNINGF(...)
#define WRITE_MESSAGEF(...)
#define WRITE_WARNING(msg)
@ SUMO_TAG_PARAM
parameter associated to a certain key
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
GNEFrame * getFrameParent() const
pointer to GNEFrame parent
const std::vector< GNEAttributeCarrier * > & getEditedAttributeCarriers() const
get edited attribute carriers
FXVerticalFrame * myContentFrame
content frame
GNEApplicationWindow * myApplicationWindow
FOX needs this.
OpenType
Open dialog type.
void openDialog()
open dialog
GNEViewNet * getViewNet() const
get view net
GNEParameterHandler(ParametersOperations *ParametersOperationsParent, const std::string &file)
Constructor.
~GNEParameterHandler()
Destructor.
void myStartElement(int element, const SUMOSAXAttributes &attrs)
Called on the opening of a tag;.
long onCmdLoadParameters(FXObject *, FXSelector, void *)
FXButton * mySortButton
sort button
long onCmdSortParameters(FXObject *, FXSelector, void *)
event when user press sort parameters button
long onCmdHelpParameter(FXObject *, FXSelector, void *)
event when user press help parameters button
FXButton * myClearButton
clear button
long onCmdSaveParameters(FXObject *, FXSelector, void *)
event when user press save parameters button
long onCmdClearParameters(FXObject *, FXSelector, void *)
event when user press clear parameters button
~ParametersOperations()
destructor
FXButton * myHelpButton
help button
ParametersOperations(FXVerticalFrame *frame, GNEMultipleParametersDialog *ParameterDialogParent)
FOX-declaration.
FXButton * myLoadButton
load button
FXButton * mySaveButton
save button
FXCheckButton * myOnlyForExistentKeys
apply changes only for existent keys
ParametersOptions(FXVerticalFrame *frame)
constructor
bool onlyForExistentKeys() const
apply changes to all elements
~ParametersOptions()
destructor
FXButton * button
Button for add or remove row.
FXTextField * valueField
TextField for value.
void enableRow(const std::string ¶meter, const std::string &value) const
enable row
void copyValues(const ParameterRow &other)
copy values of other parameter Row
void toggleAddButton()
toggle add button
FXHorizontalFrame * horizontalFrame
frame in which elements of ParameterRow are placed
bool isButtonInAddMode() const
check if remove button is in mode "add"
ParameterRow(ParametersValues *ParametersValues, FXVerticalFrame *verticalFrameParent)
constructor
void disableRow()
disable row
FXTextField * keyField
TextField for parameter.
~ParameterRow()
destructor
bool keyExist(const std::string &key) const
check if given key exist already
long onPaint(FXObject *o, FXSelector f, void *p)
void setParameters(const std::vector< std::pair< std::string, std::string > > &newParameters)
set parameters
const std::vector< ParameterRow * > getParameterRows() const
get vector with the ParameterRows
long onCmdSetAttribute(FXObject *, FXSelector, void *)
event when user change an attribute
void addParameter(std::pair< std::string, std::string > newParameter)
add a single parameter
void clearParameters()
clear all parameters
~ParametersValues()
destructor
long onCmdButtonPress(FXObject *, FXSelector, void *)
event when user press a remove (or add) button
ParametersOperations * myParametersOperations
pointer to parameters operations
~GNEMultipleParametersDialog()
destructor
long onCmdAccept(FXObject *, FXSelector, void *)
event after press accept button
long onCmdCancel(FXObject *, FXSelector, void *)
event after press cancel button
GNEAttributesEditorType * myAttributesEditor
FOX need this.
GNEMultipleParametersDialog(GNEAttributesEditorType *attributesEditor)
Constructor for parameter editor inspector.
ParametersOptions * myParametersOptions
pointer to parameters options
ParametersValues * myParametersValues
pointer to parameters values
void runInternalTest(const InternalTestStep::DialogArgument *dialogArgument)
run internal test
long onCmdReset(FXObject *, FXSelector, void *)
event after press reset button
void end()
End undo command sub-group. If the sub-group is still empty, it will be deleted; otherwise,...
void begin(GUIIcon icon, const std::string &description)
Begin undo command sub-group with current supermode. This begins a new group of commands that are tre...
GNEViewNetHelper::InspectedElements & getInspectedElements()
get inspected elements
GNEUndoList * getUndoList() const
get the undoList object
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
dialog arguments, used for certain modal dialogs that can not be edited using tab
static FXString getFilename2Write(FXWindow *parent, const FXString &header, const FXString &extensions, FXIcon *icon, FXString ¤tFolder)
Returns the file name to write.
Static storage of an output device and its base (abstract) implementation.
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
void close()
Closes the device and removes it from the dictionary.
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
bool closeTag(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
static OutputDevice & getDevice(const std::string &name, bool usePrefix=true)
Returns the described OutputDevice.
bool writeXMLHeader(const std::string &rootElement, const std::string &schemaFile, std::map< SumoXMLAttr, std::string > attrs=std::map< SumoXMLAttr, std::string >(), bool includeConfig=true)
Writes an XML header with optional configuration.
Encapsulated SAX-Attributes.
virtual std::string getString(int id, bool *isPresent=nullptr) const =0
Returns the string-value of the named (by its enum-value) attribute.
virtual bool hasAttribute(int id) const =0
Returns the information whether the named (by its enum-value) attribute is within the current list.
SAX-handler base for SUMO-files.
static StringBijection< XMLFileExtension > XMLFileExtensions
XML file Extensions.
static bool isValidParameterKey(const std::string &value)
whether the given string is a valid key for a parameter
static bool runParser(GenericSAXHandler &handler, const std::string &file, const bool isNet=false, const bool isRoute=false, const bool isExternal=false, const bool catchExceptions=true)
Runs the given handler on the given file; returns if everything's ok.