Browse Source

Add BCLeaBoard, update themes and themes builder.

Boban Spasic 1 year ago
parent
commit
d70ce71970

+ 411 - 0
bcleaboard.pas

@@ -0,0 +1,411 @@
+unit BCLeaBoard;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, LResources, Controls, Graphics,
+  BGRABitmapTypes, BGRABitmap, BGRAGradients, BCLeaTheme, BCLeaTypes;
+
+type
+  TBCLeaBoard = class(TCustomControl)
+  private
+    FBitmap: TBGRABitmap;
+    FTheme: TBCLeaTheme;
+    FFrameColor: TColor;
+    FBoardColor: TColor;
+    FBkgColor: TColor;
+    FFrameStyle: TZStyle;
+    FBoardStyle: TZStyle;
+    FAltitude: integer;
+    FRounding: integer;
+    FFrameHeight: integer;
+    FFrameDistance: integer;
+    //global intensity of the light
+    FLightSourceIntensity: single;
+    //minimum distance always added (positive value)
+    FLightSourceDistanceTerm: single;
+    //how much actual distance is taken into account (usually 0 or 1)
+    FLightSourceDistanceFactor: single;
+    //how much the location of the lightened pixel is taken into account (usually 0 or 1)
+    FLightDestFactor: single;
+    //color of the light reflection
+    FLightColor: TColor;
+    //how much light is reflected (0..1)
+    FSpecularFactor: single;
+    //how concentrated reflected light is (positive value)
+    FSpecularIndex: single;
+    //ambiant lighting whereever the point is (0..1)
+    FAmbientFactor: single;
+    //diffusion, i.e. how much pixels are lightened by light source (0..1)
+    FDiffusionFactor: single;
+    //how much hidden surface are darkened (0..1)
+    FNegativeDiffusionFactor: single;
+    //when diffusion saturates, use light color to show it
+    FDiffuseSaturation: boolean;
+    FLightPositionX: integer;
+    FLightPositionY: integer;
+    FLightPositionZ: integer;
+    procedure SetAltitude(AValue: integer);
+    procedure SetFrameColor(AValue: TColor);
+    procedure SetBoardColor(AValue: TColor);
+    procedure SetBkgColor(AValue: TColor);
+    procedure SetFrameStyle(AValue: TZStyle);
+    procedure SetBoardStyle(AValue: TZStyle);
+    procedure SetTheme(AValue: TBCLeaTheme);
+    procedure SetRounding(AValue: integer);
+    procedure SetFrameHeight(AValue: integer);
+    procedure SetFrameDistance(AValue: integer);
+  protected
+    procedure SetEnabled(Value: boolean); override;
+    procedure SetVisible(Value: boolean); override;
+    procedure Paint; override;
+    procedure Redraw;
+  public
+    constructor Create(AOwner: TComponent); override;
+    destructor Destroy; override;
+    procedure UpdateTheme;
+    procedure ApplyTheme;
+    procedure SaveThemeToFile(AFileName: string);
+    procedure LoadThemeFromFile(AFileName: string);
+    procedure ApplyDefaultTheme;
+  published
+    property Align;
+    property Cursor;
+    property Enabled;
+    property Font;
+    property PopupMenu;
+    property ShowHint;
+    property TabOrder;
+    property TabStop default True;
+    property Anchors;
+    property Constraints;
+    property Visible;
+    property OnClick;
+    property OnDblClick;
+    property OnEnter;
+    property OnExit;
+    property OnContextPopup;
+    property FrameColor: TColor read FFrameColor write SetFrameColor default clBtnFace;
+    property BoardColor: TColor read FBoardColor write SetBoardColor default clBtnFace;
+    property BackgroundColor: TColor read FBkgColor write SetBkgColor default clWhite;
+    property FrameStyle: TZStyle read FFrameStyle write SetFrameStyle default zsRaised;
+    property BoardStyle: TZStyle read FBoardStyle write SetBoardStyle default zsFlat;
+    property Theme: TBCLeaTheme read FTheme write SetTheme;
+    property Altitude: integer read FAltitude write SetAltitude default 2;
+    property Rounding: integer read FRounding write SetRounding default 10;
+    property FrameHeight: integer read FFrameHeight write SetFrameHeight default 10;
+    property FrameDistance: integer read FFrameDistance write SetFrameDistance default 3;
+  end;
+
+procedure Register;
+
+implementation
+
+procedure Register;
+begin
+  RegisterComponents('BGRA Controls', [TBCLeaBoard]);
+end;
+
+constructor TBCLeaBoard.Create(AOwner: TComponent);
+begin
+  inherited Create(AOwner);
+  with GetControlClassDefaultSize do
+    SetInitialBounds(0, 0, 200, 150);
+  ControlStyle := [csAcceptsControls, csReplicatable, csClickEvents];
+  FBitmap := TBGRABitmap.Create(Width, Height, FBkgColor);
+  ApplyDefaultTheme;
+end;
+
+destructor TBCLeaBoard.Destroy;
+begin
+  FreeAndNil(FBitmap);
+  inherited Destroy;
+end;
+
+procedure TBCLeaBoard.SetEnabled(Value: boolean);
+begin
+  inherited SetEnabled(Value);
+  Invalidate;
+end;
+
+procedure TBCLeaBoard.SetVisible(Value: boolean);
+begin
+  inherited SetVisible(Value);
+  Invalidate;
+end;
+
+procedure TBCLeaBoard.Paint;
+begin
+  inherited Paint;
+  Redraw;
+end;
+
+procedure TBCLeaBoard.SetFrameStyle(AValue: TZStyle);
+begin
+  if FFrameStyle = AValue then
+    Exit;
+  FFrameStyle := AValue;
+  Invalidate;
+end;
+
+procedure TBCLeaBoard.SetBoardStyle(AValue: TZStyle);
+begin
+  if FBoardStyle = AValue then
+    Exit;
+  FBoardStyle := AValue;
+  Invalidate;
+end;
+
+procedure TBCLeaBoard.SetFrameColor(AValue: TColor);
+begin
+  if FFrameColor = AValue then
+    Exit;
+  FFrameColor := AValue;
+  Invalidate;
+end;
+
+procedure TBCLeaBoard.SetBoardColor(AValue: TColor);
+begin
+  if FBoardColor = AValue then
+    Exit;
+  FBoardColor := AValue;
+  Invalidate;
+end;
+
+procedure TBCLeaBoard.SetBkgColor(AValue: TColor);
+begin
+  if FBkgColor = AValue then
+    Exit;
+  FBkgColor := AValue;
+  Invalidate;
+end;
+
+procedure TBCLeaBoard.SetAltitude(AValue: integer);
+begin
+  if FAltitude = AValue then
+    Exit;
+  FAltitude := AValue;
+  Invalidate;
+end;
+
+procedure TBCLeaBoard.SetRounding(AValue: integer);
+begin
+  if FRounding = AValue then
+    Exit;
+  FRounding := AValue;
+  Invalidate;
+end;
+
+procedure TBCLeaBoard.SetTheme(AValue: TBCLeaTheme);
+begin
+  if FTheme = AValue then
+    Exit;
+  FTheme := AValue;
+  Invalidate;
+end;
+
+procedure TBCLeaBoard.SetFrameDistance(AValue: integer);
+begin
+  if FFrameDistance = AValue then
+    Exit;
+  FFrameDistance := AValue;
+  Invalidate;
+end;
+
+procedure TBCLeaBoard.SetFrameHeight(AValue: integer);
+begin
+  if FFrameHeight = AValue then
+    Exit;
+  FFrameHeight := AValue;
+  Invalidate;
+end;
+
+procedure TBCLeaBoard.ApplyDefaultTheme;
+begin
+  FFrameColor := clBtnFace;
+  FBoardColor := clBtnFace;
+  FBkgColor := clBtnFace;
+  FFrameStyle := zsRaised;
+  FBoardStyle := zsFlat;
+  FFrameHeight := 10;
+  FFrameDistance := 3;
+  FAltitude := 2;
+  FRounding := 10;
+  FAmbientFactor := 0.3;
+  FSpecularIndex := 10;
+  FSpecularFactor := 0.6;
+  FLightDestFactor := 1;
+  FLightPositionX := -100;
+  FLightPositionY := -100;
+  FLightPositionZ := 100;
+  FLightSourceIntensity := 500;
+  FLightSourceDistanceTerm := 150;
+  FLightSourceDistanceFactor := 1;
+  FNegativeDiffusionFactor := 0.1;
+  FLightColor := clWhite;
+  FDiffuseSaturation := False;
+  FDiffusionFactor := 0.9;
+end;
+
+procedure TBCLeaBoard.UpdateTheme;
+begin
+  if Assigned(FTheme) then
+  begin
+    FTheme.BRD_FrameColor := FFrameColor;
+    FTheme.BRD_BoardColor := FBoardColor;
+    FTheme.BRD_BkgColor := FBkgColor;
+    FTheme.BRD_FrameStyle := FFrameStyle;
+    FTheme.BRD_BoardStyle := FBoardStyle;
+    FTheme.BRD_FrameHeight := FFrameHeight;
+    FTheme.BRD_FrameDistance := FFrameDistance;
+    FTheme.BRD_Altitude := FAltitude;
+    FTheme.BRD_Rounding := FRounding;
+  end;
+end;
+
+procedure TBCLeaBoard.ApplyTheme;
+begin
+  if Assigned(FTheme) then
+  begin
+    FFrameColor := FTheme.BRD_FrameColor;
+    FBoardColor := FTheme.BRD_BoardColor;
+    FBkgColor := FTheme.BRD_BkgColor;
+    FFrameStyle := FTheme.BRD_FrameStyle;
+    FBoardStyle := FTheme.BRD_BoardStyle;
+    FFrameHeight := FTheme.BRD_FrameHeight;
+    FFrameDistance := FTheme.BRD_FrameDistance;
+    FAltitude := FTheme.BRD_Altitude;
+    FRounding := FTheme.BRD_Rounding;
+    FLightSourceIntensity := FTheme.COM_LightSourceIntensity;
+    FLightSourceDistanceTerm := FTheme.COM_LightSourceDistanceTerm;
+    FLightSourceDistanceFactor := FTheme.COM_LightSourceDistanceFactor;
+    FLightDestFactor := FTheme.COM_LightDestFactor;
+    FLightColor := FTheme.COM_LightColor;
+    FSpecularFactor := FTheme.COM_SpecularFactor;
+    FSpecularIndex := FTheme.COM_SpecularIndex;
+    FAmbientFactor := FTheme.COM_AmbientFactor;
+    FDiffusionFactor := FTheme.COM_DiffusionFactor;
+    FNegativeDiffusionFactor := FTheme.COM_NegativeDiffusionFactor;
+    FDiffuseSaturation := FTheme.COM_DiffuseSaturation;
+    FLightPositionX := FTheme.COM_LightPositionX;
+    FLightPositionY := FTheme.COM_LightPositionY;
+    FLightPositionZ := FTheme.COM_LightPositionZ;
+    Invalidate;
+  end
+  else
+  begin
+    ApplyDefaultTheme;
+  end;
+end;
+
+procedure TBCLeaBoard.SaveThemeToFile(AFileName: string);
+begin
+  if Assigned(FTheme) then
+    FTheme.SaveThemeToFile(AFileName);
+end;
+
+procedure TBCLeaBoard.LoadThemeFromFile(AFileName: string);
+begin
+  if Assigned(FTheme) then
+    FTheme.LoadThemeFromFile(AFileName);
+end;
+
+procedure TBCLeaBoard.Redraw;
+var
+  EffectiveSize: integer;
+  Blur: TBGRABitmap;
+  Mask, TmpBitmap: TBGRABitmap;
+  Phong: TPhongShading;
+  ScaledPhongSize{, ScaledSize}: integer;
+
+  procedure DoDrawFrame(AFrameColor, ABoardColor: TColor);
+  var
+    d: integer;
+  begin
+    d := FFrameDistance;
+    FBitmap.FillRoundRectAntialias(d, d, Width - d, Height - d, FRounding, FRounding, AFrameColor);
+
+    d := FFrameDistance + FFrameHeight + FAltitude;
+    FBitmap.FillRoundRectAntialias(d, d, Width - d, Height - d, FRounding, FRounding, ABoardColor);
+
+    if (FFrameStyle = zsRaised) or (FFrameStyle = zsLowered) then
+    begin
+      Mask := FBitmap.FilterGrayscale as TBGRABitmap;
+      if (FFrameStyle = zsRaised) then
+        Mask.Negative;
+      Blur := Mask.FilterBlurRadial(ScaledPhongSize, ScaledPhongSize, rbFast) as TBGRABitmap;
+      Blur.FillMask(0, 0, Mask, BGRAPixelTransparent, dmSet);
+      Mask.Free;
+
+      Phong := TPhongShading.Create;
+      if assigned(FTheme) then
+      begin
+        Phong.AmbientFactor := FAmbientFactor;
+        Phong.SpecularIndex := FSpecularIndex;
+        Phong.LightDestFactor := FLightDestFactor;
+        Phong.LightPosition := Point(FLightPositionX, FLightPositionY);
+        Phong.LightPositionZ := FLightPositionZ;
+        Phong.LightSourceIntensity := FLightSourceIntensity;
+        Phong.LightSourceDistanceTerm := FLightSourceDistanceTerm;
+        Phong.LightSourceDistanceFactor := FLightSourceDistanceFactor;
+        Phong.NegativeDiffusionFactor := FNegativeDiffusionFactor;
+        Phong.SpecularFactor := FSpecularFactor;
+        Phong.DiffusionFactor := FDiffusionFactor;
+        Phong.DiffuseSaturation := FDiffuseSaturation;
+        Phong.LightColor := FLightColor;
+      end;
+      Mask := TBGRABitmap.Create(Width, Height, ColorToBGRA(ColorToRGB(BGRABlack)));
+      d := FFrameDistance;
+      Mask.FillRoundRectAntialias(d, d, Width - d, Height - d, FRounding, FRounding, BGRAWhite);
+      d := FFrameDistance + FFrameHeight + FAltitude;
+      FBitmap.FillRoundRectAntialias(d, d, Width - d, Height - d, FRounding, FRounding, BGRABlack);
+      TmpBitmap := TBGRABitmap.Create(Width, Height, ColorToBGRA(ColorToRGB(BGRABlack)));
+      Phong.Draw(TmpBitmap, Blur, FAltitude, 0, 0, FBitmap);
+      Phong.Free;
+      Blur.Free;
+      TmpBitmap.ApplyMask(Mask);
+      FBitmap.PutImage(0,0,TmpBitmap, dmDrawWithTransparency);
+      TmpBitmap.Free;
+      Mask.Free;
+    end;
+  end;
+
+  procedure DoDrawBoard(AValue: TColor);
+  var
+    d: integer;
+  begin
+    d := FFrameDistance + FFrameHeight + FAltitude;
+    FBitmap.FillRoundRectAntialias(d, d, Width - d, Height - d, FRounding, FRounding, AValue);
+  end;
+
+begin
+  FBitmap.SetSize(Width, Height);
+  FBitmap.Fill(FBkgColor);
+
+  if Width < Height then
+    EffectiveSize := Width
+  else
+    EffectiveSize := Height;
+  if EffectiveSize < 2 then exit;
+  //ScaledSize := Scale96ToForm(FSize);
+  ScaledPhongSize := Scale96ToForm(5);
+
+  if Enabled then
+  begin
+    DoDrawFrame(FFrameColor, FBoardColor);
+    if FBoardStyle = zsFlat then
+      DoDrawBoard(FBoardColor);
+  end
+  else
+  begin
+    DoDrawFrame(clDkGray, clGray);
+    if FBoardStyle = zsFlat then
+      DoDrawBoard(clGray);
+  end;
+
+  FBitmap.Draw(Canvas, 0, 0, True);
+end;
+
+end.

