public static VisualElement CreateAsStringPopupField <TEnum>(SerializedProperty property, Action <TEnum> onValueChanged = null) where TEnum : struct, Enum { Assert.AreEqual(property.propertyType, SerializedPropertyType.Enum); #if UNITY_2019_3_OR_NEWER var enumField = new UnityEditor.UIElements.EnumField { bindingPath = property.propertyPath }; enumField.RegisterValueChangedCallback(e => { if (onValueChanged != null && e.newValue is TEnum newValue) { onValueChanged.Invoke(newValue); } }); enumField.Bind(property.serializedObject); return(enumField); #else // HACK: `Field type UnityEditor.UIElements.EnumField is not compatible with Enum property "myEnum"` in 2019.2 // ref: https://forum.unity.com/threads/cant-create-bindings-for-an-enum-not-compatible.728111/#post-4873661 var enumField = new PopupField <string> { bindingPath = property.propertyPath }; // HACK: `NullReferenceException: Object reference not set to an instance of an object` in 2019.2 enumField.RegisterValueChangedCallback(_ => { onValueChanged?.Invoke((TEnum)(object)enumField.index); }); return(enumField); #endif }
private void AddHeader(VisualElement container, UIElements.EnumField sortBySelector, ColumnId sortBy, params string[] classes) { if (!IsColumnVisible(sortBy)) { return; } var header = new Label(); UpdateHeaderTitle(sortBy, header); header.userData = sortBy; header.AddToClassList("perf-header"); foreach (var c in classes) { header.AddToClassList(c); } header.RegisterCallback <MouseUpEvent>((evt) => { m_SortAsc = !m_SortAsc; if ((ColumnId)sortBySelector.value == sortBy) { ChangeSortOrder(sortBy); } else { sortBySelector.value = sortBy; } SendAnalytics(Analytics.WindowUsageType.Sort); }); container.Add(header); }
#pragma warning restore 414 public override void Init(VisualElement ve, IUxmlAttributes bag, CreationContext cc) { base.Init(ve, bag, cc); Enum resEnumValue; bool resIncludeObsoleteValues; if (EnumFieldHelpers.ExtractValue(bag, cc, out resEnumValue, out resIncludeObsoleteValues)) { EnumField enumField = (EnumField)ve; enumField.Init(resEnumValue, resIncludeObsoleteValues); } }
internal static void ParseEnumValues(EnumField enumField, string typeValue, string v) { // Only works for the currently running assembly enumField.m_EnumType = Type.GetType(typeValue); if (enumField.m_EnumType != null) { if (!Enum.IsDefined(enumField.m_EnumType, v)) { Debug.LogErrorFormat("Could not parse value of '{0}', because it isn't defined in the {1} enum.", v, enumField.m_EnumType.FullName); enumField.SetValueWithoutNotify(null); } else { enumField.SetValueWithoutNotify((Enum)Enum.Parse(enumField.m_EnumType, v)); } } }
private void SetupUI() { var styleSheet = AssetDatabase.LoadAssetAtPath <StyleSheet>($"{Utils.packageFolderName}/Editor/StyleSheets/PerformanceTrackerWindow.uss"); rootVisualElement.styleSheets.Add(styleSheet); m_RefreshFromSearch = Delayer.Throttle(RefreshFromSearch); var toolbar = new UIElements.Toolbar(); toolbar.AddToClassList("perf-toolbar"); toolbar.style.height = PtStyles.itemHeight; var searchBox = new VisualElement(); searchBox.AddToClassList("perf-search-box"); AddSelectorLabel(toolbar, "Tracker"); m_SearchField = new UIElements.ToolbarSearchField(); m_SearchField.AddToClassList("perf-search-tracker"); m_SearchField.value = m_FilterText; m_SearchField.RegisterCallback <ChangeEvent <string> >((evt) => { m_RefreshFromSearch.Execute(evt.newValue); }); searchBox.Add(m_SearchField); toolbar.Add(searchBox); var resetAllCountersButton = new Button(ResetAllCounters); resetAllCountersButton.text = "Reset all counters"; resetAllCountersButton.AddToClassList("perf-tracker-toolbar-button"); toolbar.Add(resetAllCountersButton); AddSelectorLabel(toolbar, "Update Speed"); var choices = PtModel.RefreshRates.Select(r => r.label).ToList(); var updateSpeedSelector = new UIElements.PopupField <string>(choices, 0); updateSpeedSelector.value = PtModel.RefreshRates[m_UpdateSpeedIndex].label; updateSpeedSelector.AddToClassList("perf-update-speed-selector"); updateSpeedSelector.RegisterCallback <ChangeEvent <string> >((evt) => { m_UpdateSpeedIndex = Array.FindIndex(PtModel.RefreshRates, (r) => r.label == evt.newValue); ScheduleNextRefresh(); SendAnalytics(Analytics.WindowUsageType.ChangeMonitoringSpeed); }); toolbar.Add(updateSpeedSelector); AddSelectorLabel(toolbar, "Columns"); var columnsChoice = PtModel.ColumnDescriptors.Where(desc => desc.columnsSelectorMaskId > 0).Select(desc => desc.label).ToList(); var columnsSelector = new UIElements.MaskField(columnsChoice, m_ShownColumn); columnsSelector.RegisterCallback <ChangeEvent <int> >((evt) => { m_ShownColumn = evt.newValue; CreateHeaders(); RefreshTrackers(); SendAnalytics(Analytics.WindowUsageType.ChangeColumnLayout); }); columnsSelector.AddToClassList("perf-columns-selector"); toolbar.Add(columnsSelector); AddSelectorLabel(toolbar, "Sort By"); m_SortBySelector = new UIElements.EnumField(ColumnId.Name); m_SortBySelector.value = m_SortBy; m_SortBySelector.AddToClassList("perf-sort-by-selector"); m_SortBySelector.RegisterCallback <ChangeEvent <Enum> >((evt) => { ChangeSortOrder((ColumnId)evt.newValue); SendAnalytics(Analytics.WindowUsageType.ChangeSortBy); }); toolbar.Add(m_SortBySelector); var settingsBtn = new Button(() => { SettingsService.OpenUserPreferences(PerformanceTrackerSettings.settingsKey); SendAnalytics(Analytics.WindowUsageType.OpenPreferences); }); settingsBtn.style.backgroundImage = Icons.settings; settingsBtn.style.width = PtStyles.itemHeight - 3; settingsBtn.style.height = PtStyles.itemHeight - 3; toolbar.Add(settingsBtn); rootVisualElement.Add(toolbar); // Set List View Header: m_HeaderRow = new VisualElement(); m_HeaderRow.AddToClassList("perf-header-row-container"); m_HeaderRow.style.flexDirection = FlexDirection.Row; rootVisualElement.Add(m_HeaderRow); CreateHeaders(); m_PinnedTrackersView = new ListView(m_PinnedTrackers, PtStyles.itemHeight, MakeItem, BindPinnedItem); m_PinnedTrackersView.name = k_PinnedTrackerList; m_PinnedTrackersView.AddToClassList("perf-tracker-list"); m_PinnedTrackersView.selectionType = SelectionType.Multiple; m_PinnedTrackersView.style.flexGrow = 0; m_PinnedTrackersView.Q <VisualElement>(null, "unity-scroll-view__content-viewport").RegisterCallback <GeometryChangedEvent>(SyncHeaderAndListsGeometry); rootVisualElement.Add(m_PinnedTrackersView); m_TrackersView = new ListView(m_FilteredTrackers, PtStyles.itemHeight, MakeItem, BindUnpinnedItem); m_TrackersView.name = k_TrackerList; m_TrackersView.AddToClassList("perf-tracker-list"); m_TrackersView.selectionType = SelectionType.Multiple; m_TrackersView.style.flexGrow = 1.0f; m_TrackersView.Q <VisualElement>(null, "unity-scroll-view__content-viewport").RegisterCallback <GeometryChangedEvent>(SyncHeaderAndListsGeometry); rootVisualElement.Add(m_TrackersView); m_NeedsUpdate = true; ScheduleNextRefresh(); UpdateTrackers(); }