227 lines
6.1 KiB
C#
227 lines
6.1 KiB
C#
|
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);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|