+ 2 - 2
bclealcddisplay.pas

@@ -901,8 +901,8 @@ begin
             if DotOn then
             if DotOn then
               DrawChar(y + 8 * i, x, c);
               DrawChar(y + 8 * i, x, c);
           end; // for x
           end; // for x
-        end;  // for y
-      end;  // for ch
+        end; // for y
+      end; // for ch
     end;
     end;
   end;
   end;
 end;
 end;

+ 2 - 6
bcleaselector.pas

@@ -355,13 +355,8 @@ var
   begin
   begin
     FBitmap.Canvas2D.lineCapLCL := pecFlat;
     FBitmap.Canvas2D.lineCapLCL := pecFlat;
     FBitmap.Canvas2D.strokeStyle(c);
     FBitmap.Canvas2D.strokeStyle(c);
-    //FBitmap.Canvas2D.lineWidth := 5;
     FBitmap.Canvas2D.beginPath;
     FBitmap.Canvas2D.beginPath;
     FBitmap.Canvas2D.arc(0, 0, r, a, b, False);
     FBitmap.Canvas2D.arc(0, 0, r, a, b, False);
-    {FBitmap.Canvas2D.lineTo(0 - a, 0 - b);
-    FBitmap.Canvas2D.lineTo(5 - a, -2 - b);
-    FBitmap.Canvas2D.lineTo(5 - a, 2 - b);
-    FBitmap.Canvas2D.lineTo(0 - a, 0 - b); }
     FBitmap.Canvas2D.stroke;
     FBitmap.Canvas2D.stroke;
   end;
   end;
 
 
@@ -401,7 +396,6 @@ begin
 
 
   if FDrawTicks then
   if FDrawTicks then
   begin
   begin
-    //DoDrawTicks(-(FBitmap.Width / 2 - 5), 0, clBlack);
     for i := 0 to FTicksCount - 1 do
     for i := 0 to FTicksCount - 1 do
     begin
     begin
       RAngle := (RMaxTicksAngle / (FTicksCount - 1 + FOffset)) * ((i + FOffset) - ((FTicksCount - 1 + FOffset) / 2));
       RAngle := (RMaxTicksAngle / (FTicksCount - 1 + FOffset)) * ((i + FOffset) - ((FTicksCount - 1 + FOffset) / 2));
@@ -420,6 +414,7 @@ begin
 
 
   if FDrawText and FDrawTextPhong then
   if FDrawText and FDrawTextPhong then
   begin
   begin
+    //draw text before we apply phong
     if FItems.Count >= FValue then
     if FItems.Count >= FValue then
       TextStr := FItems[FValue]
       TextStr := FItems[FValue]
     else
     else
@@ -462,6 +457,7 @@ begin
     Phong.Free;
     Phong.Free;
     Blur.Free;
     Blur.Free;
 
 
+    //cut out phong-affected area outside the ring and fill with background color
     Mask := TBGRABitmap.Create(EffectiveSize, EffectiveSize, BGRABlack);
     Mask := TBGRABitmap.Create(EffectiveSize, EffectiveSize, BGRABlack);
     Mask.FillEllipseAntialias(EffectiveSize div 2, EffectiveSize div 2, EffectiveSize div 2, EffectiveSize div 2, BGRAWhite);
     Mask.FillEllipseAntialias(EffectiveSize div 2, EffectiveSize div 2, EffectiveSize div 2, EffectiveSize div 2, BGRAWhite);
     Mask2 := TBGRABitmap.Create(EffectiveSize, EffectiveSize, ColorToBGRA(ColorToRGB(FBkgColor)));
     Mask2 := TBGRABitmap.Create(EffectiveSize, EffectiveSize, ColorToBGRA(ColorToRGB(FBkgColor)));

+ 295 - 4
bcleatheme.pas

@@ -117,6 +117,19 @@ type
     FAltitude: integer;
     FAltitude: integer;
   end;
   end;
 
 
+  TBCLeaThemeBoard = class(TPersistent)
+  public
+    FFrameColor: TColor;
+    FBoardColor: TColor;
+    FBkgColor: TColor;
+    FFrameStyle: TZStyle;
+    FBoardStyle: TZStyle;
+    FFrameHeight: integer;
+    FFrameDistance: integer;
+    FAltitude: integer;
+    FRounding: integer;
+  end;
+
   TBCLeaTheme = class(TComponent)
   TBCLeaTheme = class(TComponent)
   private
   private
     FThemeSetCommon: TBCLeaThemeCommon;
     FThemeSetCommon: TBCLeaThemeCommon;
@@ -125,6 +138,7 @@ type
     FThemeSetSelector: TBCLeaThemeSelector;
     FThemeSetSelector: TBCLeaThemeSelector;
     FThemeSetRingSlider: TBCLeaThemeRingSlider;
     FThemeSetRingSlider: TBCLeaThemeRingSlider;
     FThemeSetQLED: TBCLeaThemeQLED;
     FThemeSetQLED: TBCLeaThemeQLED;
+    FThemeSetBoard: TBCLeaThemeBoard;
     FOnChange: TNotifyEvent;
     FOnChange: TNotifyEvent;
     procedure DoChange;
     procedure DoChange;
     //Common
     //Common
@@ -156,7 +170,7 @@ type
     function GetLightPositionX: integer;
     function GetLightPositionX: integer;
     function GetLightPositionY: integer;
     function GetLightPositionY: integer;
     function GetLightPositionZ: integer;
     function GetLightPositionZ: integer;
-    //BLCDDisplay
+    //BCLeaLCDDisplay
     procedure SetBLCDFrameColor(const AValue: TColor);
     procedure SetBLCDFrameColor(const AValue: TColor);
     procedure SetBLCDBoardColor(const AValue: TColor);
     procedure SetBLCDBoardColor(const AValue: TColor);
     procedure SetBLCDDotColorOn(const AValue: TColor);
     procedure SetBLCDDotColorOn(const AValue: TColor);
@@ -215,7 +229,7 @@ type
     function GetBCLeaQLEDSize: integer;
     function GetBCLeaQLEDSize: integer;
     function GetBCLeaQLEDAltitude: integer;
     function GetBCLeaQLEDAltitude: integer;
     function GetBCLeaQLEDRounding: integer;
     function GetBCLeaQLEDRounding: integer;
-    //BSelector
+    //BCLeaSelector
     procedure SetBSELLineColor(AValue: TColor);
     procedure SetBSELLineColor(AValue: TColor);
     procedure SetBSELLineBkgColor(AValue: TColor);
     procedure SetBSELLineBkgColor(AValue: TColor);
     procedure SetBSELLineWidth(AValue: integer);
     procedure SetBSELLineWidth(AValue: integer);
@@ -240,7 +254,7 @@ type
     function GetBSELStyle: TZStyle;
     function GetBSELStyle: TZStyle;
     function GetBSELDrawTextPhong: boolean;
     function GetBSELDrawTextPhong: boolean;
     function GetBSELAltitude: integer;
     function GetBSELAltitude: integer;
-    //BRingSlider
+    //BCLeaRingSlider
     procedure SetBRSLineColor(AValue: TColor);
     procedure SetBRSLineColor(AValue: TColor);
     procedure SetBRSLineBkgColor(AValue: TColor);
     procedure SetBRSLineBkgColor(AValue: TColor);
     procedure SetBRSLineWidth(AValue: integer);
     procedure SetBRSLineWidth(AValue: integer);
@@ -267,9 +281,29 @@ type
     function GetBRSStyle: TZStyle;
     function GetBRSStyle: TZStyle;
     function GetBRSDrawTextPhong: boolean;
     function GetBRSDrawTextPhong: boolean;
     function GetBRSAltitude: integer;
     function GetBRSAltitude: integer;
+    //BCLeaBoard
+    procedure SetBRDFrameColor(AValue: TColor);
+    procedure SetBRDBoardColor(AValue: TColor);
+    procedure SetBRDBkgColor(AValue: TColor);
+    procedure SetBRDFrameStyle(AValue: TZStyle);
+    procedure SetBRDBoardStyle(AValue: TZStyle);
+    procedure SetBRDFrameHeight(AValue: integer);
+    procedure SetBRDFrameDistance(AValue: integer);
+    procedure SetBRDAltitude(AValue: integer);
+    procedure SetBRDRounding(AValue: integer);
+    function GetBRDFrameColor: TColor;
+    function GetBRDBoardColor: TColor;
+    function GetBRDBkgColor: TColor;
+    function GetBRDFrameStyle: TZStyle;
+    function GetBRDBoardStyle: TZStyle;
+    function GetBRDFrameHeight: integer;
+    function GetBRDFrameDistance: integer;
+    function GetBRDAltitude: integer;
+    function GetBRDRounding: integer;
   protected
   protected
 
 
   public
   public
+    TestPanelColor: TColor;
     constructor Create(AOwner: TComponent); override;
     constructor Create(AOwner: TComponent); override;
     destructor Destroy; override;
     destructor Destroy; override;
     //load default theme
     //load default theme
@@ -348,6 +382,15 @@ type
     property RS_Style: TZStyle read GetBRSStyle write SetBRSStyle default zsRaised;
     property RS_Style: TZStyle read GetBRSStyle write SetBRSStyle default zsRaised;
     property RS_DrawTextPhong: boolean read GetBRSDrawTextPhong write SetBRSDrawTextPhong default False;
     property RS_DrawTextPhong: boolean read GetBRSDrawTextPhong write SetBRSDrawTextPhong default False;
     property RS_Altitude: integer read GetBRSAltitude write SetBRSAltitude default 2;
     property RS_Altitude: integer read GetBRSAltitude write SetBRSAltitude default 2;
+    property BRD_FrameColor: TColor read GetBRDFrameColor write SetBRDFrameColor default clBtnFace;
+    property BRD_BoardColor: TColor read GetBRDBoardColor write SetBRDBoardColor default clBtnFace;
+    property BRD_BkgColor: TColor read GetBRDBkgColor write SetBRDBkgColor default clBtnFace;
+    property BRD_FrameStyle: TZStyle read GetBRDFrameStyle write SetBRDFrameStyle default zsRaised;
+    property BRD_BoardStyle: TZStyle read GetBRDBoardStyle write SetBRDBoardStyle default zsFlat;
+    property BRD_FrameHeight: integer read GetBRDFrameHeight write SetBRDFrameHeight default 10;
+    property BRD_FrameDistance: integer read GetBRDFrameDistance write SetBRDFrameDistance default 3;
+    property BRD_Altitude: integer read GetBRDAltitude write SetBRDAltitude default 2;
+    property BRD_Rounding: integer read GetBRDRounding write SetBRDRounding default 10;
   end;
   end;
 
 
 procedure Register;
 procedure Register;
@@ -368,7 +411,9 @@ begin
   FThemeSetSelector := TBCLeaThemeSelector.Create;
   FThemeSetSelector := TBCLeaThemeSelector.Create;
   FThemeSetRingSlider := TBCLeaThemeRingSlider.Create;
   FThemeSetRingSlider := TBCLeaThemeRingSlider.Create;
   FThemeSetQLED := TBCLeaThemeQLED.Create;
   FThemeSetQLED := TBCLeaThemeQLED.Create;
+  FThemeSetBoard := TBCLeaThemeBoard.Create;
   Initialize;
   Initialize;
+  TestPanelColor := clBtnFace;
 end;
 end;
 
 
 destructor TBCLeaTheme.Destroy;
 destructor TBCLeaTheme.Destroy;
