diff options
-rw-r--r-- | doc/dw-grows.doc | 10 | ||||
-rw-r--r-- | dw/alignedtablecell.cc | 9 | ||||
-rw-r--r-- | dw/alignedtablecell.hh | 3 | ||||
-rw-r--r-- | dw/image.cc | 2 | ||||
-rw-r--r-- | dw/ruler.cc | 2 | ||||
-rw-r--r-- | dw/simpletablecell.cc | 8 | ||||
-rw-r--r-- | dw/simpletablecell.hh | 3 | ||||
-rw-r--r-- | dw/table.cc | 2 | ||||
-rw-r--r-- | dw/tablecell.cc | 3 | ||||
-rw-r--r-- | dw/tablecell.hh | 3 | ||||
-rw-r--r-- | dw/textblock.cc | 2 | ||||
-rw-r--r-- | dw/ui.cc | 16 | ||||
-rw-r--r-- | dw/ui.hh | 14 | ||||
-rw-r--r-- | dw/widget.cc | 58 | ||||
-rw-r--r-- | dw/widget.hh | 7 | ||||
-rw-r--r-- | test/dw_simple_container.cc | 5 |
16 files changed, 84 insertions, 63 deletions
diff --git a/doc/dw-grows.doc b/doc/dw-grows.doc index a8e182f0..0d123d61 100644 --- a/doc/dw-grows.doc +++ b/doc/dw-grows.doc @@ -101,10 +101,12 @@ The rules for the calculation: 2. A widget must calculate *adjustmentWidth* from *adjustmentWidth* of its children. -*Note:* An implementation of dw::core::Widget::getExtremesImpl -typically sets this value after calling -dw::core::Widget::correctExtremesOfChild, so that it cannot be used -for the correction of extremes. +*Note:* An implementation of dw::core::Widget::getExtremesImpl may set +this value *after* calling dw::core::Widget::correctExtremesOfChild, +so that it cannot be used for the correction of extremes. In this case +*useAdjustmentWidth = false* should be passed to +dw::core::Widget::correctExtremesOfChild. On the other hand, if known +before, *useAdjustmentWidth* should be set to *true*. Rules for *new* methods related to resizing =========================================== diff --git a/dw/alignedtablecell.cc b/dw/alignedtablecell.cc index 3dbb73a2..e65bbf2c 100644 --- a/dw/alignedtablecell.cc +++ b/dw/alignedtablecell.cc @@ -109,15 +109,18 @@ void AlignedTableCell::correctRequisitionOfChild (Widget *child, } void AlignedTableCell::correctExtremesOfChild (Widget *child, - core::Extremes *extremes) + core::Extremes *extremes, + bool useAdjustmentWidth) { DBG_OBJ_ENTER ("resize", 0, "AlignedTableCell/correctExtremesOfChild", "%p, %d (%d) / %d (%d)", child, extremes->minWidth, extremes->minWidthIntrinsic, extremes->maxWidth, extremes->maxWidthIntrinsic); - AlignedTextblock::correctExtremesOfChild (child, extremes); - tablecell::correctCorrectedExtremesOfChild (this, child, extremes); + AlignedTextblock::correctExtremesOfChild (child, extremes, + useAdjustmentWidth); + tablecell::correctCorrectedExtremesOfChild (this, child, extremes, + useAdjustmentWidth); DBG_OBJ_LEAVE (); } diff --git a/dw/alignedtablecell.hh b/dw/alignedtablecell.hh index 57b92d5f..b4203047 100644 --- a/dw/alignedtablecell.hh +++ b/dw/alignedtablecell.hh @@ -18,7 +18,8 @@ protected: void correctRequisitionOfChild (Widget *child, core::Requisition *requisition, void (*splitHeightFun) (int, int*, int*)); - void correctExtremesOfChild (Widget *child, core::Extremes *extremes); + void correctExtremesOfChild (Widget *child, core::Extremes *extremes, + bool useAdjustmentWidth); bool getAdjustMinWidth (); diff --git a/dw/image.cc b/dw/image.cc index b9a1abeb..fd959695 100644 --- a/dw/image.cc +++ b/dw/image.cc @@ -264,7 +264,7 @@ void Image::getExtremesImpl (core::Extremes *extremes) extremes->minWidthIntrinsic = extremes->minWidth; extremes->maxWidthIntrinsic = extremes->maxWidth; - correctExtremes (extremes); + correctExtremes (extremes, false); extremes->adjustmentWidth = misc::min (extremes->minWidthIntrinsic, extremes->minWidth); diff --git a/dw/ruler.cc b/dw/ruler.cc index 73651257..8b647548 100644 --- a/dw/ruler.cc +++ b/dw/ruler.cc @@ -43,7 +43,7 @@ void Ruler::getExtremesImpl (core::Extremes *extremes) extremes->minWidth = extremes->maxWidth = getStyle()->boxDiffWidth (); extremes->minWidthIntrinsic = extremes->minWidth; extremes->maxWidthIntrinsic = extremes->maxWidth; - correctExtremes (extremes); + correctExtremes (extremes, false); extremes->adjustmentWidth = lout::misc::min (extremes->minWidthIntrinsic, extremes->minWidth); } diff --git a/dw/simpletablecell.cc b/dw/simpletablecell.cc index a5851680..feec46c8 100644 --- a/dw/simpletablecell.cc +++ b/dw/simpletablecell.cc @@ -99,15 +99,17 @@ void SimpleTableCell::correctRequisitionOfChild (Widget *child, } void SimpleTableCell::correctExtremesOfChild (Widget *child, - core::Extremes *extremes) + core::Extremes *extremes, + bool useAdjustmentWidth) { DBG_OBJ_ENTER ("resize", 0, "SimpleTableCell/correctExtremesOfChild", "%p, %d (%d) / %d (%d)", child, extremes->minWidth, extremes->minWidthIntrinsic, extremes->maxWidth, extremes->maxWidthIntrinsic); - Textblock::correctExtremesOfChild (child, extremes); - tablecell::correctCorrectedExtremesOfChild (this, child, extremes); + Textblock::correctExtremesOfChild (child, extremes, useAdjustmentWidth); + tablecell::correctCorrectedExtremesOfChild (this, child, extremes, + useAdjustmentWidth); DBG_OBJ_LEAVE (); } diff --git a/dw/simpletablecell.hh b/dw/simpletablecell.hh index 6eef5096..60715d90 100644 --- a/dw/simpletablecell.hh +++ b/dw/simpletablecell.hh @@ -14,7 +14,8 @@ protected: void correctRequisitionOfChild (Widget *child, core::Requisition *requisition, void (*splitHeightFun) (int, int*, int*)); - void correctExtremesOfChild (Widget *child, core::Extremes *extremes); + void correctExtremesOfChild (Widget *child, core::Extremes *extremes, + bool useAdjustmentWidth); bool getAdjustMinWidth (); diff --git a/dw/table.cc b/dw/table.cc index 5aaebb4b..432f1ae5 100644 --- a/dw/table.cc +++ b/dw/table.cc @@ -152,7 +152,7 @@ void Table::getExtremesImpl (core::Extremes *extremes) } } - correctExtremes (extremes); + correctExtremes (extremes, true); DBG_OBJ_LEAVE (); } diff --git a/dw/tablecell.cc b/dw/tablecell.cc index 5c34c781..3e143c96 100644 --- a/dw/tablecell.cc +++ b/dw/tablecell.cc @@ -98,7 +98,8 @@ void correctCorrectedRequisitionOfChild (core::Widget *widget, } void correctCorrectedExtremesOfChild (core::Widget *widget, core::Widget *child, - core::Extremes *extremes) + core::Extremes *extremes, + bool useAdjustmentWidth) { // Something to do? } diff --git a/dw/tablecell.hh b/dw/tablecell.hh index 95c2e78e..257f87c7 100644 --- a/dw/tablecell.hh +++ b/dw/tablecell.hh @@ -23,7 +23,8 @@ void correctCorrectedRequisitionOfChild (core::Widget *widget, void (*splitHeightFun) (int, int*, int*)); void correctCorrectedExtremesOfChild (core::Widget *widget, core::Widget *child, - core::Extremes *extremes); + core::Extremes *extremes, + bool useAdjustmentWidth); int applyPerWidth (core::Widget *widget, int containerWidth, core::style::Length perWidth); diff --git a/dw/textblock.cc b/dw/textblock.cc index e3873b11..a9fa87c5 100644 --- a/dw/textblock.cc +++ b/dw/textblock.cc @@ -528,7 +528,7 @@ void Textblock::getExtremesImpl (core::Extremes *extremes) // For the order, see similar reasoning in sizeRequestImpl. - correctExtremes (extremes); + correctExtremes (extremes, true); DBG_OBJ_MSGF ("resize", 0, "after correction: %d (%d) / %d (%d)", extremes->minWidth, extremes->minWidthIntrinsic, @@ -56,7 +56,7 @@ void Embed::sizeRequestImpl (Requisition *requisition) void Embed::getExtremesImpl (Extremes *extremes) { resource->getExtremes (extremes); - correctExtremes (extremes); + correctExtremes (extremes, false); extremes->adjustmentWidth = misc::max (extremes->minWidthIntrinsic, extremes->minWidth); } @@ -83,9 +83,10 @@ void Embed::correctRequisitionOfChild (Widget *child, resource->correctRequisitionOfChild (child, requisition, splitHeightFun); } -void Embed::correctExtremesOfChild (Widget *child, Extremes *extremes) +void Embed::correctExtremesOfChild (Widget *child, Extremes *extremes, + bool useAdjustmentWidth) { - resource->correctExtremesOfChild (child, extremes); + resource->correctExtremesOfChild (child, extremes, useAdjustmentWidth); } void Embed::containerSizeChangedForChildren () @@ -249,7 +250,8 @@ void Resource::correctRequisitionOfChild (Widget *child, misc::assertNotReached (); } -void Resource::correctExtremesOfChild (Widget *child, Extremes *extremes) +void Resource::correctExtremesOfChild (Widget *child, Extremes *extremes, + bool useAdjustmentWidth) { // Only used when the resource contains other dillo widgets. misc::assertNotReached (); @@ -439,7 +441,8 @@ void ComplexButtonResource::correctRequisitionOfChild (Widget *child, } void ComplexButtonResource::correctExtremesOfChild (Widget *child, - Extremes *extremes) + Extremes *extremes, + bool useAdjustmentWidth) { // Similar to Widget::correctExtremesOfChild, but for percentage // the relief has to be considered. @@ -455,7 +458,8 @@ void ComplexButtonResource::correctExtremesOfChild (Widget *child, child->applyPerWidth (baseWidth, child->getStyle()->width); } } else - getEmbed()->correctExtremesOfChildNoRec (child, extremes); + getEmbed()->correctExtremesOfChildNoRec (child, extremes, + useAdjustmentWidth); } void ComplexButtonResource::containerSizeChangedForChildren () @@ -237,7 +237,8 @@ protected: void correctRequisitionOfChild (Widget *child, Requisition *requisition, void (*splitHeightFun) (int, int*, int*)); - void correctExtremesOfChild (Widget *child, Extremes *extremes); + void correctExtremesOfChild (Widget *child, Extremes *extremes, + bool useAdjustmentWidth); void containerSizeChangedForChildren (); @@ -269,8 +270,9 @@ public: int*)) { Widget::correctReqHeightOfChild (child, requisition, splitHeightFun); } - virtual void correctExtremesOfChildNoRec (Widget *child, Extremes *extremes) - { Widget::correctExtremesOfChild (child, extremes); } + virtual void correctExtremesOfChildNoRec (Widget *child, Extremes *extremes, + bool useAdjustmentWidth) + { Widget::correctExtremesOfChild (child, extremes, useAdjustmentWidth); } }; /** @@ -362,7 +364,8 @@ public: Requisition *requisition, void (*splitHeightFun) (int, int*, int*)); - virtual void correctExtremesOfChild (Widget *child, Extremes *extremes); + virtual void correctExtremesOfChild (Widget *child, Extremes *extremes, + bool useAdjustmentWidth); virtual void containerSizeChangedForChildren (); virtual void setDisplayed (bool displayed); @@ -438,7 +441,8 @@ public: void correctRequisitionOfChild (Widget *child, Requisition *requisition, void (*splitHeightFun) (int, int*, int*)); - void correctExtremesOfChild (Widget *child, Extremes *extremes); + void correctExtremesOfChild (Widget *child, Extremes *extremes, + bool useAdjustmentWidth); void containerSizeChangedForChildren (); Iterator *iterator (Content::Type mask, bool atEnd); diff --git a/dw/widget.cc b/dw/widget.cc index ac46daf5..464459ba 100644 --- a/dw/widget.cc +++ b/dw/widget.cc @@ -515,18 +515,18 @@ void Widget::sizeRequest (Requisition *requisition) * context of correctExtemes etc., to avoid cyclic dependencies. * */ -int Widget::getMinWidth (Extremes *extremes, bool useCorrected, bool forceValue) -{ - if (extremes) - DBG_OBJ_ENTER ("resize", 0, "getMinWidth", "[%d (%d) / %d (%d), %s, %s", - extremes->minWidth, extremes->minWidthIntrinsic, - extremes->maxWidth, extremes->maxWidthIntrinsic, - useCorrected ? "true" : "false", - forceValue ? "true" : "false"); - else - DBG_OBJ_ENTER ("resize", 0, "getMinWidth", "(nil), %s, %s", - useCorrected ? "true" : "false", - forceValue ? "true" : "false"); +int Widget::getMinWidth (Extremes *extremes, bool forceValue) +{ + DBG_IF_RTFL { + if (extremes) + DBG_OBJ_ENTER ("resize", 0, "getMinWidth", "[%d (%d) / %d (%d), %s", + extremes->minWidth, extremes->minWidthIntrinsic, + extremes->maxWidth, extremes->maxWidthIntrinsic, + forceValue ? "true" : "false"); + else + DBG_OBJ_ENTER ("resize", 0, "getMinWidth", "(nil), %s", + forceValue ? "true" : "false"); + } int minWidth; @@ -542,15 +542,9 @@ int Widget::getMinWidth (Extremes *extremes, bool useCorrected, bool forceValue) // TODO Not completely clear whether this is feasable: Within // the context of getAvailWidth(false) etc., getExtremes may not // be called. We ignore the minimal width then. - if (extremes) { - if (useCorrected) - minWidth = extremes->adjustmentWidth; - else - // UseCorrected is set to false when called for the - // correction of extemes. This is not supported anymore, - // so we return 0. TODO: Should be cleaned up again. - minWidth = 0; - } else + if (extremes) + minWidth = extremes->adjustmentWidth; + else minWidth = 0; } else minWidth = 0; @@ -677,7 +671,7 @@ void Widget::correctRequisition (Requisition *requisition, DBG_OBJ_MSG ("resize", 1, "no parent, regarding viewport"); DBG_OBJ_MSG_START (); - int limitMinWidth = getMinWidth (NULL, true, true); + int limitMinWidth = getMinWidth (NULL, true); int viewportWidth = layout->viewportWidth - (layout->canvasHeightGreater ? layout->vScrollbarThickness : 0); @@ -724,7 +718,7 @@ void Widget::correctRequisition (Requisition *requisition, DBG_OBJ_LEAVE (); } -void Widget::correctExtremes (Extremes *extremes) +void Widget::correctExtremes (Extremes *extremes, bool useAdjustmentWidth) { DBG_OBJ_ENTER ("resize", 0, "correctExtremes", "%d (%d) / %d (%d)", extremes->minWidth, extremes->minWidthIntrinsic, @@ -734,7 +728,8 @@ void Widget::correctExtremes (Extremes *extremes) DBG_OBJ_MSG ("resize", 1, "no parent, regarding viewport"); DBG_OBJ_MSG_START (); - int limitMinWidth = getMinWidth (extremes, false, false); + int limitMinWidth = + useAdjustmentWidth ? getMinWidth (extremes, false) : 0; int viewportWidth = layout->viewportWidth - (layout->canvasHeightGreater ? layout->vScrollbarThickness : 0); @@ -760,12 +755,12 @@ void Widget::correctExtremes (Extremes *extremes) } else if (parent) { DBG_OBJ_MSG ("resize", 1, "delegated to parent"); DBG_OBJ_MSG_START (); - parent->correctExtremesOfChild (this, extremes); + parent->correctExtremesOfChild (this, extremes, useAdjustmentWidth); DBG_OBJ_MSG_END (); } else /* if (quasiParent) */ { DBG_OBJ_MSG ("resize", 1, "delegated to quasiParent"); DBG_OBJ_MSG_START (); - quasiParent->correctExtremesOfChild (this, extremes); + quasiParent->correctExtremesOfChild (this, extremes, useAdjustmentWidth); DBG_OBJ_MSG_END (); } @@ -1603,7 +1598,7 @@ void Widget::correctReqWidthOfChild (Widget *child, Requisition *requisition) assert (this == child->quasiParent || this == child->container); - int limitMinWidth = child->getMinWidth (NULL, true, true); + int limitMinWidth = child->getMinWidth (NULL, true); child->calcFinalWidth (child->getStyle(), -1, this, limitMinWidth, false, &requisition->width); @@ -1649,7 +1644,8 @@ void Widget::correctReqHeightOfChild (Widget *child, Requisition *requisition, DBG_OBJ_LEAVE (); } -void Widget::correctExtremesOfChild (Widget *child, Extremes *extremes) +void Widget::correctExtremesOfChild (Widget *child, Extremes *extremes, + bool useAdjustmentWidth) { // See comment in correctRequisitionOfChild. @@ -1663,7 +1659,8 @@ void Widget::correctExtremesOfChild (Widget *child, Extremes *extremes) (child->container ? child->container : child->parent); if (effContainer == this) { - int limitMinWidth = child->getMinWidth (extremes, false, false); + int limitMinWidth = + useAdjustmentWidth ? child->getMinWidth (extremes, false) : 0; int width = child->calcWidth (child->getStyle()->width, -1, this, limitMinWidth, false); int minWidth = child->calcWidth (child->getStyle()->minWidth, -1, this, @@ -1683,7 +1680,8 @@ void Widget::correctExtremesOfChild (Widget *child, Extremes *extremes) } else { DBG_OBJ_MSG ("resize", 1, "delegated to (effective) container"); DBG_OBJ_MSG_START (); - effContainer->correctExtremesOfChild (child, extremes); + effContainer->correctExtremesOfChild (child, extremes, + useAdjustmentWidth); DBG_OBJ_MSG_END (); } diff --git a/dw/widget.hh b/dw/widget.hh index bef35715..f9d1293c 100644 --- a/dw/widget.hh +++ b/dw/widget.hh @@ -292,7 +292,7 @@ protected: */ virtual void markExtremesChange (int ref); - int getMinWidth (Extremes *extremes, bool useCorrected, bool forceValue); + int getMinWidth (Extremes *extremes, bool forceValue); virtual int getAvailWidthOfChild (Widget *child, bool forceValue); virtual int getAvailHeightOfChild (Widget *child, bool forceValue); @@ -303,7 +303,8 @@ protected: void correctReqWidthOfChild (Widget *child, Requisition *requisition); void correctReqHeightOfChild (Widget *child, Requisition *requisition, void (*splitHeightFun) (int, int*, int*)); - virtual void correctExtremesOfChild (Widget *child, Extremes *extremes); + virtual void correctExtremesOfChild (Widget *child, Extremes *extremes, + bool useAdjustmentWidth); virtual void containerSizeChangedForChildren (); @@ -430,7 +431,7 @@ public: virtual bool getAdjustMinWidth () { return Widget::adjustMinWidth; } void correctRequisition (Requisition *requisition, void (*splitHeightFun) (int, int*, int*)); - void correctExtremes (Extremes *extremes); + void correctExtremes (Extremes *extremes, bool useAdjustmentWidth); int calcWidth (style::Length cssValue, int refWidth, Widget *refWidget, int limitMinWidth, bool forceValue); void calcFinalWidth (style::Style *style, int refWidth, Widget *refWidget, diff --git a/test/dw_simple_container.cc b/test/dw_simple_container.cc index e19511a6..7fa9bf75 100644 --- a/test/dw_simple_container.cc +++ b/test/dw_simple_container.cc @@ -185,9 +185,12 @@ void SimpleContainer::getExtremesImpl (Extremes *extremes) childExtr.minWidth = childExtr.maxWidth = 0; extremes->minWidth = childExtr.minWidth + boxDiffWidth (); + extremes->minWidthIntrinsic = childExtr.minWidthIntrinsic + boxDiffWidth (); extremes->maxWidth = childExtr.maxWidth + boxDiffWidth (); + extremes->maxWidthIntrinsic = childExtr.maxWidthIntrinsic + boxDiffWidth (); + extremes->adjustmentWidth = childExtr.adjustmentWidth + boxDiffWidth (); - correctExtremes (extremes); + correctExtremes (extremes, true); } |