Skip to content

Commit 98c7cf7

Browse files
committed
GUI: improved performance when evaluating variables.
1 parent 14d1665 commit 98c7cf7

13 files changed

+62
-47
lines changed

gui/tree/tree.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -505,9 +505,9 @@ bool Tree::fileOpen(QString fileName)
505505
clearTree();
506506
TreeElement *element = TreeElement::newTreeElement(this, nullptr, _schema.rootElement, "", xmlNode, false/*fillWithDefaults*/);
507507
rootElement = dynamic_cast<TreeElementComplex*>(element); // set rootElement after complete initialization
508-
VariableList varList;
508+
VariableListPtr varList = std::make_shared<const VariableList>();
509509
QMap<QString, QString> labelTypes;
510-
rootElement->updateParserResults(varList);
510+
rootElement->updateParserResults(varList, false);
511511
rootElement->updateLinks(labelTypes);
512512
rootElement->createItem(nullptr, nullptr)->setExpanded(true);
513513
treeChanged();

gui/tree/treeElement.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -419,10 +419,11 @@ int TreeElement::insertNewValue(const QString &value, bool prepend)
419419

420420
/***********************************************/
421421

422-
void TreeElement::updateParserResults(VariableList &varList)
422+
VariableListPtr TreeElement::updateParserResults(VariableListPtr varList, Bool /*addVariableInReturn*/)
423423
{
424-
if(loop) {VariableList varListLocal = varList; loop->updateParserResults(varListLocal);}
425-
if(condition) {VariableList varListLocal = varList; condition->updateParserResults(varListLocal);}
424+
if(loop) loop->updateParserResults(varList, false);
425+
if(condition) condition->updateParserResults(varList, false);
426+
return varList;
426427
}
427428

428429
/***********************************************/

gui/tree/treeElement.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ class TreeElementLoopCondition;
3434
class TreeItem;
3535
class QComboBox;
3636

37+
typedef std::shared_ptr<const VariableList> VariableListPtr;
38+
3739
/***** CLASS ***********************************/
3840

3941
class TreeElement : public QObject
@@ -174,8 +176,9 @@ class TreeElement : public QObject
174176

175177
protected:
176178
/** @brief inform this element about changed variables.
177-
* recursively called for all children. */
178-
virtual void updateParserResults(VariableList &varList);
179+
* recursively called for all children.
180+
* If this element is a variable and @a addVariableInReturn an updated varList is returned. */
181+
virtual VariableListPtr updateParserResults(VariableListPtr varList, Bool addVariableInReturn);
179182

180183
/** @brief inform this element about changed variables.
181184
* recursively called for all children. */

