ulayerstack.pas 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. // SPDX-License-Identifier: GPL-3.0-only
  2. unit ULayerstack;
  3. {$mode objfpc}{$H+}
  4. interface
  5. uses
  6. Classes, SysUtils, LResources, Forms, Controls, ExtCtrls, LazPaintType,
  7. ULayerStackInterface;
  8. type
  9. { TFLayerStack }
  10. TFLayerStack = class(TForm)
  11. LayerStackControl: TPanel;
  12. procedure FormCreate(Sender: TObject);
  13. procedure FormDestroy(Sender: TObject);
  14. procedure FormShow(Sender: TObject);
  15. private
  16. FStackInterface: TLayerStackInterface;
  17. { private declarations }
  18. function GetDarkTheme: boolean;
  19. function GetInterface: TLayerStackInterface;
  20. function GetZoomFactor: single;
  21. procedure SetDarkTheme(AValue: boolean);
  22. procedure CreateStackInterface;
  23. procedure SetZoomFactor(AValue: single);
  24. public
  25. LazPaintInstance: TLazPaintCustomInstance;
  26. { public declarations }
  27. procedure ScrollToItem(AIndex: integer; AUpdateStack: boolean = true);
  28. procedure AddButton(AAction: TBasicAction);
  29. procedure InvalidateStack(AScrollIntoView: boolean);
  30. property DarkTheme: boolean read GetDarkTheme write SetDarkTheme;
  31. property StackInterface: TLayerStackInterface read GetInterface;
  32. property ZoomFactor: single read GetZoomFactor write SetZoomFactor;
  33. end;
  34. var TFLayerStack_CustomDPI: integer = 96;
  35. implementation
  36. uses UDarkTheme, LCScaleDPI;
  37. { TFLayerStack }
  38. function TFLayerStack.GetDarkTheme: boolean;
  39. begin
  40. if Assigned(StackInterface) then
  41. result := StackInterface.DarkTheme
  42. else
  43. result := false;
  44. end;
  45. function TFLayerStack.GetInterface: TLayerStackInterface;
  46. begin
  47. CreateStackInterface;
  48. result := FStackInterface;
  49. end;
  50. function TFLayerStack.GetZoomFactor: single;
  51. begin
  52. if Assigned(FStackInterface) then
  53. result := FStackInterface.ZoomFactor;
  54. end;
  55. procedure TFLayerStack.FormCreate(Sender: TObject);
  56. begin
  57. Position := poDesigned;
  58. self.EnsureVisible(False);
  59. ClientWidth := DoScaleX(224, OriginalDPI, TFLayerStack_CustomDPI);
  60. ClientHeight := DoScaleX(300, OriginalDPI, TFLayerStack_CustomDPI);
  61. Constraints.MinWidth := ClientWidth div 2 + (Width - ClientWidth);
  62. Constraints.MinHeight := ClientHeight div 2 + (Height - ClientHeight);
  63. LayerStackControl.Width := ClientWidth;
  64. LayerStackControl.Height := ClientHeight;
  65. Visible := false;
  66. end;
  67. procedure TFLayerStack.FormDestroy(Sender: TObject);
  68. begin
  69. FreeAndNil(FStackInterface);
  70. end;
  71. procedure TFLayerStack.FormShow(Sender: TObject);
  72. begin
  73. CreateStackInterface;
  74. end;
  75. procedure TFLayerStack.ScrollToItem(AIndex: integer; AUpdateStack: boolean);
  76. begin
  77. if Assigned(StackInterface) then
  78. StackInterface.ScrollToItem(AIndex, AUpdateStack);
  79. end;
  80. procedure TFLayerStack.AddButton(AAction: TBasicAction);
  81. begin
  82. if Assigned(StackInterface) then
  83. StackInterface.AddButton(AAction);
  84. end;
  85. procedure TFLayerStack.InvalidateStack(AScrollIntoView: boolean);
  86. begin
  87. if Assigned(FStackInterface) then
  88. StackInterface.InvalidateStack(AScrollIntoView);
  89. end;
  90. procedure TFLayerStack.SetDarkTheme(AValue: boolean);
  91. begin
  92. DarkThemeInstance.Apply(self, AValue, False);
  93. if Assigned(StackInterface) then
  94. StackInterface.DarkTheme:= AValue;
  95. end;
  96. procedure TFLayerStack.CreateStackInterface;
  97. begin
  98. if (FStackInterface = nil) and Assigned(LazPaintInstance) then
  99. begin
  100. FStackInterface := TLayerStackInterface.Create(LayerStackControl, LazPaintInstance);
  101. FStackInterface.DPI := TFLayerStack_CustomDPI;
  102. end;
  103. end;
  104. procedure TFLayerStack.SetZoomFactor(AValue: single);
  105. begin
  106. if Assigned(StackInterface) then
  107. StackInterface.ZoomFactor := AValue;
  108. end;
  109. {$R *.lfm}
  110. end.