source: trunk/Core.pas

Last change on this file was 146, checked in by chronos, 11 months ago
  • Fixed: Build on Windows.
File size: 9.5 KB
Line 
1unit Core;
2
3interface
4
5uses
6 Classes, SysUtils, FileUtil, ApplicationInfo, LastOpenedList, Project,
7 Translator, Target, RegistryEx, Registry, Graphics, Controls, ScaleDPI,
8 PersistentForm, Theme, AboutDialog, BFTarget, Forms;
9
10type
11
12 { TCore }
13
14 TCore = class(TDataModule)
15 AboutDialog: TAboutDialog;
16 ApplicationInfo: TApplicationInfo;
17 Translator: TTranslator;
18 ImageListMain: TImageList;
19 LastOpenedList: TLastOpenedList;
20 PersistentForm1: TPersistentForm;
21 ScaleDPI1: TScaleDPI;
22 ThemeManager: TThemeManager;
23 procedure DataModuleCreate(Sender: TObject);
24 procedure DataModuleDestroy(Sender: TObject);
25 procedure TranslatorTranslate(Sender: TObject);
26 private
27 FOnCurrentTargetChange: TNotifyEvent;
28 FOnTargetChangeState: TNotifyEvent;
29 FOnTargetLog: TLogEvent;
30 FormMain: TForm;
31 FCurrentTarget: TTarget;
32 StoredDimension: TControlDimension;
33 RecentFileRegistryContext: TRegistryContext;
34 procedure InitTargets;
35 procedure SetCurrentTarget(AValue: TTarget);
36 procedure ScaleDPI;
37 procedure TargetChangeStateExecute(Sender: TObject);
38 procedure TargetLogExecute(Lines: TStrings);
39 procedure TargetMessageExecute(Text: string);
40 public
41 DataDir: string;
42 Project: TProject;
43 Targets: TTargets;
44 Messages: TMessages;
45 OpenProjectOnStart: Boolean;
46 OptimizationLevel: TCompilerOptimization;
47 CellSize: Integer;
48 MemorySize: Integer;
49 DebugEnabled: Boolean;
50 OptionsFormTabIndex: Integer;
51 Optimizations: TOptimizations;
52 procedure Init;
53 procedure AddItemToLastOpenedList(FileName: string);
54 procedure LoadFromRegistry(Context: TRegistryContext);
55 procedure SaveToRegistry(Context: TRegistryContext);
56 property CurrentTarget: TTarget read FCurrentTarget write SetCurrentTarget;
57 property OnTargetLog: TLogEvent read FOnTargetLog write FOnTargetLog;
58 property OnTargetChangeState: TNotifyEvent read FOnTargetChangeState
59 write FOnTargetChangeState;
60 property OnCurrentTargetChange: TNotifyEvent read FOnCurrentTargetChange
61 write FOnCurrentTargetChange;
62 end;
63
64var
65 Core: TCore;
66
67
68implementation
69
70{$R *.lfm}
71
72uses
73 LazFileUtils, FormMain,
74 // Targets
75 TargetInterpretter, TargetFPC, TargetJava, TargetDelphi, TargetJavascript,
76 TargetPHP, TargetC, TargetPython, TargetCSharp;
77
78const
79 RecentFilesRegKey = 'RecentFiles';
80
81{ TCore }
82
83procedure TCore.AddItemToLastOpenedList(FileName: string);
84begin
85 with LastOpenedList do begin
86 LoadFromRegistry(RecentFileRegistryContext);
87 AddItem(FileName);
88 SaveToRegistry(RecentFileRegistryContext);
89 end;
90end;
91
92procedure TCore.DataModuleCreate(Sender: TObject);
93{$IFDEF UNIX}
94const
95 LinuxDataDir = '/usr/share/LazFuck';
96 LinuxLanguagesDir = LinuxDataDir + '/Languages';
97{$ENDIF}
98begin
99 DataDir := '';
100 {$IFDEF UNIX}
101 // If installed in Linux system then use installation shared game directory for data files
102 if DirectoryExists(LinuxDataDir) then
103 DataDir := LinuxDataDir;
104 // If installed in Linux system then use installation directory for po files
105 if not DirectoryExists(Translator.POFilesFolder) and DirectoryExists(LinuxLanguagesDir) then
106 Translator.POFilesFolder := LinuxLanguagesDir;
107 {$ENDIF}
108
109 Project := TProject.Create;
110 Targets := TTargets.Create;
111 Messages := TMessages.Create;
112
113 StoredDimension := TControlDimension.Create;
114 InitTargets;
115 RecentFileRegistryContext := TRegistryContext.Create(ApplicationInfo.RegistryRoot,
116 ApplicationInfo.RegistryKey + '\' + RecentFilesRegKey);
117 LoadFromRegistry(Core.ApplicationInfo.GetRegistryContext);
118
119 FormMain := TFormMain.Create(nil);
120 FormMain.Show;
121end;
122
123procedure TCore.DataModuleDestroy(Sender: TObject);
124begin
125 SaveToRegistry(Core.ApplicationInfo.GetRegistryContext);
126 FreeAndNil(Messages);
127 FreeAndNil(Targets);
128 FreeAndNil(Project);
129 FreeAndNil(StoredDimension);
130 FreeAndNil(FormMain);
131end;
132
133procedure TCore.TranslatorTranslate(Sender: TObject);
134begin
135 Target.UpdateTranslation;
136end;
137
138procedure TCore.InitTargets;
139var
140 I: Integer;
141begin
142 with Targets do begin
143 Clear;
144 Add(TTargetInterpretter.Create);
145 Add(TTargetDelphi.Create);
146 Add(TTargetFPC.Create);
147 Add(TTargetPHP.Create);
148 Add(TTargetC.Create);
149 Add(TTargetJava.Create);
150 Add(TTargetPython.Create);
151 Add(TTargetCSharp.Create);
152 Add(TTargetJavascript.Create);
153 for I := 0 to Count - 1 do
154 Items[I].OnMessage := TargetMessageExecute;
155 end;
156end;
157
158procedure TCore.LoadFromRegistry(Context: TRegistryContext);
159var
160 TargetName: string;
161begin
162 with TRegistryEx.Create do
163 try
164 CurrentContext := Context;
165 Optimizations.AddSub := ReadBoolWithDefault('OptimizationAddSubEnabled', True);
166 Optimizations.SetZero := ReadBoolWithDefault('OptimizationSetZeroEnabled', True);
167 Optimizations.Merge := ReadBoolWithDefault('OptimizationMerge', True);
168 Optimizations.CopyMultiply := ReadBoolWithDefault('OptimizationCopyMultiplyEnabled', True);
169 Optimizations.RelativeIndexes := ReadBoolWithDefault('OptimizationRelativeIndexesEnabled', True);
170 OpenProjectOnStart := ReadBoolWithDefault('OpenProjectOnStart', True);
171 if ValueExists('LanguageCode') then
172 Translator.Language := Translator.Languages.SearchByCode(ReadStringWithDefault('LanguageCode', ''))
173 else Translator.Language := Translator.Languages.SearchByCode('');
174 ScaleDPI1.DPI := Point(ReadIntegerWithDefault('DPIX', 96),
175 ReadIntegerWithDefault('DPIY', 96));
176 ScaleDPI1.AutoDetect := ReadBoolWithDefault('DPIAuto', True);
177 OptimizationLevel := TCompilerOptimization(ReadIntegerWithDefault('OptimizationLevel', Integer(coNormal)));
178 MemorySize := ReadIntegerWithDefault('MemorySize', 30000);
179 CellSize := ReadIntegerWithDefault('CellSize', 256);
180 DebugEnabled := ReadBoolWithDefault('DebugEnabled', True);
181 OptionsFormTabIndex := ReadIntegerWithDefault('OptionsFormTabIndex', 0);
182 ThemeManager.Theme := ThemeManager.Themes.FindByName(ReadStringWithDefault('Theme', 'System'));
183
184 TargetName := ReadStringWithDefault('TargetName', 'Interpretter');
185 CurrentTarget := Targets.FindByName(TargetName);
186 if not Assigned(CurrentTarget) then
187 CurrentTarget := TTarget(Core.Targets[0]);
188 finally
189 Free;
190 end;
191 Targets.LoadFromRegistry(TRegistryContext.Create(Context.RootKey, Context.Key + '\Compiler'));
192 LastOpenedList.LoadFromRegistry(RecentFileRegistryContext);
193 PersistentForm1.RegistryContext := Context;
194end;
195
196procedure TCore.SaveToRegistry(Context: TRegistryContext);
197begin
198 Targets.SaveToRegistry(TRegistryContext.Create(Context.RootKey, Context.Key + '\Compiler'));
199 with TRegistryEx.Create do
200 try
201 CurrentContext := Context;
202 WriteString('TargetName', Core.CurrentTarget.Name);
203 WriteBool('OptimizationAddSubEnabled', Optimizations.AddSub);
204 WriteBool('OptimizationSetZeroEnabled', Optimizations.SetZero);
205 WriteBool('OptimizationMerge', Optimizations.Merge);
206 WriteBool('OptimizationCopyMultiplyEnabled', Optimizations.CopyMultiply);
207 WriteBool('OptimizationRelativeIndexesEnabled', Optimizations.RelativeIndexes);
208 WriteBool('OpenProjectOnStart', OpenProjectOnStart);
209 WriteBool('DPIAuto', ScaleDPI1.AutoDetect);
210 WriteInteger('DPIX', ScaleDPI1.DPI.X);
211 WriteInteger('DPIY', ScaleDPI1.DPI.Y);
212 WriteInteger('OptimizationLevel', Integer(OptimizationLevel));
213 WriteInteger('MemorySize', MemorySize);
214 WriteInteger('CellSize', CellSize);
215 WriteBool('DebugEnabled', DebugEnabled);
216 WriteInteger('OptionsFormTabIndex', OptionsFormTabIndex);
217 if Assigned(Translator.Language) and (Translator.Language.Code <> '') then
218 WriteString('LanguageCode', Translator.Language.Code)
219 else DeleteValue('LanguageCode');
220 WriteString('Theme', ThemeManager.Theme.Name);
221 finally
222 Free;
223 end;
224end;
225
226procedure TCore.SetCurrentTarget(AValue: TTarget);
227var
228 I: Integer;
229begin
230 if FCurrentTarget = AValue then Exit;
231 FCurrentTarget := AValue;
232 for I := 0 to Targets.Count - 1 do
233 Targets[I].OnChangeState := nil;
234 if Assigned(FCurrentTarget) then begin
235 FCurrentTarget.OnChangeState := TargetChangeStateExecute;
236 FCurrentTarget.OnLog := TargetLogExecute;
237 FCurrentTarget.OptimizationLevel := OptimizationLevel;
238 if FCurrentTarget is TBFTarget then begin
239 TBFTarget(FCurrentTarget).MemorySize := MemorySize;
240 TBFTarget(FCurrentTarget).CellSize := CellSize;
241 end;
242 end;
243 if Assigned(OnCurrentTargetChange) then
244 FOnCurrentTargetChange(Self);
245end;
246
247procedure TCore.TargetChangeStateExecute(Sender: TObject);
248begin
249 if Assigned(FOnTargetChangeState) then
250 FOnTargetChangeState(Sender);
251end;
252
253procedure TCore.TargetLogExecute(Lines: TStrings);
254begin
255
256end;
257
258procedure TCore.ScaleDPI;
259var
260 I: Integer;
261begin
262 with ScaleDPI1 do begin
263 //DesignDPI := Point(144, 144);
264 if (DesignDPI.X <> DPI.X) or (DesignDPI.Y <> DPI.Y) then begin
265 //ApplyToAll(DesignDPI);
266 for I := 0 to Screen.FormCount - 1 do
267 if (Screen.Forms[I].WindowState = wsNormal) or
268 (Screen.Forms[I].WindowState = wsMinimized) then begin
269 StoreDimensions(Screen.Forms[I], StoredDimension);
270 ScaleDimensions(Screen.Forms[I], StoredDimension);
271 end;
272 ScaleImageList(ImageListMain, DesignDPI);
273 end;
274 end;
275end;
276
277procedure TCore.TargetMessageExecute(Text: string);
278begin
279 Messages.AddMessage(Text);
280end;
281
282procedure TCore.Init;
283begin
284 ScaleDPI;
285 Translator.Translate;
286end;
287
288end.
289
Note: See TracBrowser for help on using the repository browser.