static void ShowFilterForm() { var mockTags = new TreeGridItemCollection(); var parentA = new OSMTag("website"); var itemA = new OSMTreeGridItem(parentA, 0, 0, false, false); var AChildA = new OSMTreeGridItem(new OSMTag("website=http://www.google.com"), 1, 2, true, false); itemA.Children.Add(AChildA); var AChildB = new OSMTreeGridItem(new OSMTag("website=http://www.test.com"), 1, 2, true, false); itemA.Children.Add(AChildB); mockTags.Add(itemA); var parentB = new OSMTag("height"); var itemB = new OSMTreeGridItem(parentB, 0, 0, false, false); var BChildA = new OSMTreeGridItem(new OSMTag("height=10"), 2, 2, true, false); itemB.Children.Add(BChildA); var BChildB = new OSMTreeGridItem(new OSMTag("height=5"), 1, 1, true, false); itemB.Children.Add(BChildB); var CChildC = new OSMTreeGridItem(new OSMTag("height=11"), 3, 3, true, false); itemB.Children.Add(CChildC); var BChildD = new OSMTreeGridItem(new OSMTag("height=2"), 3, 3, true, false); itemB.Children.Add(BChildD); var CChildE = new OSMTreeGridItem(new OSMTag("height=20"), 3, 3, true, false); itemB.Children.Add(CChildE); mockTags.Add(itemB); new Application(Eto.Platforms.Wpf).Run(new FilterTagsForm(mockTags, HideObscure)); }
/// <summary>For sorting a set of numeric values, like building heights, that may contain strings</summary> public static double?MayBeIntSort(this OSMTreeGridItem item) { string value = item.OSMData.Value; bool success = double.TryParse(value, out var i); return(success ? (double?)i : (double?)null); }
/// <summary>Parse the Grasshopper data tree into the form's data tree</summary> protected TreeGridItemCollection GetSelectableTagsFromInputTree(OSMListWithPaths requests) { var indexOfParents = new Dictionary <string, int>(); var sortedTags = requests.items.OrderBy(t => t.ToString()).ToList(); var selectableTags = new TreeGridItemCollection(); foreach (var tag in sortedTags) { if (tag.Key != null) { if (!indexOfParents.ContainsKey(tag.Key.Value)) { var parentItem = new OSMTreeGridItem(tag.Key, 0, 0, true, false); selectableTags.Add(parentItem); indexOfParents[parentItem.OSMData.Value] = selectableTags.Count - 1; } } var nodeCount = 0; var wayCount = 0; if (ProvidedNodes) { nodeCount = requests.pathsPerItem[tag].Count(); } else { wayCount = requests.pathsPerItem[tag].Count(); } var childItem = new OSMTreeGridItem(tag, nodeCount, wayCount, true, false); if (childItem.OSMData.Key != null) { var parentKey = indexOfParents[childItem.OSMData.Key.Value]; var parent = selectableTags[parentKey] as OSMTreeGridItem; parent.Children.Add(childItem); } } foreach (OSMTreeGridItem tag in selectableTags) // Hack to sort numeric data properly { if (OSMSpecialTags.numericTags.ContainsKey(tag.OSMData.Value)) { var childrenCopy = tag.Children.Cast <OSMTreeGridItem>().OrderBy( item => TreeGridUtilities.MayBeIntSort(item)).ToList(); tag.Children.Clear(); tag.Children.AddRange(childrenCopy); } } return(selectableTags); }
/// <summary>Given a pre-existing tree grid collection, show/hide items based on if obscure features should be hidden </summary> public static TreeGridItemCollection FilterByObscurity(TreeGridItemCollection selectableData, bool hideObscureFeatures, TreeGridItemCollection currentSelectableData = null) { // Need to clone the items and make a new list to preserve the original Collection as unfiltered var newSelectableData = new TreeGridItemCollection(); for (var i = 0; i < selectableData.Count; i++) { // Try to preserve open/close and selected/unselected state during filtering var previousItem = selectableData[i] as OSMTreeGridItem; if (currentSelectableData != null) { var currentItem = currentSelectableData.Where(t => t.ToString() == previousItem.ToString()).First(); if (currentItem != null) { previousItem = currentItem as OSMTreeGridItem; } } var currentTagExpanded = previousItem.Expanded; var currentTagSelected = previousItem.IsSelected(); var originalTag = selectableData[i] as OSMTreeGridItem; if (originalTag.IsObscure && hideObscureFeatures) { continue; } var newTag = new OSMTreeGridItem(originalTag.OSMData, originalTag.OSMData.NodeCount, originalTag.OSMData.WayCount, originalTag.IsParsed, currentTagSelected, currentTagExpanded); foreach (OSMTreeGridItem originalChild in originalTag.Children) { if (!originalChild.IsObscure || !hideObscureFeatures) { newTag.Children.Add(originalChild); } } newSelectableData.Add(newTag); } return(newSelectableData); }
public static TreeGridItemCollection GetTreeCollection() { var selectableOSMs = new TreeGridItemCollection(); var indexOfParents = new Dictionary <string, int>(); var primaryFeatures = new List <OSMTag>(OSMPrimaryTypes.Keys.Values); for (var i = 0; i < primaryFeatures.Count; i++) { var parentItem = new OSMTreeGridItem(primaryFeatures[i], 0, 0, false, false); selectableOSMs.Add(parentItem); indexOfParents[primaryFeatures[i].Value] = i; } var secondaryFeatures = OSMPrimaryTypes.Values; foreach (var keyValue in secondaryFeatures.Keys) { var item = secondaryFeatures[keyValue]; var parentItem = selectableOSMs[indexOfParents[item["key"]]] as OSMTreeGridItem; var childOSM = new OSMTag(item["value"], null, item["description"], parentItem.OSMData); var childItem = new OSMTreeGridItem(childOSM, int.Parse(item["nodes"]), int.Parse(item["ways"]), false, false); if (childItem.OSMData.Value == "yes") { parentItem.Children.Insert(0, childItem); } else { parentItem.Children.Add(childItem); } } return(selectableOSMs); }