forked from Misaki/GhostEngine
Updated target frameworks to .NET 10.0 across multiple projects for compatibility with the latest features. Refactored namespaces and introduced new classes for shader descriptors, FMOD integration, and DirectX 12 utilities using TerraFX. Replaced `Win32` bindings with TerraFX equivalents for DirectX 12. Added a C# wrapper for FMOD Studio API, including DSP and error handling. Enhanced entity queries, component storage, and query filters for better performance and type safety. Introduced new test projects and updated the solution structure. Added `meshoptimizer` bindings and integrated `meshoptimizer_native.dll`. Improved code readability, maintainability, and performance.
165 lines
4.7 KiB
C#
165 lines
4.7 KiB
C#
using Ghost.UnitTest.Models;
|
||
using Ghost.UnitTest.Services;
|
||
using Microsoft.UI;
|
||
using Microsoft.UI.Xaml;
|
||
using Microsoft.UI.Xaml.Controls;
|
||
using Microsoft.UI.Xaml.Data;
|
||
using Microsoft.UI.Xaml.Media;
|
||
using System.Collections.ObjectModel;
|
||
|
||
namespace Ghost.UnitTest.Controls;
|
||
|
||
public sealed partial class DebugConsole : UserControl
|
||
{
|
||
private readonly ObservableCollection<LogItem> _filteredLogs = [];
|
||
private readonly LoggingService _loggingService;
|
||
|
||
public DebugConsole()
|
||
{
|
||
InitializeComponent();
|
||
_loggingService = LoggingService.Instance;
|
||
|
||
LogItemsRepeater.ItemsSource = _filteredLogs;
|
||
|
||
// Subscribe to logging events
|
||
_loggingService.LogAdded += OnLogAdded;
|
||
_loggingService.LogsCleared += OnLogsCleared;
|
||
|
||
// Subscribe to filter changes
|
||
ShowInfoCheckBox.Checked += OnFilterChanged;
|
||
ShowInfoCheckBox.Unchecked += OnFilterChanged;
|
||
ShowWarningCheckBox.Checked += OnFilterChanged;
|
||
ShowWarningCheckBox.Unchecked += OnFilterChanged;
|
||
ShowErrorCheckBox.Checked += OnFilterChanged;
|
||
ShowErrorCheckBox.Unchecked += OnFilterChanged;
|
||
ShowDebugCheckBox.Checked += OnFilterChanged;
|
||
ShowDebugCheckBox.Unchecked += OnFilterChanged;
|
||
|
||
// Load existing logs
|
||
RefreshLogs();
|
||
}
|
||
|
||
private void OnLogAdded(LogItem logItem)
|
||
{
|
||
DispatcherQueue.TryEnqueue(() =>
|
||
{
|
||
if (ShouldShowLogItem(logItem))
|
||
{
|
||
_filteredLogs.Add(logItem);
|
||
|
||
if (AutoScrollCheckBox.IsChecked == true)
|
||
{
|
||
LogScrollViewer.ScrollToVerticalOffset(LogScrollViewer.ScrollableHeight);
|
||
}
|
||
}
|
||
});
|
||
}
|
||
|
||
private void OnLogsCleared()
|
||
{
|
||
DispatcherQueue.TryEnqueue(() =>
|
||
{
|
||
_filteredLogs.Clear();
|
||
});
|
||
}
|
||
|
||
private void OnFilterChanged(object sender, RoutedEventArgs e)
|
||
{
|
||
RefreshLogs();
|
||
}
|
||
|
||
private bool ShouldShowLogItem(LogItem logItem)
|
||
{
|
||
return logItem.Level switch
|
||
{
|
||
LogLevel.Info => ShowInfoCheckBox.IsChecked == true,
|
||
LogLevel.Warning => ShowWarningCheckBox.IsChecked == true,
|
||
LogLevel.Error => ShowErrorCheckBox.IsChecked == true,
|
||
LogLevel.Debug => ShowDebugCheckBox.IsChecked == true,
|
||
_ => true
|
||
};
|
||
}
|
||
|
||
private void RefreshLogs()
|
||
{
|
||
_filteredLogs.Clear();
|
||
|
||
foreach (var log in _loggingService.Logs)
|
||
{
|
||
if (ShouldShowLogItem(log))
|
||
{
|
||
_filteredLogs.Add(log);
|
||
}
|
||
}
|
||
|
||
if (AutoScrollCheckBox.IsChecked == true)
|
||
{
|
||
LogScrollViewer.ScrollToVerticalOffset(LogScrollViewer.ScrollableHeight);
|
||
}
|
||
}
|
||
|
||
private void ClearButton_Click(object sender, RoutedEventArgs e)
|
||
{
|
||
_loggingService.Clear();
|
||
}
|
||
|
||
private void ShowStackTraceCheckBox_Checked(object sender, RoutedEventArgs e)
|
||
{
|
||
_loggingService.CaptureStackTrace = true;
|
||
}
|
||
|
||
private void ShowStackTraceCheckBox_Unchecked(object sender, RoutedEventArgs e)
|
||
{
|
||
_loggingService.CaptureStackTrace = false;
|
||
}
|
||
}
|
||
|
||
// Converter for log level to color
|
||
public class LogLevelToColorConverter : IValueConverter
|
||
{
|
||
public object Convert(object value, Type targetType, object parameter, string language)
|
||
{
|
||
if (value is LogLevel level)
|
||
{
|
||
return level switch
|
||
{
|
||
LogLevel.Info => new SolidColorBrush(Colors.DodgerBlue),
|
||
LogLevel.Warning => new SolidColorBrush(Colors.Orange),
|
||
LogLevel.Error => new SolidColorBrush(Colors.Red),
|
||
LogLevel.Debug => new SolidColorBrush(Colors.Gray),
|
||
_ => new SolidColorBrush(Colors.Black)
|
||
};
|
||
}
|
||
return new SolidColorBrush(Colors.Black);
|
||
}
|
||
|
||
public object ConvertBack(object value, Type targetType, object parameter, string language)
|
||
{
|
||
throw new NotImplementedException();
|
||
}
|
||
}
|
||
|
||
// Converter for log level to symbol
|
||
public class LogLevelToSymbolConverter : IValueConverter
|
||
{
|
||
public object Convert(object value, Type targetType, object parameter, string language)
|
||
{
|
||
if (value is LogLevel level)
|
||
{
|
||
return level switch
|
||
{
|
||
LogLevel.Info => "ℹ",
|
||
LogLevel.Warning => "⚠",
|
||
LogLevel.Error => "✖",
|
||
LogLevel.Debug => "🐛",
|
||
_ => "•"
|
||
};
|
||
}
|
||
return "•";
|
||
}
|
||
|
||
public object ConvertBack(object value, Type targetType, object parameter, string language)
|
||
{
|
||
throw new NotImplementedException();
|
||
}
|
||
} |