@@ -535,23 +535,32 @@ def _constrain(
535535 Returns:
536536 New region.
537537 """
538- constrain = styles .constrain
539- if constrain == "inflect" :
540- inflect_margin = styles .margin
541- margin_region = region .grow (inflect_margin )
542- region = region .inflect (
543- (- 1 if margin_region .right > constrain_region .right else 0 ),
544- (- 1 if margin_region .bottom > constrain_region .bottom else 0 ),
545- inflect_margin ,
546- )
547- region = region .translate_inside (constrain_region , True , True )
548- elif constrain != "none" :
549- # Constrain to avoid clipping
550- region = region .translate_inside (
551- constrain_region ,
552- constrain in ("x" , "both" ),
553- constrain in ("y" , "both" ),
554- )
538+ constrain_x = styles .constrain_x
539+ constrain_y = styles .constrain_y
540+
541+ inflect_margin = styles .margin
542+ margin_region = region .grow (inflect_margin )
543+
544+ region = region .inflect (
545+ (
546+ (- 1 if margin_region .right > constrain_region .right else 0 )
547+ if constrain_x == "inflect"
548+ else 0
549+ ),
550+ (
551+ (- 1 if margin_region .bottom > constrain_region .bottom else 0 )
552+ if constrain_y == "inflect"
553+ else 0
554+ ),
555+ inflect_margin ,
556+ )
557+
558+ region = region .translate_inside (
559+ constrain_region .shrink (styles .margin ),
560+ constrain_x == "limit" ,
561+ constrain_y == "limit" ,
562+ )
563+
555564 return region
556565
557566 def _arrange_root (
@@ -688,7 +697,10 @@ def add_widget(
688697
689698 widget_order = order + ((layer_index , z , layer_order ),)
690699
691- if overlay and sub_widget .styles .constrain != "none" :
700+ if overlay and (
701+ sub_widget .styles .constrain_x != "none"
702+ or sub_widget .styles .constrain_y != "none"
703+ ):
692704 widget_region = self ._constrain (
693705 sub_widget .styles , widget_region , no_clip
694706 )
@@ -740,11 +752,15 @@ def add_widget(
740752 widget_region = region + layout_offset
741753
742754 if widget ._absolute_offset is not None :
755+ margin = styles .margin
743756 widget_region = widget_region .reset_offset .translate (
744- widget ._absolute_offset + widget .styles .margin .top_left
757+ widget ._absolute_offset + margin .top_left
758+ )
759+ widget_region = widget_region .translate (
760+ styles .offset .resolve (widget_region .grow (margin ).size , size )
745761 )
746762
747- if styles .constrain != "none" :
763+ if styles .constrain_x != "none" or styles . constrain_y != "none" :
748764 widget_region = self ._constrain (styles , widget_region , no_clip )
749765
750766 map [widget ._render_widget ] = _MapGeometry (
0 commit comments