Browse Source

fresnel: parse scrollbar-color,gutter,width

mattias 5 months ago
parent
commit
33e56fd75c
3 changed files with 117 additions and 3 deletions
  1. 112 3
      src/base/fresnel.dom.pas
  2. 1 0
      src/base/fresnel.forms.pas
  3. 4 0
      src/base/fresnel.resources.pas

+ 112 - 3
src/base/fresnel.dom.pas

@@ -146,6 +146,9 @@ type
     fcaBackground, // shorthand for background-[attachment,clip,color,image,origin,position,repeat,size]
     fcaBackground, // shorthand for background-[attachment,clip,color,image,origin,position,repeat,size]
     fcaColor,     // text color
     fcaColor,     // text color
     fcaCursor,
     fcaCursor,
+    fcaScrollbarColor,
+    fcaScrollbarGutter,
+    fcaScrollbarWidth,
     fcaFlexBasis,
     fcaFlexBasis,
     fcaFlexDirection,
     fcaFlexDirection,
     fcaFlexGrow,
     fcaFlexGrow,
@@ -268,6 +271,9 @@ const
     'background',
     'background',
     'color',
     'color',
     'cursor',
     'cursor',
+    'scrollbar-color',
+    'scrollbar-gutter',
+    'scrollbar-width',
     'flex-basis',
     'flex-basis',
     'flex-direction',
     'flex-direction',
     'flex-grow',
     'flex-grow',
@@ -568,6 +574,9 @@ type
     function CheckBackgroundSize(Resolver: TCSSBaseResolver): boolean; virtual;
     function CheckBackgroundSize(Resolver: TCSSBaseResolver): boolean; virtual;
     function CheckBackground(Resolver: TCSSBaseResolver): boolean; virtual;
     function CheckBackground(Resolver: TCSSBaseResolver): boolean; virtual;
     function CheckCursor(Resolver: TCSSBaseResolver): boolean; virtual;
     function CheckCursor(Resolver: TCSSBaseResolver): boolean; virtual;
+    function CheckScrollbarColor(Resolver: TCSSBaseResolver): boolean; virtual;
+    function CheckScrollbarGutter(Resolver: TCSSBaseResolver): boolean; virtual;
+    function CheckScrollbarWidth(Resolver: TCSSBaseResolver): boolean; virtual;
     function CheckFlexBasis(Resolver: TCSSBaseResolver): boolean; virtual;
     function CheckFlexBasis(Resolver: TCSSBaseResolver): boolean; virtual;
     function CheckFlexDirection(Resolver: TCSSBaseResolver): boolean; virtual;
     function CheckFlexDirection(Resolver: TCSSBaseResolver): boolean; virtual;
     function CheckFlexGrow(Resolver: TCSSBaseResolver): boolean; virtual;
     function CheckFlexGrow(Resolver: TCSSBaseResolver): boolean; virtual;
@@ -723,7 +732,8 @@ type
       kwBorderBox = kwBolder+1; // border-box
       kwBorderBox = kwBolder+1; // border-box
       kwBoth = kwBorderBox+1;
       kwBoth = kwBorderBox+1;
       kwBothBlock = kwBoth+1; // both-block
       kwBothBlock = kwBoth+1; // both-block
-      kwBothInline = kwBothBlock+1; // both-inline
+      kwBothEdges = kwBothBlock+1; // both-edges
+      kwBothInline = kwBothEdges+1; // both-inline
       kwBottom = kwBothInline+1;
       kwBottom = kwBothInline+1;
       kwCaption = kwBottom+1;
       kwCaption = kwBottom+1;
       kwCell = kwCaption+1;
       kwCell = kwCaption+1;
@@ -862,7 +872,8 @@ type
       kwSpaceBetween = kwSpaceAround+1; // space-between
       kwSpaceBetween = kwSpaceAround+1; // space-between
       kwSpaceEvenly = kwSpaceBetween+1; // space-evenly
       kwSpaceEvenly = kwSpaceBetween+1; // space-evenly
       kwSResize = kwSpaceEvenly+1; // s-resize
       kwSResize = kwSpaceEvenly+1; // s-resize
