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