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