ulayerstack.pas 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  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. FLazPaintInstance: TLazPaintCustomInstance;
  18. { private declarations }
  19. function GetDarkTheme: boolean;
  20. function GetInterface: TLayerStackInterface;
  21. function GetZoomFactor: single;
  22. procedure SetDarkTheme(AValue: boolean);
  23. procedure CreateStackInterface;
  24. procedure SetLazPaintInstance(AValue: TLazPaintCustomInstance);
  25. procedure SetZoomFactor(AValue: single);
  26. procedure ThemeChanged(Sender: TObject);
  27. public
  28. { public declarations }
  29. procedure ScrollToItem(AIndex: integer; AUpdateStack: boolean = true);
  30. procedure AddButton(AAction: TBasicAction);
  31. procedure AddLayerMenu(AAction: TBasicAction);
  32. procedure InvalidateStack(AScrollIntoView: boolean);
  33. property DarkTheme: boolean read GetDarkTheme write SetDarkTheme;
  34. property StackInterface: TLayerStackInterface read GetInterface;
  35. property ZoomFactor: single read GetZoomFactor write SetZoomFactor;
  36. property LazPaintInstance: TLazPaintCustomInstance read FLazPaintInstance write SetLazPaintInstance;
  37. end;
  38. var TFLayerStack_CustomDPI: integer = 96;
  39. implementation
  40. uses UDarkTheme, LCScaleDPI;
  41. { TFLayerStack }
  42. function TFLayerStack.GetDarkTheme: boolean;
  43. begin
  44. if Assigned(StackInterface) then
  45. result := StackInterface.DarkTheme
  46. else
  47. result := false;
  48. end;
  49. function TFLayerStack.GetInterface: TLayerStackInterface;
  50. begin
  51. CreateStackInterface;
  52. result := FStackInterface;
  53. end;
  54. function TFLayerStack.GetZoomFactor: single;
  55. begin
  56. if Assigned(FStackInterface) then
  57. result := FStackInterface.ZoomFactor;
  58. end;
  59. procedure TFLayerStack.FormCreate(Sender: TObject);
  60. begin
  61. BorderStyle := ToolWindowSizeable;
  62. FormStyle := ToolWindowStyle;
  63. Position := poDesigned;
  64. self.EnsureVisible(False);
  65. ClientWidth := DoScaleX(224, OriginalDPI, TFLayerStack_CustomDPI);
  66. ClientHeight := DoScaleX(300, OriginalDPI, TFLayerStack_CustomDPI);
  67. Constraints.MinWidth := ClientWidth div 2 + (Width - ClientWidth);
  68. Constraints.MinHeight := ClientHeight div 2 + (Height - ClientHeight);
  69. LayerStackControl.Width := ClientWidth;
  70. LayerStackControl.Height := ClientHeight;
  71. Visible := false;
  72. end;
  73. procedure TFLayerStack.FormDestroy(Sender: TObject);
  74. begin
  75. if Assigned(LazPaintInstance) then
  76. LazPaintInstance.RegisterThemeListener(@ThemeChanged, false);
  77. FreeAndNil(FStackInterface);
  78. end;
  79. procedure TFLayerStack.FormShow(Sender: TObject);
  80. begin
  81. EnsureVisible(False);
  82. CreateStackInterface;
  83. end;
  84. procedure TFLayerStack.ScrollToItem(AIndex: integer; AUpdateStack: boolean);
  85. begin
  86. if Assigned(StackInterface) then
  87. StackInterface.ScrollToItem(AIndex, AUpdateStack);
  88. end;
  89. procedure TFLayerStack.AddButton(AAction: TBasicAction);
  90. begin
  91. if Assigned(StackInterface) then
  92. StackInterface.AddButton(AAction);
  93. end;
  94. procedure TFLayerStack.AddLayerMenu(AAction: TBasicAction);
  95. begin
  96. if Assigned(StackInterface) then
  97. StackInterface.AddLayerMenu(AAction);
  98. end;
  99. procedure TFLayerStack.InvalidateStack(AScrollIntoView: boolean);
  100. begin
  101. if Assigned(FStackInterface) then
  102. StackInterface.InvalidateStack(AScrollIntoView);
  103. end;
  104. procedure TFLayerStack.SetDarkTheme(AValue: boolean);
  105. begin
  106. DarkThemeInstance.Apply(self, AValue, False);
  107. if Assigned(StackInterface) then
  108. StackInterface.DarkTheme:= AValue;
  109. end;
  110. procedure TFLayerStack.CreateStackInterface;
  111. begin
  112. if (FStackInterface = nil) and Assigned(LazPaintInstance) then
  113. begin
  114. FStackInterface := TLayerStackInterface.Create(LayerStackControl, LazPaintInstance);
  115. FStackInterface.DPI := TFLayerStack_CustomDPI;
  116. end;
  117. end;
  118. procedure TFLayerStack.SetLazPaintInstance(AValue: TLazPaintCustomInstance);
  119. begin
  120. if FLazPaintInstance=AValue then Exit;
  121. if Assigned(FLazPaintInstance) then FLazPaintInstance.RegisterThemeListener(@ThemeChanged, false);
  122. FLazPaintInstance:=AValue;
  123. if Assigned(FLazPaintInstance) then FLazPaintInstance.RegisterThemeListener(@ThemeChanged, true);
  124. end;
  125. procedure TFLayerStack.SetZoomFactor(AValue: single);
  126. begin
  127. if Assigned(StackInterface) then
  128. StackInterface.ZoomFactor := AValue;
  129. end;
  130. procedure TFLayerStack.ThemeChanged(Sender: TObject);
  131. begin
  132. DarkTheme := LazPaintInstance.DarkTheme;
  133. end;
  134. {$R *.lfm}
  135. end.