diff options
author | Sebastian Geerken <devnull@localhost> | 2014-06-30 22:35:14 +0200 |
---|---|---|
committer | Sebastian Geerken <devnull@localhost> | 2014-06-30 22:35:14 +0200 |
commit | e65756c53e14073da8c13b34c89aad4398595cf8 (patch) | |
tree | 691ce30256d988b1ff2a4f1d829490f3f630487c | |
parent | 28da617bb9be612aa871fd7757d36a8f6f91b1d0 (diff) |
Adjusted Widget::getAvailHEIGHT[OfChild]. Also, changed definition of 'intrinsic' extremes (not all widgets updated yet).
-rw-r--r-- | dw/ruler.cc | 2 | ||||
-rw-r--r-- | dw/table.cc | 13 | ||||
-rw-r--r-- | dw/textblock.cc | 44 | ||||
-rw-r--r-- | dw/textblock.hh | 4 | ||||
-rw-r--r-- | dw/textblock_linebreaking.cc | 42 | ||||
-rw-r--r-- | dw/widget.cc | 92 |
6 files changed, 148 insertions, 49 deletions
diff --git a/dw/ruler.cc b/dw/ruler.cc index 2459c1bd..b624718d 100644 --- a/dw/ruler.cc +++ b/dw/ruler.cc @@ -43,6 +43,8 @@ void Ruler::sizeRequestImpl (core::Requisition *requisition) void Ruler::getExtremesImpl (core::Extremes *extremes) { extremes->minWidth = extremes->maxWidth = getStyle()->boxDiffWidth (); + extremes->minWidthIntrinsic = extremes->minWidth; + extremes->maxWidthIntrinsic = extremes->maxWidth; correctExtremes (extremes); } diff --git a/dw/table.cc b/dw/table.cc index 52fe00d9..a5ff9929 100644 --- a/dw/table.cc +++ b/dw/table.cc @@ -127,16 +127,21 @@ void Table::getExtremesImpl (core::Extremes *extremes) DBG_OBJ_MSG_START (); if (numCols == 0) - extremes->minWidth = extremes->maxWidth = 0; + extremes->minWidth = extremes->minWidthIntrinsic = extremes->maxWidth = + extremes->maxWidthIntrinsic = boxDiffWidth (); else { forceCalcColumnExtremes (); - extremes->minWidth = extremes->maxWidth = - (numCols + 1) * getStyle()->hBorderSpacing - + getStyle()->boxDiffWidth (); + extremes->minWidth = extremes->minWidthIntrinsic = extremes->maxWidth = + extremes->maxWidthIntrinsic = + (numCols + 1) * getStyle()->hBorderSpacing + boxDiffWidth (); for (int col = 0; col < numCols; col++) { extremes->minWidth += colExtremes->getRef(col)->minWidth; + extremes->minWidthIntrinsic += + colExtremes->getRef(col)->minWidthIntrinsic; extremes->maxWidth += colExtremes->getRef(col)->maxWidth; + extremes->maxWidthIntrinsic += + colExtremes->getRef(col)->maxWidthIntrinsic; } } diff --git a/dw/textblock.cc b/dw/textblock.cc index 21a9371b..8cb42999 100644 --- a/dw/textblock.cc +++ b/dw/textblock.cc @@ -422,7 +422,8 @@ void Textblock::getWordExtremes (Word *word, core::Extremes *extremes) if (word->content.type == core::Content::WIDGET_IN_FLOW) word->content.widget->getExtremes (extremes); else - extremes->minWidth = extremes->maxWidth = word->size.width; + extremes->minWidth = extremes->minWidthIntrinsic = extremes->maxWidth = + extremes->maxWidthIntrinsic = word->size.width; } void Textblock::getExtremesImpl (core::Extremes *extremes) @@ -448,40 +449,65 @@ void Textblock::getExtremesImpl (core::Extremes *extremes) if (paragraphs->size () == 0) { /* empty page */ extremes->minWidth = 0; + extremes->minWidthIntrinsic = 0; extremes->maxWidth = 0; + extremes->maxWidthIntrinsic = 0; } else { Paragraph *lastPar = paragraphs->getLastRef (); extremes->minWidth = lastPar->maxParMin; + extremes->minWidthIntrinsic = lastPar->maxParMinIntrinsic; extremes->maxWidth = lastPar->maxParMax; + extremes->maxWidthIntrinsic = lastPar->maxParMaxIntrinsic; - DBG_OBJ_MSGF ("resize", 1, "paragraphs[%d]->maxParMin = %d", - paragraphs->size () - 1, lastPar->maxParMin); - DBG_OBJ_MSGF ("resize", 1, "paragraphs[%d]->maxParMax = %d", - paragraphs->size () - 1, lastPar->maxParMax); + DBG_OBJ_MSGF ("resize", 1, "paragraphs[%d]->maxParMin = %d (%d)", + paragraphs->size () - 1, lastPar->maxParMin, + lastPar->maxParMinIntrinsic); + DBG_OBJ_MSGF ("resize", 1, "paragraphs[%d]->maxParMax = %d (%d)", + paragraphs->size () - 1, lastPar->maxParMax, + lastPar->maxParMaxIntrinsic); } + DBG_OBJ_MSGF ("resize", 0, "after considering paragraphs: %d (%d) / %d (%d)", + extremes->minWidth, extremes->minWidthIntrinsic, + extremes->maxWidth, extremes->maxWidthIntrinsic); + int diff = leftInnerPadding + getStyle()->boxDiffWidth (); extremes->minWidth += diff; + extremes->minWidthIntrinsic += diff; extremes->maxWidth += diff; + extremes->maxWidthIntrinsic += diff; + + DBG_OBJ_MSGF ("resize", 0, "after adding diff: %d (%d) / %d (%d)", + extremes->minWidth, extremes->minWidthIntrinsic, + extremes->maxWidth, extremes->maxWidthIntrinsic); // For the order, see similar reasoning in sizeRequestImpl. correctExtremes (extremes); + DBG_OBJ_MSGF ("resize", 0, "after correction: %d (%d) / %d (%d)", + extremes->minWidth, extremes->minWidthIntrinsic, + extremes->maxWidth, extremes->maxWidthIntrinsic); + if (outOfFlowMgr) { int oofMinWidth, oofMaxWidth; outOfFlowMgr->getExtremes (extremes, &oofMinWidth, &oofMaxWidth); - DBG_OBJ_MSGF ("resize", 1, "extremes: %d / %d, corrected: %d / %d", - extremes->minWidth, extremes->maxWidth, + DBG_OBJ_MSGF ("resize", 1, "OOFM correction: %d / %d", oofMinWidth, oofMaxWidth); extremes->minWidth = misc::max (extremes->minWidth, oofMinWidth); + extremes->minWidthIntrinsic = + misc::max (extremes->minWidthIntrinsic, oofMinWidth); extremes->maxWidth = misc::max (extremes->maxWidth, oofMaxWidth); + extremes->maxWidthIntrinsic = + misc::max (extremes->maxWidthIntrinsic, oofMinWidth); } - DBG_OBJ_MSGF ("resize", 1, "=> %d / %d", - extremes->minWidth, extremes->maxWidth); + DBG_OBJ_MSGF ("resize", 0, + "finally, after considering OOFM: %d (%d) / %d (%d)", + extremes->minWidth, extremes->minWidthIntrinsic, + extremes->maxWidth, extremes->maxWidthIntrinsic); DBG_OBJ_MSG_END (); } diff --git a/dw/textblock.hh b/dw/textblock.hh index 48bd424e..0f73736d 100644 --- a/dw/textblock.hh +++ b/dw/textblock.hh @@ -306,14 +306,18 @@ protected: int parMin; /* The sum of all word minima (plus spaces, hyphen width etc.) since the last possible break within this paragraph. */ + int parMinIntrinsic; int parMax; /* The sum of all word maxima in this paragraph (plus spaces, hyphen width etc.). */ + int parMaxIntrinsic; int maxParMin; /* Maximum of all paragraph minima (value of "parMin"), including this paragraph. */ + int maxParMinIntrinsic; int maxParMax; /* Maximum of all paragraph maxima (value of "parMax""), including this paragraph. */ + int maxParMaxIntrinsic; }; struct Line diff --git a/dw/textblock_linebreaking.cc b/dw/textblock_linebreaking.cc index 217d26ea..bf41436b 100644 --- a/dw/textblock_linebreaking.cc +++ b/dw/textblock_linebreaking.cc @@ -1207,12 +1207,15 @@ void Textblock::handleWordExtremes (int wordIndex) core::Extremes wordExtremes; getWordExtremes (word, &wordExtremes); - DBG_OBJ_MSGF ("construct.paragraph", 1, "extremes: %d / %d", - wordExtremes.minWidth, wordExtremes.maxWidth); + DBG_OBJ_MSGF ("construct.paragraph", 1, "extremes: %d (%d) / %d (%d", + wordExtremes.minWidth, wordExtremes.minWidthIntrinsic, + wordExtremes.maxWidth, wordExtremes.maxWidthIntrinsic); if (wordIndex == 0) { wordExtremes.minWidth += line1OffsetEff; + wordExtremes.minWidthIntrinsic += line1OffsetEff; wordExtremes.maxWidth += line1OffsetEff; + wordExtremes.maxWidthIntrinsic += line1OffsetEff; } if (paragraphs->size() == 0 || @@ -1225,13 +1228,17 @@ void Textblock::handleWordExtremes (int wordIndex) Paragraph *par = paragraphs->getLastRef(); par->firstWord = par->lastWord = wordIndex; - par->parMin = par->parMax = 0; + par->parMin = par->parMinIntrinsic = par->parMax = par->parMaxIntrinsic + = 0; if (prevPar) { par->maxParMin = prevPar->maxParMin; + par->maxParMinIntrinsic = prevPar->maxParMinIntrinsic; par->maxParMax = prevPar->maxParMax; + par->maxParMaxIntrinsic = prevPar->maxParMaxIntrinsic; } else - par->maxParMin = par->maxParMax = 0; + par->maxParMin = par->maxParMinIntrinsic = par->maxParMax = + par->maxParMaxIntrinsic = 0; DBG_OBJ_MSGF ("construct.paragraph", 1, "new par: %d", paragraphs->size() - 1); @@ -1259,22 +1266,41 @@ void Textblock::handleWordExtremes (int wordIndex) lastPar->firstWord, lastPar->lastWord, corrDiffMin, corrDiffMax); + DBG_OBJ_MSGF ("construct.paragraph", 1, + "before: parMin = %d (%d) (max = %d (%d)), " + "parMax = %d (%d) (max = %d (%d))", + lastPar->parMin, lastPar->parMinIntrinsic, + lastPar->maxParMin, lastPar->maxParMinIntrinsic, + lastPar->parMax, lastPar->parMaxIntrinsic, + lastPar->maxParMax, lastPar->maxParMaxIntrinsic); + // Minimum: between two *possible* breaks. // Shrinkability could be considered, but really does not play a role. lastPar->parMin += wordExtremes.minWidth + word->hyphenWidth + corrDiffMin; + lastPar->parMinIntrinsic += + wordExtremes.minWidthIntrinsic + word->hyphenWidth + corrDiffMin; lastPar->maxParMin = misc::max (lastPar->maxParMin, lastPar->parMin); + lastPar->maxParMinIntrinsic = + misc::max (lastPar->maxParMinIntrinsic, lastPar->parMinIntrinsic); if (word->badnessAndPenalty.lineCanBeBroken (1) && (word->flags & Word::UNBREAKABLE_FOR_MIN_WIDTH) == 0) - lastPar->parMin = 0; + lastPar->parMin = lastPar->parMinIntrinsic = 0; // Maximum: between two *necessary* breaks. lastPar->parMax += wordExtremes.maxWidth + word->hyphenWidth + corrDiffMax; + lastPar->parMaxIntrinsic += + wordExtremes.maxWidthIntrinsic + word->hyphenWidth + corrDiffMax; lastPar->maxParMax = misc::max (lastPar->maxParMax, lastPar->parMax); + lastPar->maxParMaxIntrinsic = + misc::max (lastPar->maxParMaxIntrinsic, lastPar->parMaxIntrinsic); DBG_OBJ_MSGF ("construct.paragraph", 1, - "=> parMin = %d (max = %d), parMax = %d (max = %d)", - lastPar->parMin, lastPar->maxParMin, lastPar->parMax, - lastPar->maxParMax); + "after: parMin = %d (%d) (max = %d (%d)), " + "parMax = %d (%d) (max = %d (%d))", + lastPar->parMin, lastPar->parMinIntrinsic, + lastPar->maxParMin, lastPar->maxParMinIntrinsic, + lastPar->parMax, lastPar->parMaxIntrinsic, + lastPar->maxParMax, lastPar->maxParMaxIntrinsic); lastPar->lastWord = wordIndex; DBG_OBJ_MSG_END (); diff --git a/dw/widget.cc b/dw/widget.cc index 63640fc6..2271ee1e 100644 --- a/dw/widget.cc +++ b/dw/widget.cc @@ -533,21 +533,37 @@ int Widget::getAvailHeight (bool forceValue) int height; - if (container == NULL) { + if (parent == NULL) { + DBG_OBJ_MSG ("resize", 1, "no parent, regarding viewport"); + DBG_OBJ_MSG_START (); + // TODO Consider nested layouts (e. g. <button>). - if (style::isAbsLength (getStyle()->height)) + if (style::isAbsLength (getStyle()->height)) { + DBG_OBJ_MSGF ("resize", 1, "absolute height: %dpx", + style::absLengthVal (getStyle()->height)); height = style::absLengthVal (getStyle()->height) + boxDiffHeight (); - else if (style::isPerLength (getStyle()->height)) + } else if (style::isPerLength (getStyle()->height)) { + DBG_OBJ_MSGF ("resize", 1, "percentage height: %g%%", + 100 * style::perLengthVal_useThisOnlyForDebugging + (getStyle()->height)); // Notice that here -- unlike getAvailWidth() -- // layout->hScrollbarThickness is not considered here; // something like canvasWidthGreater (analogue to // canvasHeightGreater) would be complicated and lead to // possibly contradictory self-references. height = applyPerHeight (layout->viewportHeight, getStyle()->height); - else + } else { + DBG_OBJ_MSG ("resize", 1, "no specification"); height = layout->viewportHeight; - } else + } + + DBG_OBJ_MSG_END (); + } else { + DBG_OBJ_MSG ("resize", 1, "delegated to parent"); + DBG_OBJ_MSG_START (); height = container->getAvailHeightOfChild (this, forceValue); + DBG_OBJ_MSG_END (); + } DBG_OBJ_MSGF ("resize", 1, "=> %d", height); DBG_OBJ_MSG_END (); @@ -614,11 +630,9 @@ void Widget::correctExtremes (Extremes *extremes) { // TODO Extremes only corrected? - extremes->minWidthIntrinsic = extremes->minWidth; - extremes->maxWidthIntrinsic = extremes->maxWidth; - - DBG_OBJ_MSGF ("resize", 0, "<b>correctExtremes</b> (%d / %d)", - extremes->minWidth, extremes->maxWidth); + DBG_OBJ_MSGF ("resize", 0, "<b>correctExtremes</b> (%d (%d) / %d (%d))", + extremes->minWidth, extremes->minWidthIntrinsic, + extremes->maxWidth, extremes->maxWidthIntrinsic); DBG_OBJ_MSG_START (); if (container == NULL) { @@ -1243,25 +1257,47 @@ int Widget::getAvailHeightOfChild (Widget *child, bool forceValue) int height; - if (style::isAbsLength (child->getStyle()->height)) - height = style::absLengthVal (child->getStyle()->height) - + child->boxDiffHeight (); - else { + if (child->getStyle()->height == style::LENGTH_AUTO) { + DBG_OBJ_MSG ("resize", 1, "no specification"); int availHeight = getAvailHeight (forceValue); if (availHeight == -1) height = -1; - else { - int containerContentHeight = availHeight - boxDiffHeight (); - DBG_OBJ_MSGF ("resize", 1, "containerContentHeight = %d - %d = %d", - availHeight, boxDiffHeight (), containerContentHeight); - - if (style::isPerLength (child->getStyle()->height)) - height = child->applyPerHeight (containerContentHeight, - child->getStyle()->height); - else - // Although no widget will probably use the whole height, we - // have to return some value here. - height = containerContentHeight; + else + height = misc::max (availHeight - boxDiffHeight (), 0); + } 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; + + if (effContainer == this) { + if (style::isAbsLength (child->getStyle()->height)) { + DBG_OBJ_MSGF ("resize", 1, "absolute height: %dpx", + style::absLengthVal (child->getStyle()->height)); + height = misc::max (style::absLengthVal (child->getStyle()->height) + + child->boxDiffHeight (), 0); + } else { + assert (style::isPerLength (child->getStyle()->height)); + DBG_OBJ_MSGF ("resize", 1, "percentage height: %g%%", + 100 * style::perLengthVal_useThisOnlyForDebugging + (child->getStyle()->height)); + + int availHeight = getAvailHeight (forceValue); + if (availHeight == -1) + height = -1; + else + height = + misc::max (child->applyPerHeight (availHeight - + boxDiffHeight (), + child->getStyle()->height), + 0); + } + } else { + DBG_OBJ_MSG ("resize", 1, "delegated to (effective) container"); + DBG_OBJ_MSG_START (); + height = effContainer->getAvailHeightOfChild (child, forceValue); + DBG_OBJ_MSG_END (); } } @@ -1332,7 +1368,7 @@ void Widget::correctExtremesOfChild (Widget *child, Extremes *extremes) if (style::isAbsLength (child->getStyle()->width)) { DBG_OBJ_MSGF ("resize", 1, "absolute width: %dpx", style::absLengthVal (child->getStyle()->width)); - extremes->minWidth =extremes->maxWidth = + extremes->minWidth = extremes->maxWidth = style::absLengthVal (child->getStyle()->width) + child->boxDiffWidth (); } else if (style::isPerLength (child->getStyle()->width)) { @@ -1344,7 +1380,7 @@ void Widget::correctExtremesOfChild (Widget *child, Extremes *extremes) int containerWidth = availWidth - boxDiffWidth (); DBG_OBJ_MSGF ("resize", 1, "containerWidth = %d - %d = %d", availWidth, boxDiffWidth (), containerWidth); - extremes->minWidth =extremes->maxWidth = + extremes->minWidth = extremes->maxWidth = child->applyPerWidth (containerWidth, child->getStyle()->width); } } else |