diff --git a/javascript/sources/Node.cc b/javascript/sources/Node.cc index 108bc4b5..2268c805 100644 --- a/javascript/sources/Node.cc +++ b/javascript/sources/Node.cc @@ -23,6 +23,13 @@ static YGSize globalMeasureFunc(YGNodeRef nodeRef, float width, YGMeasureMode wi return ygSize; } +static void globalDirtiedFunc(YGNodeRef nodeRef) +{ + Node const & node = *reinterpret_cast(YGNodeGetContext(nodeRef)); + + node.callDirtiedFunc(); +} + /* static */ Node * Node::createDefault(void) { return new Node(nullptr); @@ -429,6 +436,24 @@ Size Node::callMeasureFunc(double width, int widthMode, double height, int heigh return m_measureFunc->call(width, widthMode, height, heightMode); } +void Node::setDirtiedFunc(nbind::cbFunction & dirtiedFunc) +{ + m_dirtiedFunc.reset(new nbind::cbFunction(dirtiedFunc)); + + YGNodeSetDirtiedFunc(m_node, &globalDirtiedFunc); +} + +void Node::unsetDirtiedFunc(void) { + m_dirtiedFunc.reset(nullptr); + + YGNodeSetDirtiedFunc(m_node, nullptr); +} + +void Node::callDirtiedFunc(void) const +{ + m_dirtiedFunc->call(); +} + void Node::markDirty(void) { YGNodeMarkDirty(m_node); diff --git a/javascript/sources/Node.hh b/javascript/sources/Node.hh index 593745b2..a3114505 100644 --- a/javascript/sources/Node.hh +++ b/javascript/sources/Node.hh @@ -161,6 +161,15 @@ class Node { Size callMeasureFunc(double width, int widthMode, double height, int heightMode) const; + public: // Dirtied func mutators + + void setDirtiedFunc(nbind::cbFunction & dirtiedFunc); + void unsetDirtiedFunc(void); + + public: // Dirtied func inspectors + + void callDirtiedFunc(void) const; + public: // Dirtiness accessors void markDirty(void); @@ -194,5 +203,5 @@ class Node { YGNodeRef m_node; std::unique_ptr m_measureFunc; - + std::unique_ptr m_dirtiedFunc; }; diff --git a/javascript/sources/nbind.cc b/javascript/sources/nbind.cc index c778fe8a..7f1aac0f 100644 --- a/javascript/sources/nbind.cc +++ b/javascript/sources/nbind.cc @@ -155,6 +155,9 @@ NBIND_CLASS(Node) method(setMeasureFunc); method(unsetMeasureFunc); + method(setDirtiedFunc); + method(unsetDirtiedFunc); + method(markDirty); method(isDirty);