You've already forked lazarus-ccr
iphonelazext: fixed SDK selection (and detecting), added iArkanoid sample
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1130 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -1,74 +1,76 @@
|
|||||||
inherited iPhoneSpecificOptions: TiPhoneSpecificOptions
|
object iPhoneSpecificOptions: TiPhoneSpecificOptions
|
||||||
Height = 439
|
Left = 0
|
||||||
Width = 485
|
Height = 473
|
||||||
ClientHeight = 439
|
Top = 0
|
||||||
ClientWidth = 485
|
Width = 487
|
||||||
DesignLeft = 631
|
ClientHeight = 473
|
||||||
DesignTop = 144
|
ClientWidth = 487
|
||||||
object lblRTLUtils: TLabel[0]
|
LCLVersion = '0.9.29'
|
||||||
Left = 11
|
object lblRTLUtils: TLabel
|
||||||
|
Left = 16
|
||||||
Height = 18
|
Height = 18
|
||||||
Top = 128
|
Top = 184
|
||||||
Width = 92
|
Width = 92
|
||||||
Caption = 'RTL units path'
|
Caption = 'RTL units path'
|
||||||
ParentColor = False
|
ParentColor = False
|
||||||
end
|
end
|
||||||
object lblCompilerPath: TLabel[1]
|
object lblCompilerPath: TLabel
|
||||||
Left = 11
|
Left = 16
|
||||||
Height = 18
|
Height = 18
|
||||||
Top = 96
|
Top = 152
|
||||||
Width = 55
|
Width = 55
|
||||||
Caption = 'Compiler'
|
Caption = 'Compiler'
|
||||||
ParentColor = False
|
ParentColor = False
|
||||||
end
|
end
|
||||||
object edtCompilerPath: TEdit[2]
|
object edtCompilerPath: TEdit
|
||||||
Left = 125
|
Left = 136
|
||||||
Height = 22
|
Height = 22
|
||||||
Top = 96
|
Top = 152
|
||||||
Width = 347
|
Width = 330
|
||||||
Anchors = [akTop, akLeft, akRight]
|
Anchors = [akTop, akLeft, akRight]
|
||||||
TabOrder = 0
|
TabOrder = 0
|
||||||
Text = 'edtCompilerPath'
|
Text = 'edtCompilerPath'
|
||||||
end
|
end
|
||||||
object lblXCodeProject: TLabel[3]
|
object lblXCodeProject: TLabel
|
||||||
Left = 11
|
Left = 16
|
||||||
Height = 18
|
Height = 18
|
||||||
Top = 72
|
Top = 128
|
||||||
Width = 395
|
Width = 395
|
||||||
Caption = 'Specific ARM compiler settings (for generated XCode projects)'
|
Caption = 'Specific ARM compiler settings (for generated XCode projects)'
|
||||||
ParentColor = False
|
ParentColor = False
|
||||||
ParentFont = False
|
ParentFont = False
|
||||||
end
|
end
|
||||||
object edtRTLPath: TEdit[4]
|
object edtRTLPath: TEdit
|
||||||
Left = 125
|
Left = 136
|
||||||
Height = 22
|
Height = 22
|
||||||
Top = 128
|
Top = 184
|
||||||
Width = 347
|
Width = 330
|
||||||
Anchors = [akTop, akLeft, akRight]
|
Anchors = [akTop, akLeft, akRight]
|
||||||
TabOrder = 1
|
TabOrder = 1
|
||||||
Text = 'edtRTLPath'
|
Text = 'edtRTLPath'
|
||||||
end
|
end
|
||||||
object edtCompilerOptions: TEdit[5]
|
object edtCompilerOptions: TEdit
|
||||||
Left = 125
|
Left = 136
|
||||||
Height = 22
|
Height = 22
|
||||||
Top = 160
|
Top = 216
|
||||||
Width = 347
|
Width = 330
|
||||||
Anchors = [akTop, akLeft, akRight]
|
Anchors = [akTop, akLeft, akRight]
|
||||||
|
OnChange = edtCompilerOptionsChange
|
||||||
TabOrder = 2
|
TabOrder = 2
|
||||||
Text = 'edtCompilerOptions'
|
Text = 'edtCompilerOptions'
|
||||||
end
|
end
|
||||||
object lblCmpOptions: TLabel[6]
|
object lblCmpOptions: TLabel
|
||||||
Left = 11
|
Left = 16
|
||||||
Height = 18
|
Height = 18
|
||||||
Top = 160
|
Top = 216
|
||||||
Width = 106
|
Width = 106
|
||||||
Caption = 'Compiler options'
|
Caption = 'Compiler options'
|
||||||
ParentColor = False
|
ParentColor = False
|
||||||
ParentFont = False
|
ParentFont = False
|
||||||
OnClick = lblCmpOptionsClick
|
OnClick = lblCmpOptionsClick
|
||||||
end
|
end
|
||||||
object Label5: TLabel[7]
|
object Label5: TLabel
|
||||||
Left = 11
|
Left = 16
|
||||||
Height = 18
|
Height = 18
|
||||||
Top = 16
|
Top = 16
|
||||||
Width = 97
|
Width = 97
|
||||||
@ -76,55 +78,82 @@ inherited iPhoneSpecificOptions: TiPhoneSpecificOptions
|
|||||||
ParentColor = False
|
ParentColor = False
|
||||||
ParentFont = False
|
ParentFont = False
|
||||||
end
|
end
|
||||||
object edtPlatformsPath: TEdit[8]
|
object edtPlatformsPath: TEdit
|
||||||
Left = 125
|
Left = 125
|
||||||
Height = 22
|
Height = 22
|
||||||
Top = 16
|
Top = 16
|
||||||
Width = 347
|
Width = 341
|
||||||
Anchors = [akTop, akLeft, akRight]
|
Anchors = [akTop, akLeft, akRight]
|
||||||
TabOrder = 3
|
TabOrder = 3
|
||||||
Text = 'edtPlatformsPath'
|
Text = 'edtPlatformsPath'
|
||||||
end
|
end
|
||||||
object lblSimSettings: TLabel[9]
|
object lblSimSettings: TLabel
|
||||||
Left = 11
|
Left = 16
|
||||||
Height = 18
|
Height = 18
|
||||||
Top = 232
|
Top = 256
|
||||||
Width = 161
|
Width = 161
|
||||||
Caption = 'iPhone Simulator settings'
|
Caption = 'iPhone Simulator settings'
|
||||||
ParentColor = False
|
ParentColor = False
|
||||||
end
|
end
|
||||||
object edtSimBundle: TEdit[10]
|
object edtSimBundle: TEdit
|
||||||
Left = 160
|
Left = 160
|
||||||
Height = 22
|
Height = 22
|
||||||
Top = 262
|
Top = 286
|
||||||
Width = 312
|
Width = 306
|
||||||
Anchors = [akTop, akLeft, akRight]
|
Anchors = [akTop, akLeft, akRight]
|
||||||
TabOrder = 4
|
TabOrder = 4
|
||||||
Text = 'edtSimBundle'
|
Text = 'edtSimBundle'
|
||||||
end
|
end
|
||||||
object edtSimApps: TEdit[11]
|
object edtSimApps: TEdit
|
||||||
Left = 160
|
Left = 160
|
||||||
Height = 22
|
Height = 22
|
||||||
Top = 294
|
Top = 318
|
||||||
Width = 312
|
Width = 306
|
||||||
Anchors = [akTop, akLeft, akRight]
|
Anchors = [akTop, akLeft, akRight]
|
||||||
TabOrder = 5
|
TabOrder = 5
|
||||||
Text = 'edtSimApps'
|
Text = 'edtSimApps'
|
||||||
end
|
end
|
||||||
object lblSimBundle: TLabel[12]
|
object lblSimBundle: TLabel
|
||||||
Left = 11
|
Left = 16
|
||||||
Height = 18
|
Height = 18
|
||||||
Top = 263
|
Top = 287
|
||||||
Width = 111
|
Width = 111
|
||||||
Caption = 'iPhoneSim bundle'
|
Caption = 'iPhoneSim bundle'
|
||||||
ParentColor = False
|
ParentColor = False
|
||||||
end
|
end
|
||||||
object lblSimAppPath: TLabel[13]
|
object lblSimAppPath: TLabel
|
||||||
Left = 11
|
Left = 16
|
||||||
Height = 18
|
Height = 18
|
||||||
Top = 294
|
Top = 318
|
||||||
Width = 141
|
Width = 141
|
||||||
Caption = 'Sim Applications path:'
|
Caption = 'Sim Applications path:'
|
||||||
ParentColor = False
|
ParentColor = False
|
||||||
end
|
end
|
||||||
|
object Button1: TButton
|
||||||
|
Left = 16
|
||||||
|
Height = 20
|
||||||
|
Top = 56
|
||||||
|
Width = 112
|
||||||
|
AutoSize = True
|
||||||
|
Caption = 'Scan for SDKs'
|
||||||
|
OnClick = Button1Click
|
||||||
|
TabOrder = 6
|
||||||
|
end
|
||||||
|
object Label1: TLabel
|
||||||
|
Left = 16
|
||||||
|
Height = 18
|
||||||
|
Top = 88
|
||||||
|
Width = 129
|
||||||
|
Caption = 'Default SDK version:'
|
||||||
|
ParentColor = False
|
||||||
|
end
|
||||||
|
object cmbDefaultSDK: TComboBox
|
||||||
|
Left = 152
|
||||||
|
Height = 20
|
||||||
|
Top = 88
|
||||||
|
Width = 194
|
||||||
|
ItemHeight = 0
|
||||||
|
Style = csDropDownList
|
||||||
|
TabOrder = 7
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
@ -1,39 +1,45 @@
|
|||||||
{ This is an automatically generated lazarus resource file }
|
{ This is an automatically generated lazarus resource file }
|
||||||
|
|
||||||
LazarusResources.Add('TiPhoneSpecificOptions','FORMDATA',[
|
LazarusResources.Add('TiPhoneSpecificOptions','FORMDATA',[
|
||||||
'TPF0'#241#22'TiPhoneSpecificOptions'#21'iPhoneSpecificOptions'#6'Height'#3
|
'TPF0'#22'TiPhoneSpecificOptions'#21'iPhoneSpecificOptions'#4'Left'#2#0#6'Hei'
|
||||||
+#183#1#5'Width'#3#229#1#12'ClientHeight'#3#183#1#11'ClientWidth'#3#229#1#10
|
+'ght'#3#217#1#3'Top'#2#0#5'Width'#3#231#1#12'ClientHeight'#3#217#1#11'Client'
|
||||||
+'DesignLeft'#3'w'#2#9'DesignTop'#3#144#0#0#242#2#0#6'TLabel'#11'lblRTLUtils'
|
+'Width'#3#231#1#10'LCLVersion'#6#6'0.9.29'#0#6'TLabel'#11'lblRTLUtils'#4'Lef'
|
||||||
+#4'Left'#2#11#6'Height'#2#18#3'Top'#3#128#0#5'Width'#2'\'#7'Caption'#6#14'RT'
|
+'t'#2#16#6'Height'#2#18#3'Top'#3#184#0#5'Width'#2'\'#7'Caption'#6#14'RTL uni'
|
||||||
+'L units path'#11'ParentColor'#8#0#0#242#2#1#6'TLabel'#15'lblCompilerPath'#4
|
+'ts path'#11'ParentColor'#8#0#0#6'TLabel'#15'lblCompilerPath'#4'Left'#2#16#6
|
||||||
+'Left'#2#11#6'Height'#2#18#3'Top'#2'`'#5'Width'#2'7'#7'Caption'#6#8'Compiler'
|
+'Height'#2#18#3'Top'#3#152#0#5'Width'#2'7'#7'Caption'#6#8'Compiler'#11'Paren'
|
||||||
+#11'ParentColor'#8#0#0#242#2#2#5'TEdit'#15'edtCompilerPath'#4'Left'#2'}'#6'H'
|
+'tColor'#8#0#0#5'TEdit'#15'edtCompilerPath'#4'Left'#3#136#0#6'Height'#2#22#3
|
||||||
+'eight'#2#22#3'Top'#2'`'#5'Width'#3'['#1#7'Anchors'#11#5'akTop'#6'akLeft'#7
|
+'Top'#3#152#0#5'Width'#3'J'#1#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#0#8
|
||||||
+'akRight'#0#8'TabOrder'#2#0#4'Text'#6#15'edtCompilerPath'#0#0#242#2#3#6'TLab'
|
+'TabOrder'#2#0#4'Text'#6#15'edtCompilerPath'#0#0#6'TLabel'#15'lblXCodeProjec'
|
||||||
+'el'#15'lblXCodeProject'#4'Left'#2#11#6'Height'#2#18#3'Top'#2'H'#5'Width'#3
|
+'t'#4'Left'#2#16#6'Height'#2#18#3'Top'#3#128#0#5'Width'#3#139#1#7'Caption'#6
|
||||||
+#139#1#7'Caption'#6'=Specific ARM compiler settings (for generated XCode pro'
|
+'=Specific ARM compiler settings (for generated XCode projects)'#11'ParentCo'
|
||||||
+'jects)'#11'ParentColor'#8#10'ParentFont'#8#0#0#242#2#4#5'TEdit'#10'edtRTLPa'
|
+'lor'#8#10'ParentFont'#8#0#0#5'TEdit'#10'edtRTLPath'#4'Left'#3#136#0#6'Heigh'
|
||||||
+'th'#4'Left'#2'}'#6'Height'#2#22#3'Top'#3#128#0#5'Width'#3'['#1#7'Anchors'#11
|
+'t'#2#22#3'Top'#3#184#0#5'Width'#3'J'#1#7'Anchors'#11#5'akTop'#6'akLeft'#7'a'
|
||||||
+#5'akTop'#6'akLeft'#7'akRight'#0#8'TabOrder'#2#1#4'Text'#6#10'edtRTLPath'#0#0
|
+'kRight'#0#8'TabOrder'#2#1#4'Text'#6#10'edtRTLPath'#0#0#5'TEdit'#18'edtCompi'
|
||||||
+#242#2#5#5'TEdit'#18'edtCompilerOptions'#4'Left'#2'}'#6'Height'#2#22#3'Top'#3
|
+'lerOptions'#4'Left'#3#136#0#6'Height'#2#22#3'Top'#3#216#0#5'Width'#3'J'#1#7
|
||||||
+#160#0#5'Width'#3'['#1#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#0#8'TabOr'
|
+'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#0#8'OnChange'#7#24'edtCompilerOpt'
|
||||||
+'der'#2#2#4'Text'#6#18'edtCompilerOptions'#0#0#242#2#6#6'TLabel'#13'lblCmpOp'
|
+'ionsChange'#8'TabOrder'#2#2#4'Text'#6#18'edtCompilerOptions'#0#0#6'TLabel'
|
||||||
+'tions'#4'Left'#2#11#6'Height'#2#18#3'Top'#3#160#0#5'Width'#2'j'#7'Caption'#6
|
+#13'lblCmpOptions'#4'Left'#2#16#6'Height'#2#18#3'Top'#3#216#0#5'Width'#2'j'#7
|
||||||
+#16'Compiler options'#11'ParentColor'#8#10'ParentFont'#8#7'OnClick'#7#18'lbl'
|
+'Caption'#6#16'Compiler options'#11'ParentColor'#8#10'ParentFont'#8#7'OnClic'
|
||||||
+'CmpOptionsClick'#0#0#242#2#7#6'TLabel'#6'Label5'#4'Left'#2#11#6'Height'#2#18
|
+'k'#7#18'lblCmpOptionsClick'#0#0#6'TLabel'#6'Label5'#4'Left'#2#16#6'Height'#2
|
||||||
+#3'Top'#2#16#5'Width'#2'a'#7'Caption'#6#15'Platforms path:'#11'ParentColor'#8
|
+#18#3'Top'#2#16#5'Width'#2'a'#7'Caption'#6#15'Platforms path:'#11'ParentColo'
|
||||||
+#10'ParentFont'#8#0#0#242#2#8#5'TEdit'#16'edtPlatformsPath'#4'Left'#2'}'#6'H'
|
+'r'#8#10'ParentFont'#8#0#0#5'TEdit'#16'edtPlatformsPath'#4'Left'#2'}'#6'Heig'
|
||||||
+'eight'#2#22#3'Top'#2#16#5'Width'#3'['#1#7'Anchors'#11#5'akTop'#6'akLeft'#7
|
+'ht'#2#22#3'Top'#2#16#5'Width'#3'U'#1#7'Anchors'#11#5'akTop'#6'akLeft'#7'akR'
|
||||||
+'akRight'#0#8'TabOrder'#2#3#4'Text'#6#16'edtPlatformsPath'#0#0#242#2#9#6'TLa'
|
+'ight'#0#8'TabOrder'#2#3#4'Text'#6#16'edtPlatformsPath'#0#0#6'TLabel'#14'lbl'
|
||||||
+'bel'#14'lblSimSettings'#4'Left'#2#11#6'Height'#2#18#3'Top'#3#232#0#5'Width'
|
+'SimSettings'#4'Left'#2#16#6'Height'#2#18#3'Top'#3#0#1#5'Width'#3#161#0#7'Ca'
|
||||||
+#3#161#0#7'Caption'#6#25'iPhone Simulator settings'#11'ParentColor'#8#0#0#242
|
+'ption'#6#25'iPhone Simulator settings'#11'ParentColor'#8#0#0#5'TEdit'#12'ed'
|
||||||
+#2#10#5'TEdit'#12'edtSimBundle'#4'Left'#3#160#0#6'Height'#2#22#3'Top'#3#6#1#5
|
+'tSimBundle'#4'Left'#3#160#0#6'Height'#2#22#3'Top'#3#30#1#5'Width'#3'2'#1#7
|
||||||
+'Width'#3'8'#1#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#0#8'TabOrder'#2#4
|
+'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#0#8'TabOrder'#2#4#4'Text'#6#12'ed'
|
||||||
+#4'Text'#6#12'edtSimBundle'#0#0#242#2#11#5'TEdit'#10'edtSimApps'#4'Left'#3
|
+'tSimBundle'#0#0#5'TEdit'#10'edtSimApps'#4'Left'#3#160#0#6'Height'#2#22#3'To'
|
||||||
+#160#0#6'Height'#2#22#3'Top'#3'&'#1#5'Width'#3'8'#1#7'Anchors'#11#5'akTop'#6
|
+'p'#3'>'#1#5'Width'#3'2'#1#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#0#8'T'
|
||||||
+'akLeft'#7'akRight'#0#8'TabOrder'#2#5#4'Text'#6#10'edtSimApps'#0#0#242#2#12#6
|
+'abOrder'#2#5#4'Text'#6#10'edtSimApps'#0#0#6'TLabel'#12'lblSimBundle'#4'Left'
|
||||||
+'TLabel'#12'lblSimBundle'#4'Left'#2#11#6'Height'#2#18#3'Top'#3#7#1#5'Width'#2
|
+#2#16#6'Height'#2#18#3'Top'#3#31#1#5'Width'#2'o'#7'Caption'#6#16'iPhoneSim b'
|
||||||
+'o'#7'Caption'#6#16'iPhoneSim bundle'#11'ParentColor'#8#0#0#242#2#13#6'TLabe'
|
+'undle'#11'ParentColor'#8#0#0#6'TLabel'#13'lblSimAppPath'#4'Left'#2#16#6'Hei'
|
||||||
+'l'#13'lblSimAppPath'#4'Left'#2#11#6'Height'#2#18#3'Top'#3'&'#1#5'Width'#3
|
+'ght'#2#18#3'Top'#3'>'#1#5'Width'#3#141#0#7'Caption'#6#22'Sim Applications p'
|
||||||
+#141#0#7'Caption'#6#22'Sim Applications path:'#11'ParentColor'#8#0#0#0
|
+'ath:'#11'ParentColor'#8#0#0#7'TButton'#7'Button1'#4'Left'#2#16#6'Height'#2
|
||||||
|
+#20#3'Top'#2'8'#5'Width'#2'p'#8'AutoSize'#9#7'Caption'#6#13'Scan for SDKs'#7
|
||||||
|
+'OnClick'#7#12'Button1Click'#8'TabOrder'#2#6#0#0#6'TLabel'#6'Label1'#4'Left'
|
||||||
|
+#2#16#6'Height'#2#18#3'Top'#2'X'#5'Width'#3#129#0#7'Caption'#6#20'Default SD'
|
||||||
|
+'K version:'#11'ParentColor'#8#0#0#9'TComboBox'#13'cmbDefaultSDK'#4'Left'#3
|
||||||
|
+#152#0#6'Height'#2#20#3'Top'#2'X'#5'Width'#3#194#0#10'ItemHeight'#2#0#5'Styl'
|
||||||
|
+'e'#7#14'csDropDownList'#8'TabOrder'#2#7#0#0#0
|
||||||
]);
|
]);
|
||||||
|
@ -28,12 +28,15 @@ type
|
|||||||
{ TiPhoneSpecificOptions }
|
{ TiPhoneSpecificOptions }
|
||||||
|
|
||||||
TiPhoneSpecificOptions = class(TAbstractIDEOptionsEditor)
|
TiPhoneSpecificOptions = class(TAbstractIDEOptionsEditor)
|
||||||
|
Button1: TButton;
|
||||||
|
cmbDefaultSDK: TComboBox;
|
||||||
edtCompilerPath: TEdit;
|
edtCompilerPath: TEdit;
|
||||||
edtRTLPath: TEdit;
|
edtRTLPath: TEdit;
|
||||||
edtCompilerOptions: TEdit;
|
edtCompilerOptions: TEdit;
|
||||||
edtPlatformsPath: TEdit;
|
edtPlatformsPath: TEdit;
|
||||||
edtSimBundle: TEdit;
|
edtSimBundle: TEdit;
|
||||||
edtSimApps: TEdit;
|
edtSimApps: TEdit;
|
||||||
|
Label1: TLabel;
|
||||||
lblRTLUtils: TLabel;
|
lblRTLUtils: TLabel;
|
||||||
lblSimAppPath: TLabel;
|
lblSimAppPath: TLabel;
|
||||||
lblCompilerPath: TLabel;
|
lblCompilerPath: TLabel;
|
||||||
@ -42,6 +45,8 @@ type
|
|||||||
Label5: TLabel;
|
Label5: TLabel;
|
||||||
lblSimSettings: TLabel;
|
lblSimSettings: TLabel;
|
||||||
lblSimBundle: TLabel;
|
lblSimBundle: TLabel;
|
||||||
|
procedure Button1Click(Sender: TObject);
|
||||||
|
procedure edtCompilerOptionsChange(Sender: TObject);
|
||||||
procedure lblCmpOptionsClick(Sender: TObject);
|
procedure lblCmpOptionsClick(Sender: TObject);
|
||||||
private
|
private
|
||||||
{ private declarations }
|
{ private declarations }
|
||||||
@ -63,6 +68,26 @@ begin
|
|||||||
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TiPhoneSpecificOptions.Button1Click(Sender: TObject);
|
||||||
|
var
|
||||||
|
dir : String;
|
||||||
|
begin
|
||||||
|
dir:=EnvOptions.PlatformsBaseDir;
|
||||||
|
EnvOptions.PlatformsBaseDir:=edtPlatformsPath.Text;
|
||||||
|
EnvOptions.RefreshVersions;
|
||||||
|
|
||||||
|
cmbDefaultSDK.Clear;
|
||||||
|
EnvOptions.GetSDKVersions(cmbDefaultSDK.Items);
|
||||||
|
|
||||||
|
EnvOptions.PlatformsBaseDir:=dir;
|
||||||
|
EnvOptions.RefreshVersions;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TiPhoneSpecificOptions.edtCompilerOptionsChange(Sender: TObject);
|
||||||
|
begin
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
function TiPhoneSpecificOptions.GetTitle: String;
|
function TiPhoneSpecificOptions.GetTitle: String;
|
||||||
begin
|
begin
|
||||||
Result:='Files';
|
Result:='Files';
|
||||||
@ -87,6 +112,10 @@ begin
|
|||||||
edtCompilerOptions.Text := opt.CommonOpt;
|
edtCompilerOptions.Text := opt.CommonOpt;
|
||||||
edtSimBundle.Text := opt.SimBundle;
|
edtSimBundle.Text := opt.SimBundle;
|
||||||
edtSimApps.Text:= opt.SimAppsPath;
|
edtSimApps.Text:= opt.SimAppsPath;
|
||||||
|
|
||||||
|
cmbDefaultSDK.Items.Clear;
|
||||||
|
opt.GetSDKVersions(cmbDefaultSDK.Items);
|
||||||
|
cmbDefaultSDK.ItemIndex:=cmbDefaultSDK.Items.IndexOf(opt.DefaultSDK);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TiPhoneSpecificOptions.WriteSettings(AOptions: TAbstractIDEOptions);
|
procedure TiPhoneSpecificOptions.WriteSettings(AOptions: TAbstractIDEOptions);
|
||||||
|
257
components/iphonelazext/examples/iArkanoid/gameengine.pas
Normal file
257
components/iphonelazext/examples/iArkanoid/gameengine.pas
Normal file
@ -0,0 +1,257 @@
|
|||||||
|
// Arkanoid test game engine.
|
||||||
|
// developed for iPhone test samples
|
||||||
|
//
|
||||||
|
// Author: Dmitry 'skalogryz' Boyarintsev 2009
|
||||||
|
//
|
||||||
|
// Arkanoid is an arcade game developed by Taito in 1986
|
||||||
|
// http://en.wikipedia.org/wiki/Arkanoid
|
||||||
|
//
|
||||||
|
// You're free to use this unit in anyway you want
|
||||||
|
|
||||||
|
unit gameengine;
|
||||||
|
|
||||||
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
Types, Classes, SysUtils;
|
||||||
|
|
||||||
|
const
|
||||||
|
ballVelocity = 18;
|
||||||
|
|
||||||
|
type
|
||||||
|
TGameItem = record
|
||||||
|
x, y : single; // coodinates
|
||||||
|
dx, dy : single; // velocity vector
|
||||||
|
sticked: Boolean;
|
||||||
|
end;
|
||||||
|
|
||||||
|
TBrick = record
|
||||||
|
bounds : TRect;
|
||||||
|
hitRect : TRect;
|
||||||
|
health : Integer;
|
||||||
|
flash : Integer;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TArkanoid }
|
||||||
|
|
||||||
|
TArkanoid = class(TObject)
|
||||||
|
private
|
||||||
|
fPaddleX : single;
|
||||||
|
procedure SetPaddleX(const AValue: single);
|
||||||
|
protected
|
||||||
|
procedure BoundsBack(const HitRect: TRect; var dx, dy: single);
|
||||||
|
procedure BallMove(var move: TGameItem; atime: single);
|
||||||
|
procedure SetPaddleX(AValue: Integer);
|
||||||
|
procedure ResetPaddle;
|
||||||
|
public
|
||||||
|
bricks : array [0..99] of TBrick;
|
||||||
|
brickCount : Integer;
|
||||||
|
balls : array [0..9] of TGameItem;
|
||||||
|
ballcount : Integer;
|
||||||
|
width : Integer;
|
||||||
|
height : Integer;
|
||||||
|
PaddleY : single;
|
||||||
|
PaddleW : single;
|
||||||
|
|
||||||
|
constructor Create(awidth, aheight: Integer);
|
||||||
|
procedure InitBricks;
|
||||||
|
procedure Init;
|
||||||
|
procedure Move;
|
||||||
|
function AnySticked: Boolean;
|
||||||
|
procedure LaunchSticked;
|
||||||
|
property PaddleX: single read fPaddleX write SetPaddleX;
|
||||||
|
end;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
{ TArkanoid }
|
||||||
|
|
||||||
|
procedure TArkanoid.SetPaddleX(const AValue: single);
|
||||||
|
var
|
||||||
|
dx : single;
|
||||||
|
i : integer;
|
||||||
|
begin
|
||||||
|
dx := fPaddleX - AValue;
|
||||||
|
for i := 0 to ballcount - 1 do begin
|
||||||
|
if balls[i].sticked then
|
||||||
|
balls[i].x:=balls[i].x-dx;
|
||||||
|
end;
|
||||||
|
fPaddleX := AValue;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// hacky test
|
||||||
|
procedure TArkanoid.BoundsBack(const HitRect: TRect; var dx, dy: single);
|
||||||
|
var
|
||||||
|
my : Integer;
|
||||||
|
begin
|
||||||
|
my := HitRect.Top + (HitRect.Bottom - HitRect.Top) div 2;
|
||||||
|
if abs(my - dy)>5 then dy := -dy
|
||||||
|
else dx := -dx;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TArkanoid.BallMove(var move: TGameItem; atime: single);
|
||||||
|
var
|
||||||
|
cx, cy : single;
|
||||||
|
p : TPoint;
|
||||||
|
i : Integer;
|
||||||
|
|
||||||
|
t : single;
|
||||||
|
begin
|
||||||
|
with move do begin
|
||||||
|
if sticked then Exit;
|
||||||
|
|
||||||
|
cx := x + dx * atime;
|
||||||
|
cy := y + dy * atime;
|
||||||
|
if cy < 0 then begin
|
||||||
|
cy := 0;
|
||||||
|
dy := -dy;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if cx < 0 then begin
|
||||||
|
cx := 0;
|
||||||
|
dx := -dx;
|
||||||
|
end else if cx > width then begin
|
||||||
|
cx := width;
|
||||||
|
dx := -dx;
|
||||||
|
end;
|
||||||
|
|
||||||
|
p.x := Round(cx);
|
||||||
|
p.y := Round(cy);
|
||||||
|
|
||||||
|
for i := 0 to brickCount - 1 do begin
|
||||||
|
if (bricks[i].health > 0) and PtInRect(bricks[i].hitRect, p) then begin
|
||||||
|
BoundsBack(bricks[i].bounds, dx, dy);
|
||||||
|
bricks[i].flash:=2;
|
||||||
|
dec(bricks[i].health);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if (cy >= PaddleY-5) and (cx >= PaddleX) and (cx <= PaddleX + PaddleW) and (dy>0) then begin
|
||||||
|
t := (cx - PaddleX - PaddleW/2) / (PaddleW/2);
|
||||||
|
|
||||||
|
if t > 1 then t := 1
|
||||||
|
else if t < -1 then t:=-1;
|
||||||
|
|
||||||
|
|
||||||
|
if t < 0 then
|
||||||
|
t := pi/2 + pi/16 - t / 2
|
||||||
|
else
|
||||||
|
t := pi/2 - pi/16 - t / 2;
|
||||||
|
dx := cos(t)*ballVelocity;
|
||||||
|
dy := -sin(t)*ballVelocity;
|
||||||
|
cy := PaddleY-5;
|
||||||
|
end else if cy > height then begin
|
||||||
|
ResetPaddle;
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
x:=cx;
|
||||||
|
y:=cy;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TArkanoid.SetPaddleX(AValue: Integer);
|
||||||
|
begin
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TArkanoid.ResetPaddle;
|
||||||
|
var
|
||||||
|
i : integer;
|
||||||
|
a : single;
|
||||||
|
begin
|
||||||
|
PaddleW := width / 5;
|
||||||
|
PaddleY := height - 10;
|
||||||
|
fPaddleX := width / 2 - PaddleW / 2;
|
||||||
|
ballcount := 1;
|
||||||
|
for i := 0 to ballcount - 1 do
|
||||||
|
with Balls[i] do begin
|
||||||
|
{x := random(height-40)+20;
|
||||||
|
y := random(width-40)+20;}
|
||||||
|
x := PaddleX+PaddleW/2;
|
||||||
|
y := PaddleY-5;
|
||||||
|
a := random*pi/4 + (pi/2 - pi/8);
|
||||||
|
if cos(a)*5 < 0.1 then a := a + pi/5;
|
||||||
|
dx := ballVelocity*cos(a);
|
||||||
|
dy := ballVelocity*sin(a);
|
||||||
|
sticked:=true;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TArkanoid.Create(awidth, aheight: Integer);
|
||||||
|
begin
|
||||||
|
width := awidth;
|
||||||
|
height := aheight;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure MakeHitRect(const boundsRect: TRect; var hitRect: TRect);
|
||||||
|
begin
|
||||||
|
hitRect.left := boundsRect.left - 3;
|
||||||
|
hitRect.Top := boundsRect.top - 3;
|
||||||
|
hitRect.right := boundsRect.right + 3;
|
||||||
|
hitRect.bottom:= boundsRect.bottom+ 3;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TArkanoid.InitBricks;
|
||||||
|
var
|
||||||
|
i : Integer;
|
||||||
|
x, y : integer;
|
||||||
|
begin
|
||||||
|
brickCount := 8*8;
|
||||||
|
for i := 0 to brickCount - 1 do begin
|
||||||
|
x := (i mod 8) * 40;
|
||||||
|
y := (i div 8) * 20 + 40;
|
||||||
|
bricks[i].bounds:=Bounds(x,y,40,20);
|
||||||
|
end;
|
||||||
|
|
||||||
|
for i:=0 to brickCount - 1 do begin
|
||||||
|
bricks[i].health := random(4)+1;
|
||||||
|
MakeHitRect(bricks[i].bounds, bricks[i].hitRect);
|
||||||
|
bricks[i].flash:=0;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TArkanoid.Init;
|
||||||
|
begin
|
||||||
|
InitBricks;
|
||||||
|
ResetPaddle;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TArkanoid.Move;
|
||||||
|
var
|
||||||
|
i : Integer;
|
||||||
|
const
|
||||||
|
time : single = 1;
|
||||||
|
begin
|
||||||
|
for i := 0 to ballcount - 1 do
|
||||||
|
BallMove(balls[i], time);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TArkanoid.AnySticked: Boolean;
|
||||||
|
var
|
||||||
|
i : Integer;
|
||||||
|
begin
|
||||||
|
Result := false;
|
||||||
|
for i := 0 to ballcount - 1 do
|
||||||
|
if balls[i].sticked then begin
|
||||||
|
Result:=true;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TArkanoid.LaunchSticked;
|
||||||
|
var
|
||||||
|
i : integer;
|
||||||
|
begin
|
||||||
|
for i := 0 to ballcount - 1 do
|
||||||
|
if balls[i].sticked then begin
|
||||||
|
balls[i].sticked:=false;
|
||||||
|
if balls[i].dy > 0 then balls[i].dy := - balls[i].dy;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
||||||
|
|
BIN
components/iphonelazext/examples/iArkanoid/iArk.ico
Normal file
BIN
components/iphonelazext/examples/iArkanoid/iArk.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 66 KiB |
119
components/iphonelazext/examples/iArkanoid/iArk.lpi
Normal file
119
components/iphonelazext/examples/iArkanoid/iArk.lpi
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<CONFIG>
|
||||||
|
<ProjectOptions>
|
||||||
|
<Version Value="7"/>
|
||||||
|
<General>
|
||||||
|
<Flags>
|
||||||
|
<MainUnitHasCreateFormStatements Value="False"/>
|
||||||
|
<MainUnitHasTitleStatement Value="False"/>
|
||||||
|
<UseDefaultCompilerOptions Value="True"/>
|
||||||
|
</Flags>
|
||||||
|
<MainUnit Value="0"/>
|
||||||
|
<TargetFileExt Value=""/>
|
||||||
|
<Title Value="iArkanoid"/>
|
||||||
|
<UseXPManifest Value="True"/>
|
||||||
|
<Icon Value="0"/>
|
||||||
|
<ActiveEditorIndexAtStart Value="0"/>
|
||||||
|
</General>
|
||||||
|
<VersionInfo>
|
||||||
|
<ProjectVersion Value=""/>
|
||||||
|
<Language Value=""/>
|
||||||
|
<CharSet Value=""/>
|
||||||
|
</VersionInfo>
|
||||||
|
<CustomData Count="4">
|
||||||
|
<Item0 Name="iPhone/AppID" Value="com.mycompany.myapplication"/>
|
||||||
|
<Item1 Name="iPhone/SDK" Value="iPhone 2.0"/>
|
||||||
|
<Item2 Name="iPhone/SimSpaceName" Value="66F9A1EA-95F4-2F39-1C03-2ED8D5218316"/>
|
||||||
|
<Item3 Name="iPhone/isiPhoneApp" Value="true"/>
|
||||||
|
</CustomData>
|
||||||
|
<PublishOptions>
|
||||||
|
<Version Value="2"/>
|
||||||
|
<IgnoreBinaries Value="False"/>
|
||||||
|
<IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
|
||||||
|
<ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/>
|
||||||
|
</PublishOptions>
|
||||||
|
<RunParams>
|
||||||
|
<local>
|
||||||
|
<FormatVersion Value="1"/>
|
||||||
|
<LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
|
||||||
|
</local>
|
||||||
|
</RunParams>
|
||||||
|
<Units Count="3">
|
||||||
|
<Unit0>
|
||||||
|
<Filename Value="iArk.pas"/>
|
||||||
|
<IsPartOfProject Value="True"/>
|
||||||
|
<UnitName Value="iArk"/>
|
||||||
|
<CursorPos X="17" Y="96"/>
|
||||||
|
<TopLine Value="94"/>
|
||||||
|
<EditorIndex Value="0"/>
|
||||||
|
<UsageCount Value="20"/>
|
||||||
|
<Loaded Value="True"/>
|
||||||
|
<SyntaxHighlighter Value="Delphi"/>
|
||||||
|
</Unit0>
|
||||||
|
<Unit1>
|
||||||
|
<Filename Value="gameengine.pas"/>
|
||||||
|
<UnitName Value="gameengine"/>
|
||||||
|
<CursorPos X="1" Y="1"/>
|
||||||
|
<TopLine Value="1"/>
|
||||||
|
<UsageCount Value="10"/>
|
||||||
|
<SyntaxHighlighter Value="Delphi"/>
|
||||||
|
</Unit1>
|
||||||
|
<Unit2>
|
||||||
|
<Filename Value="../../../../Fpc_Laz/lazarus-ccr/iphonelazext/project_iphone_options.pas"/>
|
||||||
|
<ComponentName Value="iPhoneProjectOptionsEditor"/>
|
||||||
|
<HasResources Value="True"/>
|
||||||
|
<ResourceBaseClass Value="Form"/>
|
||||||
|
<UnitName Value="project_iphone_options"/>
|
||||||
|
<CursorPos X="17" Y="82"/>
|
||||||
|
<TopLine Value="67"/>
|
||||||
|
<UsageCount Value="10"/>
|
||||||
|
</Unit2>
|
||||||
|
</Units>
|
||||||
|
<JumpHistory Count="0" HistoryIndex="-1"/>
|
||||||
|
</ProjectOptions>
|
||||||
|
<CompilerOptions>
|
||||||
|
<Version Value="8"/>
|
||||||
|
<SearchPaths>
|
||||||
|
<IncludeFiles Value="$(ProjOutDir)/"/>
|
||||||
|
<LCLWidgetType Value="nogui"/>
|
||||||
|
</SearchPaths>
|
||||||
|
<Parsing>
|
||||||
|
<SyntaxOptions>
|
||||||
|
<SyntaxMode Value="Delphi"/>
|
||||||
|
<CStyleOperator Value="False"/>
|
||||||
|
<IncludeAssertionCode Value="True"/>
|
||||||
|
<CPPInline Value="False"/>
|
||||||
|
<UseAnsiStrings Value="True"/>
|
||||||
|
</SyntaxOptions>
|
||||||
|
</Parsing>
|
||||||
|
<Linking>
|
||||||
|
<Debugging>
|
||||||
|
<UseLineInfoUnit Value="False"/>
|
||||||
|
</Debugging>
|
||||||
|
<LinkSmart Value="True"/>
|
||||||
|
</Linking>
|
||||||
|
<Other>
|
||||||
|
<CompilerMessages>
|
||||||
|
<IgnoredMessages idx3018="True" idx3031="True" idx3189="True" idx4035="True" idx4036="True" idx4055="True" idx4079="True" idx4080="True" idx4081="True" idx5024="True" idx5057="True" idx5058="True" idx5060="True"/>
|
||||||
|
</CompilerMessages>
|
||||||
|
<CustomOptions Value="-XR/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator2.0.sdk"/>
|
||||||
|
<CompilerPath Value="$(CompPath)"/>
|
||||||
|
</Other>
|
||||||
|
</CompilerOptions>
|
||||||
|
<Debugging>
|
||||||
|
<Exceptions Count="4">
|
||||||
|
<Item1>
|
||||||
|
<Name Value="EAbort"/>
|
||||||
|
</Item1>
|
||||||
|
<Item2>
|
||||||
|
<Name Value="ECodetoolError"/>
|
||||||
|
</Item2>
|
||||||
|
<Item3>
|
||||||
|
<Name Value="EFOpenError"/>
|
||||||
|
</Item3>
|
||||||
|
<Item4>
|
||||||
|
<Name Value="EXMLReadError"/>
|
||||||
|
</Item4>
|
||||||
|
</Exceptions>
|
||||||
|
</Debugging>
|
||||||
|
</CONFIG>
|
284
components/iphonelazext/examples/iArkanoid/iArk.pas
Normal file
284
components/iphonelazext/examples/iArkanoid/iArk.pas
Normal file
@ -0,0 +1,284 @@
|
|||||||
|
// iPhone Arkanoid test game
|
||||||
|
//
|
||||||
|
// Author: Dmitry 'skalogryz' Boyarintsev
|
||||||
|
//
|
||||||
|
// You're free to use this unit in anyway you want
|
||||||
|
|
||||||
|
program iArk;
|
||||||
|
|
||||||
|
{$mode objfpc}{$h+}
|
||||||
|
{$modeswitch objectivec1}
|
||||||
|
|
||||||
|
uses
|
||||||
|
Types, SysUtils, CGContext, CGGeometry, iPhoneAll, gameengine;
|
||||||
|
|
||||||
|
type
|
||||||
|
// should conform to UIApplicationDelegateProtocol
|
||||||
|
|
||||||
|
{ MyAppDelegate }
|
||||||
|
|
||||||
|
MyAppDelegate = objcclass(NSObject)
|
||||||
|
procedure applicationDidFinishLaunching_(app: UIApplication); message 'applicationDidFinishLaunching:';
|
||||||
|
procedure applicationWillTerminate_(application: UIApplication); message 'applicationWillTerminate:';
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ MyMainWindow }
|
||||||
|
|
||||||
|
MyMainWindow = objcclass(UIWindow)
|
||||||
|
private
|
||||||
|
timer : NSTimer;
|
||||||
|
clr : Integer;
|
||||||
|
game : TArkanoid;
|
||||||
|
canmove : Boolean;
|
||||||
|
tx, ty : Integer;
|
||||||
|
px : Integer;
|
||||||
|
protected
|
||||||
|
procedure timerEvent_(Sender: NSTimer); message 'timerEvent:';
|
||||||
|
|
||||||
|
public
|
||||||
|
procedure touchesBegan_withEvent(touches: NSSetPointer; event: UIEvent); override;
|
||||||
|
procedure touchesMoved_withEvent(touches: NSSetPointer; event: UIEvent); override;
|
||||||
|
procedure touchesEnded_withEvent(touches: NSSetPointer; event: UIEvent); override;
|
||||||
|
procedure touchesCancelled_withEvent(touches: NSSetPointer; event: UIEvent); override;
|
||||||
|
|
||||||
|
procedure initObjects; message 'initObjects';
|
||||||
|
procedure releaseObjects; message 'releaseObjects';
|
||||||
|
procedure drawRect(c: CGRect); override;
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
mainWin : MyMainWindow = nil;
|
||||||
|
|
||||||
|
const
|
||||||
|
PaddleHeight = 10;
|
||||||
|
GameYOffset = 50;
|
||||||
|
|
||||||
|
procedure MakeCGRect(const r: TRect; var cg: CGRect); inline;
|
||||||
|
begin
|
||||||
|
cg.origin.x := r.Left;
|
||||||
|
cg.origin.y := r.Top;
|
||||||
|
cg.size.width := r.Right - r.Left;
|
||||||
|
cg.size.height := r.Bottom - r.Top;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure DrawGame(game: TArkanoid; ctx: CGContextRef);
|
||||||
|
var
|
||||||
|
i : Integer;
|
||||||
|
r : CGRect;
|
||||||
|
const
|
||||||
|
ballsz = 10;
|
||||||
|
ballsz2 = ballsz div 2;
|
||||||
|
begin
|
||||||
|
{drawing balls}
|
||||||
|
r.size.width := ballsz;
|
||||||
|
r.size.height := ballsz;
|
||||||
|
CGContextSetRGBFillColor(ctx, 1, 1, 1, 1);
|
||||||
|
CGContextSetRGBStrokeColor(ctx, 0.0, 0.8, 0.8, 1);
|
||||||
|
for i := 0 to game.ballcount - 1 do begin
|
||||||
|
with game.Balls[i] do begin
|
||||||
|
r.origin.x := x - ballsz2;
|
||||||
|
r.origin.y := y - ballsz2;
|
||||||
|
end;
|
||||||
|
CGContextFillEllipseInRect(ctx, r);
|
||||||
|
end;
|
||||||
|
|
||||||
|
{drawing players paddle}
|
||||||
|
r.origin.x := game.PaddleX;
|
||||||
|
r.origin.y := game.PaddleY;
|
||||||
|
r.size.width := game.PaddleW;
|
||||||
|
r.size.height := PaddleHeight;
|
||||||
|
CGContextSetRGBFillColor(ctx, 0.0, 1, 0.2, 1);
|
||||||
|
CGContextFillRect(ctx, r);
|
||||||
|
|
||||||
|
for i := 0 to game.brickCount - 1 do begin
|
||||||
|
if game.bricks[i].flash > 0 then begin
|
||||||
|
MakeCGRect(game.bricks[i].bounds, r);
|
||||||
|
CGContextSetRGBFillColor(ctx, 1, 1, 1, 1);
|
||||||
|
CGContextFillRect(ctx, r);
|
||||||
|
dec(game.bricks[i].flash);
|
||||||
|
end else if game.bricks[i].health > 0 then begin
|
||||||
|
MakeCGRect(game.bricks[i].bounds, r);
|
||||||
|
CGContextSetRGBFillColor(ctx, 1, 0, 0, 1);
|
||||||
|
CGContextFillRect(ctx, r);
|
||||||
|
r.origin.x := r.origin.x+2;
|
||||||
|
r.origin.y := r.origin.y+2;
|
||||||
|
r.size.width := r.size.width-2;
|
||||||
|
r.size.Height := r.size.height-2;
|
||||||
|
CGContextSetRGBFillColor(ctx, 0.8, 0, 0, 1);
|
||||||
|
CGContextFillRect(ctx, r);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ timer event, called every 0.1 second }
|
||||||
|
procedure MyMainWindow.timerEvent_(Sender: NSTimer);
|
||||||
|
begin
|
||||||
|
clr := Random($FFFFFF+1);
|
||||||
|
game.Move;
|
||||||
|
|
||||||
|
setNeedsDisplay;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ initilize game object and timers }
|
||||||
|
procedure MyMainWindow.initObjects;
|
||||||
|
begin
|
||||||
|
{ create timer }
|
||||||
|
timer := NSTimer.scheduledTimerWithTimeInterval_target_selector_userInfo_repeats(
|
||||||
|
double(0.1), Self, objcselector(timerEvent_), nil, true);
|
||||||
|
game := TArkanoid.Create(300, 400);
|
||||||
|
game.Init;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure MyMainWindow.releaseObjects;
|
||||||
|
begin
|
||||||
|
if not Assigned(game) then Exit;
|
||||||
|
timer.invalidate;
|
||||||
|
game.Free;
|
||||||
|
game:=nil;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function GetTouchCoord(touches: NSSetPointer; Window: UIWindow; var x, y: single): Boolean;
|
||||||
|
var
|
||||||
|
st : NSSet;
|
||||||
|
touch : UITouch;
|
||||||
|
p : CGPoint;
|
||||||
|
begin
|
||||||
|
Result := Assigned(touches);
|
||||||
|
if not Result then Exit;
|
||||||
|
st := NSSet(touches);
|
||||||
|
Result := st.count = 1;
|
||||||
|
if not Result then Exit;
|
||||||
|
|
||||||
|
touch := UITouch(st.anyObject);
|
||||||
|
p := touch.locationInView(Window);
|
||||||
|
x := p.x;
|
||||||
|
y := p.y;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function isCoordNearPabble(game: TArkanoid; x, y: single; Border: Integer): Boolean;
|
||||||
|
var
|
||||||
|
p : TPoint;
|
||||||
|
r : TRect;
|
||||||
|
begin
|
||||||
|
p.x := Round(x);
|
||||||
|
p.y := Round(y);
|
||||||
|
r := Bounds(Round(game.PaddleX) - Border, Round(game.PaddleY) - Border, Round(game.PaddleW)+Border*2, PaddleHeight + Border*2);
|
||||||
|
Result := PtInRect(r, p);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure MyMainWindow.touchesBegan_withEvent(touches: NSSetPointer; event: UIEvent);
|
||||||
|
var
|
||||||
|
x, y : single;
|
||||||
|
begin
|
||||||
|
if not GetTouchCoord(touches, self, x, y) then Exit;
|
||||||
|
canmove := isCoordNearPabble(game, x, y-GameYOffset, 20);
|
||||||
|
if canmove then px := Round(x);
|
||||||
|
tx:=round(x);
|
||||||
|
ty:=round(y);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure MyMainWindow.touchesMoved_withEvent(touches: NSSetPointer; event: UIEvent);
|
||||||
|
var
|
||||||
|
x, y : single;
|
||||||
|
begin
|
||||||
|
if not GetTouchCoord(touches, self, x, y) then Exit;
|
||||||
|
tx:=round(x);
|
||||||
|
ty:=round(y);
|
||||||
|
if canmove then begin
|
||||||
|
game.PaddleX := game.PaddleX + Round(x) - px;
|
||||||
|
px := Round(x);
|
||||||
|
end;
|
||||||
|
inherited touchesMoved_withEvent(touches, event);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure MyMainWindow.touchesEnded_withEvent(touches: NSSetPointer;
|
||||||
|
event: UIEvent);
|
||||||
|
begin
|
||||||
|
canmove := false;
|
||||||
|
|
||||||
|
game.LaunchSticked;
|
||||||
|
inherited touchesEnded_withEvent(touches, event);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure MyMainWindow.touchesCancelled_withEvent(touches: NSSetPointer;
|
||||||
|
event: UIEvent);
|
||||||
|
begin
|
||||||
|
canmove := false;
|
||||||
|
inherited touchesCancelled_withEvent(touches, event);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure MyMainWindow.drawRect(c: CGRect);
|
||||||
|
var
|
||||||
|
ctx : CGContextRef;
|
||||||
|
txt : string;
|
||||||
|
begin
|
||||||
|
if not Assigned(game) then Exit;
|
||||||
|
|
||||||
|
ctx := UIGraphicsGetCurrentContext;
|
||||||
|
if not canmove then
|
||||||
|
CGContextSetRGBFillColor(ctx, 0, 0.0, 0.25, 1)
|
||||||
|
else
|
||||||
|
CGContextSetRGBFillColor(ctx, 0, 0.25, 0.0, 1);
|
||||||
|
UIRectFill(c);
|
||||||
|
|
||||||
|
|
||||||
|
CGContextScaleCTM(ctx, 1, -1);
|
||||||
|
CGContextTranslateCTM(ctx, 0, -c.size.height);
|
||||||
|
|
||||||
|
CGContextSetRGBFillColor(ctx, 1, 1, 0, 1);
|
||||||
|
CGContextSetRGBStrokeColor(ctx, 1, 1, 0, 1);
|
||||||
|
|
||||||
|
CGContextSelectFont(ctx, 'Helvetica', 20, kCGEncodingMacRoman);
|
||||||
|
if Assigned(game) then begin
|
||||||
|
txt := Format('touch: %d %d; paddle: %d %d', [tx,ty, Round(game.PaddleX), Round(game.PaddleY)]);
|
||||||
|
CGContextShowTextAtPoint(ctx, 10, c.size.height - 40, PChar(txt), length(txt));
|
||||||
|
end;
|
||||||
|
|
||||||
|
CGContextTranslateCTM(ctx, 0, c.size.height);
|
||||||
|
CGContextScaleCTM(ctx, 1, -1);
|
||||||
|
|
||||||
|
CGContextTranslateCTM(ctx, 0, GameYOffset);
|
||||||
|
DrawGame(game, ctx);
|
||||||
|
CGContextTranslateCTM(ctx, 0, -GameYOffset);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure MyAppDelegate.applicationDidFinishLaunching_(app: UIApplication);
|
||||||
|
var
|
||||||
|
screen : UIScreen;
|
||||||
|
r : CGRect;
|
||||||
|
begin
|
||||||
|
screen := UIScreen.mainScreen;
|
||||||
|
if Assigned(screen) then begin
|
||||||
|
r := screen.bounds;
|
||||||
|
if not Assigned(mainWin) then begin
|
||||||
|
mainWin := MyMainWindow(MyMainWindow.alloc).initWithFrame(r);
|
||||||
|
{initilize game object and timers}
|
||||||
|
mainWin.initObjects;
|
||||||
|
end;
|
||||||
|
mainWin.makeKeyAndVisible;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure MyAppDelegate.applicationWillTerminate_(application: UIApplication);
|
||||||
|
begin
|
||||||
|
mainWin.releaseObjects;
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
pool : NSAutoreleasePool;
|
||||||
|
retVal : Integer;
|
||||||
|
|
||||||
|
{$R iArk.res}
|
||||||
|
|
||||||
|
begin
|
||||||
|
randomize;
|
||||||
|
pool := NSAutoreleasePool(NSAutoreleasePool.alloc).init;
|
||||||
|
|
||||||
|
retVal := UIApplicationMain(argc, argv, nil, NSStr('MyAppDelegate'));
|
||||||
|
|
||||||
|
pool.release;
|
||||||
|
ExitCode := retVal;
|
||||||
|
end.
|
||||||
|
|
@ -170,13 +170,8 @@ var
|
|||||||
idx : Integer;
|
idx : Integer;
|
||||||
needfix : Boolean;
|
needfix : Boolean;
|
||||||
sdkuse : String;
|
sdkuse : String;
|
||||||
sdkname : string;
|
|
||||||
begin
|
begin
|
||||||
|
sdkuse:=EnvOptions.GetSDKFullPath(ProjOptions.SDK, not isRealDevice);
|
||||||
if isRealDevice
|
|
||||||
then EnvOptions.GetDeviceSDK(ProjOptions.SDK, sdkname, sdkuse)
|
|
||||||
else EnvOptions.GetSimSDK(ProjOptions.SDK, sdkname, sdkuse);
|
|
||||||
sdkuse:=sdkuse;
|
|
||||||
|
|
||||||
Result:=Options;
|
Result:=Options;
|
||||||
if FindParam(Result, '-XR', idx, rawprm) then begin
|
if FindParam(Result, '-XR', idx, rawprm) then begin
|
||||||
|
@ -20,7 +20,7 @@ unit iPhoneExtOptions;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
Classes, SysUtils, IDEOptionsIntf, LazIDEIntf, ProjectIntf, iPhoneBundle, XMLConf;
|
Classes, SysUtils, IDEOptionsIntf, LazIDEIntf, ProjectIntf, iPhoneBundle, DOM, XMLRead, XMLConf, PlistFile;
|
||||||
|
|
||||||
type
|
type
|
||||||
|
|
||||||
@ -48,6 +48,14 @@ type
|
|||||||
|
|
||||||
{ TiPhoneEnvironmentOptions }
|
{ TiPhoneEnvironmentOptions }
|
||||||
|
|
||||||
|
TSDKInfo = class(TObject)
|
||||||
|
devName : String;
|
||||||
|
devPath : String;
|
||||||
|
simName : String;
|
||||||
|
simPath : String;
|
||||||
|
options : String;
|
||||||
|
end;
|
||||||
|
|
||||||
TiPhoneEnvironmentOptions = class(TAbstractIDEEnvironmentOptions)
|
TiPhoneEnvironmentOptions = class(TAbstractIDEEnvironmentOptions)
|
||||||
private
|
private
|
||||||
fPlatformsBaseDir : string;
|
fPlatformsBaseDir : string;
|
||||||
@ -56,24 +64,29 @@ type
|
|||||||
fCommonOpt : string;
|
fCommonOpt : string;
|
||||||
fSimAppsPath : string;
|
fSimAppsPath : string;
|
||||||
fSimBundle : string;
|
fSimBundle : string;
|
||||||
|
fDefaultSDK : string;
|
||||||
|
|
||||||
|
fVersions : TStringList;
|
||||||
protected
|
protected
|
||||||
function XMLFileName: string;
|
function XMLFileName: string;
|
||||||
|
|
||||||
|
procedure ClearVersionsInfo;
|
||||||
|
procedure FoundSDK(const Version, DevSDKName, DevSDKPath, SimSDKName, SimSDKPath: String);
|
||||||
|
function GetSDKInfo(const Version: String): TSDKInfo;
|
||||||
public
|
public
|
||||||
constructor Create;
|
constructor Create;
|
||||||
|
destructor Destroy; override;
|
||||||
class function GetGroupCaption: string; override;
|
class function GetGroupCaption: string; override;
|
||||||
class function GetInstance: TAbstractIDEOptions; override;
|
class function GetInstance: TAbstractIDEOptions; override;
|
||||||
|
|
||||||
function Load: Boolean;
|
function Load: Boolean;
|
||||||
function Save: Boolean;
|
function Save: Boolean;
|
||||||
|
|
||||||
function GetSimSDK(const ProjSDK: string; var SDKName, SDKFullPath: string): Boolean;
|
|
||||||
function GetDeviceSDK(const ProjSDK: string; var SDKName, SDKFullPath: string): Boolean;
|
|
||||||
|
|
||||||
function GetSDKName(const SDKVer: string; simulator: Boolean): string;
|
function GetSDKName(const SDKVer: string; simulator: Boolean): string;
|
||||||
function GetSDKFullPath(const SDKVer: string; simulator: Boolean): string;
|
function GetSDKFullPath(const SDKVer: string; simulator: Boolean): string;
|
||||||
|
|
||||||
procedure GetSDKVersions(Strings: TStringList);
|
procedure GetSDKVersions(Strings: TStrings);
|
||||||
|
procedure RefreshVersions;
|
||||||
|
|
||||||
property PlatformsBaseDir: string read fPlatformsBaseDir write fPlatformsBaseDir;
|
property PlatformsBaseDir: string read fPlatformsBaseDir write fPlatformsBaseDir;
|
||||||
property CompilerPath: string read fCompilerPath write fCompilerPath;
|
property CompilerPath: string read fCompilerPath write fCompilerPath;
|
||||||
@ -82,11 +95,20 @@ type
|
|||||||
|
|
||||||
property SimBundle: string read fSimBundle write fSimBundle;
|
property SimBundle: string read fSimBundle write fSimBundle;
|
||||||
property SimAppsPath: string read fSimAppsPath write fSimAppsPath;
|
property SimAppsPath: string read fSimAppsPath write fSimAppsPath;
|
||||||
|
|
||||||
|
property DefaultSDK: string read fDefaultSDK write fDefaultSDK;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function EnvOptions: TiPhoneEnvironmentOptions;
|
function EnvOptions: TiPhoneEnvironmentOptions;
|
||||||
function ProjOptions: TiPhoneProjectOptions;
|
function ProjOptions: TiPhoneProjectOptions;
|
||||||
|
|
||||||
|
|
||||||
|
type
|
||||||
|
TSDKFoundEvent = procedure (const Version: String;
|
||||||
|
const DeviceSDKName, DeviceSDKPath, SimSDKName, SimSDKPath: string) of object;
|
||||||
|
|
||||||
|
function ScanForSDK(const PlatformDir: String; FoundProc: TSDKFoundEvent): Boolean;
|
||||||
|
|
||||||
var
|
var
|
||||||
iPhoneEnvGroup : Integer;
|
iPhoneEnvGroup : Integer;
|
||||||
iPhonePrjGroup : Integer;
|
iPhonePrjGroup : Integer;
|
||||||
@ -150,6 +172,39 @@ begin
|
|||||||
Result:=IncludeTrailingPathDelimiter(LazarusIDE.GetPrimaryConfigPath)+DefaultXMLName;
|
Result:=IncludeTrailingPathDelimiter(LazarusIDE.GetPrimaryConfigPath)+DefaultXMLName;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TiPhoneEnvironmentOptions.ClearVersionsInfo;
|
||||||
|
var
|
||||||
|
i : Integer;
|
||||||
|
begin
|
||||||
|
for i:=0 to fVersions.Count-1 do begin
|
||||||
|
fVersions.Objects[i].Free;
|
||||||
|
fVersions.Objects[i]:=nil;
|
||||||
|
end;
|
||||||
|
fVersions.Clear;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TiPhoneEnvironmentOptions.FoundSDK(const Version, DevSDKName,
|
||||||
|
DevSDKPath, SimSDKName, SimSDKPath: String);
|
||||||
|
var
|
||||||
|
info: TSDKInfo;
|
||||||
|
begin
|
||||||
|
info:=TSDKInfo.Create;
|
||||||
|
info.devName:=DevSDKName;
|
||||||
|
info.devPath:=DevSDKPath;
|
||||||
|
info.simName:=SimSDKName;
|
||||||
|
info.simPath:=SimSDKPath;
|
||||||
|
fVersions.AddObject(Version, info);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TiPhoneEnvironmentOptions.GetSDKInfo(const Version: String): TSDKInfo;
|
||||||
|
var
|
||||||
|
i : Integer;
|
||||||
|
begin
|
||||||
|
i:=fVersions.IndexOf(Version);
|
||||||
|
if i<0 then Result:=nil
|
||||||
|
else Result:=TSDKInfo(fVersions.Objects[i]);
|
||||||
|
end;
|
||||||
|
|
||||||
function GetDefaultPlatformPath: WideString;
|
function GetDefaultPlatformPath: WideString;
|
||||||
begin
|
begin
|
||||||
//todo:
|
//todo:
|
||||||
@ -177,6 +232,14 @@ begin
|
|||||||
fSimAppsPath := GetDefaultSimAppPath;
|
fSimAppsPath := GetDefaultSimAppPath;
|
||||||
fSimBundle := GetDefaultSimBundlePath;
|
fSimBundle := GetDefaultSimBundlePath;
|
||||||
fCompilerPath := '/usr/local/bin/fpc';
|
fCompilerPath := '/usr/local/bin/fpc';
|
||||||
|
fVersions:=TStringList.Create;
|
||||||
|
end;
|
||||||
|
|
||||||
|
destructor TiPhoneEnvironmentOptions.Destroy;
|
||||||
|
begin
|
||||||
|
ClearVersionsInfo;
|
||||||
|
fVersions.Free;
|
||||||
|
inherited Destroy;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -196,6 +259,11 @@ begin
|
|||||||
fCommonOpt := UTF8Encode(xmlcfg.GetValue('CompilerOptions', fCommonOpt));
|
fCommonOpt := UTF8Encode(xmlcfg.GetValue('CompilerOptions', fCommonOpt));
|
||||||
fSimBundle := UTF8Encode(xmlcfg.GetValue('SimBundle', fSimBundle));
|
fSimBundle := UTF8Encode(xmlcfg.GetValue('SimBundle', fSimBundle));
|
||||||
fSimAppsPath := UTF8Encode(xmlcfg.GetValue('SimAppPath', fSimAppsPath));
|
fSimAppsPath := UTF8Encode(xmlcfg.GetValue('SimAppPath', fSimAppsPath));
|
||||||
|
fDefaultSDK := UTF8Encode(xmlcfg.GetValue('DefaultSDK', fDefaultSDK));
|
||||||
|
|
||||||
|
RefreshVersions;
|
||||||
|
if (fDefaultSDK = '') and (fVersions.Count>0) then
|
||||||
|
fDefaultSDK:=fVersions[0];
|
||||||
finally
|
finally
|
||||||
xmlcfg.Free;
|
xmlcfg.Free;
|
||||||
end;
|
end;
|
||||||
@ -220,6 +288,7 @@ begin
|
|||||||
xmlcfg.SetValue('CompilerOptions', UTF8Decode(fCommonOpt));
|
xmlcfg.SetValue('CompilerOptions', UTF8Decode(fCommonOpt));
|
||||||
xmlcfg.SetValue('SimBundle', UTF8Decode(fSimBundle));
|
xmlcfg.SetValue('SimBundle', UTF8Decode(fSimBundle));
|
||||||
xmlcfg.SetValue('SimAppPath', UTF8Decode(fSimAppsPath));
|
xmlcfg.SetValue('SimAppPath', UTF8Decode(fSimAppsPath));
|
||||||
|
xmlcfg.SetValue('DefaultSDK', UTF8Decode(fDefaultSDK));
|
||||||
finally
|
finally
|
||||||
xmlcfg.Free;
|
xmlcfg.Free;
|
||||||
end;
|
end;
|
||||||
@ -229,41 +298,42 @@ begin
|
|||||||
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TiPhoneEnvironmentOptions.GetSimSDK(const ProjSDK: string; var SDKName, SDKFullPath: string): Boolean;
|
function TiPhoneEnvironmentOptions.GetSDKName(const SDKVer: string; simulator: Boolean): string;
|
||||||
const
|
var
|
||||||
iPhoneSimSDKDir = 'iPhoneSimulator2.0.sdk';
|
info : TSDKInfo;
|
||||||
begin
|
begin
|
||||||
SDKName:=sdk_iPhoneSim2_0;
|
info:=GetSDKInfo(SDKVer);
|
||||||
SDKFullPath:=IncludeTrailingPathDelimiter(fPlatformsBaseDir)+'iPhoneSimulator.platform/Developer/SDKs/'+iPhoneSimSDKDir;
|
if not Assigned(info) then Result:=''
|
||||||
Result:=true;
|
else begin
|
||||||
end;
|
if simulator then Result:=info.devName
|
||||||
|
else Result:=info.simName;
|
||||||
function TiPhoneEnvironmentOptions.GetDeviceSDK(const ProjSDK: string; var SDKName, SDKFullPath: string): Boolean;
|
end;
|
||||||
begin
|
|
||||||
SDKName:='iphoneos2.0';
|
|
||||||
SDKFullPath:='';
|
|
||||||
Result:=false;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TiPhoneEnvironmentOptions.GetSDKName(const SDKVer: string;
|
|
||||||
simulator: Boolean): string;
|
|
||||||
begin
|
|
||||||
if simulator then Result:='iphonesimulator2.0'
|
|
||||||
else Result:='iphoneos2.0';
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TiPhoneEnvironmentOptions.GetSDKFullPath(const SDKVer: string; simulator: Boolean): string;
|
function TiPhoneEnvironmentOptions.GetSDKFullPath(const SDKVer: string; simulator: Boolean): string;
|
||||||
|
var
|
||||||
|
info : TSDKInfo;
|
||||||
begin
|
begin
|
||||||
if simulator then
|
info:=GetSDKInfo(SDKVer);
|
||||||
Result := IncludeTrailingPathDelimiter(fPlatformsBaseDir)+'iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator2.0.sdk'
|
if not Assigned(info) then Result:=''
|
||||||
else
|
else begin
|
||||||
Result := IncludeTrailingPathDelimiter(fPlatformsBaseDir)+'iPhoneOS.platform/Developer/SDKs/iPhoneOS2.0.sdk';
|
if simulator then Result:=info.devPath
|
||||||
|
else Result:=info.simPath;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TiPhoneEnvironmentOptions.GetSDKVersions(Strings: TStringList);
|
procedure TiPhoneEnvironmentOptions.GetSDKVersions(Strings: TStrings);
|
||||||
|
var
|
||||||
|
i : Integer;
|
||||||
begin
|
begin
|
||||||
//todo:
|
for i:=0 to fVersions.Count-1 do
|
||||||
Strings.Add('iPhone OS 2.0');
|
Strings.Add( fVersions[i] );
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TiPhoneEnvironmentOptions.RefreshVersions;
|
||||||
|
begin
|
||||||
|
ClearVersionsInfo;
|
||||||
|
ScanForSDK(EnvOptions.PlatformsBaseDir, @FoundSDK);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TiPhoneProjectOptions }
|
{ TiPhoneProjectOptions }
|
||||||
@ -321,6 +391,102 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
type
|
||||||
|
TSDKDescription = record
|
||||||
|
FullPath : String; {full SDK path}
|
||||||
|
Name : String;
|
||||||
|
Alternate : String; {alternate SDK -> iphonesimulator for iphoneos}
|
||||||
|
Version : String;
|
||||||
|
isDevice : Boolean; {true for real iPhoneOS, false for iPhoneSimulator}
|
||||||
|
end;
|
||||||
|
|
||||||
|
// todo: implement reading .plist via OSX functions! (in case a .plist format changes)
|
||||||
|
function ReadSDKSettings(const FileName: string; var Descr: TSDKDescription): Boolean;
|
||||||
|
var
|
||||||
|
plist : TPListFile;
|
||||||
|
begin
|
||||||
|
Result:=False;
|
||||||
|
plist:=TPListFile.Create(FileName);
|
||||||
|
|
||||||
|
Descr.Name:=plist.GetStrValue('CanonicalName');
|
||||||
|
Descr.Alternate:=plist.GetStrValue('AlternateSDK');
|
||||||
|
Descr.Version:=plist.GetStrValue('Version');
|
||||||
|
|
||||||
|
plist.Free;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function isSDKDir(const SDKDir: String; var d: TSDKDescription): Boolean;
|
||||||
|
var
|
||||||
|
plist : string;
|
||||||
|
begin
|
||||||
|
plist := IncludeTrailingPathDelimiter(SDKDir)+'SDKSettings.plist';
|
||||||
|
Result:=FileExists(plist);
|
||||||
|
if not Result then Exit;
|
||||||
|
ReadSDKSettings(plist, d);
|
||||||
|
d.FullPath:=SDKDir;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function ScanForSDK(const PlatformDir: String; FoundProc: TSDKFoundEvent): Boolean;
|
||||||
|
const
|
||||||
|
PlatformName: array [Boolean] of string = ('iPhoneOS.platform','iPhoneSimulator.platform');
|
||||||
|
SDKSubDir = PathDelim+'Developer'+PathDelim+'SDKs'+PathDelim;
|
||||||
|
var
|
||||||
|
isdev : Boolean;
|
||||||
|
dir : string;
|
||||||
|
sr : TSearchRec;
|
||||||
|
sdks : array of TSDKDescription;
|
||||||
|
descr : TSDKDescription;
|
||||||
|
cnt : Integer;
|
||||||
|
simname : string;
|
||||||
|
simpath : string;
|
||||||
|
i,j : Integer;
|
||||||
|
|
||||||
|
procedure AddDescription(const d: TSDKDescription);
|
||||||
|
begin
|
||||||
|
if cnt = length(sdks) then begin
|
||||||
|
if cnt = 0 then SetLength(sdks, 16)
|
||||||
|
else SetLength(sdks, cnt*2);
|
||||||
|
end;
|
||||||
|
sdks[cnt]:=d;
|
||||||
|
inc(cnt);
|
||||||
|
end;
|
||||||
|
|
||||||
|
begin
|
||||||
|
writeln('scan for SDK');
|
||||||
|
Result:=Assigned(FoundProc);
|
||||||
|
if not Result then Exit;
|
||||||
|
|
||||||
|
cnt:=0;
|
||||||
|
|
||||||
|
for isdev:=false to true do begin
|
||||||
|
dir := IncludeTrailingPathDelimiter(PlatformDir) + PlatformName[isdev] + SDKSubDir;
|
||||||
|
if FindFirst(dir+'*', faAnyFile, sr)=0 then begin
|
||||||
|
repeat
|
||||||
|
if (sr.Attr and faDirectory>0) and (ExtractFileExt(sr.Name) = '.sdk') then
|
||||||
|
if isSDKDir( dir + sr.Name, descr) then begin
|
||||||
|
descr.isDevice:=isdev;
|
||||||
|
AddDescription(descr);
|
||||||
|
end;
|
||||||
|
until FindNext(sr)<>0;
|
||||||
|
FindClose(sr);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
for i:=0 to cnt-1 do
|
||||||
|
if sdks[i].isDevice then begin
|
||||||
|
simname:='';
|
||||||
|
simpath:='';
|
||||||
|
for j:=0 to cnt-1 do
|
||||||
|
if (not sdks[j].isDevice) and (sdks[i].Alternate=sdks[j].Name) then begin
|
||||||
|
simname:=sdks[j].Name;
|
||||||
|
simpath:=sdks[j].FullPath;
|
||||||
|
end;
|
||||||
|
FoundProc(sdks[i].Version, sdks[i].Name, sdks[i].FullPath, simname, simpath);
|
||||||
|
end;
|
||||||
|
|
||||||
|
Result:=True;
|
||||||
|
end;
|
||||||
|
|
||||||
initialization
|
initialization
|
||||||
InitOptions;
|
InitOptions;
|
||||||
|
|
||||||
|
122
components/iphonelazext/plistfile.pas
Normal file
122
components/iphonelazext/plistfile.pas
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
{
|
||||||
|
*****************************************************************************
|
||||||
|
* *
|
||||||
|
* This file is part of the iPhone Laz Extension *
|
||||||
|
* *
|
||||||
|
* See the file COPYING.modifiedLGPL.txt, included in this distribution, *
|
||||||
|
* for details about the copyright. *
|
||||||
|
* *
|
||||||
|
* This program is distributed in the hope that it will be useful, *
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
|
||||||
|
* *
|
||||||
|
*****************************************************************************
|
||||||
|
}
|
||||||
|
unit PlistFile;
|
||||||
|
|
||||||
|
{$mode delphi}
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
Classes, SysUtils, DOM, XMLRead;
|
||||||
|
|
||||||
|
type
|
||||||
|
{ TPListFile }
|
||||||
|
TPListFile = class(TObject)
|
||||||
|
private
|
||||||
|
fFileName : String;
|
||||||
|
fDoc : TXMLDocument;
|
||||||
|
firstkey : TDOMNode;
|
||||||
|
protected
|
||||||
|
procedure ReadValues;
|
||||||
|
//todo: add "parent" for FindKeyNode
|
||||||
|
function FindKeyNode(const keyName: string): TDOMNode;
|
||||||
|
public
|
||||||
|
constructor Create(const AFileName: String);
|
||||||
|
destructor Destroy; override;
|
||||||
|
function GetStrValue(const Key: String): String;
|
||||||
|
end;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
{ TPListFile }
|
||||||
|
|
||||||
|
constructor TPListFile.Create(const AFileName: String);
|
||||||
|
begin
|
||||||
|
fFileName := AFileName;
|
||||||
|
inherited Create;
|
||||||
|
end;
|
||||||
|
|
||||||
|
destructor TPListFile.Destroy;
|
||||||
|
begin
|
||||||
|
fDOC.Free;
|
||||||
|
inherited Destroy;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TPListFile.GetStrValue(const Key: String): String;
|
||||||
|
var
|
||||||
|
node : TDOMNode;
|
||||||
|
begin
|
||||||
|
Result:='';
|
||||||
|
node:=FindKeyNode(Key);
|
||||||
|
if not Assigned(node) then Exit;
|
||||||
|
|
||||||
|
node:=node.NextSibling;
|
||||||
|
if Assigned(node) and (node.NodeName='string') then
|
||||||
|
Result:=node.TextContent
|
||||||
|
else
|
||||||
|
Result:='';
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TPListFile.ReadValues;
|
||||||
|
var
|
||||||
|
plist : TDOMNode;
|
||||||
|
begin
|
||||||
|
firstkey:=nil;
|
||||||
|
try
|
||||||
|
ReadXMLFile(fDoc, fFileName);
|
||||||
|
except
|
||||||
|
end;
|
||||||
|
|
||||||
|
if not Assigned(fDoc) then begin
|
||||||
|
fDoc:=TXMLDocument.Create;
|
||||||
|
Exit; // create an empty document
|
||||||
|
end;
|
||||||
|
|
||||||
|
try
|
||||||
|
plist:=fDoc.FindNode('plist');
|
||||||
|
if not Assigned(plist) then Exit;
|
||||||
|
|
||||||
|
while Assigned(plist) do begin
|
||||||
|
if (plist is TDOMElement) and (plist.NodeName='plist') and (plist.ChildNodes.Count>0) then
|
||||||
|
Break;
|
||||||
|
plist:=plist.NextSibling;
|
||||||
|
end;
|
||||||
|
|
||||||
|
firstkey:=plist.FindNode('dict');
|
||||||
|
if Assigned(firstkey) then
|
||||||
|
firstkey:=firstkey.FindNode('key');
|
||||||
|
|
||||||
|
except
|
||||||
|
firstkey:=nil;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TPListFile.FindKeyNode(const keyName: string): TDOMNode;
|
||||||
|
begin
|
||||||
|
if not Assigned(fDoc) then ReadValues;
|
||||||
|
if not Assigned(firstkey) then begin
|
||||||
|
Result:=nil;
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
Result:=firstkey;
|
||||||
|
while Assigned(Result) do begin
|
||||||
|
if (Result.NodeName='key') and (Result.TextContent=keyName) then Exit;
|
||||||
|
Result:=Result.NextSibling;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
end.
|
||||||
|
|
@ -4,6 +4,7 @@ inherited iPhoneProjectOptionsEditor: TiPhoneProjectOptionsEditor
|
|||||||
ClientHeight = 374
|
ClientHeight = 374
|
||||||
ClientWidth = 618
|
ClientWidth = 618
|
||||||
OnClick = FrameClick
|
OnClick = FrameClick
|
||||||
|
TabOrder = 0
|
||||||
DesignLeft = 355
|
DesignLeft = 355
|
||||||
DesignTop = 224
|
DesignTop = 224
|
||||||
object chkisPhone: TCheckBox[0]
|
object chkisPhone: TCheckBox[0]
|
||||||
@ -55,31 +56,11 @@ inherited iPhoneProjectOptionsEditor: TiPhoneProjectOptionsEditor
|
|||||||
Top = 48
|
Top = 48
|
||||||
Width = 184
|
Width = 184
|
||||||
ItemHeight = 0
|
ItemHeight = 0
|
||||||
ItemIndex = 0
|
|
||||||
Items.Strings = (
|
|
||||||
'iPhone 2.0'
|
|
||||||
'iPhone 2.1'
|
|
||||||
'iPhone 2.2'
|
|
||||||
'iPhone 2.2.1'
|
|
||||||
'iPhone 3.0'
|
|
||||||
'iPhone 3.1'
|
|
||||||
'iPhone 3.1.2'
|
|
||||||
)
|
|
||||||
OnChange = cmbSDKsChange
|
OnChange = cmbSDKsChange
|
||||||
Style = csDropDownList
|
Style = csDropDownList
|
||||||
TabOrder = 2
|
TabOrder = 2
|
||||||
Text = 'iPhone 2.0'
|
|
||||||
end
|
end
|
||||||
object btnCheckSDK: TButton[6]
|
object lblXibFiles: TLabel[6]
|
||||||
Left = 312
|
|
||||||
Height = 20
|
|
||||||
Top = 48
|
|
||||||
Width = 158
|
|
||||||
AutoSize = True
|
|
||||||
Caption = 'Check available SDKs'
|
|
||||||
TabOrder = 3
|
|
||||||
end
|
|
||||||
object lblXibFiles: TLabel[7]
|
|
||||||
Left = 16
|
Left = 16
|
||||||
Height = 18
|
Height = 18
|
||||||
Top = 168
|
Top = 168
|
||||||
|
@ -3,27 +3,22 @@
|
|||||||
LazarusResources.Add('TiPhoneProjectOptionsEditor','FORMDATA',[
|
LazarusResources.Add('TiPhoneProjectOptionsEditor','FORMDATA',[
|
||||||
'TPF0'#241#27'TiPhoneProjectOptionsEditor'#26'iPhoneProjectOptionsEditor'#6'H'
|
'TPF0'#241#27'TiPhoneProjectOptionsEditor'#26'iPhoneProjectOptionsEditor'#6'H'
|
||||||
+'eight'#3'v'#1#5'Width'#3'j'#2#12'ClientHeight'#3'v'#1#11'ClientWidth'#3'j'#2
|
+'eight'#3'v'#1#5'Width'#3'j'#2#12'ClientHeight'#3'v'#1#11'ClientWidth'#3'j'#2
|
||||||
+#7'OnClick'#7#10'FrameClick'#10'DesignLeft'#3'c'#1#9'DesignTop'#3#224#0#0#242
|
+#7'OnClick'#7#10'FrameClick'#8'TabOrder'#2#0#10'DesignLeft'#3'c'#1#9'DesignT'
|
||||||
+#2#0#9'TCheckBox'#10'chkisPhone'#4'Left'#2#16#6'Height'#2#18#3'Top'#2#16#5'W'
|
+'op'#3#224#0#0#242#2#0#9'TCheckBox'#10'chkisPhone'#4'Left'#2#16#6'Height'#2
|
||||||
+'idth'#3#199#0#7'Caption'#6#29'is iPhone application project'#8'TabOrder'#2#0
|
+#18#3'Top'#2#16#5'Width'#3#199#0#7'Caption'#6#29'is iPhone application proje'
|
||||||
+#0#0#242#2#1#6'TLabel'#8'lblAppID'#4'Left'#2#16#6'Height'#2#18#3'Top'#2'X'#5
|
+'ct'#8'TabOrder'#2#0#0#0#242#2#1#6'TLabel'#8'lblAppID'#4'Left'#2#16#6'Height'
|
||||||
+'Width'#2'W'#7'Caption'#6#14'Application ID'#11'ParentColor'#8#0#0#242#2#2#5
|
+#2#18#3'Top'#2'X'#5'Width'#2'W'#7'Caption'#6#14'Application ID'#11'ParentCol'
|
||||||
+'TEdit'#8'edtAppID'#4'Left'#2'p'#6'Height'#2#22#3'Top'#2'U'#5'Width'#3#232#1
|
+'or'#8#0#0#242#2#2#5'TEdit'#8'edtAppID'#4'Left'#2'p'#6'Height'#2#22#3'Top'#2
|
||||||
+#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#0#8'TabOrder'#2#1#4'Text'#6#19
|
+'U'#5'Width'#3#232#1#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#0#8'TabOrde'
|
||||||
+'com.mycompany.myapp'#0#0#242#2#3#6'TLabel'#12'lblAppIDHint'#4'Left'#2#16#6
|
+'r'#2#1#4'Text'#6#19'com.mycompany.myapp'#0#0#242#2#3#6'TLabel'#12'lblAppIDH'
|
||||||
+'Height'#2#14#3'Top'#2'u'#5'Width'#3#237#1#7'Caption'#6'_It''s recommended b'
|
+'int'#4'Left'#2#16#6'Height'#2#14#3'Top'#2'u'#5'Width'#3#237#1#7'Caption'#6
|
||||||
+'y Apple to use domain-structured name, i.e. com.mycompany.myApplication as '
|
+'_It''s recommended by Apple to use domain-structured name, i.e. com.mycompa'
|
||||||
+'ID'#11'Font.Height'#2#246#11'ParentColor'#8#10'ParentFont'#8#0#0#242#2#4#6
|
+'ny.myApplication as ID'#11'Font.Height'#2#246#11'ParentColor'#8#10'ParentFo'
|
||||||
+'TLabel'#9'lblSDKVer'#4'Left'#2#16#6'Height'#2#18#3'Top'#2'3'#5'Width'#2'P'#7
|
+'nt'#8#0#0#242#2#4#6'TLabel'#9'lblSDKVer'#4'Left'#2#16#6'Height'#2#18#3'Top'
|
||||||
+'Caption'#6#12'SDK version:'#11'ParentColor'#8#0#0#242#2#5#9'TComboBox'#7'cm'
|
+#2'3'#5'Width'#2'P'#7'Caption'#6#12'SDK version:'#11'ParentColor'#8#0#0#242#2
|
||||||
+'bSDKs'#4'Left'#2'p'#6'Height'#2#20#3'Top'#2'0'#5'Width'#3#184#0#10'ItemHeig'
|
+#5#9'TComboBox'#7'cmbSDKs'#4'Left'#2'p'#6'Height'#2#20#3'Top'#2'0'#5'Width'#3
|
||||||
+'ht'#2#0#9'ItemIndex'#2#0#13'Items.Strings'#1#6#10'iPhone 2.0'#6#10'iPhone 2'
|
+#184#0#10'ItemHeight'#2#0#8'OnChange'#7#13'cmbSDKsChange'#5'Style'#7#14'csDr'
|
||||||
+'.1'#6#10'iPhone 2.2'#6#12'iPhone 2.2.1'#6#10'iPhone 3.0'#6#10'iPhone 3.1'#6
|
+'opDownList'#8'TabOrder'#2#2#0#0#242#2#6#6'TLabel'#11'lblXibFiles'#4'Left'#2
|
||||||
+#12'iPhone 3.1.2'#0#8'OnChange'#7#13'cmbSDKsChange'#5'Style'#7#14'csDropDown'
|
+#16#6'Height'#2#18#3'Top'#3#168#0#5'Width'#3#219#0#7'Caption'#6'$.XIB files '
|
||||||
+'List'#8'TabOrder'#2#2#4'Text'#6#10'iPhone 2.0'#0#0#242#2#6#7'TButton'#11'bt'
|
+'might appear here soon...'#11'ParentColor'#8#0#0#0
|
||||||
+'nCheckSDK'#4'Left'#3'8'#1#6'Height'#2#20#3'Top'#2'0'#5'Width'#3#158#0#8'Aut'
|
|
||||||
+'oSize'#9#7'Caption'#6#20'Check available SDKs'#8'TabOrder'#2#3#0#0#242#2#7#6
|
|
||||||
+'TLabel'#11'lblXibFiles'#4'Left'#2#16#6'Height'#2#18#3'Top'#3#168#0#5'Width'
|
|
||||||
+#3#219#0#7'Caption'#6'$.XIB files might appear here soon...'#11'ParentColor'
|
|
||||||
+#8#0#0#0
|
|
||||||
]);
|
]);
|
||||||
|
@ -28,7 +28,6 @@ type
|
|||||||
{ TiPhoneProjectOptionsEditor }
|
{ TiPhoneProjectOptionsEditor }
|
||||||
|
|
||||||
TiPhoneProjectOptionsEditor = class(TAbstractIDEOptionsEditor)
|
TiPhoneProjectOptionsEditor = class(TAbstractIDEOptionsEditor)
|
||||||
btnCheckSDK: TButton;
|
|
||||||
chkisPhone: TCheckBox;
|
chkisPhone: TCheckBox;
|
||||||
cmbSDKs: TComboBox;
|
cmbSDKs: TComboBox;
|
||||||
edtAppID: TEdit;
|
edtAppID: TEdit;
|
||||||
@ -80,7 +79,6 @@ procedure TiPhoneProjectOptionsEditor.Setup(ADialog: TAbstractOptionsEditorDialo
|
|||||||
begin
|
begin
|
||||||
chkisPhone.Caption := strPrjOptIsiPhone;
|
chkisPhone.Caption := strPrjOptIsiPhone;
|
||||||
lblSDKVer.Caption := strPrjOptSDKver;
|
lblSDKVer.Caption := strPrjOptSDKver;
|
||||||
btnCheckSDK.Caption := strPrjOptCheckSDK;
|
|
||||||
lblAppID.Caption := strPtrOptAppID;
|
lblAppID.Caption := strPtrOptAppID;
|
||||||
lblAppIDHint.Caption := strPtrOptAppIDHint;
|
lblAppIDHint.Caption := strPtrOptAppIDHint;
|
||||||
end;
|
end;
|
||||||
@ -95,10 +93,11 @@ begin
|
|||||||
Load;
|
Load;
|
||||||
chkisPhone.Checked:=isIPhoneApp;
|
chkisPhone.Checked:=isIPhoneApp;
|
||||||
|
|
||||||
|
EnvOptions.GetSDKVersions(cmbSDKs.Items);
|
||||||
i:=cmbSDKs.Items.IndexOf(SDK);
|
i:=cmbSDKs.Items.IndexOf(SDK);
|
||||||
if (i<0) and (cmbSDKs.Items.Count>0) then i:=0;
|
if (i<0) and (cmbSDKs.Items.Count>0) then
|
||||||
|
i:=cmbSDKs.Items.IndexOf(EnvOptions.DefaultSDK);
|
||||||
cmbSDKs.ItemIndex:=i;
|
cmbSDKs.ItemIndex:=i;
|
||||||
|
|
||||||
edtAppID.Text:=AppID;
|
edtAppID.Text:=AppID;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user