An easy to use Unity 3D library for creating illustrated Interactive Fiction games and more.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

681 lines
24 KiB

using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
[RequireComponent(typeof(RectTransform))]
public class ComboBox : MonoBehaviour
{
public Sprite Sprite_UISprite;
public Sprite Sprite_Background;
public Action<int> OnSelectionChanged;
[SerializeField]
private bool _interactable = true;
public bool Interactable
{
get
{
return _interactable;
}
set
{
_interactable = value;
var button = comboButtonRectTransform.GetComponent<Button>();
button.interactable = _interactable;
var image = comboImageRectTransform.GetComponent<Image>();
image.color = image.sprite == null ? new Color(1.0f, 1.0f, 1.0f, 0.0f) : _interactable ? button.colors.normalColor : button.colors.disabledColor;
if (!Application.isPlaying)
return;
if (!_interactable && overlayGO.activeSelf)
ToggleComboBox(false);
}
}
[SerializeField]
private int _itemsToDisplay = 4;
public int ItemsToDisplay
{
get
{
return _itemsToDisplay;
}
set
{
if (_itemsToDisplay == value)
return;
_itemsToDisplay = value;
Refresh();
}
}
[SerializeField]
private bool _hideFirstItem;
public bool HideFirstItem
{
get
{
return _hideFirstItem;
}
set
{
if (value)
scrollOffset--;
else
scrollOffset++;
_hideFirstItem = value;
Refresh();
}
}
[SerializeField]
private int _selectedIndex = 0;
public int SelectedIndex
{
get
{
return _selectedIndex;
}
set
{
if (_selectedIndex == value)
return;
if (value > -1 && value < Items.Length)
{
_selectedIndex = value;
RefreshSelected();
}
}
}
[SerializeField]
private ComboBoxItem[] _items;
public ComboBoxItem[] Items
{
get
{
if (_items == null)
_items = new ComboBoxItem[0];
return _items;
}
set
{
_items = value;
Refresh();
}
}
private GameObject overlayGO;
private int scrollOffset;
private float _scrollbarWidth = 20.0f;
private RectTransform _rectTransform;
private RectTransform rectTransform
{
get
{
if (_rectTransform == null)
_rectTransform = GetComponent<RectTransform>();
return _rectTransform;
}
set
{
_rectTransform = value;
}
}
private RectTransform _buttonRectTransform;
private RectTransform buttonRectTransform
{
get
{
if (_buttonRectTransform == null)
_buttonRectTransform = rectTransform.Find("Button").GetComponent<RectTransform>();
return _buttonRectTransform;
}
set
{
_buttonRectTransform = value;
}
}
private RectTransform _comboButtonRectTransform;
private RectTransform comboButtonRectTransform
{
get
{
if (_comboButtonRectTransform == null)
_comboButtonRectTransform = buttonRectTransform.Find("ComboButton").GetComponent<RectTransform>();
return _comboButtonRectTransform;
}
set
{
_comboButtonRectTransform = value;
}
}
private RectTransform _comboImageRectTransform;
private RectTransform comboImageRectTransform
{
get
{
if (_comboImageRectTransform == null)
_comboImageRectTransform = comboButtonRectTransform.Find("Image").GetComponent<RectTransform>();
return _comboImageRectTransform;
}
set
{
_comboImageRectTransform = value;
}
}
private RectTransform _comboTextRectTransform;
private RectTransform comboTextRectTransform
{
get
{
if (_comboTextRectTransform == null)
_comboTextRectTransform = comboButtonRectTransform.Find("Text").GetComponent<RectTransform>();
return _comboTextRectTransform;
}
set
{
_comboTextRectTransform = value;
}
}
private RectTransform _comboArrowRectTransform;
private RectTransform comboArrowRectTransform
{
get
{
if (_comboArrowRectTransform == null)
_comboArrowRectTransform = buttonRectTransform.Find("Arrow").GetComponent<RectTransform>();
return _comboArrowRectTransform;
}
set
{
_comboArrowRectTransform = value;
}
}
private RectTransform _scrollPanelRectTransfrom;
private RectTransform scrollPanelRectTransfrom
{
get
{
if (_scrollPanelRectTransfrom == null)
_scrollPanelRectTransfrom = rectTransform.Find("Overlay/ScrollPanel").GetComponent<RectTransform>();
return _scrollPanelRectTransfrom;
}
set
{
_scrollPanelRectTransfrom = value;
}
}
private RectTransform _itemsRectTransfrom;
private RectTransform itemsRectTransfrom
{
get
{
if (_itemsRectTransfrom == null)
_itemsRectTransfrom = scrollPanelRectTransfrom.Find("Items").GetComponent<RectTransform>();
return _itemsRectTransfrom;
}
set
{
_itemsRectTransfrom = value;
}
}
private RectTransform _scrollbarRectTransfrom;
private RectTransform scrollbarRectTransfrom
{
get
{
if (_scrollbarRectTransfrom == null)
_scrollbarRectTransfrom = scrollPanelRectTransfrom.Find("Scrollbar").GetComponent<RectTransform>();
return _scrollbarRectTransfrom;
}
set
{
_scrollbarRectTransfrom = value;
}
}
private RectTransform _slidingAreaRectTransform;
private RectTransform slidingAreaRectTransform
{
get
{
if (_slidingAreaRectTransform == null)
_slidingAreaRectTransform = scrollbarRectTransfrom.Find("SlidingArea").GetComponent<RectTransform>();
return _slidingAreaRectTransform;
}
set
{
_slidingAreaRectTransform = value;
}
}
private RectTransform _handleRectTransfrom;
private RectTransform handleRectTransfrom
{
get
{
if (_handleRectTransfrom == null)
_handleRectTransfrom = slidingAreaRectTransform.Find("Handle").GetComponent<RectTransform>();
return _handleRectTransfrom;
}
set
{
_handleRectTransfrom = value;
}
}
private void Awake()
{
InitControl();
}
public void OnItemClicked(int index)
{
var selectionChanged = index != SelectedIndex;
SelectedIndex = index;
ToggleComboBox(true);
if (selectionChanged && OnSelectionChanged != null)
OnSelectionChanged(index);
}
public void AddItems(params object[] list)
{
var cbItems = new List<ComboBoxItem>();
foreach (var obj in list)
{
if (obj is ComboBoxItem)
{
var item = (ComboBoxItem)obj;
cbItems.Add(item);
continue;
}
if (obj is string)
{
var item = new ComboBoxItem((string)obj, null, false, null);
cbItems.Add(item);
continue;
}
if (obj is Sprite)
{
var item = new ComboBoxItem(null, (Sprite)obj, false, null);
cbItems.Add(item);
continue;
}
throw new Exception("Only ComboBoxItem, string and Sprite types are allowed");
}
var newItems = new ComboBoxItem[Items.Length + cbItems.Count];
Items.CopyTo(newItems, 0);
cbItems.ToArray().CopyTo(newItems, Items.Length);
Refresh();
Items = newItems;
}
public void ClearItems()
{
Items = new ComboBoxItem[0];
}
public void CreateControl()
{
rectTransform = GetComponent<RectTransform>();
var buttonGO = new GameObject("Button");
buttonGO.transform.SetParent(transform, false);
buttonRectTransform = buttonGO.AddComponent<RectTransform>();
buttonRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, rectTransform.sizeDelta.x);
buttonRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, rectTransform.sizeDelta.y);
buttonRectTransform.anchoredPosition = Vector2.zero;
var comboButtonGO = new GameObject("ComboButton");
comboButtonGO.transform.SetParent(buttonRectTransform, false);
comboButtonRectTransform = comboButtonGO.AddComponent<RectTransform>();
comboButtonRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, buttonRectTransform.sizeDelta.x);
comboButtonRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, buttonRectTransform.sizeDelta.y);
comboButtonRectTransform.anchoredPosition = Vector2.zero;
var comboButtonImage = comboButtonGO.AddComponent<Image>();
comboButtonImage.sprite = Sprite_UISprite;
comboButtonImage.type = Image.Type.Sliced;
var comboButtonButton = comboButtonGO.AddComponent<Button>();
comboButtonButton.targetGraphic = comboButtonImage;
var comboButtonColors = new ColorBlock();
comboButtonColors.normalColor = new Color32(255, 255, 255, 255);
comboButtonColors.highlightedColor = new Color32(245, 245, 245, 255);
comboButtonColors.pressedColor = new Color32(200, 200, 200, 255);
comboButtonColors.disabledColor = new Color32(200, 200, 200, 128);
comboButtonColors.colorMultiplier = 1.0f;
comboButtonColors.fadeDuration = 0.1f;
comboButtonButton.colors = comboButtonColors;
var comboArrowGO = new GameObject("Arrow");
comboArrowGO.transform.SetParent(buttonRectTransform, false);
var comboArrowText = comboArrowGO.AddComponent<Text>();
comboArrowText.color = new Color32(0, 0, 0, 255);
comboArrowText.alignment = TextAnchor.MiddleCenter;
comboArrowText.font = Resources.GetBuiltinResource(typeof(Font), "Arial.ttf") as Font;
comboArrowText.text = "▼";
comboArrowRectTransform.localScale = new Vector3(1.0f, 0.5f, 1.0f);
comboArrowRectTransform.pivot = new Vector2(1.0f, 0.5f);
comboArrowRectTransform.anchorMin = Vector2.right;
comboArrowRectTransform.anchorMax = Vector2.one;
comboArrowRectTransform.anchoredPosition = Vector2.zero;
comboArrowRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, comboButtonRectTransform.sizeDelta.y);
comboArrowRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, comboButtonRectTransform.sizeDelta.y);
var comboArrowCanvasGroup = comboArrowGO.AddComponent<CanvasGroup>();
comboArrowCanvasGroup.interactable = false;
comboArrowCanvasGroup.blocksRaycasts = false;
var comboImageGO = new GameObject("Image");
comboImageGO.transform.SetParent(comboButtonRectTransform, false);
var comboImageImage = comboImageGO.AddComponent<Image>();
comboImageImage.color = new Color32(255, 255, 255, 0);
comboImageRectTransform.pivot = Vector2.up;
comboImageRectTransform.anchorMin = Vector2.zero;
comboImageRectTransform.anchorMax = Vector2.up;
comboImageRectTransform.anchoredPosition = new Vector2(4.0f, -4.0f);
comboImageRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, comboButtonRectTransform.sizeDelta.y - 8.0f);
comboImageRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, comboButtonRectTransform.sizeDelta.y - 8.0f);
var comboTextGO = new GameObject("Text");
comboTextGO.transform.SetParent(comboButtonRectTransform, false);
var comboTextText = comboTextGO.AddComponent<Text>();
comboTextText.color = new Color32(0, 0, 0, 255);
comboTextText.alignment = TextAnchor.MiddleLeft;
comboTextText.lineSpacing = 1.2f;
comboTextText.font = Resources.GetBuiltinResource(typeof(Font), "Arial.ttf") as Font;
comboTextRectTransform.pivot = Vector2.up;
comboTextRectTransform.anchorMin = Vector2.zero;
comboTextRectTransform.anchorMax = Vector2.one;
comboTextRectTransform.anchoredPosition = new Vector2(10.0f, 0.0f);
comboTextRectTransform.offsetMax = new Vector2(4.0f, 0.0f);
comboTextRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, comboButtonRectTransform.sizeDelta.y);
}
public void InitControl()
{
var cbi = transform.Find("Button/ComboButton/Image");
var cbt = transform.Find("Button/ComboButton/Text");
var cba = transform.Find("Button/Arrow");
if (cbi == null || cbt == null || cba == null)
{
foreach (Transform child in transform)
Destroy(child);
CreateControl();
}
comboButtonRectTransform.GetComponent<Button>().onClick.AddListener(() => { ToggleComboBox(false); });
var dropdownHeight = comboButtonRectTransform.sizeDelta.y * Mathf.Min(ItemsToDisplay, Items.Length - (HideFirstItem ? 1 : 0));
overlayGO = new GameObject("Overlay");
overlayGO.SetActive(false);
var overlayImage = overlayGO.AddComponent<Image>();
overlayImage.color = new Color32(0, 0, 0, 0);
var canvasTransform = transform;
while (canvasTransform.GetComponent<Canvas>() == null)
canvasTransform = canvasTransform.parent;
overlayGO.transform.SetParent(canvasTransform, false);
var overlayRectTransform = overlayGO.GetComponent<RectTransform>();
overlayRectTransform.anchorMin = Vector2.zero;
overlayRectTransform.anchorMax = Vector2.one;
overlayRectTransform.offsetMin = Vector2.zero;
overlayRectTransform.offsetMax = Vector2.zero;
overlayGO.transform.SetParent(transform, false);
var overlayButton = overlayGO.AddComponent<Button>();
overlayButton.targetGraphic = overlayImage;
overlayButton.onClick.AddListener(() => { ToggleComboBox(false); });
var scrollPanelGO = new GameObject("ScrollPanel");
var scrollPanelImage = scrollPanelGO.AddComponent<Image>();
scrollPanelImage.sprite = Sprite_UISprite;
scrollPanelImage.type = Image.Type.Sliced;
scrollPanelGO.transform.SetParent(overlayGO.transform, false);
scrollPanelRectTransfrom.pivot = new Vector2(0.5f, 1.0f);
scrollPanelRectTransfrom.anchorMin = Vector2.zero;
scrollPanelRectTransfrom.anchorMax = Vector2.one;
scrollPanelGO.transform.SetParent(transform, false);
scrollPanelRectTransfrom.anchoredPosition = new Vector2(0.0f, -comboButtonRectTransform.sizeDelta.y);
scrollPanelGO.transform.SetParent(overlayGO.transform, false);
scrollPanelRectTransfrom.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, comboButtonRectTransform.sizeDelta.x);
scrollPanelRectTransfrom.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, dropdownHeight);
var scrollPanelScrollRect = scrollPanelGO.AddComponent<ScrollRect>();
scrollPanelScrollRect.horizontal = false;
scrollPanelScrollRect.elasticity = 0.0f;
scrollPanelScrollRect.movementType = ScrollRect.MovementType.Clamped;
scrollPanelScrollRect.inertia = false;
scrollPanelScrollRect.scrollSensitivity = comboButtonRectTransform.sizeDelta.y;
scrollPanelGO.AddComponent<Mask>();
var scrollbarWidth = Items.Length - (HideFirstItem ? 1 : 0) > _itemsToDisplay ? _scrollbarWidth : 0.0f;
var itemsGO = new GameObject("Items");
itemsGO.transform.SetParent(scrollPanelGO.transform, false);
itemsRectTransfrom = itemsGO.AddComponent<RectTransform>();
itemsRectTransfrom.pivot = Vector2.up;
itemsRectTransfrom.anchorMin = Vector2.up;
itemsRectTransfrom.anchorMax = Vector2.one;
itemsRectTransfrom.anchoredPosition = Vector2.right;
itemsRectTransfrom.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, scrollPanelRectTransfrom.sizeDelta.x - scrollbarWidth);
var itemsContentSizeFitter = itemsGO.AddComponent<ContentSizeFitter>();
itemsContentSizeFitter.horizontalFit = ContentSizeFitter.FitMode.PreferredSize;
itemsContentSizeFitter.verticalFit = ContentSizeFitter.FitMode.PreferredSize;
var itemsGridLayoutGroup = itemsGO.AddComponent<GridLayoutGroup>();
itemsGridLayoutGroup.cellSize = new Vector2(comboButtonRectTransform.sizeDelta.x - scrollbarWidth, comboButtonRectTransform.sizeDelta.y);
itemsGridLayoutGroup.constraint = GridLayoutGroup.Constraint.FixedColumnCount;
itemsGridLayoutGroup.constraintCount = 1;
scrollPanelScrollRect.content = itemsRectTransfrom;
var scrollbarGO = new GameObject("Scrollbar");
scrollbarGO.transform.SetParent(scrollPanelGO.transform, false);
var scrollbarImage = scrollbarGO.AddComponent<Image>();
scrollbarImage.sprite = Sprite_Background;
scrollbarImage.type = Image.Type.Sliced;
var scrollbarScrollbar = scrollbarGO.AddComponent<Scrollbar>();
var scrollbarColors = new ColorBlock();
scrollbarColors.normalColor = new Color32(128, 128, 128, 128);
scrollbarColors.highlightedColor = new Color32(128, 128, 128, 178);
scrollbarColors.pressedColor = new Color32(88, 88, 88, 178);
scrollbarColors.disabledColor = new Color32(64, 64, 64, 128);
scrollbarColors.colorMultiplier = 2.0f;
scrollbarColors.fadeDuration = 0.1f;
scrollbarScrollbar.colors = scrollbarColors;
scrollPanelScrollRect.verticalScrollbar = scrollbarScrollbar;
scrollbarScrollbar.direction = Scrollbar.Direction.BottomToTop;
scrollbarRectTransfrom.pivot = Vector2.one;
scrollbarRectTransfrom.anchorMin = Vector2.one;
scrollbarRectTransfrom.anchorMax = Vector2.one;
scrollbarRectTransfrom.anchoredPosition = Vector2.zero;
scrollbarRectTransfrom.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, scrollbarWidth);
scrollbarRectTransfrom.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, dropdownHeight);
var slidingAreaGO = new GameObject("SlidingArea");
slidingAreaGO.transform.SetParent(scrollbarGO.transform, false);
slidingAreaRectTransform = slidingAreaGO.AddComponent<RectTransform>();
slidingAreaRectTransform.anchoredPosition = Vector2.zero;
slidingAreaRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 0);
slidingAreaRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, dropdownHeight - scrollbarRectTransfrom.sizeDelta.x);
var handleGO = new GameObject("Handle");
handleGO.transform.SetParent(slidingAreaGO.transform, false);
var handleImage = handleGO.AddComponent<Image>();
handleImage.sprite = Sprite_UISprite;
handleImage.type = Image.Type.Sliced;
handleImage.color = new Color32(255, 255, 255, 150);
scrollbarScrollbar.targetGraphic = handleImage;
scrollbarScrollbar.handleRect = handleRectTransfrom;
handleRectTransfrom.pivot = new Vector2(0.5f, 0.5f);
handleRectTransfrom.anchorMin = new Vector2(0.5f, 0.5f);
handleRectTransfrom.anchorMax = new Vector2(0.5f, 0.5f);
handleRectTransfrom.anchoredPosition = Vector2.zero;
handleRectTransfrom.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, scrollbarWidth);
handleRectTransfrom.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, scrollbarWidth);
Interactable = Interactable;
if (Items.Length < 1)
return;
Refresh();
}
public void Refresh()
{
var itemsGridLayoutGroup = itemsRectTransfrom.GetComponent<GridLayoutGroup>();
var itemsLength = Items.Length - (HideFirstItem ? 1 : 0);
var dropdownHeight = comboButtonRectTransform.sizeDelta.y * Mathf.Min(_itemsToDisplay, itemsLength);
var scrollbarWidth = itemsLength > ItemsToDisplay ? _scrollbarWidth : 0.0f;
scrollPanelRectTransfrom.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, dropdownHeight);
scrollbarRectTransfrom.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, scrollbarWidth);
scrollbarRectTransfrom.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, dropdownHeight);
slidingAreaRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, dropdownHeight - scrollbarRectTransfrom.sizeDelta.x);
itemsRectTransfrom.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, scrollPanelRectTransfrom.sizeDelta.x - scrollbarWidth);
itemsGridLayoutGroup.cellSize = new Vector2(comboButtonRectTransform.sizeDelta.x - scrollbarWidth, comboButtonRectTransform.sizeDelta.y);
for (var i = itemsRectTransfrom.childCount - 1; i > -1; i--)
DestroyImmediate(itemsRectTransfrom.GetChild(0).gameObject);
for (var i = 0; i < Items.Length; i++)
{
if (HideFirstItem && i == 0)
continue;
var item = Items[i];
item.OnUpdate = Refresh;
var itemTransform = Instantiate(comboButtonRectTransform) as Transform;
itemTransform.SetParent(itemsRectTransfrom, false);
itemTransform.GetComponent<Image>().sprite = null;
var itemText = itemTransform.Find("Text").GetComponent<Text>();
itemText.text = item.Caption;
if (item.IsDisabled)
itemText.color = new Color32(174, 174, 174, 255);
var itemImage = itemTransform.Find("Image").GetComponent<Image>();
itemImage.sprite = item.Image;
itemImage.color = item.Image == null ? new Color32(255, 255, 255, 0) : item.IsDisabled ? new Color32(255, 255, 255, 147) : new Color32(255, 255, 255, 255);
var itemButton = itemTransform.GetComponent<Button>();
itemButton.interactable = !item.IsDisabled;
var index = i;
itemButton.onClick.AddListener(
delegate()
{
OnItemClicked(index);
if (item.OnSelect != null)
item.OnSelect();
}
);
}
RefreshSelected();
UpdateComboBoxImages();
UpdateGraphics();
FixScrollOffset();
}
public void RefreshSelected()
{
var comboButtonImage = comboImageRectTransform.GetComponent<Image>();
var item = SelectedIndex > -1 && SelectedIndex < Items.Length ? Items[SelectedIndex] : null;
var includeImage = item != null && item.Image != null;
comboButtonImage.sprite = includeImage ? item.Image : null;
var comboButtonButton = comboButtonRectTransform.GetComponent<Button>();
comboButtonImage.color = includeImage ? (Interactable ? comboButtonButton.colors.normalColor : comboButtonButton.colors.disabledColor) : new Color(1.0f, 1.0f, 1.0f, 0);
UpdateComboBoxImage(comboButtonRectTransform, includeImage);
comboTextRectTransform.GetComponent<Text>().text = item != null ? item.Caption : "";
if (!Application.isPlaying)
return;
var i = 0;
foreach (Transform child in itemsRectTransfrom)
{
comboButtonImage = child.GetComponent<Image>();
comboButtonImage.color = SelectedIndex == i + (HideFirstItem ? 1 : 0) ? comboButtonButton.colors.highlightedColor : comboButtonButton.colors.normalColor;
i++;
}
}
private void UpdateComboBoxImages()
{
var includeImages = false;
foreach (var item in Items)
{
if (item.Image != null)
{
includeImages = true;
break;
}
}
foreach (Transform child in itemsRectTransfrom)
UpdateComboBoxImage(child, includeImages);
}
private void UpdateComboBoxImage(Transform comboButton, bool includeImage)
{
comboButton.Find("Text").GetComponent<RectTransform>().offsetMin = Vector2.right * (includeImage ? comboImageRectTransform.rect.width + 8.0f : 10.0f);
}
private void FixScrollOffset()
{
var selectedIndex = SelectedIndex + (HideFirstItem ? 1 : 0);
if (selectedIndex < scrollOffset)
scrollOffset = selectedIndex;
else
if (selectedIndex > scrollOffset + ItemsToDisplay - 1)
scrollOffset = selectedIndex - ItemsToDisplay + 1;
var itemsCount = Items.Length - (HideFirstItem ? 1 : 0);
if (scrollOffset > itemsCount - ItemsToDisplay)
scrollOffset = itemsCount - ItemsToDisplay;
if (scrollOffset < 0)
scrollOffset = 0;
itemsRectTransfrom.anchoredPosition = new Vector2(0.0f, scrollOffset * rectTransform.sizeDelta.y);
}
private void ToggleComboBox(bool directClick)
{
overlayGO.SetActive(!overlayGO.activeSelf);
if (overlayGO.activeSelf)
{
var curTransform = transform;
do
{
curTransform.SetAsLastSibling();
}
while ((curTransform = curTransform.parent) != null);
FixScrollOffset();
}
else
if (directClick)
scrollOffset = (int)Mathf.Round(itemsRectTransfrom.anchoredPosition.y / rectTransform.sizeDelta.y);
}
public void UpdateGraphics()
{
if (overlayGO != null)
{
var scrollbarWidth = Items.Length - (HideFirstItem ? 1 : 0) > ItemsToDisplay ? _scrollbarWidth : 0.0f;
handleRectTransfrom.offsetMin = -scrollbarWidth / 2 * Vector2.one;
handleRectTransfrom.offsetMax = scrollbarWidth / 2 * Vector2.one;
}
if (rectTransform.sizeDelta != buttonRectTransform.sizeDelta && buttonRectTransform.sizeDelta == comboButtonRectTransform.sizeDelta)
{
buttonRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, rectTransform.sizeDelta.x);
buttonRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, rectTransform.sizeDelta.y);
comboButtonRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, rectTransform.sizeDelta.x);
comboButtonRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, rectTransform.sizeDelta.y);
comboArrowRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, rectTransform.sizeDelta.y);
comboImageRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, comboImageRectTransform.rect.height);
comboTextRectTransform.offsetMax = new Vector2(4.0f, 0.0f);
if (overlayGO == null)
return;
scrollPanelRectTransfrom.SetParent(transform, false);
scrollPanelRectTransfrom.anchoredPosition = new Vector2(0.0f, -comboButtonRectTransform.sizeDelta.y);
scrollPanelRectTransfrom.SetParent(overlayGO.transform, false);
scrollPanelRectTransfrom.GetComponent<ScrollRect>().scrollSensitivity = comboButtonRectTransform.sizeDelta.y;
UpdateComboBoxImage(comboButtonRectTransform, Items[SelectedIndex].Image != null);
Refresh();
}
}
}