public void DrawTreeView(Rect bounds, TreeViewModel viewModel, Action <Vector2, IItem> itemClicked, Action <Vector2, IItem> itemRightClicked = null) { var boundY = bounds.height; if (Event.current != null && Event.current.isKey && Event.current.rawType == EventType.KeyUp) { switch (Event.current.keyCode) { case KeyCode.UpArrow: viewModel.MoveUp(); break; case KeyCode.DownArrow: viewModel.MoveDown(); break; case KeyCode.RightArrow: { var selectedContainer = viewModel.SelectedData as ITreeItem; if (selectedContainer != null) { selectedContainer.Expanded = true; viewModel.IsDirty = true; } } break; case KeyCode.LeftArrow: { var selectedContainer = viewModel.SelectedData as ITreeItem; if (selectedContainer != null) { selectedContainer.Expanded = false; viewModel.IsDirty = true; } } break; case KeyCode.Return: if (viewModel != null) { viewModel.InvokeSubmit(); } break; default: break; } } // PlatformDrawer.DrawLabel(new Rect().WithSize(100,100).InnerAlignWithBottomRight(bounds),"Total height: {0}, Total Items: {1}"); var dirty = false; var position = bounds; var usedRect = position.WithWidth(Math.Max(bounds.width, PlatformDrawer.CalculateTextSize(viewModel.LargestString, CachedStyles.ListItemTitleStyle).x + 5 * viewModel.MaxIdentLevel)).Pad(0, 0, 15, 0).WithHeight(ItemHeight * viewModel.TreeData.Count(s => s.Visible)); PlatformDrawer.DrawStretchBox(position.PadSides(-1), CachedStyles.WizardListItemBoxStyle, 10); viewModel.Scroll = GUI.BeginScrollView(position, viewModel.Scroll, usedRect); var itemTemplateRect = bounds.WithHeight(ItemHeight); bool hasItems = false; foreach (var treeViewItem in viewModel.TreeData) { if (!treeViewItem.Visible) { continue; } hasItems = true; var data = treeViewItem.Data; var treeData = data as ITreeItem; var itemRect = itemTemplateRect.Pad(5 * treeViewItem.Indent, 0, 5 * treeViewItem.Indent, 0); var localItemY = itemRect.Translate(0, -position.yMin).y; if (localItemY > (viewModel.Scroll.y + position.height)) { break; } var imageRect = new Rect().WithSize(12, 12) .Align(itemRect) .AlignHorisonallyByCenter(itemRect) .Translate(5, 0); var labelRect = itemRect.WithWidth( PlatformDrawer.CalculateTextSize(treeViewItem.Data.Title, CachedStyles.BreadcrumbTitleStyle).x) .Translate(25, 0); if (treeViewItem == viewModel.ScrollTarget) { viewModel.Scroll = new Vector2(0, localItemY - ItemHeight * 5); viewModel.ScrollToItem(null); } if (treeViewItem.Selected) { PlatformDrawer.DrawStretchBox(itemRect, CachedStyles.WizardSubBoxStyle, 14); } PlatformDrawer.DrawLabel(labelRect, treeViewItem.Data.Title, CachedStyles.ListItemTitleStyle); PlatformDrawer.DrawImage(imageRect, treeViewItem.Icon, true); if (treeViewItem.ColorMark.HasValue) { var colorMarkRect = new Rect().WithSize(8, 8).InnerAlignWithCenterRight(itemRect).Translate(-24, 0); PlatformDrawer.DrawRect(colorMarkRect, treeViewItem.ColorMark.Value); } if (viewModel.ShowToggle) { EditorGUI.BeginChangeCheck(); var toggleRect = new Rect().WithSize(16, 16).InnerAlignWithUpperRight(itemRect).Translate(-50, 0); GUI.enabled = viewModel.AllowManualToggle; var toggle = GUI.Toggle(toggleRect, treeViewItem.IsChecked, ""); GUI.enabled = true; if (treeViewItem.IsChecked != toggle) { viewModel.ToggleItem(treeViewItem, toggle); return; } } var item1 = treeViewItem; PlatformDrawer.DoButton(itemRect.Translate(25, 0), "", CachedStyles.ClearItemStyle, m => { viewModel.SelectedIndex = item1.Index; //TODO PUBLISH EVENT if (itemClicked != null) { itemClicked(m, item1.Data); } }, m => { if (itemRightClicked != null) { itemRightClicked(m, item1.Data); } }); if (treeData != null) { PlatformDrawer.DoButton(imageRect, "", CachedStyles.ClearItemStyle, () => { treeData.Expanded = !treeData.Expanded; dirty = true; }); } if (treeViewItem.Highlighted) { PlatformDrawer.DrawLine(new[] { new Vector3(labelRect.x, itemRect.yMax - 1, 0), new Vector3(labelRect.x + 75, itemRect.yMax - 1, 0) }, Color.cyan); } itemTemplateRect = itemTemplateRect.Below(itemTemplateRect); } GUI.EndScrollView(); if (!hasItems) { var textRect = bounds; var cacheColor = GUI.color; GUI.color = new Color(GUI.color.r, GUI.color.g, GUI.color.b, 0.4f); PlatformDrawer.DrawLabel(textRect, "No Items Found", CachedStyles.WizardSubBoxTitleStyle, DrawingAlignment.MiddleCenter); GUI.color = cacheColor; return; } if (dirty) { viewModel.IsDirty = true; } }
public void DrawTreeView(Rect bounds, TreeViewModel viewModel, Action<Vector2, IItem> itemClicked, Action<Vector2, IItem> itemRightClicked = null) { var boundY = bounds.height; if (Event.current != null && Event.current.isKey && Event.current.rawType == EventType.KeyUp) { switch (Event.current.keyCode) { case KeyCode.UpArrow: viewModel.MoveUp(); break; case KeyCode.DownArrow: viewModel.MoveDown(); break; case KeyCode.RightArrow: { var selectedContainer = viewModel.SelectedData as ITreeItem; if (selectedContainer != null) { selectedContainer.Expanded = true; viewModel.IsDirty = true; } } break; case KeyCode.LeftArrow: { var selectedContainer = viewModel.SelectedData as ITreeItem; if (selectedContainer != null) { selectedContainer.Expanded = false; viewModel.IsDirty = true; } } break; case KeyCode.Return: if(viewModel!= null) viewModel.InvokeSubmit(); break; default: break; } } // PlatformDrawer.DrawLabel(new Rect().WithSize(100,100).InnerAlignWithBottomRight(bounds),"Total height: {0}, Total Items: {1}"); var dirty = false; var position = bounds; var usedRect = position.WithWidth(Math.Max(bounds.width, PlatformDrawer.CalculateTextSize(viewModel.LargestString,CachedStyles.ListItemTitleStyle).x+5*viewModel.MaxIdentLevel)).Pad(0, 0, 15, 0).WithHeight(ItemHeight * viewModel.TreeData.Count(s => s.Visible)); PlatformDrawer.DrawStretchBox(position.PadSides(-1),CachedStyles.WizardListItemBoxStyle,10); viewModel.Scroll = GUI.BeginScrollView(position, viewModel.Scroll, usedRect); var itemTemplateRect = bounds.WithHeight(ItemHeight); bool hasItems = false; foreach (var treeViewItem in viewModel.TreeData) { if (!treeViewItem.Visible) continue; hasItems = true; var data = treeViewItem.Data; var treeData = data as ITreeItem; var itemRect = itemTemplateRect.Pad(5*treeViewItem.Indent, 0, 5*treeViewItem.Indent, 0); var localItemY = itemRect.Translate(0, -position.yMin).y; if (localItemY > (viewModel.Scroll.y + position.height)) break; var imageRect = new Rect().WithSize(12, 12) .Align(itemRect) .AlignHorisonallyByCenter(itemRect) .Translate(5, 0); var labelRect = itemRect.WithWidth( PlatformDrawer.CalculateTextSize(treeViewItem.Data.Title, CachedStyles.BreadcrumbTitleStyle).x) .Translate(25, 0); if (treeViewItem == viewModel.ScrollTarget) { viewModel.Scroll = new Vector2(0, localItemY - ItemHeight * 5); viewModel.ScrollToItem(null); } if (treeViewItem.Selected) { PlatformDrawer.DrawStretchBox(itemRect, CachedStyles.WizardSubBoxStyle, 14); } PlatformDrawer.DrawLabel(labelRect, treeViewItem.Data.Title, CachedStyles.ListItemTitleStyle); PlatformDrawer.DrawImage(imageRect, treeViewItem.Icon, true); if (treeViewItem.ColorMark.HasValue) { var colorMarkRect = new Rect().WithSize(8, 8).InnerAlignWithCenterRight(itemRect).Translate(-24,0); PlatformDrawer.DrawRect(colorMarkRect,treeViewItem.ColorMark.Value); } if (viewModel.ShowToggle) { EditorGUI.BeginChangeCheck(); var toggleRect = new Rect().WithSize(16, 16).InnerAlignWithUpperRight(itemRect).Translate(-50, 0); GUI.enabled = viewModel.AllowManualToggle; var toggle = GUI.Toggle(toggleRect, treeViewItem.IsChecked, ""); GUI.enabled = true; if (treeViewItem.IsChecked != toggle) { viewModel.ToggleItem(treeViewItem, toggle); return; } } var item1 = treeViewItem; PlatformDrawer.DoButton(itemRect.Translate(25, 0), "", CachedStyles.ClearItemStyle, m => { viewModel.SelectedIndex = item1.Index; //TODO PUBLISH EVENT if (itemClicked != null) itemClicked(m, item1.Data); }, m => { if (itemRightClicked != null) itemRightClicked(m, item1.Data); }); if (treeData != null) PlatformDrawer.DoButton(imageRect, "", CachedStyles.ClearItemStyle, () => { treeData.Expanded = !treeData.Expanded; dirty = true; }); if (treeViewItem.Highlighted) { PlatformDrawer.DrawLine(new[] { new Vector3(labelRect.x, itemRect.yMax - 1, 0), new Vector3(labelRect.x + 75, itemRect.yMax - 1, 0) }, Color.cyan); } itemTemplateRect = itemTemplateRect.Below(itemTemplateRect); } GUI.EndScrollView(); if (!hasItems) { var textRect = bounds; var cacheColor = GUI.color; GUI.color = new Color(GUI.color.r, GUI.color.g, GUI.color.b, 0.4f); PlatformDrawer.DrawLabel(textRect, "No Items Found", CachedStyles.WizardSubBoxTitleStyle, DrawingAlignment.MiddleCenter); GUI.color = cacheColor; return; } if (dirty) viewModel.IsDirty = true; }