From 6d1929754c370dbb2c8b093cb878437377069bfc Mon Sep 17 00:00:00 2001 From: skyjake Date: Mon, 4 Nov 2013 18:23:41 +0200 Subject: [PATCH] Fixed|libdeng2: Partially notifying a widget tree When notifying a widget tree and stopping halfway, one has to make sure the appropriate pre/post notifications still occur. The requirement is that if pre-notification occurs, post-notification will always occur, too. --- doomsday/libdeng2/src/widgets/widget.cpp | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/doomsday/libdeng2/src/widgets/widget.cpp b/doomsday/libdeng2/src/widgets/widget.cpp index 74a2abb72b..926431ce24 100644 --- a/doomsday/libdeng2/src/widgets/widget.cpp +++ b/doomsday/libdeng2/src/widgets/widget.cpp @@ -369,35 +369,42 @@ String Widget::uniqueName(String const &name) const Widget::NotifyArgs::Result Widget::notifyTree(NotifyArgs const &args) { - if(args.preNotifyFunc) - { - (this->*args.preNotifyFunc)(); - } + NotifyArgs::Result result = NotifyArgs::Continue; + + bool preNotified = false; DENG2_FOR_EACH(Instance::Children, i, d->children) { if(*i == args.until) { - return NotifyArgs::Abort; + result = NotifyArgs::Abort; + break; } if(args.conditionFunc && !((*i)->*args.conditionFunc)()) continue; // Skip this one. + if(args.preNotifyFunc && !preNotified) + { + preNotified = true; + (this->*args.preNotifyFunc)(); + } + ((*i)->*args.notifyFunc)(); if((*i)->notifyTree(args) == NotifyArgs::Abort) { - return NotifyArgs::Abort; + result = NotifyArgs::Abort; + break; } } - if(args.postNotifyFunc) + if(args.postNotifyFunc && preNotified) { (this->*args.postNotifyFunc)(); } - return NotifyArgs::Continue; + return result; } Widget::NotifyArgs::Result Widget::notifySelfAndTree(NotifyArgs const &args)