@@ -379,6 +424,7 @@ begin
   FreeAndNil(FThemeSetSelector);
   FreeAndNil(FThemeSetSelector);
   FreeAndNil(FThemeSetRingSlider);
   FreeAndNil(FThemeSetRingSlider);
   FreeAndNil(FThemeSetQLED);
   FreeAndNil(FThemeSetQLED);
+  FreeAndNil(FThemeSetBoard);
   inherited Destroy;
   inherited Destroy;
 end;
 end;
 
 
@@ -721,6 +767,52 @@ function TBCLeaTheme.GetBRSAltitude: integer;
 begin
 begin
   Result := FThemeSetRingSlider.FAltitude;
   Result := FThemeSetRingSlider.FAltitude;
 end;
 end;
+
+function TBCLeaTheme.GetBRDFrameColor: TColor;
+begin
+  Result := FThemeSetBoard.FFrameColor;
+end;
+
+function TBCLeaTheme.GetBRDBoardColor: TColor;
+begin
+  Result := FThemeSetBoard.FBoardColor;
+end;
+
+function TBCLeaTheme.GetBRDBkgColor: TColor;
+begin
+  Result := FThemeSetBoard.FBkgColor;
+end;
+
+function TBCLeaTheme.GetBRDFrameStyle: TZStyle;
+begin
+  Result := FThemeSetBoard.FFrameStyle;
+end;
+
+function TBCLeaTheme.GetBRDBoardStyle: TZStyle;
+begin
+  Result := FThemeSetBoard.FBoardStyle;
+end;
+
+function TBCLeaTheme.GetBRDFrameHeight: integer;
+begin
+  Result := FThemeSetBoard.FFrameHeight;
+end;
+
+function TBCLeaTheme.GetBRDFrameDistance: integer;
+begin
+  Result := FThemeSetBoard.FFrameDistance;
+end;
+
+function TBCLeaTheme.GetBRDAltitude: integer;
+begin
+  Result := FThemeSetBoard.FAltitude;
+end;
+
+function TBCLeaTheme.GetBRDRounding: integer;
+begin
+  Result := FThemeSetBoard.FRounding;
+end;
+
 //============================================================================
 //============================================================================
 procedure TBCLeaTheme.SetLightSourceIntensity(const AValue: single);
 procedure TBCLeaTheme.SetLightSourceIntensity(const AValue: single);
 begin
 begin
@@ -1260,6 +1352,78 @@ begin
   DoChange;
   DoChange;
 end;
 end;
 
 
+procedure TBCLeaTheme.SetBRDFrameColor(AValue: TColor);
+begin
+  if AValue = FThemeSetBoard.FFrameColor then
+    exit;
+  FThemeSetBoard.FFrameColor := AValue;
+  DoChange;
+end;
+
+procedure TBCLeaTheme.SetBRDBoardColor(AValue: TColor);
+begin
+  if AValue = FThemeSetBoard.FBoardColor then
+    exit;
+  FThemeSetBoard.FBoardColor := AValue;
+  DoChange;
+end;
+
+procedure TBCLeaTheme.SetBRDBkgColor(AValue: TColor);
+begin
+  if AValue = FThemeSetBoard.FBkgColor then
+    exit;
+  FThemeSetBoard.FBkgColor := AValue;
+  DoChange;
+end;
+
+procedure TBCLeaTheme.SetBRDFrameStyle(AValue: TZStyle);
+begin
+  if AValue = FThemeSetBoard.FFrameStyle then
+    exit;
+  FThemeSetBoard.FFrameStyle := AValue;
+  DoChange;
+end;
+
+procedure TBCLeaTheme.SetBRDBoardStyle(AValue: TZStyle);
+begin
+  if AValue = FThemeSetBoard.FBoardStyle then
+    exit;
+  FThemeSetBoard.FBoardStyle := AValue;
+  DoChange;
+end;
+
+procedure TBCLeaTheme.SetBRDFrameHeight(AValue: integer);
+begin
+  if AValue = FThemeSetBoard.FFrameHeight then
+    exit;
+  FThemeSetBoard.FFrameHeight := AValue;
+  DoChange;
+end;
+
+procedure TBCLeaTheme.SetBRDFrameDistance(AValue: integer);
+begin
+  if AValue = FThemeSetBoard.FFrameDistance then
+    exit;
+  FThemeSetBoard.FFrameDistance := AValue;
+  DoChange;
+end;
+
+procedure TBCLeaTheme.SetBRDAltitude(AValue: integer);
+begin
+  if AValue = FThemeSetBoard.FAltitude then
+    exit;
+  FThemeSetBoard.FAltitude := AValue;
+  DoChange;
+end;
+
+procedure TBCLeaTheme.SetBRDRounding(AValue: integer);
+begin
+  if AValue = FThemeSetBoard.FRounding then
+    exit;
+  FThemeSetBoard.FRounding := AValue;
+  DoChange;
+end;
+
 procedure TBCLeaTheme.Initialize;
 procedure TBCLeaTheme.Initialize;
 begin
 begin
   FThemeSetCommon.FAmbientFactor := 0.3;
   FThemeSetCommon.FAmbientFactor := 0.3;
@@ -1329,6 +1493,15 @@ begin
   FThemeSetQLED.FSize := 20;
   FThemeSetQLED.FSize := 20;
   FThemeSetQLED.FAltitude := 2;
   FThemeSetQLED.FAltitude := 2;
   FThemeSetQLED.FRounding := 3;
   FThemeSetQLED.FRounding := 3;
+  FThemeSetBoard.FFrameColor := clBtnFace;
+  FThemeSetBoard.FBoardColor := clBtnFace;
+  FThemeSetBoard.FBkgColor := clBtnFace;
+  FThemeSetBoard.FFrameStyle := zsRaised;
+  FThemeSetBoard.FBoardStyle := zsFlat;
+  FThemeSetBoard.FFrameHeight := 10;
+  FThemeSetBoard.FFrameDistance := 3;
+  FThemeSetBoard.FAltitude := 2;
+  FThemeSetBoard.FRounding := 10;
 end;
 end;
 
 
 procedure TBCLeaTheme.LoadThemeFromFile(AFileName: string);
 procedure TBCLeaTheme.LoadThemeFromFile(AFileName: string);
@@ -1354,7 +1527,10 @@ begin
           begin
           begin
             nodeName := node.NodeName;
             nodeName := node.NodeName;
             if nodeName = 'Version' then
             if nodeName = 'Version' then
-              Version := node.TextContent;
+              Version := node.TextContent
+            else
+            if nodeName = 'TestPanelColor' then
+              TestPanelColor := TColor(Hex2Dec(node.TextContent));
             node := node.NextSibling;
             node := node.NextSibling;
           end;
           end;
         end;
         end;
@@ -1745,6 +1921,60 @@ begin
               end;
               end;
               parentNode := parentNode.NextSibling;
               parentNode := parentNode.NextSibling;
             end;
             end;
+          end
+          else
+          if nodeName = 'BCLeaBoard' then
+          begin
+            parentNode := componentNode.FirstChild;
+            while Assigned(parentNode) do
+            begin
+              nodeName := parentNode.NodeName;
+              if nodeName = 'Geometry' then
+              begin
+                node := parentNode.FirstChild;
+                while Assigned(node) do
+                begin
+                  nodeName := node.NodeName;
+                  if nodeName = 'FrameStyle' then
+                    FThemeSetBoard.FFrameStyle := TZStyle(StrToInt(node.TextContent))
+                  else
+                  if nodeName = 'BoardStyle' then
+                    FThemeSetBoard.FBoardStyle := TZStyle(StrToInt(node.TextContent))
+                  else
+                  if nodeName = 'FrameHeight' then
+                    FThemeSetBoard.FFrameHeight := StrToInt(node.TextContent)
+                  else
+                  if nodeName = 'FrameDistance' then
+                    FThemeSetBoard.FFrameDistance := StrToInt(node.TextContent)
+                  else
+                  if nodeName = 'Altitude' then
+                    FThemeSetBoard.FAltitude := StrToInt(node.TextContent)
+                  else
+                  if nodeName = 'Rounding' then
+                    FThemeSetBoard.FRounding := StrToInt(node.TextContent);
+                  node := node.NextSibling;
+                end;
+              end
+              else
+              if nodeName = 'Colors' then
+              begin
+                node := parentNode.FirstChild;
+                while Assigned(node) do
+                begin
+                  nodeName := node.NodeName;
+                  if nodeName = 'Frame' then
+                    FThemeSetBoard.FFrameColor := TColor(Hex2Dec(node.TextContent))
+                  else
+                  if nodeName = 'Board' then
+                    FThemeSetBoard.FBoardColor := TColor(Hex2Dec(node.TextContent))
+                  else
+                  if nodeName = 'BkgColor' then
+                    FThemeSetBoard.FBkgColor := TColor(Hex2Dec(node.TextContent));
+                  node := node.NextSibling;
+                end;
+              end;
+              parentNode := parentNode.NextSibling;
+            end;
           end;
           end;
           { here comes the next component
           { here comes the next component
           if nodeName = 'BLCD' then  }
           if nodeName = 'BLCD' then  }
@@ -1782,6 +2012,11 @@ begin
     textNode := doc.CreateTextNode('1.0');
     textNode := doc.CreateTextNode('1.0');
     node.AppendChild(textNode);
     node.AppendChild(textNode);
 
 
+    node := doc.CreateElement('TestPanelColor');
+    componentNode.AppendChild(node);
+    textNode := doc.CreateTextNode(IntToHex(TestPanelColor));
+    node.AppendChild(textNode);
+
     //COMMON
     //COMMON
     componentNode := doc.CreateElement('COMMON');
     componentNode := doc.CreateElement('COMMON');
     rootNode.AppendChild(componentNode);
     rootNode.AppendChild(componentNode);
@@ -2182,6 +2417,62 @@ begin
     parentNode.AppendChild(node);
     parentNode.AppendChild(node);
     textNode := doc.CreateTextNode(BoolToStr(FThemeSetRingSlider.FDrawTextPhong));
     textNode := doc.CreateTextNode(BoolToStr(FThemeSetRingSlider.FDrawTextPhong));
     node.AppendChild(textNode);
     node.AppendChild(textNode);
+
+    //BCLeaBoard
+    componentNode := doc.CreateElement('BCLeaBoard');
+    rootNode.AppendChild(componentNode);
+
+    parentNode := doc.CreateElement('Geometry');
+    componentNode.AppendChild(parentNode);
+
+    node := doc.CreateElement('FrameStyle');
+    parentNode.AppendChild(node);
+    textNode := doc.CreateTextNode(IntToStr(integer(FThemeSetBoard.FFrameStyle)));
+    node.AppendChild(textNode);
+
+    node := doc.CreateElement('BoardStyle');
+    parentNode.AppendChild(node);
+    textNode := doc.CreateTextNode(IntToStr(integer(FThemeSetBoard.FBoardStyle)));
+    node.AppendChild(textNode);
+
+    node := doc.CreateElement('FrameHeight');
+    parentNode.AppendChild(node);
+    textNode := doc.CreateTextNode(IntToStr(FThemeSetBoard.FFrameHeight));
+    node.AppendChild(textNode);
+
+    node := doc.CreateElement('FrameDistance');
+    parentNode.AppendChild(node);
+    textNode := doc.CreateTextNode(IntToStr(FThemeSetBoard.FFrameDistance));
+    node.AppendChild(textNode);
+
+    node := doc.CreateElement('Altitude');
+    parentNode.AppendChild(node);
+    textNode := doc.CreateTextNode(IntToStr(FThemeSetBoard.FAltitude));
+    node.AppendChild(textNode);
+
+    node := doc.CreateElement('Rounding');
+    parentNode.AppendChild(node);
+    textNode := doc.CreateTextNode(IntToStr(FThemeSetBoard.FRounding));
+    node.AppendChild(textNode);
+
+    parentNode := doc.CreateElement('Colors');
+    componentNode.AppendChild(parentNode);
+
+    node := doc.CreateElement('Frame');
+    parentNode.AppendChild(node);
+    textNode := doc.CreateTextNode(IntToHex(integer(FThemeSetBoard.FFrameColor)));
+    node.AppendChild(textNode);
+
+    node := doc.CreateElement('Board');
+    parentNode.AppendChild(node);
+    textNode := doc.CreateTextNode(IntToHex(integer(FThemeSetBoard.FBoardColor)));
+    node.AppendChild(textNode);
+
+    node := doc.CreateElement('BkgColor');
+    parentNode.AppendChild(node);
+    textNode := doc.CreateTextNode(IntToHex(integer(FThemeSetBoard.FBkgColor)));
+    node.AppendChild(textNode);
+
     WriteXMLFile(doc, AFileName);
     WriteXMLFile(doc, AFileName);
   finally
   finally
     doc.Free;
     doc.Free;

+ 6 - 1
bgracontrols.lpk

@@ -34,7 +34,7 @@
     <Description Value="BGRA Controls is a set of graphical UI elements that you can use with Lazarus LCL applications."/>
     <Description Value="BGRA Controls is a set of graphical UI elements that you can use with Lazarus LCL applications."/>
     <License Value="Modified LGPL"/>
     <License Value="Modified LGPL"/>
     <Version Major="9" Release="1" Build="4"/>
     <Version Major="9" Release="1" Build="4"/>
-    <Files Count="77">
+    <Files Count="78">
       <Item1>
       <Item1>
         <Filename Value="atshapelinebgra.pas"/>
         <Filename Value="atshapelinebgra.pas"/>
         <HasRegisterProc Value="True"/>
         <HasRegisterProc Value="True"/>
@@ -411,6 +411,11 @@
         <HasRegisterProc Value="True"/>
         <HasRegisterProc Value="True"/>
         <UnitName Value="BCLeaLCDDisplay_EditorRegister"/>
         <UnitName Value="BCLeaLCDDisplay_EditorRegister"/>
       </Item77>
       </Item77>
