/// <summary> Draws only a GUI elements. </summary> /// <remarks> Needs to be invoked only in OnGUI</remarks> public virtual void DrawGUI() { if (_oldGUIRect != GUIRect) { _rebuildConcent = true; _oldGUIRect = GUIRect; } if (_contentStyle == null) { _contentStyle = new GUIStyle(GUI.skin.label); } if (_startOld != SourceData.Start) { _startOld = SourceData.Start; _startOldString = _startOld.ToStringSpecial(); _rebuildConcent = true; } if (_endOld != SourceData.End) { _endOld = SourceData.End; _endOldString = _endOld.ToStringSpecial(); _rebuildConcent = true; } if (_oldName != SourceData.Name) { _oldName = SourceData.Name; _rebuildConcent = true; } Rect rect = TextureRect; if (_rebuildConcent) { string fromTo = "From " + _startOldString + " to " + _endOldString; StringBuilder newText = new StringBuilder(SourceData.Name); _content = new GUIContent(SourceData.Name, fromTo); _contentSize = _contentStyle.CalcSize(_content); while (_contentSize.x > rect.width - _borderThickness) { newText.Remove(newText.Length - 1, 1); if (newText.Length > 0) { _content = new GUIContent(newText + "...", SourceData.Name + Environment.NewLine + fromTo); } else { _content = new GUIContent(string.Empty, SourceData.Name + Environment.NewLine + fromTo); _contentSize = rect.size; break; } _contentSize = _contentStyle.CalcSize(_content); _rebuildConcent = false; } } // label GUI.Label(new Rect(rect.x + rect.width / 2 - _contentSize.x / 2, Owner.Rect.y + rect.height / 2 - _contentSize.y / 2 + 1, _contentSize.x, _contentSize.y), _content, _contentStyle); // context menu _mousePos = Event.current.mousePosition; bool GUIContainsMouse = _oldGUIRect.Contains(_mousePos); if (Event.current.type == EventType.ContextClick && GUIContainsMouse) { GenericMenu menu = new GenericMenu(); menu.AddItem(new GUIContent("Edit"), false, ContextEditCallback, null); menu.AddItem(new GUIContent("Remove"), false, ContextRemoveCallback, null); menu.AddSeparator(""); menu.AddItem(new GUIContent("Copy"), false, ContextCopyCallback, null); menu.AddItem(new GUIContent("Cut"), false, ContextCutCallback, null); if (Owner is ILineCopy && (Owner as ILineCopy).CopyDataAvailable) { menu.AddItem(new GUIContent("Paste"), false, ContextPasteCallback, null); } else { menu.AddItem(new GUIContent("Paste"), false, null, null); } // menu.AddItem(new GUIContent("SubMenu/MenuItem3"), false, Callback, "item 3"); menu.ShowAsContext(); Event.current.Use(); } // single click handle if (Event.current.isMouse && Event.current.type == EventType.MouseDown && GUIContainsMouse) { Select(); // double click handle if (Event.current.clickCount == 2) { _mousePressedOnCenter = false; _mousePressedOnLeftEdge = false; _mousePressedOnRightEdge = false; ContextEditCallback(null); return; } } if (_isSelected) { EditorGUIUtility.AddCursorRect(_mousePressedOnLeftEdge ? _leftEdgeRectSecond : _leftEdgeRect, MouseCursor.SplitResizeLeftRight); EditorGUIUtility.AddCursorRect(_mousePressedOnRightEdge ? _rightEdgeRectSecond : _rightEdgeRect, MouseCursor.SplitResizeLeftRight); EditorGUIUtility.AddCursorRect(_centerRect, MouseCursor.Pan); bool mouseOnLeftEdge = _mousePressedOnLeftEdge ? _leftEdgeRectSecond.Contains(_mousePos) : _leftEdgeRect.Contains(_mousePos); bool mouseOnRightEdge = _mousePressedOnRightEdge ? _rightEdgeRectSecond.Contains(_mousePos) : _rightEdgeRect.Contains(_mousePos); bool mouseOnCenter = _centerRect.Contains(_mousePos); if (Event.current.type == EventType.MouseDown && mouseOnLeftEdge) { _mousePressedOnLeftEdge = true; _diffAtGrab = _mousePos.x - _timeLinePanel.TimeToWorldX(SourceData.Start); } else if (Event.current.type == EventType.MouseDown && mouseOnRightEdge) { _mousePressedOnRightEdge = true; _diffAtGrab = _timeLinePanel.TimeToWorldX(SourceData.End) - _mousePos.x; } else if (Event.current.type == EventType.MouseDown && mouseOnCenter) { _mousePressedOnCenter = true; _diffAtGrab = _mousePos.x - _timeLinePanel.TimeToWorldX(SourceData.Start); } else if (Event.current.type == EventType.MouseUp) { _mousePressedOnLeftEdge = false; _mousePressedOnRightEdge = false; _mousePressedOnCenter = false; } } else { _mousePressedOnCenter = false; _mousePressedOnLeftEdge = false; _mousePressedOnRightEdge = false; } }
/// <summary> Draws the component [have to be invoked in OnGUI]..</summary> /// <param name="rect">X position for the timeline.</param> /// <param name="scrollDelta">Scroll delta.</param> /// <returns>Real component size.</returns> public Rect GUIDraw(float xPos, float scrollDelta) { base.Draw(_rect, _rectWasChanged); _mousePos = Event.current.mousePosition; Rect GUITextureSoundRectTemp = GUITextureSoundRect; if (_allowDrag && _rect.Contains(Event.current.mousePosition)) { if (Event.current.type == EventType.MouseDown && Event.current.button == 0) { _wasMouseDown = true; if (GUITextureSoundRectTemp.Contains(_mousePos)) { _diffAtGrab = _mousePos.x - _timeLinePanel.TimeToWorldX((float)_audioClipStartTime); } } if (_wasMouseDown && Event.current.type == EventType.MouseDrag) { _wasMouseDown = false; if (!_dragOutsideAudioClip && GUITextureSoundRectTemp.Contains(_mousePos)) { _dragOnAudioClip = true; } else { _dragOutsideAudioClip = true; } } if (((_wasMouseDown && Event.current.type == EventType.MouseUp) || _dragOutsideAudioClip)) { _timeLinePanel.TimeLineEngine.SetTime(_timeLinePanel.WorldXToTime(Event.current.mousePosition.x)); } } if (Event.current.type == EventType.MouseUp) { _dragOnAudioClip = false; _dragOutsideAudioClip = false; _wasMouseDown = false; } if (_soundWavesTexture == null || _durationWasChanged || _rectWasChanged || _lastXPos != xPos || scrollDelta != 0) { _lastXPos = xPos; _rectWasChanged = false; _durationWasChanged = false; int textureWidth = (int)_rect.width; int textureHeight = (int)_rect.height; int soundWavesTextureWidth = textureWidth - BorderThickness * 2; int soundWavesTextureHeight = textureHeight - BorderThickness * 2; _soundWavesTexture = new Texture2D(soundWavesTextureWidth, soundWavesTextureHeight, TextureFormat.ARGB32, false); bool valid = true; Rect textureSoundRect = TextureSoundRect; if (_audioClip == null || textureSoundRect.width == 0) { valid = false; } Color[] soundWavesBackgroundColors; soundWavesBackgroundColors = new Color[soundWavesTextureWidth * soundWavesTextureHeight]; soundWavesBackgroundColors.Fill(NormalColor); _soundWavesTexture.SetPixels(0, 0, soundWavesTextureWidth, soundWavesTextureHeight, soundWavesBackgroundColors); if (valid) { soundWavesBackgroundColors = new Color[(int)(textureSoundRect.width * textureSoundRect.height)]; soundWavesBackgroundColors.Fill(new Color32(211, 211, 211, 255)); _soundWavesTexture.SetPixels((int)textureSoundRect.x, (int)textureSoundRect.y, (int)textureSoundRect.width, (int)textureSoundRect.height, soundWavesBackgroundColors); if (_audioClip != null) { AudioUtils.DoRenderPreview(_audioClip, _soundWavesTexture, _timeLinePanel.TimeLineEngine, _lastXPos, _audioClipStartTime); } else { _soundWavesTexture.Apply(); } } else { _soundWavesTexture.Apply(); } _soundWavesTextureStyle.normal.background = _soundWavesTexture; // refresh SetTimeFromSec((float)AudioClipStartTime.TotalSeconds); } GUI.Box(new Rect(_rect.x + BorderThickness, _rect.y + BorderThickness, _rect.width - BorderThickness * 2, _rect.height - BorderThickness * 2), GUIContent.none, _soundWavesTextureStyle); if (_dragOnAudioClip) { EditorGUIUtility.AddCursorRect(GUITextureSoundRectTemp, MouseCursor.Pan); } return(_controlRect); }