1 // SPDX-License-Identifier: GPL-3.0-only
2 unit ULayerstack;
3 
4 {$mode objfpc}{$H+}
5 
6 interface
7 
8 uses
9   Classes, SysUtils, LResources, Forms, Controls, ExtCtrls, LazPaintType,
10   ULayerStackInterface;
11 
12 type
13   { TFLayerStack }
14 
15   TFLayerStack = class(TForm)
16     LayerStackControl: TPanel;
17     procedure FormCreate(Sender: TObject);
18     procedure FormDestroy(Sender: TObject);
19     procedure FormShow(Sender: TObject);
20   private
21     FStackInterface: TLayerStackInterface;
22     FLazPaintInstance: TLazPaintCustomInstance;
23     { private declarations }
GetDarkThemenull24     function GetDarkTheme: boolean;
GetInterfacenull25     function GetInterface: TLayerStackInterface;
GetZoomFactornull26     function GetZoomFactor: single;
27     procedure SetDarkTheme(AValue: boolean);
28     procedure CreateStackInterface;
29     procedure SetLazPaintInstance(AValue: TLazPaintCustomInstance);
30     procedure SetZoomFactor(AValue: single);
31     procedure ThemeChanged(Sender: TObject);
32   public
33     { public declarations }
34     procedure ScrollToItem(AIndex: integer; AUpdateStack: boolean = true);
35     procedure AddButton(AAction: TBasicAction);
36     procedure AddLayerMenu(AAction: TBasicAction);
37     procedure InvalidateStack(AScrollIntoView: boolean);
38     property DarkTheme: boolean read GetDarkTheme write SetDarkTheme;
39     property StackInterface: TLayerStackInterface read GetInterface;
40     property ZoomFactor: single read GetZoomFactor write SetZoomFactor;
41     property LazPaintInstance: TLazPaintCustomInstance read FLazPaintInstance write SetLazPaintInstance;
42   end;
43 
44 var TFLayerStack_CustomDPI: integer = 96;
45 
46 implementation
47 
48 uses UDarkTheme, LCScaleDPI;
49 
50 { TFLayerStack }
51 
TFLayerStack.GetDarkThemenull52 function TFLayerStack.GetDarkTheme: boolean;
53 begin
54   if Assigned(StackInterface) then
55     result := StackInterface.DarkTheme
56   else
57     result := false;
58 end;
59 
TFLayerStack.GetInterfacenull60 function TFLayerStack.GetInterface: TLayerStackInterface;
61 begin
62   CreateStackInterface;
63   result := FStackInterface;
64 end;
65 
TFLayerStack.GetZoomFactornull66 function TFLayerStack.GetZoomFactor: single;
67 begin
68   if Assigned(FStackInterface) then
69     result := FStackInterface.ZoomFactor;
70 end;
71 
72 procedure TFLayerStack.FormCreate(Sender: TObject);
73 begin
74   BorderStyle := ToolWindowSizeable;
75   FormStyle := ToolWindowStyle;
76   Position := poDesigned;
77   self.EnsureVisible(False);
78   ClientWidth := DoScaleX(224, OriginalDPI, TFLayerStack_CustomDPI);
79   ClientHeight := DoScaleX(300, OriginalDPI, TFLayerStack_CustomDPI);
80   Constraints.MinWidth := ClientWidth div 2 + (Width - ClientWidth);
81   Constraints.MinHeight := ClientHeight div 2 + (Height - ClientHeight);
82   LayerStackControl.Width := ClientWidth;
83   LayerStackControl.Height := ClientHeight;
84   Visible := false;
85 end;
86 
87 procedure TFLayerStack.FormDestroy(Sender: TObject);
88 begin
89   if Assigned(LazPaintInstance) then
90     LazPaintInstance.RegisterThemeListener(@ThemeChanged, false);
91   FreeAndNil(FStackInterface);
92 end;
93 
94 procedure TFLayerStack.FormShow(Sender: TObject);
95 begin
96   CreateStackInterface;
97 end;
98 
99 procedure TFLayerStack.ScrollToItem(AIndex: integer; AUpdateStack: boolean);
100 begin
101   if Assigned(StackInterface) then
102     StackInterface.ScrollToItem(AIndex, AUpdateStack);
103 end;
104 
105 procedure TFLayerStack.AddButton(AAction: TBasicAction);
106 begin
107   if Assigned(StackInterface) then
108     StackInterface.AddButton(AAction);
109 end;
110 
111 procedure TFLayerStack.AddLayerMenu(AAction: TBasicAction);
112 begin
113   if Assigned(StackInterface) then
114     StackInterface.AddLayerMenu(AAction);
115 end;
116 
117 procedure TFLayerStack.InvalidateStack(AScrollIntoView: boolean);
118 begin
119   if Assigned(FStackInterface) then
120     StackInterface.InvalidateStack(AScrollIntoView);
121 end;
122 
123 procedure TFLayerStack.SetDarkTheme(AValue: boolean);
124 begin
125   DarkThemeInstance.Apply(self, AValue, False);
126   if Assigned(StackInterface) then
127     StackInterface.DarkTheme:= AValue;
128 end;
129 
130 procedure TFLayerStack.CreateStackInterface;
131 begin
132   if (FStackInterface = nil) and Assigned(LazPaintInstance) then
133   begin
134     FStackInterface := TLayerStackInterface.Create(LayerStackControl, LazPaintInstance);
135     FStackInterface.DPI := TFLayerStack_CustomDPI;
136   end;
137 end;
138 
139 procedure TFLayerStack.SetLazPaintInstance(AValue: TLazPaintCustomInstance);
140 begin
141   if FLazPaintInstance=AValue then Exit;
142   if Assigned(FLazPaintInstance) then FLazPaintInstance.RegisterThemeListener(@ThemeChanged, false);
143   FLazPaintInstance:=AValue;
144   if Assigned(FLazPaintInstance) then FLazPaintInstance.RegisterThemeListener(@ThemeChanged, true);
145 end;
146 
147 procedure TFLayerStack.SetZoomFactor(AValue: single);
148 begin
149   if Assigned(StackInterface) then
150     StackInterface.ZoomFactor := AValue;
151 end;
152 
153 procedure TFLayerStack.ThemeChanged(Sender: TObject);
154 begin
155   DarkTheme := LazPaintInstance.DarkTheme;
156 end;
157 
158 {$R *.lfm}
159 
160 end.
161 
162