Переглянути джерело

demo: combobox: add items

mattias 10 місяців тому
батько
коміт
6b268c78e3
2 змінених файлів з 71 додано та 13 видалено
  1. 2 0
      demo/Combobox/MainUnit.pas
  2. 69 13
      demo/Combobox/fresnel.democombobox.pas

+ 2 - 0
demo/Combobox/MainUnit.pas

@@ -51,6 +51,8 @@ begin
   Combobox1.Name:='Combobox1';
   Combobox1.Parent:=Body1;
   Combobox1.Items.Add('First');
+  Combobox1.Items.Add('Second');
+  Combobox1.Items.Add('Third');
 end;
 
 end.

+ 69 - 13
demo/Combobox/fresnel.democombobox.pas

@@ -17,15 +17,18 @@ type
     FItemIndex: integer;
     FItems: TStrings;
     FOnChange: TNotifyEvent;
-    procedure CaptionDivMouseDown(Event: TAbstractEvent);
     function GetCaption: string;
-    procedure SetCaption(const AValue: string);
-    procedure SetItemIndex(const AValue: integer);
-    procedure SetItems(const AValue: TStrings);
   protected
-    procedure SetName(const NewName: TComponentName); override;
+    procedure DoCaptionDivClick(Event: TAbstractEvent); virtual;
+    procedure DoChange; virtual;
+    procedure DoItemClick(Event: TAbstractEvent); virtual;
+    procedure FPOObservedChanged(ASender: TObject; {%H-}Operation: TFPObservedOperation; {%H-}Data: Pointer); override;
+    procedure Loaded; override;
     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
-    Procedure FPOObservedChanged(ASender: TObject; {%H-}Operation: TFPObservedOperation; {%H-}Data: Pointer); override;
+    procedure SetCaption(const AValue: string); virtual;
+    procedure SetItemIndex(const AValue: integer); virtual;
+    procedure SetItems(const AValue: TStrings); virtual;
+    procedure SetName(const NewName: TComponentName); override;
   public
     // default styles
     const
@@ -81,6 +84,7 @@ type
     procedure Clear; virtual;
     class function GetCSSTypeStyle: TCSSString; override;
     procedure UpdateItems; virtual;
+    procedure UpdateCaption; virtual;
     property OnChange: TNotifyEvent read FOnChange write FOnChange;
     property Items: TStrings read FItems write SetItems;
     property ItemIndex: integer read FItemIndex write SetItemIndex;
@@ -100,6 +104,12 @@ begin
   UpdateItems;
 end;
 
+procedure TDemoCombobox.DoChange;
+begin
+  if Assigned(OnChange) then
+    OnChange(Self);
+end;
+
 procedure TDemoCombobox.SetName(const NewName: TComponentName);
 var
   WasCaption: Boolean;
@@ -128,6 +138,17 @@ begin
   end;
 end;
 
+procedure TDemoCombobox.Loaded;
+begin
+  inherited Loaded;
+  if FItemIndex>=Content.NodeCount then
+    FItemIndex:=-1;
+  UpdateCaption;
+  if (FItemIndex>=0) then
+    Content.Nodes[FItemIndex].AddCSSClass('ComboboxSelected');
+  UpdateCaption;
+end;
+
 procedure TDemoCombobox.FPOObservedChanged(ASender: TObject; Operation: TFPObservedOperation;
   Data: Pointer);
 begin
@@ -141,13 +162,19 @@ procedure TDemoCombobox.SetItemIndex(const AValue: integer);
 begin
   if FItemIndex=AValue then Exit;
   if (csDestroying in ComponentState) or (Content=nil) then exit;
-  if (AValue>=Content.NodeCount) and not (csLoading in ComponentState) then
+  if csLoading in ComponentState then
+  begin
+    FItemIndex:=AValue;
+    exit;
+  end;
+  if (AValue>=Content.NodeCount) then
     exit;
-  if (FItemIndex>=0) and (FItemIndex<Content.NodeCount) then
+  if (FItemIndex>=0) then
     Content.Nodes[FItemIndex].RemoveCSSClass('ComboboxSelected');
   FItemIndex:=AValue;
-  if (FItemIndex>=0) and (FItemIndex<Content.NodeCount) then
+  if (FItemIndex>=0) then
     Content.Nodes[FItemIndex].AddCSSClass('ComboboxSelected');
+  UpdateCaption;
 end;
 
 function TDemoCombobox.GetCaption: string;
@@ -158,8 +185,20 @@ begin
     Result:='';
 end;
 
-procedure TDemoCombobox.CaptionDivMouseDown(Event: TAbstractEvent);
+procedure TDemoCombobox.DoItemClick(Event: TAbstractEvent);
+var
+  Item: TFresnelElement;
+begin
+  writeln('TDemoCombobox.OnItemClick Sender=',DbgSName(Event.Sender));
+  Item:=Event.Sender as TFresnelElement;
+  ItemIndex:=Item.Tag;
+  DoChange;
+  Menu.SetStyleAttr('display','none');
+end;
+
+procedure TDemoCombobox.DoCaptionDivClick(Event: TAbstractEvent);
 begin
+  if Event=nil then ;
   if Menu.GetStyleAttr('display')='none' then
     Menu.SetStyleAttr('display','')
   else
@@ -188,7 +227,7 @@ begin
     Name:='CaptionDiv';
     CSSClasses.Add('ComboboxCaption');
     Parent:=Self;
-    AddEventListener(evtMouseDown,@CaptionDivMouseDown);
+    AddEventListener(evtClick,@DoCaptionDivClick);
   end;
 
   CaptionLabel:=TLabel.Create(Self);
@@ -244,6 +283,7 @@ begin
   FItems.Clear;
   while Content.NodeCount>FItems.Count do
     Content.Nodes[Content.NodeCount-1].Free;
+  SetCaption(' ');
 end;
 
 class function TDemoCombobox.GetCSSTypeStyle: TCSSString;
@@ -258,21 +298,28 @@ var
   ItemDiv: TDiv;
   aLabel: TLabel;
 begin
+  if FItemIndex>FItems.Count then
+    FItemIndex:=-1;
+
   for i:=0 to FItems.Count-1 do
   begin
     ItemCaption:=FItems[i];
-    ItemDiv:=FItems.Objects[i] as TDiv;
-    if ItemDiv=nil then
+    if i>=Content.NodeCount then
     begin
       ItemDiv:=TDiv.Create(Self);
       ItemDiv.Name:='ItemDiv'+IntToStr(i);
       ItemDiv.CSSClasses.Add('ComboboxItem');
+      ItemDiv.Tag:=i;
+
       aLabel:=TLabel.Create(Self);
       aLabel.Name:='ItemLabel'+IntToStr(i);
       aLabel.Caption:=ItemCaption;
       aLabel.Parent:=ItemDiv;
       ItemDiv.Parent:=Content;
+
+      ItemDiv.AddEventListener(evtClick,@DoItemClick);
     end else begin
+      ItemDiv:=Content.Nodes[i] as TDiv;
       aLabel:=ItemDiv.Nodes[0] as TLabel;
       aLabel.Caption:=ItemCaption;
     end;
@@ -283,6 +330,15 @@ begin
   end;
   while Content.NodeCount>FItems.Count do
     Content.Nodes[Content.NodeCount-1].Free;
+  UpdateCaption;
+end;
+
+procedure TDemoCombobox.UpdateCaption;
+begin
+  if (FItemIndex>=0) then
+    SetCaption(FItems[FItemIndex])
+  else
+    SetCaption(' ');
 end;
 
 end.