Commit ea7aa3e7 authored by KLOCZKO Thibaud's avatar KLOCZKO Thibaud
Browse files

Merge branch 'refactoring' of dtk.inria.fr:dtk/dtk into refactoring

parents fc64c93d 17afe9bf
......@@ -4,9 +4,9 @@
## Copyright (C) 2008 - Julien Wintz, Inria.
## Created: Fri Sep 4 10:11:02 2009 (+0200)
## Version: $Id$
## Last-Updated: lun. mars 26 14:37:41 2012 (+0200)
## Last-Updated: mer. mars 28 13:57:56 2012 (+0200)
## By: Nicolas Niclausse
## Update #: 455
## Update #: 456
######################################################################
##
### Commentary:
......@@ -38,7 +38,6 @@ set(${PROJECT_NAME}_HEADERS
dtkComposerGraphNode.h
dtkComposerGraphNodeLeaf.h
dtkComposerGraphNodeSelectBranch.h
dtkComposerGraphNodeSetConditions.h
dtkComposerGraphNodeSetInputs.h
dtkComposerGraphNodeSetOutputs.h
dtkComposerGraphNodeSetVariables.h
......@@ -128,7 +127,6 @@ set(${PROJECT_NAME}_SOURCES
dtkComposerGraphNodeEnd.cpp
dtkComposerGraphNodeLeaf.cpp
dtkComposerGraphNodeSelectBranch.cpp
dtkComposerGraphNodeSetConditions.cpp
dtkComposerGraphNodeSetInputs.cpp
dtkComposerGraphNodeSetOutputs.cpp
dtkComposerGraphNodeSetVariables.cpp
......
......@@ -4,9 +4,9 @@
* Copyright (C) 2011 - Thibaud Kloczko, Inria.
* Created: Mon Jan 30 10:34:49 2012 (+0100)
* Version: $Id$
* Last-Updated: Fri Mar 23 22:02:14 2012 (+0100)
* By: Julien Wintz
* Update #: 202
* Last-Updated: mer. mars 28 13:43:22 2012 (+0200)
* By: Nicolas Niclausse
* Update #: 209
*/
/* Commentary:
......@@ -193,7 +193,8 @@ void dtkComposer::run(void)
void dtkComposer::step(void)
{
QtConcurrent::run(d->evaluator, &dtkComposerEvaluator::step, false);
d->evaluator->step();
d->evaluator->logStack();
d->graph->update();
}
......
......@@ -4,9 +4,9 @@
* Copyright (C) 2011 - Thibaud Kloczko, Inria.
* Created: Mon Jan 30 11:34:40 2012 (+0100)
* Version: $Id$
* Last-Updated: mar. mars 27 15:31:14 2012 (+0200)
* Last-Updated: mer. mars 28 13:32:39 2012 (+0200)
* By: Nicolas Niclausse
* Update #: 463
* Update #: 492
*/
/* Commentary:
......@@ -127,7 +127,7 @@ bool dtkComposerEvaluator::step(bool run_concurrent)
if (preds.at(i)->status() != dtkComposerGraphNode::Done) {
if (preds.at(i)->endloop()) {
// predecessor is an end loop, we can continue, but we must unset the endloop flag.
// dtkTrace() << "predecessor of "<< d->current->title() << " is an end loop , continue" << preds.at(i)->title();
dtkTrace() << "predecessor of "<< d->current->title() << " is an end loop, continue" << preds.at(i)->title();
preds.at(i)->setEndLoop(false);
} else {
runnable = false;
......@@ -146,16 +146,18 @@ bool dtkComposerEvaluator::step(bool run_concurrent)
if (run_concurrent && (d->current->kind() == dtkComposerGraphNode::Leaf))
QtConcurrent::run(d->current, &dtkComposerGraphNode::eval);
else {
// dtkDebug() << "evaluate"<< d->current->title();
d->current->eval();
}
dtkComposerGraphNodeList s = d->current->successors();
max = s.count();
for (int i = 0; i < max; i++)
if (!d->stack.contains(s.at(i))) {
s.at(i)->clean();
d->stack << s.at(i);
}
dtkComposerGraphNode *node ;
for (int i = 0; i < max; i++) {
node = s.at(i);
if (!d->stack.contains(node))
d->stack << node;
}
} else {
// dtkTrace() << " node not runnable, put it at the end of the list ";
d->stack << d->current; // current is not ready, put it at the end
......
......@@ -4,9 +4,9 @@
* Copyright (C) 2012 - Nicolas Niclausse, Inria.
* Created: 2012/01/30 10:37:32
* Version: $Id$
* Last-Updated: mar. mars 27 16:09:39 2012 (+0200)
* Last-Updated: mer. mars 28 09:45:49 2012 (+0200)
* By: Nicolas Niclausse
* Update #: 463
* Update #: 465
*/
/* Commentary:
......@@ -409,6 +409,14 @@ dtkComposerFactory::dtkComposerFactory(void) : d(new dtkComposerFactoryPrivate)
d->tags["CommunicatorReceiveReal"] = QStringList() << "receive" << "distributed" << "mpi" << "communicator" << "real";;
d->types["CommunicatorReceiveReal"] = "communicatorReceiveReal";
d->nodes << "CommunicatorReceive";
d->tags["CommunicatorReceive"] = QStringList() << "receive" << "distributed" << "mpi" << "communicator";;
d->types["CommunicatorReceive"] = "communicatorReceive";
d->nodes << "CommunicatorSend";
d->tags["CommunicatorSend"] = QStringList() << "send" << "distributed" << "mpi" << "communicator";;
d->types["CommunicatorSend"] = "communicatorSend";
}
dtkComposerFactory::~dtkComposerFactory(void)
......@@ -644,6 +652,12 @@ dtkComposerNode *dtkComposerFactory::create(const QString& type)
if(type == "communicatorReceiveReal")
return new dtkComposerNodeCommunicatorReceiveReal;
if(type == "communicatorSend")
return new dtkComposerNodeCommunicatorSend;
if(type == "communicatorReceive")
return new dtkComposerNodeCommunicatorReceive;
return NULL;
}
......
......@@ -4,9 +4,9 @@
* Copyright (C) 2008-2011 - Julien Wintz, Inria.
* Created: Thu Feb 9 14:43:33 2012 (+0100)
* Version: $Id$
* Last-Updated: ven. mars 23 16:54:23 2012 (+0100)
* Last-Updated: mer. mars 28 13:59:50 2012 (+0200)
* By: Nicolas Niclausse
* Update #: 1806
* Update #: 1898
*/
/* Commentary:
......@@ -25,7 +25,6 @@
#include "dtkComposerGraphNodeEnd.h"
#include "dtkComposerGraphNodeLeaf.h"
#include "dtkComposerGraphNodeSelectBranch.h"
#include "dtkComposerGraphNodeSetConditions.h"
#include "dtkComposerGraphNodeSetInputs.h"
#include "dtkComposerGraphNodeSetOutputs.h"
#include "dtkComposerGraphNodeSetVariables.h"
......@@ -62,6 +61,9 @@ public:
void remDummyEdge(dtkComposerGraphEdge *edge, dtkComposerSceneNode *node);
void removeDummyEdge(dtkComposerGraphNode *source, dtkComposerGraphNode *dest, dtkComposerSceneNode *node);
void addNode(dtkComposerSceneNode *node, dtkComposerGraphNode *node_g, dtkComposerGraphNode *parent_g);
void remNode(dtkComposerSceneNode *node, dtkComposerGraphNode *node_g, dtkComposerGraphNode *parent_g);
public:
dtkComposerGraphNode *begin(dtkComposerSceneNode *node);
dtkComposerGraphNode *end(dtkComposerSceneNode *node);
......@@ -162,6 +164,23 @@ void dtkComposerGraphPrivate::removeDummyEdge(dtkComposerGraphNode *source, dtkC
remDummyEdge(e,node);
}
void dtkComposerGraphPrivate::addNode(dtkComposerSceneNode *node, dtkComposerGraphNode *node_g, dtkComposerGraphNode *parent_g)
{
nodes.insertMulti(node, node_g);
if (parent_g)
parent_g->addChild(node_g);
q->addItem(node_g);
}
void dtkComposerGraphPrivate::remNode(dtkComposerSceneNode *node, dtkComposerGraphNode *node_g, dtkComposerGraphNode *parent_g)
{
if (parent_g)
parent_g->removeChild(node_g);
q->removeItem(node_g);
delete node_g;
}
// /////////////////////////////////////////////////////////////////
// dtkComposerGraph
......@@ -204,23 +223,17 @@ void dtkComposerGraph::addNode(dtkComposerSceneNode *node)
end = new dtkComposerGraphNodeEnd(wrapee,"End Control");
dtkComposerGraphNode *inputs = new dtkComposerGraphNodeSetInputs(wrapee);
dtkComposerGraphNode *outputs = new dtkComposerGraphNodeSetOutputs(wrapee);
dtkComposerGraphNode *set_conds = new dtkComposerGraphNodeSetConditions(wrapee);
dtkComposerGraphNode *select = new dtkComposerGraphNodeSelectBranch(wrapee);
d->nodes.insertMulti(node, inputs);
d->nodes.insertMulti(node, outputs);
d->nodes.insertMulti(node, begin);
d->nodes.insertMulti(node, end);
d->nodes.insertMulti(node, select);
d->nodes.insertMulti(node, set_conds);
foreach (dtkComposerGraphNode *n, d->nodes.values(node) ) {
this->addItem(n);
}
d->addNode(node, begin, d->begin(node->parent()));
d->addNode(node, inputs, begin);
d->addNode(node, outputs, begin);
d->addNode(node, end, d->begin(node->parent()));
d->addNode(node, select, begin);
if (dynamic_cast<dtkComposerNodeControlFor *>(wrapee)) {
dtkComposerGraphNode *vars = new dtkComposerGraphNodeSetVariables(wrapee);
d->nodes.insertMulti(node, vars);
this->addItem(vars);
d->addNode(node, vars, begin);
QList<dtkComposerSceneNodeComposite *> blocks = dynamic_cast<dtkComposerSceneNodeControl *>(node)->blocks();
foreach (dtkComposerSceneNodeComposite *block, blocks)
......@@ -229,8 +242,7 @@ void dtkComposerGraph::addNode(dtkComposerSceneNode *node)
int cond = 0; int main = 1; int incr = 2;
d->addDummyEdge( begin, inputs, node);
d->addDummyEdge( inputs, d->begin(blocks[cond]), node);
d->addDummyEdge( d->end(blocks[cond]), set_conds, node);
d->addDummyEdge(set_conds, select, node);
d->addDummyEdge( d->end(blocks[cond]), select, node);
d->addDummyEdge( select, d->begin(blocks[main]), node);
d->addDummyEdge( select, end, node, 1);
d->addDummyEdge(d->end(blocks[main]), outputs, node);
......@@ -241,8 +253,7 @@ void dtkComposerGraph::addNode(dtkComposerSceneNode *node)
} else if (dynamic_cast<dtkComposerNodeControlForEach *>(wrapee)) {
dtkComposerGraphNode *vars = new dtkComposerGraphNodeSetVariables(wrapee);
d->nodes.insertMulti(node, vars);
this->addItem(vars);
d->addNode(node, vars, begin);
QList<dtkComposerSceneNodeComposite *> blocks = dynamic_cast<dtkComposerSceneNodeControl *>(node)->blocks();
foreach (dtkComposerSceneNodeComposite *block, blocks)
......@@ -250,13 +261,12 @@ void dtkComposerGraph::addNode(dtkComposerSceneNode *node)
int body = 0;
d->addDummyEdge( begin, inputs, node);
d->addDummyEdge( inputs, set_conds, node);
d->addDummyEdge(set_conds, select, node);
d->addDummyEdge( inputs, select, node);
d->addDummyEdge( select, d->begin(blocks[body]), node);
d->addDummyEdge( select, end, node, 1);
d->addDummyEdge( d->end(blocks[body]), outputs, node);
d->addDummyEdge(outputs, vars, node);
d->addDummyEdge( vars, set_conds, node);
d->addDummyEdge( vars, select, node);
vars->setEndLoop();
} else if (dynamic_cast<dtkComposerNodeControlWhile *>(wrapee)) {
......@@ -267,8 +277,7 @@ void dtkComposerGraph::addNode(dtkComposerSceneNode *node)
int cond_block = 0; int body_block = 1;
d->addDummyEdge( begin, inputs, node);
d->addDummyEdge( inputs, d->begin(blocks[cond_block]), node);
d->addDummyEdge( d->end(blocks[cond_block]), set_conds, node);
d->addDummyEdge(set_conds, select, node);
d->addDummyEdge( d->end(blocks[cond_block]), select, node);
d->addDummyEdge( select, d->begin(blocks[body_block]), node);
d->addDummyEdge( select, end, node, 1);
d->addDummyEdge(d->end(blocks[body_block]), outputs, node);
......@@ -285,23 +294,20 @@ void dtkComposerGraph::addNode(dtkComposerSceneNode *node)
d->addDummyEdge( inputs, d->begin(blocks[body_block]), node);
d->addDummyEdge( d->end(blocks[body_block]), outputs, node);
d->addDummyEdge( outputs, d->begin(blocks[cond_block]), node);
d->addDummyEdge( d->end(blocks[cond_block]), set_conds, node);
d->addDummyEdge( set_conds, select, node);
d->addDummyEdge( d->end(blocks[cond_block]), select, node);
d->addDummyEdge( select, d->begin(blocks[body_block]), node);
d->addDummyEdge( select, end, node, 1);
select->setEndLoop();
} else if (dynamic_cast<dtkComposerNodeControlIf *>(wrapee)) {
dtkComposerGraphNode *inputs_else = new dtkComposerGraphNodeSetInputs(wrapee);
d->nodes.insertMulti(node, inputs_else);
this->addItem(inputs_else);
d->addNode(node, inputs_else, begin);
QList<dtkComposerSceneNodeComposite *> blocks = dynamic_cast<dtkComposerSceneNodeControl *>(node)->blocks();
foreach (dtkComposerSceneNodeComposite *block, blocks)
this->addNode(block);
int then_block = 0; int else_block = 1;
d->addDummyEdge( begin, set_conds, node);
d->addDummyEdge(set_conds, select, node);
d->addDummyEdge( begin, select, node);
d->addDummyEdge( select, inputs, node);
d->addDummyEdge( select, inputs_else, node, 1);
d->addDummyEdge( inputs, d->begin(blocks[then_block]), node);
......@@ -319,8 +325,7 @@ void dtkComposerGraph::addNode(dtkComposerSceneNode *node)
} else if (dynamic_cast<dtkComposerNodeLeaf *>(wrapee)) { // Leaf node
dtkComposerGraphNode *leaf = new dtkComposerGraphNodeLeaf(wrapee,node->title());
d->nodes.insertMulti(node, leaf);
this->addItem(leaf);
d->addNode(node, leaf, d->begin(node->parent()));
// if composite was empty, need to remove dummy edge
if (d->dummy_edges.values(node->parent()).count() == 1) {
......@@ -332,10 +337,11 @@ void dtkComposerGraph::addNode(dtkComposerSceneNode *node)
} else if (dtkComposerSceneNodeComposite *composite = dynamic_cast<dtkComposerSceneNodeComposite *>(node)) {
begin = new dtkComposerGraphNodeBegin(wrapee,"Begin"+node->title());
end = new dtkComposerGraphNodeEnd(wrapee,"End"+node->title());
d->nodes.insertMulti(node, begin);
d->nodes.insertMulti(node, end);
this->addItem(begin);
this->addItem(end);
if (!composite->root())
d->addNode(node, begin, d->begin(node->parent()));
else
d->addNode(node, begin, NULL);
d->addNode(node, end, d->begin(node->parent()));
// empty composite, add dummy edge between 'begin' and 'end'
d->addDummyEdge( begin, end, node);
if (!composite->root() && !(dynamic_cast<dtkComposerSceneNodeControl *>(node->parent())) ) {
......@@ -385,8 +391,10 @@ void dtkComposerGraph::removeNode(dtkComposerSceneNode *node)
}
foreach(dtkComposerGraphNode *n, d->nodes.values(node)) {
this->removeItem(n);
delete n;
if (dynamic_cast<dtkComposerSceneNodeControl *>(node) && !(dynamic_cast<dtkComposerGraphNodeBegin *>(n) || dynamic_cast<dtkComposerGraphNodeEnd *>(n) ))
d->remNode(node, n, d->begin(node));
else
d->remNode(node, n, d->begin(parent));
}
d->nodes.remove(node);
}
......@@ -397,6 +405,16 @@ void dtkComposerGraph::reparentNode(dtkComposerSceneNode *node, dtkComposerScene
// remove dummy edges for this node on the parent
dtkComposerSceneNode *oldparent = node->parent();
dtkComposerGraphNode *oldparent_g = d->begin(node->parent());
dtkComposerGraphNode *newparent_g = d->begin(newparent);
oldparent_g->removeChild(d->begin(node));
newparent_g->addChild(d->begin(node));
if (d->begin(node) != d->end(node)) { // not a leaf node
oldparent_g->removeChild(d->end(node));
newparent_g->addChild(d->end(node));
}
foreach( dtkComposerGraphEdge *e, d->dummy_edges.values(oldparent)) {
if ((e->source() == d->begin(oldparent) && e->destination() == d->begin(node) ) || (e->destination() == d->end(oldparent) && e->source() == d->end(node)))
d->remDummyEdge(e, oldparent);
......@@ -411,6 +429,8 @@ void dtkComposerGraph::reparentNode(dtkComposerSceneNode *node, dtkComposerScene
d->addDummyEdge( d->begin(newparent), d->begin(node), newparent);
d->addDummyEdge( d->end(node), d->end(newparent), newparent);
}
void dtkComposerGraph::addEdge(dtkComposerSceneEdge *edge)
......
......@@ -4,9 +4,9 @@
* Copyright (C) 2008-2011 - Julien Wintz, Inria.
* Created: Thu Feb 9 15:09:22 2012 (+0100)
* Version: $Id$
* Last-Updated: mar. mars 27 14:08:35 2012 (+0200)
* Last-Updated: mer. mars 28 13:30:35 2012 (+0200)
* By: Nicolas Niclausse
* Update #: 206
* Update #: 226
*/
/* Commentary:
......@@ -30,12 +30,14 @@ public:
public:
QList<dtkComposerGraphNode *> successors;
QList<dtkComposerGraphNode *> predecessors;
QList<dtkComposerGraphNode *> childs;
public:
dtkComposerGraphNode::Status status;
public:
bool breakpoint;
bool endloop_initial;
bool endloop;
};
......@@ -46,8 +48,9 @@ dtkComposerGraphNode::dtkComposerGraphNode() : QGraphicsItem(),d(new dtkComposer
this->setZValue(1);
this->setTitle("Graph node");
this->setStatus(dtkComposerGraphNode::Ready);
d->breakpoint = false;
d->endloop = false;
d->breakpoint = false;
d->endloop = false;
d->endloop_initial = false;
}
dtkComposerGraphNode::~dtkComposerGraphNode(void)
......@@ -91,6 +94,8 @@ void dtkComposerGraphNode::setBreakPoint(bool value)
void dtkComposerGraphNode::setEndLoop(bool value)
{
d->endloop = value;
if (value) // endloop is set to true, keep this info in endloop_initial (used to rerun node)
d->endloop_initial = value;
}
QRectF dtkComposerGraphNode::boundingRect(void) const
......@@ -130,11 +135,21 @@ void dtkComposerGraphNode::addSuccessor(dtkComposerGraphNode *node, int id)
d->successors << node;
}
void dtkComposerGraphNode::addChild(dtkComposerGraphNode *node)
{
d->childs << node;
}
void dtkComposerGraphNode::addPredecessor(dtkComposerGraphNode *node)
{
d->predecessors << node;
}
void dtkComposerGraphNode::removeChild(dtkComposerGraphNode *node)
{
d->childs.removeOne(node);
}
void dtkComposerGraphNode::removePredecessor(dtkComposerGraphNode *node)
{
d->predecessors.removeOne(node);
......@@ -155,6 +170,11 @@ dtkComposerGraphNodeList dtkComposerGraphNode::predecessors(void)
return d->predecessors;
}
dtkComposerGraphNodeList dtkComposerGraphNode::childs(void)
{
return d->childs;
}
const QString& dtkComposerGraphNode::title(void)
{
......@@ -174,6 +194,7 @@ void dtkComposerGraphNode::eval(void)
void dtkComposerGraphNode::clean(void)
{
this->setStatus(dtkComposerGraphNode::Ready);
d->endloop = d->endloop_initial;
}
// /////////////////////////////////////////////////////////////////
......
......@@ -4,9 +4,9 @@
* Copyright (C) 2008-2011 - Julien Wintz, Inria.
* Created: Thu Feb 9 15:08:41 2012 (+0100)
* Version: $Id$
* Last-Updated: mar. mars 27 14:03:06 2012 (+0200)
* Last-Updated: mer. mars 28 10:50:18 2012 (+0200)
* By: Nicolas Niclausse
* Update #: 148
* Update #: 151
*/
/* Commentary:
......@@ -54,6 +54,10 @@ public:
public:
void mouseDoubleClickEvent (QGraphicsSceneMouseEvent *event);
public:
void addChild(dtkComposerGraphNode *node);
void removeChild(dtkComposerGraphNode *node);
public:
virtual void addSuccessor(dtkComposerGraphNode *node, int id = 0);
void addPredecessor(dtkComposerGraphNode *node);
......@@ -83,6 +87,7 @@ public:
public:
virtual dtkComposerGraphNodeList successors();
dtkComposerGraphNodeList predecessors();
dtkComposerGraphNodeList childs();
public:
const QString& title(void);
......
......@@ -4,9 +4,9 @@
* Copyright (C) 2012 - Nicolas Niclausse, Inria.
* Created: 2012/02/14 13:59:57
* Version: $Id$
* Last-Updated: mar. mars 27 15:46:38 2012 (+0200)
* Last-Updated: mer. mars 28 13:47:47 2012 (+0200)
* By: Nicolas Niclausse
* Update #: 220
* Update #: 246
*/
/* Commentary:
......@@ -70,16 +70,11 @@ void dtkComposerGraphNodeBegin::eval(void)
this->setStatus(dtkComposerGraphNode::Done);
}
//TODO: build childs list during graph creation
dtkComposerGraphNodeList childs = this->childs();
int count = childs.count();
// need to clean state of all nodes in the composite/group
dtkComposerGraphNodeList childs = this->successors();
while (!childs.isEmpty()) {
dtkComposerGraphNode *current = childs.takeFirst();
if (current->status() == dtkComposerGraphNode::Done && !(( current->wrapee() == d->control_node || current->wrapee() == d->composite ) && current->kind() == dtkComposerGraphNode::End)) {
childs << current->successors();
}
current->setStatus(dtkComposerGraphNode::Ready);
for (int i = 0; i < count; i++) {
childs.at(i)->clean();
}
}
......
/* @(#)dtkComposerGraphNodeSetConditions.cpp ---
*
* Author: Nicolas Niclausse
* Copyright (C) 2012 - Nicolas Niclausse, Inria.
* Created: 2012/02/14 13:59:57
* Version: $Id$
* Last-Updated: ven. mars 2 18:42:41 2012 (+0100)
* By: Nicolas Niclausse
* Update #: 53
*/
/* Commentary:
*
*/
/* Change log:
*
*/
#include "dtkComposerGraphNodeSetConditions.h"
#include "dtkComposerNode.h"
#include "dtkComposerNodeControl.h"
class dtkComposerGraphNodeSetConditionsPrivate
{
public:
dtkComposerNodeControl *composer_node;
};
dtkComposerGraphNodeSetConditions::dtkComposerGraphNodeSetConditions(dtkComposerNode *cnode, const QString& title) : dtkComposerGraphNode(),d(new dtkComposerGraphNodeSetConditionsPrivate)
{
d->composer_node = dynamic_cast<dtkComposerNodeControl *>(cnode);
this->setTitle(title);
}
dtkComposerGraphNode::Kind dtkComposerGraphNodeSetConditions::kind(void)
{
return dtkComposerGraphNode::SetConditions;
}
dtkComposerNode *dtkComposerGraphNodeSetConditions::wrapee(void)
{
return d->composer_node;
}
void dtkComposerGraphNodeSetConditions::eval(void)
{
if (d->composer_node == NULL)
return;
d->composer_node->setConditions();
this->setStatus(dtkComposerGraphNode::Done);
}
/* @(#)dtkComposerGraphNodeSetConditions.h ---
*
* Author: Nicolas Niclausse
* Copyright (C) 2012 - Nicolas Niclausse, Inria.
* Created: 2012/02/14 13:55:56
* Version: $Id$
* Last-Updated: ven. mars 2 18:37:35 2012 (+0100)
* By: Nicolas Niclausse
* Update #: 33
*/
/* Commentary:
*
*/
/* Change log:
*
*/
#ifndef DTKCOMPOSERGRAPHNODESETCONDITIONS_H
#define DTKCOMPOSERGRAPHNODESETCONDITIONS_H
#include "dtkComposerGraphNode.h"
class dtkComposerNode;
class dtkComposerGraphNodeSetConditionsPrivate;
// /////////////////////////////////////////////////////////////////
// dtkComposerGraphNodeSetConditions
// /////////////////////////////////////////////////////////////////
class dtkComposerGraphNodeSetConditions : public dtkComposerGraphNode
{
public:
dtkComposerGraphNodeSetConditions(dtkComposerNode *node, const QString& title = "Set Conditions");
public:
void eval(void);
public: