diff options
-rw-r--r-- | dw/layout.cc | 30 | ||||
-rw-r--r-- | dw/layout.hh | 9 | ||||
-rw-r--r-- | dw/widget.cc | 72 | ||||
-rw-r--r-- | dw/widget.hh | 15 |
4 files changed, 62 insertions, 64 deletions
diff --git a/dw/layout.cc b/dw/layout.cc index 818effd2..bd519042 100644 --- a/dw/layout.cc +++ b/dw/layout.cc @@ -926,8 +926,7 @@ void Layout::resizeIdle () canvasHeightGreater = true; DBG_OBJ_SET_SYM ("canvasHeightGreater", canvasHeightGreater ? "true" : "false"); - assert (topLevel); // No toplevel widget would have no size. - containerSizeChanged (topLevel); + containerSizeChanged (); } // Set viewport sizes. @@ -1296,31 +1295,14 @@ void Layout::viewportSizeChanged (View *view, int width, int height) DBG_OBJ_SET_NUM ("viewportWidth", viewportWidth); DBG_OBJ_SET_NUM ("viewportHeight", viewportHeight); - if (topLevel) - containerSizeChanged (topLevel); + containerSizeChanged (); } -bool Layout::widgetAffectedByContainerSizeChange (Widget *widget) +void Layout::containerSizeChanged () { - return true; // TODO only absolute dimensions? Depending on widget class? -} - -void Layout::containerSizeChanged (Widget *widget) -{ - if (widgetAffectedByContainerSizeChange (widget)) { - widget->queueResize (0, false); - - // TODO Wrong! Iteration must stop when the *container* (not the - // *parent*!) is unaffected. (Does not matter as long as - // widgetAffectedByContainerSizeChange() returns always true.) - - Iterator *it = - widget->iterator ((Content::Type) - (Content::WIDGET_IN_FLOW | Content::WIDGET_OOF_CONT), - false); - while (it->next ()) - containerSizeChanged (it->getContent()->widget); - it->unref (); + if (topLevel) { + topLevel->containerSizeChanged (); + queueResize (true); } } diff --git a/dw/layout.hh b/dw/layout.hh index 0dc3cfbc..d83aeedb 100644 --- a/dw/layout.hh +++ b/dw/layout.hh @@ -157,13 +157,15 @@ private: public: Widget *widget; int ref; - bool extremesChanged; + bool extremesChanged, fast; - inline QueueResizeItem (Widget *widget, int ref, bool extremesChanged) + inline QueueResizeItem (Widget *widget, int ref, bool extremesChanged, + bool fast) { this->widget = widget; this->ref = ref; this->extremesChanged = extremesChanged; + this->fast = fast; } }; @@ -267,8 +269,7 @@ private: void enterResizeIdle () { resizeIdleCounter++; } void leaveResizeIdle () { resizeIdleCounter--; } - bool widgetAffectedByContainerSizeChange (Widget *widget); - void containerSizeChanged (Widget *widget); + void containerSizeChanged (); public: Layout (Platform *platform); diff --git a/dw/widget.cc b/dw/widget.cc index cf3f2d79..c24f58db 100644 --- a/dw/widget.cc +++ b/dw/widget.cc @@ -195,7 +195,7 @@ void Widget::queueDrawArea (int x, int y, int width, int height) /** * \brief This method should be called, when a widget changes its size. */ -void Widget::queueResize (int ref, bool extremesChanged) +void Widget::queueResize (int ref, bool extremesChanged, bool fast) { DBG_OBJ_MSGF ("resize", 0, "<b>queueResize</b> (%d, %s)", ref, extremesChanged ? "true" : "false"); @@ -207,15 +207,16 @@ void Widget::queueResize (int ref, bool extremesChanged) if (queueResizeEntered ()) { DBG_OBJ_MSG ("resize", 1, "put into queue"); layout->queueQueueResizeList->put (new Layout::QueueResizeItem - (this, ref, extremesChanged)); + (this, ref, extremesChanged, fast)); } else { - actualQueueResize (ref, extremesChanged); + actualQueueResize (ref, extremesChanged, fast); while (layout != NULL && layout->queueQueueResizeList->size () > 0) { Layout::QueueResizeItem *item = layout->queueQueueResizeList->get (0); DBG_OBJ_MSGF ("resize", 1, "taken out of queue queue (size = %d)", layout->queueQueueResizeList->size ()); - item->widget->actualQueueResize (item->ref, item->extremesChanged); + item->widget->actualQueueResize (item->ref, item->extremesChanged, + item->fast); layout->queueQueueResizeList->remove (0); // hopefully not too large } } @@ -223,7 +224,7 @@ void Widget::queueResize (int ref, bool extremesChanged) DBG_OBJ_MSG_END (); } -void Widget::actualQueueResize (int ref, bool extremesChanged) +void Widget::actualQueueResize (int ref, bool extremesChanged, bool fast) { assert (!queueResizeEntered ()); @@ -235,10 +236,6 @@ void Widget::actualQueueResize (int ref, bool extremesChanged) Widget *widget2, *child; - //printf("The %stop-level %s %p with parentRef = %d has changed its size. " - // "Layout = %p.\n", - // parent ? "non-" : "", getClassName(), this, parentRef, layout); - Flags resizeFlag, extremesFlag; if (layout) { @@ -261,36 +258,49 @@ void Widget::actualQueueResize (int ref, bool extremesChanged) setFlags (extremesFlag); markExtremesChange (ref); } - - for (widget2 = parent, child = this; widget2; - child = widget2, widget2 = widget2->parent) { - //printf (" Setting %s and ALLOCATE_QUEUED for the " - // "%stop-level %s %p with parentRef = %d\n", - // resizeFlag == RESIZE_QUEUED ? "RESIZE_QUEUED" : "NEEDS_RESIZE", - // widget2->parent ? "non-" : "", widget2->getClassName(), widget2, - // widget2->parentRef); - - if (layout && !widget2->resizeQueued ()) - layout->queueResizeList->put (widget2); - - widget2->setFlags (resizeFlag); - widget2->markSizeChange (child->parentRef); - widget2->setFlags (ALLOCATE_QUEUED); - - if (extremesChanged) { - widget2->setFlags (extremesFlag); - widget2->markExtremesChange (child->parentRef); + + if (!fast) { + for (widget2 = parent, child = this; widget2; + child = widget2, widget2 = widget2->parent) { + if (layout && !widget2->resizeQueued ()) + layout->queueResizeList->put (widget2); + + widget2->setFlags (resizeFlag); + widget2->markSizeChange (child->parentRef); + widget2->setFlags (ALLOCATE_QUEUED); + + if (extremesChanged) { + widget2->setFlags (extremesFlag); + widget2->markExtremesChange (child->parentRef); + } } - } - if (layout) - layout->queueResize (extremesChanged); + if (layout) + layout->queueResize (extremesChanged); + } leaveQueueResize (); DBG_OBJ_MSG_END (); } +void Widget::containerSizeChanged () +{ + // TODO Can be largely optimized. + queueResizeFast (0, true); + containerSizeChangedForChildren (); +} + +void Widget::containerSizeChangedForChildren () +{ + // Working, but inefficient standard implementation. + Iterator *it = iterator ((Content::Type)(Content::WIDGET_IN_FLOW | + Content::WIDGET_OOF_CONT), + false); + while (it->next ()) + it->getContent()->widget->containerSizeChanged (); + it->unref (); +} /** * \brief This method is a wrapper for Widget::sizeRequestImpl(); it calls diff --git a/dw/widget.hh b/dw/widget.hh index 7fe49c74..fd9eb9dc 100644 --- a/dw/widget.hh +++ b/dw/widget.hh @@ -166,7 +166,12 @@ private: */ bool buttonSensitiveSet; - void actualQueueResize (int ref, bool extremesChanged); + void queueResize (int ref, bool extremesChanged, bool fast); + inline void queueResizeFast (int ref, bool extremesChanged) + { queueResize (ref, extremesChanged, true); } + void actualQueueResize (int ref, bool extremesChanged, bool fast); + + void containerSizeChanged (); public: /** @@ -275,11 +280,10 @@ protected: inline void queueDraw () - { - queueDrawArea (0, 0, allocation.width, getHeight()); - } + { queueDrawArea (0, 0, allocation.width, getHeight()); } void queueDrawArea (int x, int y, int width, int height); - void queueResize (int ref, bool extremesChanged); + inline void queueResize (int ref, bool extremesChanged) + { queueResize (ref, extremesChanged, false); } /** * \brief See \ref dw-widget-sizes. @@ -322,6 +326,7 @@ protected: *descent)); virtual void correctExtremesOfChild (Widget *child, Extremes *extremes); + virtual void containerSizeChangedForChildren (); virtual void notifySetAsTopLevel(); virtual void notifySetParent(); |