/////////////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////////// // ------------------------------------------------------------------ // Desc: // ------------------------------------------------------------------ protected new void Awake() { base.Awake(); grabMouseOrTouch = true; if (contentAnchor != null) { originalAnchorPos = contentAnchor.localPosition; } AddEventListener("onPressDown", delegate(exUIEvent _event) { if (dragging) { _event.StopPropagation(); return; } StartDrag(_event); }); AddEventListener("onPressUp", delegate(exUIEvent _event) { exUIPointEvent pointEvent = _event as exUIPointEvent; if (draggable && (pointEvent.isTouch || pointEvent.GetMouseButton(0)) && pointEvent.pointInfos[0].id == draggingID) { if (dragging) { dragging = false; draggingID = -1; StartScroll(); } _event.StopPropagation(); } }); AddEventListener("onHoverIn", delegate(exUIEvent _event) { if (dragging) { _event.StopPropagation(); return; } StartDrag(_event); }); AddEventListener("onHoverMove", delegate(exUIEvent _event) { if (dragging == false) { StartDrag(_event); return; } float contentX = (horizontalContentDir == ContentDirection.LeftToRight) ? 0.0f : -(contentSize_.x - width); float contentY = (verticalContentDir == ContentDirection.TopToBottom) ? 0.0f : -(contentSize_.y - height); Rect scrollRect = new Rect(scrollOffset_.x, scrollOffset_.y, width, height); Rect contentRect = new Rect(contentX, contentY, Mathf.Max(contentSize_.x, width), Mathf.Max(contentSize_.y, height)); Vector2 constrainOffset = exGeometryUtility.GetConstrainOffset(scrollRect, contentRect); exUIPointEvent pointEvent = _event as exUIPointEvent; for (int i = 0; i < pointEvent.pointInfos.Length; ++i) { exUIPointInfo point = pointEvent.pointInfos[i]; if (draggable && (pointEvent.isTouch || pointEvent.GetMouseButton(0)) && point.id == draggingID) { Vector2 delta = point.worldDelta; delta.x = -delta.x; if (Mathf.Abs(constrainOffset.x) > 0.001f) { delta.x *= 0.5f; } if (Mathf.Abs(constrainOffset.y) > 0.001f) { delta.y *= 0.5f; } // velocity = Vector2.Lerp(velocity, velocity + (delta / Time.deltaTime) * scrollSpeed, 0.67f); if (Mathf.Sign(velocity.x) != Mathf.Sign(delta.x)) { velocity.x = 0.0f; } if (Mathf.Sign(velocity.y) != Mathf.Sign(delta.y)) { velocity.y = 0.0f; } _event.StopPropagation(); Scroll(delta); break; } } }); AddEventListener("onMouseWheel", delegate(exUIEvent _event) { // TODO: if ( mouseWheelByHorizontal ) float contentX = (horizontalContentDir == ContentDirection.LeftToRight) ? 0.0f : -(contentSize_.x - width); float contentY = (verticalContentDir == ContentDirection.TopToBottom) ? 0.0f : -(contentSize_.y - height); exUIWheelEvent wheelEvent = _event as exUIWheelEvent; Vector2 delta = new Vector2(0.0f, -wheelEvent.delta * 100.0f); Vector2 constrainOffset = exGeometryUtility.GetConstrainOffset(new Rect(scrollOffset_.x, scrollOffset_.y, width, height), new Rect(contentX, contentY, contentSize_.x, contentSize_.y)); if (Mathf.Abs(constrainOffset.y) > 0.001f) { delta.y *= 0.5f; } velocity = Vector2.Lerp(velocity, velocity + (delta / Time.deltaTime) * scrollSpeed, 0.67f); if (Mathf.Sign(velocity.x) != Mathf.Sign(delta.x)) { velocity.x = 0.0f; } if (Mathf.Sign(velocity.y) != Mathf.Sign(delta.y)) { velocity.y = 0.0f; } _event.StopPropagation(); Scroll(delta); StartScroll(); }); }
// ------------------------------------------------------------------ // Desc: // ------------------------------------------------------------------ void HandleHotPoints(exHotPoint[] _hotPoints, bool _isMouse) { // ======================================================== // handle hover event // ======================================================== int hotPointCountForMouse = _isMouse ? 1 : _hotPoints.Length; for (int i = 0; i < hotPointCountForMouse; ++i) { exHotPoint hotPoint = _hotPoints[i]; if (hotPoint.active == false) { continue; } if (hotPoint.pressed != null && hotPoint.pressed.grabMouseOrTouch) { continue; } // get hot control exUIControl lastCtrl = hotPoint.hover; exUIControl curCtrl = PickControl(hotPoint.pos); hotPoint.hover = curCtrl; if (lastCtrl != curCtrl) { exUIPointInfo pointInfo = new exUIPointInfo(); pointInfo.id = hotPoint.id; pointInfo.pos = hotPoint.pos; pointInfo.delta = hotPoint.delta; pointInfo.worldPos = hotPoint.worldPos; pointInfo.worldDelta = hotPoint.worldDelta; exUIPointEvent pointEvent = new exUIPointEvent(); pointEvent.isMouse = hotPoint.isMouse; pointEvent.pointInfos = new exUIPointInfo [] { pointInfo }; // on hover out if (lastCtrl != null) { lastCtrl.OnHoverOut(pointEvent); } // on hover in if (curCtrl != null) { pointEvent.Reset(); curCtrl.OnHoverIn(pointEvent); if (hotPoint.isTouch) { hotPoint.pressDown = true; } } } } if (_isMouse) { for (int i = 1; i < _hotPoints.Length; ++i) { _hotPoints[i].hover = _hotPoints[0].hover; } // ======================================================== // send scroll wheel event // ======================================================== float scroll = Input.GetAxis("Mouse ScrollWheel"); if (scroll != 0.0f && _hotPoints[0].hover != null) { exUIWheelEvent wheelEvent = new exUIWheelEvent(); wheelEvent.delta = scroll; _hotPoints[0].hover.OnEXMouseWheel(wheelEvent); } } // ======================================================== // handle press down event // ======================================================== for (int i = 0; i < _hotPoints.Length; ++i) { exHotPoint hotPoint = _hotPoints[i]; if (hotPoint.active == false) { continue; } if (hotPoint.pressDown) { exUIControl curCtrl = hotPoint.hover; if (hotPoint.pressed != null && hotPoint.pressed.grabMouseOrTouch) { curCtrl = hotPoint.pressed; } // send press down event if (curCtrl != null) { exUIPointInfo pointInfo = new exUIPointInfo(); pointInfo.id = hotPoint.id; pointInfo.pos = hotPoint.pos; pointInfo.delta = hotPoint.delta; pointInfo.worldPos = hotPoint.worldPos; pointInfo.worldDelta = hotPoint.worldDelta; exUIPointEvent pointEvent = new exUIPointEvent(); pointEvent.isMouse = hotPoint.isMouse; pointEvent.pointInfos = new exUIPointInfo [] { pointInfo }; curCtrl.OnPressDown(pointEvent); } hotPoint.pressed = curCtrl; } } // ======================================================== // handle moving before press-up // ======================================================== Dictionary <exUIControl, List <exHotPoint> > moveEvents = new Dictionary <exUIControl, List <exHotPoint> >(); // collect press move event for (int i = 0; i < _hotPoints.Length; ++i) { exHotPoint hotPoint = _hotPoints[i]; if (hotPoint.active == false) { continue; } if (hotPoint.delta != Vector2.zero) { exUIControl curCtrl = hotPoint.hover; if (hotPoint.pressed != null && hotPoint.pressed.grabMouseOrTouch) { curCtrl = hotPoint.pressed; } if (curCtrl != null) { List <exHotPoint> hotPointList = null; if (moveEvents.ContainsKey(curCtrl)) { hotPointList = moveEvents[curCtrl]; } else { hotPointList = new List <exHotPoint>(); moveEvents.Add(curCtrl, hotPointList); } hotPointList.Add(hotPoint); } } } // send hot-point move event foreach (KeyValuePair <exUIControl, List <exHotPoint> > iter in moveEvents) { exUIPointEvent pointEvent = new exUIPointEvent(); pointEvent.pointInfos = new exUIPointInfo [iter.Value.Count]; for (int i = 0; i < iter.Value.Count; ++i) { exHotPoint hotPoint = iter.Value[i]; exUIPointInfo pointInfo = new exUIPointInfo(); pointInfo.id = hotPoint.id; pointInfo.pos = hotPoint.pos; pointInfo.delta = hotPoint.delta; pointInfo.worldPos = hotPoint.worldPos; pointInfo.worldDelta = hotPoint.worldDelta; pointEvent.pointInfos[i] = pointInfo; pointEvent.isMouse = hotPoint.isMouse; } iter.Key.OnHoverMove(pointEvent); } // ======================================================== // handle press up event // ======================================================== for (int i = 0; i < _hotPoints.Length; ++i) { exHotPoint hotPoint = _hotPoints[i]; if (hotPoint.active == false) { continue; } // if (hotPoint.pressUp) { exUIPointInfo pointInfo = new exUIPointInfo(); pointInfo.id = hotPoint.id; pointInfo.pos = hotPoint.pos; pointInfo.delta = hotPoint.delta; pointInfo.worldPos = hotPoint.worldPos; pointInfo.worldDelta = hotPoint.worldDelta; exUIPointEvent pointEvent = new exUIPointEvent(); pointEvent.isMouse = hotPoint.isMouse; pointEvent.pointInfos = new exUIPointInfo [] { pointInfo }; exUIControl curCtrl = hotPoint.hover; if (hotPoint.pressed != null && hotPoint.pressed.grabMouseOrTouch) { curCtrl = hotPoint.pressed; } // send press down event if (curCtrl != null) { curCtrl.OnPressUp(pointEvent); if (hotPoint.isTouch) { curCtrl.OnHoverOut(pointEvent); } } hotPoint.pressed = null; } } }