You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
226 lines
6.1 KiB
226 lines
6.1 KiB
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); |
|
} |
|
} |
|
} |
|
}
|
|
|