diff options
Diffstat (limited to 'dw/widget.cc')
-rw-r--r-- | dw/widget.cc | 66 |
1 files changed, 48 insertions, 18 deletions
diff --git a/dw/widget.cc b/dw/widget.cc index cf955dec..e312ee6f 100644 --- a/dw/widget.cc +++ b/dw/widget.cc @@ -188,7 +188,7 @@ void Widget::draw (View *view, Rectangle *area) /** Area is given in widget coordinates. */ Widget *Widget::draw (View *view, Rectangle *area, - lout::container::untyped::Stack *iterator) + StackingIteratorStack *iteratorStack) { // Suitable for widgets without children. draw (view, area); @@ -196,34 +196,64 @@ Widget *Widget::draw (View *view, Rectangle *area, } Widget *Widget::drawTotal (View *view, Rectangle *area, - lout::container::untyped::Stack *iterator) + StackingIteratorStack *iteratorStack) { DBG_OBJ_ENTER ("draw", 0, "drawTotal", "%d, %d, %d * %d", area->x, area->y, area->width, area->height); - Object *si = stackingIterator (false); - if (si) { - iterator->push (si); - DBG_OBJ_MSGF ("draw", 1, "pushing on iterator; now %d element(s)", - iterator->size ()); + DBG_IF_RTFL { + misc::StringBuffer sb; + iteratorStack->intoStringBuffer (&sb); + DBG_OBJ_MSGF ("draw", 2, "initial iteratorStack: %s", sb.getChars ()); + } + + Object *si = NULL; + + if (iteratorStack->atRealTop ()) { + si = stackingIterator (false); + if (si) { + iteratorStack->push (si); + } } else - DBG_OBJ_MSGF ("draw", 1, "nothing on iterator; %d element(s)", - iterator->size ()); - + iteratorStack->forward (); - Widget *retWidget = draw (view, area, iterator); + DBG_IF_RTFL { + misc::StringBuffer sb; + iteratorStack->intoStringBuffer (&sb); + DBG_OBJ_MSGF ("draw", 2, "iteratorStack before drawing: %s", + sb.getChars ()); + } + + Widget *retWidget = draw (view, area, iteratorStack); + DBG_OBJ_MSGF ("draw", 1, "=> %p", retWidget); + + DBG_IF_RTFL { + misc::StringBuffer sb; + iteratorStack->intoStringBuffer (&sb); + DBG_OBJ_MSGF ("draw", 2, "iteratorStack after drawing: %s", + sb.getChars ()); + } // A return value other than NULL indicates a widget with a complex // drawing process, for which stackIterator() must return something // non-NULL, so that the interrupted drawing process can be - // continued. + // continued. (TODO: Not quite correct when forward() was called + // instead of push().) + + // assert (retWidget == NULL || si != NULL); - assert (retWidget == NULL || si != NULL); + if (retWidget == NULL) { + if (si) + iteratorStack->pop (); + } else + iteratorStack->backward (); - if (retWidget == NULL && si != NULL) - iterator->pop (); + DBG_IF_RTFL { + misc::StringBuffer sb; + iteratorStack->intoStringBuffer (&sb); + DBG_OBJ_MSGF ("draw", 2, "final iteratorStack: %s", sb.getChars ()); + } - DBG_OBJ_MSGF ("draw", 1, "=> %p", retWidget); DBG_OBJ_LEAVE (); return retWidget; } @@ -232,8 +262,8 @@ void Widget::drawToplevel (View *view, Rectangle *area) { assert (parent == NULL); - lout::container::untyped::Stack iterator (true); - Widget *retWidget = drawTotal (view, area, &iterator); + StackingIteratorStack iteratorStack; + Widget *retWidget = drawTotal (view, area, &iteratorStack); // Everything should be finished at this point. assert (retWidget == NULL); |