+      <Item78>
+        <Filename Value="bcleaboard.pas"/>
+        <HasRegisterProc Value="True"/>
+        <UnitName Value="BCLeaBoard"/>
+      </Item78>
     </Files>
     </Files>
     <CompatibilityMode Value="True"/>
     <CompatibilityMode Value="True"/>
     <LazDoc Paths="fpdoc"/>
     <LazDoc Paths="fpdoc"/>

+ 2 - 1
bgracontrols.pas

@@ -24,7 +24,7 @@ uses
   ColorSpeedButton, DTAnalogClock, DTAnalogCommon, DTAnalogGauge, 
   ColorSpeedButton, DTAnalogClock, DTAnalogCommon, DTAnalogGauge, 
   dtthemedclock, dtthemedgauge, MaterialColors, bgrasvgimagelistform, 
   dtthemedclock, dtthemedgauge, MaterialColors, bgrasvgimagelistform, 
   BCLeaLCDDisplay, BCLeaLED, BCLeaQLED, BCLeaRingSlider, BCLeaSelector, 
   BCLeaLCDDisplay, BCLeaLED, BCLeaQLED, BCLeaRingSlider, BCLeaSelector, 
-  BCLeaTheme, BCLeaLCDDisplay_EditorRegister, LazarusPackageIntf;
+  BCLeaTheme, BCLeaLCDDisplay_EditorRegister, BCLeaBoard, LazarusPackageIntf;
 
 
 implementation
 implementation
 
 
@@ -90,6 +90,7 @@ begin
   RegisterUnit('BCLeaTheme', @BCLeaTheme.Register);
   RegisterUnit('BCLeaTheme', @BCLeaTheme.Register);
   RegisterUnit('BCLeaLCDDisplay_EditorRegister', 
   RegisterUnit('BCLeaLCDDisplay_EditorRegister', 
     @BCLeaLCDDisplay_EditorRegister.Register);
     @BCLeaLCDDisplay_EditorRegister.Register);
+  RegisterUnit('BCLeaBoard', @BCLeaBoard.Register);
 end;
 end;
 
 
 initialization
 initialization

BIN
images/TBCLeaBoard.png


BIN
images/TBCLeaBoard_150.png


BIN
images/TBCLeaBoard_200.png


BIN
images/bgracontrols_images.res


+ 4 - 1
images/bgracontrols_images_list.txt

@@ -126,4 +126,7 @@ TBCLeaSelector_150.png
 TBCLeaSelector_200.png
 TBCLeaSelector_200.png
 TBCLeaTheme.png
 TBCLeaTheme.png
 TBCLeaTheme_150.png
 TBCLeaTheme_150.png
-TBCLeaTheme_200.png
+TBCLeaTheme_200.png
+TBCLeaBoard.png
+TBCLeaBoard_150.png
+TBCLeaBoard_200.png

+ 16 - 0
styles/lea_alien.bclea

@@ -2,6 +2,7 @@
 <BCLea_Theme>
 <BCLea_Theme>
   <Version>
   <Version>
     <Version>1.0</Version>
     <Version>1.0</Version>
+    <TestPanelColor>8000000F</TestPanelColor>
   </Version>
   </Version>
   <COMMON>
   <COMMON>
     <Light>
     <Light>
@@ -110,4 +111,19 @@
       <Draw3D>0</Draw3D>
       <Draw3D>0</Draw3D>
     </Text>
     </Text>
   </BCLeaRingSlider>
   </BCLeaRingSlider>
+  <BCLeaBoard>
+    <Geometry>
+      <FrameStyle>1</FrameStyle>
+      <BoardStyle>0</BoardStyle>
+      <FrameHeight>10</FrameHeight>
+      <FrameDistance>3</FrameDistance>
+      <Altitude>2</Altitude>
+      <Rounding>10</Rounding>
+    </Geometry>
+    <Colors>
+      <Frame>8000000F</Frame>
+      <Board>00DEEBDE</Board>
+      <BkgColor>8000000F</BkgColor>
+    </Colors>
+  </BCLeaBoard>
 </BCLea_Theme>
 </BCLea_Theme>

+ 16 - 0
styles/lea_blue.bclea

@@ -2,6 +2,7 @@
 <BCLea_Theme>
 <BCLea_Theme>
   <Version>
   <Version>
     <Version>1.0</Version>
     <Version>1.0</Version>
+    <TestPanelColor>8000000F</TestPanelColor>
   </Version>
   </Version>
   <COMMON>
   <COMMON>
     <Light>
     <Light>
@@ -110,4 +111,19 @@
       <Draw3D>0</Draw3D>
       <Draw3D>0</Draw3D>
     </Text>
     </Text>
   </BCLeaRingSlider>
   </BCLeaRingSlider>
+  <BCLeaBoard>
+    <Geometry>
+      <FrameStyle>2</FrameStyle>
+      <BoardStyle>0</BoardStyle>
+      <FrameHeight>10</FrameHeight>
+      <FrameDistance>3</FrameDistance>
+      <Altitude>2</Altitude>
+      <Rounding>10</Rounding>
+    </Geometry>
+    <Colors>
+      <Frame>00C8730A</Frame>
+      <Board>8000000F</Board>
+      <BkgColor>8000000F</BkgColor>
+    </Colors>
+  </BCLeaBoard>
 </BCLea_Theme>
 </BCLea_Theme>

+ 16 - 0
styles/lea_bw.bclea

@@ -2,6 +2,7 @@
 <BCLea_Theme>
 <BCLea_Theme>
   <Version>
   <Version>
     <Version>1.0</Version>
     <Version>1.0</Version>
+    <TestPanelColor>8000000F</TestPanelColor>
   </Version>
   </Version>
   <COMMON>
   <COMMON>
     <Light>
     <Light>
@@ -110,4 +111,19 @@
       <Draw3D>0</Draw3D>
       <Draw3D>0</Draw3D>
     </Text>
     </Text>
   </BCLeaRingSlider>
   </BCLeaRingSlider>
+  <BCLeaBoard>
+    <Geometry>
+      <FrameStyle>1</FrameStyle>
+      <BoardStyle>0</BoardStyle>
+      <FrameHeight>10</FrameHeight>
+      <FrameDistance>3</FrameDistance>
+      <Altitude>2</Altitude>
+      <Rounding>10</Rounding>
+    </Geometry>
+    <Colors>
+      <Frame>8000000F</Frame>
+      <Board>00FFFFFF</Board>
+      <BkgColor>8000000F</BkgColor>
+    </Colors>
+  </BCLeaBoard>
 </BCLea_Theme>
 </BCLea_Theme>

+ 16 - 0
styles/lea_default.bclea

@@ -2,6 +2,7 @@
 <BCLea_Theme>
 <BCLea_Theme>
   <Version>
   <Version>
     <Version>1.0</Version>
     <Version>1.0</Version>
+    <TestPanelColor>8000000F</TestPanelColor>
   </Version>
   </Version>
   <COMMON>
   <COMMON>
     <Light>
     <Light>
@@ -110,4 +111,19 @@
       <Draw3D>0</Draw3D>
       <Draw3D>0</Draw3D>
     </Text>
     </Text>
   </BCLeaRingSlider>
   </BCLeaRingSlider>
+  <BCLeaBoard>
+    <Geometry>
+      <FrameStyle>2</FrameStyle>
+      <BoardStyle>0</BoardStyle>
+      <FrameHeight>10</FrameHeight>
+      <FrameDistance>3</FrameDistance>
+      <Altitude>2</Altitude>
+      <Rounding>10</Rounding>
+    </Geometry>
+    <Colors>
+      <Frame>8000000F</Frame>
+      <Board>8000000F</Board>
+      <BkgColor>8000000F</BkgColor>
+    </Colors>
+  </BCLeaBoard>
 </BCLea_Theme>
 </BCLea_Theme>

+ 16 - 0
styles/lea_e-papper.bclea

@@ -2,6 +2,7 @@
 <BCLea_Theme>
 <BCLea_Theme>
   <Version>
   <Version>
     <Version>1.0</Version>
     <Version>1.0</Version>
+    <TestPanelColor>8000000F</TestPanelColor>
   </Version>
   </Version>
   <COMMON>
   <COMMON>
     <Light>
     <Light>
@@ -110,4 +111,19 @@
       <Draw3D>0</Draw3D>
       <Draw3D>0</Draw3D>
     </Text>
     </Text>
   </BCLeaRingSlider>
   </BCLeaRingSlider>
+  <BCLeaBoard>
+    <Geometry>
+      <FrameStyle>0</FrameStyle>
+      <BoardStyle>0</BoardStyle>
+      <FrameHeight>10</FrameHeight>
+      <FrameDistance>3</FrameDistance>
+      <Altitude>2</Altitude>
+      <Rounding>10</Rounding>
+    </Geometry>
+    <Colors>
+      <Frame>006E6E6E</Frame>
+      <Board>8000000F</Board>
+      <BkgColor>8000000F</BkgColor>
+    </Colors>
+  </BCLeaBoard>
 </BCLea_Theme>
 </BCLea_Theme>

+ 16 - 0
styles/lea_gray.bclea

@@ -2,6 +2,7 @@
 <BCLea_Theme>
 <BCLea_Theme>
   <Version>
   <Version>
     <Version>1.0</Version>
     <Version>1.0</Version>
+    <TestPanelColor>8000000F</TestPanelColor>
   </Version>
   </Version>
   <COMMON>
   <COMMON>
     <Light>
     <Light>
@@ -110,4 +111,19 @@
       <Draw3D>0</Draw3D>
       <Draw3D>0</Draw3D>
     </Text>
     </Text>
   </BCLeaRingSlider>
   </BCLeaRingSlider>
+  <BCLeaBoard>
+    <Geometry>
+      <FrameStyle>2</FrameStyle>
+      <BoardStyle>0</BoardStyle>
+      <FrameHeight>10</FrameHeight>
+      <FrameDistance>3</FrameDistance>
+      <Altitude>2</Altitude>
+      <Rounding>10</Rounding>
+    </Geometry>
+    <Colors>
+      <Frame>00879B73</Frame>
+      <Board>8000000F</Board>
+      <BkgColor>8000000F</BkgColor>
+    </Colors>
+  </BCLeaBoard>
 </BCLea_Theme>
 </BCLea_Theme>

+ 16 - 0
styles/lea_green.bclea

@@ -2,6 +2,7 @@
 <BCLea_Theme>
 <BCLea_Theme>
   <Version>
   <Version>
     <Version>1.0</Version>
     <Version>1.0</Version>
+    <TestPanelColor>8000000F</TestPanelColor>
   </Version>
   </Version>
   <COMMON>
   <COMMON>
     <Light>
     <Light>
@@ -110,4 +111,19 @@
       <Draw3D>0</Draw3D>
       <Draw3D>0</Draw3D>
     </Text>
     </Text>
   </BCLeaRingSlider>
   </BCLeaRingSlider>
+  <BCLeaBoard>
+    <Geometry>
+      <FrameStyle>2</FrameStyle>
+      <BoardStyle>0</BoardStyle>
+      <FrameHeight>10</FrameHeight>
+      <FrameDistance>3</FrameDistance>
+      <Altitude>2</Altitude>
+      <Rounding>10</Rounding>
+    </Geometry>
+    <Colors>
+      <Frame>0028AF28</Frame>
+      <Board>8000000F</Board>
+      <BkgColor>8000000F</BkgColor>
+    </Colors>
+  </BCLeaBoard>
 </BCLea_Theme>
 </BCLea_Theme>

+ 16 - 0
styles/lea_olive.bclea

@@ -2,6 +2,7 @@
 <BCLea_Theme>
 <BCLea_Theme>
   <Version>
   <Version>
     <Version>1.0</Version>
     <Version>1.0</Version>
+    <TestPanelColor>8000000F</TestPanelColor>
   </Version>
   </Version>
   <COMMON>
   <COMMON>
     <Light>
     <Light>
@@ -110,4 +111,19 @@
       <Draw3D>0</Draw3D>
       <Draw3D>0</Draw3D>
     </Text>
     </Text>
   </BCLeaRingSlider>
   </BCLeaRingSlider>
+  <BCLeaBoard>
+    <Geometry>
+      <FrameStyle>2</FrameStyle>
+      <BoardStyle>0</BoardStyle>
+      <FrameHeight>10</FrameHeight>
+      <FrameDistance>3</FrameDistance>
+      <Altitude>2</Altitude>
+      <Rounding>10</Rounding>
+    </Geometry>
+    <Colors>
+      <Frame>005C592C</Frame>
+      <Board>8000000F</Board>
+      <BkgColor>8000000F</BkgColor>
+    </Colors>
+  </BCLeaBoard>
 </BCLea_Theme>
 </BCLea_Theme>

+ 16 - 0
styles/lea_plastic_morph.bclea

@@ -2,6 +2,7 @@
 <BCLea_Theme>
 <BCLea_Theme>
   <Version>
   <Version>
     <Version>1.0</Version>
     <Version>1.0</Version>
+    <TestPanelColor>00FFFFFF</TestPanelColor>
   </Version>
   </Version>
   <COMMON>
   <COMMON>
     <Light>
     <Light>
@@ -110,4 +111,19 @@
       <Draw3D>0</Draw3D>
       <Draw3D>0</Draw3D>
     </Text>
     </Text>
   </BCLeaRingSlider>
   </BCLeaRingSlider>
