NewN_UAVPlane/Assets/3rdParty/ZFBrowser/Scripts/BrowserUI/PointerUIGUI.cs

127 lines
3.3 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace ZenFulcrum.EmbeddedBrowser {
/** Attach this script to a GUI Image to use a browser on it. */
[RequireComponent(typeof(RawImage))]
public class PointerUIGUI :
PointerUIBase,
IBrowserUI,
ISelectHandler, IDeselectHandler,
IPointerEnterHandler, IPointerExitHandler,
IPointerDownHandler
{
protected RawImage myImage;
public bool enableInput = true;
public bool automaticResize = true;
public override void Awake() {
base.Awake();
myImage = GetComponent<RawImage>();
browser.afterResize += UpdateTexture;
// BrowserCursor.cursorChange += () => {
// SetCursor(BrowserCursor);
// };
rTransform = GetComponent<RectTransform>();
}
protected void OnEnable() {
if (automaticResize) StartCoroutine(WatchResize());
}
/** Automatically resizes the browser to match the size of this object. */
private IEnumerator WatchResize() {
Rect currentSize = new Rect();
while (enabled) {
var rect = rTransform.rect;
if (rect.size.x <= 0 || rect.size.y <= 0) rect.size = new Vector2(512, 512);
if (rect.size != currentSize.size) {
browser.Resize((int)rect.size.x, (int)rect.size.y);
currentSize = rect;
}
yield return null;
}
}
protected void UpdateTexture(Texture2D texture) {
myImage.texture = texture;
myImage.uvRect = new Rect(0, 0, 1, 1);
}
protected BaseRaycaster raycaster;
protected RectTransform rTransform;
// protected List<RaycastResult> raycastResults = new List<RaycastResult>();
protected override Vector2 MapPointerToBrowser(Vector2 screenPosition, int pointerId) {
if (!raycaster) raycaster = GetComponentInParent<BaseRaycaster>();
Vector2 pos;
RectTransformUtility.ScreenPointToLocalPointInRectangle(
(RectTransform)transform, screenPosition, raycaster.eventCamera, out pos
);
pos.x = pos.x / rTransform.rect.width + rTransform.pivot.x;
pos.y = pos.y / rTransform.rect.height + rTransform.pivot.y;
return pos;
}
protected override Vector2 MapRayToBrowser(Ray worldRay, int pointerId) {
var evs = EventSystem.current;
if (!evs) return new Vector2(float.NaN, float.NaN);
//todo: world-space GUI
return new Vector2(float.NaN, float.NaN);
}
public override void GetCurrentHitLocation(out Vector3 pos, out Quaternion rot) {
//todo: world space GUI
pos = new Vector3(float.NaN, float.NaN, float.NaN);
rot = Quaternion.identity;
}
protected bool _mouseHasFocus;
public override bool MouseHasFocus {
get { return _mouseHasFocus && enableInput; }
protected set { _mouseHasFocus = value; }
}
protected bool _keyboardHasFocus;
public override bool KeyboardHasFocus { get { return _keyboardHasFocus && enableInput; } }
public void OnSelect(BaseEventData eventData) {
_keyboardHasFocus = true;
Input.imeCompositionMode = IMECompositionMode.Off;//CEF will handle the IME
}
public void OnDeselect(BaseEventData eventData) {
_keyboardHasFocus = false;
Input.imeCompositionMode = IMECompositionMode.Auto;
}
public void OnPointerEnter(PointerEventData eventData) {
_mouseHasFocus = true;
// SetCursor(BrowserCursor);
}
public void OnPointerExit(PointerEventData eventData) {
_mouseHasFocus = false;
// SetCursor(null);
}
public void OnPointerDown(PointerEventData eventData) {
EventSystem.current.SetSelectedGameObject(gameObject);
}
}
}