2021-04-23 21:50:58 +10:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
using UnityEngine.EventSystems;
|
|
|
|
|
using UnityEngine.UI;
|
|
|
|
|
using UnityExplorer.Core.Input;
|
|
|
|
|
using UnityExplorer.Core.Runtime;
|
|
|
|
|
using UnityExplorer.UI;
|
|
|
|
|
using UnityExplorer.UI.Models;
|
2021-04-26 19:56:21 +10:00
|
|
|
|
using UnityExplorer.UI.ObjectPool;
|
2021-04-23 21:50:58 +10:00
|
|
|
|
|
|
|
|
|
namespace UnityExplorer.UI.Widgets.AutoComplete
|
|
|
|
|
{
|
2021-04-24 04:03:33 +10:00
|
|
|
|
public class AutoCompleter : UIPanel
|
2021-04-23 21:50:58 +10:00
|
|
|
|
{
|
2021-04-24 04:03:33 +10:00
|
|
|
|
// Static
|
2021-04-23 21:50:58 +10:00
|
|
|
|
|
2021-04-24 04:03:33 +10:00
|
|
|
|
public static AutoCompleter Instance => UIManager.AutoCompleter;
|
2021-04-23 21:50:58 +10:00
|
|
|
|
|
2021-04-24 04:03:33 +10:00
|
|
|
|
// Instance
|
2021-04-23 21:50:58 +10:00
|
|
|
|
|
2021-04-24 04:03:33 +10:00
|
|
|
|
public AutoCompleter()
|
|
|
|
|
{
|
|
|
|
|
OnPanelsReordered += UIPanel_OnPanelsReordered;
|
|
|
|
|
OnClickedOutsidePanels += AutoCompleter_OnClickedOutsidePanels;
|
|
|
|
|
}
|
2021-04-23 21:50:58 +10:00
|
|
|
|
|
2021-04-24 04:03:33 +10:00
|
|
|
|
private void AutoCompleter_OnClickedOutsidePanels()
|
|
|
|
|
{
|
|
|
|
|
if (!this.UIRoot || !this.UIRoot.activeInHierarchy)
|
|
|
|
|
return;
|
2021-04-23 21:50:58 +10:00
|
|
|
|
|
2021-04-24 04:03:33 +10:00
|
|
|
|
if (CurrentHandler != null)
|
|
|
|
|
ReleaseOwnership(CurrentHandler);
|
|
|
|
|
else
|
|
|
|
|
UIRoot.SetActive(false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void UIPanel_OnPanelsReordered()
|
|
|
|
|
{
|
|
|
|
|
if (!this.UIRoot || !this.UIRoot.activeInHierarchy)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if (this.UIRoot.transform.GetSiblingIndex() != UIManager.PanelHolder.transform.childCount - 1)
|
|
|
|
|
{
|
|
|
|
|
if (CurrentHandler != null)
|
|
|
|
|
ReleaseOwnership(CurrentHandler);
|
|
|
|
|
else
|
|
|
|
|
UIRoot.SetActive(false);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override string Name => "AutoCompleter";
|
|
|
|
|
public override UIManager.Panels PanelType => UIManager.Panels.AutoCompleter;
|
|
|
|
|
|
|
|
|
|
public override bool CanDrag => false;
|
|
|
|
|
|
|
|
|
|
public ISuggestionProvider CurrentHandler { get; private set; }
|
|
|
|
|
|
|
|
|
|
public ButtonListSource<Suggestion> dataHandler;
|
2021-04-26 19:56:21 +10:00
|
|
|
|
public ScrollPool<ButtonCell> scrollPool;
|
2021-04-24 04:03:33 +10:00
|
|
|
|
|
|
|
|
|
private List<Suggestion> suggestions = new List<Suggestion>();
|
|
|
|
|
|
|
|
|
|
private int lastCaretPos;
|
|
|
|
|
|
|
|
|
|
public override void Update()
|
2021-04-23 21:50:58 +10:00
|
|
|
|
{
|
|
|
|
|
if (!UIRoot || !UIRoot.activeSelf)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if (suggestions.Any() && CurrentHandler != null)
|
|
|
|
|
{
|
|
|
|
|
if (!CurrentHandler.InputField.gameObject.activeInHierarchy)
|
|
|
|
|
ReleaseOwnership(CurrentHandler);
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
lastCaretPos = CurrentHandler.InputField.caretPosition;
|
|
|
|
|
UpdatePosition();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-24 04:03:33 +10:00
|
|
|
|
public void TakeOwnership(ISuggestionProvider provider)
|
2021-04-23 21:50:58 +10:00
|
|
|
|
{
|
|
|
|
|
CurrentHandler = provider;
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-24 04:03:33 +10:00
|
|
|
|
public void ReleaseOwnership(ISuggestionProvider provider)
|
2021-04-23 21:50:58 +10:00
|
|
|
|
{
|
|
|
|
|
if (CurrentHandler == null)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if (CurrentHandler == provider)
|
|
|
|
|
{
|
|
|
|
|
CurrentHandler = null;
|
|
|
|
|
UIRoot.SetActive(false);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-24 04:03:33 +10:00
|
|
|
|
private List<Suggestion> GetEntries() => suggestions;
|
2021-04-23 21:50:58 +10:00
|
|
|
|
|
2021-04-24 04:03:33 +10:00
|
|
|
|
private bool ShouldDisplay(Suggestion data, string filter) => true;
|
2021-04-23 21:50:58 +10:00
|
|
|
|
|
2021-04-24 04:03:33 +10:00
|
|
|
|
public void SetSuggestions(List<Suggestion> collection)
|
2021-04-23 21:50:58 +10:00
|
|
|
|
{
|
|
|
|
|
suggestions = collection;
|
|
|
|
|
|
|
|
|
|
if (!suggestions.Any())
|
|
|
|
|
UIRoot.SetActive(false);
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
UIRoot.SetActive(true);
|
2021-04-24 04:03:33 +10:00
|
|
|
|
UIRoot.transform.SetAsLastSibling();
|
2021-04-23 21:50:58 +10:00
|
|
|
|
dataHandler.RefreshData();
|
2021-04-24 04:03:33 +10:00
|
|
|
|
scrollPool.RefreshAndJumpToTop();
|
2021-04-23 21:50:58 +10:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-24 04:03:33 +10:00
|
|
|
|
private void OnCellClicked(int dataIndex)
|
2021-04-23 21:50:58 +10:00
|
|
|
|
{
|
|
|
|
|
var suggestion = suggestions[dataIndex];
|
|
|
|
|
CurrentHandler.OnSuggestionClicked(suggestion);
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-26 19:56:21 +10:00
|
|
|
|
private void SetCell(ButtonCell cell, int index)
|
2021-04-23 21:50:58 +10:00
|
|
|
|
{
|
|
|
|
|
if (index < 0 || index >= suggestions.Count)
|
|
|
|
|
{
|
|
|
|
|
cell.Disable();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var suggestion = suggestions[index];
|
2021-04-26 19:56:21 +10:00
|
|
|
|
cell.Button.ButtonText.text = suggestion.DisplayText;
|
2021-04-23 21:50:58 +10:00
|
|
|
|
}
|
|
|
|
|
|
2021-04-24 04:03:33 +10:00
|
|
|
|
private void UpdatePosition()
|
2021-04-23 21:50:58 +10:00
|
|
|
|
{
|
|
|
|
|
if (CurrentHandler == null || !CurrentHandler.InputField.isFocused)
|
|
|
|
|
return;
|
|
|
|
|
|
2021-04-24 04:03:33 +10:00
|
|
|
|
Vector3 pos;
|
2021-04-23 21:50:58 +10:00
|
|
|
|
var input = CurrentHandler.InputField;
|
2021-04-24 04:03:33 +10:00
|
|
|
|
|
2021-04-23 21:50:58 +10:00
|
|
|
|
var textGen = input.textComponent.cachedTextGenerator;
|
2021-04-24 04:03:33 +10:00
|
|
|
|
int caretPos = 0;
|
|
|
|
|
if (CurrentHandler.AnchorToCaretPosition)
|
|
|
|
|
{
|
|
|
|
|
caretPos = lastCaretPos--;
|
2021-04-23 21:50:58 +10:00
|
|
|
|
|
2021-04-24 04:03:33 +10:00
|
|
|
|
caretPos = Math.Max(0, caretPos);
|
|
|
|
|
caretPos = Math.Min(textGen.characterCount - 1, caretPos);
|
|
|
|
|
}
|
2021-04-23 21:50:58 +10:00
|
|
|
|
|
2021-04-24 04:03:33 +10:00
|
|
|
|
pos = textGen.characters[caretPos].cursorPos;
|
2021-04-23 21:50:58 +10:00
|
|
|
|
pos = input.transform.TransformPoint(pos);
|
|
|
|
|
|
|
|
|
|
uiRoot.transform.position = new Vector3(pos.x + 10, pos.y - 20, 0);
|
2021-04-24 04:03:33 +10:00
|
|
|
|
|
|
|
|
|
this.Dragger.OnEndResize();
|
2021-04-23 21:50:58 +10:00
|
|
|
|
}
|
|
|
|
|
|
2021-04-24 04:03:33 +10:00
|
|
|
|
public override void SetDefaultPosAndAnchors()
|
2021-04-23 21:50:58 +10:00
|
|
|
|
{
|
2021-04-24 04:03:33 +10:00
|
|
|
|
var mainRect = uiRoot.GetComponent<RectTransform>();
|
|
|
|
|
mainRect.pivot = new Vector2(0f, 1f);
|
2021-04-25 00:21:12 +10:00
|
|
|
|
mainRect.anchorMin = new Vector2(0.42f, 0.4f);
|
|
|
|
|
mainRect.anchorMax = new Vector2(0.68f, 0.6f);
|
2021-04-24 04:03:33 +10:00
|
|
|
|
}
|
2021-04-23 21:50:58 +10:00
|
|
|
|
|
2021-04-24 04:03:33 +10:00
|
|
|
|
public override void ConstructPanelContent()
|
|
|
|
|
{
|
2021-04-23 21:50:58 +10:00
|
|
|
|
dataHandler = new ButtonListSource<Suggestion>(scrollPool, GetEntries, SetCell, ShouldDisplay, OnCellClicked);
|
|
|
|
|
|
2021-04-26 19:56:21 +10:00
|
|
|
|
scrollPool = UIFactory.CreateScrollPool<ButtonCell>(this.content, "AutoCompleter", out GameObject scrollObj, out GameObject scrollContent);
|
|
|
|
|
scrollPool.Initialize(dataHandler);
|
2021-04-24 04:03:33 +10:00
|
|
|
|
UIFactory.SetLayoutElement(scrollObj, flexibleHeight: 9999);
|
|
|
|
|
|
|
|
|
|
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(scrollContent, true, false, true, false);
|
2021-04-23 21:50:58 +10:00
|
|
|
|
|
|
|
|
|
UIRoot.SetActive(false);
|
|
|
|
|
}
|
2021-04-24 04:03:33 +10:00
|
|
|
|
|
|
|
|
|
public override void SaveToConfigManager()
|
|
|
|
|
{
|
|
|
|
|
// not savable
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override void LoadSaveData()
|
|
|
|
|
{
|
|
|
|
|
// not savable
|
|
|
|
|
}
|
2021-04-23 21:50:58 +10:00
|
|
|
|
}
|
|
|
|
|
}
|