31 #include <boost/weak_ptr.hpp>
42 boost::weak_ptr<Data> q;
53 int _uniqueIdentifier;
57 QScriptValue _scriptvalue;
58 QScriptEngine *_engine;
69 DataPrivate::DataPrivate(
DataStructurePtr parent,
int uniqueIdentifier,
int dataType)
73 , _visible(parent->
document()->dataType(dataType)->isVisible())
74 , _dataStructure(parent)
75 , _uniqueIdentifier(uniqueIdentifier)
76 , _dataType(_dataStructure->
document()->dataType(dataType))
77 , _color(parent->
document()->dataType(dataType)->defaultColor())
83 QScriptValue DataPrivate::createScriptArray(
PointerList list)
85 QScriptValue array = _engine->newArray();
87 array.property(
"push").call(array, QScriptValueList() << e->scriptValue());
97 void Data::setQpointer(
DataPtr q)
102 void Data::initialize()
104 installEventFilter(
this);
105 QStringList
properties = d->_dataType->properties();
106 foreach(
const QString &property, properties) {
110 connect(d->_dataType.get(), SIGNAL(
propertyAdded(QString,QVariant)),
114 connect(d->_dataType.get(), SIGNAL(propertyRenamed(QString,QString)),
116 connect(d->_dataType.get(), SIGNAL(propertyDefaultValueChanged(QString)),
118 connect(d->_dataType.get(), SIGNAL(propertyVisibilityChanged(QString)),
122 connect(d->_dataType.get(), SIGNAL(
removed()),
this, SLOT(
remove()));
134 d(new DataPrivate(dataStructure, uniqueIdentifier, dataType))
143 if (event->type() == QEvent::DynamicPropertyChange) {
144 QString
property = QString::fromLatin1(static_cast<QDynamicPropertyChangeEvent*>(event)->propertyName());
147 return QObject::eventFilter(obj, event);
152 return d->_dataStructure;
162 d->_visible = visible;
168 Q_ASSERT(d->_dataStructure->document()->dataTypeList().contains(dataType));
172 d->_dataType.get()->disconnect(
this);
176 d->_dataType = d->_dataStructure->document()->dataType(dataType);
177 d->_dataStructure->updateData(
getData());
178 foreach(
const QString& property, d->_dataType->properties()) {
179 if (this->property(property.toLatin1()) == QVariant::Invalid) {
186 connect(d->_dataType.get(), SIGNAL(
propertyAdded(QString,QVariant)),
188 connect(d->_dataType.get(), SIGNAL(propertyDefaultValueChanged(QString)),
190 connect(d->_dataType.get(), SIGNAL(propertyVisibilityChanged(QString)),
192 connect(d->_dataType.get(), SIGNAL(propertyRenamed(QString,QString)),
194 connect(d->_dataType.get(), SIGNAL(
removed()),
this, SLOT(
remove()));
201 QMap<int, DataPtr> adjacent;
203 if (e->to() != e->from() && e->to() ==
getData()) {
206 adjacent[e->to()->identifier()] = e->to();
210 if (e->to() != e->from() && e->from() ==
getData()) {
213 adjacent[e->from()->identifier()] = e->from();
215 return adjacent.values();
221 foreach (
const PointerPtr& p, d->_outPointers) {
224 foreach (
const PointerPtr& p, d->_inPointers) {
234 bool changed =
false;
237 if (!d->_inPointers.contains(pointer)) {
238 d->_inPointers.append(pointer);
244 if (!d->_outPointers.contains(pointer)) {
245 d->_outPointers.append(pointer);
259 return d->_dataStructure->createPointer(this->
getData(), to, 0);
265 if (d->_inPointers.removeOne(e)) {
267 d->_dataStructure->remove(e);
270 if (d->_outPointers.removeOne(e)) {
272 d->_dataStructure->remove(e);
279 bool changed =
false;
283 if (!d->_inPointers.contains(pointer)) {
284 d->_inPointers.append(pointer);
287 if (!d->_outPointers.contains(pointer)) {
288 d->_outPointers.append(pointer);
293 if (
getData() == pointer->from() && d->_inPointers.contains(pointer)) {
294 d->_inPointers.removeOne(pointer);
297 if (
getData() == pointer->to() && d->_outPointers.contains(pointer)) {
298 d->_outPointers.removeOne(pointer);
312 if (tmp->to() == to) {
323 disconnect(d->_dataType.get(), 0,
this, 0);
325 while (!d->_inPointers.isEmpty()) {
326 remove(d->_inPointers.first());
328 while (!d->_outPointers.isEmpty()) {
329 remove(d->_outPointers.first());
332 d->_dataStructure->remove(
getData());
338 kWarning() <<
"self_remove() is a deprecated function, please use remove()";
364 return d->_dataType->iconName();
369 return d->_dataType->properties();
374 return d->_inPointers;
379 return d->_outPointers;
384 return d->_uniqueIdentifier;
389 return d->_dataType->identifier();
410 if (d->_width != w) {
411 d->_width = (qreal)w;
418 if (d->_x != x || d->_y != y) {
427 QColor c = s.value<QColor>();
428 if (d->_color != c) {
437 kWarning() <<
"Property identifier \"" <<
property <<
"\" is not valid: aborting";
440 setProperty(property.toLatin1(), value);
447 setProperty(property.toLatin1(), QVariant::Invalid);
453 if (this->property(property.toLatin1()) == QVariant::Invalid
454 || this->property(property.toLatin1()).toString().isEmpty()
456 this->setProperty(property.toLatin1(), d->_dataType->propertyDefaultValue(property));
464 kWarning() <<
"Property identifier \"" << newName <<
"\" is not valid: aborting";
467 setProperty(newName.toLatin1(), property(oldName.toLatin1()));
468 setProperty(oldName.toLatin1(), QVariant::Invalid);
473 return d->_scriptvalue;
479 d->_scriptvalue = engine->newQObject(
getData().
get());
489 if (!d->_dataStructure->document()->dataTypeList().contains(dataType)) {
491 i18n(
"Could not set data type for node %1: data type does not exist.",
identifier()));
492 return d->_dataStructure->engine()->newVariant(
false);
495 return d->_dataStructure->engine()->newVariant(
true);
500 return d->_dataStructure->engine()->newVariant(d->_dataType->identifier());
516 QScriptValue array = d->_engine->newArray();
518 array.property(
"push").call(array, QScriptValueList() << n->scriptValue());
526 return d->createScriptArray(list);
533 if (n->pointerType() != pointerType) {
538 return d->createScriptArray(list);
544 return d->createScriptArray(list);
551 if (n->pointerType() != pointerType) {
556 return d->createScriptArray(list);
562 return d->createScriptArray(list);
569 if (n->pointerType() != pointerType) {
574 return d->createScriptArray(list);
580 return QScriptValue();
583 return d->createScriptArray(list);
void setColor(const QVariant &s)
void remove_property(const QString &name)
void removeDynamicProperty(const QString &property)
Remove dynamic property with identifier property from data element.
void pointerListChanged()
virtual void setEngine(QScriptEngine *_engine)
Set script engine.
DataStructurePtr dataStructure() const
boost::shared_ptr< DataStructure > DataStructurePtr
Data(DataStructurePtr dataStructure, int uniqueIdentifer, int dataType)
Protected constructor.
void addPointer(PointerPtr pointer)
Register an created pointer to this data element.
void renameDynamicProperty(const QString &oldName, const QString &newName)
void propertyRemoved(const QString &name)
bool eventFilter(QObject *obj, QEvent *event)
QList< boost::shared_ptr< Data > > DataList
void dataTypeChanged(int dataType)
QScriptValue scriptValue() const
void colorChanged(const QColor &c)
void updatePointerList()
FIXME proof of concept implementation: since each Pointer emits a changed direction signal...
void visibilityChanged(bool visible)
QScriptValue connected_pointers(Data *n)
boost::shared_ptr< Pointer > PointerPtr
void propertyAdded(const QString &name)
PointerPtr createPointer(DataPtr to)
Create new pointer to to.
void updateDynamicProperty(const QString &property)
void setVisible(bool visible)
void posChanged(const QPointF &p)
void widthChanged(double w)
QScriptValue adj_pointers()
PointerList & inPointerList() const
virtual ~Data()
Default destructor.
void add_property(const QString &name, const QString &value)
QScriptEngine * engine() const
QList< QString > properties() const
void propertyChanged(const QString &name)
QScriptValue set_type(int type)
virtual DataPtr getData() const
PointerList & outPointerList() const
void setPos(qreal x, qreal y)
QScriptValue input_pointers()
void addDynamicProperty(const QString &property, const QVariant &value)
Add new dynamic property with identifier property to this data element and sets it to value...
boost::shared_ptr< Data > DataPtr
void setDataType(int dataType)
boost::shared_ptr< DataType > DataTypePtr
static bool isValidIdentifier(const QString &identifier)
Evaluates given string and returns true if identifier is valid, otherwise returns false...
DataList adjacentDataList() const
PointerList pointerList() const
static DataPtr create(DataStructurePtr dataStructure, int uniqueIdentifier, int dataType)
Create data element objects.
QScriptValue output_pointers()
QList< boost::shared_ptr< Pointer > > PointerList