aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dw/widget.cc107
-rw-r--r--dw/widget.hh4
2 files changed, 58 insertions, 53 deletions
diff --git a/dw/widget.cc b/dw/widget.cc
index fec193a1..740cebd3 100644
--- a/dw/widget.cc
+++ b/dw/widget.cc
@@ -677,26 +677,12 @@ void Widget::correctRequisition (Requisition *requisition,
DBG_OBJ_MSG ("resize", 1, "no parent, regarding viewport");
DBG_OBJ_MSG_START ();
- int limit = getMinWidth (NULL, true);
+ int limitMinWidth = getMinWidth (NULL, true);
int viewportWidth =
layout->viewportWidth - (layout->canvasHeightGreater ?
layout->vScrollbarThickness : 0);
-
- int width = calcWidth (getStyle()->width, viewportWidth, NULL, limit);
- int minWidth =
- calcWidth (getStyle()->minWidth, viewportWidth, NULL, limit);
- int maxWidth =
- calcWidth (getStyle()->maxWidth, viewportWidth, NULL, limit);
-
- DBG_OBJ_MSGF ("resize", 1, "width = %d, minWidth = %d, maxWidth = %d",
- width, minWidth, maxWidth);
-
- if (width != -1)
- requisition->width = width;
- if (minWidth != -1 && requisition->width < minWidth)
- requisition->width = minWidth;
- if (maxWidth != -1 && requisition->width > maxWidth)
- requisition->width = maxWidth;
+ calcFinalWidth (getStyle (), viewportWidth, NULL, limitMinWidth,
+ &requisition->width);
// For layout->viewportHeight, see comment in getAvailHeight().
int height = calcHeight (getStyle()->height, false,
@@ -748,16 +734,17 @@ void Widget::correctExtremes (Extremes *extremes)
DBG_OBJ_MSG ("resize", 1, "no parent, regarding viewport");
DBG_OBJ_MSG_START ();
- int limit = getMinWidth (extremes, false);
+ int limitMinWidth = getMinWidth (extremes, false);
int viewportWidth =
layout->viewportWidth - (layout->canvasHeightGreater ?
layout->vScrollbarThickness : 0);
- int width = calcWidth (getStyle()->width, viewportWidth, NULL, limit);
- int minWidth =
- calcWidth (getStyle()->minWidth, viewportWidth, NULL, limit);
- int maxWidth =
- calcWidth (getStyle()->maxWidth, viewportWidth, NULL, limit);
+ int width = calcWidth (getStyle()->width, viewportWidth, NULL,
+ limitMinWidth);
+ int minWidth = calcWidth (getStyle()->minWidth, viewportWidth, NULL,
+ limitMinWidth);
+ int maxWidth = calcWidth (getStyle()->maxWidth, viewportWidth, NULL,
+ limitMinWidth);
DBG_OBJ_MSGF ("resize", 1, "width = %d, minWidth = %d, maxWidth = %d",
width, minWidth, maxWidth);
@@ -788,10 +775,10 @@ void Widget::correctExtremes (Extremes *extremes)
}
int Widget::calcWidth (style::Length cssValue, int refWidth, Widget *refWidget,
- int minWidth)
+ int limitMinWidth)
{
DBG_OBJ_ENTER ("resize", 0, "calcWidth", "0x%x, %d, %p, %d",
- cssValue, refWidth, refWidget, minWidth);
+ cssValue, refWidth, refWidget, limitMinWidth);
assert (refWidth != -1 || refWidget != NULL);
@@ -800,20 +787,20 @@ int Widget::calcWidth (style::Length cssValue, int refWidth, Widget *refWidget,
if (style::isAbsLength (cssValue)) {
DBG_OBJ_MSGF ("resize", 1, "absolute width: %dpx",
style::absLengthVal (cssValue));
- width =
- misc::max (style::absLengthVal (cssValue) + boxDiffWidth (), minWidth);
+ width = misc::max (style::absLengthVal (cssValue) + boxDiffWidth (),
+ limitMinWidth);
} else if (style::isPerLength (cssValue)) {
DBG_OBJ_MSGF ("resize", 1, "percentage width: %g%%",
100 *
style::perLengthVal_useThisOnlyForDebugging (cssValue));
if (refWidth != -1)
- width = misc::max (applyPerWidth (refWidth, cssValue), minWidth);
+ width = misc::max (applyPerWidth (refWidth, cssValue), limitMinWidth);
else {
int availWidth = refWidget->getAvailWidth (false);
if (availWidth != -1) {
int containerWidth = availWidth - refWidget->boxDiffWidth ();
- width =
- misc::max (applyPerWidth (containerWidth, cssValue), minWidth);
+ width = misc::max (applyPerWidth (containerWidth, cssValue),
+ limitMinWidth);
} else
width = -1;
}
@@ -827,6 +814,34 @@ int Widget::calcWidth (style::Length cssValue, int refWidth, Widget *refWidget,
return width;
}
+// *finalWidth may be -1.
+void Widget::calcFinalWidth (style::Style *style, int refWidth,
+ Widget *refWidget, int limitMinWidth,
+ int *finalWidth)
+{
+ DBG_OBJ_ENTER ("resize", 0, "calcFinalWidth", "0x%x, %d, %p, %d, [%d]",
+ cssValue, refWidth, refWidget, limitMinWidth, *finalWidth);
+
+ int width = calcWidth (style->width, refWidth, refWidget, limitMinWidth);
+ int minWidth = calcWidth (style->minWidth, refWidth, refWidget,
+ limitMinWidth);
+ int maxWidth = calcWidth (style->maxWidth, refWidth, refWidget,
+ limitMinWidth);
+
+ DBG_OBJ_MSGF ("resize", 1, "width = %d, minWidth = %d, maxWidth = %d",
+ width, minWidth, maxWidth);
+
+ if (width != -1)
+ *finalWidth = width;
+ if (minWidth != -1 && (*finalWidth == -1 || *finalWidth < minWidth))
+ *finalWidth = minWidth;
+ if (maxWidth != -1 && (*finalWidth == -1 || *finalWidth > maxWidth))
+ *finalWidth = maxWidth;
+
+ DBG_OBJ_MSGF ("resize", 1, "=> %d", width);
+ DBG_OBJ_LEAVE ();
+}
+
int Widget::calcHeight (style::Length cssValue, bool usePercentage,
int refHeight, Widget *refWidget)
{
@@ -1577,22 +1592,9 @@ void Widget::correctReqWidthOfChild (Widget *child, Requisition *requisition)
assert (this == child->quasiParent || this == child->container);
- int limit = child->getMinWidth (NULL, true);
- int width = child->calcWidth (child->getStyle()->width, -1, this, limit);
- int minWidth =
- child->calcWidth (child->getStyle()->minWidth, -1, this, limit);
- int maxWidth =
- child->calcWidth (child->getStyle()->maxWidth, -1, this, limit);
-
- DBG_OBJ_MSGF ("resize", 1, "width = %d, minWidth = %d, maxWidth = %d",
- width, minWidth, maxWidth);
-
- if (width != -1)
- requisition->width = width;
- if (minWidth != -1 && requisition->width < minWidth)
- requisition->width = minWidth;
- if (maxWidth != -1 && requisition->width > maxWidth)
- requisition->width = maxWidth;
+ int limitMinWidth = child->getMinWidth (NULL, true);
+ calcFinalWidth (child->getStyle(), -1, this, limitMinWidth,
+ &requisition->width);
DBG_OBJ_MSGF ("resize", 1, "=> %d * (%d + %d)",
requisition->width, requisition->ascent,
@@ -1649,12 +1651,13 @@ void Widget::correctExtremesOfChild (Widget *child, Extremes *extremes)
(child->container ? child->container : child->parent);
if (effContainer == this) {
- int limit = child->getMinWidth (extremes, false);
- int width = child->calcWidth (child->getStyle()->width, -1, this, limit);
- int minWidth =
- child->calcWidth (child->getStyle()->minWidth, -1, this, limit);
- int maxWidth =
- child->calcWidth (child->getStyle()->maxWidth, -1, this, limit);
+ int limitMinWidth = child->getMinWidth (extremes, false);
+ int width = child->calcWidth (child->getStyle()->width, -1, this,
+ limitMinWidth);
+ int minWidth = child->calcWidth (child->getStyle()->minWidth, -1, this,
+ limitMinWidth);
+ int maxWidth = child->calcWidth (child->getStyle()->maxWidth, -1, this,
+ limitMinWidth);
DBG_OBJ_MSGF ("resize", 1, "width = %d, minWidth = %d, maxWidth = %d",
width, minWidth, maxWidth);
diff --git a/dw/widget.hh b/dw/widget.hh
index 50d1f543..9b25fbc8 100644
--- a/dw/widget.hh
+++ b/dw/widget.hh
@@ -432,7 +432,9 @@ public:
void (*splitHeightFun) (int, int*, int*));
void correctExtremes (Extremes *extremes);
int calcWidth (style::Length cssValue, int refWidth, Widget *refWidget,
- int minWidth);
+ int limitMinWidth);
+ void calcFinalWidth (style::Style *style, int refWidth, Widget *refWidget,
+ int limitMinWidth, int *finalWidth);
int calcHeight (style::Length cssValue, bool usePercentage, int refHeight,
Widget *refWidget);