Files
SVSimServer/SVSim.BattleEngine/Engine/UIPopupList.cs
gamer147 957af3d1ec feat(battle-engine): full Unity/VFX/god-object shims + expanded copy closure (2570 files)
Authored Unity primitive/object-model shim, VFX layer (control-flow-preserving, InstantVfx never invokes its action -- headless suppression), god-object stubs (GameMgr/EffectMgr/UIManager with faithfully-extracted nested enums), View/UI/Touch tree, LitJson+BetterList+Tuple copied, third-party stubs. Discovered Roslyn header-error masking: fixing class-header type errors unmasks body references, so the true copy closure is ~2570 files (was 782 under masking). Errors: masked-25720 -> 268; our shim files compile clean. Remaining: ~50 residual shim/external types, 24 NGUI UI-base overrides, static-type fixes, plus likely 1-2 more unmask waves.
2026-06-05 17:22:20 -04:00

934 lines
22 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[ExecuteInEditMode]
[AddComponentMenu("NGUI/Interaction/Popup List")]
public class UIPopupList : UIWidgetContainer
{
public enum Position
{
Auto,
Above,
Below
}
public enum OpenOn
{
ClickOrTap,
RightClick,
DoubleClick,
Manual
}
public delegate void LegacyEvent(string val);
public static UIPopupList current;
private static GameObject mChild;
private static float mFadeOutComplete;
private const float animSpeed = 0.15f;
public UIAtlas atlas;
public UIFont bitmapFont;
public Font trueTypeFont;
public int fontSize = 16;
public FontStyle fontStyle;
public string backgroundSprite;
public string highlightSprite;
public Position position;
public NGUIText.Alignment alignment = NGUIText.Alignment.Left;
public List<string> items = new List<string>();
public List<object> itemData = new List<object>();
public Vector2 padding = new Vector3(4f, 4f);
public Color textColor = Color.white;
public Color backgroundColor = Color.white;
public Color highlightColor = new Color(0.88235295f, 40f / 51f, 0.5882353f, 1f);
public bool isAnimated = true;
public bool isLocalized;
public bool separatePanel = true;
public OpenOn openOn;
public List<EventDelegate> onChange = new List<EventDelegate>();
[HideInInspector]
[SerializeField]
protected string mSelectedItem;
[HideInInspector]
[SerializeField]
protected UIPanel mPanel;
[HideInInspector]
[SerializeField]
protected UISprite mBackground;
[HideInInspector]
[SerializeField]
protected UISprite mHighlight;
[HideInInspector]
[SerializeField]
protected UILabel mHighlightedLabel;
[HideInInspector]
[SerializeField]
protected List<UILabel> mLabelList = new List<UILabel>();
[HideInInspector]
[SerializeField]
protected float mBgBorder;
[NonSerialized]
protected GameObject mSelection;
[NonSerialized]
protected int mOpenFrame;
[HideInInspector]
[SerializeField]
private GameObject eventReceiver;
[HideInInspector]
[SerializeField]
private string functionName = "OnSelectionChange";
[HideInInspector]
[SerializeField]
private float textScale;
[HideInInspector]
[SerializeField]
private UIFont font;
[HideInInspector]
[SerializeField]
private UILabel textLabel;
private LegacyEvent mLegacyEvent;
[NonSerialized]
protected bool mExecuting;
protected bool mUseDynamicFont;
protected bool mTweening;
public GameObject source;
public UnityEngine.Object ambigiousFont
{
get
{
if (trueTypeFont != null)
{
return trueTypeFont;
}
if (bitmapFont != null)
{
return bitmapFont;
}
return font;
}
set
{
if (value is Font)
{
trueTypeFont = value as Font;
bitmapFont = null;
font = null;
}
else if (value is UIFont)
{
bitmapFont = value as UIFont;
trueTypeFont = null;
font = null;
}
}
}
[Obsolete("Use EventDelegate.Add(popup.onChange, YourCallback) instead, and UIPopupList.current.value to determine the state")]
public LegacyEvent onSelectionChange
{
get
{
return mLegacyEvent;
}
set
{
mLegacyEvent = value;
}
}
public static bool isOpen
{
get
{
if (current != null)
{
if (!(mChild != null))
{
return mFadeOutComplete > Time.unscaledTime;
}
return true;
}
return false;
}
}
public virtual string value
{
get
{
return mSelectedItem;
}
set
{
mSelectedItem = value;
if (mSelectedItem != null && mSelectedItem != null)
{
TriggerCallbacks();
}
}
}
public virtual object data
{
get
{
int num = items.IndexOf(mSelectedItem);
if (num <= -1 || num >= itemData.Count)
{
return null;
}
return itemData[num];
}
}
public bool isColliderEnabled
{
get
{
Collider component = GetComponent<Collider>();
if (component != null)
{
return component.enabled;
}
Collider2D component2 = GetComponent<Collider2D>();
if (component2 != null)
{
return component2.enabled;
}
return false;
}
}
[Obsolete("Use 'value' instead")]
public string selection
{
get
{
return value;
}
set
{
this.value = value;
}
}
private bool isValid
{
get
{
if (!(bitmapFont != null))
{
return trueTypeFont != null;
}
return true;
}
}
private int activeFontSize
{
get
{
if (!(trueTypeFont != null) && !(bitmapFont == null))
{
return bitmapFont.defaultSize;
}
return fontSize;
}
}
private float activeFontScale
{
get
{
if (!(trueTypeFont != null) && !(bitmapFont == null))
{
return (float)fontSize / (float)bitmapFont.defaultSize;
}
return 1f;
}
}
public virtual void Clear()
{
items.Clear();
itemData.Clear();
}
public virtual void AddItem(string text)
{
items.Add(text);
itemData.Add(null);
}
public virtual void AddItem(string text, object data)
{
items.Add(text);
itemData.Add(data);
}
public virtual void RemoveItem(string text)
{
int num = items.IndexOf(text);
if (num != -1)
{
items.RemoveAt(num);
itemData.RemoveAt(num);
}
}
public virtual void RemoveItemByData(object data)
{
int num = itemData.IndexOf(data);
if (num != -1)
{
items.RemoveAt(num);
itemData.RemoveAt(num);
}
}
protected void TriggerCallbacks()
{
if (!mExecuting)
{
mExecuting = true;
UIPopupList uIPopupList = current;
current = this;
if (mLegacyEvent != null)
{
mLegacyEvent(mSelectedItem);
}
if (EventDelegate.IsValid(onChange))
{
EventDelegate.Execute(onChange);
}
else if (eventReceiver != null && !string.IsNullOrEmpty(functionName))
{
eventReceiver.SendMessage(functionName, mSelectedItem, SendMessageOptions.DontRequireReceiver);
}
current = uIPopupList;
mExecuting = false;
}
}
protected virtual void OnEnable()
{
if (EventDelegate.IsValid(onChange))
{
eventReceiver = null;
functionName = null;
}
if (font != null)
{
if (font.isDynamic)
{
trueTypeFont = font.dynamicFont;
fontStyle = font.dynamicFontStyle;
mUseDynamicFont = true;
}
else if (bitmapFont == null)
{
bitmapFont = font;
mUseDynamicFont = false;
}
font = null;
}
if (textScale != 0f)
{
fontSize = ((bitmapFont != null) ? Mathf.RoundToInt((float)bitmapFont.defaultSize * textScale) : 16);
textScale = 0f;
}
if (trueTypeFont == null && bitmapFont != null && bitmapFont.isDynamic)
{
trueTypeFont = bitmapFont.dynamicFont;
bitmapFont = null;
}
}
protected virtual void OnValidate()
{
Font font = trueTypeFont;
UIFont uIFont = bitmapFont;
bitmapFont = null;
trueTypeFont = null;
if (font != null && (uIFont == null || !mUseDynamicFont))
{
bitmapFont = null;
trueTypeFont = font;
mUseDynamicFont = true;
}
else if (uIFont != null)
{
if (uIFont.isDynamic)
{
trueTypeFont = uIFont.dynamicFont;
fontStyle = uIFont.dynamicFontStyle;
fontSize = uIFont.defaultSize;
mUseDynamicFont = true;
}
else
{
bitmapFont = uIFont;
mUseDynamicFont = false;
}
}
else
{
trueTypeFont = font;
mUseDynamicFont = true;
}
}
protected virtual void Start()
{
if (textLabel != null)
{
EventDelegate.Add(onChange, textLabel.SetCurrentSelection);
textLabel = null;
}
if (Application.isPlaying)
{
if (string.IsNullOrEmpty(mSelectedItem) && items.Count > 0)
{
mSelectedItem = items[0];
}
if (!string.IsNullOrEmpty(mSelectedItem))
{
TriggerCallbacks();
}
}
}
protected virtual void OnLocalize()
{
if (isLocalized)
{
TriggerCallbacks();
}
}
protected virtual void Highlight(UILabel lbl, bool instant)
{
if (!(mHighlight != null))
{
return;
}
mHighlightedLabel = lbl;
if (mHighlight.GetAtlasSprite() == null)
{
return;
}
Vector3 highlightPosition = GetHighlightPosition();
if (!instant && isAnimated)
{
TweenPosition.Begin(mHighlight.gameObject, 0.1f, highlightPosition).method = UITweener.Method.EaseOut;
if (!mTweening)
{
mTweening = true;
StartCoroutine("UpdateTweenPosition");
}
}
else
{
mHighlight.cachedTransform.localPosition = highlightPosition;
}
}
protected virtual Vector3 GetHighlightPosition()
{
if (mHighlightedLabel == null || mHighlight == null)
{
return Vector3.zero;
}
UISpriteData atlasSprite = mHighlight.GetAtlasSprite();
if (atlasSprite == null)
{
return Vector3.zero;
}
float pixelSize = atlas.pixelSize;
float num = (float)atlasSprite.borderLeft * pixelSize;
float y = (float)atlasSprite.borderTop * pixelSize;
return mHighlightedLabel.cachedTransform.localPosition + new Vector3(0f - num, y, 1f);
}
protected virtual IEnumerator UpdateTweenPosition()
{
if (mHighlight != null && mHighlightedLabel != null)
{
TweenPosition tp = mHighlight.GetComponent<TweenPosition>();
while (tp != null && tp.enabled)
{
tp.to = GetHighlightPosition();
yield return null;
}
}
mTweening = false;
}
protected virtual void OnItemHover(GameObject go, bool isOver)
{
if (isOver)
{
UILabel component = go.GetComponent<UILabel>();
Highlight(component, instant: false);
}
}
protected virtual void OnItemPress(GameObject go, bool isPressed)
{
if (!isPressed)
{
return;
}
Select(go.GetComponent<UILabel>(), instant: true);
UIEventListener component = go.GetComponent<UIEventListener>();
value = component.parameter as string;
UIPlaySound[] components = GetComponents<UIPlaySound>();
int i = 0;
for (int num = components.Length; i < num; i++)
{
UIPlaySound uIPlaySound = components[i];
if (uIPlaySound.trigger == UIPlaySound.Trigger.OnClick)
{
NGUITools.PlaySound(uIPlaySound.audioClip, uIPlaySound.volume, 1f);
}
}
CloseSelf();
}
private void Select(UILabel lbl, bool instant)
{
Highlight(lbl, instant);
}
protected virtual void OnNavigate(KeyCode key)
{
if (!base.enabled || !(current == this))
{
return;
}
int num = mLabelList.IndexOf(mHighlightedLabel);
if (num == -1)
{
num = 0;
}
switch (key)
{
case KeyCode.UpArrow:
if (num > 0)
{
Select(mLabelList[--num], instant: false);
}
break;
case KeyCode.DownArrow:
if (num + 1 < mLabelList.Count)
{
Select(mLabelList[++num], instant: false);
}
break;
}
}
protected virtual void OnKey(KeyCode key)
{
if (base.enabled && current == this && (key == UICamera.current.cancelKey0 || key == UICamera.current.cancelKey1))
{
OnSelect(isSelected: false);
}
}
protected virtual void OnDisable()
{
CloseSelf();
}
protected virtual void OnSelect(bool isSelected)
{
if (!isSelected)
{
CloseSelf();
}
}
public static void Close()
{
if (current != null)
{
current.CloseSelf();
current = null;
}
}
public virtual void CloseSelf()
{
if (!(mChild != null) || !(current == this))
{
return;
}
StopCoroutine("CloseIfUnselected");
mSelection = null;
mLabelList.Clear();
if (isAnimated)
{
UIWidget[] componentsInChildren = mChild.GetComponentsInChildren<UIWidget>();
int i = 0;
for (int num = componentsInChildren.Length; i < num; i++)
{
UIWidget obj = componentsInChildren[i];
Color color = obj.color;
color.a = 0f;
TweenColor.Begin(obj.gameObject, 0.15f, color).method = UITweener.Method.EaseOut;
}
Collider[] componentsInChildren2 = mChild.GetComponentsInChildren<Collider>();
int j = 0;
for (int num2 = componentsInChildren2.Length; j < num2; j++)
{
componentsInChildren2[j].enabled = false;
}
UnityEngine.Object.Destroy(mChild, 0.15f);
mFadeOutComplete = Time.unscaledTime + Mathf.Max(0.1f, 0.15f);
}
else
{
UnityEngine.Object.Destroy(mChild);
mFadeOutComplete = Time.unscaledTime + 0.1f;
}
mBackground = null;
mHighlight = null;
mChild = null;
current = null;
}
protected virtual void AnimateColor(UIWidget widget)
{
Color color = widget.color;
widget.color = new Color(color.r, color.g, color.b, 0f);
TweenColor.Begin(widget.gameObject, 0.15f, color).method = UITweener.Method.EaseOut;
}
protected virtual void AnimatePosition(UIWidget widget, bool placeAbove, float bottom)
{
Vector3 localPosition = widget.cachedTransform.localPosition;
Vector3 localPosition2 = (placeAbove ? new Vector3(localPosition.x, bottom, localPosition.z) : new Vector3(localPosition.x, 0f, localPosition.z));
widget.cachedTransform.localPosition = localPosition2;
TweenPosition.Begin(widget.gameObject, 0.15f, localPosition).method = UITweener.Method.EaseOut;
}
protected virtual void AnimateScale(UIWidget widget, bool placeAbove, float bottom)
{
GameObject go = widget.gameObject;
Transform cachedTransform = widget.cachedTransform;
float num = (float)activeFontSize * activeFontScale + mBgBorder * 2f;
cachedTransform.localScale = new Vector3(1f, num / (float)widget.height, 1f);
TweenScale.Begin(go, 0.15f, Vector3.one).method = UITweener.Method.EaseOut;
if (placeAbove)
{
Vector3 localPosition = cachedTransform.localPosition;
cachedTransform.localPosition = new Vector3(localPosition.x, localPosition.y - (float)widget.height + num, localPosition.z);
TweenPosition.Begin(go, 0.15f, localPosition).method = UITweener.Method.EaseOut;
}
}
private void Animate(UIWidget widget, bool placeAbove, float bottom)
{
AnimateColor(widget);
AnimatePosition(widget, placeAbove, bottom);
}
protected virtual void OnClick()
{
if (mOpenFrame == Time.frameCount)
{
return;
}
if (mChild == null)
{
if (openOn != OpenOn.DoubleClick && openOn != OpenOn.Manual && (openOn != OpenOn.RightClick || UICamera.currentTouchID == -2))
{
Show();
}
}
else if (mHighlightedLabel != null)
{
OnItemPress(mHighlightedLabel.gameObject, isPressed: true);
}
}
protected virtual void OnDoubleClick()
{
if (openOn == OpenOn.DoubleClick)
{
Show();
}
}
private IEnumerator CloseIfUnselected()
{
do
{
yield return null;
}
while (!(UICamera.selectedObject != mSelection));
CloseSelf();
}
public virtual void Show()
{
if (base.enabled && NGUITools.GetActive(base.gameObject) && mChild == null && atlas != null && isValid && items.Count > 0)
{
mLabelList.Clear();
StopCoroutine("CloseIfUnselected");
UICamera.selectedObject = UICamera.hoveredObject ?? base.gameObject;
mSelection = UICamera.selectedObject;
source = UICamera.selectedObject;
if (source == null)
{
Debug.LogError("Popup list needs a source object...");
return;
}
mOpenFrame = Time.frameCount;
if (mPanel == null)
{
mPanel = UIPanel.Find(base.transform);
if (mPanel == null)
{
return;
}
}
mChild = new GameObject("Drop-down List");
mChild.layer = base.gameObject.layer;
if (separatePanel)
{
if (GetComponent<Collider>() != null)
{
mChild.AddComponent<Rigidbody>().isKinematic = true;
}
else if (GetComponent<Collider2D>() != null)
{
mChild.AddComponent<Rigidbody2D>().isKinematic = true;
}
mChild.AddComponent<UIPanel>().depth = 1000000;
}
current = this;
Transform transform = mChild.transform;
transform.parent = mPanel.cachedTransform;
Vector3 vector2;
Vector3 vector3;
Vector3 vector;
if (openOn == OpenOn.Manual && mSelection != base.gameObject)
{
vector = UICamera.lastEventPosition;
vector2 = mPanel.cachedTransform.InverseTransformPoint(mPanel.anchorCamera.ScreenToWorldPoint(vector));
vector3 = vector2;
transform.localPosition = vector2;
vector = transform.position;
}
else
{
Bounds bounds = NGUIMath.CalculateRelativeWidgetBounds(mPanel.cachedTransform, base.transform, considerInactive: false, considerChildren: false);
vector2 = bounds.min;
vector3 = bounds.max;
transform.localPosition = vector2;
vector = transform.position;
}
StartCoroutine("CloseIfUnselected");
transform.localRotation = Quaternion.identity;
transform.localScale = Vector3.one;
mBackground = NGUITools.AddSprite(mChild, atlas, backgroundSprite, (!separatePanel) ? NGUITools.CalculateNextDepth(mPanel.gameObject) : 0);
mBackground.pivot = UIWidget.Pivot.TopLeft;
mBackground.color = backgroundColor;
Vector4 border = mBackground.border;
mBgBorder = border.y;
mBackground.cachedTransform.localPosition = new Vector3(0f, border.y, 0f);
mHighlight = NGUITools.AddSprite(mChild, atlas, highlightSprite, mBackground.depth + 1);
mHighlight.pivot = UIWidget.Pivot.TopLeft;
mHighlight.color = highlightColor;
UISpriteData atlasSprite = mHighlight.GetAtlasSprite();
if (atlasSprite == null)
{
return;
}
float num = atlasSprite.borderTop;
float num2 = activeFontSize;
float num3 = activeFontScale;
float num4 = num2 * num3;
float a = 0f;
float num5 = 0f - padding.y;
List<UILabel> list = new List<UILabel>();
if (!items.Contains(mSelectedItem))
{
mSelectedItem = null;
}
int i = 0;
for (int count = items.Count; i < count; i++)
{
string text = items[i];
UILabel uILabel = NGUITools.AddWidget<UILabel>(mChild, mBackground.depth + 2);
uILabel.name = i.ToString();
uILabel.pivot = UIWidget.Pivot.TopLeft;
uILabel.bitmapFont = bitmapFont;
uILabel.trueTypeFont = trueTypeFont;
uILabel.fontSize = fontSize;
uILabel.fontStyle = fontStyle;
uILabel.text = (isLocalized ? Localization.Get(text) : text);
uILabel.color = textColor;
uILabel.cachedTransform.localPosition = new Vector3(border.x + padding.x - uILabel.pivotOffset.x, num5, -1f);
uILabel.overflowMethod = UILabel.Overflow.ResizeFreely;
uILabel.alignment = alignment;
list.Add(uILabel);
num5 -= num4;
num5 -= padding.y;
a = Mathf.Max(a, uILabel.printedSize.x);
UIEventListener uIEventListener = UIEventListener.Get(uILabel.gameObject);
uIEventListener.onHover = OnItemHover;
uIEventListener.onPress = OnItemPress;
uIEventListener.parameter = text;
if (mSelectedItem == text || (i == 0 && string.IsNullOrEmpty(mSelectedItem)))
{
Highlight(uILabel, instant: true);
}
mLabelList.Add(uILabel);
}
a = Mathf.Max(a, vector3.x - vector2.x - (border.x + padding.x) * 2f);
float num6 = a;
Vector3 vector4 = new Vector3(num6 * 0.5f, (0f - num4) * 0.5f, 0f);
Vector3 vector5 = new Vector3(num6, num4 + padding.y, 1f);
int j = 0;
for (int count2 = list.Count; j < count2; j++)
{
UILabel uILabel2 = list[j];
NGUITools.AddWidgetCollider(uILabel2.gameObject);
uILabel2.autoResizeBoxCollider = false;
BoxCollider component = uILabel2.GetComponent<BoxCollider>();
if (component != null)
{
vector4.z = component.center.z;
component.center = vector4;
component.size = vector5;
}
else
{
BoxCollider2D component2 = uILabel2.GetComponent<BoxCollider2D>();
component2.offset = vector4;
component2.size = vector5;
}
}
int width = Mathf.RoundToInt(a);
a += (border.x + padding.x) * 2f;
num5 -= border.y;
mBackground.width = Mathf.RoundToInt(a);
mBackground.height = Mathf.RoundToInt(0f - num5 + border.y);
int k = 0;
for (int count3 = list.Count; k < count3; k++)
{
UILabel uILabel3 = list[k];
uILabel3.overflowMethod = UILabel.Overflow.ShrinkContent;
uILabel3.width = width;
}
float num7 = 2f * atlas.pixelSize;
float f = a - (border.x + padding.x) * 2f + (float)atlasSprite.borderLeft * num7;
float f2 = num4 + num * num7;
mHighlight.width = Mathf.RoundToInt(f);
mHighlight.height = Mathf.RoundToInt(f2);
bool flag = position == Position.Above;
if (position == Position.Auto)
{
UICamera uICamera = UICamera.FindCameraForLayer(mSelection.layer);
if (uICamera != null)
{
flag = uICamera.cachedCamera.WorldToViewportPoint(vector).y < 0.5f;
}
}
if (isAnimated)
{
AnimateColor(mBackground);
if (Time.timeScale == 0f || Time.timeScale >= 0.1f)
{
float bottom = num5 + num4;
Animate(mHighlight, flag, bottom);
int l = 0;
for (int count4 = list.Count; l < count4; l++)
{
Animate(list[l], flag, bottom);
}
AnimateScale(mBackground, flag, bottom);
}
}
if (flag)
{
vector2.y = vector3.y - border.y;
vector3.y = vector2.y + (float)mBackground.height;
vector3.x = vector2.x + (float)mBackground.width;
transform.localPosition = new Vector3(vector2.x, vector3.y - border.y, vector2.z);
}
else
{
vector3.y = vector2.y + border.y;
vector2.y = vector3.y - (float)mBackground.height;
vector3.x = vector2.x + (float)mBackground.width;
}
Transform parent = mPanel.cachedTransform.parent;
if (parent != null)
{
vector2 = mPanel.cachedTransform.TransformPoint(vector2);
vector3 = mPanel.cachedTransform.TransformPoint(vector3);
vector2 = parent.InverseTransformPoint(vector2);
vector3 = parent.InverseTransformPoint(vector3);
}
Vector3 vector6 = (mPanel.hasClipping ? Vector3.zero : mPanel.CalculateConstrainOffset(vector2, vector3));
vector = transform.localPosition + vector6;
vector.x = Mathf.Round(vector.x);
vector.y = Mathf.Round(vector.y);
transform.localPosition = vector;
}
else
{
OnSelect(isSelected: false);
}
}
}