summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dw/alignedtablecell.cc20
-rw-r--r--dw/alignedtablecell.hh4
-rw-r--r--dw/image.cc3
-rw-r--r--dw/simpletablecell.cc23
-rw-r--r--dw/simpletablecell.hh4
-rw-r--r--dw/table.cc6
-rw-r--r--dw/tablecell.cc16
-rw-r--r--dw/tablecell.hh4
-rw-r--r--dw/textblock.cc3
-rw-r--r--dw/ui.cc27
-rw-r--r--dw/ui.hh23
-rw-r--r--dw/widget.cc71
-rw-r--r--dw/widget.hh13
-rw-r--r--test/dw_simple_container.cc2
14 files changed, 155 insertions, 64 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
diff --git a/dw/ui.cc b/dw/ui.cc
index 62b91d5f..1b4e23f5 100644
--- a/dw/ui.cc
+++ b/dw/ui.cc
@@ -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);
}
diff --git a/dw/ui.hh b/dw/ui.hh
index 62ffe3a6..dc695557 100644
--- a/dw/ui.hh
+++ b/dw/ui.hh
@@ -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);
diff --git a/test/dw_simple_container.cc b/test/dw_simple_container.cc
index 923642b1..e7fa563c 100644
--- a/test/dw_simple_container.cc
+++ b/test/dw_simple_container.cc
@@ -172,7 +172,7 @@ void SimpleContainer::sizeRequestSimpl (Requisition *requisition)
requisition->ascent = childReq.ascent + boxOffsetY ();
requisition->descent = childReq.descent + boxRestHeight ();
- correctRequisition (requisition, splitHeightPreserveAscent);
+ correctRequisition (requisition, splitHeightPreserveAscent, true, true);
}