Bladeren bron

element: GetBoundingClientRect

mattias 2 jaren geleden
bovenliggende
commit
427f29a43b
2 gewijzigde bestanden met toevoegingen van 36 en 6 verwijderingen
  1. 11 3
      design/fresnel.register.pas
  2. 25 3
      src/fresnel.dom.pas

+ 11 - 3
design/fresnel.register.pas

@@ -147,7 +147,8 @@ procedure TFresnelFormMediator.GetBounds(AComponent: TComponent; out
   CurBounds: TRect);
 var
   El: TFresnelElement;
-  aBorderBox: TFresnelRect;
+  aBox: TFresnelRect;
+  aPaddingLeft, aPaddingTop: TFresnelLength;
 begin
   if AComponent=FDsgnForm then
   begin
@@ -155,8 +156,15 @@ begin
   end else if AComponent is TFresnelElement then
   begin
     El:=TFresnelElement(AComponent);
-    aBorderBox:=El.RenderedBorderBox;
-    FresnelRectToRect(aBorderBox,CurBounds);
+    aBox:=El.GetBoundingClientRect;
+    //aBox:=El.RenderedBorderBox;
+    //aPaddingLeft:=El.GetRenderedCSSLength(fcaPaddingLeft,false);
+    //aPaddingTop:=El.GetRenderedCSSLength(fcaPaddingTop,false);
+    //aBox.Left:=aBox.Left+aPaddingLeft;
+    //aBox.Top:=aBox.Top+aPaddingTop;
+    //aBox.Right:=aBox.Right+aPaddingLeft;
+    //aBox.Bottom:=aBox.Bottom+aPaddingTop;
+    FresnelRectToRect(aBox,CurBounds);
   end else
     inherited GetBounds(AComponent,CurBounds);
   //debugln(['TFresnelFormMediator.GetBounds ',DbgSName(AComponent),' ',dbgs(CurBounds)]);

+ 25 - 3
src/fresnel.dom.pas

@@ -457,14 +457,15 @@ type
     property LayoutNode: TFresnelLayoutNode read FLayoutNode write FLayoutNode;
     // renderer
     procedure UpdateRenderedAttributes; virtual;
+    function GetBoundingClientRect: TFresnelRect; virtual;
     function GetRenderedCSSLength(Attr: TFresnelCSSAttribute; UseInherited: boolean; UseNaNOnFail: boolean = false): TFresnelLength; virtual; // on fail returns NaN
     function GetRenderedCSString(Attr: TFresnelCSSAttribute; UseInherited: boolean): string; virtual;
-    // Events
-    Procedure AddEventListener(aID : TEventID; aHandler : TFresnelEventHandler);
-    Procedure AddEventListener(Const aName: TEventName; aHandler : TFresnelEventHandler);
     property Rendered: boolean read FRendered write FRendered;
     property RenderedBorderBox: TFresnelRect read FRenderedBorderBox write FRenderedBorderBox; // relative to layout parent
     property CSSRenderedAttribute[Attr: TFresnelCSSAttribute]: string read GetCSSRenderedAttribute write SetCSSRenderedAttribute;
+    // Events
+    Procedure AddEventListener(aID : TEventID; aHandler : TFresnelEventHandler);
+    Procedure AddEventListener(Const aName: TEventName; aHandler : TFresnelEventHandler);
     // font
     property Font: IFresnelFont read GetFont write FFont;
     // Events
@@ -2611,6 +2612,27 @@ begin
     FCSSRendered[Attr]:=FCSSComputed[Attr];
 end;
 
+function TFresnelElement.GetBoundingClientRect: TFresnelRect;
+var
+  Box: TFresnelRect;
+  aPaddingLeft, aPaddingTop, aLeft, aTop: TFresnelLength;
+begin
+  Result:=RenderedBorderBox;
+  if Parent<>nil then
+  begin
+    Box:=Parent.GetBoundingClientRect;
+    aPaddingLeft:=Parent.GetRenderedCSSLength(fcaPaddingLeft,false);
+    aPaddingTop:=Parent.GetRenderedCSSLength(fcaPaddingTop,false);
+    debugln(['TFresnelElement.GetBoundingClientRect ',Name,' RenderedBorderBox=',Result.Left,',',Result.Top,',',Result.Right,',',Result.Bottom,' Parent=',Parent.Name,' ',Box.Left,',',Box.Top,' Pad=',aPaddingLeft,',',aPaddingTop]);
+    aLeft:=Box.Left+aPaddingLeft;
+    aTop:=Box.Top+aPaddingTop;
+    Result.Left:=Result.Left+aLeft;
+    Result.Top:=Result.Top+aTop;
+    Result.Right:=Result.Right+aLeft;
+    Result.Bottom:=Result.Bottom+aTop;
+  end;
+end;
+
 function TFresnelElement.GetRenderedCSSLength(Attr: TFresnelCSSAttribute;
   UseInherited: boolean; UseNaNOnFail: boolean): TFresnelLength;
 var