source: branches/highdpi/LocalPlayer/TechTree.pas

Last change on this file was 467, checked in by chronos, 5 months ago
  • Modified: DpiControls unit split into multiple units according to their LCL names.
File size: 6.8 KB
Line 
1{$INCLUDE Switches.inc}
2unit TechTree;
3
4interface
5
6uses
7 Dpi.Graphics, Dpi.Forms,
8 ScreenTools, LCLIntf, LCLType, SysUtils, Classes, Graphics,
9 Controls, Forms, ButtonB, DrawDlg;
10
11type
12
13 { TTechTreeDlg }
14
15 TTechTreeDlg = class(TDrawDlg)
16 CloseBtn: TButtonB;
17 procedure FormCreate(Sender: TObject);
18 procedure FormDestroy(Sender: TObject);
19 procedure FormPaint(Sender: TObject);
20 procedure FormShow(Sender: TObject);
21 procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
22 Shift: TShiftState; X, Y: Integer);
23 procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
24 Shift: TShiftState; X, Y: Integer);
25 procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
26 procedure CloseBtnClick(Sender: TObject);
27 private
28 xOffset, yOffset, xDown, yDown: Integer;
29 Image: TDpiBitmap;
30 Dragging: Boolean;
31 end;
32
33
34implementation
35
36uses
37 Directories;
38
39{$R *.lfm}
40
41const
42 BlackBorder = 4;
43 LeftBorder = 72;
44 RightBorder = 45;
45 TopBorder = 16;
46 BottomBorder = 48;
47 xStart = 0;
48 yStart = 40;
49 xPitch = 160;
50 yPitch = 90;
51 xLegend = 44;
52 yLegend = 79;
53 yLegendPitch = 32;
54
55function Min(A, B: Integer): Integer;
56begin
57 if A < B then
58 Result := A
59 else
60 Result := B;
61end;
62
63function Max(A, B: Integer): Integer;
64begin
65 if A > B then
66 Result := A
67 else
68 Result := B;
69end;
70
71procedure TTechTreeDlg.FormCreate(Sender: TObject);
72begin
73 InitButtons;
74 Image := nil;
75end;
76
77procedure TTechTreeDlg.FormDestroy(Sender: TObject);
78begin
79 FreeAndNil(Image);
80end;
81
82procedure TTechTreeDlg.FormPaint(Sender: TObject);
83var
84 X, W: Integer;
85begin
86 with Canvas do begin
87 // black border
88 Brush.Color := $000000;
89 FillRect(rect(0, 0, BlackBorder, ClientHeight));
90 FillRect(rect(BlackBorder, 0, ClientWidth - BlackBorder, BlackBorder));
91 FillRect(rect(ClientWidth - BlackBorder, 0, ClientWidth, ClientHeight));
92 FillRect(rect(BlackBorder, ClientHeight - BlackBorder,
93 ClientWidth - BlackBorder, ClientHeight));
94
95 // texturize empty space
96 Brush.Color := $FFFFFF;
97 if xOffset > 0 then
98 FillRectSeamless(Canvas, BlackBorder, BlackBorder, BlackBorder + xOffset,
99 ClientHeight - BlackBorder, -BlackBorder - xOffset,
100 -BlackBorder - yOffset, Paper);
101 if xOffset + Image.width < ClientWidth - 2 * BlackBorder then
102 FillRectSeamless(Canvas, BlackBorder + xOffset + Image.width, BlackBorder,
103 ClientWidth - BlackBorder, ClientHeight - BlackBorder,
104 -BlackBorder - xOffset, -BlackBorder - yOffset, Paper);
105 X := Max(BlackBorder, BlackBorder + xOffset);
106 W := Min(BlackBorder + xOffset + Image.width, ClientWidth - BlackBorder);
107 if yOffset > 0 then
108 FillRectSeamless(Canvas, X, BlackBorder, W, BlackBorder + yOffset,
109 -BlackBorder - xOffset, -BlackBorder - yOffset, Paper);
110 if yOffset + Image.height < ClientHeight - 2 * BlackBorder then
111 FillRectSeamless(Canvas, X, BlackBorder + yOffset + Image.height, W,
112 ClientHeight - BlackBorder, -BlackBorder - xOffset,
113 -BlackBorder - yOffset, Paper);
114 end;
115 DpiBitBltCanvas(Canvas, Max(BlackBorder, BlackBorder + xOffset),
116 Max(BlackBorder, BlackBorder + yOffset),
117 Min(Image.width, Min(Image.width + xOffset,
118 Min(ClientWidth - 2 * BlackBorder, ClientWidth - 2 * BlackBorder - xOffset))
119 ), Min(Image.height, Min(Image.height + yOffset,
120 Min(ClientHeight - 2 * BlackBorder, ClientHeight - 2 * BlackBorder -
121 yOffset))), Image.Canvas, Max(0, -xOffset),
122 Max(0, -yOffset));
123end;
124
125procedure TTechTreeDlg.FormShow(Sender: TObject);
126var
127 X, Y, ad: Integer;
128 S: string;
129 NewWidth: Integer;
130 NewHeight: Integer;
131begin
132 Caption := Phrases2.Lookup('MENU_ADVTREE');
133 if Image = nil then begin
134 Image := TDpiBitmap.Create;
135 Image.PixelFormat := pf24bit;
136 LoadGraphicFile(Image, HomeDir + 'Help' + DirectorySeparator + 'AdvTree.png',
137 [gfNoGamma]);
138
139 with Image.Canvas do begin
140 // Write advance names
141 Font.Assign(UniFont[ftSmall]);
142 Font.Color := clBlack;
143 Brush.Style := bsClear;
144 for X := 0 to (Image.Width - xStart) div xPitch do
145 for Y := 0 to (Image.Height - yStart) div yPitch do
146 begin
147 ad := Pixels[xStart + X * xPitch + 10, yStart + Y * yPitch - 1];
148 if ad and $FFFF00 = 0 then
149 begin
150 S := Phrases.Lookup('ADVANCES', ad);
151 while TextWidth(S) > 112 do
152 Delete(S, Length(S), 1);
153 TextOut(xStart + X * xPitch + 2, yStart + Y * yPitch, S);
154 Pixels[xStart + X * xPitch + 10, yStart + Y * yPitch - 1]
155 := TransparentColor2;
156 end;
157 end;
158
159 // Write legend
160 TextOut(xLegend, yLegend, Phrases2.Lookup('ADVTREE_UP0'));
161 TextOut(xLegend, yLegend + yLegendPitch, Phrases2.Lookup('ADVTREE_UP1'));
162 TextOut(xLegend, yLegend + 2 * yLegendPitch,
163 Phrases2.Lookup('ADVTREE_UP2'));
164 TextOut(xLegend, yLegend + 3 * yLegendPitch,
165 Phrases2.Lookup('ADVTREE_GOV'));
166 TextOut(xLegend, yLegend + 4 * yLegendPitch,
167 Phrases2.Lookup('ADVTREE_OTHER'));
168 end;
169
170 Texturize(Image, Paper, TransparentColor2);
171 end;
172
173 // Fit window to image, center image in window, center window to screen
174 NewWidth := Min(DpiScreen.Width - 40, Image.Width + LeftBorder + RightBorder + 2 * BlackBorder);
175 NewHeight := Min(DpiScreen.Height - 40, Image.Height + TopBorder + BottomBorder + 2 * BlackBorder);
176 BoundsRect := Bounds((DpiScreen.Width - NewWidth) div 2,
177 (DpiScreen.Height - NewHeight) div 2,
178 NewWidth, NewHeight);
179 CloseBtn.Left := width - CloseBtn.width - BlackBorder - 8;
180 CloseBtn.Top := BlackBorder + 8;
181 xOffset := (ClientWidth - Image.Width + LeftBorder - RightBorder) div 2 -
182 BlackBorder;
183 yOffset := ClientHeight - 2 * BlackBorder - Image.Height - BottomBorder;
184end;
185
186procedure TTechTreeDlg.FormMouseDown(Sender: TObject; Button: TMouseButton;
187 Shift: TShiftState; X, Y: Integer);
188begin
189 if Button = mbLeft then
190 begin
191 Dragging := True;
192 xDown := X;
193 yDown := Y;
194 end;
195end;
196
197procedure TTechTreeDlg.FormMouseUp(Sender: TObject; Button: TMouseButton;
198 Shift: TShiftState; X, Y: Integer);
199begin
200 Dragging := False;
201end;
202
203procedure TTechTreeDlg.FormMouseMove(Sender: TObject; Shift: TShiftState;
204 X, Y: Integer);
205begin
206 if Dragging then
207 begin
208 xOffset := xOffset + X - xDown;
209 yOffset := yOffset + Y - yDown;
210 xDown := X;
211 yDown := Y;
212
213 if xOffset > LeftBorder then
214 xOffset := LeftBorder;
215 if xOffset < ClientWidth - 2 * BlackBorder - Image.width - RightBorder then
216 xOffset := ClientWidth - 2 * BlackBorder - Image.width - RightBorder;
217 if yOffset > TopBorder then
218 yOffset := TopBorder;
219 if yOffset < ClientHeight - 2 * BlackBorder - Image.height - BottomBorder
220 then
221 yOffset := ClientHeight - 2 * BlackBorder - Image.height - BottomBorder;
222
223 SmartInvalidate;
224 end;
225end;
226
227procedure TTechTreeDlg.CloseBtnClick(Sender: TObject);
228begin
229 Close;
230end;
231
232end.
Note: See TracBrowser for help on using the repository browser.