gui/tree/treeElementComplex.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -294,9 +294,9 @@ void TreeElementComplex::updateParserResultsInScope()
294294
{
295295
if(!initializedVariables)
296296
return;
297-
VariableList varList = this->varList; // without added local variables
297+
auto varList = this->varList; // without added local variables
298298
for(auto &child : children_[selectedIndex()])
299-
child->updateParserResults(varList);
299+
varList = child->updateParserResults(varList, true);
300300
}
301301
catch(std::exception &e)
302302
{
@@ -306,19 +306,20 @@ void TreeElementComplex::updateParserResultsInScope()
306306

307307
/***********************************************/
308308

309-
void TreeElementComplex::updateParserResults(VariableList &varList)
309+
VariableListPtr TreeElementComplex::updateParserResults(VariableListPtr varList, Bool /*addVariableInReturn*/)
310310
{
311311
try
312312
{
313313
this->varList = varList;
314314
initializedVariables = true;
315-
TreeElement::updateParserResults(varList);
315+
TreeElement::updateParserResults(varList, false);
316316
for(auto &childdrenAtIndex : children_)
317317
{
318-
VariableList varListLocal = this->varList; // without added local variables
318+
auto varListLocal = this->varList; // without added local variables
319319
for(auto &child : childdrenAtIndex)
320-
child->updateParserResults(varListLocal);
320+
varListLocal = child->updateParserResults(varListLocal, true);
321321
}
322+
return varList;
322323
}
323324
catch(std::exception &e)
324325
{

gui/tree/treeElementComplex.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ class TreeElementComplex : public TreeElement
6969
// Inform about changes in variables
7070
// ---------------------------------
7171
private:
72-
bool initializedVariables;
73-
VariableList varList;
72+
bool initializedVariables;
73+
VariableListPtr varList;
7474
QMap<QString, QString> labelTypes;
7575

7676
public:
@@ -82,8 +82,8 @@ class TreeElementComplex : public TreeElement
8282
virtual void updateLinksInScope();
8383

8484
/** @brief inform this element about changed variables.
85-
* recursively called for all children. */
86-
void updateParserResults(VariableList &varList) override;
85+
* recursively called for all children. Returns the input @a varList. */
86+
VariableListPtr updateParserResults(VariableListPtr varList, Bool /*addVariableInReturn*/) override;
8787

8888
/** @brief inform this element about changed variables.
8989
* recursively called for all children. */

gui/tree/treeElementFileName.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ void TreeElementFileName::openFileClicked()
8787
{
8888
for(int i=_valueCount; i<_valueList.size(); i++) // all possible links
8989
{
90-
QString parsed = parseExpression("{"+_valueList.at(i)+"}", varList);
90+
QString parsed = parseExpression("{"+_valueList.at(i)+"}", *varList);
9191
if(path.startsWith(parsed) && (parsed.size() > parsedVariable.size()))
9292
{
9393
variable = "{"+_valueList.at(i)+"}";

gui/tree/treeElementFileName.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,16 @@ class TreeElementFileName : public TreeElementSimple
2626
{
2727
Q_OBJECT
2828

29-
VariableList varList;
29+
VariableListPtr varList;
3030

3131
public:
3232
TreeElementFileName(Tree *tree, TreeElementComplex *parentElement, XsdElementPtr xsdElement,
3333
const QString &defaultOverride, XmlNodePtr xmlNode, bool fillWithDefaults);
3434

3535
/** @brief inform this element about changed variables.
36-
* recursively called for all children. */
37-
void updateParserResults(VariableList &varList) override {this->varList = varList; TreeElementSimple::updateParserResults(varList);}
36+
* recursively called for all children.
37+
* If this element is a variable and @a addVariableInReturn an updated varList is returned. */
38+
VariableListPtr updateParserResults(VariableListPtr varList, Bool addVariableInReturn) override {this->varList = varList; return TreeElementSimple::updateParserResults(varList, addVariableInReturn);}
3839

3940
/** @brief creates an editable combo box with additional file selector. */
4041
QWidget *createEditor() override;

gui/tree/treeElementGlobal.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,17 +92,18 @@ void TreeElementGlobal::updateParserResultsInScope()
9292

9393
/***********************************************/
9494

95-
void TreeElementGlobal::updateParserResults(VariableList &varList)
95+
VariableListPtr TreeElementGlobal::updateParserResults(VariableListPtr varListOld, Bool /*addVariableInReturn*/)
9696
{
9797
try
9898
{
99+
varList = std::make_shared<const VariableList>(*varListOld); // make copy
99100
// as the order is irrelevant -> add all variables before
100101
for(auto child : children())
101102
if(!child->label().isEmpty() && !child->disabled())
102-
varList.setVariable(child->label().toStdString(), (child->isLinked() ? "{"+child->selectedValue()+"}" : child->selectedValue()).toStdString());
103-
this->varList = varList;
103+
std::const_pointer_cast<VariableList>(varList)->setVariable(child->label().toStdString(), (child->isLinked() ? "{"+child->selectedValue()+"}" : child->selectedValue()).toStdString());
104104
for(auto child : children_[selectedIndex()])
105-
child->updateParserResults(varList);
105+
child->updateParserResults(varList, false);
106+
return varList;
106107
}
107108
catch(std::exception &e)
108109
{

gui/tree/treeElementGlobal.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,9 @@ class TreeElementGlobal : public TreeElementComplex
4242
void updateLinksInScope() override;
4343

4444
/** @brief inform this element about changed variables.
45-
* recursively called for all children. */
46-
void updateParserResults(VariableList &varList) override;
45+
* recursively called for all children.
46+
* Returns a new varList containing the global variables. */
47+
VariableListPtr updateParserResults(VariableListPtr varList, Bool /*addVariableInReturn*/) override;
4748

4849
/** @brief inform this element about changed variables.
4950
* recursively called for all children. */

gui/tree/treeElementSimple.cpp

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -92,20 +92,25 @@ void TreeElementSimple::setSelectedIndex(int index)
9292

9393
/***********************************************/
9494

95-
void TreeElementSimple::updateParserResults(VariableList &varList)
95+
VariableListPtr TreeElementSimple::updateParserResults(VariableListPtr varList, Bool addVariableInReturn)
9696
{
97-
TreeElement::updateParserResults(varList);
98-
99-
// is variable? -> add to list
100-
if(!label().isEmpty() && !disabled())
101-
varList.setVariable(label().toStdString(), (isLinked() ? "{"+selectedValue()+"}" : selectedValue()).toStdString());
102-
103-
QString resultNew = parseExpression((isLinked()) ? "{"+selectedValue()+"}" : selectedValue(), varList);
104-
if(resultNew == result)
105-
return;
106-
result = resultNew;
107-
if(item())
108-
item()->updateValue();
97+
TreeElement::updateParserResults(varList, false);
98+
99+
QString resultNew = parseExpression((isLinked()) ? "{"+selectedValue()+"}" : selectedValue(), *varList);
100+
if(resultNew != result)
101+
{
102+
result = resultNew;
103+
if(item())
104+
item()->updateValue();
105+
}
106+
107+
if(!addVariableInReturn || label().isEmpty() || disabled()) // is not variable?
108+
return varList;
109+
110+
// variable -> add to list
111+
auto varListNew = std::make_shared<VariableList>(*varList); // make copy
112+
varListNew->setVariable(label().toStdString(), (isLinked() ? "{"+selectedValue()+"}" : selectedValue()).toStdString());
113+
return std::const_pointer_cast<const VariableList>(varListNew);
109114
}
110115

111116
/***********************************************/

0 commit comments

Comments
 (0)