70 lines
2.3 KiB
C#
70 lines
2.3 KiB
C#
![]() |
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;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|