Files
PotionMaker/Assets/MeshBaker/Editor/propertyDrawers/MB_PaginatedList.cs
2026-03-27 16:34:08 +09:00

88 lines
3.3 KiB
C#

using UnityEditor;
using UnityEngine;
namespace DigitalOpus.MB.MBEditor
{
public class MB_PaginatedList
{
public static void GenerateObjectsToBeCombinedList(SerializedProperty objsToMesh, ref int currentPage, ref int objectsPerPage)
{
SerializedProperty arraySizeProp = objsToMesh.FindPropertyRelative("Array.size");
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Size", GUILayout.Width(EditorGUIUtility.labelWidth));
int newSize = EditorGUILayout.DelayedIntField(arraySizeProp.intValue);
arraySizeProp.intValue = Mathf.Max(1, newSize);
if (newSize <= 0 &&
arraySizeProp.intValue == 1)
{
// This is necessary because the first element in the list gets preserved.
// If the user sets the number of elements to 0 or less then we should
// make the displayed first element == null
SerializedProperty element = objsToMesh.GetArrayElementAtIndex(0);
element.objectReferenceValue = null;
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Objects per Page", GUILayout.Width(EditorGUIUtility.labelWidth));
EditorGUI.BeginChangeCheck();
int newObjectsPerPage = EditorGUILayout.DelayedIntField(objectsPerPage);
if (EditorGUI.EndChangeCheck())
{
objectsPerPage = Mathf.Clamp(newObjectsPerPage, 10, 500);
currentPage = 1;
}
EditorGUILayout.EndHorizontal();
int totalObjects = objsToMesh.arraySize;
int totalPages = totalObjects / objectsPerPage;
if (totalObjects % objectsPerPage != 0)
{
totalPages++;
}
if (totalPages == 0)
{
currentPage = 1;
}
else if (currentPage > totalPages)
{
currentPage = totalPages;
}
else if (currentPage < 1)
{
currentPage = 1;
}
int startIndex = (currentPage - 1) * objectsPerPage;
int endIndex = Mathf.Min(startIndex + objectsPerPage, totalObjects);
for (int i = startIndex; i < endIndex; i++)
{
SerializedProperty objProp = objsToMesh.GetArrayElementAtIndex(i);
EditorGUILayout.PropertyField(objProp, new GUIContent("Object " + (i + 1)));
}
EditorGUILayout.BeginHorizontal();
GUI.enabled = currentPage > 1;
if (GUILayout.Button("Previous"))
{
currentPage--;
}
bool prevGUIEnabled = GUI.enabled;
GUI.enabled = true;
GUIStyle centeredLabelStyle = new GUIStyle(EditorStyles.label);
centeredLabelStyle.alignment = TextAnchor.MiddleCenter;
EditorGUILayout.LabelField("Page " + currentPage + " of " + totalPages, centeredLabelStyle);
GUI.enabled = prevGUIEnabled;
GUI.enabled = currentPage < totalPages;
if (GUILayout.Button("Next"))
{
currentPage++;
}
GUI.enabled = true;
EditorGUILayout.EndHorizontal();
}
}
}