Option Strict On
Option Explicit On

Imports System
Imports System.Windows.Forms
Imports Nexamas.UI.Architecture
Imports Nexamas.UI.Composition
Imports Nexamas.UI.Controls
Imports Nexamas.UI.General
Imports Nexamas.UI.Layout
Imports Nexamas.UI.Rendering
Imports Nexamas.UI.TextRendering
Imports Nexamas.UI.Theming
Imports Nexamas.UI.Values
Imports SkiaSharp

Namespace Nexamas.UI.Components

    Partial Public NotInheritable Class MASSplitView

#Region "View State"

        Private Sub BeginDividerDrag(side As SplitDividerSide,
                                     point As SKPoint)
            _activeDivider = side
            _hoverDivider = side
            _dragStartPointerXPx = point.X
            _dragStartLeftRatio = _leftPaneRatio
            _dragStartRightRatio = _rightPaneRatio
            _dragStartLeftCollapsed = _leftPaneCollapsed
            _dragStartRightCollapsed = _rightPaneCollapsed
            _dragStartBodyWidthPx = Math.Max(1.0F, _bodyRect.Width)
            _dragStartIsRtl = MASSplitViewPolicy.ResolveRightToLeft()
        End Sub

        
        Private Sub EndDividerDrag()
            _activeDivider = SplitDividerSide.None
            _dragStartPointerXPx = 0.0F
            _dragStartLeftRatio = _leftPaneRatio
            _dragStartRightRatio = _rightPaneRatio
            _dragStartLeftCollapsed = _leftPaneCollapsed
            _dragStartRightCollapsed = _rightPaneCollapsed
            _dragStartBodyWidthPx = 1.0F
            _dragStartIsRtl = False
        End Sub

        
        Private Sub UpdateActiveDividerFromPoint(point As SKPoint)
            If _bodyRect.Width <= 1.0F OrElse _activeDivider = SplitDividerSide.None Then Return

            Dim deltaRatio As Single = (point.X - _dragStartPointerXPx) / Math.Max(1.0F, _dragStartBodyWidthPx)
            Dim nextLeftRatio As Single = _dragStartLeftRatio
            Dim nextRightRatio As Single = _dragStartRightRatio
            Dim nextLeftCollapsed As Boolean = _dragStartLeftCollapsed
            Dim nextRightCollapsed As Boolean = _dragStartRightCollapsed

            If _activeDivider = SplitDividerSide.Left Then
                nextLeftCollapsed = False
                nextLeftRatio = MASSplitViewPolicy.ClampRatio(_dragStartLeftRatio + If(_dragStartIsRtl, -deltaRatio, deltaRatio))
            ElseIf _activeDivider = SplitDividerSide.Right Then
                nextRightCollapsed = False
                nextRightRatio = MASSplitViewPolicy.ClampRatio(_dragStartRightRatio + If(_dragStartIsRtl, deltaRatio, -deltaRatio))
            End If

            MASSplitViewPolicy.NormalizeSideRatios(nextLeftRatio, nextRightRatio)

            Dim changed As Boolean =
                nextLeftCollapsed <> _leftPaneCollapsed OrElse
                nextRightCollapsed <> _rightPaneCollapsed OrElse
                MASResizeInteractionPolicy.HasMeaningfulRatioChange(_leftPaneRatio, nextLeftRatio) OrElse
                MASResizeInteractionPolicy.HasMeaningfulRatioChange(_rightPaneRatio, nextRightRatio)

            If Not changed Then Return

            _leftPaneCollapsed = nextLeftCollapsed
            _rightPaneCollapsed = nextRightCollapsed
            _leftPaneRatio = nextLeftRatio
            _rightPaneRatio = nextRightRatio

            StopPaneRevealMotion(reset:=True)
            RequestSizeLayoutRefreshForSizeAffectingChange("MASSplitView.PointerResize")
            InvalidateVisual()
            RaiseSplitViewChangedSafe()
        End Sub

        
        Private Sub AdjustKeyboardRatio(delta As Single)
            If _leftPaneCollapsed AndAlso _rightPaneCollapsed Then Return
            If Not _leftPaneCollapsed Then _leftPaneRatio = MASSplitViewPolicy.ClampRatio(_leftPaneRatio + delta)
            If Not _rightPaneCollapsed Then _rightPaneRatio = MASSplitViewPolicy.ClampRatio(_rightPaneRatio - delta)
            MASSplitViewPolicy.NormalizeSideRatios(_leftPaneRatio, _rightPaneRatio)
            StartPaneRevealMotion(If(_keyboardDivider = SplitDividerSide.Right, SplitDividerSide.Right, SplitDividerSide.Left))
            RequestSizeLayoutRefreshForSizeAffectingChange("MASSplitView.KeyboardResize")
            InvalidateVisual()
            RaiseSplitViewChangedSafe()
        End Sub


#End Region

    End Class

End Namespace
