summaryrefslogtreecommitdiff
path: root/dw/oofawarewidget.cc
diff options
context:
space:
mode:
authorSebastian Geerken <devnull@localhost>2014-09-12 20:28:56 +0200
committerSebastian Geerken <devnull@localhost>2014-09-12 20:28:56 +0200
commitae2d990af432ea56375936e5ec9872fe0503d61f (patch)
tree0b5bf1d9fbce4481ae3fc49b86b6362ae071a12f /dw/oofawarewidget.cc
parentf9f3fcc4b5f72de36d6cb231baeaf21a3b615704 (diff)
Table gets OOF aware, part 1. Warning: crashes!
Diffstat (limited to 'dw/oofawarewidget.cc')
-rw-r--r--dw/oofawarewidget.cc81
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 ();