+  <BCLeaBoard>
+    <Geometry>
+      <FrameStyle>2</FrameStyle>
+      <BoardStyle>0</BoardStyle>
+      <FrameHeight>1</FrameHeight>
+      <FrameDistance>0</FrameDistance>
+      <Altitude>10</Altitude>
+      <Rounding>20</Rounding>
+    </Geometry>
+    <Colors>
+      <Frame>8000000F</Frame>
+      <Board>00FFFFFF</Board>
+      <BkgColor>00FFFFFF</BkgColor>
+    </Colors>
+  </BCLeaBoard>
 </BCLea_Theme>
 </BCLea_Theme>

+ 16 - 0
test/test_bclea/themes/lea_alien.bclea

@@ -2,6 +2,7 @@
 <BCLea_Theme>
 <BCLea_Theme>
   <Version>
   <Version>
     <Version>1.0</Version>
     <Version>1.0</Version>
+    <TestPanelColor>8000000F</TestPanelColor>
   </Version>
   </Version>
   <COMMON>
   <COMMON>
     <Light>
     <Light>
@@ -110,4 +111,19 @@
       <Draw3D>0</Draw3D>
       <Draw3D>0</Draw3D>
     </Text>
     </Text>
   </BCLeaRingSlider>
   </BCLeaRingSlider>
+  <BCLeaBoard>
+    <Geometry>
+      <FrameStyle>1</FrameStyle>
+      <BoardStyle>0</BoardStyle>
+      <FrameHeight>10</FrameHeight>
+      <FrameDistance>3</FrameDistance>
+      <Altitude>2</Altitude>
+      <Rounding>10</Rounding>
+    </Geometry>
+    <Colors>
+      <Frame>8000000F</Frame>
+      <Board>00DEEBDE</Board>
+      <BkgColor>8000000F</BkgColor>
+    </Colors>
+  </BCLeaBoard>
 </BCLea_Theme>
 </BCLea_Theme>

+ 16 - 0
test/test_bclea/themes/lea_blue.bclea

@@ -2,6 +2,7 @@
 <BCLea_Theme>
 <BCLea_Theme>
   <Version>
   <Version>
     <Version>1.0</Version>
     <Version>1.0</Version>
+    <TestPanelColor>8000000F</TestPanelColor>
   </Version>
   </Version>
   <COMMON>
   <COMMON>
     <Light>
     <Light>
@@ -110,4 +111,19 @@
       <Draw3D>0</Draw3D>
       <Draw3D>0</Draw3D>
     </Text>
     </Text>
   </BCLeaRingSlider>
   </BCLeaRingSlider>
+  <BCLeaBoard>
+    <Geometry>
+      <FrameStyle>2</FrameStyle>
+      <BoardStyle>0</BoardStyle>
+      <FrameHeight>10</FrameHeight>
+      <FrameDistance>3</FrameDistance>
+      <Altitude>2</Altitude>
+      <Rounding>10</Rounding>
+    </Geometry>
+    <Colors>
+      <Frame>00C8730A</Frame>
+      <Board>8000000F</Board>
+      <BkgColor>8000000F</BkgColor>
+    </Colors>
+  </BCLeaBoard>
 </BCLea_Theme>
 </BCLea_Theme>

+ 16 - 0
test/test_bclea/themes/lea_bw.bclea

@@ -2,6 +2,7 @@
 <BCLea_Theme>
 <BCLea_Theme>
   <Version>
   <Version>
     <Version>1.0</Version>
     <Version>1.0</Version>
+    <TestPanelColor>8000000F</TestPanelColor>
   </Version>
   </Version>
   <COMMON>
   <COMMON>
     <Light>
     <Light>
@@ -110,4 +111,19 @@
       <Draw3D>0</Draw3D>
       <Draw3D>0</Draw3D>
     </Text>
     </Text>
   </BCLeaRingSlider>
   </BCLeaRingSlider>
+  <BCLeaBoard>
+    <Geometry>
+      <FrameStyle>1</FrameStyle>
+      <BoardStyle>0</BoardStyle>
+      <FrameHeight>10</FrameHeight>
+      <FrameDistance>3</FrameDistance>
+      <Altitude>2</Altitude>
+      <Rounding>10</Rounding>
+    </Geometry>
+    <Colors>
+      <Frame>8000000F</Frame>
+      <Board>00FFFFFF</Board>
+      <BkgColor>8000000F</BkgColor>
+    </Colors>
+  </BCLeaBoard>
 </BCLea_Theme>
 </BCLea_Theme>

+ 16 - 0
test/test_bclea/themes/lea_default.bclea

@@ -2,6 +2,7 @@
 <BCLea_Theme>
 <BCLea_Theme>
   <Version>
   <Version>
     <Version>1.0</Version>
     <Version>1.0</Version>
+    <TestPanelColor>8000000F</TestPanelColor>
   </Version>
   </Version>
   <COMMON>
   <COMMON>
     <Light>
     <Light>
@@ -110,4 +111,19 @@
       <Draw3D>0</Draw3D>
       <Draw3D>0</Draw3D>
     </Text>
     </Text>
   </BCLeaRingSlider>
   </BCLeaRingSlider>
+  <BCLeaBoard>
+    <Geometry>
+      <FrameStyle>2</FrameStyle>
+      <BoardStyle>0</BoardStyle>
+      <FrameHeight>10</FrameHeight>
+      <FrameDistance>3</FrameDistance>
+      <Altitude>2</Altitude>
+      <Rounding>10</Rounding>
+    </Geometry>
+    <Colors>
+      <Frame>8000000F</Frame>
+      <Board>8000000F</Board>
+      <BkgColor>8000000F</BkgColor>
+    </Colors>
+  </BCLeaBoard>
 </BCLea_Theme>
 </BCLea_Theme>

+ 16 - 0
test/test_bclea/themes/lea_e-papper.bclea

@@ -2,6 +2,7 @@
 <BCLea_Theme>
 <BCLea_Theme>
   <Version>
   <Version>
     <Version>1.0</Version>
     <Version>1.0</Version>
+    <TestPanelColor>8000000F</TestPanelColor>
   </Version>
   </Version>
   <COMMON>
   <COMMON>
     <Light>
     <Light>
@@ -110,4 +111,19 @@
       <Draw3D>0</Draw3D>
       <Draw3D>0</Draw3D>
     </Text>
     </Text>
   </BCLeaRingSlider>
   </BCLeaRingSlider>
+  <BCLeaBoard>
+    <Geometry>
+      <FrameStyle>0</FrameStyle>
+      <BoardStyle>0</BoardStyle>
+      <FrameHeight>10</FrameHeight>
+      <FrameDistance>3</FrameDistance>
+      <Altitude>2</Altitude>
+      <Rounding>10</Rounding>
+    </Geometry>
+    <Colors>
+      <Frame>006E6E6E</Frame>
+      <Board>8000000F</Board>
+      <BkgColor>8000000F</BkgColor>
+    </Colors>
+  </BCLeaBoard>
 </BCLea_Theme>
 </BCLea_Theme>

+ 16 - 0
test/test_bclea/themes/lea_gray.bclea

@@ -2,6 +2,7 @@
 <BCLea_Theme>
 <BCLea_Theme>
   <Version>
   <Version>
     <Version>1.0</Version>
     <Version>1.0</Version>
+    <TestPanelColor>8000000F</TestPanelColor>
   </Version>
   </Version>
   <COMMON>
   <COMMON>
     <Light>
     <Light>
@@ -110,4 +111,19 @@
       <Draw3D>0</Draw3D>
       <Draw3D>0</Draw3D>
     </Text>
     </Text>
   </BCLeaRingSlider>
   </BCLeaRingSlider>
+  <BCLeaBoard>
+    <Geometry>
+      <FrameStyle>2</FrameStyle>
+      <BoardStyle>0</BoardStyle>
+      <FrameHeight>10</FrameHeight>
+      <FrameDistance>3</FrameDistance>
+      <Altitude>2</Altitude>
+      <Rounding>10</Rounding>
+    </Geometry>
+    <Colors>
+      <Frame>00879B73</Frame>
+      <Board>8000000F</Board>
+      <BkgColor>8000000F</BkgColor>
+    </Colors>
+  </BCLeaBoard>
 </BCLea_Theme>
 </BCLea_Theme>

+ 16 - 0
test/test_bclea/themes/lea_green.bclea

@@ -2,6 +2,7 @@
 <BCLea_Theme>
 <BCLea_Theme>
   <Version>
   <Version>
     <Version>1.0</Version>
     <Version>1.0</Version>
+    <TestPanelColor>8000000F</TestPanelColor>
   </Version>
   </Version>
   <COMMON>
   <COMMON>
     <Light>
     <Light>
@@ -110,4 +111,19 @@
       <Draw3D>0</Draw3D>
       <Draw3D>0</Draw3D>
     </Text>
     </Text>
   </BCLeaRingSlider>
   </BCLeaRingSlider>
+  <BCLeaBoard>
+    <Geometry>
+      <FrameStyle>2</FrameStyle>
+      <BoardStyle>0</BoardStyle>
+      <FrameHeight>10</FrameHeight>
+      <FrameDistance>3</FrameDistance>
+      <Altitude>2</Altitude>
+      <Rounding>10</Rounding>
+    </Geometry>
+    <Colors>
+      <Frame>0028AF28</Frame>
+      <Board>8000000F</Board>
+      <BkgColor>8000000F</BkgColor>
+    </Colors>
+  </BCLeaBoard>
 </BCLea_Theme>
 </BCLea_Theme>

+ 16 - 0
test/test_bclea/themes/lea_olive.bclea

@@ -2,6 +2,7 @@
 <BCLea_Theme>
 <BCLea_Theme>
   <Version>
   <Version>
     <Version>1.0</Version>
     <Version>1.0</Version>
+    <TestPanelColor>8000000F</TestPanelColor>
   </Version>
   </Version>
   <COMMON>
   <COMMON>
     <Light>
     <Light>
@@ -110,4 +111,19 @@
       <Draw3D>0</Draw3D>
       <Draw3D>0</Draw3D>
     </Text>
     </Text>
   </BCLeaRingSlider>
   </BCLeaRingSlider>
+  <BCLeaBoard>
+    <Geometry>
+      <FrameStyle>2</FrameStyle>
+      <BoardStyle>0</BoardStyle>
+      <FrameHeight>10</FrameHeight>
+      <FrameDistance>3</FrameDistance>
+      <Altitude>2</Altitude>
+      <Rounding>10</Rounding>
+    </Geometry>
+    <Colors>
+      <Frame>005C592C</Frame>
+      <Board>8000000F</Board>
+      <BkgColor>8000000F</BkgColor>
+    </Colors>
+  </BCLeaBoard>
 </BCLea_Theme>
 </BCLea_Theme>

+ 16 - 0
test/test_bclea/themes/lea_plastic_morph.bclea

@@ -2,6 +2,7 @@
 <BCLea_Theme>
 <BCLea_Theme>
   <Version>
   <Version>
     <Version>1.0</Version>
     <Version>1.0</Version>
+    <TestPanelColor>00FFFFFF</TestPanelColor>
   </Version>
   </Version>
   <COMMON>
   <COMMON>
     <Light>
     <Light>
@@ -110,4 +111,19 @@
       <Draw3D>0</Draw3D>
       <Draw3D>0</Draw3D>
     </Text>
     </Text>
   </BCLeaRingSlider>
   </BCLeaRingSlider>
+  <BCLeaBoard>
+    <Geometry>
+      <FrameStyle>2</FrameStyle>
+      <BoardStyle>0</BoardStyle>
+      <FrameHeight>1</FrameHeight>
+      <FrameDistance>0</FrameDistance>
+      <Altitude>10</Altitude>
+      <Rounding>20</Rounding>
+    </Geometry>
+    <Colors>
+      <Frame>8000000F</Frame>
+      <Board>00FFFFFF</Board>
+      <BkgColor>00FFFFFF</BkgColor>
+    </Colors>
+  </BCLeaBoard>
 </BCLea_Theme>
 </BCLea_Theme>

+ 374 - 218
test/test_bclea/untThemeBuilder.lfm

@@ -307,8 +307,8 @@ object frmMain: TfrmMain
       Height = 352
       Height = 352
       Top = 8
       Top = 8
       Width = 656
       Width = 656
-      ActivePage = tsLED
-      TabIndex = 1
+      ActivePage = tsBoard
+      TabIndex = 5
       TabOrder = 1
       TabOrder = 1
       object tsLCD: TTabSheet
       object tsLCD: TTabSheet
         Caption = 'BCLeaLCDDisplay'
         Caption = 'BCLeaLCDDisplay'
@@ -403,28 +403,10 @@ object frmMain: TfrmMain
           ClientHeight = 300
           ClientHeight = 300
           ClientWidth = 318
           ClientWidth = 318
           TabOrder = 1
           TabOrder = 1
-          object lblLCDColorScheme: TLabel
-            Left = 8
-            Height = 15
-            Top = 9
-            Width = 76
-            Caption = 'Color scheme:'
-            ParentColor = False
-            Transparent = False
-          end
-          object lblLCDCustomColors: TLabel
-            Left = 8
-            Height = 15
-            Top = 56
-            Width = 119
-            Caption = 'Custom color scheme:'
-            ParentColor = False
-            Transparent = False
-          end
           object cbtLCDFrameColor: TColorButton
           object cbtLCDFrameColor: TColorButton
             Left = 8
             Left = 8
             Height = 25
             Height = 25
-            Top = 73
+            Top = 9
             Width = 123
             Width = 123
             BorderWidth = 2
             BorderWidth = 2
             ButtonColorAutoSize = False
             ButtonColorAutoSize = False
@@ -437,7 +419,7 @@ object frmMain: TfrmMain
           object cbtLCDBoardColor: TColorButton
           object cbtLCDBoardColor: TColorButton
             Left = 8
             Left = 8
             Height = 25
             Height = 25