-      kwStackedFractions = kwSResize+1;
+      kwStable = kwSResize+1;
+      kwStackedFractions = kwStable+1;
       kwStart = kwStackedFractions+1;
       kwStart = kwStackedFractions+1;
       kwStatic = kwStart+1;
       kwStatic = kwStart+1;
       kwStatusBar = kwStatic+1; // status-bar
       kwStatusBar = kwStatic+1; // status-bar
@@ -1007,6 +1018,7 @@ type
     Chk_BackgroundRepeat_KeywordIDs: TCSSNumericalIDArray;
     Chk_BackgroundRepeat_KeywordIDs: TCSSNumericalIDArray;
     Chk_BackgroundSize_Dim: TCSSCheckAttrParams_Dimension;
     Chk_BackgroundSize_Dim: TCSSCheckAttrParams_Dimension;
     Chk_Cursor_KeywordIDs: TCSSNumericalIDArray;
     Chk_Cursor_KeywordIDs: TCSSNumericalIDArray;
+    Chk_ScrollbarWidth_KeywordIDs: TCSSNumericalIDArray;
     Chk_FlexBasis_Dim: TCSSCheckAttrParams_Dimension;
     Chk_FlexBasis_Dim: TCSSCheckAttrParams_Dimension;
     Chk_FlexDirection_KeywordIDs: TCSSNumericalIDArray;
     Chk_FlexDirection_KeywordIDs: TCSSNumericalIDArray;
     Chk_FlexGrow_Dim: TCSSCheckAttrParams_Dimension;
     Chk_FlexGrow_Dim: TCSSCheckAttrParams_Dimension;
@@ -2712,6 +2724,85 @@ begin
   Result:=Resolver.CheckAttribute_Keyword(Chk_Cursor_KeywordIDs);
   Result:=Resolver.CheckAttribute_Keyword(Chk_Cursor_KeywordIDs);
 end;
 end;
 
 
+function TFresnelCSSRegistry.CheckScrollbarColor(Resolver: TCSSBaseResolver): boolean;
+var
+  i: Integer;
+begin
+  Result:=false;
+  // check for 'auto'
+  if (Resolver.CurComp.Kind=rvkKeyword)
+      and (Resolver.CurComp.KeywordID=kwAuto) then
+  begin
+    Resolver.ReadNext;
+    Result:=Resolver.CurComp.Kind=rvkNone;
+    exit;
+  end;
+  // check for two colors
+  for i:=1 to 2 do
+  begin
+    if IsColor(Resolver.CurComp) then
+      // ok
+    else if (Resolver.CurComp.Kind=rvkFunction) and (Resolver.CurComp.FunctionID=afVar) then
+      // ignore here
+      exit(true)
+    else
+      exit; // todo warn
+  end;
+  Result:=Resolver.CurComp.Kind=rvkNone;
+end;
+
+function TFresnelCSSRegistry.CheckScrollbarGutter(Resolver: TCSSBaseResolver): boolean;
+var
+  KW: TCSSNumericalID;
+  HasStable, HasBothEdges: Boolean;
+begin
+  Result:=false;
+  HasStable:=false;
+  HasBothEdges:=false;
+  repeat
+    case Resolver.CurComp.Kind of
+    rvkKeyword:
+      begin
+        KW:=Resolver.CurComp.KeywordID;
+        case KW of
+        kwAuto:
+          begin
+            if HasStable or HasBothEdges then exit(false);
+            Resolver.ReadNext;
+            Result:=Resolver.CurComp.Kind=rvkNone;
+            exit;
+          end;
+        kwStable:
+          if HasStable then
+            exit // todo warn
+          else
+            HasStable:=true;
+        kwBothEdges:
+          if HasBothEdges then
+            exit // todo warn
+          else
+            HasBothEdges:=true;
+        end;
+      end;
+    rvkFunction:
+      if Resolver.CurComp.FunctionID=afVar then
+        exit(true)
+      else
+        // todo warn
+        exit(false);
+    else
+      // todo warn
+      exit(false);
+    end;
+  until not Resolver.ReadNext;
+  Result:=Resolver.CurComp.Kind=rvkNone;
+end;
+
+function TFresnelCSSRegistry.CheckScrollbarWidth(Resolver: TCSSBaseResolver): boolean;
+begin
+  Result:=Resolver.CheckAttribute_Keyword(Chk_ScrollbarWidth_KeywordIDs);
+end;
+
 function TFresnelCSSRegistry.CheckFlexBasis(Resolver: TCSSBaseResolver): boolean;
 function TFresnelCSSRegistry.CheckFlexBasis(Resolver: TCSSBaseResolver): boolean;
 begin
 begin
   Result:=Resolver.CheckAttribute_Dimension(Chk_FlexBasis_Dim);
   Result:=Resolver.CheckAttribute_Dimension(Chk_FlexBasis_Dim);
