using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace Unity.VisualScripting
{
public class TabbedPage : Page
{
public TabbedPage() : base()
{
pages = new List<Page>();
pageOptions = new List<ListOption>();
}
private Page _currentPage;
public List<Page> pages { get; }
private List<ListOption> pageOptions { get; }
public Page currentPage
{
get
{
return _currentPage;
}
set
{
currentPage?.Close();
_currentPage = value;
currentPage?.Show();
}
}
public void UpdateOptions()
{
pageOptions.Clear();
pageOptions.AddRange(pages.Select(page => new ListOption(page, new GUIContent(page.shortTitle))));
currentPage = pages.FirstOrDefault();
}
protected override void OnShow()
{
base.OnShow();
UpdateOptions();
}
public override void Update()
{
if (currentPage.CompleteSwitch())
{
return;
}
currentPage?.Update();
}
protected virtual void OnEmptyGUI()
{
GUILayout.BeginVertical(Styles.emptyBackground);
LudiqGUI.FlexibleSpace();
GUILayout.Label("No item found.", LudiqStyles.centeredLabel);
LudiqGUI.FlexibleSpace();
LudiqGUI.EndVertical();
}
protected override void OnHeaderGUI()
{
if (currentPage == null)
{
base.OnHeaderGUI();
return;
}
GUILayout.BeginVertical(LudiqStyles.windowHeaderBackground, GUILayout.ExpandWidth(true));
GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
LudiqGUI.FlexibleSpace();
if (currentPage?.icon != null)
{
GUILayout.Box(new GUIContent(currentPage.icon?[(int)LudiqStyles.windowHeaderIcon.fixedWidth]), LudiqStyles.windowHeaderIcon);
LudiqGUI.Space(LudiqStyles.spaceBetweenWindowHeaderIconAndTitle);
}
GUILayout.Label(title, LudiqStyles.windowHeaderTitle);
LudiqGUI.FlexibleSpace();
LudiqGUI.EndHorizontal();
LudiqGUI.Space(13);
OnTabsGUI();
LudiqGUI.Space(-5);
LudiqGUI.EndVertical();
}
protected void OnTabsGUI()
{
LudiqGUI.BeginHorizontal();
LudiqGUI.FlexibleSpace();
for (var i = 0; i < pageOptions.Count; i++)
{
GUIStyle tabStyle;
if (pageOptions.Count > 1)
{
if (i == 0)
{
tabStyle = Styles.tabLeft;
}
else if (i == pageOptions.Count - 1)
{
tabStyle = Styles.tabRight;
}
else
{
tabStyle = Styles.tabMid;
}
}
else
{
tabStyle = Styles.tabSingle;
}
var tabPage = (Page)pageOptions[i].value;
var tabLabel = pageOptions[i].label;
if (GUILayout.Toggle(currentPage == tabPage, tabLabel, tabStyle) && currentPage != tabPage)
{
currentPage = tabPage;
}
}
LudiqGUI.FlexibleSpace();
LudiqGUI.EndHorizontal();
}
protected override void OnContentGUI()
{
if (pageOptions.Count == 0)
{
OnEmptyGUI();
}
else
{
currentPage?.DrawContent();
}
}
public static class Styles
{
static Styles()
{
emptyBackground = ColorPalette.unityBackgroundMid.CreateBackground();
emptyBackground.padding = new RectOffset(10, 10, 10, 10);
tabLeft = new GUIStyle("ButtonLeft");
tabMid = new GUIStyle("ButtonMid");
tabRight = new GUIStyle("ButtonRight");
tabSingle = new GUIStyle("Button");
tabLeft.padding = tabMid.padding = tabRight.padding = tabSingle.padding = new RectOffset(10, 10, 5, 5);
}
public static readonly GUIStyle emptyBackground;
public static readonly GUIStyle tabLeft;
public static readonly GUIStyle tabMid;
public static readonly GUIStyle tabRight;
public static readonly GUIStyle tabSingle;
}
}
}