using UnityEngine; using FairyGUI.Utils; namespace FairyGUI { /// <summary> /// GScrollBar class. /// </summary> public class GScrollBar : GComponent { GObject _grip; GObject _arrowButton1; GObject _arrowButton2; GObject _bar; ScrollPane _target; bool _vertical; float _scrollPerc; bool _fixedGripSize; bool _gripDragging; Vector2 _dragOffset; public GScrollBar() { _scrollPerc = 0; } /// <summary> /// /// </summary> /// <param name="target"></param> /// <param name="vertical"></param> public void SetScrollPane(ScrollPane target, bool vertical) { _target = target; _vertical = vertical; } /// <summary> /// /// </summary> public void SetDisplayPerc(float value) { if (_vertical) { if (!_fixedGripSize) _grip.height = Mathf.FloorToInt(value * _bar.height); _grip.y = Mathf.RoundToInt(_bar.y + (_bar.height - _grip.height) * _scrollPerc); } else { if (!_fixedGripSize) _grip.width = Mathf.FloorToInt(value * _bar.width); _grip.x = Mathf.RoundToInt(_bar.x + (_bar.width - _grip.width) * _scrollPerc); } _grip.visible = value != 0 && value != 1; } /// <summary> /// /// </summary> public void setScrollPerc(float value) { _scrollPerc = value; if (_vertical) _grip.y = Mathf.RoundToInt(_bar.y + (_bar.height - _grip.height) * _scrollPerc); else _grip.x = Mathf.RoundToInt(_bar.x + (_bar.width - _grip.width) * _scrollPerc); } /// <summary> /// /// </summary> public float minSize { get { if (_vertical) return (_arrowButton1 != null ? _arrowButton1.height : 0) + (_arrowButton2 != null ? _arrowButton2.height : 0); else return (_arrowButton1 != null ? _arrowButton1.width : 0) + (_arrowButton2 != null ? _arrowButton2.width : 0); } } /// <summary> /// /// </summary> public bool gripDragging { get { return _gripDragging; } } override protected void ConstructExtension(ByteBuffer buffer) { buffer.Seek(0, 6); _fixedGripSize = buffer.ReadBool(); _grip = GetChild("grip"); if (_grip == null) { Debug.LogWarning("FairyGUI: " + this.resourceURL + " should define grip"); return; } _bar = GetChild("bar"); if (_bar == null) { Debug.LogWarning("FairyGUI: " + this.resourceURL + " should define bar"); return; } _arrowButton1 = GetChild("arrow1"); _arrowButton2 = GetChild("arrow2"); _grip.onTouchBegin.Add(__gripTouchBegin); _grip.onTouchMove.Add(__gripTouchMove); _grip.onTouchEnd.Add(__gripTouchEnd); this.onTouchBegin.Add(__touchBegin); if (_arrowButton1 != null) _arrowButton1.onTouchBegin.Add(__arrowButton1Click); if (_arrowButton2 != null) _arrowButton2.onTouchBegin.Add(__arrowButton2Click); } void __gripTouchBegin(EventContext context) { if (_bar == null) return; context.StopPropagation(); InputEvent evt = context.inputEvent; if (evt.button != 0) return; context.CaptureTouch(); _gripDragging = true; _target.UpdateScrollBarVisible(); _dragOffset = this.GlobalToLocal(new Vector2(evt.x, evt.y)) - _grip.xy; } void __gripTouchMove(EventContext context) { InputEvent evt = context.inputEvent; Vector2 pt = this.GlobalToLocal(new Vector2(evt.x, evt.y)); if (float.IsNaN(pt.x)) return; if (_vertical) { float curY = pt.y - _dragOffset.y; float diff = _bar.height - _grip.height; if (diff == 0) _target.percY = 0; else _target.percY = (curY - _bar.y) / diff; } else { float curX = pt.x - _dragOffset.x; float diff = _bar.width - _grip.width; if (diff == 0) _target.percX = 0; else _target.percX = (curX - _bar.x) / diff; } } void __gripTouchEnd(EventContext context) { _gripDragging = false; _target.UpdateScrollBarVisible(); } void __arrowButton1Click(EventContext context) { context.StopPropagation(); if (_vertical) _target.ScrollUp(); else _target.ScrollLeft(); } void __arrowButton2Click(EventContext context) { context.StopPropagation(); if (_vertical) _target.ScrollDown(); else _target.ScrollRight(); } void __touchBegin(EventContext context) { context.StopPropagation(); InputEvent evt = context.inputEvent; Vector2 pt = _grip.GlobalToLocal(new Vector2(evt.x, evt.y)); if (_vertical) { if (pt.y < 0) _target.ScrollUp(4, false); else _target.ScrollDown(4, false); } else { if (pt.x < 0) _target.ScrollLeft(4, false); else _target.ScrollRight(4, false); } } } }