-            Top = 102
+            Top = 38
             Width = 123
             Width = 123
             BorderWidth = 2
             BorderWidth = 2
             ButtonColorAutoSize = False
             ButtonColorAutoSize = False
@@ -450,7 +432,7 @@ object frmMain: TfrmMain
           object cbtLCDDotOnColor: TColorButton
           object cbtLCDDotOnColor: TColorButton
             Left = 8
             Left = 8
             Height = 25
             Height = 25
-            Top = 130
+            Top = 66
             Width = 123
             Width = 123
             BorderWidth = 2
             BorderWidth = 2
             ButtonColorAutoSize = False
             ButtonColorAutoSize = False
@@ -463,7 +445,7 @@ object frmMain: TfrmMain
           object rgLCDDotShape: TRadioGroup
           object rgLCDDotShape: TRadioGroup
             Left = 8
             Left = 8
             Height = 65
             Height = 65
-            Top = 167
+            Top = 103
             Width = 128
             Width = 128
             AutoFill = True
             AutoFill = True
             Caption = 'Dot shape'
             Caption = 'Dot shape'
@@ -486,7 +468,7 @@ object frmMain: TfrmMain
           object lblLCDDotSize: TLabel
           object lblLCDDotSize: TLabel
             Left = 8
             Left = 8
             Height = 15
             Height = 15
-            Top = 248
+            Top = 184
             Width = 44
             Width = 44
             Caption = 'Dot size:'
             Caption = 'Dot size:'
             ParentColor = False
             ParentColor = False
@@ -495,7 +477,7 @@ object frmMain: TfrmMain
           object lblLCDDotSpace: TLabel
           object lblLCDDotSpace: TLabel
             Left = 8
             Left = 8
             Height = 15
             Height = 15
-            Top = 276
+            Top = 212
             Width = 60
             Width = 60
             Caption = 'Dots space:'
             Caption = 'Dots space:'
             ParentColor = False
             ParentColor = False
@@ -504,7 +486,7 @@ object frmMain: TfrmMain
           object seLCDDotSize: TSpinEdit
           object seLCDDotSize: TSpinEdit
             Left = 78
             Left = 78
             Height = 23
             Height = 23
-            Top = 246
+            Top = 182
             Width = 58
             Width = 58
             OnChange = seLCDDotSizeChange
             OnChange = seLCDDotSizeChange
             TabOrder = 1
             TabOrder = 1
@@ -512,7 +494,7 @@ object frmMain: TfrmMain
           object seLCDDotsSpace: TSpinEdit
           object seLCDDotsSpace: TSpinEdit
             Left = 78
             Left = 78
             Height = 23
             Height = 23
-            Top = 272
+            Top = 208
             Width = 58
             Width = 58
             OnChange = seLCDDotsSpaceChange
             OnChange = seLCDDotsSpaceChange
             TabOrder = 2
             TabOrder = 2
@@ -878,6 +860,197 @@ object frmMain: TfrmMain
           end
           end
         end
         end
       end
       end
+      object tsQLED: TTabSheet
+        Caption = 'BCLeaQLED'
+        ClientHeight = 324
+        ClientWidth = 648
+        object GroupBox11: TGroupBox
+          Left = 0
+          Height = 320
+          Top = 0
+          Width = 224
+          Caption = 'Component and also in Theme BLED'
+          ClientHeight = 300
+          ClientWidth = 220
+          TabOrder = 0
+          object cbtQLEDColorOn: TColorButton
+            Left = 8
+            Height = 25
+            Top = 8
+            Width = 123
+            BorderWidth = 2
+            ButtonColorAutoSize = False
+            ButtonColorSize = 16
+            ButtonColor = clBlack
+            Caption = 'Dot Color On'
+            Margin = 8
+            OnColorChanged = cbtQLEDColorOnColorChanged
+          end
+          object cbtQLEDColorOff: TColorButton
+            Left = 8
+            Height = 25
+            Top = 37
+            Width = 123
+            BorderWidth = 2
+            ButtonColorAutoSize = False
+            ButtonColorSize = 16
+            ButtonColor = clBlack
+            Caption = 'Dot Color Off'
+            Margin = 8
+            OnColorChanged = cbtQLEDColorOffColorChanged
+          end
+          object cbtQLEDBkgColor: TColorButton
+            Left = 8
+            Height = 25
+            Top = 65
+            Width = 123
+            BorderWidth = 2
+            ButtonColorAutoSize = False
+            ButtonColorSize = 16
+            ButtonColor = clBlack
+            Caption = 'Bkg Color'
+            Margin = 8
+            OnColorChanged = cbtQLEDBkgColorColorChanged
+          end
+          object lblQLEDSize: TLabel
+            Left = 8
+            Height = 15
+            Top = 100
+            Width = 23
+            Caption = 'Size:'
+            ParentColor = False
+            Transparent = False
+          end
+          object seQLEDSize: TSpinEdit
+            Left = 72
+            Height = 23
+            Top = 96
+            Width = 58
+            OnChange = seQLEDSizeChange
+            TabOrder = 0
+          end
+          object rgQLEDZStyle: TRadioGroup
+            Left = 8
+            Height = 81
+            Top = 144
+            Width = 146
+            AutoFill = True
+            Caption = 'Z-style'
+            ChildSizing.LeftRightSpacing = 6
+            ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
+            ChildSizing.EnlargeVertical = crsHomogenousChildResize
+            ChildSizing.ShrinkHorizontal = crsScaleChilds
+            ChildSizing.ShrinkVertical = crsScaleChilds
+            ChildSizing.Layout = cclLeftToRightThenTopToBottom
+            ChildSizing.ControlsPerLine = 1
+            ClientHeight = 61
+            ClientWidth = 142
+            Items.Strings = (
+              'zsFlat'
+              'zsLowered'
+              'zsRaised'
+            )
+            OnClick = rgQLEDZStyleClick
+            TabOrder = 1
+          end
+          object lblQLEDAltitude: TLabel
+            Left = 8
+            Height = 15
+            Top = 244
+            Width = 45
+            Caption = 'Altitude:'
+            ParentColor = False
+            Transparent = False
+          end
+          object seQLEDAltitude: TSpinEdit
+            Left = 73
+            Height = 23
+            Top = 240
+            Width = 58
+            OnChange = seQLEDAltitudeChange
+            TabOrder = 2
+          end
+          object seQLEDRounding: TSpinEdit
+            Left = 73
+            Height = 23
+            Top = 268
+            Width = 58
+            OnChange = seQLEDRoundingChange
+            TabOrder = 3
+          end
+          object lblQLEDRounding: TLabel
+            Left = 8
+            Height = 15
+            Top = 272
+            Width = 55
+            Caption = 'Rounding:'
+            ParentColor = False
+            Transparent = False
+          end
+        end
+        object GroupBox12: TGroupBox
+          Left = 224
+          Height = 320
+          Top = 0
+          Width = 185
+          Caption = 'Component only'
+          ClientHeight = 300
+          ClientWidth = 181
+          TabOrder = 1
+          object cbQLEDClickable: TCheckBox
+            Left = 8
+            Height = 19
+            Top = 8
+            Width = 66
+            Caption = 'Clickable'
+            TabOrder = 0
+            OnChange = cbQLEDClickableChange
+          end
+          object lblQLEDWidth: TLabel
+            Left = 8
+            Height = 15
+            Top = 43
+            Width = 35
+            Caption = 'Width:'
+            ParentColor = False
+            Transparent = False
+          end
+          object seQLEDWidth: TSpinEdit
+            Left = 118
+            Height = 23
+            Top = 40
+            Width = 58
+            OnChange = seQLEDWidthChange
+            TabOrder = 1
+          end
+          object lblQLEDHeight: TLabel
+            Left = 8
+            Height = 15
+            Top = 71
+            Width = 39
+            Caption = 'Heigth:'
+            ParentColor = False
+            Transparent = False
+          end
+          object seQLEDHeigth: TSpinEdit
+            Left = 118
+            Height = 23
+            Top = 68
+            Width = 58
+            OnChange = seQLEDHeigthChange
+            TabOrder = 2
+          end
+          object cbQLEDValue: TCheckBox
+            Left = 8
+            Height = 19
+            Top = 104
+            Width = 47
+            Caption = 'Value'
+            TabOrder = 3
+            OnChange = cbQLEDValueChange
+          end
+        end
+      end
       object tsSelector: TTabSheet
       object tsSelector: TTabSheet
         Caption = 'BCLeaSelector'
         Caption = 'BCLeaSelector'
         ClientHeight = 324
         ClientHeight = 324
@@ -1497,195 +1670,164 @@ object frmMain: TfrmMain
           end
           end
         end
         end
       end
       end
-      object tsQLED: TTabSheet
-        Caption = 'BCLeaQLED'
+      object tsBoard: TTabSheet
+        Caption = 'BCLeaBoard'
         ClientHeight = 324
         ClientHeight = 324
         ClientWidth = 648
         ClientWidth = 648
-        object GroupBox11: TGroupBox
-          Left = 0
-          Height = 320
-          Top = 0
-          Width = 224
-          Caption = 'Component and also in Theme BLED'
-          ClientHeight = 300
-          ClientWidth = 220
+        object cbtBoardFrame: TColorButton
+          Left = 8
+          Height = 25
+          Top = 8
+          Width = 123
+          BorderWidth = 2
+          ButtonColorAutoSize = False
+          ButtonColorSize = 16
+          ButtonColor = clBlack
+          Caption = 'Frame'
+          Margin = 8
+          OnColorChanged = cbtBoardFrameColorChanged
+        end
+        object cbtBoardBoard: TColorButton
+          Left = 8
+          Height = 25
+          Top = 37
+          Width = 123
+          BorderWidth = 2
+          ButtonColorAutoSize = False
+          ButtonColorSize = 16
+          ButtonColor = clBlack
+          Caption = 'Board'
+          Margin = 8
+          OnColorChanged = cbtBoardBoardColorChanged
+        end
+        object cbtBoardBkgColor: TColorButton
+          Left = 8
+          Height = 25
+          Top = 65
+          Width = 123
+          BorderWidth = 2
+          ButtonColorAutoSize = False
+          ButtonColorSize = 16
+          ButtonColor = clBlack
+          Caption = 'Bkg Color'
+          Margin = 8
+          OnColorChanged = cbtBoardBkgColorColorChanged
+        end
+        object seBoardFrHeight: TSpinEdit
+          Left = 112
+          Height = 23
+          Top = 104
+          Width = 58
+          OnChange = seBoardFrHeightChange
           TabOrder = 0
           TabOrder = 0
-          object cbtQLEDColorOn: TColorButton
-            Left = 8
-            Height = 25
-            Top = 8
-            Width = 123
-            BorderWidth = 2
-            ButtonColorAutoSize = False
-            ButtonColorSize = 16
-            ButtonColor = clBlack
-            Caption = 'Dot Color On'
-            Margin = 8
-            OnColorChanged = cbtQLEDColorOnColorChanged
-          end
-          object cbtQLEDColorOff: TColorButton
-            Left = 8
-            Height = 25
-            Top = 37
-            Width = 123
-            BorderWidth = 2
-            ButtonColorAutoSize = False
-            ButtonColorSize = 16
-            ButtonColor = clBlack
-            Caption = 'Dot Color Off'
-            Margin = 8
-            OnColorChanged = cbtQLEDColorOffColorChanged
-          end
-          object cbtQLEDBkgColor: TColorButton
-            Left = 8
-            Height = 25
-            Top = 65
-            Width = 123
-            BorderWidth = 2
-            ButtonColorAutoSize = False
-            ButtonColorSize = 16
-            ButtonColor = clBlack
-            Caption = 'Bkg Color'
-            Margin = 8
-            OnColorChanged = cbtQLEDBkgColorColorChanged
-          end
-          object lblQLEDSize: TLabel
-            Left = 8
-            Height = 15
-            Top = 100
-            Width = 23
-            Caption = 'Size:'
-            ParentColor = False
-            Transparent = False
-          end
-          object seQLEDSize: TSpinEdit
-            Left = 72
-            Height = 23
-            Top = 96
-            Width = 58
-            OnChange = seQLEDSizeChange
-            TabOrder = 0
-          end
-          object rgQLEDZStyle: TRadioGroup
-            Left = 8
-            Height = 81
-            Top = 144
-            Width = 146
-            AutoFill = True
-            Caption = 'Z-style'
-            ChildSizing.LeftRightSpacing = 6
-            ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
-            ChildSizing.EnlargeVertical = crsHomogenousChildResize
-            ChildSizing.ShrinkHorizontal = crsScaleChilds
-            ChildSizing.ShrinkVertical = crsScaleChilds
-            ChildSizing.Layout = cclLeftToRightThenTopToBottom
-            ChildSizing.ControlsPerLine = 1
-            ClientHeight = 61
-            ClientWidth = 142
-            Items.Strings = (
-              'zsFlat'
-              'zsLowered'
-              'zsRaised'
-            )
-            OnClick = rgQLEDZStyleClick
-            TabOrder = 1
-          end
-          object lblQLEDAltitude: TLabel
-            Left = 8
-            Height = 15
-            Top = 244
-            Width = 45
-            Caption = 'Altitude:'
-            ParentColor = False
-            Transparent = False
-          end
-          object seQLEDAltitude: TSpinEdit
-            Left = 73
-            Height = 23
-            Top = 240
-            Width = 58
-            OnChange = seQLEDAltitudeChange
-            TabOrder = 2
-          end
-          object seQLEDRounding: TSpinEdit
-            Left = 73
-            Height = 23
-            Top = 268
-            Width = 58
-            OnChange = seQLEDRoundingChange
-            TabOrder = 3
-          end
-          object lblQLEDRounding: TLabel
-            Left = 8
-            Height = 15
-            Top = 272
-            Width = 55
-            Caption = 'Rounding:'
-            ParentColor = False
-            Transparent = False
-          end
         end
         end
