// Present the log entry in the console private void ProcessLog(QueuedDebugLogEntry queuedLogEntry) { LogType logType = queuedLogEntry.logType; DebugLogEntry logEntry; if (pooledLogEntries.Count > 0) { logEntry = pooledLogEntries[pooledLogEntries.Count - 1]; pooledLogEntries.RemoveAt(pooledLogEntries.Count - 1); } else { logEntry = new DebugLogEntry(); } logEntry.Initialize(queuedLogEntry.logString, queuedLogEntry.stackTrace); // Check if this entry is a duplicate (i.e. has been received before) int logEntryIndex; bool isEntryInCollapsedEntryList = collapsedLogEntriesMap.TryGetValue(logEntry, out logEntryIndex); if (!isEntryInCollapsedEntryList) { // It is not a duplicate, // add it to the list of unique debug entries logEntry.logTypeSpriteRepresentation = logSpriteRepresentations[logType]; logEntryIndex = collapsedLogEntries.Count; collapsedLogEntries.Add(logEntry); collapsedLogEntriesMap[logEntry] = logEntryIndex; } else { // It is a duplicate, pool the duplicate log entry and // increment the original debug item's collapsed count pooledLogEntries.Add(logEntry); logEntry = collapsedLogEntries[logEntryIndex]; logEntry.count++; } // Add the index of the unique debug entry to the list // that stores the order the debug entries are received uncollapsedLogEntriesIndices.Add(logEntryIndex); // If this debug entry matches the current filters, // add it to the list of debug entries to show int logEntryIndexInEntriesToShow = -1; Sprite logTypeSpriteRepresentation = logEntry.logTypeSpriteRepresentation; if (isCollapseOn && isEntryInCollapsedEntryList) { if (isLogWindowVisible) { if (!isInSearchMode && logFilter == DebugLogFilter.All) { logEntryIndexInEntriesToShow = logEntryIndex; } else { logEntryIndexInEntriesToShow = indicesOfListEntriesToShow.IndexOf(logEntryIndex); } recycledListView.OnCollapsedLogEntryAtIndexUpdated(logEntryIndexInEntriesToShow); } } else if ((!isInSearchMode || queuedLogEntry.MatchesSearchTerm(searchTerm)) && (logFilter == DebugLogFilter.All || (logTypeSpriteRepresentation == infoLog && ((logFilter & DebugLogFilter.Info) == DebugLogFilter.Info)) || (logTypeSpriteRepresentation == warningLog && ((logFilter & DebugLogFilter.Warning) == DebugLogFilter.Warning)) || (logTypeSpriteRepresentation == errorLog && ((logFilter & DebugLogFilter.Error) == DebugLogFilter.Error)))) { indicesOfListEntriesToShow.Add(logEntryIndex); logEntryIndexInEntriesToShow = indicesOfListEntriesToShow.Count - 1; if (isLogWindowVisible) { recycledListView.OnLogEntriesUpdated(false); } } if (logType == LogType.Log) { infoEntryCount++; infoEntryCountText.text = infoEntryCount.ToString(); // If debug popup is visible, notify it of the new debug entry if (!isLogWindowVisible) { popupManager.NewInfoLogArrived(); } } else if (logType == LogType.Warning) { warningEntryCount++; warningEntryCountText.text = warningEntryCount.ToString(); // If debug popup is visible, notify it of the new debug entry if (!isLogWindowVisible) { popupManager.NewWarningLogArrived(); } } else { errorEntryCount++; errorEntryCountText.text = errorEntryCount.ToString(); // If debug popup is visible, notify it of the new debug entry if (!isLogWindowVisible) { popupManager.NewErrorLogArrived(); } } // Automatically expand this log if necessary if (pendingLogToAutoExpand > 0 && --pendingLogToAutoExpand <= 0 && isLogWindowVisible && logEntryIndexInEntriesToShow >= 0) { recycledListView.SelectAndFocusOnLogItemAtIndex(logEntryIndexInEntriesToShow); } }