public override void Draw(IPlatformDrawer platform, float scale) { base.Draw(platform, scale); var paddedBOunds = Bounds.PadSides(5); var headerBounds = paddedBOunds.WithHeight(20).Translate(0,10); Rect imageBounds; var hasHeader = !string.IsNullOrEmpty(NodeViewModel.HeaderText); var hasComments= !string.IsNullOrEmpty(NodeViewModel.Comments); if (hasHeader) { imageBounds = paddedBOunds.Below(headerBounds).Translate(0, 5).Clip(paddedBOunds); } else { imageBounds = paddedBOunds; } if (hasHeader) { var ts =platform.CalculateTextSize(NodeViewModel.HeaderText, CachedStyles.WizardSubBoxTitleStyle); platform.DrawLabel(headerBounds, NodeViewModel.HeaderText, CachedStyles.WizardSubBoxTitleStyle); var hmRect = new Rect().Align(headerBounds).WithSize(ts.x,2).Below(headerBounds).Translate(0,3); platform.DrawRect(hmRect, CachedStyles.GetColor(NodeColor.Gray)); } if (!string.IsNullOrEmpty(NodeViewModel.ImageName) && Image != null) { platform.DrawImage(imageBounds,Image,true); } else platform.DrawLabel(imageBounds,"Image Not Found",CachedStyles.WizardSubBoxTitleStyle); }
public override void Draw(IPlatformDrawer platform, float scale) { base.Draw(platform, scale); if (EditorApplication.isPaused) { if (NodeViewModel.GraphItem.Identifier != DebugSystem.CurrentBreakId) { var adjustedBounds = new Rect(Bounds.x - 9, Bounds.y + 1, Bounds.width + 19, Bounds.height + 9); platform.DrawStretchBox(adjustedBounds, CachedStyles.BoxHighlighter5, 20); } else { var adjustedBounds = new Rect(Bounds.x - 9, Bounds.y + 1, Bounds.width + 19, Bounds.height + 9); platform.DrawStretchBox(adjustedBounds, CachedStyles.BoxHighlighter3, 20); } } var breakpointItemRect = new Rect().WithSize(24, 24).InnerAlignWithUpperRight(Bounds).Translate(16, -16); var deltaTime = (DateTime.Now - _lastUpdate).TotalMilliseconds; _lastUpdate = DateTime.Now; //if (NodeViewModel.IsBreakpoint) //{ if (EditorApplication.isPaused && NodeViewModel.GraphItem.Identifier == DebugSystem.CurrentBreakId) { _animationTime += (float)deltaTime; var offset = 8 * Mathf.Cos((_animationTime * 5f) / 1000); breakpointItemRect = breakpointItemRect.Translate(offset, -offset); //Apply animation to breakpoing item Rect platform.DrawImage(breakpointItemRect, "CurrentBreakpointIcon", true); } else { if (NodeViewModel.IsBreakpoint) { platform.DrawImage(breakpointItemRect, "BreakpointIcon", true); } _animationTime = 0; } }
public void DrawActionDialog(IPlatformDrawer platform, Rect bounds, ActionItem item, System.Action cancel = null) { if (item == null) { return; } platform.DrawStretchBox(bounds, CachedStyles.WizardSubBoxStyle, 13); bounds = bounds.PadSides(15); var descriptionHeight = string.IsNullOrEmpty(item.Description) ? 50 : platform.CalculateTextHeight(item.Description, CachedStyles.BreadcrumbTitleStyle, bounds.width) + 60; var headerRect = bounds.WithHeight(40); var iconRect = bounds.WithSize(41, 41); var descriptionRect = headerRect.Below(headerRect).Translate(0, -22).WithHeight(descriptionHeight); var inspectorRect = bounds.Below(descriptionRect).Clip(bounds); var executeButtonRect = new Rect() .WithSize(100, 30) .InnerAlignWithBottomRight(bounds); if (!_inspectors.ContainsKey(item)) { var uFrameMiniInspector = new uFrameMiniInspector(item.Command); _inspectors.Add(item, uFrameMiniInspector); } var inspector = _inspectors[item]; var inspectorHeight = inspector.Height; _scrollPosition = GUI.BeginScrollView(bounds.AddHeight(-30).AddWidth(15), _scrollPosition, bounds.WithHeight(headerRect.height + iconRect.height + descriptionRect.height + inspectorHeight)); platform.DrawLabel(headerRect, item.Title, CachedStyles.WizardSubBoxTitleStyle, DrawingAlignment.MiddleCenter); platform.DrawImage(iconRect, string.IsNullOrEmpty(item.Icon) ? "CreateEmptyDatabaseIcon" : item.Icon, true); platform.DrawLabel(descriptionRect, item.Description, CachedStyles.BreadcrumbTitleStyle, DrawingAlignment.MiddleLeft); inspector.Draw(descriptionRect.WithHeight(inspectorHeight).Pad(0, 0, 10, 0).Below(descriptionRect)); //Draw generic inspector GUI.EndScrollView(); if (cancel != null) { platform.DoButton(executeButtonRect.InnerAlignWithBottomLeft(bounds), "Cancel", ElementDesignerStyles.DarkButtonStyle, cancel); } platform.DoButton(executeButtonRect, string.IsNullOrEmpty(item.Verb) ? "Create" : item.Verb, ElementDesignerStyles.DarkButtonStyle, () => { InvertApplication.Execute(item.Command); }); }
public void DrawActionDialog(IPlatformDrawer platform, Rect bounds, ActionItem item, Action cancel = null) { if (item == null) return; platform.DrawStretchBox(bounds, CachedStyles.WizardSubBoxStyle, 13); bounds = bounds.PadSides(15); var descriptionHeight = string.IsNullOrEmpty(item.Description) ? 50 : platform.CalculateTextHeight(item.Description, CachedStyles.BreadcrumbTitleStyle, bounds.width) + 60; var headerRect = bounds.WithHeight(40); var iconRect = bounds.WithSize(41, 41); var descriptionRect = headerRect.Below(headerRect).Translate(0,-22).WithHeight(descriptionHeight); var inspectorRect = bounds.Below(descriptionRect).Clip(bounds); var executeButtonRect = new Rect() .WithSize(100, 30) .InnerAlignWithBottomRight(bounds); if (!_inspectors.ContainsKey(item)) { var uFrameMiniInspector = new uFrameMiniInspector(item.Command); _inspectors.Add(item, uFrameMiniInspector); } var inspector = _inspectors[item]; var inspectorHeight = inspector.Height; _scrollPosition = GUI.BeginScrollView(bounds.AddHeight(-30).AddWidth(15), _scrollPosition, bounds.WithHeight(headerRect.height + iconRect.height + descriptionRect.height + inspectorHeight)); platform.DrawLabel(headerRect, item.Title, CachedStyles.WizardSubBoxTitleStyle, DrawingAlignment.MiddleCenter); platform.DrawImage(iconRect, string.IsNullOrEmpty(item.Icon) ? "CreateEmptyDatabaseIcon" : item.Icon, true); platform.DrawLabel(descriptionRect, item.Description, CachedStyles.BreadcrumbTitleStyle, DrawingAlignment.MiddleLeft); inspector.Draw(descriptionRect.WithHeight(inspectorHeight).Pad(0,0,10,0).Below(descriptionRect)); //Draw generic inspector GUI.EndScrollView(); if ( cancel != null) { platform.DoButton(executeButtonRect.InnerAlignWithBottomLeft(bounds), "Cancel", ElementDesignerStyles.DarkButtonStyle, cancel); } platform.DoButton(executeButtonRect, string.IsNullOrEmpty(item.Verb) ? "Create" : item.Verb, ElementDesignerStyles.DarkButtonStyle, () => { InvertApplication.Execute(item.Command); }); }
//uncomment to debug connector bounds //Color bc = new Color(UnityEngine.Random.value, UnityEngine.Random.value, UnityEngine.Random.value,0.3f); public override void Draw(IPlatformDrawer platform, float scale) { base.Draw(platform, scale); //uncomment to debug connector bounds //platform.DrawRect(Bounds,bc); //InvertGraphEditor.PlatformDrawer.DrawConnector(scale, ViewModel); var connectorFor = ViewModel.ConnectorFor; var connectorBounds = ViewModel.ConnectorFor.ConnectorBounds; var forItem = connectorFor as ItemViewModel; if (forItem != null) { if (forItem.NodeViewModel.IsCollapsed) { connectorBounds = forItem.NodeViewModel.ConnectorBounds; } } var nodePosition = connectorBounds; //var texture = Texture; var pos = new Vector2(0f, 0f); if (ViewModel.Side == ConnectorSide.Left) { pos.x = nodePosition.x; pos.y = nodePosition.y + (nodePosition.height * ViewModel.SidePercentage); pos.y -= (TextureHeight / 2f); pos.x -= (TextureWidth) + 2; } else if (ViewModel.Side == ConnectorSide.Right) { pos.x = nodePosition.x + nodePosition.width; pos.y = nodePosition.y + (nodePosition.height * ViewModel.SidePercentage); pos.y -= (TextureHeight / 2f); pos.x += 2; } else if (ViewModel.Side == ConnectorSide.Bottom) { pos.x = nodePosition.x + (nodePosition.width * ViewModel.SidePercentage); pos.y = nodePosition.y + nodePosition.height; pos.x -= (TextureWidth / 2f); //pos.y += TextureHeight; } else if (ViewModel.Side == ConnectorSide.Top) { pos.x = nodePosition.x + (nodePosition.width * ViewModel.SidePercentage); pos.y = nodePosition.y; pos.x -= (TextureWidth / 2f); pos.y -= TextureHeight; } //if (ViewModel.IsMouseOver) //{ // var mouseOverBounds = new Rect(bounds); // ////mouseOverBounds.x -= mouseOverBounds.width*0.2f; // //mouseOverBounds.y += mouseOverBounds.height * 0.125f; // //mouseOverBounds.x += mouseOverBounds.width * 0.125f; // mouseOverBounds.width = 20; // mouseOverBounds.height = 20; // bounds = mouseOverBounds; //} //if (ViewModelObject.IsMouseOver) //{ // EditorGUI.DrawRect(Bounds.Scale(scale), Color.black); //} //if (!ViewModel.HasConnections) //if (!ViewModel.ConnectorFor.IsMouseOver && !ViewModel.ConnectorFor.IsSelected && !ViewModel.IsMouseOver) return; if (!ViewModel.AlwaysVisible) { if (!ViewModel.ConnectorFor.IsMouseOver && !ViewModel.ConnectorFor.IsSelected && !ViewModel.IsMouseOver && !ViewModel.HasConnections) { return; } } //if (ViewModel.HasConnections) //{ // platform.DrawImage(bounds, Texture, true); //} if (ViewModel.Direction == ConnectorDirection.Output && ViewModel.Side == ConnectorSide.Right) { Bounds = new Rect(pos.x, pos.y, TextureWidth, TextureHeight); //return; } else { Bounds = new Rect(pos.x, pos.y, TextureWidth, TextureHeight); } var padding = ViewModel.StyleSchema.Padding; Bounds = Bounds.Pad(padding.x, padding.y, padding.width, padding.height); var bounds = Bounds.Scale(scale); // if (ViewModel.IsMouseOver) // { platform.DrawImage(bounds, Texture, true); // platform.DrawImage(bounds, Texture, true); // } //platform.DrawImage(bounds, Texture, true); if (ViewModel.Direction == ConnectorDirection.Output && !string.IsNullOrEmpty(ViewModel.OutputDesctiption)) { platform.SetTooltipForRect(bounds, ViewModel.OutputDesctiption); } else if (!string.IsNullOrEmpty(ViewModel.InputDesctiption)) { platform.SetTooltipForRect(bounds, ViewModel.InputDesctiption); } //if (InvertGraphEditor.Settings.ShowGraphDebug && ViewModel.IsMouseOver) //{ // GUI.Label(new Rect(Bounds.x + 20, Bounds.y - 10, 500, 50), // this.ViewModel.DataObject.GetType().Name, // EditorStyles.miniBoldLabel); //} }
//TODO WIZARDS: Add scrolling (drawer needs to be extended to support scrolling / or use native unity stuff) public void DrawActionsPanel(IPlatformDrawer platform, Rect bounds, List <ActionItem> actions, Action <ActionItem, Vector2> primaryAction, Action <ActionItem, Vector2> secondaryAction = null) { platform.DrawStretchBox(bounds, CachedStyles.WizardSubBoxStyle, 13); bounds = bounds.PadSides(15); var headerRect = new Rect(bounds.WithHeight(40)); platform.DrawLabel(headerRect, "Actions", CachedStyles.WizardSubBoxTitleStyle, DrawingAlignment.TopCenter); bounds = bounds.Below(headerRect).Clip(bounds); var buttonSize = 100; var buttonsPerRow = (int)bounds.width / (int)buttonSize; var buttonIndex = 0; var padding = (bounds.width % buttonSize) / (buttonsPerRow - 1); var itemRect = new Rect().Align(bounds).WithSize(buttonSize, buttonSize); foreach (var action in actions) { platform.DrawStretchBox(itemRect, CachedStyles.WizardActionButtonStyle, 0); var action1 = action; platform.DoButton(itemRect, "", CachedStyles.ClearItemStyle, m => { primaryAction(action1, m); }, m => { if (secondaryAction != null) { secondaryAction(action1, m); } }); var imageRect = itemRect .WithSize(41, 41) .CenterInsideOf(itemRect) .AlignHorisontally(itemRect) .Translate(0, 10); var titleRect = itemRect .Below(imageRect) .Clip(itemRect) .Pad(5, 0, 10, 0) .Translate(0, -2); platform.DrawImage(imageRect, string.IsNullOrEmpty(action.Icon) ? "CreateEmptyDatabaseIcon" : action.Icon, true); platform.DrawLabel(titleRect, action.Title, CachedStyles.ListItemTitleStyle, DrawingAlignment.MiddleCenter); buttonIndex++; if (buttonIndex % buttonsPerRow == 0) { itemRect = itemRect.Below(itemRect).AlignVertically(bounds).Translate(0, 10); } else { itemRect = itemRect.RightOf(itemRect).Translate(padding, 0); } } }
public void DrawTabs(IPlatformDrawer platform, Rect tabsRect) { var designerWindow = DiagramViewModel.NavigationViewModel.DesignerWindow; if (designerWindow != null && designerWindow.Designer != null) { var x = 1f; foreach (var tab in DiagramViewModel.NavigationViewModel.Tabs.ToArray()) { if (tab == null) { continue; } if (tab.Title == null) { continue; } var textSize = platform.CalculateTextSize(tab.Title, CachedStyles.TabTitleStyle); var buttonRect = new Rect() .AlignAndScale(tabsRect) .WithWidth(Math.Max(textSize.x + 21 + 16, 60)) .Translate(x, 0); var buttonBoxRect = new Rect().AlignAndScale(buttonRect) .WithWidth(textSize.x + 10); var textRect = new Rect() .AlignAndScale(buttonRect) .Pad(7, 0, 7, 0); var closeButton = new Rect() .WithSize(16, 16) .AlignTopRight(buttonRect) .AlignHorisonallyByCenter(buttonRect) .Translate(-7, 1); platform.DrawStretchBox(buttonRect, tab.State == NavigationItemState.Current ? CachedStyles.TabBoxActiveStyle : CachedStyles.TabBoxStyle, 10); platform.DrawLabel(textRect, tab.Title, CachedStyles.TabTitleStyle); var tab1 = tab; platform.DoButton(buttonBoxRect, "", CachedStyles.ClearItemStyle, m => { if (tab1.NavigationAction != null) { tab1.NavigationAction(m); } }, m => { if (tab1.NavigationActionSecondary != null) { tab1.NavigationActionSecondary(m); } }); platform.DoButton(closeButton, "", CachedStyles.TabCloseButton, m => { if (tab1.CloseAction != null) { tab1.CloseAction(m); } }); // if (GUILayout.Button(tab.Name, // isCurrent // ? ElementDesignerStyles.TabBoxStyle // : ElementDesignerStyles.TabBoxActiveStyle,GUILayout.MinWidth(150))) // { // var projectService = InvertGraphEditor.Container.Resolve<WorkspaceService>(); // // if (Event.current.button == 1) // { // // var isLastGraph = projectService.CurrentWorkspace.Graphs.Count() <= 1; // // if (!isLastGraph) // { // var tab1 = tab; // projectService.Repository.RemoveAll<WorkspaceGraph>(p=>p.WorkspaceId == projectService.CurrentWorkspace.Identifier && p.GraphId == tab1.Identifier); // var lastGraph = projectService.CurrentWorkspace.Graphs.LastOrDefault(); // if (isCurrent && lastGraph != null) // { // designerWindow.SwitchDiagram(lastGraph); // } // // } // } // else // { // designerWindow.SwitchDiagram(projectService.CurrentWorkspace.Graphs.FirstOrDefault(p => p.Identifier == tab.Identifier)); // } // // } // // var butRect = GUILayoutUtility.GetLastRect(); x += buttonRect.width + 2; } var newTabButtonRect = new Rect().WithSize(27, 27).Align(tabsRect).AlignHorisonallyByCenter(tabsRect).Translate(x + 2, 0); platform.SetTooltipForRect(newTabButtonRect, "Create or import new graphs"); platform.DoButton(newTabButtonRect, "", ElementDesignerStyles.WizardActionButtonStyleSmall, () => { InvertApplication.SignalEvent <INewTabRequested>(_ => _.NewTabRequested()); }); //platform.DrawImage(newTabButtonRect,"",true); platform.DrawImage(newTabButtonRect.PadSides(6), "PlusIcon_Micro", true); // GUILayout.FlexibleSpace(); // GUILayout.EndHorizontal(); // GUILayout.EndArea(); } }
public void DrawBreadcrumbs(IPlatformDrawer platform, float y) { var navPanelRect = new Rect(4, y, 60, 30f); var breadcrumbsRect = new Rect(64, y, Bounds.width - 44, 30f); platform.DrawRect(Bounds.WithOrigin(0, y).WithHeight(30), InvertGraphEditor.Settings.BackgroundColor); var back = new Rect().WithSize(30, 30).PadSides(2).CenterInsideOf(navPanelRect.LeftHalf()); platform.DoButton(back, "", ElementDesignerStyles.WizardActionButtonStyleSmall, () => { InvertApplication.Execute(new NavigateBackCommand()); }); platform.DrawImage(back.PadSides(4), "BackIcon", true); var forward = new Rect().WithSize(30, 30).PadSides(2).CenterInsideOf(navPanelRect.RightHalf()); platform.DoButton(forward, "", ElementDesignerStyles.WizardActionButtonStyleSmall, () => { InvertApplication.Execute(new NavigateForwardCommand()); }); platform.DrawImage(forward.PadSides(4), "ForwardIcon", true); //var color = new Color(InvertGraphEditor.Settings.BackgroundColor.r * 0.8f, InvertGraphEditor.Settings.BackgroundColor.g * 0.8f, InvertGraphEditor.Settings.BackgroundColor.b * 0.8f, 1f); //platform.DrawRect(rect, color); // var lineRect = new Rect(rect); // lineRect.height = 2; // lineRect.y = y + 38f; // platform.DrawRect(lineRect, new Color(InvertGraphEditor.Settings.BackgroundColor.r * 0.6f, InvertGraphEditor.Settings.BackgroundColor.g * 0.6f, InvertGraphEditor.Settings.BackgroundColor.b * 0.6f, 1f)); // // // var first = true; // if (_cachedPaths != null) // foreach (var item in _cachedPaths) // { // var item1 = item; // platform.DoButton(new Rect(x, rect.y + 20 - (item.Value.y / 2), item.Value.x, item.Value.y), first ? item.Key.Name : "< " + item.Key.Name, first ? CachedStyles.GraphTitleLabel : CachedStyles.ItemTextEditingStyle, // () => // { // InvertApplication.Execute(new LambdaCommand(() => // { // DiagramViewModel.GraphData.PopToFilter(item1.Key); // })); // }); // x += item.Value.x + 15; // first = false; // } var x = 1f; var styles = DiagramViewModel.NavigationViewModel.BreadcrumbsStyle; var iconsTine = new Color(1, 1, 1, 0.5f); foreach (var usitem in DiagramViewModel.NavigationViewModel.Breadcrubs.ToArray()) { var item = usitem; var textSize = platform.CalculateTextSize(usitem.Title, CachedStyles.BreadcrumbTitleStyle); float buttonContentPadding = 5; float buttonIconsPadding = 5; bool useSpecIcon = !string.IsNullOrEmpty(item.SpecializedIcon); var buttonWidth = textSize.x + buttonContentPadding * 2 + 8; if (!string.IsNullOrEmpty(item.Icon)) { buttonWidth += buttonIconsPadding + 16; } if (useSpecIcon) { buttonWidth += buttonIconsPadding + 16; } var buttonRect = new Rect() .AlignAndScale(breadcrumbsRect) .WithWidth(buttonWidth) .PadSides(3) .Translate(x, 0); var icon1Rect = new Rect() .WithSize(16, 16) .AlignTopRight(buttonRect) .AlignHorisonallyByCenter(buttonRect) .Translate(-buttonContentPadding, 0); var icon2Rect = new Rect() .WithSize(16, 16) .Align(buttonRect) .AlignHorisonallyByCenter(buttonRect) .Translate(buttonContentPadding, 0); var textRect = new Rect() .WithSize(textSize.x, textSize.y) .Align(useSpecIcon ? icon2Rect : buttonRect) .AlignHorisonallyByCenter(buttonRect) .Translate(useSpecIcon ? buttonIconsPadding + 16 : buttonContentPadding, -1); var dotRect = new Rect() .WithSize(16, 16) .RightOf(buttonRect) .AlignHorisonallyByCenter(buttonRect) .Translate(-3, 0); platform.DoButton(buttonRect, "", item.State == NavigationItemState.Current ? CachedStyles.BreadcrumbBoxActiveStyle : CachedStyles.BreadcrumbBoxStyle, item.NavigationAction); platform.DrawLabel(textRect, item.Title, CachedStyles.BreadcrumbTitleStyle, DrawingAlignment.MiddleCenter); platform.DrawImage(icon1Rect, styles.GetIcon(item.Icon, iconsTine), true); if (useSpecIcon) { platform.DrawImage(icon2Rect, styles.GetIcon(item.SpecializedIcon, iconsTine), true); } if (item.State != NavigationItemState.Current) { platform.DrawImage(dotRect, styles.GetIcon("DotIcon", iconsTine), true); } x += buttonRect.width + 16 - 6; } }
public override void Draw(IPlatformDrawer platform, float scale) { base.Draw(platform, scale); var headerPadding = StyleSchema.HeaderPadding; // var headerBounds = new Rect( // Bounds.x - headerPadding.left, // Bounds.y, // Bounds.width + headerPadding.left * 2 + 1, // Bounds.height + (NodeViewModel.IsCollapsed ? 0 : -20) + headerPadding.bottom); var headerBounds = new Rect( //Bounds.x-headerPadding.left-1, Bounds.x - headerPadding.left + 1, Bounds.y + 1, Bounds.width + headerPadding.left + headerPadding.right + headerPadding.left - 6, Bounds.height + 0 + (NodeViewModel.IsCollapsed ? 9 : -2)); var image = HeaderImage; platform.DrawNodeHeader( headerBounds, NodeViewModel.IsCollapsed ? StyleSchema.CollapsedHeaderStyleObject : StyleSchema.ExpandedHeaderStyleObject, NodeViewModel.IsCollapsed, scale, image); // The bounds for the main text // var textBounds = new Rect(Bounds.x, Bounds.y + ((Bounds.height / 2f) - (TextSize.y / 2f)), Bounds.width, // Bounds.height); var padding = headerPadding; var titleBounds = new Rect( Bounds.x + padding.left, Bounds.y + padding.top + (StyleSchema.ShowSubtitle ? 1 : 0), Bounds.width - padding.right - padding.left - (StyleSchema.ShowIcon ? 16 : 0), //Subtract icon size if shown Bounds.height - padding.top - padding.bottom); var titleSize = platform.CalculateTextSize(NodeViewModel.Label, StyleSchema.TitleStyleObject); var subtitleBound = new Rect(Bounds.x + padding.left + 0, Bounds.y + padding.top + titleSize.y + 0, Bounds.width - padding.right, Bounds.height - padding.top); if (NodeViewModel.IsEditing && NodeViewModel.IsEditable) { //UnityEngine.GUI.SetNextControlName("EditingField"); //DiagramDrawer.IsEditingField = true; //UnityEditor.EditorGUI.BeginChangeCheck(); //var newText = GUI.TextField(textBounds.Scale(scale), NodeViewModel.Name, // ElementDesignerStyles.ViewModelHeaderEditingStyle); //if (UnityEditor.EditorGUI.EndChangeCheck()) //{ // NodeViewModel.Rename(newText); // Dirty = true; //} //textBounds.y += TextSize.y / 2f; platform.DrawTextbox(NodeViewModel.GraphItemObject.Identifier, titleBounds.Scale(scale), NodeViewModel.Name, CachedStyles.ViewModelHeaderStyle, (v, finished) => { NodeViewModel.Rename(v); ParentDrawer.Refresh(platform); if (finished) { NodeViewModel.EndEditing(); } }); } else { //var titleStyle = new GUIStyle(TextStyle); //titleStyle.normal.textColor = BackgroundStyle.normal.textColor; //titleStyle.alignment = TextAnchor.MiddleCenter; //titleStyle.fontSize = Mathf.RoundToInt(12*scale); platform.DrawLabel(titleBounds.Scale(scale), NodeViewModel.Label ?? string.Empty, StyleSchema.TitleStyleObject, StyleSchema.ShowSubtitle ? DrawingAlignment.TopLeft : DrawingAlignment.MiddleLeft); if (StyleSchema.ShowSubtitle && !string.IsNullOrEmpty(NodeViewModel.SubTitle)) { platform.DrawLabel(subtitleBound.Scale(scale), NodeViewModel.SubTitle ?? string.Empty, StyleSchema.SubTitleStyleObject, StyleSchema.ShowSubtitle ? DrawingAlignment.TopLeft : DrawingAlignment.MiddleLeft); } if (StyleSchema.ShowIcon && !string.IsNullOrEmpty(NodeViewModel.IconName)) { var iconsize = IconBounds ?? (IconBounds = new Vector2(16, 16)); var size = 16; var imageBounds = new Rect(Bounds.xMax - padding.right - size, Bounds.y + ((Bounds.height / 2f) - (size / 2f)), 16, 16); //var imageBounds = new Rect().WithSize(16, 16).InnerAlignWithUpperRight(Bounds).AlignHorisonallyByCenter(headerBounds).Translate(-headerPadding.right,0); var cCache = GUI.color; GUI.color = new Color(cCache.r, cCache.g, cCache.b, 0.7f); platform.DrawImage(imageBounds.Scale(scale), IconImage, true); GUI.color = cCache; if (!string.IsNullOrEmpty(IconTooltip)) { platform.SetTooltipForRect(imageBounds.Scale(scale), IconTooltip); } } //GUI.Label(textBounds.Scale(scale), NodeViewModel.Label ?? string.Empty, titleStyle); //if (NodeViewModel.IsCollapsed) //{ // textBounds.y += TextSize.y/2f; // //titleStyle.fontSize = Mathf.RoundToInt(10*scale); // //titleStyle.fontStyle = FontStyle.Italic; // GUI.Label(textBounds.Scale(scale), NodeViewModel.SubTitle, titleStyle); //} } }
public void DrawTabs(IPlatformDrawer platform, Rect tabsRect) { var designerWindow = DiagramViewModel.NavigationViewModel.DesignerWindow; if (designerWindow != null && designerWindow.Designer != null) { var x = 1f; foreach (var tab in DiagramViewModel.NavigationViewModel.Tabs.ToArray()) { if (tab == null) { continue; } if (tab.Title == null) { continue; } var textSize = platform.CalculateTextSize(tab.Title, CachedStyles.TabTitleStyle); var buttonRect = new Rect() .AlignAndScale(tabsRect) .WithWidth(Math.Max(textSize.x + 21 + 16, 60)) .Translate(x, 0); var buttonBoxRect = new Rect().AlignAndScale(buttonRect) .WithWidth(textSize.x + 10); var textRect = new Rect() .AlignAndScale(buttonRect) .Pad(7, 0, 7, 0); var closeButton = new Rect() .WithSize(16, 16) .AlignTopRight(buttonRect) .AlignHorisonallyByCenter(buttonRect) .Translate(-7, 1); platform.DrawStretchBox(buttonRect, tab.State == NavigationItemState.Current ? CachedStyles.TabBoxActiveStyle : CachedStyles.TabBoxStyle, 10); platform.DrawLabel(textRect, tab.Title, CachedStyles.TabTitleStyle); var tab1 = tab; platform.DoButton(buttonBoxRect, "", CachedStyles.ClearItemStyle, m => { if (tab1.NavigationAction != null) { tab1.NavigationAction(m); } }, m => { if (tab1.NavigationActionSecondary != null) { tab1.NavigationActionSecondary(m); } }); platform.DoButton(closeButton, "", CachedStyles.TabCloseButton, m => { if (tab1.CloseAction != null) { tab1.CloseAction(m); } }); x += buttonRect.width + 2; } var newTabButtonRect = new Rect().WithSize(27, 27).Align(tabsRect).AlignHorisonallyByCenter(tabsRect).Translate(x + 2, 0); platform.SetTooltipForRect(newTabButtonRect, "Create or import new graphs"); platform.DoButton(newTabButtonRect, "", ElementDesignerStyles.WizardActionButtonStyleSmall, () => { InvertApplication.SignalEvent <INewTabRequested>(_ => _.NewTabRequested()); }); platform.DrawImage(newTabButtonRect.PadSides(6), "PlusIcon_Micro", true); } }
public void DrawBreadcrumbs(IPlatformDrawer platform, float y) { var navPanelRect = new Rect(4, y, 60, 30f); var breadcrumbsRect = new Rect(64, y, Bounds.width - 44, 30f); platform.DrawRect(Bounds.WithOrigin(0, y).WithHeight(30), InvertGraphEditor.Settings.BackgroundColor); var back = new Rect().WithSize(30, 30).PadSides(2).CenterInsideOf(navPanelRect.LeftHalf()); platform.DoButton(back, "", ElementDesignerStyles.WizardActionButtonStyleSmall, () => { InvertApplication.Execute(new NavigateBackCommand()); }); platform.DrawImage(back.PadSides(4), "BackIcon", true); var forward = new Rect().WithSize(30, 30).PadSides(2).CenterInsideOf(navPanelRect.RightHalf()); platform.DoButton(forward, "", ElementDesignerStyles.WizardActionButtonStyleSmall, () => { InvertApplication.Execute(new NavigateForwardCommand()); }); platform.DrawImage(forward.PadSides(4), "ForwardIcon", true); var x = 1f; var styles = DiagramViewModel.NavigationViewModel.BreadcrumbsStyle; var iconsTine = new Color(1, 1, 1, 0.5f); foreach (var usitem in DiagramViewModel.NavigationViewModel.Breadcrubs.ToArray()) { var item = usitem; var textSize = platform.CalculateTextSize(usitem.Title, CachedStyles.BreadcrumbTitleStyle); float buttonContentPadding = 5; float buttonIconsPadding = 5; bool useSpecIcon = !string.IsNullOrEmpty(item.SpecializedIcon); var buttonWidth = textSize.x + buttonContentPadding * 2 + 8; if (!string.IsNullOrEmpty(item.Icon)) { buttonWidth += buttonIconsPadding + 16; } if (useSpecIcon) { buttonWidth += buttonIconsPadding + 16; } var buttonRect = new Rect() .AlignAndScale(breadcrumbsRect) .WithWidth(buttonWidth) .PadSides(3) .Translate(x, 0); var icon1Rect = new Rect() .WithSize(16, 16) .AlignTopRight(buttonRect) .AlignHorisonallyByCenter(buttonRect) .Translate(-buttonContentPadding, 0); var icon2Rect = new Rect() .WithSize(16, 16) .Align(buttonRect) .AlignHorisonallyByCenter(buttonRect) .Translate(buttonContentPadding, 0); var textRect = new Rect() .WithSize(textSize.x, textSize.y) .Align(useSpecIcon ? icon2Rect : buttonRect) .AlignHorisonallyByCenter(buttonRect) .Translate(useSpecIcon ? buttonIconsPadding + 16 : buttonContentPadding, -1); var dotRect = new Rect() .WithSize(16, 16) .RightOf(buttonRect) .AlignHorisonallyByCenter(buttonRect) .Translate(-3, 0); platform.DoButton(buttonRect, "", item.State == NavigationItemState.Current ? CachedStyles.BreadcrumbBoxActiveStyle : CachedStyles.BreadcrumbBoxStyle, item.NavigationAction); platform.DrawLabel(textRect, item.Title, CachedStyles.BreadcrumbTitleStyle, DrawingAlignment.MiddleCenter); platform.DrawImage(icon1Rect, styles.GetIcon(item.Icon, iconsTine), true); if (useSpecIcon) { platform.DrawImage(icon2Rect, styles.GetIcon(item.SpecializedIcon, iconsTine), true); } if (item.State != NavigationItemState.Current) { platform.DrawImage(dotRect, styles.GetIcon("DotIcon", iconsTine), true); } x += buttonRect.width + 16 - 6; } }
public override void Draw(IPlatformDrawer platform, float scale) { base.Draw(platform, scale); var headerPadding = StyleSchema.HeaderPadding; // var headerBounds = new Rect( // Bounds.x - headerPadding.left, // Bounds.y, // Bounds.width + headerPadding.left * 2 + 1, // Bounds.height + (NodeViewModel.IsCollapsed ? 0 : -20) + headerPadding.bottom); var headerBounds = new Rect( //Bounds.x-headerPadding.left-1, Bounds.x-headerPadding.left+1, Bounds.y+1, Bounds.width + headerPadding.left + headerPadding.right + headerPadding.left -6, Bounds.height+0 + (NodeViewModel.IsCollapsed ? 9 : -2)); var image = HeaderImage; platform.DrawNodeHeader( headerBounds, NodeViewModel.IsCollapsed ? StyleSchema.CollapsedHeaderStyleObject : StyleSchema.ExpandedHeaderStyleObject, NodeViewModel.IsCollapsed, scale,image); // The bounds for the main text // var textBounds = new Rect(Bounds.x, Bounds.y + ((Bounds.height / 2f) - (TextSize.y / 2f)), Bounds.width, // Bounds.height); var padding = headerPadding; var titleBounds = new Rect( Bounds.x + padding.left, Bounds.y + padding.top + (StyleSchema.ShowSubtitle ? 1 : 0 ) , Bounds.width-padding.right-padding.left-(StyleSchema.ShowIcon ? 16 : 0), //Subtract icon size if shown Bounds.height-padding.top-padding.bottom); var titleSize = platform.CalculateTextSize(NodeViewModel.Label, StyleSchema.TitleStyleObject); var subtitleBound = new Rect(Bounds.x + padding.left+0, Bounds.y + padding.top + titleSize.y + 0, Bounds.width-padding.right, Bounds.height-padding.top); if (NodeViewModel.IsEditing && NodeViewModel.IsEditable) { //UnityEngine.GUI.SetNextControlName("EditingField"); //DiagramDrawer.IsEditingField = true; //UnityEditor.EditorGUI.BeginChangeCheck(); //var newText = GUI.TextField(textBounds.Scale(scale), NodeViewModel.Name, // ElementDesignerStyles.ViewModelHeaderEditingStyle); //if (UnityEditor.EditorGUI.EndChangeCheck()) //{ // NodeViewModel.Rename(newText); // Dirty = true; //} //textBounds.y += TextSize.y / 2f; platform.DrawTextbox(NodeViewModel.GraphItemObject.Identifier, titleBounds.Scale(scale), NodeViewModel.Name, CachedStyles.ViewModelHeaderStyle, (v, finished) => { NodeViewModel.Rename(v); ParentDrawer.Refresh(platform); if (finished) { NodeViewModel.EndEditing(); } }); } else { //var titleStyle = new GUIStyle(TextStyle); //titleStyle.normal.textColor = BackgroundStyle.normal.textColor; //titleStyle.alignment = TextAnchor.MiddleCenter; //titleStyle.fontSize = Mathf.RoundToInt(12*scale); platform.DrawLabel(titleBounds.Scale(scale), NodeViewModel.Label ?? string.Empty, StyleSchema.TitleStyleObject, StyleSchema.ShowSubtitle ? DrawingAlignment.TopLeft : DrawingAlignment.MiddleLeft); if (StyleSchema.ShowSubtitle && !string.IsNullOrEmpty(NodeViewModel.SubTitle)) { platform.DrawLabel(subtitleBound.Scale(scale), NodeViewModel.SubTitle ?? string.Empty, StyleSchema.SubTitleStyleObject, StyleSchema.ShowSubtitle ? DrawingAlignment.TopLeft : DrawingAlignment.MiddleLeft); } if (StyleSchema.ShowIcon && !string.IsNullOrEmpty(NodeViewModel.IconName)) { var iconsize = IconBounds ?? (IconBounds = new Vector2(16,16)); var size = 16; var imageBounds = new Rect(Bounds.xMax - padding.right - size, Bounds.y + ((Bounds.height / 2f) - (size / 2f)), 16, 16); //var imageBounds = new Rect().WithSize(16, 16).InnerAlignWithUpperRight(Bounds).AlignHorisonallyByCenter(headerBounds).Translate(-headerPadding.right,0); var cCache = GUI.color; GUI.color = new Color(cCache.r, cCache.g, cCache.b, 0.7f); platform.DrawImage(imageBounds.Scale(scale), IconImage, true); GUI.color = cCache; if (!string.IsNullOrEmpty(IconTooltip)) { platform.SetTooltipForRect(imageBounds.Scale(scale), IconTooltip); } } //GUI.Label(textBounds.Scale(scale), NodeViewModel.Label ?? string.Empty, titleStyle); //if (NodeViewModel.IsCollapsed) //{ // textBounds.y += TextSize.y/2f; // //titleStyle.fontSize = Mathf.RoundToInt(10*scale); // //titleStyle.fontStyle = FontStyle.Italic; // GUI.Label(textBounds.Scale(scale), NodeViewModel.SubTitle, titleStyle); //} } }
//TODO WIZARDS: Add scrolling (drawer needs to be extended to support scrolling / or use native unity stuff) public void DrawActionsPanel(IPlatformDrawer platform, Rect bounds, List<ActionItem> actions, Action<ActionItem,Vector2> primaryAction, Action<ActionItem,Vector2> secondaryAction = null) { platform.DrawStretchBox(bounds, CachedStyles.WizardSubBoxStyle, 13); bounds = bounds.PadSides(15); var headerRect = new Rect(bounds.WithHeight(40)); platform.DrawLabel(headerRect, "Actions", CachedStyles.WizardSubBoxTitleStyle, DrawingAlignment.TopCenter); bounds = bounds.Below(headerRect).Clip(bounds); var buttonSize = 100; var buttonsPerRow = (int)bounds.width / (int)buttonSize; var buttonIndex = 0; var padding = (bounds.width % buttonSize) / (buttonsPerRow - 1); var itemRect = new Rect().Align(bounds).WithSize(buttonSize, buttonSize); foreach (var action in actions) { platform.DrawStretchBox(itemRect, CachedStyles.WizardActionButtonStyle, 0); var action1 = action; platform.DoButton(itemRect,"",CachedStyles.ClearItemStyle, m => { primaryAction(action1, m); }, m => { if (secondaryAction != null) { secondaryAction(action1, m); } }); var imageRect = itemRect .WithSize(41, 41) .CenterInsideOf(itemRect) .AlignHorisontally(itemRect) .Translate(0, 10); var titleRect = itemRect .Below(imageRect) .Clip(itemRect) .Pad(5, 0, 10, 0) .Translate(0, -2); platform.DrawImage(imageRect, string.IsNullOrEmpty(action.Icon) ? "CreateEmptyDatabaseIcon" : action.Icon, true); platform.DrawLabel(titleRect, action.Title, CachedStyles.ListItemTitleStyle, DrawingAlignment.MiddleCenter); buttonIndex++; if (buttonIndex % buttonsPerRow == 0) { itemRect = itemRect.Below(itemRect).AlignVertically(bounds).Translate(0, 10); } else { itemRect = itemRect.RightOf(itemRect).Translate(padding, 0); } } }
public void DrawTabs(IPlatformDrawer platform, Rect tabsRect) { var designerWindow = DiagramViewModel.NavigationViewModel.DesignerWindow; if (designerWindow != null && designerWindow.Designer != null) { var x = 1f; foreach (var tab in DiagramViewModel.NavigationViewModel.Tabs.ToArray()) { if (tab == null) continue; if (tab.Title == null) continue; var textSize = platform.CalculateTextSize(tab.Title, CachedStyles.TabTitleStyle); var buttonRect= new Rect() .AlignAndScale(tabsRect) .WithWidth(Math.Max(textSize.x + 21 + 16,60)) .Translate(x,0); var buttonBoxRect = new Rect().AlignAndScale(buttonRect) .WithWidth(textSize.x + 10); var textRect = new Rect() .AlignAndScale(buttonRect) .Pad(7, 0, 7, 0); var closeButton = new Rect() .WithSize(16, 16) .AlignTopRight(buttonRect) .AlignHorisonallyByCenter(buttonRect) .Translate(-7,1); platform.DrawStretchBox(buttonRect,tab.State == NavigationItemState.Current ? CachedStyles.TabBoxActiveStyle : CachedStyles.TabBoxStyle,10); platform.DrawLabel(textRect,tab.Title,CachedStyles.TabTitleStyle); var tab1 = tab; platform.DoButton(buttonBoxRect,"",CachedStyles.ClearItemStyle, m => { if (tab1.NavigationAction != null) tab1.NavigationAction(m); }, m => { if (tab1.NavigationActionSecondary != null) tab1.NavigationActionSecondary(m); }); platform.DoButton(closeButton,"",CachedStyles.TabCloseButton, m => { if (tab1.CloseAction != null) tab1.CloseAction(m); }); // if (GUILayout.Button(tab.Name, // isCurrent // ? ElementDesignerStyles.TabBoxStyle // : ElementDesignerStyles.TabBoxActiveStyle,GUILayout.MinWidth(150))) // { // var projectService = InvertGraphEditor.Container.Resolve<WorkspaceService>(); // // if (Event.current.button == 1) // { // // var isLastGraph = projectService.CurrentWorkspace.Graphs.Count() <= 1; // // if (!isLastGraph) // { // var tab1 = tab; // projectService.Repository.RemoveAll<WorkspaceGraph>(p=>p.WorkspaceId == projectService.CurrentWorkspace.Identifier && p.GraphId == tab1.Identifier); // var lastGraph = projectService.CurrentWorkspace.Graphs.LastOrDefault(); // if (isCurrent && lastGraph != null) // { // designerWindow.SwitchDiagram(lastGraph); // } // // } // } // else // { // designerWindow.SwitchDiagram(projectService.CurrentWorkspace.Graphs.FirstOrDefault(p => p.Identifier == tab.Identifier)); // } // // } // // var butRect = GUILayoutUtility.GetLastRect(); x += buttonRect.width+2; } var newTabButtonRect = new Rect().WithSize(27, 27).Align(tabsRect).AlignHorisonallyByCenter(tabsRect).Translate(x+2, 0); platform.SetTooltipForRect(newTabButtonRect,"Create or import new graphs"); platform.DoButton(newTabButtonRect,"",ElementDesignerStyles.WizardActionButtonStyleSmall,()=>{ InvertApplication.SignalEvent<INewTabRequested>(_=>_.NewTabRequested());}); //platform.DrawImage(newTabButtonRect,"",true); platform.DrawImage(newTabButtonRect.PadSides(6),"PlusIcon_Micro",true); // GUILayout.FlexibleSpace(); // GUILayout.EndHorizontal(); // GUILayout.EndArea(); } }
public void DrawBreadcrumbs(IPlatformDrawer platform, float y) { var navPanelRect = new Rect(4, y, 60, 30f); var breadcrumbsRect = new Rect(64, y, Bounds.width-44, 30f); platform.DrawRect(Bounds.WithOrigin(0,y).WithHeight(30), InvertGraphEditor.Settings.BackgroundColor); var back = new Rect().WithSize(30, 30).PadSides(2).CenterInsideOf(navPanelRect.LeftHalf()); platform.DoButton(back, "", ElementDesignerStyles.WizardActionButtonStyleSmall, () => { InvertApplication.Execute(new NavigateBackCommand()); }); platform.DrawImage(back.PadSides(4), "BackIcon", true); var forward = new Rect().WithSize(30, 30).PadSides(2).CenterInsideOf(navPanelRect.RightHalf()); platform.DoButton(forward, "", ElementDesignerStyles.WizardActionButtonStyleSmall, () => { InvertApplication.Execute(new NavigateForwardCommand()); }); platform.DrawImage(forward.PadSides(4),"ForwardIcon",true); //var color = new Color(InvertGraphEditor.Settings.BackgroundColor.r * 0.8f, InvertGraphEditor.Settings.BackgroundColor.g * 0.8f, InvertGraphEditor.Settings.BackgroundColor.b * 0.8f, 1f); //platform.DrawRect(rect, color); // var lineRect = new Rect(rect); // lineRect.height = 2; // lineRect.y = y + 38f; // platform.DrawRect(lineRect, new Color(InvertGraphEditor.Settings.BackgroundColor.r * 0.6f, InvertGraphEditor.Settings.BackgroundColor.g * 0.6f, InvertGraphEditor.Settings.BackgroundColor.b * 0.6f, 1f)); // // // var first = true; // if (_cachedPaths != null) // foreach (var item in _cachedPaths) // { // var item1 = item; // platform.DoButton(new Rect(x, rect.y + 20 - (item.Value.y / 2), item.Value.x, item.Value.y), first ? item.Key.Name : "< " + item.Key.Name, first ? CachedStyles.GraphTitleLabel : CachedStyles.ItemTextEditingStyle, // () => // { // InvertApplication.Execute(new LambdaCommand(() => // { // DiagramViewModel.GraphData.PopToFilter(item1.Key); // })); // }); // x += item.Value.x + 15; // first = false; // } var x = 1f; var styles = DiagramViewModel.NavigationViewModel.BreadcrumbsStyle; var iconsTine = new Color(1, 1, 1, 0.5f); foreach (var usitem in DiagramViewModel.NavigationViewModel.Breadcrubs.ToArray()) { var item = usitem; var textSize = platform.CalculateTextSize(usitem.Title, CachedStyles.BreadcrumbTitleStyle); float buttonContentPadding = 5; float buttonIconsPadding= 5; bool useSpecIcon = !string.IsNullOrEmpty(item.SpecializedIcon); var buttonWidth = textSize.x + buttonContentPadding*2 + 8; if (!string.IsNullOrEmpty(item.Icon)) buttonWidth += buttonIconsPadding + 16; if (useSpecIcon) buttonWidth += buttonIconsPadding + 16; var buttonRect = new Rect() .AlignAndScale(breadcrumbsRect) .WithWidth(buttonWidth) .PadSides(3) .Translate(x, 0); var icon1Rect = new Rect() .WithSize(16, 16) .AlignTopRight(buttonRect) .AlignHorisonallyByCenter(buttonRect) .Translate(-buttonContentPadding, 0); var icon2Rect = new Rect() .WithSize(16, 16) .Align(buttonRect) .AlignHorisonallyByCenter(buttonRect) .Translate(buttonContentPadding, 0); var textRect = new Rect() .WithSize(textSize.x, textSize.y) .Align(useSpecIcon ? icon2Rect : buttonRect) .AlignHorisonallyByCenter(buttonRect) .Translate(useSpecIcon ? buttonIconsPadding + 16 : buttonContentPadding, -1); var dotRect = new Rect() .WithSize(16, 16) .RightOf(buttonRect) .AlignHorisonallyByCenter(buttonRect) .Translate(-3,0); platform.DoButton(buttonRect, "", item.State == NavigationItemState.Current ? CachedStyles.BreadcrumbBoxActiveStyle : CachedStyles.BreadcrumbBoxStyle, item.NavigationAction); platform.DrawLabel(textRect, item.Title, CachedStyles.BreadcrumbTitleStyle, DrawingAlignment.MiddleCenter); platform.DrawImage(icon1Rect, styles.GetIcon(item.Icon,iconsTine), true); if (useSpecIcon) platform.DrawImage(icon2Rect, styles.GetIcon(item.SpecializedIcon, iconsTine), true); if (item.State != NavigationItemState.Current) platform.DrawImage(dotRect, styles.GetIcon("DotIcon", iconsTine), true); x += buttonRect.width + 16 - 6; } }
/// <summary> /// Draw Diagram Tabs and Add Graph Button /// </summary> /// <param name="platform"></param> /// <param name="tabsRect"></param> public void DrawTabs(IPlatformDrawer platform, Rect tabsRect) { var designerWindow = DiagramViewModel.NavigationViewModel.DesignerWindow; if (designerWindow != null && designerWindow.Designer != null) { var x = 1f; // Show Tab Buttons float maxButtonWidth = (tabsRect.width - 32) / DiagramViewModel.NavigationViewModel.Tabs.Count; foreach (var tab in DiagramViewModel.NavigationViewModel.Tabs.ToArray()) { if (tab == null) { continue; } if (tab.Title == null) { continue; } // Calculate Tab Button's rects (button, closebutton, text, buttonbox) var textSize = platform.CalculateTextSize(tab.Title, CachedStyles.TabTitleStyle); var buttonRect = new Rect().AlignAndScale(tabsRect) .WithWidth(Math.Min(textSize.x + 21 + 16, maxButtonWidth)) .Translate(x, 0); var closeButtonRect = new Rect() { width = 0 }; if (tab.State == NavigationItemState.Current) { closeButtonRect = new Rect().WithSize(16, 16) .AlignTopRight(buttonRect) .AlignHorisonallyByCenter(buttonRect) .Translate(-7, 1); } var textRect = new Rect().AlignAndScale(buttonRect) .Pad(7, 0, 14 + closeButtonRect.width, 0); var buttonBoxRect = new Rect().AlignAndScale(buttonRect) .WithWidth(textRect.width); // Draw Tab Button DrawTab(platform, buttonRect, textRect, buttonBoxRect, closeButtonRect, tab); x += buttonRect.width; } // Show New Graph Button var newTabButtonRect = new Rect().WithSize(27, 27).Align(tabsRect).AlignHorisonallyByCenter(tabsRect).Translate(x + 2, 0); platform.SetTooltipForRect(newTabButtonRect, "Create or import new graphs"); platform.DoButton(newTabButtonRect, "", ElementDesignerStyles.WizardActionButtonStyleSmall, () => { InvertApplication.SignalEvent <INewTabRequested>(_ => _.NewTabRequested()); }); platform.DrawImage(newTabButtonRect.PadSides(6), "PlusIcon_Micro", true); } }