123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- #if UNITY_EDITOR && UNITY_INPUT_SYSTEM_PROJECT_WIDE_ACTIONS
- using System;
- using System.Collections.Generic;
- using UnityEditor;
- using UnityEditor.Search;
- using UnityEngine.Search;
-
- namespace UnityEngine.InputSystem.Editor
- {
- internal static class SearchConstants
- {
- // SearchFlags: these flags are used to customize how search is performed and how search
- // results are displayed in the advanced object picker.
- // Note: SearchFlags.Packages is not currently used and hides all results from packages.
- internal static readonly SearchFlags PickerSearchFlags = SearchFlags.Sorted | SearchFlags.OpenPicker;
-
- // Search.SearchViewFlags : these flags are used to customize the appearance of the PickerWindow.
- internal static readonly Search.SearchViewFlags PickerViewFlags = SearchViewFlags.DisableBuilderModeToggle
- | SearchViewFlags.DisableInspectorPreview
- | SearchViewFlags.ListView
- | SearchViewFlags.DisableSavedSearchQuery;
- }
-
- internal static class InputActionReferenceSearchProviders
- {
- const string k_AssetFolderSearchProviderId = "AssetsInputActionReferenceSearchProvider";
- const string k_ProjectWideActionsSearchProviderId = "ProjectWideInputActionReferenceSearchProvider";
-
- // Search provider for InputActionReferences for all assets in the project, without project-wide actions.
- internal static SearchProvider CreateInputActionReferenceSearchProviderForAssets()
- {
- return CreateInputActionReferenceSearchProvider(k_AssetFolderSearchProviderId,
- "Asset Input Actions",
- // Show the asset path in the description.
- (obj) => AssetDatabase.GetAssetPath((obj as InputActionReference).asset),
- () => InputActionImporter.LoadInputActionReferencesFromAssetDatabase(skipProjectWide: true));
- }
-
- // Search provider for InputActionReferences for project-wide actions
- internal static SearchProvider CreateInputActionReferenceSearchProviderForProjectWideActions()
- {
- return CreateInputActionReferenceSearchProvider(k_ProjectWideActionsSearchProviderId,
- "Project-Wide Input Actions",
- (obj) => "(Project-Wide Input Actions)",
- () =>
- {
- var asset = InputSystem.actions;
- if (asset == null)
- return Array.Empty<Object>();
- var assetPath = AssetDatabase.GetAssetPath(asset);
- return InputActionImporter.LoadInputActionReferencesFromAsset(assetPath);
- });
- }
-
- private static SearchProvider CreateInputActionReferenceSearchProvider(string id, string displayName,
- Func<Object, string> createItemFetchDescription, Func<IEnumerable<Object>> fetchAssets)
- {
- // Match icon used for sub-assets from importer for InputActionReferences.
- // We assign description+label in FilteredSearch but also provide a fetchDescription+fetchLabel below.
- // This is needed to support all zoom-modes for an unknown reason.
- // Also, fetchLabel/fetchDescription and what is provided to CreateItem is playing different
- // roles at different zoom levels.
- var inputActionReferenceIcon = InputActionAssetIconLoader.LoadActionIcon();
-
- return new SearchProvider(id, displayName)
- {
- priority = 25,
- fetchDescription = FetchLabel,
- fetchItems = (context, items, provider) => FilteredSearch(context, provider, FetchLabel, createItemFetchDescription,
- fetchAssets, "(Project-Wide Input Actions)"),
- fetchLabel = FetchLabel,
- fetchPreview = (item, context, size, options) => inputActionReferenceIcon,
- fetchThumbnail = (item, context) => inputActionReferenceIcon,
- toObject = (item, type) => item.data as Object,
- };
- }
-
- // Custom search function with label matching filtering.
- private static IEnumerable<SearchItem> FilteredSearch(SearchContext context, SearchProvider provider,
- Func<Object, string> fetchObjectLabel, Func<Object, string> createItemFetchDescription, Func<IEnumerable<Object>> fetchAssets, string description)
- {
- foreach (var asset in fetchAssets())
- {
- var label = fetchObjectLabel(asset);
- if (!label.Contains(context.searchText, System.StringComparison.InvariantCultureIgnoreCase))
- continue; // Ignore due to filtering
- yield return provider.CreateItem(context, asset.GetInstanceID().ToString(), label, createItemFetchDescription(asset),
- null, asset);
- }
- }
-
- // Note that this is overloaded to allow utilizing FetchLabel inside fetchItems to keep label formatting
- // consistent between CreateItem and additional fetchLabel calls.
- private static string FetchLabel(Object obj)
- {
- return obj.name;
- }
-
- private static string FetchLabel(SearchItem item, SearchContext context)
- {
- return FetchLabel((item.data as Object) !);
- }
- }
- }
- #endif
|