internal static void EndScrollView(bool handleScrollWheel) { // Only end the scroll view for the relevant BeginScrollView option, if any. if (!ScrollFailed) { GUILayout.EndScrollView(); } else if (!ManualUnstripFailed) { GUILayoutUtility.EndLayoutGroup(); if (ScrollStack.Count <= 0) { return; } var state = ScrollStack.Peek().TryCast <ScrollViewState>(); var scrollExt = Internal_ScrollViewState.FromPointer(state.Pointer); if (scrollExt == null) { throw new Exception("Could not get scrollExt!"); } GUIClip.Pop(); ScrollStack.Pop(); var position = scrollExt.position; if (handleScrollWheel && Event.current.type == EventType.ScrollWheel && position.Contains(Event.current.mousePosition)) { var pos = scrollExt.scrollPosition; pos.x = Mathf.Clamp(scrollExt.scrollPosition.x + Event.current.delta.x * 20f, 0f, scrollExt.viewRect.width - scrollExt.visibleRect.width); pos.y = Mathf.Clamp(scrollExt.scrollPosition.y + Event.current.delta.y * 20f, 0f, scrollExt.viewRect.height - scrollExt.visibleRect.height); if (scrollExt.scrollPosition.x < 0f) { pos.x = 0f; } if (pos.y < 0f) { pos.y = 0f; } scrollExt.apply = true; Event.current.Use(); } } }
private static Vector2 BeginScrollView_Impl(Rect position, Vector2 scrollPosition, Rect viewRect, bool alwaysShowHorizontal, bool alwaysShowVertical, GUIStyle horizontalScrollbar, GUIStyle verticalScrollbar, GUIStyle background) { // GUIUtility.CheckOnGUI(); int controlID = GUIUtility.GetControlID(GUI.s_ScrollviewHash, FocusType.Passive); var scrollViewState = GetStateObject(Il2CppType.Of <ScrollViewState>(), controlID) .TryCast <ScrollViewState>(); if (scrollViewState == null) { return(scrollPosition); } var scrollExt = Internal_ScrollViewState.FromPointer(scrollViewState.Pointer); if (scrollExt == null) { return(scrollPosition); } bool apply = scrollExt.apply; if (apply) { scrollPosition = scrollExt.scrollPosition; scrollExt.apply = false; } scrollExt.position = position; scrollExt.scrollPosition = scrollPosition; scrollExt.visibleRect = scrollExt.viewRect = viewRect; var rect = scrollExt.visibleRect; rect.width = position.width; rect.height = position.height; ScrollStack.Push(scrollViewState); Rect screenRect = new Rect(position.x, position.y, position.width, position.height); EventType type = Event.current.type; if (type != EventType.Layout) { if (type != EventType.Used) { bool flag = alwaysShowVertical; bool flag2 = alwaysShowHorizontal; if (flag2 || viewRect.width > screenRect.width) { rect.height = position.height - horizontalScrollbar.fixedHeight + (float)horizontalScrollbar.margin.top; screenRect.height -= horizontalScrollbar.fixedHeight + (float)horizontalScrollbar.margin.top; flag2 = true; } if (flag || viewRect.height > screenRect.height) { rect.width = position.width - verticalScrollbar.fixedWidth + (float)verticalScrollbar.margin.left; screenRect.width -= verticalScrollbar.fixedWidth + (float)verticalScrollbar.margin.left; flag = true; if (!flag2 && viewRect.width > screenRect.width) { rect.height = position.height - horizontalScrollbar.fixedHeight + (float)horizontalScrollbar.margin.top; screenRect.height -= horizontalScrollbar.fixedHeight + (float)horizontalScrollbar.margin.top; flag2 = true; } } if (Event.current.type == EventType.Repaint && background != GUIStyle.none) { background.Draw(position, position.Contains(Event.current.mousePosition), false, flag2 && flag, false); } if (flag2 && horizontalScrollbar != GUIStyle.none) { scrollPosition.x = HorizontalScroll( new Rect( position.x, position.yMax - horizontalScrollbar.fixedHeight, screenRect.width, horizontalScrollbar.fixedHeight), scrollPosition.x, Mathf.Min(screenRect.width, viewRect.width), 0f, viewRect.width, horizontalScrollbar ); } else { GUIUtility.GetControlID(GUI.s_SliderHash, FocusType.Passive); GUIUtility.GetControlID(GUI.s_RepeatButtonHash, FocusType.Passive); GUIUtility.GetControlID(GUI.s_RepeatButtonHash, FocusType.Passive); scrollPosition.x = ((horizontalScrollbar == GUIStyle.none) ? Mathf.Clamp(scrollPosition.x, 0f, Mathf.Max(viewRect.width - position.width, 0f)) : 0f); } if (flag && verticalScrollbar != GUIStyle.none) { scrollPosition.y = VerticalScroll( new Rect( screenRect.xMax + (float)verticalScrollbar.margin.left, screenRect.y, verticalScrollbar.fixedWidth, screenRect.height), scrollPosition.y, Mathf.Min(screenRect.height, viewRect.height), 0f, viewRect.height, verticalScrollbar ); } else { GUIUtility.GetControlID(GUI.s_SliderHash, FocusType.Passive); GUIUtility.GetControlID(GUI.s_RepeatButtonHash, FocusType.Passive); GUIUtility.GetControlID(GUI.s_RepeatButtonHash, FocusType.Passive); scrollPosition.y = ((verticalScrollbar == GUIStyle.none) ? Mathf.Clamp(scrollPosition.y, 0f, Mathf.Max(viewRect.height - position.height, 0f)) : 0f); } } } else { GUIUtility.GetControlID(GUI.s_SliderHash, FocusType.Passive); GUIUtility.GetControlID(GUI.s_RepeatButtonHash, FocusType.Passive); GUIUtility.GetControlID(GUI.s_RepeatButtonHash, FocusType.Passive); GUIUtility.GetControlID(GUI.s_SliderHash, FocusType.Passive); GUIUtility.GetControlID(GUI.s_RepeatButtonHash, FocusType.Passive); GUIUtility.GetControlID(GUI.s_RepeatButtonHash, FocusType.Passive); } GUIClip.Push(screenRect, new Vector2( Mathf.Round(-scrollPosition.x - viewRect.x), Mathf.Round(-scrollPosition.y - viewRect.y)), Vector2.zero, false ); return(scrollPosition); }