void BuildMetricFields() { m_MetricEditorContainer.Clear(); m_SO = new SerializedObject(m_Asset); SerializedProperty metrics = m_SO.FindProperty(Asset.k_MetricsPropertyPath); int metricsCount = metrics.arraySize; VisualElement buttonContainer = null; for (int metricIndex = 0; metricIndex < metricsCount; ++metricIndex) { VisualElement metricElement = new VisualElement(); SerializedProperty metricProperty = metrics.GetArrayElementAtIndex(metricIndex); metricElement.Add(new MetricField(m_Asset, metricProperty, metricIndex)); buttonContainer = new VisualElement(); buttonContainer.AddToClassList(k_ButtonContainerKey); metricElement.Add(buttonContainer); Button removeButton = new Button(); int index = metricIndex; removeButton.clickable.clicked += () => { RemoveMetric(index); }; removeButton.text = k_RemoveButtonText; removeButton.tooltip = k_RemoveTooltip; removeButton.AddToClassList(k_RemoveMetricButtonKey); removeButton.AddToClassList(k_ArrayButtonKey); buttonContainer.Add(removeButton); metricElement.AddToClassList(k_DrawerElementKey); m_MetricEditorContainer.Add(metricElement); } if (buttonContainer == null) { //If we have no metrics we should still show the Add button buttonContainer = new VisualElement(); m_MetricEditorContainer.Add(buttonContainer); } Button addButton = new Button(); addButton.name = "addMetricButton"; addButton.clickable.clicked += AddMetric; addButton.text = "+"; addButton.tooltip = k_AddTooltip; addButton.AddToClassList("metricButton"); addButton.AddToClassList(k_ArrayButtonKey); buttonContainer.Insert(0, addButton); m_MetricEditorContainer.Bind(m_SO); }
private void OnRecordingStateChanged(bool isRecording) { if (isRecording) { toggleRecordingButton.text = TranslationManager.GetTranslation(R.Messages.stopRecording); toggleRecordingButton.AddToClassList("stopRecordingButton"); } else { toggleRecordingButton.text = TranslationManager.GetTranslation(R.Messages.startRecording); toggleRecordingButton.RemoveFromClassList("stopRecordingButton"); } }
Button CreateButton(string name) { var button = new Button { name = name, }; button.AddToClassList(k_ButtonClass); button.RegisterCallback <DetachFromPanelEvent>(OnButtonDetachFromPanel); button.clicked += () => { value = m_Buttons.IndexOf(button); }; m_Buttons.Add(button); Add(button); RefreshButtonsStyling(); return(button); }
private void OnRecordingStateChanged(bool isRecording) { if (isRecording) { toggleRecordingButton.AddToClassList("stopRecordingButton"); // Prevent stand-by when recording Debug.Log("Setting Screen.sleepTimeout to SleepTimeout.NeverSleep"); Screen.sleepTimeout = SleepTimeout.NeverSleep; } else { toggleRecordingButton.RemoveFromClassList("stopRecordingButton"); // Reset stand-by behavior Debug.Log("Setting Screen.sleepTimeout to SleepTimeout.SystemSetting"); Screen.sleepTimeout = SleepTimeout.SystemSetting; } }
void AddBuildTarget(VisualElement targetsContainer, Dictionary <string, JSONValue> buildEntry) { if (buildEntry[k_JsonNodeNameEnabled].AsBool()) { ServicesConfiguration.instance.RequestCloudBuildApiUrl(cloudBuildApiUrl => { var buildTargetName = buildEntry[k_JsonNodeNameName].AsString(); var buildTargetId = buildEntry[k_JsonNodeNameBuildTargetId].AsString(); var buildTargetUrls = buildEntry[k_JsonNodeNameLinks].AsDict(); var startBuildUrl = cloudBuildApiUrl + buildTargetUrls[k_JsonNodeNameStartBuilds].AsDict()[k_JsonNodeNameHref].AsString(); var targetContainer = new VisualElement(); targetContainer.AddToClassList(k_ClassNameTargetEntry); var buildNameTextElement = new TextElement(); buildNameTextElement.AddToClassList(k_ClassNameTitle); buildNameTextElement.text = buildTargetName; targetContainer.Add(buildNameTextElement); var buildButton = new Button(); buildButton.name = k_BuildButtonNamePrefix + buildTargetId; buildButton.AddToClassList(k_ClassNameBuildButton); if (m_BillingPlanLabel.ToLower() == k_SubscriptionPersonal || k_SubscriptionTeamsBasic.ToLower() == k_SubscriptionPersonal) { buildButton.SetEnabled(false); } buildButton.text = L10n.Tr(k_LabelBuildButton); buildButton.clicked += () => { var uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(k_LaunchBuildPayload)); var launchBuildPostRequest = new UnityWebRequest(startBuildUrl, UnityWebRequest.kHttpVerbPOST) { downloadHandler = new DownloadHandlerBuffer(), uploadHandler = uploadHandler }; launchBuildPostRequest.suppressErrorsToConsole = true; launchBuildPostRequest.SetRequestHeader("AUTHORIZATION", $"Bearer {UnityConnect.instance.GetUserInfo().accessToken}"); launchBuildPostRequest.SetRequestHeader("Content-Type", "application/json;charset=utf-8"); m_Provider.m_BuildRequests.Add(launchBuildPostRequest); var launchingMessage = string.Format(L10n.Tr(k_MessageLaunchingBuild), buildTargetName); Debug.Log(launchingMessage); NotificationManager.instance.Publish( Notification.Topic.BuildService, Notification.Severity.Info, launchingMessage); EditorAnalytics.SendLaunchCloudBuildEvent(new BuildPostInfo() { targetName = buildTargetName }); var operation = launchBuildPostRequest.SendWebRequest(); operation.completed += asyncOperation => { try { if (ServicesUtils.IsUnityWebRequestReadyForJsonExtract(launchBuildPostRequest)) { try { if (launchBuildPostRequest.responseCode == k_HttpResponseCodeAccepted) { var jsonLaunchedBuildParser = new JSONParser(launchBuildPostRequest.downloadHandler.text); var launchedBuildJson = jsonLaunchedBuildParser.Parse(); var launchedBuilds = launchedBuildJson.AsList(); foreach (var rawLaunchedBuild in launchedBuilds) { var launchedBuild = rawLaunchedBuild.AsDict(); if (launchedBuild.ContainsKey(k_JsonNodeNameBuild)) { var buildNumber = launchedBuild[k_JsonNodeNameBuild].AsFloat().ToString(); var message = string.Format(L10n.Tr(k_MessageLaunchedBuildSuccess), buildNumber, buildTargetName); Debug.Log(message); NotificationManager.instance.Publish( Notification.Topic.BuildService, Notification.Severity.Info, message); } else if (launchedBuild.ContainsKey(k_JsonNodeNameError)) { var message = string.Format(L10n.Tr(k_MessageLaunchedBuildFailedWithMsg), buildTargetName, launchedBuild[k_JsonNodeNameError].ToString()); Debug.LogError(message); NotificationManager.instance.Publish( Notification.Topic.BuildService, Notification.Severity.Error, message); } } } else { var message = L10n.Tr(k_MessageLaunchedBuildFailure); Debug.LogError(message); NotificationManager.instance.Publish( Notification.Topic.BuildService, Notification.Severity.Error, message); } } catch (Exception ex) { NotificationManager.instance.Publish( Notification.Topic.BuildService, Notification.Severity.Error, L10n.Tr(k_MessageErrorForBuildLaunch)); Debug.LogException(ex); } } } finally { m_Provider.m_BuildRequests.Remove(launchBuildPostRequest); launchBuildPostRequest.Dispose(); launchBuildPostRequest = null; } }; }; targetContainer.Add(buildButton); targetsContainer.Add(targetContainer); var separator = new VisualElement(); separator.AddToClassList(k_ClassNameSeparator); targetsContainer.Add(separator); }); } }
private VisualElement MakeItem() { var row = new VisualElement(); row.style.flexDirection = FlexDirection.Row; row.AddToClassList("perf-row"); var pinIcon = new VisualElement(); pinIcon.AddToClassList("perf-pin"); row.Add(pinIcon); var trackerName = new TextField { isReadOnly = true }; VisualElement column = trackerName; column.AddToClassList("perf-tracker-name"); row.Add(column); if (IsColumnVisible(ColumnId.SampleCount)) { column = new Button(); column.RegisterCallback <MouseUpEvent>(evt => { var tracker = GetTrackerInRowAtEvt(evt); EditorPerformanceTracker.Reset(tracker.name); RefreshTrackers(); SendAnalytics(Analytics.WindowUsageType.ResetSampleCount, tracker.name); }); column.AddToClassList("perf-sample-count"); row.Add(column); } if (IsColumnVisible(ColumnId.Age)) { column = new Label(); column.AddToClassList("perf-age"); row.Add(column); } if (IsColumnVisible(ColumnId.AvgTime)) { column = new Label(); column.AddToClassList("perf-avg-time"); row.Add(column); } if (IsColumnVisible(ColumnId.PeakTime)) { column = new Label(); column.AddToClassList("perf-peak-time"); row.Add(column); } if (IsColumnVisible(ColumnId.LastTime)) { column = new Label(); column.AddToClassList("perf-last-time"); row.Add(column); } if (IsColumnVisible(ColumnId.TotalTime)) { column = new Label(); column.AddToClassList("perf-total-time"); row.Add(column); } var actionBtn = new Button { text = "..." }; actionBtn.RegisterCallback <MouseUpEvent>(evt => { var btn = evt.target as Button; var tracker = GetTrackerInRowAtEvt(evt); if (tracker.name == m_CurrentProfileTag) { EndTrackerProfiling(evt.target as Button, tracker.name); } else { GenericMenu menu = new GenericMenu(); menu.AddItem(new GUIContent("Set as search filter"), false, () => { m_SearchField.value = tracker.name; SendAnalytics(Analytics.WindowUsageType.SetSearchFieldAction, tracker.name); }); menu.AddItem(new GUIContent("Add performance notification"), false, () => PerformanceTrackerActions.AddNewPerformanceNotification(tracker.name, (float)tracker.avgTime, Analytics.ActionSource.PerformanceTrackerWindow)); menu.AddItem(new GUIContent("LogCallstack"), false, () => PerformanceTrackerActions.LogCallstack(tracker.name, Analytics.ActionSource.PerformanceTrackerWindow)); if (String.IsNullOrEmpty(m_CurrentProfileTag)) { menu.AddSeparator(""); menu.AddItem(new GUIContent("Editmode Profile..."), false, () => StartTrackerProfiling(btn, tracker.name, false, true)); menu.AddItem(new GUIContent("Editmode Deep profile..."), false, () => StartTrackerProfiling(btn, tracker.name, true, true)); menu.AddSeparator(""); menu.AddItem(new GUIContent("Playmode Profile..."), false, () => StartTrackerProfiling(btn, tracker.name, false, false)); menu.AddItem(new GUIContent("Playmode Deep profile..."), false, () => StartTrackerProfiling(btn, tracker.name, true, false)); } menu.ShowAsContext(); } }); actionBtn.AddToClassList("perf-actions"); row.Add(actionBtn); return(row); }
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(); }
private void RenderItemsPanel() { VisualElement body = rootVisualElement.Q <VisualElement>("body"); itemsVisualTree.CloneTree(body); List <Type> types = new List <Type>(GetAllSubclassTypes <BaseItem>(false)); List <string> names = new List <string>(); for (int i = 0; i < types.Count; i++) { names.Add(types[i].ToString()); } #region SelectionList ListView typeSelectionList = rootVisualElement.Q <ListView>("TypesList"); Button allButton = new Button { text = "Select All" }; allButton.style.width = 70; allButton.clicked += () => OnAllCategorySelected(selectedItemCategories, names); FillListWithToggle(names, "Item", selectedItemCategories, typeSelectionList, OnItemCategorySelected); typeSelectionList.contentContainer.Insert(0, allButton); typeSelectionList.Insert(0, allButton); #endregion #region Selection Icons ScrollView categoryContainer = body.Q <ScrollView>("Lower"); Dictionary <string, List <BaseItem> > itemsPerClass = MarketManager.GetItemsByClass(); Label categoriesLabel = new Label() { text = "ITEM TYPES" }; categoriesLabel.style.fontSize = 20; for (int i = 0; i < names.Count; i++) { if (!selectedItemCategories.Contains(names[i])) { continue; } Label label = new Label(RemoveUntilFirstPoint(names[i].Replace("MarketSystem.", string.Empty)) .Replace("Item", string.Empty)); label.style.maxWidth = new StyleLength(StyleKeyword.Auto); label.style.fontSize = 20; label.style.paddingBottom = 10; label.style.paddingLeft = 10; VisualElement contentContainer = new VisualElement(); contentContainer.style.borderBottomColor = new StyleColor(new Color(.2f, .2f, .2f)); contentContainer.style.borderBottomWidth = new StyleFloat(1); contentContainer.style.paddingBottom = new StyleLength(10); contentContainer.style.alignContent = new StyleEnum <Align>(Align.FlexStart); contentContainer.style.flexDirection = new StyleEnum <FlexDirection>(FlexDirection.Row); contentContainer.style.flexWrap = new StyleEnum <Wrap>(Wrap.Wrap); contentContainer.style.maxWidth = 600; if (itemsPerClass.ContainsKey(names[i])) { foreach (BaseItem baseItem in itemsPerClass[names[i]]) { contentContainer.Add(CreateItemSelectionButton(baseItem)); } } Type currentType = types[i]; Button addButton = new Button { text = "+" }; addButton.clicked += () => CreateNewItem(currentType); addButton.style.alignSelf = new StyleEnum <Align>(Align.Center); addButton.AddToClassList("AddButton"); contentContainer.Add(addButton); categoryContainer.Add(label); categoryContainer.Add(contentContainer); } #endregion #region Selection VisualElement selectionRender = body.Q <VisualElement>("SelectionContainer"); scriptableObjectEdit_View.CloneTree(selectionRender); Image icon = new Image(); IMGUIContainer soRender = selectionRender.Q <IMGUIContainer>("Render"); icon.style.alignSelf = new StyleEnum <Align>(Align.Center); icon.style.height = 100; icon.style.width = 100; icon.style.backgroundColor = new Color(.25f, .25f, .25f); icon.style.marginTop = 10; icon.style.marginBottom = 10; selectionRender.Insert(1, icon); BaseItem selectedItem = _selectedItem; if (selectedItem != null) { BaseItem clone = Instantiate(selectedItem); clone.name = selectedItem.name; Editor editor = Editor.CreateEditor(clone); soRender.onGUIHandler = () => editor.OnInspectorGUI(); if (selectedItem.icon != null) { icon.image = selectedItem.icon.texture; } Button deleteButton = body.Q <Button>("DeleteButton"); deleteButton.clicked += () => DestroyItem(selectedItem); Button saveButton = body.Q <Button>("SaveButton"); saveButton.clicked += () => SaveScriptableObject(clone, selectedItem); Button cancelButton = body.Q <Button>("CancelButton"); cancelButton.clicked += Render; Button changeIdButton = body.Q <Button>("ChangeIdButton"); changeIdButton.clicked += () => ChangeItemName(selectedItem); } #endregion }