static void drawEntityOverview(UnityEntityManager entityManager)
 {
     CustomEditorLayout.BeginVerticalBox();
     {
         EditorGUILayout.LabelField("General", EditorStyles.boldLabel);
         EditorGUILayout.LabelField("Entities", entityManager.TotalEntities.ToString());
         EditorGUILayout.LabelField("Component Types", entityManager.TotalComponentTypes.ToString());
     }
     CustomEditorLayout.EndVertical();
 }
 static void drawSystemsOverview(DebugSystems systems)
 {
     CustomEditorLayout.BeginVerticalBox();
     {
         EditorGUILayout.LabelField(systems.name, EditorStyles.boldLabel);
         EditorGUILayout.LabelField("Start Systems", systems.totalOnStartSystemsCount.ToString());
         EditorGUILayout.LabelField("Update Systems", systems.totalOnUpdateSystemsCount.ToString());
         EditorGUILayout.LabelField("FixedUpdate Systems", systems.totalOnFixedUpdateSystemsCount.ToString());
     }
     CustomEditorLayout.EndVertical();
 }
        void drawSystemsMonitor(DebugSystems systems)
        {
            if (_updateSystemsMonitor == null)
            {
                _updateSystemsMonitor         = new SystemsMonitor(SYSTEM_MONITOR_DATA_LENGTH);
                _fixedUpdateSystemsMonitor    = new SystemsMonitor(SYSTEM_MONITOR_DATA_LENGTH);
                _updateSystemMonitorData      = new Queue <float>(new float[SYSTEM_MONITOR_DATA_LENGTH]);
                _fixedUpdateSystemMonitorData = new Queue <float>(new float[SYSTEM_MONITOR_DATA_LENGTH]);
            }

            CustomEditorLayout.BeginVerticalBox();
            {
                EditorGUILayout.LabelField("Execution duration", EditorStyles.boldLabel);

                CustomEditorLayout.BeginHorizontal();
                {
                    EditorGUILayout.LabelField("Execution duration: ");

                    var buttonStyle = new GUIStyle(GUI.skin.button);
                    if (systems.paused)
                    {
                        buttonStyle.normal = GUI.skin.button.active;
                    }
                    if (GUILayout.Button("▌▌", buttonStyle, GUILayout.Width(50)))
                    {
                        systems.paused = !systems.paused;
                    }
                    if (GUILayout.Button("Step", GUILayout.Width(50)))
                    {
                        systems.paused = true;
                        systems.StepExecuteOnUpdate();
                        systems.StepExecuteOnFixedUpdate();
                        addDuration(_updateSystemMonitorData, (float)systems.updateExecutionDuration);
                        addDuration(_fixedUpdateSystemMonitorData, (float)systems.fixedUpdateExecutionDuration);
                    }
                }
                CustomEditorLayout.EndHorizontal();

                if (!EditorApplication.isPaused && !systems.paused)
                {
                    addDuration(_updateSystemMonitorData, (float)systems.updateExecutionDuration);
                    addDuration(_fixedUpdateSystemMonitorData, (float)systems.fixedUpdateExecutionDuration);
                    _lastRenderedFrameCount = Time.renderedFrameCount;
                }

                EditorGUILayout.LabelField("Update Execution duration:", systems.updateExecutionDuration.ToString() + " ms");
                _updateSystemsMonitor.Draw(_updateSystemMonitorData.ToArray(), 80f);

                EditorGUILayout.LabelField("Fixed Update Execution duration: ", systems.fixedUpdateExecutionDuration.ToString() + " ms");
                _fixedUpdateSystemsMonitor.Draw(_fixedUpdateSystemMonitorData.ToArray(), 80f);
            }
            CustomEditorLayout.EndVertical();
        }
        static void drawEntityList(UnityEntityManager entityManager)
        {
            CustomEditorLayout.BeginVerticalBox();
            EditorGUILayout.LabelField("Entity Inspector", EditorStyles.boldLabel);

            _filteredComponents = CustomEditorLayout.SearchTextField(_filteredComponents);
            IEnumerable <string> componentNames = _filteredComponents.Split('-', ' ', ';', ',')
                                                  .Where(name => !string.IsNullOrEmpty(name))
                                                  .Select(name => name.ToLower());

            foreach (EntityInfo entityInfo in entityManager.EntityList)
            {
                IEnumerable <IComponent> components = entityManager.GetComponents(entityInfo);
                entityInfo.Name = "{" + string.Join("} - {", components.Select(x => x.GetType().Name).ToArray()) + "}";
                var entityName = entityInfo.Name.ToLower();
                if (componentNames.Any() && componentNames.Where(name => entityName.Contains(name)).Count() != componentNames.Count())
                {
                    continue;
                }

                entityInfo.expanded = EditorGUILayout.BeginToggleGroup(entityInfo.Name, entityInfo.expanded);
                EditorGUI.indentLevel++;
                if (entityInfo.expanded)
                {
                    foreach (IComponent component in components)
                    {
                        var style = GetColoredBoxStyle(component);
                        EditorGUILayout.BeginVertical(style, GUILayout.Height(50));
                        EditorGUILayout.LabelField(component.GetType().Name, EditorStyles.boldLabel);
                        EditorGUILayout.EndVertical();
                    }
                }
                EditorGUI.indentLevel--;
                EditorGUILayout.EndToggleGroup();
            }
            CustomEditorLayout.EndVertical();
        }
        int drawSystemInfos(DebugSystems systems, bool isChildSystem, bool start = false, bool update = false, bool fixedUpdate = false)
        {
            SystemInfo[] systemInfos = null;

            var drawExecutionDuration = false;

            if (start)
            {
                systemInfos = systems.startSystemInfos;
            }
            if (update)
            {
                systemInfos           = systems.updateSystemInfos;
                drawExecutionDuration = true;
            }
            if (fixedUpdate)
            {
                systemInfos           = systems.fixedUpdateSystemInfos;
                drawExecutionDuration = true;
            }

            systemInfos = systemInfos
                          .Where(systemInfo => systemInfo.AverageExecutionDuration >= _threshold)
                          .ToArray();

            systemInfos = getSortedSystemInfos(systemInfos, _systemSortMethod);

            var systemsDrawn = 0;

            foreach (var systemInfo in systemInfos)
            {
                var debugSystems = systemInfo.system as DebugSystems;
                if (debugSystems != null)
                {
                    if (!shouldShowSystems(debugSystems, start, update, fixedUpdate))
                    {
                        continue;
                    }
                }

                //if (!shouldShowSystems(systems, start, update, fixedUpdate)) {
                //    continue;
                //}


                if (CustomEditorLayout.MatchesSearchString(systemInfo.systemName.ToLower(), _systemNameSearchString.ToLower()))
                {
                    CustomEditorLayout.BeginHorizontal();
                    {
                        EditorGUI.BeginDisabledGroup(isChildSystem);
                        {
                            systemInfo.isActive = EditorGUILayout.Toggle(systemInfo.isActive, GUILayout.Width(20));
                        }
                        EditorGUI.EndDisabledGroup();

                        if (drawExecutionDuration)
                        {
                            var avg = string.Format("Ø {0:00.000 ms}", systemInfo.AverageExecutionDuration).PadRight(12);
                            var min = string.Format("▼ {0:00.000 ms}", systemInfo.MinExecutionDuration).PadRight(12);
                            var max = string.Format("▲ {0:00.000 ms}", systemInfo.MaxExecutionDuration);
                            EditorGUILayout.LabelField(systemInfo.systemName, avg + min + max, getSystemStyle(systemInfo));
                        }
                        else
                        {
                            EditorGUILayout.LabelField(systemInfo.systemName, getSystemStyle(systemInfo));
                        }
                    }
                    CustomEditorLayout.EndHorizontal();

                    systemsDrawn += 1;
                }

                var debugSystem = systemInfo.system as DebugSystems;
                if (debugSystem != null)
                {
                    var indent = EditorGUI.indentLevel;
                    EditorGUI.indentLevel += 1;
                    systemsDrawn          += drawSystemInfos(debugSystem, true, start, update, fixedUpdate);
                    EditorGUI.indentLevel  = indent;
                }
            }

            return(systemsDrawn);
        }
        private void drawSystemList(DebugSystems system)
        {
            CustomEditorLayout.BeginVerticalBox();
            {
                CustomEditorLayout.BeginHorizontal();
                {
                    DebugSystems.avgResetInterval = (AvgResetInterval)EditorGUILayout.EnumPopup("Reset average duration Ø", DebugSystems.avgResetInterval);
                    if (GUILayout.Button("Reset Ø now", GUILayout.Width(88), GUILayout.Height(14)))
                    {
                        system.ResetDuration();
                    }
                }
                CustomEditorLayout.EndHorizontal();

                _threshold        = EditorGUILayout.Slider("Threshold Ø ms", _threshold, 0f, 33f);
                _systemSortMethod = (SortMethod)EditorGUILayout.EnumPopup("Sort by ", _systemSortMethod);
                _hideEmptySystems = EditorGUILayout.Toggle("Hide empty systems", _hideEmptySystems);
                EditorGUILayout.Space();

                _systemNameSearchString = CustomEditorLayout.SearchTextField(_systemNameSearchString);
                EditorGUILayout.Space();

                _showStartSystems = CustomEditorLayout.Foldout(_showStartSystems, "OnStart Systems");
                if (_showStartSystems && shouldShowSystems(system, start: true))
                {
                    CustomEditorLayout.BeginVerticalBox();
                    {
                        var systemsDrawn = drawSystemInfos(system, false, start: true);
                        if (systemsDrawn == 0)
                        {
                            EditorGUILayout.LabelField(string.Empty);
                        }
                    }
                    CustomEditorLayout.EndVertical();
                }

                _showUpdateSystems = CustomEditorLayout.Foldout(_showUpdateSystems, "OnUpdate Systems");
                if (_showUpdateSystems && shouldShowSystems(system, update: true))
                {
                    CustomEditorLayout.BeginVerticalBox();
                    {
                        var systemsDrawn = drawSystemInfos(system, false, update: true);
                        if (systemsDrawn == 0)
                        {
                            EditorGUILayout.LabelField(string.Empty);
                        }
                    }
                    CustomEditorLayout.EndVertical();
                }

                _showFixedUpdateSystems = CustomEditorLayout.Foldout(_showFixedUpdateSystems, "OnFixedUpdate Systems");
                if (_showFixedUpdateSystems && shouldShowSystems(system, fixedUpdate: true))
                {
                    CustomEditorLayout.BeginVerticalBox();
                    {
                        var systemsDrawn = drawSystemInfos(system, false, fixedUpdate: true);
                        if (systemsDrawn == 0)
                        {
                            EditorGUILayout.LabelField(string.Empty);
                        }
                    }
                    CustomEditorLayout.EndVertical();
                }
            }
            CustomEditorLayout.EndVertical();
        }