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 m_Items; int m_TotalItems; int m_CurPage; public int pageSize { set { m_PageSize = value; } } public IEnumerable 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(); 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; } } } }