diff options
Diffstat (limited to 'dw')
-rw-r--r-- | dw/alignedtablecell.cc | 20 | ||||
-rw-r--r-- | dw/alignedtablecell.hh | 4 | ||||
-rw-r--r-- | dw/image.cc | 3 | ||||
-rw-r--r-- | dw/simpletablecell.cc | 23 | ||||
-rw-r--r-- | dw/simpletablecell.hh | 4 | ||||
-rw-r--r-- | dw/table.cc | 6 | ||||
-rw-r--r-- | dw/tablecell.cc | 16 | ||||
-rw-r--r-- | dw/tablecell.hh | 4 | ||||
-rw-r--r-- | dw/textblock.cc | 3 | ||||
-rw-r--r-- | dw/ui.cc | 27 | ||||
-rw-r--r-- | dw/ui.hh | 23 | ||||
-rw-r--r-- | dw/widget.cc | 71 | ||||
-rw-r--r-- | dw/widget.hh | 13 |
13 files changed, 154 insertions, 63 deletions
diff --git a/dw/alignedtablecell.cc b/dw/alignedtablecell.cc index 25fca497..22c29549 100644 --- a/dw/alignedtablecell.cc +++ b/dw/alignedtablecell.cc @@ -23,6 +23,8 @@ #include "../lout/debug.hh" #include <stdio.h> +using namespace lout; + namespace dw { int AlignedTableCell::CLASS_ID = -1; @@ -92,16 +94,24 @@ void AlignedTableCell::correctRequisitionOfChild (Widget *child, *requisition, void (*splitHeightFun) (int, int*, - int*)) + int*), + bool allowDecreaseWidth, + bool allowDecreaseHeight) { DBG_OBJ_ENTER ("resize", 0, "AlignedTableCell::correctRequisitionOfChild", - "%p, %d * (%d + %d), ...", child, requisition->width, - requisition->ascent, requisition->descent); + "%p, %d * (%d + %d), ..., %s, %s", child, requisition->width, + requisition->ascent, requisition->descent, + misc::boolToStr (allowDecreaseWidth), + misc::boolToStr (allowDecreaseHeight)); AlignedTextblock::correctRequisitionOfChild (child, requisition, - splitHeightFun); + splitHeightFun, + allowDecreaseWidth, + allowDecreaseHeight); tablecell::correctCorrectedRequisitionOfChild (this, child, requisition, - splitHeightFun); + splitHeightFun, + allowDecreaseWidth, + allowDecreaseHeight); DBG_OBJ_LEAVE (); } diff --git a/dw/alignedtablecell.hh b/dw/alignedtablecell.hh index 0bcdbb5c..25085cc7 100644 --- a/dw/alignedtablecell.hh +++ b/dw/alignedtablecell.hh @@ -17,7 +17,9 @@ protected: void correctRequisitionOfChild (Widget *child, core::Requisition *requisition, - void (*splitHeightFun) (int, int*, int*)); + void (*splitHeightFun) (int, int*, int*), + bool allowDecreaseWidth, + bool allowDecreaseHeight); void correctExtremesOfChild (Widget *child, core::Extremes *extremes, bool useAdjustmentWidth); diff --git a/dw/image.cc b/dw/image.cc index 519b82bb..82118949 100644 --- a/dw/image.cc +++ b/dw/image.cc @@ -200,7 +200,8 @@ void Image::sizeRequestSimpl (core::Requisition *requisition) requisition->ascent += boxOffsetY (); requisition->descent += boxRestHeight (); - correctRequisition (requisition, core::splitHeightPreserveDescent); + correctRequisition (requisition, core::splitHeightPreserveDescent, true, + true); if (buffer) { // If one dimension is set, preserve the aspect ratio (without diff --git a/dw/simpletablecell.cc b/dw/simpletablecell.cc index 1466439b..a973ac30 100644 --- a/dw/simpletablecell.cc +++ b/dw/simpletablecell.cc @@ -21,9 +21,10 @@ #include "simpletablecell.hh" #include "tablecell.hh" -#include "../lout/misc.hh" #include "../lout/debug.hh" +using namespace lout; + namespace dw { int SimpleTableCell::CLASS_ID = -1; @@ -85,15 +86,23 @@ void SimpleTableCell::correctRequisitionOfChild (Widget *child, core::Requisition *requisition, void (*splitHeightFun) (int, int*, - int*)) + int*), + bool allowDecreaseWidth, + bool allowDecreaseHeight) { DBG_OBJ_ENTER ("resize", 0, "SimpleTableCell::correctRequisitionOfChild", - "%p, %d * (%d + %d), ...", child, requisition->width, - requisition->ascent, requisition->descent); - - Textblock::correctRequisitionOfChild (child, requisition, splitHeightFun); + "%p, %d * (%d + %d), ..., %s, %s", child, requisition->width, + requisition->ascent, requisition->descent, + misc::boolToStr (allowDecreaseWidth), + misc::boolToStr (allowDecreaseHeight)); + + Textblock::correctRequisitionOfChild (child, requisition, splitHeightFun, + allowDecreaseWidth, + allowDecreaseHeight); tablecell::correctCorrectedRequisitionOfChild (this, child, requisition, - splitHeightFun); + splitHeightFun, + allowDecreaseWidth, + allowDecreaseHeight); DBG_OBJ_LEAVE (); } diff --git a/dw/simpletablecell.hh b/dw/simpletablecell.hh index 2985a420..5126a3eb 100644 --- a/dw/simpletablecell.hh +++ b/dw/simpletablecell.hh @@ -13,7 +13,9 @@ protected: void correctRequisitionOfChild (Widget *child, core::Requisition *requisition, - void (*splitHeightFun) (int, int*, int*)); + void (*splitHeightFun) (int, int*, int*), + bool allowDecreaseWidth, + bool allowDecreaseHeight); void correctExtremesOfChild (Widget *child, core::Extremes *extremes, bool useAdjustmentWidth); diff --git a/dw/table.cc b/dw/table.cc index 4c953e62..b16eedfc 100644 --- a/dw/table.cc +++ b/dw/table.cc @@ -121,7 +121,8 @@ void Table::sizeRequestSimpl (core::Requisition *requisition) boxDiffHeight () + cumHeight->get (numRows) + getStyle()->vBorderSpacing; requisition->descent = 0; - correctRequisition (requisition, core::splitHeightPreserveDescent); + correctRequisition (requisition, core::splitHeightPreserveDescent, true, + false); // For the order, see similar reasoning for dw::Textblock. correctRequisitionByOOF (requisition, core::splitHeightPreserveDescent); @@ -944,7 +945,8 @@ void Table::actuallyCalcCellSizes (bool calcHeights) // Even if 'width' is defined, it may not have a defined value. We try // this trick (should perhaps be replaced by a cleaner solution): core::Requisition testReq = { -1, -1, -1 }; - correctRequisition (&testReq, core::splitHeightPreserveDescent); + correctRequisition (&testReq, core::splitHeightPreserveDescent, true, + false); if (testReq.width != -1) totalWidthSpecified = true; } diff --git a/dw/tablecell.cc b/dw/tablecell.cc index a7b16776..e2588c0b 100644 --- a/dw/tablecell.cc +++ b/dw/tablecell.cc @@ -20,6 +20,8 @@ #include "tablecell.hh" #include "table.hh" +using namespace lout; + namespace dw { /** @@ -78,21 +80,27 @@ void correctCorrectedRequisitionOfChild (core::Widget *widget, core::Widget *child, core::Requisition *requisition, void (*splitHeightFun) (int, int*, - int*)) + int*), + bool allowDecreaseWidth, + bool allowDecreaseHeight) { DBG_OBJ_ENTER_O ("resize", 0, widget, "tablecell::correctRequisitionOfChild", - "%p, %d * (%d + %d), ...", child, requisition->width, - requisition->ascent, requisition->descent); + "%p, %d * (%d + %d), ..., %s, %s", + child, requisition->width, requisition->ascent, + requisition->descent, misc::boolToStr (allowDecreaseWidth), + misc::boolToStr (allowDecreaseHeight)); // Make sure that this width does not exceed the width of the table // cell (minus margin/border/padding). int thisWidth = widget->getAvailWidth (true); DBG_OBJ_MSGF_O ("resize", 1, widget, "thisWidth = %d", thisWidth); - requisition->width = + int newWidth = lout::misc::max (lout::misc::min (requisition->width, thisWidth - widget->boxDiffWidth ()), 0); + requisition->width = allowDecreaseWidth ? + newWidth : misc::max (requisition->width, newWidth); DBG_OBJ_LEAVE_O (widget); } diff --git a/dw/tablecell.hh b/dw/tablecell.hh index 38907b71..5b789ddb 100644 --- a/dw/tablecell.hh +++ b/dw/tablecell.hh @@ -21,7 +21,9 @@ void correctCorrectedRequisitionOfChild (core::Widget *widget, core::Widget *child, core::Requisition *requisition, void (*splitHeightFun) (int, int*, - int*)); + int*), + bool allowDecreaseWidth, + bool allowDecreaseHeight); void correctCorrectedExtremesOfChild (core::Widget *widget, core::Widget *child, core::Extremes *extremes, bool useAdjustmentWidth); diff --git a/dw/textblock.cc b/dw/textblock.cc index f0bdf72a..5cb68026 100644 --- a/dw/textblock.cc +++ b/dw/textblock.cc @@ -389,7 +389,8 @@ void Textblock::sizeRequestImpl (core::Requisition *requisition, int numPos, DBG_OBJ_MSGF ("resize", 1, "before correction: %d * (%d + %d)", requisition->width, requisition->ascent, requisition->descent); - correctRequisition (requisition, core::splitHeightPreserveAscent); + correctRequisition (requisition, core::splitHeightPreserveAscent, true, + false); // Dealing with parts out of flow, which may overlap the borders of // the text block. Base lines are ignored here: they do not play a @@ -78,9 +78,13 @@ int Embed::getAvailHeightOfChild (Widget *child, bool forceValue) void Embed::correctRequisitionOfChild (Widget *child, Requisition *requisition, - void (*splitHeightFun) (int, int*, int*)) + void (*splitHeightFun) (int, int*, int*), + bool allowDecreaseWidth, + bool allowDecreaseHeight) { - resource->correctRequisitionOfChild (child, requisition, splitHeightFun); + resource->correctRequisitionOfChild (child, requisition, splitHeightFun, + allowDecreaseWidth, + allowDecreaseHeight); } void Embed::correctExtremesOfChild (Widget *child, Extremes *extremes, @@ -244,7 +248,9 @@ int Resource::getAvailHeightOfChild (Widget *child, bool forceValue) void Resource::correctRequisitionOfChild (Widget *child, Requisition *requisition, void (*splitHeightFun) (int, int*, - int*)) + int*), + bool allowDecreaseWidth, + bool allowDecreaseHeight) { // Only used when the resource contains other dillo widgets. misc::notImplemented ("Resource::correctRequisitionOfChild"); @@ -416,7 +422,9 @@ int ComplexButtonResource::getAvailHeightOfChild (Widget *child, void ComplexButtonResource::correctRequisitionOfChild (Widget *child, Requisition *requisition, void (*splitHeightFun) - (int, int*, int*)) + (int, int*, int*), + bool allowDecreaseWidth, + bool allowDecreaseHeight) { // Similar to Widget::correctRequisitionOfChild, but for percentage // the relief has to be considered. @@ -428,15 +436,18 @@ void ComplexButtonResource::correctRequisitionOfChild (Widget *child, - getEmbed()->boxDiffWidth () - 2 * reliefXThickness (), 0); - requisition->width = + int newWidth = child->applyPerWidth (baseWidth, child->getStyle()->width); + requisition->width = allowDecreaseWidth ? + newWidth : misc::max (requisition->width, newWidth); } } else - getEmbed()->correctReqWidthOfChildNoRec (child, requisition); + getEmbed()->correctReqWidthOfChildNoRec (child, requisition, + allowDecreaseWidth); // TODO Percentage heights are ignored again. - getEmbed()->correctReqHeightOfChildNoRec (child, requisition, - splitHeightFun); + getEmbed()->correctReqHeightOfChildNoRec(child, requisition, + splitHeightFun, allowDecreaseWidth); } @@ -236,7 +236,9 @@ protected: int getAvailHeightOfChild (Widget *child, bool forceValue); void correctRequisitionOfChild (Widget *child, Requisition *requisition, - void (*splitHeightFun) (int, int*, int*)); + void (*splitHeightFun) (int, int*, int*), + bool allowDecreaseWidth, + bool allowDecreaseHeight); void correctExtremesOfChild (Widget *child, Extremes *extremes, bool useAdjustmentWidth); @@ -261,14 +263,17 @@ public: inline Resource *getResource () { return resource; } inline void correctReqWidthOfChildNoRec (Widget *child, - Requisition *requisition) - { Widget::correctReqWidthOfChild (child, requisition); } + Requisition *requisition, + bool allowDecreaseWidth) + { Widget::correctReqWidthOfChild (child, requisition, allowDecreaseWidth); } inline void correctReqHeightOfChildNoRec (Widget *child, Requisition *requisition, void (*splitHeightFun) (int, int*, - int*)) - { Widget::correctReqHeightOfChild (child, requisition, splitHeightFun); } + int*), + bool allowDecreaseHeight) + { Widget::correctReqHeightOfChild (child, requisition, splitHeightFun, + allowDecreaseHeight); } virtual void correctExtremesOfChildNoRec (Widget *child, Extremes *extremes, bool useAdjustmentWidth) @@ -363,7 +368,9 @@ public: virtual void correctRequisitionOfChild (Widget *child, Requisition *requisition, void (*splitHeightFun) (int, int*, - int*)); + int*), + bool allowDecreaseWidth, + bool allowDecreaseHeight); virtual void correctExtremesOfChild (Widget *child, Extremes *extremes, bool useAdjustmentWidth); virtual void containerSizeChangedForChildren (); @@ -440,7 +447,9 @@ public: int getAvailHeightOfChild (Widget *child, bool forceValue); void correctRequisitionOfChild (Widget *child, Requisition *requisition, - void (*splitHeightFun) (int, int*, int*)); + void (*splitHeightFun) (int, int*, int*), + bool allowDecreaseWidth, + bool allowDecreaseHeight); void correctExtremesOfChild (Widget *child, Extremes *extremes, bool useAdjustmentWidth); void containerSizeChangedForChildren (); diff --git a/dw/widget.cc b/dw/widget.cc index d500ae67..a91a749b 100644 --- a/dw/widget.cc +++ b/dw/widget.cc @@ -729,19 +729,26 @@ int Widget::getAvailHeight (bool forceValue) } void Widget::correctRequisition (Requisition *requisition, - void (*splitHeightFun) (int, int *, int *)) + void (*splitHeightFun) (int, int *, int *), + bool allowDecreaseWidth, + bool allowDecreaseHeight) { // TODO Correct height by ... not extremes, but ...? (Height extremes?) - DBG_OBJ_ENTER ("resize", 0, "correctRequisition", "%d * (%d + %d), ...", + DBG_OBJ_ENTER ("resize", 0, "correctRequisition", + "%d * (%d + %d), ..., %s, %s", requisition->width, requisition->ascent, - requisition->descent); + requisition->descent, misc::boolToStr (allowDecreaseWidth), + misc::boolToStr (allowDecreaseHeight)); if (parent == NULL && quasiParent == NULL) { DBG_OBJ_MSG ("resize", 1, "no parent, regarding viewport"); DBG_OBJ_MSG_START (); int limitMinWidth = getMinWidth (NULL, true); + if (!allowDecreaseWidth && limitMinWidth < requisition->width) + limitMinWidth = requisition->width; + int viewportWidth = layout->viewportWidth - (layout->canvasHeightGreater ? layout->vScrollbarThickness : 0); @@ -753,6 +760,9 @@ void Widget::correctRequisition (Requisition *requisition, layout->viewportHeight, NULL, false); int minHeight = calcHeight (getStyle()->minHeight, false, layout->viewportHeight, NULL, false); + if (!allowDecreaseHeight && + minHeight < requisition->ascent + requisition->descent) + minHeight = requisition->ascent + requisition->descent; int maxHeight = calcHeight (getStyle()->maxHeight, false, layout->viewportHeight, NULL, false); @@ -772,13 +782,17 @@ void Widget::correctRequisition (Requisition *requisition, } else if (parent) { DBG_OBJ_MSG ("resize", 1, "delegated to parent"); DBG_OBJ_MSG_START (); - parent->correctRequisitionOfChild (this, requisition, splitHeightFun); + parent->correctRequisitionOfChild (this, requisition, splitHeightFun, + allowDecreaseWidth, + allowDecreaseHeight); DBG_OBJ_MSG_END (); } else /* if (quasiParent) */ { DBG_OBJ_MSG ("resize", 1, "delegated to quasiParent"); DBG_OBJ_MSG_START (); quasiParent->correctRequisitionOfChild (this, requisition, - splitHeightFun); + splitHeightFun, + allowDecreaseWidth, + allowDecreaseHeight); DBG_OBJ_MSG_END (); } @@ -1719,44 +1733,54 @@ int Widget::getAvailHeightOfChild (Widget *child, bool forceValue) void Widget::correctRequisitionOfChild (Widget *child, Requisition *requisition, void (*splitHeightFun) (int, int*, - int*)) + int*), + bool allowDecreaseWidth, + bool allowDecreaseHeight) { // Again, a suitable implementation for all widgets (perhaps). DBG_OBJ_ENTER ("resize", 0, "correctRequisitionOfChild", - "%p, %d * (%d + %d), ...", child, requisition->width, - requisition->ascent, requisition->descent); + "%p, %d * (%d + %d), ..., %s, %s", child, requisition->width, + requisition->ascent, requisition->descent, + misc::boolToStr (allowDecreaseWidth), + misc::boolToStr (allowDecreaseHeight)); // 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); + correctReqWidthOfChild (child, requisition, allowDecreaseWidth); + correctReqHeightOfChild (child, requisition, splitHeightFun, + allowDecreaseHeight); } else { DBG_OBJ_MSG ("resize", 1, "delegated to (effective) container"); DBG_OBJ_MSG_START (); effContainer->correctRequisitionOfChild (child, requisition, - splitHeightFun); + splitHeightFun, + allowDecreaseWidth, + allowDecreaseHeight); DBG_OBJ_MSG_END (); } - DBG_OBJ_MSGF ("resize", 1, "=> %d * (%d + %d)", - requisition->width, requisition->ascent, - requisition->descent); - DBG_OBJ_LEAVE (); + DBG_OBJ_LEAVE_VAL ("%d * (%d + %d)", requisition->width, requisition->ascent, + requisition->descent); } -void Widget::correctReqWidthOfChild (Widget *child, Requisition *requisition) +void Widget::correctReqWidthOfChild (Widget *child, Requisition *requisition, + bool allowDecreaseWidth) { - DBG_OBJ_ENTER ("resize", 0, "correctReqWidthOfChild", "%p, %d * (%d + %d)", + DBG_OBJ_ENTER ("resize", 0, "correctReqWidthOfChild", + "%p, %d * (%d + %d), %s", child, requisition->width, requisition->ascent, - requisition->descent); + requisition->descent, misc::boolToStr (allowDecreaseWidth)); assert (this == child->quasiParent || this == child->container); int limitMinWidth = child->getMinWidth (NULL, true); + if (!allowDecreaseWidth && limitMinWidth < requisition->width) + limitMinWidth = requisition->width; + child->calcFinalWidth (child->getStyle(), -1, this, limitMinWidth, false, &requisition->width); @@ -1767,20 +1791,25 @@ void Widget::correctReqWidthOfChild (Widget *child, Requisition *requisition) } void Widget::correctReqHeightOfChild (Widget *child, Requisition *requisition, - void (*splitHeightFun) (int, int*, int*)) + void (*splitHeightFun) (int, int*, int*), + bool allowDecreaseHeight) { // 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); + "%p, %d * (%d + %d), ..., %s", child, requisition->width, + requisition->ascent, requisition->descent, + misc::boolToStr (allowDecreaseHeight)); int height = child->calcHeight (child->getStyle()->height, false, -1, this, false); int minHeight = child->calcHeight (child->getStyle()->minHeight, false, -1, this, false); + if (!allowDecreaseHeight && + minHeight < requisition->ascent + requisition->descent) + minHeight = requisition->ascent + requisition->descent; int maxHeight = child->calcHeight (child->getStyle()->maxHeight, false, -1, this, false); diff --git a/dw/widget.hh b/dw/widget.hh index d5cb8972..a1d0f908 100644 --- a/dw/widget.hh +++ b/dw/widget.hh @@ -333,10 +333,14 @@ protected: virtual void correctRequisitionOfChild (Widget *child, Requisition *requisition, void (*splitHeightFun) (int, int*, - int*)); - void correctReqWidthOfChild (Widget *child, Requisition *requisition); + int*), + bool allowDecreaseWidth, + bool allowDecreaseHeight); + void correctReqWidthOfChild (Widget *child, Requisition *requisition, + bool allowDecreaseWidth); void correctReqHeightOfChild (Widget *child, Requisition *requisition, - void (*splitHeightFun) (int, int*, int*)); + void (*splitHeightFun) (int, int*, int*), + bool allowDecreaseHeight); virtual void correctExtremesOfChild (Widget *child, Extremes *extremes, bool useAdjustmentWidth); @@ -493,7 +497,8 @@ public: int getAvailHeight (bool forceValue); virtual bool getAdjustMinWidth () { return Widget::adjustMinWidth; } void correctRequisition (Requisition *requisition, - void (*splitHeightFun) (int, int*, int*)); + void (*splitHeightFun) (int, int*, int*), + bool allowDecreaseWidth, bool allowDecreaseHeight); void correctExtremes (Extremes *extremes, bool useAdjustmentWidth); int calcWidth (style::Length cssValue, int refWidth, Widget *refWidget, int limitMinWidth, bool forceValue); |