diff options
Diffstat (limited to 'dw/ui.cc')
-rw-r--r-- | dw/ui.cc | 189 |
1 files changed, 155 insertions, 34 deletions
@@ -39,6 +39,7 @@ Embed::Embed(Resource *resource) registerName ("dw::core::ui::Embed", &CLASS_ID); this->resource = resource; resource->setEmbed (this); + DBG_OBJ_ASSOC_CHILD (resource); } Embed::~Embed() @@ -55,6 +56,7 @@ void Embed::sizeRequestImpl (Requisition *requisition) void Embed::getExtremesImpl (Extremes *extremes) { resource->getExtremes (extremes); + correctExtremes (extremes); } void Embed::sizeAllocateImpl (Allocation *allocation) @@ -62,6 +64,35 @@ void Embed::sizeAllocateImpl (Allocation *allocation) resource->sizeAllocate (allocation); } +int Embed::getAvailWidthOfChild (Widget *child, bool forceValue) +{ + return resource->getAvailWidthOfChild (child, forceValue); +} + +int Embed::getAvailHeightOfChild (Widget *child, bool forceValue) +{ + return resource->getAvailHeightOfChild (child, forceValue); +} + +void Embed::correctRequisitionOfChild (Widget *child, + Requisition *requisition, + void (*splitHeightFun) (int, int*, int*)) +{ + resource->correctRequisitionOfChild (child, requisition, splitHeightFun); +} + +void Embed::correctExtremesOfChild (Widget *child, Extremes *extremes) +{ + resource->correctExtremesOfChild (child, extremes); +} + +void Embed::containerSizeChangedForChildren () +{ + DBG_OBJ_ENTER0 ("resize", 0, "containerSizeChangedForChildren"); + resource->containerSizeChangedForChildren (); + DBG_OBJ_LEAVE (); +} + void Embed::enterNotifyImpl (core::EventCrossing *event) { resource->emitEnter(); @@ -87,21 +118,6 @@ bool Embed::buttonPressImpl (core::EventButton *event) return handled; } -void Embed::setWidth (int width) -{ - resource->setWidth (width); -} - -void Embed::setAscent (int ascent) -{ - resource->setAscent (ascent); -} - -void Embed::setDescent (int descent) -{ - resource->setDescent (descent); -} - void Embed::setDisplayed (bool displayed) { resource->setDisplayed (displayed); @@ -180,6 +196,7 @@ void Resource::ActivateEmitter::emitLeave (Resource *resource) Resource::~Resource () { + DBG_OBJ_DELETE (); } void Resource::setEmbed (Embed *embed) @@ -189,26 +206,56 @@ void Resource::setEmbed (Embed *embed) void Resource::getExtremes (Extremes *extremes) { + DBG_OBJ_ENTER0 ("resize", 0, "getExtremes"); + /* Simply return the requisition width */ Requisition requisition; sizeRequest (&requisition); extremes->minWidth = extremes->maxWidth = requisition.width; + extremes->minWidthIntrinsic = extremes->minWidth; + extremes->maxWidthIntrinsic = extremes->maxWidth; + + DBG_OBJ_MSGF ("resize", 1, "result: %d / %d", + extremes->minWidth, extremes->maxWidth); + DBG_OBJ_LEAVE (); } void Resource::sizeAllocate (Allocation *allocation) { } -void Resource::setWidth (int width) +int Resource::getAvailWidthOfChild (Widget *child, bool forceValue) +{ + // Only used when the resource contains other dillo widgets. + misc::assertNotReached (); + return 0; +} + +int Resource::getAvailHeightOfChild (Widget *child, bool forceValue) +{ + // Only used when the resource contains other dillo widgets. + misc::assertNotReached (); + return 0; +} + +void Resource::correctRequisitionOfChild (Widget *child, + Requisition *requisition, + void (*splitHeightFun) (int, int*, + int*)) { + // Only used when the resource contains other dillo widgets. + misc::assertNotReached (); } -void Resource::setAscent (int ascent) +void Resource::correctExtremesOfChild (Widget *child, Extremes *extremes) { + // Only used when the resource contains other dillo widgets. + misc::assertNotReached (); } -void Resource::setDescent (int descent) +void Resource::containerSizeChangedForChildren () { + // No children by default. } void Resource::setDisplayed (bool displayed) @@ -264,18 +311,17 @@ Iterator *LabelButtonResource::iterator (Content::Type mask, bool atEnd) // ---------------------------------------------------------------------- -void ComplexButtonResource::LayoutReceiver::canvasSizeChanged (int width, - int ascent, - int descent) +void ComplexButtonResource::LayoutReceiver::resizeQueued (bool extremesChanged) { - /** - * \todo Verify that this is correct. - */ - resource->queueResize (resource->childWidget->extremesChanged ()); + DBG_OBJ_ENTER ("resize", 0, "LayoutReceiver/resizeQueued", "%s", + extremesChanged ? "true" : "false"); + resource->queueResize (extremesChanged); + DBG_OBJ_LEAVE (); } ComplexButtonResource::ComplexButtonResource () { + DBG_OBJ_CREATE ("dw::core::ui::ComplexButtonResource"); layout = NULL; layoutReceiver.resource = this; click_x = click_y = -1; @@ -283,61 +329,136 @@ ComplexButtonResource::ComplexButtonResource () void ComplexButtonResource::init (Widget *widget) { - this->childWidget = widget; + childWidget = widget; layout = new Layout (createPlatform ()); setLayout (layout); + DBG_OBJ_ASSOC_CHILD (layout); layout->setWidget (widget); layout->connect (&layoutReceiver); + + if (getEmbed ()) + childWidget->setQuasiParent (getEmbed ()); } void ComplexButtonResource::setEmbed (Embed *embed) { ButtonResource::setEmbed (embed); - if (childWidget->usesHints ()) - embed->setUsesHints (); + if (childWidget) + childWidget->setQuasiParent (getEmbed ()); } ComplexButtonResource::~ComplexButtonResource () { delete layout; + DBG_OBJ_DELETE (); } void ComplexButtonResource::sizeRequest (Requisition *requisition) { + DBG_OBJ_ENTER0 ("resize", 0, "sizeRequest"); + Requisition widgetRequisition; childWidget->sizeRequest (&widgetRequisition); requisition->width = widgetRequisition.width + 2 * reliefXThickness (); requisition->ascent = widgetRequisition.ascent + reliefYThickness (); requisition->descent = widgetRequisition.descent + reliefYThickness (); + + DBG_OBJ_MSGF ("resize", 1, "result: %d * (%d + %d)", + requisition->width, requisition->ascent, requisition->descent); + DBG_OBJ_LEAVE (); } void ComplexButtonResource::getExtremes (Extremes *extremes) { + DBG_OBJ_ENTER0 ("resize", 0, "getExtremes"); + Extremes widgetExtremes; childWidget->getExtremes (&widgetExtremes); extremes->minWidth = widgetExtremes.minWidth + 2 * reliefXThickness (); extremes->maxWidth = widgetExtremes.maxWidth + 2 * reliefXThickness (); + extremes->minWidthIntrinsic = extremes->minWidth; + extremes->maxWidthIntrinsic = extremes->maxWidth; + + DBG_OBJ_MSGF ("resize", 1, "result: %d / %d", + extremes->minWidth, extremes->maxWidth); + DBG_OBJ_LEAVE (); } void ComplexButtonResource::sizeAllocate (Allocation *allocation) { } -void ComplexButtonResource::setWidth (int width) +int ComplexButtonResource::getAvailWidthOfChild (Widget *child, bool forceValue) +{ + int embedWidth = getEmbed()->getAvailWidth (forceValue); + if (embedWidth == -1) + return -1; + else + return misc::max (embedWidth - 2 * reliefXThickness (), 0); +} + +int ComplexButtonResource::getAvailHeightOfChild (Widget *child, + bool forceValue) +{ + int embedHeight = getEmbed()->getAvailHeight (forceValue); + if (embedHeight == -1) + return -1; + else + return misc::max (embedHeight - 2 * reliefYThickness (), 0); +} + +void ComplexButtonResource::correctRequisitionOfChild (Widget *child, + Requisition *requisition, + void (*splitHeightFun) + (int, int*, int*)) { - childWidget->setWidth (width - 2 * reliefXThickness ()); + // Similar to Widget::correctRequisitionOfChild, but for percentage + // the relief has to be considered. + + if (style::isPerLength (child->getStyle()->width)) { + int availWidth = getEmbed()->getAvailHeight (false); + if (availWidth != -1) { + int baseWidth = misc::max (availWidth + - getEmbed()->boxDiffWidth () + - 2 * reliefXThickness (), + 0); + requisition->width = + child->applyPerWidth (baseWidth, child->getStyle()->width); + } + } else + getEmbed()->correctReqWidthOfChildNoRec (child, requisition); + + // TODO Percentage heights are ignored again. + getEmbed()->correctReqHeightOfChildNoRec (child, requisition, + splitHeightFun); + } -void ComplexButtonResource::setAscent (int ascent) +void ComplexButtonResource::correctExtremesOfChild (Widget *child, + Extremes *extremes) { - childWidget->setAscent (ascent - reliefYThickness ()); + // Similar to Widget::correctExtremesOfChild, but for percentage + // the relief has to be considered. + + if (style::isPerLength (child->getStyle()->width)) { + int availWidth = getEmbed()->getAvailHeight (false); + if (availWidth != -1) { + int baseWidth = misc::max (availWidth + - getEmbed()->boxDiffWidth () + - 2 * reliefXThickness (), + 0); + extremes->minWidth = extremes->maxWidth = + child->applyPerWidth (baseWidth, child->getStyle()->width); + } + } else + getEmbed()->correctExtremesOfChildNoRec (child, extremes); } -void ComplexButtonResource::setDescent (int descent) +void ComplexButtonResource::containerSizeChangedForChildren () { - childWidget->setDescent (descent - reliefYThickness ()); + layout->containerSizeChanged (); } Iterator *ComplexButtonResource::iterator (Content::Type mask, bool atEnd) |