Пример #1
0
        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");
     }
 }
Пример #3
0
        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);
        }
Пример #4
0
    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);
                    });
                }
            }
Пример #6
0
        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);
        }
Пример #7
0
        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();
        }
Пример #8
0
    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
    }