-        object GroupBox12: TGroupBox
-          Left = 224
-          Height = 320
-          Top = 0
-          Width = 185
-          Caption = 'Component only'
-          ClientHeight = 300
-          ClientWidth = 181
+        object lblBoardFrHeight: TLabel
+          Left = 8
+          Height = 15
+          Top = 108
+          Width = 73
+          Caption = 'Frame height:'
+          ParentColor = False
+          Transparent = False
+        end
+        object lblBoardFrDistance: TLabel
+          Left = 8
+          Height = 15
+          Top = 136
+          Width = 83
+          Caption = 'Frame distance:'
+          ParentColor = False
+          Transparent = False
+        end
+        object seBoardFrDistance: TSpinEdit
+          Left = 112
+          Height = 23
+          Top = 132
+          Width = 58
+          OnChange = seBoardFrDistanceChange
           TabOrder = 1
           TabOrder = 1
-          object cbQLEDClickable: TCheckBox
-            Left = 8
-            Height = 19
-            Top = 8
-            Width = 66
-            Caption = 'Clickable'
-            TabOrder = 0
-            OnChange = cbQLEDClickableChange
-          end
-          object lblQLEDWidth: TLabel
-            Left = 8
-            Height = 15
-            Top = 43
-            Width = 35
-            Caption = 'Width:'
-            ParentColor = False
-            Transparent = False
-          end
-          object seQLEDWidth: TSpinEdit
-            Left = 118
-            Height = 23
-            Top = 40
-            Width = 58
-            OnChange = seQLEDWidthChange
-            TabOrder = 1
-          end
-          object lblQLEDHeight: TLabel
-            Left = 8
-            Height = 15
-            Top = 71
-            Width = 39
-            Caption = 'Heigth:'
-            ParentColor = False
-            Transparent = False
-          end
-          object seQLEDHeigth: TSpinEdit
-            Left = 118
-            Height = 23
-            Top = 68
-            Width = 58
-            OnChange = seQLEDHeigthChange
-            TabOrder = 2
-          end
-          object cbQLEDValue: TCheckBox
-            Left = 8
-            Height = 19
-            Top = 104
-            Width = 47
-            Caption = 'Value'
-            TabOrder = 3
-            OnChange = cbQLEDValueChange
-          end
+        end
+        object lblBoardFrRounding: TLabel
+          Left = 8
+          Height = 15
+          Top = 164
+          Width = 88
+          Caption = 'Frame rounding:'
+          ParentColor = False
+          Transparent = False
+        end
+        object seBoardFrRounding: TSpinEdit
+          Left = 112
+          Height = 23
+          Top = 160
+          Width = 58
+          OnChange = seBoardFrRoundingChange
+          TabOrder = 2
+        end
+        object lblBoardFrAltitude: TLabel
+          Left = 8
+          Height = 15
+          Top = 192
+          Width = 79
+          Caption = 'Frame altitude:'
+          ParentColor = False
+          Transparent = False
+        end
+        object seBoardFrAltitude: TSpinEdit
+          Left = 112
+          Height = 23
+          Top = 188
+          Width = 58
+          OnChange = seBoardFrAltitudeChange
+          TabOrder = 3
+        end
+        object rgBoardFrameStyle: TRadioGroup
+          Left = 200
+          Height = 81
+          Top = 9
+          Width = 146
+          AutoFill = True
+          Caption = 'Frame style'
+          ChildSizing.LeftRightSpacing = 6
+          ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
+          ChildSizing.EnlargeVertical = crsHomogenousChildResize
+          ChildSizing.ShrinkHorizontal = crsScaleChilds
+          ChildSizing.ShrinkVertical = crsScaleChilds
+          ChildSizing.Layout = cclLeftToRightThenTopToBottom
+          ChildSizing.ControlsPerLine = 1
+          ClientHeight = 61
+          ClientWidth = 142
+          Items.Strings = (
+            'zsFlat'
+            'zsLowered'
+            'zsRaised'
+          )
+          OnClick = rgBoardFrameStyleClick
+          TabOrder = 4
+        end
+        object rgBoardBoardStyle: TRadioGroup
+          Left = 200
+          Height = 81
+          Top = 104
+          Width = 146
+          AutoFill = True
+          Caption = 'Board style'
+          ChildSizing.LeftRightSpacing = 6
+          ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
+          ChildSizing.EnlargeVertical = crsHomogenousChildResize
+          ChildSizing.ShrinkHorizontal = crsScaleChilds
+          ChildSizing.ShrinkVertical = crsScaleChilds
+          ChildSizing.Layout = cclLeftToRightThenTopToBottom
+          ChildSizing.ControlsPerLine = 1
+          ClientHeight = 61
+          ClientWidth = 142
+          Items.Strings = (
+            'zsFlat'
+            'zsLowered'
+            'zsRaised'
+          )
+          OnClick = rgBoardBoardStyleClick
+          TabOrder = 5
         end
         end
       end
       end
     end
     end
@@ -1761,11 +1903,11 @@ object frmMain: TfrmMain
       Theme = BTheme
       Theme = BTheme
     end
     end
     object BSelector: TBCLeaSelector
     object BSelector: TBCLeaSelector
-      AnchorSideLeft.Control = BLED
+      AnchorSideLeft.Control = BQLED
       AnchorSideLeft.Side = asrBottom
       AnchorSideLeft.Side = asrBottom
       AnchorSideTop.Control = LCDDisplay
       AnchorSideTop.Control = LCDDisplay
       AnchorSideTop.Side = asrCenter
       AnchorSideTop.Side = asrCenter
-      Left = 650
+      Left = 700
       Height = 100
       Height = 100
       Top = 50
       Top = 50
       Width = 100
       Width = 100
@@ -1775,7 +1917,6 @@ object frmMain: TfrmMain
       TabOrder = 3
       TabOrder = 3
       TabStop = False
       TabStop = False
       OnClick = BSelectorClick
       OnClick = BSelectorClick
