diff options
author | Sebastian Geerken <devnull@localhost> | 2014-09-12 20:28:56 +0200 |
---|---|---|
committer | Sebastian Geerken <devnull@localhost> | 2014-09-12 20:28:56 +0200 |
commit | ae2d990af432ea56375936e5ec9872fe0503d61f (patch) | |
tree | 0b5bf1d9fbce4481ae3fc49b86b6362ae071a12f /dw/oofawarewidget.cc | |
parent | f9f3fcc4b5f72de36d6cb231baeaf21a3b615704 (diff) |
Table gets OOF aware, part 1. Warning: crashes!
Diffstat (limited to 'dw/oofawarewidget.cc')
-rw-r--r-- | dw/oofawarewidget.cc | 81 |
1 files changed, 79 insertions, 2 deletions
diff --git a/dw/oofawarewidget.cc b/dw/oofawarewidget.cc index 5747b78e..a71b3f0d 100644 --- a/dw/oofawarewidget.cc +++ b/dw/oofawarewidget.cc @@ -45,6 +45,17 @@ OOFAwareWidget::OOFAwareWidget () OOFAwareWidget::~OOFAwareWidget () { + for (int i = 0; i < NUM_OOFM; i++) { + if(outOfFlowMgr[i]) { + // I feel more comfortable by letting the OOF aware widget delete + // these widgets, instead of doing this in ~OutOfFlowMgr. + for (int j = 0; j < outOfFlowMgr[i]->getNumWidgets (); j++) + delete outOfFlowMgr[i]->getWidget (j); + + delete outOfFlowMgr[i]; + } + } + DBG_OBJ_DELETE (); } @@ -132,8 +143,7 @@ void OOFAwareWidget::notifySetParent () oofContainer[oofmIndex] = (OOFAwareWidget*)widget; } - DBG_OBJ_ARRSET_PTR ("containingBlock", oofmIndex, - containingBlock[oofmIndex]); + DBG_OBJ_ARRSET_PTR ("oofContainer", oofmIndex, oofContainer[oofmIndex]); assert (oofContainer[oofmIndex] != NULL); } @@ -163,6 +173,46 @@ void OOFAwareWidget::initOutOfFlowMgrs () } } +void OOFAwareWidget::correctRequisitionByOOF (Requisition *requisition) +{ + for (int i = 0; i < NUM_OOFM; i++) { + if (outOfFlowMgr[i]) { + int oofWidth, oofHeight; + DBG_OBJ_MSGF ("resize", 1, + "before considering widgets by OOFM #%d: %d * (%d + %d)", + i, requisition->width, requisition->ascent, + requisition->descent); + + outOfFlowMgr[i]->getSize (requisition, &oofWidth, &oofHeight); + + if (oofWidth > requisition->width) + requisition->width = oofWidth; + if (oofHeight > requisition->ascent + requisition->descent) + requisition->descent = oofHeight - requisition->ascent; + } + } +} + +void OOFAwareWidget::correctExtremesByOOF (Extremes *extremes) +{ + for (int i = 0; i < NUM_OOFM; i++) { + if (outOfFlowMgr[i]) { + int oofMinWidth, oofMaxWidth; + outOfFlowMgr[i]->getExtremes (extremes, &oofMinWidth, &oofMaxWidth); + + DBG_OBJ_MSGF ("resize", 1, "OOFM (#%d) correction: %d / %d", + i, oofMinWidth, oofMaxWidth); + + extremes->minWidth = max (extremes->minWidth, oofMinWidth); + extremes->minWidthIntrinsic = max (extremes->minWidthIntrinsic, + oofMinWidth); + extremes->maxWidth = max (extremes->maxWidth, oofMaxWidth); + extremes->maxWidthIntrinsic = max (extremes->maxWidthIntrinsic, + oofMinWidth); + } + } +} + void OOFAwareWidget::sizeAllocateStart (core::Allocation *allocation) { @@ -178,6 +228,33 @@ void OOFAwareWidget::sizeAllocateEnd () oofContainer[i]->outOfFlowMgr[i]->sizeAllocateEnd (this); } +void OOFAwareWidget::containerSizeChangedForChildrenOOF () +{ + for (int i = 0; i < NUM_OOFM; i++) + if (outOfFlowMgr[i]) + outOfFlowMgr[i]->containerSizeChangedForChildren (); +} + +void OOFAwareWidget::drawOOF (View *view, Rectangle *area) +{ + for (int i = 0; i < NUM_OOFM; i++) + if(outOfFlowMgr[i]) + outOfFlowMgr[i]->draw(view, area); +} + +Widget *OOFAwareWidget::getWidgetOOFAtPoint (int x, int y, int level) +{ + for (int i = 0; i < NUM_OOFM; i++) { + Widget *oofWidget = + outOfFlowMgr[i] ? + outOfFlowMgr[i]->getWidgetAtPoint (x, y, level) : NULL; + if (oofWidget) + return oofWidget; + } + + return NULL; +} + void OOFAwareWidget::borderChanged (int y, Widget *vloat) { assertNotReached (); |