com.alicizax.unity.packagem.../Editor/PackageManager/Window/PackageListView.cs

70 lines
2.3 KiB
C#
Raw Normal View History

2025-02-20 10:48:57 +08:00
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine.UIElements;
namespace AlicizaX.PackageManager.Editor
{
internal class PackageListView : ListView
{
public event Action<IEnumerable<RepositoryPackageData>> OnSelectionChangedEvent;
private void OnSelectionChangedInternal(IEnumerable<object> selectedItems)
{
// 转换对象类型为实际数据类型
var packages = selectedItems.Cast<RepositoryPackageData>();
OnSelectionChangedEvent?.Invoke(packages);
// 刷新列表项显示
RefreshItems();
}
public PackageListView()
{
style.paddingTop = new Length(2, LengthUnit.Pixel);
virtualizationMethod = CollectionVirtualizationMethod.FixedHeight;
fixedItemHeight = 25f;
horizontalScrollingEnabled = false;
ScrollView scrollView = this.Q<ScrollView>();
scrollView.horizontalScrollerVisibility = ScrollerVisibility.Hidden;
style.flexShrink = 1;
style.height = Length.Percent(95);
makeItem = MakeItem;
bindItem = BindItem;
selectionChanged += OnSelectionChanged;
selectionChanged += OnSelectionChangedInternal;
selectionType = SelectionType.Single;
}
private void OnSelectionChanged(IEnumerable<object> selectedItems)
{
RefreshItems();
}
private VisualElement MakeItem()
{
return new PackageInfoListItem();
}
private void BindItem(VisualElement item, int index)
{
if (!(item is PackageInfoListItem packageItem))
{
return;
}
RepositoryPackageData packageData = GetVisualStateByIndex(index);
packageItem.RefreshDataSource(packageData);
// 绑定数据后更新选中状态
bool isSelected = selectedIndices.Contains(index);
packageItem.SetSelected(isSelected);
}
private RepositoryPackageData GetVisualStateByIndex(int index)
{
return this.itemsSource is List<RepositoryPackageData> itemsSource ? itemsSource.ElementAtOrDefault<RepositoryPackageData>(index) : (RepositoryPackageData)null;
}
}
}