-      TicksCount = 4
       DrawTicks = True
       DrawTicks = True
       Items.Strings = (
       Items.Strings = (
         'Item 1'
         'Item 1'
@@ -1792,7 +1933,7 @@ object frmMain: TfrmMain
       AnchorSideLeft.Side = asrBottom
       AnchorSideLeft.Side = asrBottom
       AnchorSideTop.Control = LCDDisplay
       AnchorSideTop.Control = LCDDisplay
       AnchorSideTop.Side = asrCenter
       AnchorSideTop.Side = asrCenter
-      Left = 750
+      Left = 800
       Height = 100
       Height = 100
       Top = 50
       Top = 50
       Width = 100
       Width = 100
@@ -1835,11 +1976,11 @@ object frmMain: TfrmMain
       OnColorChanged = cbtPanelColorColorChanged
       OnColorChanged = cbtPanelColorColorChanged
     end
     end
     object BQLED: TBCLeaQLED
     object BQLED: TBCLeaQLED
-      AnchorSideLeft.Control = BRingSlider
+      AnchorSideLeft.Control = BLED
       AnchorSideLeft.Side = asrBottom
       AnchorSideLeft.Side = asrBottom
       AnchorSideTop.Control = LCDDisplay
       AnchorSideTop.Control = LCDDisplay
       AnchorSideTop.Side = asrCenter
       AnchorSideTop.Side = asrCenter
-      Left = 850
+      Left = 650
       Height = 50
       Height = 50
       Top = 75
       Top = 75
       Width = 50
       Width = 50
@@ -1849,6 +1990,21 @@ object frmMain: TfrmMain
       OnChangeValue = BQLEDChangeValue
       OnChangeValue = BQLEDChangeValue
       Theme = BTheme
       Theme = BTheme
     end
     end
+    object BCLeaBoard: TBCLeaBoard
+      AnchorSideLeft.Control = BRingSlider
+      AnchorSideLeft.Side = asrBottom
+      AnchorSideTop.Control = LCDDisplay
+      AnchorSideTop.Side = asrCenter
+      Left = 900
+      Height = 150
+      Top = 25
+      Width = 200
+      TabOrder = 6
+      TabStop = False
+      OnClick = BCLeaBoardClick
+      BackgroundColor = clBtnFace
+      Theme = BTheme
+    end
   end
   end
   object MainMenu: TMainMenu
   object MainMenu: TMainMenu
     Left = 28
     Left = 28

+ 107 - 6
test/test_bclea/untThemeBuilder.pas

@@ -15,14 +15,15 @@ interface
 
 
 uses
 uses
   Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls,
   Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls,
-  Spin, Menus, ComCtrls, TypInfo, BCLeaLCDDisplay, BCLeaTheme,
-  BGRABitmapTypes, BCLeaTypes, BCLeaLED, BCLeaSelector, BCLeaRingSlider, BCLeaQLED;
+  Spin, Menus, ComCtrls, TypInfo, BCLeaLCDDisplay, BCLeaTheme, BGRABitmapTypes,
+  BCLeaTypes, BCLeaLED, BCLeaSelector, BCLeaRingSlider, BCLeaQLED, BCLeaBoard;
 
 
 type
 type
 
 
   { TfrmMain }
   { TfrmMain }
 
 
   TfrmMain = class(TForm)
   TfrmMain = class(TForm)
+    BCLeaBoard: TBCLeaBoard;
     BTheme: TBCLeaTheme;
     BTheme: TBCLeaTheme;
     Bevel1: TBevel;
     Bevel1: TBevel;
     BLEDZoom: TBCLeaLED;
     BLEDZoom: TBCLeaLED;
@@ -55,6 +56,9 @@ type
     cbtBRSPointerColor: TColorButton;
     cbtBRSPointerColor: TColorButton;
     cbtBRSLineBkgColor: TColorButton;
     cbtBRSLineBkgColor: TColorButton;
     cbtBRSLineColor: TColorButton;
     cbtBRSLineColor: TColorButton;
+    cbtBoardBkgColor: TColorButton;
+    cbtBoardBoard: TColorButton;
+    cbtBoardFrame: TColorButton;
     cbtQLEDBkgColor: TColorButton;
     cbtQLEDBkgColor: TColorButton;
     cbtLEDColorOff: TColorButton;
     cbtLEDColorOff: TColorButton;
     cbtLCDDotOnColor: TColorButton;
     cbtLCDDotOnColor: TColorButton;
@@ -80,6 +84,9 @@ type
     GroupBox8: TGroupBox;
     GroupBox8: TGroupBox;
     GroupBox9: TGroupBox;
     GroupBox9: TGroupBox;
     Label1: TLabel;
     Label1: TLabel;
+    lblBoardFrDistance: TLabel;
+    lblBoardFrAltitude: TLabel;
+    lblBoardFrRounding: TLabel;
     lblBRSAltitude: TLabel;
     lblBRSAltitude: TLabel;
     lblBSELFontHeight: TLabel;
     lblBSELFontHeight: TLabel;
     lblBRSFontHeight: TLabel;
     lblBRSFontHeight: TLabel;
@@ -96,8 +103,6 @@ type
     lblBSELTextFont: TLabel;
     lblBSELTextFont: TLabel;
     lblBRSTextFont: TLabel;
     lblBRSTextFont: TLabel;
     lblBRSWidth: TLabel;
     lblBRSWidth: TLabel;
-    lblLCDColorScheme: TLabel;
-    lblLCDCustomColors: TLabel;
     lblLCDDisplayCharCount: TLabel;
     lblLCDDisplayCharCount: TLabel;
     lblLCDDisplayLineCount: TLabel;
     lblLCDDisplayLineCount: TLabel;
     lblLCDDotsBlended: TLabel;
     lblLCDDotsBlended: TLabel;
@@ -106,6 +111,7 @@ type
     lblLCDFrameAltitude: TLabel;
     lblLCDFrameAltitude: TLabel;
     lblLCDFrameHeight: TLabel;
     lblLCDFrameHeight: TLabel;
     lblBSELAltitude: TLabel;
     lblBSELAltitude: TLabel;
+    lblBoardFrHeight: TLabel;
     lblQLEDAltitude: TLabel;
     lblQLEDAltitude: TLabel;
     lblQLEDRounding: TLabel;
     lblQLEDRounding: TLabel;
     lblLEDHeight: TLabel;
     lblLEDHeight: TLabel;
@@ -144,10 +150,15 @@ type
     rgBRSZStyle: TRadioGroup;
     rgBRSZStyle: TRadioGroup;
     rgLCDDotShape: TRadioGroup;
     rgLCDDotShape: TRadioGroup;
     rgLCDFrameStyle: TRadioGroup;
     rgLCDFrameStyle: TRadioGroup;
+    rgBoardFrameStyle: TRadioGroup;
+    rgBoardBoardStyle: TRadioGroup;
     rgLEDZStyle: TRadioGroup;
     rgLEDZStyle: TRadioGroup;
     rgBSELZStyle: TRadioGroup;
     rgBSELZStyle: TRadioGroup;
     rgQLEDZStyle: TRadioGroup;
     rgQLEDZStyle: TRadioGroup;
     SaveTheme: TMenuItem;
     SaveTheme: TMenuItem;
+    seBoardFrDistance: TSpinEdit;
+    seBoardFrAltitude: TSpinEdit;
+    seBoardFrRounding: TSpinEdit;
     seBRSAltitude: TSpinEdit;
     seBRSAltitude: TSpinEdit;
     seBSELFontHeigth: TSpinEdit;
     seBSELFontHeigth: TSpinEdit;
     seBRSFontHeigth: TSpinEdit;
     seBRSFontHeigth: TSpinEdit;
@@ -170,6 +181,7 @@ type
     seLCDFrameAltitude: TSpinEdit;
     seLCDFrameAltitude: TSpinEdit;
     seLCDFrameHeight: TSpinEdit;
     seLCDFrameHeight: TSpinEdit;
     seBSELAltitude: TSpinEdit;
     seBSELAltitude: TSpinEdit;
+    seBoardFrHeight: TSpinEdit;
     seQLEDAltitude: TSpinEdit;
     seQLEDAltitude: TSpinEdit;
     seQLEDRounding: TSpinEdit;
     seQLEDRounding: TSpinEdit;
     seLEDHeigth: TSpinEdit;
     seLEDHeigth: TSpinEdit;
@@ -206,11 +218,13 @@ type
     pnlProperties: TPanel;
     pnlProperties: TPanel;
     seLCDWidth: TSpinEdit;
     seLCDWidth: TSpinEdit;
     seLEDWidth: TSpinEdit;
     seLEDWidth: TSpinEdit;
+    tsBoard: TTabSheet;
     tsQLED: TTabSheet;
     tsQLED: TTabSheet;
     tsLCD: TTabSheet;
     tsLCD: TTabSheet;
     tsLED: TTabSheet;
     tsLED: TTabSheet;
     tsSelector: TTabSheet;
     tsSelector: TTabSheet;
     tsRingSlider: TTabSheet;
     tsRingSlider: TTabSheet;
+    procedure BCLeaBoardClick(Sender: TObject);
     procedure BThemeChange(Sender: TObject);
     procedure BThemeChange(Sender: TObject);
     procedure BLEDChangeValue(Sender: TObject);
     procedure BLEDChangeValue(Sender: TObject);
     procedure BLEDClick(Sender: TObject);
     procedure BLEDClick(Sender: TObject);
@@ -235,6 +249,9 @@ type
     procedure cbL_DiffSatChange(Sender: TObject);
     procedure cbL_DiffSatChange(Sender: TObject);
     procedure cbQLEDClickableChange(Sender: TObject);
     procedure cbQLEDClickableChange(Sender: TObject);
     procedure cbQLEDValueChange(Sender: TObject);
     procedure cbQLEDValueChange(Sender: TObject);
+    procedure cbtBoardBkgColorColorChanged(Sender: TObject);
+    procedure cbtBoardBoardColorChanged(Sender: TObject);
+    procedure cbtBoardFrameColorChanged(Sender: TObject);
     procedure cbtBRSBkgColorColorChanged(Sender: TObject);
     procedure cbtBRSBkgColorColorChanged(Sender: TObject);
     procedure cbtBRSFontColorColorChanged(Sender: TObject);
     procedure cbtBRSFontColorColorChanged(Sender: TObject);
     procedure cbtBRSFontShadowColorColorChanged(Sender: TObject);
     procedure cbtBRSFontShadowColorColorChanged(Sender: TObject);
@@ -266,6 +283,8 @@ type
     procedure LoadThemeClick(Sender: TObject);
     procedure LoadThemeClick(Sender: TObject);
     procedure mmLCDTextChange(Sender: TObject);
     procedure mmLCDTextChange(Sender: TObject);
     procedure QuitClick(Sender: TObject);
     procedure QuitClick(Sender: TObject);
+    procedure rgBoardBoardStyleClick(Sender: TObject);
+    procedure rgBoardFrameStyleClick(Sender: TObject);
     procedure rgBRSZStyleClick(Sender: TObject);
     procedure rgBRSZStyleClick(Sender: TObject);
     procedure rgLCDBoardShadowClick(Sender: TObject);
     procedure rgLCDBoardShadowClick(Sender: TObject);
     procedure rgBSELZStyleClick(Sender: TObject);
     procedure rgBSELZStyleClick(Sender: TObject);
@@ -274,6 +293,10 @@ type
     procedure rgLEDZStyleClick(Sender: TObject);
     procedure rgLEDZStyleClick(Sender: TObject);
     procedure rgQLEDZStyleClick(Sender: TObject);
     procedure rgQLEDZStyleClick(Sender: TObject);
     procedure SaveThemeClick(Sender: TObject);
     procedure SaveThemeClick(Sender: TObject);
+    procedure seBoardFrAltitudeChange(Sender: TObject);
+    procedure seBoardFrDistanceChange(Sender: TObject);
+    procedure seBoardFrHeightChange(Sender: TObject);
+    procedure seBoardFrRoundingChange(Sender: TObject);
     procedure seBRSAltitudeChange(Sender: TObject);
     procedure seBRSAltitudeChange(Sender: TObject);
     procedure seBRSFontHeigthChange(Sender: TObject);
     procedure seBRSFontHeigthChange(Sender: TObject);
     procedure seBRSHeigthChange(Sender: TObject);
     procedure seBRSHeigthChange(Sender: TObject);
@@ -342,6 +365,9 @@ implementation
 
 
 procedure TfrmMain.ApplyTheme;
 procedure TfrmMain.ApplyTheme;
 begin
 begin
+  pnlComponents.Color := BTheme.TestPanelColor;
+  cbtPanelColor.ButtonColor:=BTheme.TestPanelColor;
+  pnlComponents.Invalidate;
   LCDDisplay.ApplyTheme;
   LCDDisplay.ApplyTheme;
   BLEDZoom.ApplyTheme;
   BLEDZoom.ApplyTheme;
   BLED.ApplyTheme;
   BLED.ApplyTheme;
@@ -349,6 +375,7 @@ begin
   BSelector.ApplyTheme;
   BSelector.ApplyTheme;
   BRingSlider.ApplyTheme;
   BRingSlider.ApplyTheme;
   BQLED.ApplyTheme;
   BQLED.ApplyTheme;
+  BCLeaBoard.ApplyTheme;
 end;
 end;
 
 
 procedure TfrmMain.seQLEDAltitudeChange(Sender: TObject);
 procedure TfrmMain.seQLEDAltitudeChange(Sender: TObject);
@@ -495,7 +522,8 @@ begin
     LCDDisplay.LoadThemeFromFile(OpenDialog1.FileName);
     LCDDisplay.LoadThemeFromFile(OpenDialog1.FileName);
     ApplyTheme;
     ApplyTheme;
     ReRead;
     ReRead;
-    frmMain.Caption:= 'Theme Builder - ' + ExtractFileName(OpenDialog1.FileName);
+    frmMain.Caption := 'Theme Builder - ' + ExtractFileName(OpenDialog1.FileName);
+    SaveDialog1.FileName := OpenDialog1.FileName;
   end;
   end;
 end;
 end;
 
 
@@ -600,6 +628,16 @@ begin
   rgQLEDZStyle.ItemIndex := integer(BTheme.QLED_Style);
   rgQLEDZStyle.ItemIndex := integer(BTheme.QLED_Style);
   seQLEDAltitude.Value := BTheme.QLED_Altitude;
   seQLEDAltitude.Value := BTheme.QLED_Altitude;
   seQLEDRounding.Value := BTheme.QLED_Rounding;
   seQLEDRounding.Value := BTheme.QLED_Rounding;
+  //BCLeaBoard
+  cbtBoardFrame.ButtonColor := BTHeme.BRD_FrameColor;
+  cbtBoardBoard.ButtonColor := BTHeme.BRD_BoardColor;
+  cbtBoardBkgColor.ButtonColor := BTHeme.BRD_BkgColor;
+  seBoardFrHeight.Value := BTheme.BRD_FrameHeight;
+  seBoardFrDistance.Value := BTheme.BRD_FrameDistance;
+  seBoardFrRounding.Value := BTheme.BRD_Rounding;
+  seBoardFrAltitude.Value := BTheme.BRD_Altitude;
+  rgBoardFrameStyle.ItemIndex := integer(BTheme.BRD_FrameStyle);
+  rgBoardBoardStyle.ItemIndex := integer(BTheme.BRD_BoardStyle);
 end;
 end;
 
 
 procedure TfrmMain.cbLCDAutoSizeChange(Sender: TObject);
 procedure TfrmMain.cbLCDAutoSizeChange(Sender: TObject);
@@ -683,6 +721,11 @@ begin
   //ReRead;
   //ReRead;
 end;
 end;
 
 
+procedure TfrmMain.BCLeaBoardClick(Sender: TObject);
+begin
+  PageControl1.ActivePage := tsBoard;
+end;
+
 procedure TfrmMain.BLEDChangeValue(Sender: TObject);
 procedure TfrmMain.BLEDChangeValue(Sender: TObject);
 begin
 begin
   BLEDZoom.Value := BLED.Value;
   BLEDZoom.Value := BLED.Value;
@@ -741,6 +784,27 @@ begin
   BQLED.Value := cbQLEDValue.Checked;
   BQLED.Value := cbQLEDValue.Checked;
 end;
 end;
 
 
+procedure TfrmMain.cbtBoardBkgColorColorChanged(Sender: TObject);
+begin
+  BCLeaBoard.BackgroundColor := cbtBoardBkgColor.ButtonColor;
+  BTheme.BRD_BkgColor := cbtBoardBkgColor.ButtonColor;
+  BCLeaBoard.Invalidate;
+end;
+
+procedure TfrmMain.cbtBoardBoardColorChanged(Sender: TObject);
+begin
+  BCLeaBoard.BoardColor := cbtBoardBoard.ButtonColor;
+  BTheme.BRD_BoardColor := cbtBoardBoard.ButtonColor;
+  BCLeaBoard.Invalidate;
+end;
+
+procedure TfrmMain.cbtBoardFrameColorChanged(Sender: TObject);
+begin
+  BCLeaBoard.FrameColor := cbtBoardFrame.ButtonColor;
+  BTheme.BRD_FrameColor := cbtBoardFrame.ButtonColor;
+  BCLeaBoard.Invalidate;
+end;
+
 procedure TfrmMain.cbtBRSBkgColorColorChanged(Sender: TObject);
 procedure TfrmMain.cbtBRSBkgColorColorChanged(Sender: TObject);
 begin
 begin
   BRingSlider.BackgroundColor := cbtBRSBkgColor.ButtonColor;
   BRingSlider.BackgroundColor := cbtBRSBkgColor.ButtonColor;
@@ -846,6 +910,7 @@ end;
 procedure TfrmMain.cbtPanelColorColorChanged(Sender: TObject);
 procedure TfrmMain.cbtPanelColorColorChanged(Sender: TObject);
 begin
 begin
   pnlComponents.Color := cbtPanelColor.ButtonColor;
   pnlComponents.Color := cbtPanelColor.ButtonColor;
+  BTheme.TestPanelColor := cbtPanelColor.ButtonColor;
   pnlComponents.Invalidate;
   pnlComponents.Invalidate;
 end;
 end;
 
 
@@ -859,6 +924,18 @@ begin
   Close;
   Close;
 end;
 end;
 
 
+procedure TfrmMain.rgBoardBoardStyleClick(Sender: TObject);
+begin
+  BCLeaBoard.BoardStyle := TZStyle(rgBoardBoardStyle.ItemIndex);
+  BTheme.BRD_BoardStyle := TZStyle(rgBoardBoardStyle.ItemIndex);
+end;
+
+procedure TfrmMain.rgBoardFrameStyleClick(Sender: TObject);
+begin
+  BCLeaBoard.FrameStyle := TZStyle(rgBoardFrameStyle.ItemIndex);
+  BTheme.BRD_FrameStyle := TZStyle(rgBoardFrameStyle.ItemIndex);
+end;
+
 procedure TfrmMain.rgBRSZStyleClick(Sender: TObject);
 procedure TfrmMain.rgBRSZStyleClick(Sender: TObject);
 begin
 begin
   BRingSlider.Style := TZStyle(rgBRSZStyle.ItemIndex);
   BRingSlider.Style := TZStyle(rgBRSZStyle.ItemIndex);
@@ -909,10 +986,34 @@ begin
   begin
   begin
     LCDDisplay.UpdateTheme;
     LCDDisplay.UpdateTheme;
     LCDDisplay.SaveThemeToFile(SaveDialog1.FileName);
     LCDDisplay.SaveThemeToFile(SaveDialog1.FileName);
-    frmMain.Caption:= 'Theme Builder - ' + ExtractFileName(SaveDialog1.FileName);
+    frmMain.Caption := 'Theme Builder - ' + ExtractFileName(SaveDialog1.FileName);
   end;
   end;
 end;
 end;
 
 
+procedure TfrmMain.seBoardFrAltitudeChange(Sender: TObject);
+begin
+  BCLeaBoard.Altitude := seBoardFrAltitude.Value;
+  BTheme.BRD_Altitude := seBoardFrAltitude.Value;
+end;
+
+procedure TfrmMain.seBoardFrDistanceChange(Sender: TObject);
+begin
+  BCLeaBoard.FrameDistance := seBoardFrDistance.Value;
+  BTheme.BRD_FrameDistance := seBoardFrDistance.Value;
+end;
+
+procedure TfrmMain.seBoardFrHeightChange(Sender: TObject);
+begin
+  BCLeaBoard.FrameHeight := seBoardFrHeight.Value;
+  BTheme.BRD_FrameHeight := seBoardFrHeight.Value;
+end;
+
+procedure TfrmMain.seBoardFrRoundingChange(Sender: TObject);
+begin
+  BCLeaBoard.Rounding := seBoardFrRounding.Value;
+  BTheme.BRD_Rounding := seBoardFrRounding.Value;
+end;
+
 procedure TfrmMain.seBRSAltitudeChange(Sender: TObject);
 procedure TfrmMain.seBRSAltitudeChange(Sender: TObject);
 begin
 begin
   BRingSlider.Altitude := seBRSAltitude.Value;
   BRingSlider.Altitude := seBRSAltitude.Value;