#if UNITY_EDITOR using UnityEngine; using UnityEditor; using UnityEditor.UIElements; using UnityEngine.UIElements; using System; using System.Collections.Generic; namespace GSpawn { public class RandomPrefabProfileDbUI : PluginUI { [SerializeField] private float _prefabPreviewScale = UIValues.defaultPrefabPreviewScale; private Slider _previewScaleSlider; private Button _useDefaultsBtn; private EntitySearchField _prefabSearchField; private ProfileSelectionUI _profileSelectionUI; [SerializeField] private GridViewState _prefabViewState; [NonSerialized] private GridView _prefabView; [NonSerialized] private List _randomPrefabBuffer = new List(); [NonSerialized] private List _pluginPrefabBuffer = new List(); [NonSerialized] private List _randomPrefabItemDataBuffer = new List(); public float prefabPreviewScale { get { return _prefabPreviewScale; } set { UndoEx.record(this); _prefabPreviewScale = Mathf.Clamp(value, UIValues.minPrefabPreviewScale, UIValues.maxPrefabPreviewScale); EditorUtility.SetDirty(this); } } public static RandomPrefabProfileDbUI instance { get { return RandomPrefabProfileDb.instance.ui; } } public void onPrefabAssetWillBeDeleted(GameObject prefabAsset) { if (_prefabView != null) _prefabView.deleteItems(itemData => itemData.randomPrefab.prefabAsset == prefabAsset); } public void getVisibleSelectedPrefabs(List randomPrefabs) { randomPrefabs.Clear(); if (_prefabView != null) { _prefabView.getVisibleSelectedItemData(_randomPrefabItemDataBuffer); foreach (var itemData in _randomPrefabItemDataBuffer) randomPrefabs.Add(itemData.randomPrefab); } } protected override void onBuild() { contentContainer.style.flexGrow = 1.0f; _profileSelectionUI = new ProfileSelectionUI(); _profileSelectionUI.build(RandomPrefabProfileDb.instance, "random prefab profile", contentContainer); contentContainer.RegisterCallback(p => { if (p.button == (int)MouseButton.RightMouse) { getVisibleSelectedPrefabs(_randomPrefabBuffer); PluginGenericMenu menu = new PluginGenericMenu(); menu.addItem(GenericMenuItemCategory.VisiblePrefabs, GenericMenuItemId.HighlightSelectedInManager, _randomPrefabBuffer.Count != 0, () => { RandomPrefab.getPluginPrefabs(_randomPrefabBuffer, _pluginPrefabBuffer); PluginPrefabManagerUI.instance.selectPluginPrefabsAndMakeVisible(_pluginPrefabBuffer, true); }); menu.showAsContext(); } }); createTopToolbar(); createSearchToolbar(); createPrefabView(); createPrefabSettingsControls(); createBottomToolbar(); populatePrefabView(); } protected override void onRefresh() { populatePrefabView(); } protected override void onEnabled() { RandomPrefabProfileDb.instance.activeProfileChanged += onActiveProfileChanged; if (_prefabViewState == null) { _prefabViewState = ScriptableObject.CreateInstance(); _prefabViewState.name = GetType().Name + "_PrefabViewState"; AssetDbEx.addObjectToAsset(_prefabViewState, RandomPrefabProfileDb.instance); } } protected override void onDisabled() { RandomPrefabProfileDb.instance.activeProfileChanged -= onActiveProfileChanged; } protected override void onDestroy() { ScriptableObjectEx.destroyImmediate(_prefabViewState); } protected override void onUndoRedo() { if (_profileSelectionUI != null) _profileSelectionUI.refresh(); populatePrefabView(); } private void createTopToolbar() { Toolbar toolbar = new Toolbar(); toolbar.style.flexShrink = 0.0f; contentContainer.Add(toolbar); var resetPreviewsBtn = UI.createSmallResetPrefabPreviewsToolbarButton(toolbar); resetPreviewsBtn.clicked += () => { RandomPrefabProfileDb.instance.activeProfile.resetPrefabPreviews(); }; var loadPrefabsBtn = UI.createSmallLoadPrefabsButton(toolbar); loadPrefabsBtn.clicked += () => { createRandomPrefabsFromPrefabsInManager(); }; } private void createSearchToolbar() { var searchToolbar = new Toolbar(); searchToolbar.style.flexShrink = 0.0f; contentContainer.Add(searchToolbar); _prefabSearchField = new EntitySearchField(searchToolbar, (nameList) => { RandomPrefabProfileDb.instance.activeProfile.getPrefabNames(nameList); }, (name) => { _prefabView.filterItems(filterPrefabViewItem); }); } private bool filterPrefabViewItem(UIRandomPrefabItemData itemData) { return filterPrefab(itemData.randomPrefabProfile, itemData.randomPrefab); } private bool filterPrefab(RandomPrefabProfile randomPrefabProfile, RandomPrefab randomPrefab) { if (!_prefabSearchField.matchName(randomPrefab.prefabAsset.name)) return false; return true; } private void onActiveProfileChanged(RandomPrefabProfile newActiveProfile) { if (_profileSelectionUI != null) _profileSelectionUI.refresh(); populatePrefabView(); } private void createPrefabView() { _prefabView = new GridView(_prefabViewState, contentContainer); _prefabView.selectedItemsWillBeDeleted += onSelectedPrefabItemsWillBeDeleted; _prefabView.canDelete = true; // _prefabView.style.height = 300.0f; _prefabView.style.setBorderWidth(1.0f); _prefabView.style.setBorderColor(Color.black); _prefabView.style.setMargins(UIValues.wndMargin); _prefabView.style.marginTop = 3.0f; _prefabView.RegisterCallback(p => { if (PluginDragAndDrop.initiatedByPlugin) { if (PluginPrefabManagerUI.instance.dragAndDropInitiatedByPrefabView()) { createRandomPrefabsFromPrefabsInManager(); PluginDragAndDrop.endDrag(); } } }); } private void createRandomPrefabsFromPrefabsInManager() { var activeProfile = RandomPrefabProfileDb.instance.activeProfile; if (activeProfile != null) { PluginPrefabManagerUI.instance.getVisibleSelectedPrefabs(_pluginPrefabBuffer); activeProfile.createPrefabs(_pluginPrefabBuffer, _randomPrefabBuffer, false, "Creating Random Prefabs"); foreach (var randomPrefab in _randomPrefabBuffer) _prefabView.addItem(new UIRandomPrefabItemData() { randomPrefab = randomPrefab, randomPrefabProfile = activeProfile }, true); } } private void createPrefabSettingsControls() { const float labelWidth = 130.0f; IMGUIContainer imGUIContainer = UI.createIMGUIContainer(contentContainer); imGUIContainer.style.flexShrink = 0.0f; imGUIContainer.style.marginLeft = 3.0f; imGUIContainer.onGUIHandler = () => { getVisibleSelectedPrefabs(_randomPrefabBuffer); _useDefaultsBtn.setDisplayVisible(_randomPrefabBuffer.Count != 0); if (_randomPrefabBuffer.Count == 0) { EditorGUILayout.HelpBox("No prefabs selected. Select prefabs in order to change their settings.", MessageType.Info); return; } else { var guiContent = new GUIContent(); EditorUIEx.saveLabelWidth(); EditorUIEx.saveShowMixedValue(); EditorGUIUtility.labelWidth = labelWidth; var diff = RandomPrefab.checkDiff(_randomPrefabBuffer); // Used bool used = _randomPrefabBuffer[0].used; EditorGUI.showMixedValue = diff.used; EditorGUI.BeginChangeCheck(); guiContent.text = "Used"; guiContent.tooltip = "If checked, the prefab will be taken into account when randomly picking prefabs."; bool newUsed = EditorGUILayout.Toggle(guiContent, used, GUILayout.ExpandWidth(true)); if (EditorGUI.EndChangeCheck()) { foreach (var randomPrefab in _randomPrefabBuffer) randomPrefab.used = newUsed; RandomPrefabProfileDb.instance.activeProfile.onPrefabsUsedStateChanged(); foreach (var selectedItemId in _prefabViewState.selectedItems) _prefabView.refreshItemUI(selectedItemId); } // Probability float probability = _randomPrefabBuffer[0].probability; EditorGUI.showMixedValue = diff.probability; EditorGUI.BeginChangeCheck(); guiContent.text = "Probability"; guiContent.tooltip = "The prefab's chance to be picked."; float newProbability = EditorGUILayout.FloatField(guiContent, probability, GUILayout.ExpandWidth(true)); if (EditorGUI.EndChangeCheck()) { foreach (var randomPrefab in _randomPrefabBuffer) randomPrefab.probability = newProbability; RandomPrefabProfileDb.instance.activeProfile.onPrefabsProbabilityChanged(); } EditorUIEx.restoreShowMixedValue(); EditorUIEx.restoreLabelWidth(); // Note: Leave some space between the settings control the and use defaults button. EditorGUILayout.Separator(); } }; _useDefaultsBtn = UI.createUseDefaultsButton(() => { getVisibleSelectedPrefabs(_randomPrefabBuffer); foreach (var randomPrefab in _randomPrefabBuffer) randomPrefab.useDefaults(); _prefabView.refreshUI(); }, contentContainer); } private void createBottomToolbar() { Toolbar toolbar = new Toolbar(); toolbar.style.flexShrink = 0.0f; contentContainer.Add(toolbar); _previewScaleSlider = UI.createSlider("_prefabPreviewScale", serializedObject, string.Empty, "Prefab preview scale [" + prefabPreviewScale + "]", UIValues.minPrefabPreviewScale, UIValues.maxPrefabPreviewScale, toolbar); _previewScaleSlider.style.width = 80.0f; _previewScaleSlider.RegisterValueChangedCallback ((p) => { _prefabView.setImageSize(Vector2Ex.create(PrefabPreviewFactory.previewSize * prefabPreviewScale)); _previewScaleSlider.tooltip = "Prefab preview scale [" + prefabPreviewScale + "]"; }); } private void populatePrefabView() { if (_prefabView == null) return; _prefabSearchField.refreshMatchNames(); _prefabView.onBeginBuild(); var activeProfile = RandomPrefabProfileDb.instance.activeProfile; if (activeProfile != null) { activeProfile.getPrefabs(_randomPrefabBuffer); foreach(var randomPrefab in _randomPrefabBuffer) { _prefabView.addItem(new UIRandomPrefabItemData() { randomPrefab = randomPrefab, randomPrefabProfile = activeProfile }, true); } } _prefabView.onEndBuild(); _prefabView.setImageSize(Vector2Ex.create(PrefabPreviewFactory.previewSize * prefabPreviewScale)); } private void onSelectedPrefabItemsWillBeDeleted(GridView gridView, List itemIds) { _randomPrefabBuffer.Clear(); foreach (var itemId in itemIds) _randomPrefabBuffer.Add(_prefabView.getItemData(itemId).randomPrefab); RandomPrefabProfileDb.instance.activeProfile.deletePrefabs(_randomPrefabBuffer); } } } #endif