summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dw/layout.cc30
-rw-r--r--dw/layout.hh9
-rw-r--r--dw/widget.cc72
-rw-r--r--dw/widget.hh15
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();