@@ -5445,6 +5536,7 @@ begin
   AddKW(kwBorderBox,'border-box'); // e.g. box-sizing
   AddKW(kwBorderBox,'border-box'); // e.g. box-sizing
   AddKW(kwBoth,'both'); // e.g. clear
   AddKW(kwBoth,'both'); // e.g. clear
   AddKW(kwBothBlock,'both-block'); // e.g. clear
   AddKW(kwBothBlock,'both-block'); // e.g. clear
+  AddKW(kwBothEdges,'both-edges'); // e.g. scrollbar-gutter
   AddKW(kwBothInline,'both-inline'); // e.g. clear
   AddKW(kwBothInline,'both-inline'); // e.g. clear
   AddKW(kwBottom,'bottom'); // e.g. clear
   AddKW(kwBottom,'bottom'); // e.g. clear
   AddKW(kwCaption,'caption'); // e.g. font
   AddKW(kwCaption,'caption'); // e.g. font
@@ -5584,6 +5676,7 @@ begin
   AddKW(kwSpaceBetween,'space-between'); // e.g. justify-content
   AddKW(kwSpaceBetween,'space-between'); // e.g. justify-content
   AddKW(kwSpaceEvenly,'space-evenly'); // e.g. justify-content
   AddKW(kwSpaceEvenly,'space-evenly'); // e.g. justify-content
   AddKW(kwSResize,'s-resize'); // e.g. cursor
   AddKW(kwSResize,'s-resize'); // e.g. cursor
+  AddKW(kwStable,'stable'); // e.g. scrollbar-gutter
   AddKW(kwStackedFractions,'stacked-fractions'); // e.g. font-variant-numeric
   AddKW(kwStackedFractions,'stacked-fractions'); // e.g. font-variant-numeric
   AddKW(kwStart,'start'); // e.g. justify-content
   AddKW(kwStart,'start'); // e.g. justify-content
   AddKW(kwStatic,'static'); // e.g. position
   AddKW(kwStatic,'static'); // e.g. position
@@ -5978,6 +6071,14 @@ begin
     kwSEResize,kwSWResize,kwWResize,kwEWResize,kwNSResize,kwNESWResize,kwNWSEResize,
     kwSEResize,kwSWResize,kwWResize,kwEWResize,kwNSResize,kwNESWResize,kwNWSEResize,
     kwColResize,kwRowResize,kwAllScroll,kwZoomIn,kwZoomOut];
     kwColResize,kwRowResize,kwAllScroll,kwZoomIn,kwZoomOut];
 
 
