diff options
author | Eric Maupin <me@ermau.com> | 2017-06-19 20:21:20 +0300 |
---|---|---|
committer | Eric Maupin <me@ermau.com> | 2017-06-19 22:51:39 +0300 |
commit | 76e5686b27a19c0e83a37ac32728adcc4df07b2c (patch) | |
tree | 576723c76de0664623959d4d5e2a81a9c7776e6f /Xamarin.PropertyEditing.Mac/PropertyTableDataSource.cs | |
parent | 89926082d227a2a27708bf41645893ed55900bb2 (diff) |
[Mac] Improve search/arrange
This does a number of things:
- We now auto-expand categories when searching
- We now remember & restore open categories from searching and switching arrange
modes.
- Order & Grouping are now cached rather than running every cell.
- Order & Grouping are now a view on the existing list of properties, using the
same view models.
Diffstat (limited to 'Xamarin.PropertyEditing.Mac/PropertyTableDataSource.cs')
-rw-r--r-- | Xamarin.PropertyEditing.Mac/PropertyTableDataSource.cs | 66 |
1 files changed, 56 insertions, 10 deletions
diff --git a/Xamarin.PropertyEditing.Mac/PropertyTableDataSource.cs b/Xamarin.PropertyEditing.Mac/PropertyTableDataSource.cs index 8b01f2c..f46220b 100644 --- a/Xamarin.PropertyEditing.Mac/PropertyTableDataSource.cs +++ b/Xamarin.PropertyEditing.Mac/PropertyTableDataSource.cs @@ -3,34 +3,80 @@ using System.Collections.Generic; using System.Linq; using AppKit; using Foundation; -using Xamarin.PropertyEditing.Mac.ViewModels; using Xamarin.PropertyEditing.ViewModels; namespace Xamarin.PropertyEditing.Mac { - public class PropertyTableDataSource : NSOutlineViewDataSource + internal class PropertyTableDataSource + : NSOutlineViewDataSource { - internal MacPanelViewModel ViewModel { get; private set; } - public ICollection<object> SelectedItems => ViewModel.SelectedObjects; - - internal PropertyTableDataSource (MacPanelViewModel viewModel) + internal PropertyTableDataSource (PanelViewModel panelVm) { - ViewModel = viewModel; + if (panelVm == null) + throw new ArgumentNullException (nameof (panelVm)); + + this.vm = panelVm; } + public PanelViewModel DataContext => this.vm; + public override nint GetChildrenCount (NSOutlineView outlineView, NSObject item) { - return ViewModel.GetChildrenCount (item); + if (this.vm.ArrangedProperties.Count == 0) + return 0; + + if (this.vm.ArrangeMode == PropertyArrangeMode.Name) + return this.vm.ArrangedProperties[0].Count; + + if (item == null) + return this.vm.ArrangedProperties.Count; + else + return ((IGroupingList<string, PropertyViewModel>)((NSObjectFacade)item).Target).Count; } public override NSObject GetChild (NSOutlineView outlineView, nint childIndex, NSObject item) { - return ViewModel.GetChildObject ((int)childIndex, item); + object element; + if (this.vm.ArrangeMode == PropertyArrangeMode.Name) { + element = (this.vm.ArrangedProperties[0][(int)childIndex]); + } else { + if (item == null) + element = this.vm.ArrangedProperties[(int)childIndex]; + else { + element = ((IGroupingList<string, PropertyViewModel>)((NSObjectFacade)item).Target)[(int)childIndex]; + } + } + + return GetFacade (element); } public override bool ItemExpandable (NSOutlineView outlineView, NSObject item) { - return ViewModel.ItemExpandable (item); + if (this.vm.ArrangeMode == PropertyArrangeMode.Name) + return false; + + return ((NSObjectFacade)item).Target is IGroupingList<string, PropertyViewModel>; } + + public NSObject GetFacade (object element) + { + NSObject facade; + if (element is IGrouping<string, PropertyViewModel>) { + if (!this.groupFacades.TryGetValue (element, out facade)) { + this.groupFacades[element] = facade = new NSObjectFacade (element); + } + } else + facade = new NSObjectFacade (element); + + return facade; + } + + public bool TryGetFacade (object element, out NSObject facade) + { + return this.groupFacades.TryGetValue (element, out facade); + } + + private readonly PanelViewModel vm; + private readonly Dictionary<object, NSObject> groupFacades = new Dictionary<object, NSObject> (); } } |