void DrawModules() { CGModule curSel = Sel.SelectedModule; // Begin drawing Module Windows BeginWindows(); for (int i = 0; i < Modules.Count; i++) { var mod = Modules[i]; if (mod != null) { mod.Properties.Dimensions.width = Mathf.Max(mod.Properties.Dimensions.width, mod.Properties.MinWidth); mod.Properties.Dimensions.height = 0; // will be set by GUILayout.Window // Render title string title = mod.ModuleName; if (!mod.IsConfigured) { title = string.Format("<color={0}>{1}</color>", new Color(1, 0.2f, 0.2f).SkinAwareColor().ToHtml(), mod.ModuleName); } //"<color=#ff3333>" + mod.ModuleName + "</color>"; else if (mod is IOnRequestProcessing) { title = string.Format("<color={0}>{1}</color>", CurvyStyles.IOnRequestProcessingTitleColor.SkinAwareColor().ToHtml(), mod.ModuleName); } #if CURVY_DEBUG title = mod.UniqueID + ":" + title; #endif // the actual window Vector2 oldPos = mod.Properties.Dimensions.position; Rect newWindowRect = GUILayout.Window(i, mod.Properties.Dimensions, OnModuleWindowCB, title, CurvyStyles.ModuleWindow); if (!Application.isPlaying && oldPos != newWindowRect.position) #if UNITY_5_0 || UNITY_5_1 || UNITY_5_2 { EditorApplication.MarkSceneDirty(); } #else { UnityEditor.SceneManagement.EditorSceneManager.MarkAllScenesDirty(); } #endif if (Sel.SelectedModules.Count > 1) // Multi-Module move in OnGUI() { mod.Properties.Dimensions = newWindowRect.SetPosition(oldPos); } else { if (EV.alt && Canvas.IsModuleDrag && Sel.SelectedModule == mod) { newWindowRect.position = newWindowRect.position.Snap(CurvyProject.Instance.CGGraphSnapping); } mod.Properties.Dimensions = newWindowRect; } // Debugging var lastUpdateDelta = (System.DateTime.Now - mod.DEBUG_LastUpdateTime).TotalMilliseconds; if (lastUpdateDelta < 1500) { float alpha = Mathf.SmoothStep(1, 0, (float)lastUpdateDelta / 1500f); DTGUI.PushBackgroundColor(new Color(0, 1, 0, alpha)); GUI.Box(mod.Properties.Dimensions.ScaleBy(9), "", CurvyStyles.GlowBox); DTGUI.PopBackgroundColor(); Repaint(); } // Track Window Movement for Viewport calculation Canvas.ViewPortRegisterWindow(mod); } } EndWindows(); if (Sel.SelectedModule != curSel) { Canvas.FocusSelection(); } }
void OnGUI() { mDoRepaint = false; if (!Generator) { return; } if (!Generator.IsInitialized) { Generator.Initialize(); } Modules = new List <CGModule>(Generator.Modules.ToArray()); mModuleCount = Modules.Count; // store count to be checked in window GUI if (!Application.isPlaying && !Generator.IsInitialized) { Repaint(); } DrawToolbar(); Canvas.SetClientRect(0, GUILayoutUtility.GetLastRect().yMax, 0, mStatusbarHeight); // Scrollable Canvas if (Canvas.Scroll.isAnimating) { GUI.BeginScrollView(Canvas.ClientRect, Canvas.Scroll.value, Canvas.CanvasRect); } else { Canvas.Scroll.value = GUI.BeginScrollView(Canvas.ClientRect, Canvas.Scroll.value, Canvas.CanvasRect); } // render background DTGUI.PushColor(Color.black.SkinAwareColor(true)); GUI.Box(Canvas.ViewPort, ""); DTGUI.PopColor(); #if CURVY_DEBUG GUILayout.BeginArea(Canvas.ViewPort); GUILayout.Label("Canvas ClientRect: " + Canvas.ClientRect); GUILayout.Label("Canvas Rect: " + Canvas.CanvasRect); GUILayout.Label("Canvas Scroll: " + Canvas.Scroll); GUILayout.Label("Canvas ViewPort: " + Canvas.ViewPort); GUILayout.Label("Mouse: " + EV.mousePosition); GUILayout.Label("IsWindowDrag: " + Canvas.IsWindowDrag); GUILayout.Label("IsSelectionDrag: " + Canvas.IsSelectionRectDrag); GUILayout.Label("IsLinkDrag: " + Canvas.IsLinkDrag); GUILayout.Label("IsCanvasDrag: " + Canvas.IsCanvasDrag); GUILayout.Label("IsModuleDrag: " + Canvas.IsModuleDrag); GUILayout.Label("MouseOverModule: " + Canvas.MouseOverModule); GUILayout.Label("MouseOverCanvas: " + Canvas.IsMouseOverCanvas); GUILayout.Label("SelectedLink: " + Sel.SelectedLink); GUILayout.Label("Selected Module: " + Sel.SelectedModule); GUILayout.EndArea(); #endif if (CurvyProject.Instance.CGShowHelp) { var r = new Rect(Canvas.ViewPort); r.x = r.width - 210; r.y = 10; r.width = 200; r.height = 190; GUILayout.BeginArea(r, GUI.skin.box); GUI.Label(new Rect(10, 5, 200, 20), "<i><b>General</b></i>", DTStyles.HtmlLabel); GUI.Label(new Rect(20, 25, 50, 20), "<b>RMB</b>", DTStyles.HtmlLabel); GUI.Label(new Rect(70, 25, 150, 20), "Context Menu", DTStyles.HtmlLabel); GUI.Label(new Rect(20, 40, 150, 40), "<b>MMB/\nSpace</b>", DTStyles.HtmlLabel); GUI.Label(new Rect(70, 40, 150, 20), "Drag Canvas", DTStyles.HtmlLabel); GUI.Label(new Rect(20, 70, 150, 20), "<b>Alt</b>", DTStyles.HtmlLabel); GUI.Label(new Rect(70, 70, 150, 20), "Hold to snap to grid", DTStyles.HtmlLabel); GUI.Label(new Rect(20, 85, 150, 20), "<b>Del</b>", DTStyles.HtmlLabel); GUI.Label(new Rect(70, 85, 150, 20), "Delete selection", DTStyles.HtmlLabel); GUI.Label(new Rect(10, 110, 200, 20), "<i><b>Add Modules</b></i>", DTStyles.HtmlLabel); GUI.Label(new Rect(20, 130, 180, 40), "Hold <b>Ctrl</b> while releasing a\nlink to create & connect", DTStyles.HtmlLabel); GUI.Label(new Rect(20, 160, 180, 40), "Drag & Drop splines to create\nPath module", DTStyles.HtmlLabel); GUILayout.EndArea(); } DrawLinks(); // Init and early catch some events Canvas.BeginGUI(); DrawModules(); Canvas.EndGUI(); // Draw Selection DTGUI.PushBackgroundColor(Color.white);//.SkinAwareColor()); foreach (var mod in Sel.SelectedModules) { GUI.Box(mod.Properties.Dimensions.ScaleBy(2), "", CurvyStyles.RoundRectangle); } DTGUI.PopBackgroundColor(); // Keep dragged Module in view and handle multiselection move if (Canvas.IsModuleDrag && !DTGUI.IsLayout) { Vector2 delta = EV.delta; deltaAccu += EV.delta; if (EV.alt) { delta = deltaAccu.Snap(CurvyProject.Instance.CGGraphSnapping); if (delta == deltaAccu) { delta = Vector2.zero; } } if (Sel.SelectedModules.Count > 1) { foreach (CGModule mod in Sel.SelectedModules) { mod.Properties.Dimensions.position += delta; } if (!EV.alt || delta != Vector2.zero) { deltaAccu = Vector2.zero; } } var m = (Canvas.MouseOverModule) ? Canvas.MouseOverModule : Sel.SelectedModule; if (m) { GUI.ScrollTowards(m.Properties.Dimensions, 0.8f); } } // Linking in progress? if (Canvas.IsLinkDrag) { var linkstyle = (Canvas.LinkDragFrom.OnRequestModule != null) ? CurvyStyles.RequestLineTexture : CurvyStyles.LineTexture; Handles.DrawBezier(Canvas.LinkDragFrom.Origin, EV.mousePosition, Canvas.LinkDragFrom.Origin + new Vector2(40, 0), EV.mousePosition + new Vector2(-40, 0), Color.white, linkstyle, 2); } GUI.EndScrollView(true); // Selection if (Canvas.IsSelectionRectDrag) { DrawSelectionRect(); } // Statusbar DrawStatusbar(); // IPE SyncIPE(); mDoRepaint = mDoRepaint || Canvas.IsCanvasDrag || Canvas.IsLinkDrag || Canvas.IsSelectionRectDrag || EV.type == EventType.MouseMove || mShowDebug.isAnimating || Canvas.Scroll.isAnimating; // Disable Title edit mode? if (editTitleModule != null) { if ((EV.isKey && (EV.keyCode == KeyCode.Escape || EV.keyCode == KeyCode.Return)) || Sel.SelectedModule != editTitleModule ) { editTitleModule = null; //GUI.FocusControl(""); mDoRepaint = true; } } if (mDoRepaint) { Repaint(); } }