diff options
Diffstat (limited to 'Xamarin.Forms.Controls/GalleryPages/GroupedListActionsGallery.cs')
-rw-r--r-- | Xamarin.Forms.Controls/GalleryPages/GroupedListActionsGallery.cs | 282 |
1 files changed, 282 insertions, 0 deletions
diff --git a/Xamarin.Forms.Controls/GalleryPages/GroupedListActionsGallery.cs b/Xamarin.Forms.Controls/GalleryPages/GroupedListActionsGallery.cs new file mode 100644 index 00000000..3d8b85c9 --- /dev/null +++ b/Xamarin.Forms.Controls/GalleryPages/GroupedListActionsGallery.cs @@ -0,0 +1,282 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Linq; +using System.Runtime.CompilerServices; + +namespace Xamarin.Forms.Controls +{ + internal class GroupedListActionsGallery + : ContentPage + { + class Group + : ObservableList<GroupAction>, INotifyPropertyChanged + { + public Group (string name) + { + if (name == null) + throw new ArgumentNullException ("name"); + + Name = name; + ShortName = Name[0].ToString(); + } + + string _name; + string _shortName; + public event PropertyChangedEventHandler PropertyChanged; + + public string Name + { + get { return _name; } + set + { + if (_name == value) + return; + + _name = value; + OnPropertyChanged(); + } + } + + public string ShortName + { + get { return _shortName; } + set + { + if (_shortName == value) + return; + + _shortName = value; + OnPropertyChanged(); + } + } + + protected override void InsertItem (int index, GroupAction item) + { + item.Parent = this; + base.InsertItem (index, item); + } + + void OnPropertyChanged ([CallerMemberName] string propertyName = null) + { + PropertyChangedEventHandler handler = PropertyChanged; + if (handler != null) + handler (this, new PropertyChangedEventArgs (propertyName)); + } + } + + class GroupAction + { + readonly Action<GroupAction> _action; + + public GroupAction (string name, Action<GroupAction> action = null) + { + if (name == null) + throw new ArgumentNullException ("name"); + + Name = name; + _action = action; + } + + public string Name + { + get; + private set; + } + + public void DoStuff() + { + if (_action == null) + return; + + _action (this); + } + + public Group Parent + { + get; + set; + } + } + + readonly ListView _list = new ListView { + IsGroupingEnabled = true, + GroupHeaderTemplate = new DataTemplate(() => { + var label = new Label { + VerticalOptions = LayoutOptions.CenterAndExpand, + TextColor = Color.Red + }; + + label.SetBinding (Label.TextProperty, "Name"); + + return new ViewCell { + View = new StackLayout { + Orientation = StackOrientation.Horizontal, + Children = { + new Image { + Source = ImageSource.FromFile ("cover1.jpg"), + HeightRequest = 20, + WidthRequest = 20 + }, + + label, + } + } + }; + }), + + ItemTemplate = new DataTemplate (() => { + var c = new TextCell(); + c.SetBinding (TextCell.TextProperty, "Name"); + return c; + }) + }; + + readonly ObservableList<Group> _groups; + + ObservableList<Group> CreateItemSource() + { + return new ObservableList<Group> { + new Group ("General") { + new GroupAction ("Change group name", ga => ga.Parent.Name += " (changed)"), + new GroupAction ("Change group short name", ga => ga.Parent.ShortName = ga.Parent.Name[1].ToString()) + }, + + new Group ("Child item actions") { + new GroupAction ("Clear this group", ga => ga.Parent.Clear()), + new GroupAction ("Insert group item", ga => ga.Parent.Insert (1, new GroupAction ("Inserted item S"))), + new GroupAction ("Insert 2 group items", ga => ga.Parent.InsertRange (1, GetGroupActions ("Inserted item D", 2))), + new GroupAction ("Remove next item", ga => ga.Parent.Remove (ga.Parent[GetIndexOfDummy (ga)])), + new GroupAction ("Dummy item RDI"), + new GroupAction ("Remove next 2 dummy items", ga => ga.Parent.RemoveRange (GetNextDummyItems (ga, 2))), + new GroupAction ("Dummy item RmDI-1"), + new GroupAction ("Dummy item RmDI-2"), + new GroupAction ("Replace dummy item", ga => ga.Parent[GetIndexOfDummy(ga)] = new GroupAction ("Replaced item")), + new GroupAction ("Dummy item RpDI"), + new GroupAction ("Replace next two dummy items", ga => + ga.Parent.ReplaceRange (GetIndexOfDummy (ga, 2), GetGroupActions ("Replaced items", 2))), + new GroupAction ("Dummy item RpDI-1"), + new GroupAction ("Dummy item RpDI-2"), + new GroupAction ("Select next dummy item", ga => { + int index = GetIndexOfDummy (ga); + _list.SelectedItem = ga.Parent[index]; + }), + new GroupAction ("Dummy item SI"), + new GroupAction ("Move dummy above this one", ga => { + int nindex = GetIndexOfDummy (ga); + ga.Parent.Move (nindex, ga.Parent.IndexOf (c => c.Name.StartsWith ("Move dummy"))); + }), + new GroupAction ("Dummy item MDI"), + new GroupAction ("Move last 2 items above this one", ga => { + int nindex = GetIndexOfDummy (ga, 2); + ga.Parent.Move (nindex, ga.Parent.IndexOf (c => c.Name.StartsWith ("Move last 2")), 2); + }), + new GroupAction ("Dummy item M2DI-1"), + new GroupAction ("Dummy item M2DI-2"), + }, + + CreateDummyGroup (2), + CreateDummyGroup (2), + + new Group ("Group item actions") { + new GroupAction ("Clear all", ga => _groups.Clear()), + new GroupAction ("Insert group", ga => { + int index = _groups.IndexOf (g => g.Name == "Group item actions"); + _groups.Insert (index, CreateDummyGroup (2)); + }), + + new GroupAction ("Insert 2 groups", ga => { + int index = _groups.IndexOf (g => g.Name == "Group item actions"); + _groups.InsertRange (index, new[] { CreateDummyGroup (2), CreateDummyGroup (2) }); + }), + + new GroupAction ("Remove previous dummy group", ga => { + int index = _groups.IndexOf (g => g.Name == "Group item actions"); + var dg = _groups.Take (index).Last (g => g.Name == "Dummy group"); + _groups.Remove (dg); + }), + + new GroupAction ("Remove previous 2 dummy groups", ga => { + int index = _groups.IndexOf (g => g.Name == "Group item actions"); + var dgs = _groups.Take (index).Reverse().Where (g => g.Name == "Dummy group").Take (2); + _groups.RemoveRange (dgs); + }), + + new GroupAction ("Replace previous dummy group", ga => { + int index = _groups.IndexOf (g => g.Name == "Group item actions"); + var dg = _groups.Take (index).Last (g => g.Name == "Dummy group"); + _groups[_groups.IndexOf (dg)] = new Group ("Replaced group") { + new GroupAction ("Replaced group item") + }; + }), + + new GroupAction ("Replace previous 2 dummy groups", ga => { + int index = _groups.IndexOf (g => g.Name == "Group item actions"); + var dgs = _groups.Take (index).Reverse().Where (g => g.Name == "Dummy group").Take (2).Reverse(); + _groups.ReplaceRange (_groups.IndexOf (dgs.First()), new[] { + new Group ("Replaced group") { + new GroupAction ("Replaced group item") + }, + new Group ("Replaced group") { + new GroupAction ("Replaced group item") + } + }); + }), + + new GroupAction ("Move next group above", ga => { + int index = _groups.IndexOf (g => g.Name == ga.Parent.Name); + int dgindex = _groups.IndexOf (_groups.Skip (index + 1).First (dg => dg.Name == "Dummy group")); + _groups.Move (dgindex, index); + }), + + new GroupAction ("Move next 2 groups above", ga => { + int index = _groups.IndexOf (g => g.Name == ga.Parent.Name); + int dgindex = _groups.IndexOf (_groups.Skip (index + 1).First (dg => dg.Name == "Dummy group")); + _groups.Move (dgindex, index, 2); + }), + }, + + CreateDummyGroup (1), + CreateDummyGroup (1), + CreateDummyGroup (1) + }; + } + + public GroupedListActionsGallery() + { + NavigationPage.SetHasNavigationBar (this, false); + _groups = CreateItemSource(); + + _list.ItemTapped += (sender, arg) => ((GroupAction)arg.Item).DoStuff(); + + _list.ItemsSource = _groups; + Title = "Actions"; + Content = _list; + } + + IEnumerable<GroupAction> GetGroupActions (string name, int count) + { + return Enumerable.Range (0, count).Select (i => new GroupAction (name + " " + i)); + } + + Group CreateDummyGroup (int children) + { + var group = new Group ("Dummy group"); + group.AddRange (Enumerable.Range (0, children).Select (i => new GroupAction ("Dummy item"))); + return group; + } + + int GetIndexOfDummy (GroupAction source, int count = 1) + { + var dummies = GetNextDummyItems (source, count); + return source.Parent.IndexOf (dummies.First()); + } + + IEnumerable<GroupAction> GetNextDummyItems (GroupAction source, int count) + { + int start = source.Parent.IndexOf (source); + return source.Parent.Skip (start).Where (xga => xga.Name.StartsWith ("Dummy item")).Take (count); + } + } +} |