private static void PaintButton(Item item, BTN_POS position, MouseCursor cursor = MouseCursor.Link) { if (!STYLES_INITIALIZED) { BTN_LFT = new GUIStyle(GUI.skin.GetStyle("ButtonLeft")); BTN_LFT.normal = BTN_LFT.active; BTN_LFT.onNormal = BTN_LFT.onActive; BTN_MID = new GUIStyle(GUI.skin.GetStyle("ButtonMid")); BTN_RHT = new GUIStyle(GUI.skin.GetStyle("ButtonRight")); STYLES_INITIALIZED = true; } GUIStyle style; switch (position) { case BTN_POS.L: style = BTN_LFT; break; case BTN_POS.M: style = BTN_MID; break; case BTN_POS.R: style = BTN_RHT; break; default: style = null; break; } if (GUILayout.Button(item.GetContent(), style, GUILayout.Width(BUTTONS_WIDTH))) { if (item.callback != null) { item.callback.Invoke(); } } Rect rect = GUILayoutUtility.GetLastRect(); Rect textureRect = new Rect( rect.x + (rect.width / 2.0f - rect.height / 2.0f), rect.y, rect.height, rect.height ); GUI.DrawTexture(textureRect, item.GetTexture()); EditorGUIUtility.AddCursorRect(rect, cursor); }
// PAINT METHODS: ------------------------------------------------------------------------- private static void OnPaintToolbar(SceneView sceneview) { GUISkin prevSkin = GUI.skin; GUI.skin = EditorGUIUtility.GetBuiltinSkin(EditorSkin.Scene); bool registeredItem = false; while (REGISTER_ITEMS.Count > 0) { registeredItem = true; Item item = REGISTER_ITEMS.Pop(); ITEMS.Add(item); } if (registeredItem) { ITEMS.Sort((Item x, Item y) => x.priority.CompareTo(y.priority)); } if (ITEMS.Count == 0) { return; } Rect rect = new Rect( MOVE_OFFSET_X, MOVE_OFFSET_Y, BUTTONS_WIDTH * ITEMS.Count, TOOLBAR_HEIGHT ); bool mouseInRect = rect.Contains(UnityEngine.Event.current.mousePosition); if (UnityEngine.Event.current.type == EventType.MouseUp) { DRAGGING = false; } if (UnityEngine.Event.current.type == EventType.MouseDown && mouseInRect) { MOUSE_POSITION = UnityEngine.Event.current.mousePosition; DRAGGING = true; } if (DRAGGING) { Vector2 delta = UnityEngine.Event.current.mousePosition - MOUSE_POSITION; MOVE_OFFSET_X += delta.x; MOVE_OFFSET_Y += delta.y; SceneView.currentDrawingSceneView.Repaint(); } MOUSE_POSITION = UnityEngine.Event.current.mousePosition; Handles.BeginGUI(); GUILayout.BeginArea(rect); EditorGUILayout.BeginHorizontal(); for (int i = 0; i < ITEMS.Count - 1; ++i) { BTN_POS position = (i == 0 ? BTN_POS.L : BTN_POS.M); PaintButton(ITEMS[i], position); } int panIndex = ITEMS.Count - 1; PaintButton(ITEMS[panIndex], BTN_POS.R, MouseCursor.Pan); EditorGUILayout.EndHorizontal(); GUILayout.EndArea(); Handles.EndGUI(); GUI.skin = prevSkin; }