source: trunk/Settings.pas

Last change on this file was 524, checked in by chronos, 3 months ago
  • Fixed: Reset custom DPI settings in Settings dialog by clicking on Defaults button.
File size: 12.1 KB
Line 
1unit Settings;
2
3interface
4
5uses
6 Classes, SysUtils, FileUtil, Dialogs, LCLProc, ScreenTools, Messg, ButtonA,
7 Directories, DrawDlg, ButtonC, KeyBindings, Languages,
8 {$IFDEF DPI}Dpi.Forms, Dpi.Controls, Dpi.Graphics, Dpi.StdCtrls, System.UITypes{$ELSE}
9 Forms, Controls, Graphics, StdCtrls{$ENDIF};
10
11type
12 { TSettingsDlg }
13
14 TSettingsDlg = class(TDrawDlg)
15 ButtonFullscreen: TButtonC;
16 ButtonCustomDpi: TButtonC;
17 ButtonGammaDown: TButtonC;
18 ButtonDpiDown: TButtonC;
19 EditShortCutPrimary: TEdit;
20 EditShortCutSecondary: TEdit;
21 ListLanguages: TListBox;
22 ListKeyBindings: TListBox;
23 ButtonOk: TButtonA;
24 ButtonCancel: TButtonA;
25 ButtonReset: TButtonA;
26 ButtonGammaUp: TButtonC;
27 ButtonDpiUp: TButtonC;
28 procedure ButtonCustomDpiClick(Sender: TObject);
29 procedure ButtonDpiDownClick(Sender: TObject);
30 procedure ButtonDpiUpClick(Sender: TObject);
31 procedure ButtonFullscreenClick(Sender: TObject);
32 procedure ButtonCancelClick(Sender: TObject);
33 procedure ButtonResetClick(Sender: TObject);
34 procedure ButtonGammaDownClick(Sender: TObject);
35 procedure EditShortCutPrimaryKeyUp(Sender: TObject; var Key: Word;
36 Shift: TShiftState);
37 procedure EditShortCutSecondaryKeyUp(Sender: TObject; var Key: Word;
38 Shift: TShiftState);
39 procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
40 procedure FormCreate(Sender: TObject);
41 procedure FormDestroy(Sender: TObject);
42 procedure FormPaint(Sender: TObject);
43 procedure FormShow(Sender: TObject);
44 procedure ListKeyBindingsSelectionChange(Sender: TObject; User: Boolean);
45 procedure ButtonOkClick(Sender: TObject);
46 procedure ButtonGammaUpClick(Sender: TObject);
47 private
48 LocalGamma: Integer;
49 LocalKeyBindings: TKeyBindings;
50 CurrentKeyBinding: TKeyBinding;
51 LocalDpi: Integer;
52 procedure UpdateShortCutItem;
53 function GetLocalCustomDpiEnabled: Boolean;
54 procedure UpdateInterface;
55 public
56 procedure LoadData;
57 procedure SaveData;
58 end;
59
60var
61 SettingsDlg: TSettingsDlg;
62
63const
64 DpiMin = 100;
65 DpiMax = 500;
66 DpiStep = 25;
67
68
69implementation
70
71{$R *.lfm}
72
73uses
74 Start;
75
76var
77 SFullScreen, SGamma, SRestartMsg, SShortCutPrimary, SShortCutSecondary,
78 SLanguages, SKeyBindings, SCustomDpi, SDpi: string;
79
80procedure ReloadLanguages;
81begin
82 SFullScreen := Phrases.Lookup('SETTINGS', 0);
83 SGamma := Phrases.Lookup('SETTINGS', 1);
84 SRestartMsg := Phrases.Lookup('SETTINGS', 2);
85 SShortCutPrimary := Phrases.Lookup('SETTINGS', 3);
86 SShortCutSecondary := Phrases.Lookup('SETTINGS', 4);
87 SLanguages := Phrases.Lookup('SETTINGS', 5);
88 SKeyBindings := Phrases.Lookup('SETTINGS', 6);
89 SCustomDpi := Phrases.Lookup('SETTINGS', 7);
90 SDpi := Phrases.Lookup('SETTINGS', 8);
91end;
92
93{ TSettingsDlg }
94
95procedure TSettingsDlg.FormCreate(Sender: TObject);
96begin
97 Color := clBlack;
98 LocalKeyBindings := TKeyBindings.Create;
99
100 Canvas.Font.Assign(UniFont[ftNormal]);
101 Canvas.Brush.Style := TBrushStyle.bsClear;
102
103 ButtonOk.Caption := Phrases.Lookup('BTN_OK');
104 ButtonCancel.Caption := Phrases.Lookup('BTN_CANCEL');
105 ButtonReset.Caption := Phrases.Lookup('BTN_RESET');
106 InitButtons;
107end;
108
109procedure TSettingsDlg.ButtonCancelClick(Sender: TObject);
110begin
111 ModalResult := mrCancel;
112end;
113
114procedure TSettingsDlg.ButtonResetClick(Sender: TObject);
115begin
116 // TODO: Better to have default values on single place
117 ListLanguages.ItemIndex := 0;
118 ButtonFullscreen.ButtonIndex := 3;
119 ButtonCustomDpi.ButtonIndex := 2;
120 LocalDpi := 100;
121 LocalGamma := 100;
122 ListKeyBindings.ItemIndex := -1;
123 ListKeyBindingsSelectionChange(nil, False);
124 LocalKeyBindings.ResetToDefault;
125 LocalKeyBindings.LoadToStrings(ListKeyBindings.Items);
126 UpdateInterface;
127 Repaint;
128end;
129
130procedure TSettingsDlg.ButtonGammaDownClick(Sender: TObject);
131begin
132 if LocalGamma > 50 then
133 begin
134 Dec(LocalGamma);
135 Invalidate;
136 end;
137end;
138
139procedure TSettingsDlg.EditShortCutPrimaryKeyUp(Sender: TObject; var Key: Word;
140 Shift: TShiftState);
141begin
142 if (Sender is TEdit) and Assigned(CurrentKeyBinding) and not (Key in [16..18]) then begin
143 CurrentKeyBinding.ShortCut := Key or
144 (scShift * Integer(ssShift in Shift)) or
145 (scCtrl * Integer(ssCtrl in Shift)) or
146 (scAlt * Integer(ssAlt in Shift));
147 EditShortCutPrimary.Text := ShortCutToText(CurrentKeyBinding.ShortCut);
148 Key := 0;
149 UpdateShortCutItem;
150 end;
151end;
152
153procedure TSettingsDlg.EditShortCutSecondaryKeyUp(Sender: TObject;
154 var Key: Word; Shift: TShiftState);
155begin
156 if (Sender is TEdit) and Assigned(CurrentKeyBinding) and not (Key in [16..18]) then begin
157 CurrentKeyBinding.ShortCut2 := Key or
158 (scShift * Integer(ssShift in Shift)) or
159 (scCtrl * Integer(ssCtrl in Shift)) or
160 (scAlt * Integer(ssAlt in Shift));
161 EditShortCutSecondary.Text := ShortCutToText(CurrentKeyBinding.ShortCut2);
162 Key := 0;
163 UpdateShortCutItem;
164 end;
165end;
166
167procedure TSettingsDlg.FormClose(Sender: TObject; var CloseAction: TCloseAction
168 );
169begin
170 ListKeyBindings.ItemIndex := -1;
171end;
172
173procedure TSettingsDlg.ButtonFullscreenClick(Sender: TObject);
174begin
175 ButtonFullscreen.ButtonIndex := ButtonFullscreen.ButtonIndex xor 1;
176end;
177
178procedure TSettingsDlg.ButtonDpiDownClick(Sender: TObject);
179begin
180 Dec(LocalDpi, DpiStep);
181 if LocalDpi < DpiMin then LocalDpi := DpiMin;
182 Invalidate;
183end;
184
185procedure TSettingsDlg.ButtonCustomDpiClick(Sender: TObject);
186begin
187 ButtonCustomDpi.ButtonIndex := ButtonCustomDpi.ButtonIndex xor 1;
188 UpdateInterface;
189end;
190
191procedure TSettingsDlg.ButtonDpiUpClick(Sender: TObject);
192begin
193 Inc(LocalDpi, DpiStep);
194 if LocalDpi > DpiMax then LocalDpi := DpiMax;
195 Invalidate;
196end;
197
198procedure TSettingsDlg.FormDestroy(Sender: TObject);
199begin
200 FreeAndNil(LocalKeyBindings);
201end;
202
203procedure TSettingsDlg.FormPaint(Sender: TObject);
204begin
205 PaintBackground(Self, 3, 3, ClientWidth - 6, ClientHeight - 6);
206 Frame(Canvas, 0, 0, ClientWidth - 1, ClientHeight - 1, 0, 0);
207 Frame(Canvas, 1, 1, ClientWidth - 2, ClientHeight - 2,
208 MainTexture.ColorBevelLight, MainTexture.ColorBevelShade);
209 Frame(Canvas, 2, 2, ClientWidth - 3, ClientHeight - 3,
210 MainTexture.ColorBevelLight, MainTexture.ColorBevelShade);
211 EditFrame(Canvas, EditShortCutPrimary.BoundsRect, MainTexture);
212 EditFrame(Canvas, EditShortCutSecondary.BoundsRect, MainTexture);
213 EditFrame(Canvas, ListLanguages.BoundsRect, MainTexture);
214 BtnFrame(Canvas, ButtonOk.BoundsRect, MainTexture);
215 BtnFrame(Canvas, ButtonCancel.BoundsRect, MainTexture);
216
217 RFrame(Canvas, ButtonFullscreen.Left - 1, ButtonFullscreen.Top - 1,
218 ButtonFullscreen.Left + 12, ButtonFullscreen.Top + 12, MainTexture.ColorBevelShade,
219 MainTexture.ColorBevelLight);
220 {$IFDEF DPI}
221 RFrame(Canvas, ButtonCustomDpi.Left - 1, ButtonCustomDpi.Top - 1,
222 ButtonCustomDpi.Left + 12, ButtonCustomDpi.Top + 12, MainTexture.ColorBevelShade,
223 MainTexture.ColorBevelLight);
224 LoweredTextOut(Canvas, -2, MainTexture, ButtonCustomDpi.Left + 32,
225 ButtonCustomDpi.Top - 4, SCustomDpi);
226 UnderlinedTitleValue(Canvas, SDpi, IntToStr(LocalDpi) + '%',
227 ButtonDpiUp.Left - 150 - 4, ButtonDpiUp.Top + 2, 150);
228 {$ENDIF}
229
230 LoweredTextOut(Canvas, -2, MainTexture, ListLanguages.Left,
231 ListLanguages.Top - 26, SLanguages);
232 LoweredTextOut(Canvas, -2, MainTexture, ListKeyBindings.Left,
233 ListKeyBindings.Top - 26, SKeyBindings);
234 LoweredTextOut(Canvas, -2, MainTexture, ButtonFullscreen.Left + 32,
235 ButtonFullscreen.Top - 4, SFullScreen);
236 UnderlinedTitleValue(Canvas, SGamma, IntToStr(LocalGamma) + '%',
237 ButtonGammaUp.Left - 150 - 4, ButtonGammaUp.Top + 2, 150);
238 LoweredTextOut(Canvas, -2, MainTexture, EditShortCutPrimary.Left,
239 EditShortCutPrimary.Top - 26, SShortCutPrimary);
240 LoweredTextOut(Canvas, -2, MainTexture, EditShortCutSecondary.Left,
241 EditShortCutSecondary.Top - 26, SShortCutSecondary);
242end;
243
244procedure TSettingsDlg.FormShow(Sender: TObject);
245begin
246 Caption := Phrases2.Lookup('ACTIONHEADER_CONFIG');
247 ReloadLanguages;
248 StartDlg.Translator.LanguageListToStrings(ListLanguages.Items);
249 ListLanguages.Font.Color := MainTexture.ColorMark;
250 ListKeyBindings.Font.Color := MainTexture.ColorMark;
251 LoadData;
252 LocalKeyBindings.LoadToStrings(ListKeyBindings.Items);
253 EditShortCutPrimary.Font.Color := MainTexture.ColorMark;
254 EditShortCutSecondary.Font.Color := MainTexture.ColorMark;
255 {$IFDEF DPI}
256 ButtonCustomDpi.Visible := True;
257 ButtonDpiDown.Visible := True;
258 ButtonDpiUp.Visible := True;
259 {$ELSE}
260 ButtonCustomDpi.Visible := False;
261 ButtonDpiDown.Visible := False;
262 ButtonDpiUp.Visible := False;
263 {$ENDIF}
264 UpdateInterface;
265end;
266
267procedure TSettingsDlg.ListKeyBindingsSelectionChange(Sender: TObject;
268 User: Boolean);
269begin
270 if Assigned(CurrentKeyBinding) then begin
271 CurrentKeyBinding.ShortCut := TextToShortCut(EditShortCutPrimary.Text);
272 CurrentKeyBinding.ShortCut2 := TextToShortCut(EditShortCutSecondary.Text);
273 end;
274
275 if ListKeyBindings.ItemIndex >= 0 then
276 CurrentKeyBinding := LocalKeyBindings[ListKeyBindings.ItemIndex]
277 else CurrentKeyBinding := nil;
278
279 if Assigned(CurrentKeyBinding) then begin
280 if CurrentKeyBinding.ShortCut <> 0 then
281 EditShortCutPrimary.Text := ShortCutToText(CurrentKeyBinding.ShortCut)
282 else EditShortCutPrimary.Text := '';
283 EditShortCutPrimary.Enabled := True;
284 if CurrentKeyBinding.ShortCut2 <> 0 then
285 EditShortCutSecondary.Text := ShortCutToText(CurrentKeyBinding.ShortCut2)
286 else EditShortCutSecondary.Text := '';
287 EditShortCutSecondary.Enabled := True;
288 end else begin
289 EditShortCutPrimary.Text := '';
290 EditShortCutPrimary.Enabled := False;
291 EditShortCutSecondary.Text := '';
292 EditShortCutSecondary.Enabled := False;
293 end;
294end;
295
296procedure TSettingsDlg.ButtonOkClick(Sender: TObject);
297begin
298 SaveData;
299 ModalResult := mrOk;
300end;
301
302procedure TSettingsDlg.ButtonGammaUpClick(Sender: TObject);
303begin
304 if LocalGamma < 150 then begin
305 Inc(LocalGamma);
306 Invalidate;
307 end;
308end;
309
310procedure TSettingsDlg.UpdateShortCutItem;
311begin
312 if Assigned(CurrentKeyBinding) then begin
313 if CurrentKeyBinding.ShortCut > 0 then
314 LocalKeyBindings.RemoveShortCut(CurrentKeyBinding.ShortCut);
315 if CurrentKeyBinding.ShortCut2 > 0 then
316 LocalKeyBindings.RemoveShortCut(CurrentKeyBinding.ShortCut2);
317 CurrentKeyBinding.ShortCut := TextToShortCut(EditShortCutPrimary.Text);
318 CurrentKeyBinding.ShortCut2 := TextToShortCut(EditShortCutSecondary.Text);
319 LocalKeyBindings.LoadToStrings(ListKeyBindings.Items);
320 end;
321end;
322
323function TSettingsDlg.GetLocalCustomDpiEnabled: Boolean;
324begin
325 Result := (ButtonCustomDpi.ButtonIndex and 1) = 1;
326end;
327
328procedure TSettingsDlg.UpdateInterface;
329begin
330 ButtonDpiUp.Enabled := GetLocalCustomDpiEnabled;
331 ButtonDpiDown.Enabled := GetLocalCustomDpiEnabled;
332end;
333
334procedure TSettingsDlg.LoadData;
335begin
336 StartDlg.Translator.Language := StartDlg.Translator.Languages.SearchByCode(LocaleCode);
337 StartDlg.Translator.LanguageListToStrings(ListLanguages.Items, False);
338 ListLanguages.ItemIndex := ListLanguages.Items.IndexOfObject(StartDlg.Translator.Language);
339 if ListLanguages.ItemIndex = -1 then ListLanguages.ItemIndex := 0;
340 if FullScreen then ButtonFullscreen.ButtonIndex := 3
341 else ButtonFullscreen.ButtonIndex := 2;
342 LocalGamma := Gamma;
343 LocalKeyBindings.Assign(KeyBindings.KeyBindings);
344 {$IFDEF DPI}
345 if CustomDpiEnabled then ButtonCustomDpi.ButtonIndex := 3
346 else ButtonCustomDpi.ButtonIndex := 2;
347 LocalDpi := Round(CustomDpi * 100 / 96);
348 {$ENDIF}
349end;
350
351procedure TSettingsDlg.SaveData;
352var
353 NeedRestart: Boolean;
354begin
355 NeedRestart := (Gamma <> LocalGamma) or (CustomDpiEnabled <> GetLocalCustomDpiEnabled) or
356 ((GetLocalCustomDpiEnabled and (LocalDpi <> CustomDpi)));
357 if ListLanguages.ItemIndex <> -1 then begin
358 StartDlg.Translator.Language := TLanguage(ListLanguages.Items.Objects[ListLanguages.ItemIndex]);
359 LocaleCode := StartDlg.Translator.Language.Code;
360 end else begin
361 StartDlg.Translator.Language := nil;
362 LocaleCode := '';
363 end;
364 FullScreen := (ButtonFullscreen.ButtonIndex and 1) = 1;
365 Gamma := LocalGamma;
366 ScreenTools.CustomDpiEnabled := CustomDpiEnabled;
367 if NeedRestart then SimpleMessage(SRestartMsg);
368 KeyBindings.KeyBindings.Assign(LocalKeyBindings);
369 {$IFDEF DPI}
370 CustomDpiEnabled := GetLocalCustomDpiEnabled;
371 CustomDpi := Round(LocalDpi * 96 / 100);
372 {$ENDIF}
373end;
374
375end.
376
377
Note: See TracBrowser for help on using the repository browser.