diff options
-rw-r--r-- | dw/widget.cc | 25 | ||||
-rw-r--r-- | dw/widget.hh | 1 |
2 files changed, 23 insertions, 3 deletions
diff --git a/dw/widget.cc b/dw/widget.cc index eee7ae6e..c649be55 100644 --- a/dw/widget.cc +++ b/dw/widget.cc @@ -286,14 +286,33 @@ void Widget::actualQueueResize (int ref, bool extremesChanged, bool fast) DBG_OBJ_MSG_END (); } +bool Widget::affectedByContainerSizeChange () +{ + return true; +} + void Widget::containerSizeChanged () { DBG_OBJ_MSG ("resize", 0, "<b>containerSizeChanged</b> ()"); DBG_OBJ_MSG_START (); - // TODO Can be largely optimized. - queueResizeFast (0, true); - containerSizeChangedForChildren (); + // If there is a container widget (not the viewport), which has not + // changed its size (which can be determined by the respective + // flags: this method is called recursively), this widget will + // neither change its size. Also, the recursive iteration can be + // stopped, since the children of this widget will + if (container == NULL || + container->needsResize () || container->resizeQueued () || + container->extremesChanged () || container->extremesQueued ()) { + // Viewport (container == NULL) or container widget has changed + // its size. + if (affectedByContainerSizeChange ()) + queueResizeFast (0, true); + + // Even if *this* widget is not affected, children may be, so + // iterate over children. + containerSizeChangedForChildren (); + } DBG_OBJ_MSG_END (); } diff --git a/dw/widget.hh b/dw/widget.hh index fd9eb9dc..25a951d4 100644 --- a/dw/widget.hh +++ b/dw/widget.hh @@ -171,6 +171,7 @@ private: { queueResize (ref, extremesChanged, true); } void actualQueueResize (int ref, bool extremesChanged, bool fast); + bool affectedByContainerSizeChange (); void containerSizeChanged (); public: |