using System;
|
|
using System.Collections.Generic;
|
|
|
|
#if UNITY_2019_1_OR_NEWER
|
|
using UnityEngine.UIElements;
|
|
#else
|
|
using UnityEngine.Experimental.UIElements;
|
|
using UnityEngine.Experimental.UIElements.StyleEnums;
|
|
#endif
|
|
|
|
namespace UnityEditor.Collaboration
|
|
{
|
|
internal interface IPagerData
|
|
{
|
|
int curPage { get; }
|
|
int totalPages { get; }
|
|
PageChangeAction OnPageChanged { get; }
|
|
}
|
|
|
|
internal class PagerElement : VisualElement
|
|
{
|
|
IPagerData m_Data;
|
|
readonly Label m_PageText;
|
|
readonly Button m_DownButton;
|
|
readonly Button m_UpButton;
|
|
|
|
public PagerElement(IPagerData dataSource)
|
|
{
|
|
m_Data = dataSource;
|
|
|
|
this.style.flexDirection = FlexDirection.Row;
|
|
this.style.alignSelf = Align.Center;
|
|
|
|
Add(m_DownButton = new Button(OnPageDownClicked) {text = "\u25c5 Newer"});
|
|
m_DownButton.AddToClassList("PagerDown");
|
|
|
|
m_PageText = new Label();
|
|
m_PageText.AddToClassList("PagerLabel");
|
|
Add(m_PageText);
|
|
|
|
Add(m_UpButton = new Button(OnPageUpClicked) {text = "Older \u25bb"});
|
|
m_UpButton.AddToClassList("PagerUp");
|
|
|
|
UpdateControls();
|
|
}
|
|
|
|
void OnPageDownClicked()
|
|
{
|
|
CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "NewerPage");
|
|
m_Data.OnPageChanged(m_Data.curPage - 1);
|
|
}
|
|
|
|
void OnPageUpClicked()
|
|
{
|
|
CollabAnalytics.SendUserAction(CollabAnalytics.historyCategoryString, "OlderPage");
|
|
m_Data.OnPageChanged(m_Data.curPage + 1);
|
|
}
|
|
|
|
public void Refresh()
|
|
{
|
|
UpdateControls();
|
|
}
|
|
|
|
void UpdateControls()
|
|
{
|
|
var curPage = m_Data.curPage;
|
|
var totalPages = m_Data.totalPages;
|
|
|
|
m_PageText.text = (curPage + 1) + " / " + totalPages;
|
|
m_DownButton.SetEnabled(curPage > 0);
|
|
m_UpButton.SetEnabled(curPage < totalPages - 1);
|
|
}
|
|
}
|
|
|
|
internal enum PagerLocation
|
|
{
|
|
Top,
|
|
Bottom,
|
|
}
|
|
|
|
internal class PagedListView : VisualElement, IPagerData
|
|
{
|
|
public const int DefaultItemsPerPage = 10;
|
|
|
|
readonly VisualElement m_ItemContainer;
|
|
readonly PagerElement m_PagerTop, m_PagerBottom;
|
|
int m_PageSize = DefaultItemsPerPage;
|
|
IEnumerable<VisualElement> m_Items;
|
|
int m_TotalItems;
|
|
int m_CurPage;
|
|
|
|
public int pageSize
|
|
{
|
|
set { m_PageSize = value; }
|
|
}
|
|
|
|
public IEnumerable<VisualElement> items
|
|
{
|
|
set
|
|
{
|
|
m_Items = value;
|
|
LayoutItems();
|
|
}
|
|
}
|
|
|
|
public int totalItems
|
|
{
|
|
set
|
|
{
|
|
if (m_TotalItems == value)
|
|
return;
|
|
|
|
m_TotalItems = value;
|
|
UpdatePager();
|
|
}
|
|
}
|
|
|
|
public PageChangeAction OnPageChanged { get; set; }
|
|
|
|
public PagedListView()
|
|
{
|
|
m_PagerTop = new PagerElement(this);
|
|
|
|
m_ItemContainer = new VisualElement()
|
|
{
|
|
name = "PagerItems",
|
|
};
|
|
Add(m_ItemContainer);
|
|
m_Items = new List<VisualElement>();
|
|
|
|
m_PagerBottom = new PagerElement(this);
|
|
}
|
|
|
|
void LayoutItems()
|
|
{
|
|
m_ItemContainer.Clear();
|
|
foreach (var item in m_Items)
|
|
{
|
|
m_ItemContainer.Add(item);
|
|
}
|
|
}
|
|
|
|
void UpdatePager()
|
|
{
|
|
if (m_PagerTop.parent != this && totalPages > 1 && curPage > 0)
|
|
Insert(0, m_PagerTop);
|
|
if (m_PagerTop.parent == this && (totalPages <= 1 || curPage == 0))
|
|
Remove(m_PagerTop);
|
|
|
|
if (m_PagerBottom.parent != this && totalPages > 1)
|
|
Add(m_PagerBottom);
|
|
if (m_PagerBottom.parent == this && totalPages <= 1)
|
|
Remove(m_PagerBottom);
|
|
|
|
m_PagerTop.Refresh();
|
|
m_PagerBottom.Refresh();
|
|
}
|
|
|
|
int pageCount
|
|
{
|
|
get
|
|
{
|
|
var pages = m_TotalItems / m_PageSize;
|
|
if (m_TotalItems % m_PageSize > 0)
|
|
pages++;
|
|
|
|
return pages;
|
|
}
|
|
}
|
|
|
|
public int curPage
|
|
{
|
|
get { return m_CurPage; }
|
|
set
|
|
{
|
|
m_CurPage = value;
|
|
UpdatePager();
|
|
}
|
|
}
|
|
|
|
public int totalPages
|
|
{
|
|
get
|
|
{
|
|
var extraPage = 0;
|
|
if (m_TotalItems % m_PageSize > 0)
|
|
extraPage = 1;
|
|
return m_TotalItems / m_PageSize + extraPage;
|
|
}
|
|
}
|
|
}
|
|
}
|