aboutsummaryrefslogtreecommitdiff
path: root/dw
diff options
context:
space:
mode:
authorSebastian Geerken <devnull@localhost>2014-07-25 15:40:30 +0200
committerSebastian Geerken <devnull@localhost>2014-07-25 15:40:30 +0200
commit76510c4de1d5737b057715e62b972fdd0c4335ed (patch)
tree13a3ffd53d800eafbff9ce8265a0c41b02211d57 /dw
parent6c77ae97e8d500a35caf3b9acdc5c0a377337d9d (diff)
All Widget::*OfChild methods now refer to the parent first, container second.
Diffstat (limited to 'dw')
-rw-r--r--dw/widget.cc128
1 files changed, 88 insertions, 40 deletions
diff --git a/dw/widget.cc b/dw/widget.cc
index 5543ed38..1f614fef 100644
--- a/dw/widget.cc
+++ b/dw/widget.cc
@@ -667,7 +667,10 @@ void Widget::correctRequisition (Requisition *requisition,
requisition->width, requisition->ascent,
requisition->descent);
- if (container == NULL && quasiParent == NULL) {
+ if (parent == NULL && quasiParent == NULL) {
+ DBG_OBJ_MSG ("resize", 1, "no parent, regarding viewport");
+ DBG_OBJ_MSG_START ();
+
if (style::isAbsLength (getStyle()->width)) {
DBG_OBJ_MSGF ("resize", 1, "absolute width: %dpx",
style::absLengthVal (getStyle()->width));
@@ -708,12 +711,20 @@ void Widget::correctRequisition (Requisition *requisition,
&requisition->ascent, &requisition->descent);
#endif
}
- } else if (container)
- container->correctRequisitionOfChild (this, requisition, splitHeightFun);
- else // if (quasiParent)
- // Here, quasiParent plays the same role as the container.
+
+ DBG_OBJ_MSG_END ();
+ } else if (parent) {
+ DBG_OBJ_MSG ("resize", 1, "delegated to parent");
+ DBG_OBJ_MSG_START ();
+ parent->correctRequisitionOfChild (this, requisition, splitHeightFun);
+ DBG_OBJ_MSG_END ();
+ } else /* if (quasiParent) */ {
+ DBG_OBJ_MSG ("resize", 1, "delegated to quasiParent");
+ DBG_OBJ_MSG_START ();
quasiParent->correctRequisitionOfChild (this, requisition,
splitHeightFun);
+ DBG_OBJ_MSG_END ();
+ }
DBG_OBJ_MSGF ("resize", 1, "=> %d * (%d + %d)",
requisition->width, requisition->ascent,
@@ -728,6 +739,9 @@ void Widget::correctExtremes (Extremes *extremes)
extremes->maxWidth, extremes->maxWidthIntrinsic);
if (container == NULL && quasiParent == NULL) {
+ DBG_OBJ_MSG ("resize", 1, "no parent, regarding viewport");
+ DBG_OBJ_MSG_START ();
+
if (style::isAbsLength (getStyle()->width))
extremes->minWidth = extremes->maxWidth =
misc::max (style::absLengthVal (getStyle()->width)
@@ -741,11 +755,19 @@ void Widget::correctExtremes (Extremes *extremes)
misc::max (applyPerWidth (viewportWidth, getStyle()->width),
getMinWidth (extremes, false));
}
- } else if (container)
- container->correctExtremesOfChild (this, extremes);
- else // if (quasiParent)
- // Here, quasiParent plays the same role as the container.
+
+ DBG_OBJ_MSG_END ();
+ } else if (parent) {
+ DBG_OBJ_MSG ("resize", 1, "delegated to parent");
+ DBG_OBJ_MSG_START ();
+ parent->correctExtremesOfChild (this, extremes);
+ DBG_OBJ_MSG_END ();
+ } else /* if (quasiParent) */ {
+ DBG_OBJ_MSG ("resize", 1, "delegated to quasiParent");
+ DBG_OBJ_MSG_START ();
quasiParent->correctExtremesOfChild (this, extremes);
+ DBG_OBJ_MSG_END ();
+ }
DBG_OBJ_MSGF ("resize", 1, "=> %d / %d",
extremes->minWidth, extremes->maxWidth);
@@ -1291,9 +1313,9 @@ int Widget::getAvailWidthOfChild (Widget *child, bool forceValue)
} else {
// In most cases, the toplevel widget should be a container, so
// the container is non-NULL when the parent is non-NULL. Just
- // in case ...:
- Widget *effContainer =
- child->container ? child->container : child->parent;
+ // in case, regard also parent. And quasiParent.
+ Widget *effContainer = child->quasiParent ? child->quasiParent :
+ (child->container ? child->container : child->parent);
if (effContainer == this) {
if (style::isAbsLength (child->getStyle()->width)) {
@@ -1351,11 +1373,9 @@ int Widget::getAvailHeightOfChild (Widget *child, bool forceValue)
else
height = -1;
} else {
- // In most cases, the toplevel widget should be a container, so
- // the container is non-NULL when the parent is non-NULL. Just
- // in case ...:
- Widget *effContainer =
- child->container ? child->container : child->parent;
+ // See comment in Widget::getAvailWidthOfChild.
+ Widget *effContainer = child->quasiParent ? child->quasiParent :
+ (child->container ? child->container : child->parent);
if (effContainer == this) {
if (style::isAbsLength (child->getStyle()->height)) {
@@ -1403,8 +1423,20 @@ void Widget::correctRequisitionOfChild (Widget *child, Requisition *requisition,
"%p, %d * (%d + %d), ...", child, requisition->width,
requisition->ascent, requisition->descent);
- correctReqWidthOfChild (child, requisition);
- correctReqHeightOfChild (child, requisition, splitHeightFun);
+ // See comment in Widget::getAvailWidthOfChild.
+ Widget *effContainer = child->quasiParent ? child->quasiParent :
+ (child->container ? child->container : child->parent);
+
+ if (effContainer == this) {
+ correctReqWidthOfChild (child, requisition);
+ correctReqHeightOfChild (child, requisition, splitHeightFun);
+ } else {
+ DBG_OBJ_MSG ("resize", 1, "delegated to (effective) container");
+ DBG_OBJ_MSG_START ();
+ effContainer->correctRequisitionOfChild (child, requisition,
+ splitHeightFun);
+ DBG_OBJ_MSG_END ();
+ }
DBG_OBJ_MSGF ("resize", 1, "=> %d * (%d + %d)",
requisition->width, requisition->ascent,
@@ -1418,6 +1450,8 @@ void Widget::correctReqWidthOfChild (Widget *child, Requisition *requisition)
child, requisition->width, requisition->ascent,
requisition->descent);
+ assert (this == child->quasiParent || this == child->container);
+
if (style::isAbsLength (child->getStyle()->width))
requisition->width =
misc::max (style::absLengthVal (child->getStyle()->width)
@@ -1445,6 +1479,8 @@ void Widget::correctReqHeightOfChild (Widget *child, Requisition *requisition,
{
// TODO Correct height by extremes? (Height extemes?)
+ assert (this == child->quasiParent || this == child->container);
+
DBG_OBJ_ENTER ("resize", 0, "correctReqHeightOfChild",
"%p, %d * (%d + %d), ...", child, requisition->width,
requisition->ascent, requisition->descent);
@@ -1484,29 +1520,41 @@ void Widget::correctExtremesOfChild (Widget *child, Extremes *extremes)
child, extremes->minWidth, extremes->minWidthIntrinsic,
extremes->maxWidth, extremes->maxWidthIntrinsic);
- if (style::isAbsLength (child->getStyle()->width)) {
- DBG_OBJ_MSGF ("resize", 1, "absolute width: %dpx",
- style::absLengthVal (child->getStyle()->width));
- extremes->minWidth = extremes->maxWidth =
- misc::max (style::absLengthVal (child->getStyle()->width)
- + child->boxDiffWidth (),
- child->getMinWidth (extremes, false));
- } else if (style::isPerLength (child->getStyle()->width)) {
- DBG_OBJ_MSGF ("resize", 1, "percentage width: %g%%",
- 100 * style::perLengthVal_useThisOnlyForDebugging
- (child->getStyle()->width));
- int availWidth = getAvailWidth (false);
- if (availWidth != -1) {
- int containerWidth = availWidth - boxDiffWidth ();
- DBG_OBJ_MSGF ("resize", 1, "containerWidth = %d - %d = %d",
- availWidth, boxDiffWidth (), containerWidth);
+ // See comment in Widget::getAvailWidthOfChild.
+ Widget *effContainer = child->quasiParent ? child->quasiParent :
+ (child->container ? child->container : child->parent);
+
+ if (effContainer == this) {
+ if (style::isAbsLength (child->getStyle()->width)) {
+ DBG_OBJ_MSGF ("resize", 1, "absolute width: %dpx",
+ style::absLengthVal (child->getStyle()->width));
extremes->minWidth = extremes->maxWidth =
- misc::max (child->applyPerWidth (containerWidth,
- child->getStyle()->width),
+ misc::max (style::absLengthVal (child->getStyle()->width)
+ + child->boxDiffWidth (),
child->getMinWidth (extremes, false));
- }
- } else
- DBG_OBJ_MSG ("resize", 1, "no specification");
+ } else if (style::isPerLength (child->getStyle()->width)) {
+ DBG_OBJ_MSGF ("resize", 1, "percentage width: %g%%",
+ 100 * style::perLengthVal_useThisOnlyForDebugging
+ (child->getStyle()->width));
+ int availWidth = getAvailWidth (false);
+ if (availWidth != -1) {
+ int containerWidth = availWidth - boxDiffWidth ();
+ DBG_OBJ_MSGF ("resize", 1, "containerWidth = %d - %d = %d",
+ availWidth, boxDiffWidth (), containerWidth);
+ extremes->minWidth = extremes->maxWidth =
+ misc::max (child->applyPerWidth (containerWidth,
+ child->getStyle()->width),
+ child->getMinWidth (extremes, false));
+ }
+ } else
+ DBG_OBJ_MSG ("resize", 1, "no specification");
+ } else {
+ DBG_OBJ_MSG ("resize", 1, "delegated to (effective) container");
+ DBG_OBJ_MSG_START ();
+ effContainer->correctExtremesOfChild (child, extremes);
+ DBG_OBJ_MSG_END ();
+ }
+
DBG_OBJ_MSGF ("resize", 1, "=> %d / %d",
extremes->minWidth, extremes->maxWidth);