From b0c00c63e4f95cbdcf1c48ce73277d0d6fb43b13 Mon Sep 17 00:00:00 2001 From: loesje_ Date: Tue, 17 Dec 2013 21:03:56 +0000 Subject: [PATCH] * Added UISegmentedControl git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@2862 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- .../iosdesigner/icons/uisegmentedcontrol.png | Bin 0 -> 702 bytes components/iosdesigner/ios_views.pas | 226 +++++++++++++++++- components/iosdesigner/iosdesigner.res | Bin 7047 -> 7820 bytes components/iosdesigner/iosnibdesigner.pas | 3 +- 4 files changed, 226 insertions(+), 3 deletions(-) create mode 100644 components/iosdesigner/icons/uisegmentedcontrol.png diff --git a/components/iosdesigner/icons/uisegmentedcontrol.png b/components/iosdesigner/icons/uisegmentedcontrol.png new file mode 100644 index 0000000000000000000000000000000000000000..ed781bd51df995759fb05e0bcee46e2c2f0ea786 GIT binary patch literal 702 zcmV;v0zv(WP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_0006}NklW(5thBfX!|uF!^PPF$nR#%${`HbTKV@=w#Q6na?+SO#rHZiioJHSYl39>mrgOBI#e$Z1ITwrMU$bX-B|$U;;Sfu{8TbpaFcgeK87m zJpB^z7+4aKJHRIJ!>|N6TY=Vqx*2W&Pprs$wqFNo2({|0b54QVz%x}{Q`L9CO-rtB z=OSmVRXH|*x4;7f_iZ)YOfSpwM61TED-{{-1R<3;F*s`v^YX4PnE8CR1g2?n3 zh_|-3z5pkIM+W{JNX)+kT;&`GLl;{xKe(&1G9Lx50(XH`;3aUzvpFD&JsMolqLEjh z=?xq)w!p+b!>%R1YQ7T_@Z3^E?Oo!hqlt| kl6g=60kCayy#AB*3)nEU$Z-hBfdBvi07*qoM6N<$g84o=x&QzG literal 0 HcmV?d00001 diff --git a/components/iosdesigner/ios_views.pas b/components/iosdesigner/ios_views.pas index f4f26371b..d48a97f4c 100644 --- a/components/iosdesigner/ios_views.pas +++ b/components/iosdesigner/ios_views.pas @@ -73,7 +73,9 @@ type bvProgressTintColor, bvTrackTintColor, bvProgressViewStyle, - bvEnabled); + bvEnabled, + bvSegments, + bvSelectedSegmentIndex); TXIBProperty = record APropertyName: string; @@ -117,7 +119,9 @@ const (APropertyName: 'IBUIProgressTintColor' ; ADefaultValue: ''), (APropertyName: 'IBUITrackTintColor' ; ADefaultValue: ''), (APropertyName: 'IBUIProgressViewStyle' ; ADefaultValue: '0'), - (APropertyName: 'IBUIEnabled' ; ADefaultValue: 'YES')); + (APropertyName: 'IBUIEnabled' ; ADefaultValue: 'YES'), + (APropertyName: 'IBNumberOfSegments' ; ADefaultValue: '0'), + (APropertyName: 'IBSelectedSegmentIndex' ; ADefaultValue: '')); EventNames : array[1..1] of string = ( 'onTouchDown'); @@ -409,6 +413,40 @@ type class function GetIBClassName: string; override; end; + { UISegmentedControl } + + UISegmentedControl = class(UIView, IFPObserver) + private + FCreatingSegments: boolean; + FSegments: TCollection; + function GetSegments: TCollection; + protected + Procedure FPOObservedChanged(ASender : TObject; Operation : TFPObservedOperation; Data : Pointer); + public + procedure InitializeDefaults; override; + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure paint(ACanvas: TCanvas); override; + class function GetIBClassName: string; override; + property SegmentCount: integer index bvSegments read GetXIBInteger; + published + property Segments: TCollection read GetSegments; + end; + + { TiOSSegmentedControlSegment } + + TiOSSegmentedControlSegment = class(TCollectionItem) + private + FSegmentedControl: UISegmentedControl; + function GetEnabled: boolean; + function GetTitle: string; + procedure SetEnabled(AValue: boolean); + procedure SetTitle(AValue: string); + published + property Title: string read GetTitle write SetTitle; + property Enabled: boolean read GetEnabled write SetEnabled; + end; + { UINavigationController } UINavigationController = class(UIViewController) @@ -699,6 +737,190 @@ begin end; end; +{ TiOSSegmentedControlSegment } + +function TiOSSegmentedControlSegment.GetTitle: string; +var + ANode: TDOMNode; +begin + result := ''; + ANode := FindKeyNode(FSegmentedControl.XIBObjectElement, 'array', 'IBSegmentTitles'); + if assigned(ANode) then + begin + ANode := ANode.ChildNodes.Item[ID]; + if assigned(ANode) then + result := ANode.TextContent; + end +end; + +function TiOSSegmentedControlSegment.GetEnabled: boolean; +begin + result := FSegmentedControl.GetXIBInteger(bvSelectedSegmentIndex) = ID; +end; + +procedure TiOSSegmentedControlSegment.SetEnabled(AValue: boolean); +begin + if AValue then + FSegmentedControl.SetXIBInteger(bvSelectedSegmentIndex, ID); +end; + +procedure TiOSSegmentedControlSegment.SetTitle(AValue: string); +var + ANode: TDOMNode; +begin + ANode := FindKeyNode(FSegmentedControl.XIBObjectElement, 'array', 'IBSegmentTitles'); + ANode := ANode.ChildNodes.Item[ID]; + ANode.TextContent := AValue; +end; + +{ UISegmentedControl } + +function UISegmentedControl.GetSegments: TCollection; +var + ANode: TDOMNode; + ASegment: TiOSSegmentedControlSegment; + i: integer; + SegCnt: integer; +begin + SegCnt:=SegmentCount; + if FSegments.Count<>SegCnt then + begin + FCreatingSegments:=true; + for i := 0 to SegCnt-1 do + begin + ASegment := (FSegments.Add as TiOSSegmentedControlSegment); + ASegment.FSegmentedControl := self; + end; + FCreatingSegments:=false;; + + { if Assigned(XIBObjectElement) then + begin + ANode := FindKeyNode(XIBObjectElement, 'array', 'IBSegmentTitles'); + if assigned(ANode) then + begin + ANode := ANode.FirstChild; + //i := 0; + while assigned(ANode) do + begin + ASegment := (FSegments.Add as TiOSSegmentedControlSegment); + //ASegment.Title:=ANode.TextContent; + ASegment.FSegmentedControl := self; + ANode := ANode.NextSibling; + //inc(i); + end; + end + end} + end; + result := FSegments; +end; + +procedure UISegmentedControl.FPOObservedChanged(ASender: TObject; Operation: TFPObservedOperation; Data: Pointer); +var + ANode: TDOMElement; + ASegment: TiOSSegmentedControlSegment; +begin + if FCreatingSegments then + Exit; + if ASender=FSegments then + begin + case Operation of + ooAddItem : + begin + ASegment := TObject(Data) as TiOSSegmentedControlSegment; + ASegment.FSegmentedControl := self; + ANode := GetKeyNode(XIBObjectElement, 'array', 'IBSegmentTitles'); + AddIBString(ANode, '', 'Segment '+IntToStr((ASegment).ID)); + ANode := GetKeyNode(XIBObjectElement, 'array', 'IBSegmentWidths', 'NSMutableArray'); + ANode := AddElement(ANode,'real'); + ANode.AttribStrings['value']:='0.0'; + ANode := GetKeyNode(XIBObjectElement, 'array', 'IBSegmentEnabledStates', 'NSMutableArray'); + ANode := AddElement(ANode,'boolean'); + ANode.AttribStrings['value']:='YES'; + ANode := GetKeyNode(XIBObjectElement, 'array', 'IBSegmentContentOffsets', 'NSMutableArray'); + AddIBString(ANode, '', '{0, 0}'); + ANode := GetKeyNode(XIBObjectElement, 'array', 'IBSegmentImages', 'NSMutableArray'); + AddIBObject(ANode, '', 'NSNull'); + SetXIBInteger(bvSegments, FSegments.Count); + end; + ooDeleteItem: + begin + ASegment := TObject(Data) as TiOSSegmentedControlSegment; + ANode := GetKeyNode(XIBObjectElement, 'array', 'IBSegmentTitles'); + ANode.RemoveChild(ANode.ChildNodes.Item[ASegment.ID]); + ANode := GetKeyNode(XIBObjectElement, 'array', 'IBSegmentWidths', 'NSMutableArray'); + ANode.RemoveChild(ANode.ChildNodes.Item[ASegment.ID]); + ANode := GetKeyNode(XIBObjectElement, 'array', 'IBSegmentEnabledStates', 'NSMutableArray'); + ANode.RemoveChild(ANode.ChildNodes.Item[ASegment.ID]); + ANode := GetKeyNode(XIBObjectElement, 'array', 'IBSegmentContentOffsets', 'NSMutableArray'); + ANode.RemoveChild(ANode.ChildNodes.Item[ASegment.ID]); + ANode := GetKeyNode(XIBObjectElement, 'array', 'IBSegmentImages', 'NSMutableArray'); + ANode.RemoveChild(ANode.ChildNodes.Item[ASegment.ID]); + SetXIBInteger(bvSegments, FSegments.Count); + end; + end; {case} + end; +end; + +procedure UISegmentedControl.InitializeDefaults; +begin + inherited; + Height:=44;; + FSegments.Add; + FSegments.Add; + (FSegments.Items[0] as TiOSSegmentedControlSegment).Enabled:=true; +end; + +constructor UISegmentedControl.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FSegments := TCollection.Create(TiOSSegmentedControlSegment); + FSegments.FPOAttachObserver(self); + FAcceptChildsAtDesignTime := false; +end; + +destructor UISegmentedControl.Destroy; +begin + FSegments.Free; + inherited Destroy; +end; + +procedure UISegmentedControl.paint(ACanvas: TCanvas); +var + ARadius: integer; + ts: TTextStyle; + i: Integer; +begin + inherited; + with ACanvas do + begin + brush.Color:=clWhite; + pen.Color:=clGray; + pen.Style := psSolid; + + ARadius := min(self.Width,self.Height); + ARadius := min(ARadius, 22); + + RoundRect(0,0,self.Width,self.Height,ARadius, ARadius); + Font.Color:=clBlack; + self.Font.ApplyToLCLFont(Font); + ts := ACanvas.TextStyle; + ts.Alignment:=taCenter; + ts.Layout:=tlCenter; + + for i := 0 to FSegments.Count-1 do + begin + if i > 0 then + Line((self.Width div FSegments.Count)*i,0,(self.Width div FSegments.Count)*i,self.Height); + TextRect(Rect((self.Width div FSegments.Count)*i,0,(self.Width div FSegments.Count)*(i+1),Self.Height), 1, 1, (FSegments.Items[i] as TiOSSegmentedControlSegment).Title, ts); + end; + end; +end; + +class function UISegmentedControl.GetIBClassName: string; +begin + Result:='IBUISegmentedControl'; +end; + { TXIBReader } diff --git a/components/iosdesigner/iosdesigner.res b/components/iosdesigner/iosdesigner.res index c692439d8f6272256f62cbd9843c2ada0b0dc45c..1ca4a6b10ee505a9d880ac6dca4f8162e0287664 100644 GIT binary patch delta 745 zcmV!08{`)07L*o08ao;08{`{08ao+005J56IPQS1r>i$NklW(5thBfX!|uF!^PPF$nR#%${`HbTKV@=w#Q6na?+IeilXkn^OOj+W&+{S% zB+v89s=5L+fl^i1M8eDAMx)VomSwMigV3m|h)9&CX;W2KM5F*d#XwtC9qA|mNu)NJvH{iV4D7HLPod0>A6IODN2`$M1se71ct z3U@sH67U#U5|KN=Ch)_s1UOrP)_}ShZU9fL$a}V52Wkkl>a254f!n|{Rb5lncfd_c zu5RZdXRTE^Hh{Ol0|WPMHQY=u%ko64)mjDKi%8$-+p$)zeB#)$uD)vjRdFlZl)8e* z^caY@wzj?iCxL%Q2L2pK%)bO&GIUtHX8eGt# zkyoGT4IDA$R2PwbRlNm#2hIWaZGvB04N9O^WgZ4_ola-H(P;ea_xlTWM*U_`)rD@i z`=Ka`!)ZrKJ|2%JgTbI-SY^fYHEYw~hBFv6wL*Ti8;F0Z7IWSw!p+b!>%R1YQ7T_@Z3^E?Oo! zhqlt|l6g=60kCayy#AB*3)nEU$Z-hBfdBvi07*qoM6N<$f&c*h0RR9r00030{|W$A b07(E;070{d0{H~9bP(JEv$zVp1(6`!aRp4N delta 49 zcmV-10M7r6J%=}tAd|2i+_4~d0kaGc3