protected void OnMouseDown(MouseDownEvent e) { if (CanStartManipulation(e)) { VisualSplitter visualSplitter = target as VisualSplitter; FlexDirection flexDirection = visualSplitter.resolvedStyle.flexDirection; if (m_AffectedElements != null) { VisualElementListPool.Release(m_AffectedElements); } m_AffectedElements = visualSplitter.GetAffectedVisualElements(); var shouldUseEvent = false; for (int i = 0; i < m_AffectedElements.Count - 1; ++i) { VisualElement visualElement = m_AffectedElements[i]; Rect splitterRect = visualSplitter.GetSplitterRect(visualElement); if (splitterRect.Contains(e.localMousePosition)) { bool isReverse = flexDirection == FlexDirection.RowReverse || flexDirection == FlexDirection.ColumnReverse; if (isReverse) { m_ActiveVisualElementIndex = i + 1; m_NextVisualElementIndex = i; } else { m_ActiveVisualElementIndex = i; m_NextVisualElementIndex = i + 1; } shouldUseEvent = true; } } if (shouldUseEvent) { m_Active = true; target.CaptureMouse(); e.StopPropagation(); e.PreventDefault(); } } }
protected void OnMouseMove(MouseMoveEvent e) { if (m_Active) { // These calculations should only work if flex-basis is auto. // However, Yoga implementation of flex-basis 0 is broken and behaves much like // flex-basis auto, so it currently works with flex-basis 0 too. VisualSplitter visualSplitter = target as VisualSplitter; VisualElement visualElement = m_AffectedElements[m_ActiveVisualElementIndex]; VisualElement nextVisualElement = m_AffectedElements[m_NextVisualElementIndex]; FlexDirection flexDirection = visualSplitter.resolvedStyle.flexDirection; bool isVertical = flexDirection == FlexDirection.Column || flexDirection == FlexDirection.ColumnReverse; float relativeMousePosition; if (isVertical) { float minHeight = visualElement.resolvedStyle.minHeight == StyleKeyword.Auto ? 0 : visualElement.resolvedStyle.minHeight.value; float nextMinHeight = nextVisualElement.resolvedStyle.minHeight == StyleKeyword.Auto ? 0 : nextVisualElement.resolvedStyle.minHeight.value; float availableHeight = visualElement.layout.height + nextVisualElement.layout.height - minHeight - nextMinHeight; float maxHeight = visualElement.resolvedStyle.maxHeight.value <= 0 ? availableHeight : visualElement.resolvedStyle.maxHeight.value; relativeMousePosition = (Math.Min(e.localMousePosition.y, visualElement.layout.yMin + maxHeight) - visualElement.layout.yMin - minHeight) / availableHeight; } else { float minWidth = visualElement.resolvedStyle.minWidth == StyleKeyword.Auto ? 0 : visualElement.resolvedStyle.minWidth.value; float nextMinWidth = nextVisualElement.resolvedStyle.minWidth == StyleKeyword.Auto ? 0 : nextVisualElement.resolvedStyle.minWidth.value; float availableWidth = visualElement.layout.width + nextVisualElement.layout.width - minWidth - nextMinWidth; float maxWidth = visualElement.resolvedStyle.maxWidth.value <= 0 ? availableWidth : visualElement.resolvedStyle.maxWidth.value; relativeMousePosition = (Math.Min(e.localMousePosition.x, visualElement.layout.xMin + maxWidth) - visualElement.layout.xMin - minWidth) / availableWidth; } relativeMousePosition = Math.Max(0.0f, Math.Min(0.999f, relativeMousePosition)); float totalFlex = visualElement.resolvedStyle.flexGrow + nextVisualElement.resolvedStyle.flexGrow; visualElement.style.flexGrow = relativeMousePosition * totalFlex; nextVisualElement.style.flexGrow = (1.0f - relativeMousePosition) * totalFlex; e.StopPropagation(); } }