source: tags/1.1.0/UCore.pas

Last change on this file was 116, checked in by chronos, 3 years ago
  • Modified: Updated Common package files.
  • Fixed: Translation of About dialog.
  • Added: Snap package definition file.
  • Modified: Detect different data dir on Linux.
File size: 6.7 KB
Line 
1unit UCore;
2
3{$mode delphi}
4
5interface
6
7uses
8 Classes, SysUtils, FileUtil, UApplicationInfo, ULastOpenedList, UProject,
9 UTranslator, UTarget, URegistry, Registry, Graphics, Controls, UScaleDPI,
10 UPersistentForm, UTheme, UAboutDialog, UBFTarget;
11
12type
13
14 { TCore }
15
16 TCore = class(TDataModule)
17 AboutDialog: TAboutDialog;
18 ApplicationInfo: TApplicationInfo;
19 Translator: TTranslator;
20 ImageListMain: TImageList;
21 LastOpenedList: TLastOpenedList;
22 PersistentForm1: TPersistentForm;
23 ScaleDPI1: TScaleDPI;
24 ThemeManager: TThemeManager;
25 procedure DataModuleCreate(Sender: TObject);
26 procedure DataModuleDestroy(Sender: TObject);
27 private
28 FCurrentTarget: TTarget;
29 StoredDimension: TControlDimension;
30 procedure SetCurrentTarget(AValue: TTarget);
31 procedure ScaleDPI;
32 public
33 DataDir: string;
34 Project: TProject;
35 Targets: TTargetList;
36 OpenProjectOnStart: Boolean;
37 OptimizationLevel: TCompilerOptimization;
38 CellSize: Integer;
39 MemorySize: Integer;
40 Optimizations: TOptimizations;
41 procedure Init;
42 procedure LoadFromRegistry(Context: TRegistryContext);
43 procedure SaveToRegistry(Context: TRegistryContext);
44 property CurrentTarget: TTarget read FCurrentTarget write SetCurrentTarget;
45 end;
46
47var
48 Core: TCore;
49
50
51implementation
52
53{$R *.lfm}
54
55uses
56 UFormMain, Forms, LazFileUtils,
57 // Targets
58 UTargetInterpretter, UTargetFPC, UTargetJava, UTargetDelphi, UTargetJavascript,
59 UTargetPHP, UTargetC, UTargetPython, UTargetCSharp;
60
61const
62 RecentFilesRegKey = 'RecentFiles';
63
64{ TCore }
65
66procedure TCore.DataModuleCreate(Sender: TObject);
67const
68 LinuxDataDir = '/usr/share/LazFuck';
69 LinuxLanguagesDir = LinuxDataDir + '/Languages';
70begin
71 DataDir := '';
72 {$IFDEF Linux}
73 // If installed in Linux system then use installation shared game directory for data files
74 if DirectoryExists(LinuxDataDir) then
75 DataDir := LinuxDataDir;
76 // If installed in Linux system then use installation directory for po files
77 if not DirectoryExists(Translator.POFilesFolder) and DirectoryExists(LinuxLanguagesDir) then
78 Translator.POFilesFolder := LinuxLanguagesDir;
79 {$ENDIF}
80
81 Project := TProject.Create;
82 Targets := TTargetList.Create;
83 StoredDimension := TControlDimension.Create;
84
85 // Init targets list
86 Targets.Add(TTargetInterpretter.Create);
87 Targets.Add(TTargetDelphi.Create);
88 Targets.Add(TTargetFPC.Create);
89 Targets.Add(TTargetPHP.Create);
90 Targets.Add(TTargetC.Create);
91 Targets.Add(TTargetJava.Create);
92 Targets.Add(TTargetPython.Create);
93 Targets.Add(TTargetCSharp.Create);
94 Targets.Add(TTargetJavascript.Create);
95
96 LoadFromRegistry(Core.ApplicationInfo.GetRegistryContext);
97end;
98
99procedure TCore.DataModuleDestroy(Sender: TObject);
100begin
101 SaveToRegistry(Core.ApplicationInfo.GetRegistryContext);
102 FreeAndNil(Targets);
103 FreeAndNil(Project);
104 FreeAndNil(StoredDimension);
105end;
106
107procedure TCore.LoadFromRegistry(Context: TRegistryContext);
108begin
109 with TRegistryEx.Create do
110 try
111 CurrentContext := Context;
112 OpenProjectOnStart := ReadBoolWithDefault('OpenProjectOnStart', True);
113 if ValueExists('LanguageCode') then
114 Translator.Language := Translator.Languages.SearchByCode(ReadStringWithDefault('LanguageCode', ''))
115 else Translator.Language := Translator.Languages.SearchByCode('');
116 ScaleDPI1.DPI := Point(ReadIntegerWithDefault('DPIX', 96),
117 ReadIntegerWithDefault('DPIY', 96));
118 ScaleDPI1.AutoDetect := ReadBoolWithDefault('DPIAuto', True);
119 OptimizationLevel := TCompilerOptimization(ReadIntegerWithDefault('OptimizationLevel', Integer(coNormal)));
120 MemorySize := ReadIntegerWithDefault('MemorySize', 30000);
121 CellSize := ReadIntegerWithDefault('CellSize', 256);
122 ThemeManager.Theme := ThemeManager.Themes.FindByName(ReadStringWithDefault('Theme', 'System'));
123 finally
124 Free;
125 end;
126 LastOpenedList.LoadFromRegistry(TRegistryContext.Create(Context.RootKey, Context.Key + '\' + RecentFilesRegKey));
127 Targets.LoadFromRegistry(TRegistryContext.Create(Context.RootKey, Context.Key + '\Compiler'));
128 PersistentForm1.RegistryContext := Context;
129end;
130
131procedure TCore.SaveToRegistry(Context: TRegistryContext);
132begin
133 Targets.SaveToRegistry(TRegistryContext.Create(Context.RootKey, Context.Key + '\Compiler'));
134 LastOpenedList.SaveToRegistry(TRegistryContext.Create(Context.RootKey, Context.Key + '\' + RecentFilesRegKey));
135 with TRegistryEx.Create do
136 try
137 CurrentContext := Context;
138 WriteBool('OpenProjectOnStart', OpenProjectOnStart);
139 WriteBool('DPIAuto', ScaleDPI1.AutoDetect);
140 WriteInteger('DPIX', ScaleDPI1.DPI.X);
141 WriteInteger('DPIY', ScaleDPI1.DPI.Y);
142 WriteInteger('OptimizationLevel', Integer(OptimizationLevel));
143 WriteInteger('MemorySize', MemorySize);
144 WriteInteger('CellSize', CellSize);
145 if Assigned(Translator.Language) and (Translator.Language.Code <> '') then
146 WriteString('LanguageCode', Translator.Language.Code)
147 else DeleteValue('LanguageCode');
148 WriteString('Theme', ThemeManager.Theme.Name);
149 finally
150 Free;
151 end;
152end;
153
154procedure TCore.SetCurrentTarget(AValue: TTarget);
155var
156 I: Integer;
157begin
158 if FCurrentTarget = AValue then Exit;
159 FCurrentTarget := AValue;
160 for I := 0 to Targets.Count - 1 do
161 TTarget(Targets[I]).OnChangeState := nil;
162 if Assigned(FCurrentTarget) then begin
163 FCurrentTarget.OnChangeState := FormMain.TargetStateChanged;
164 FCurrentTarget.OnLog := FormMain.TargetLogExecute;
165 FCurrentTarget.OptimizationLevel := OptimizationLevel;
166 FCurrentTarget.Messages.OnChange := FormMain.MessagesChanged;
167 if FCurrentTarget is TBFTarget then begin
168 TBFTarget(FCurrentTarget).MemorySize := MemorySize;
169 TBFTarget(FCurrentTarget).CellSize := CellSize;
170 end;
171 end;
172 FormMain.UpdateTargetList;
173 FormMain.UpdateInterface;
174end;
175
176procedure TCore.ScaleDPI;
177var
178 I: Integer;
179begin
180 with ScaleDPI1 do begin
181 //DesignDPI := Point(144, 144);
182 if (DesignDPI.X <> DPI.X) or (DesignDPI.Y <> DPI.Y) then begin
183 //ApplyToAll(DesignDPI);
184 for I := 0 to Screen.FormCount - 1 do
185 if (Screen.Forms[I].WindowState = wsNormal) or
186 (Screen.Forms[I].WindowState = wsMinimized) then begin
187 StoreDimensions(Screen.Forms[I], StoredDimension);
188 ScaleDimensions(Screen.Forms[I], StoredDimension);
189 end;
190 // TODO: Transparent image scaling not working properly under linux Gtk2
191 // Also screen DPI is not correctly detected under linux Gtk2
192 {$IFDEF WINDOWS}
193 ScaleImageList(ImageListMain, DesignDPI);
194 {$ENDIF}
195 end;
196 end;
197end;
198
199procedure TCore.Init;
200begin
201 ScaleDPI;
202 Translator.Translate;
203end;
204
205end.
206
Note: See TracBrowser for help on using the repository browser.