+  // scrollbar-color
+  AddFresnelLonghand(fcaScrollbarColor,false,@CheckScrollbarColor,'auto');
+  // scrollbar-gutter
+  AddFresnelLonghand(fcaScrollbarGutter,false,@CheckScrollbarGutter,'auto');
+  // scrollbar-width
+  AddFresnelLonghand(fcaScrollbarWidth,false,@CheckScrollbarWidth,'auto');
+  Chk_ScrollbarWidth_KeywordIDs:=[kwAuto,kwThin,kwNone];
+
   // flex-basis
   // flex-basis
   AddFresnelLonghand(fcaFlexBasis,false,@CheckFlexBasis,'auto');
   AddFresnelLonghand(fcaFlexBasis,false,@CheckFlexBasis,'auto');
   Chk_FlexBasis_Dim.AllowedKeywordIDs:=[kwAuto,kwMaxContent,kwMinContent,kwFitContent,kwContent];
   Chk_FlexBasis_Dim.AllowedKeywordIDs:=[kwAuto,kwMaxContent,kwMinContent,kwFitContent,kwContent];
@@ -9258,9 +9359,17 @@ begin
     exit;
     exit;
   FComputedBoxSizing:=GetComputedKeyword(fcaBoxSizing,CSSRegistry.Chk_BoxSizing_KeywordIDs);
   FComputedBoxSizing:=GetComputedKeyword(fcaBoxSizing,CSSRegistry.Chk_BoxSizing_KeywordIDs);
   FComputedPosition:=GetComputedKeyword(fcaPosition,CSSRegistry.Chk_Position_KeywordIDs);
   FComputedPosition:=GetComputedKeyword(fcaPosition,CSSRegistry.Chk_Position_KeywordIDs);
+  FComputedFloat:=GetComputedKeyword(fcaFloat,CSSRegistry.Chk_Float_KeywordIDs);
+
+  // overflow
   FComputedOverflowX:=GetComputedKeyword(fcaOverflowX,CSSRegistry.Chk_OverflowXY_KeywordIDs);
   FComputedOverflowX:=GetComputedKeyword(fcaOverflowX,CSSRegistry.Chk_OverflowXY_KeywordIDs);
   FComputedOverflowY:=GetComputedKeyword(fcaOverflowY,CSSRegistry.Chk_OverflowXY_KeywordIDs);
   FComputedOverflowY:=GetComputedKeyword(fcaOverflowY,CSSRegistry.Chk_OverflowXY_KeywordIDs);
-  FComputedFloat:=GetComputedKeyword(fcaFloat,CSSRegistry.Chk_Float_KeywordIDs);
+  if (FComputedOverflowY=CSSRegistry.kwVisible)
+      and (FComputedOverflowX in [CSSRegistry.kwHidden,CSSRegistry.kwScroll,CSSRegistry.kwAuto]) then
+    FComputedOverflowY:=CSSRegistry.kwAuto;
+  if (FComputedOverflowX=CSSRegistry.kwVisible)
+      and (FComputedOverflowY in [CSSRegistry.kwHidden,CSSRegistry.kwScroll,CSSRegistry.kwAuto]) then
+    FComputedOverflowX:=CSSRegistry.kwAuto;
 end;
 end;
 
 
 function TFresnelElement.ComputeAttribute(aDesc: TCSSAttributeDesc; var aValue: String
 function TFresnelElement.ComputeAttribute(aDesc: TCSSAttributeDesc; var aValue: String

+ 1 - 0
src/base/fresnel.forms.pas

@@ -140,6 +140,7 @@ type
     property Stylesheet;
     property Stylesheet;
     property OnCreate;
     property OnCreate;
     property OnDestroy;
     property OnDestroy;
+    property Visible;
   end;
   end;
   TFresnelFormClass = class of TFresnelForm;
   TFresnelFormClass = class of TFresnelForm;
 
 

+ 4 - 0
src/base/fresnel.resources.pas

@@ -17,6 +17,10 @@ unit Fresnel.Resources;
 
 
 {$mode objfpc}{$H+}
 {$mode objfpc}{$H+}
 
 
+{$IF FPC_FULLVERSION>=30301}
+  {$WARN 6060 off : case does not contain all statements }
+{$ENDIF}
+
 interface
 interface
 
 
 uses
 uses