diff --git a/src/Artemis.UI.Avalonia/Artemis.UI.Avalonia.csproj b/src/Artemis.UI.Avalonia/Artemis.UI.Avalonia.csproj
index 0ef45a871..62c11bbd0 100644
--- a/src/Artemis.UI.Avalonia/Artemis.UI.Avalonia.csproj
+++ b/src/Artemis.UI.Avalonia/Artemis.UI.Avalonia.csproj
@@ -35,6 +35,18 @@
%(Filename)
+
+ %(Filename)
+
+
+ %(Filename)
+
+
+ %(Filename)
+
+
+ %(Filename)
+
%(Filename)
diff --git a/src/Artemis.UI.Avalonia/Ninject/Factories/IVMFactory.cs b/src/Artemis.UI.Avalonia/Ninject/Factories/IVMFactory.cs
index d1066fe06..52ee5432e 100644
--- a/src/Artemis.UI.Avalonia/Ninject/Factories/IVMFactory.cs
+++ b/src/Artemis.UI.Avalonia/Ninject/Factories/IVMFactory.cs
@@ -1,6 +1,7 @@
using System.Collections.ObjectModel;
using Artemis.Core;
-using Artemis.UI.Avalonia.Screens.Device.ViewModels;
+using Artemis.UI.Avalonia.Screens.Device;
+using Artemis.UI.Avalonia.Screens.Device.Tabs.ViewModels;
using Artemis.UI.Avalonia.Screens.Root.ViewModels;
using Artemis.UI.Avalonia.Screens.SurfaceEditor.ViewModels;
using ReactiveUI;
diff --git a/src/Artemis.UI.Avalonia/Screens/Debugger/DebugView.axaml b/src/Artemis.UI.Avalonia/Screens/Debugger/DebugView.axaml
new file mode 100644
index 000000000..7867c29a0
--- /dev/null
+++ b/src/Artemis.UI.Avalonia/Screens/Debugger/DebugView.axaml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+ Test
+
+
+
+ Test
+
+
+
+
\ No newline at end of file
diff --git a/src/Artemis.UI.Avalonia/Screens/Debugger/DebugView.axaml.cs b/src/Artemis.UI.Avalonia/Screens/Debugger/DebugView.axaml.cs
new file mode 100644
index 000000000..dc5c68597
--- /dev/null
+++ b/src/Artemis.UI.Avalonia/Screens/Debugger/DebugView.axaml.cs
@@ -0,0 +1,53 @@
+using System;
+using System.Reactive.Disposables;
+using Artemis.UI.Avalonia.Shared.Events;
+using Avalonia.Controls;
+using Avalonia.Markup.Xaml;
+using Avalonia.ReactiveUI;
+using FluentAvalonia.Core;
+using FluentAvalonia.UI.Controls;
+using ReactiveUI;
+
+namespace Artemis.UI.Avalonia.Screens.Debugger
+{
+ public class DebugView : ReactiveWindow
+ {
+ private readonly NavigationView _navigation;
+
+ public DebugView()
+ {
+ Activated += OnActivated;
+ Deactivated += OnDeactivated;
+ InitializeComponent();
+
+ _navigation = this.Get("Navigation");
+ this.WhenActivated(d =>
+ {
+ ViewModel!.WhenAnyValue(vm => vm!.IsActive).Subscribe(_ => Activate()).DisposeWith(d);
+ ViewModel!.SelectedItem = (NavigationViewItem) _navigation.MenuItems.ElementAt(0);
+ });
+ }
+
+ private void InitializeComponent()
+ {
+ AvaloniaXamlLoader.Load(this);
+ }
+
+ private void OnDeactivated(object? sender, EventArgs e)
+ {
+ if (ViewModel != null)
+ ViewModel.IsActive = false;
+ }
+
+ private void OnActivated(object? sender, EventArgs e)
+ {
+ if (ViewModel != null)
+ ViewModel.IsActive = true;
+ }
+
+ private void DeviceVisualizer_OnLedClicked(object? sender, LedClickedEventArgs e)
+ {
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Artemis.UI.Avalonia/Screens/Debugger/DebugViewModel.cs b/src/Artemis.UI.Avalonia/Screens/Debugger/DebugViewModel.cs
new file mode 100644
index 000000000..967de423c
--- /dev/null
+++ b/src/Artemis.UI.Avalonia/Screens/Debugger/DebugViewModel.cs
@@ -0,0 +1,76 @@
+using System;
+using System.Reactive.Disposables;
+using Artemis.UI.Avalonia.Screens.Debugger.Tabs.DataModel;
+using Artemis.UI.Avalonia.Screens.Debugger.Tabs.Logs;
+using Artemis.UI.Avalonia.Screens.Debugger.Tabs.Performance;
+using Artemis.UI.Avalonia.Screens.Debugger.Tabs.Render;
+using Artemis.UI.Avalonia.Services.Interfaces;
+using FluentAvalonia.UI.Controls;
+using Ninject;
+using Ninject.Parameters;
+using ReactiveUI;
+
+namespace Artemis.UI.Avalonia.Screens.Debugger
+{
+ public class DebugViewModel : ActivatableViewModelBase, IScreen
+ {
+ private readonly IKernel _kernel;
+ private readonly IDebugService _debugService;
+ private bool _isActive;
+ private NavigationViewItem? _selectedItem;
+
+ public DebugViewModel(IKernel kernel, IDebugService debugService)
+ {
+ _kernel = kernel;
+ _debugService = debugService;
+
+ this.WhenAnyValue(x => x.SelectedItem).WhereNotNull().Subscribe(NavigateToSelectedItem);
+ this.WhenActivated(disposables =>
+ {
+ Disposable
+ .Create(HandleDeactivation)
+ .DisposeWith(disposables);
+ });
+ }
+
+ public bool IsActive
+ {
+ get => _isActive;
+ set => this.RaiseAndSetIfChanged(ref _isActive, value);
+ }
+
+ public NavigationViewItem? SelectedItem
+ {
+ get => _selectedItem;
+ set => this.RaiseAndSetIfChanged(ref _selectedItem, value);
+ }
+
+ private void NavigateToSelectedItem(NavigationViewItem item)
+ {
+ // Kind of a lame way to do this but it's so static idc
+ ConstructorArgument hostScreen = new("hostScreen", this);
+ switch ((string) item.Content)
+ {
+ case "Rendering":
+ Router.Navigate.Execute(_kernel.Get(hostScreen));
+ break;
+ case "Logs":
+ Router.Navigate.Execute(_kernel.Get(hostScreen));
+ break;
+ case "Data Model":
+ Router.Navigate.Execute(_kernel.Get(hostScreen));
+ break;
+ case "Performance":
+ Router.Navigate.Execute(_kernel.Get(hostScreen));
+ break;
+ }
+ }
+
+ private void HandleDeactivation()
+ {
+ _debugService.ClearDebugger();
+ }
+
+ public RoutingState Router { get; } = new();
+ }
+}
\ No newline at end of file
diff --git a/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/DataModel/DataModelDebugView.axaml b/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/DataModel/DataModelDebugView.axaml
new file mode 100644
index 000000000..d82578a19
--- /dev/null
+++ b/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/DataModel/DataModelDebugView.axaml
@@ -0,0 +1,8 @@
+
+ Data Model
+
\ No newline at end of file
diff --git a/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/DataModel/DataModelDebugView.axaml.cs b/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/DataModel/DataModelDebugView.axaml.cs
new file mode 100644
index 000000000..edc26496f
--- /dev/null
+++ b/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/DataModel/DataModelDebugView.axaml.cs
@@ -0,0 +1,18 @@
+using Avalonia.Markup.Xaml;
+using Avalonia.ReactiveUI;
+
+namespace Artemis.UI.Avalonia.Screens.Debugger.Tabs.DataModel
+{
+ public class DataModelDebugView : ReactiveUserControl
+ {
+ public DataModelDebugView()
+ {
+ InitializeComponent();
+ }
+
+ private void InitializeComponent()
+ {
+ AvaloniaXamlLoader.Load(this);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/DataModel/DataModelDebugViewModel.cs b/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/DataModel/DataModelDebugViewModel.cs
new file mode 100644
index 000000000..bbc5f996e
--- /dev/null
+++ b/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/DataModel/DataModelDebugViewModel.cs
@@ -0,0 +1,15 @@
+using ReactiveUI;
+
+namespace Artemis.UI.Avalonia.Screens.Debugger.Tabs.DataModel
+{
+ public class DataModelDebugViewModel : ActivatableViewModelBase, IRoutableViewModel
+ {
+ public DataModelDebugViewModel(IScreen hostScreen)
+ {
+ HostScreen = hostScreen;
+ }
+
+ public string UrlPathSegment => "data-model";
+ public IScreen HostScreen { get; }
+ }
+}
\ No newline at end of file
diff --git a/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/Logs/LogsDebugView.axaml b/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/Logs/LogsDebugView.axaml
new file mode 100644
index 000000000..ffd33b22d
--- /dev/null
+++ b/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/Logs/LogsDebugView.axaml
@@ -0,0 +1,8 @@
+
+ Logs
+
\ No newline at end of file
diff --git a/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/Logs/LogsDebugView.axaml.cs b/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/Logs/LogsDebugView.axaml.cs
new file mode 100644
index 000000000..d2cd7b97c
--- /dev/null
+++ b/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/Logs/LogsDebugView.axaml.cs
@@ -0,0 +1,18 @@
+using Avalonia.Markup.Xaml;
+using Avalonia.ReactiveUI;
+
+namespace Artemis.UI.Avalonia.Screens.Debugger.Tabs.Logs
+{
+ public class LogsDebugView : ReactiveUserControl
+ {
+ public LogsDebugView()
+ {
+ InitializeComponent();
+ }
+
+ private void InitializeComponent()
+ {
+ AvaloniaXamlLoader.Load(this);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/Logs/LogsDebugViewModel.cs b/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/Logs/LogsDebugViewModel.cs
new file mode 100644
index 000000000..bca2adce5
--- /dev/null
+++ b/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/Logs/LogsDebugViewModel.cs
@@ -0,0 +1,15 @@
+using ReactiveUI;
+
+namespace Artemis.UI.Avalonia.Screens.Debugger.Tabs.Logs
+{
+ public class LogsDebugViewModel : ActivatableViewModelBase, IRoutableViewModel
+ {
+ public LogsDebugViewModel(IScreen hostScreen)
+ {
+ HostScreen = hostScreen;
+ }
+
+ public string UrlPathSegment => "logs";
+ public IScreen HostScreen { get; }
+ }
+}
\ No newline at end of file
diff --git a/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/Performance/PerformanceDebugView.axaml b/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/Performance/PerformanceDebugView.axaml
new file mode 100644
index 000000000..8641a964d
--- /dev/null
+++ b/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/Performance/PerformanceDebugView.axaml
@@ -0,0 +1,8 @@
+
+ Performance
+
\ No newline at end of file
diff --git a/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/Performance/PerformanceDebugView.axaml.cs b/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/Performance/PerformanceDebugView.axaml.cs
new file mode 100644
index 000000000..ed3608aae
--- /dev/null
+++ b/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/Performance/PerformanceDebugView.axaml.cs
@@ -0,0 +1,18 @@
+using Avalonia.Markup.Xaml;
+using Avalonia.ReactiveUI;
+
+namespace Artemis.UI.Avalonia.Screens.Debugger.Tabs.Performance
+{
+ public class PerformanceDebugView : ReactiveUserControl
+ {
+ public PerformanceDebugView()
+ {
+ InitializeComponent();
+ }
+
+ private void InitializeComponent()
+ {
+ AvaloniaXamlLoader.Load(this);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/Performance/PerformanceDebugViewModel.cs b/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/Performance/PerformanceDebugViewModel.cs
new file mode 100644
index 000000000..922bb501c
--- /dev/null
+++ b/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/Performance/PerformanceDebugViewModel.cs
@@ -0,0 +1,15 @@
+using ReactiveUI;
+
+namespace Artemis.UI.Avalonia.Screens.Debugger.Tabs.Performance
+{
+ public class PerformanceDebugViewModel : ActivatableViewModelBase, IRoutableViewModel
+ {
+ public PerformanceDebugViewModel(IScreen hostScreen)
+ {
+ HostScreen = hostScreen;
+ }
+
+ public string UrlPathSegment => "performance";
+ public IScreen HostScreen { get; }
+ }
+}
\ No newline at end of file
diff --git a/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/Render/RenderDebugView.axaml b/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/Render/RenderDebugView.axaml
new file mode 100644
index 000000000..ef59cd8fc
--- /dev/null
+++ b/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/Render/RenderDebugView.axaml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+ Render
+
+
+
+
\ No newline at end of file
diff --git a/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/Render/RenderDebugView.axaml.cs b/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/Render/RenderDebugView.axaml.cs
new file mode 100644
index 000000000..97da511c8
--- /dev/null
+++ b/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/Render/RenderDebugView.axaml.cs
@@ -0,0 +1,18 @@
+using Avalonia.Markup.Xaml;
+using Avalonia.ReactiveUI;
+
+namespace Artemis.UI.Avalonia.Screens.Debugger.Tabs.Render
+{
+ public class RenderDebugView : ReactiveUserControl
+ {
+ public RenderDebugView()
+ {
+ InitializeComponent();
+ }
+
+ private void InitializeComponent()
+ {
+ AvaloniaXamlLoader.Load(this);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/Render/RenderDebugViewModel.cs b/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/Render/RenderDebugViewModel.cs
new file mode 100644
index 000000000..eda43abca
--- /dev/null
+++ b/src/Artemis.UI.Avalonia/Screens/Debugger/Tabs/Render/RenderDebugViewModel.cs
@@ -0,0 +1,118 @@
+using System.IO;
+using System.Reactive.Disposables;
+using System.Timers;
+using Artemis.Core;
+using Artemis.Core.Services;
+using ReactiveUI;
+using SkiaSharp;
+
+namespace Artemis.UI.Avalonia.Screens.Debugger.Tabs.Render
+{
+ public class RenderDebugViewModel : ActivatableViewModelBase, IRoutableViewModel
+ {
+ private readonly ICoreService _coreService;
+ private readonly Timer _fpsTimer;
+ private double _currentFps;
+
+ private SKImage? _currentFrame;
+ private int _frames;
+ private string? _frameTargetPath;
+ private string _renderer;
+ private int _renderHeight;
+ private int _renderWidth;
+
+ public RenderDebugViewModel(DebugViewModel hostScreen, ICoreService coreService)
+ {
+ HostScreen = hostScreen;
+
+ _coreService = coreService;
+ _fpsTimer = new Timer(1000);
+ _fpsTimer.Start();
+
+ this.WhenActivated(disposables =>
+ {
+ HandleActivation();
+ Disposable.Create(HandleDeactivation).DisposeWith(disposables);
+ });
+ }
+
+ public SKImage? CurrentFrame
+ {
+ get => _currentFrame;
+ set => this.RaiseAndSetIfChanged(ref _currentFrame, value);
+ }
+
+ public double CurrentFps
+ {
+ get => _currentFps;
+ set => this.RaiseAndSetIfChanged(ref _currentFps, value);
+ }
+
+ public int RenderWidth
+ {
+ get => _renderWidth;
+ set => this.RaiseAndSetIfChanged(ref _renderWidth, value);
+ }
+
+ public int RenderHeight
+ {
+ get => _renderHeight;
+ set => this.RaiseAndSetIfChanged(ref _renderHeight, value);
+ }
+
+ public string Renderer
+ {
+ get => _renderer;
+ set => this.RaiseAndSetIfChanged(ref _renderer, value);
+ }
+
+ private void HandleActivation()
+ {
+ _coreService.FrameRendered += CoreServiceOnFrameRendered;
+ _fpsTimer.Elapsed += FpsTimerOnElapsed;
+ }
+
+ private void HandleDeactivation()
+ {
+ _coreService.FrameRendered -= CoreServiceOnFrameRendered;
+ _fpsTimer.Elapsed -= FpsTimerOnElapsed;
+ _fpsTimer.Dispose();
+ }
+
+ private void CoreServiceOnFrameRendered(object? sender, FrameRenderedEventArgs e)
+ {
+ _frames++;
+
+ using SKImage skImage = e.Texture.Surface.Snapshot();
+ SKImageInfo bitmapInfo = e.Texture.ImageInfo;
+
+ if (_frameTargetPath != null)
+ {
+ using (SKData data = skImage.Encode(SKEncodedImageFormat.Png, 100))
+ {
+ using (FileStream stream = File.OpenWrite(_frameTargetPath))
+ {
+ data.SaveTo(stream);
+ }
+ }
+
+ _frameTargetPath = null;
+ }
+
+ RenderHeight = bitmapInfo.Height;
+ RenderWidth = bitmapInfo.Width;
+
+ CurrentFrame = e.Texture.Surface.Snapshot();
+ }
+
+ private void FpsTimerOnElapsed(object sender, ElapsedEventArgs e)
+ {
+ CurrentFps = _frames;
+ Renderer = Constants.ManagedGraphicsContext != null ? Constants.ManagedGraphicsContext.GetType().Name : "Software";
+ _frames = 0;
+ }
+
+ public string UrlPathSegment => "render";
+ public IScreen HostScreen { get; }
+ }
+}
\ No newline at end of file
diff --git a/src/Artemis.UI.Avalonia/Screens/Device/Views/DevicePropertiesView.axaml b/src/Artemis.UI.Avalonia/Screens/Device/DevicePropertiesView.axaml
similarity index 97%
rename from src/Artemis.UI.Avalonia/Screens/Device/Views/DevicePropertiesView.axaml
rename to src/Artemis.UI.Avalonia/Screens/Device/DevicePropertiesView.axaml
index 23c5676a5..78b19a2da 100644
--- a/src/Artemis.UI.Avalonia/Screens/Device/Views/DevicePropertiesView.axaml
+++ b/src/Artemis.UI.Avalonia/Screens/Device/DevicePropertiesView.axaml
@@ -4,7 +4,7 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:controls="clr-namespace:Artemis.UI.Avalonia.Shared.Controls;assembly=Artemis.UI.Avalonia.Shared"
mc:Ignorable="d" d:DesignWidth="1200" d:DesignHeight="800"
- x:Class="Artemis.UI.Avalonia.Screens.Device.Views.DevicePropertiesView"
+ x:Class="Artemis.UI.Avalonia.Screens.Device.DevicePropertiesView"
Title="Artemis | Device Properties"
Width="1250"
Height="900"
diff --git a/src/Artemis.UI.Avalonia/Screens/Device/Views/DevicePropertiesView.axaml.cs b/src/Artemis.UI.Avalonia/Screens/Device/DevicePropertiesView.axaml.cs
similarity index 76%
rename from src/Artemis.UI.Avalonia/Screens/Device/Views/DevicePropertiesView.axaml.cs
rename to src/Artemis.UI.Avalonia/Screens/Device/DevicePropertiesView.axaml.cs
index 873a57126..7fce03fb9 100644
--- a/src/Artemis.UI.Avalonia/Screens/Device/Views/DevicePropertiesView.axaml.cs
+++ b/src/Artemis.UI.Avalonia/Screens/Device/DevicePropertiesView.axaml.cs
@@ -1,10 +1,8 @@
-using Artemis.UI.Avalonia.Screens.Device.ViewModels;
using Avalonia;
-using Avalonia.Controls;
using Avalonia.Markup.Xaml;
using Avalonia.ReactiveUI;
-namespace Artemis.UI.Avalonia.Screens.Device.Views
+namespace Artemis.UI.Avalonia.Screens.Device
{
public partial class DevicePropertiesView : ReactiveWindow
{
diff --git a/src/Artemis.UI.Avalonia/Screens/Device/ViewModels/DevicePropertiesViewModel.cs b/src/Artemis.UI.Avalonia/Screens/Device/DevicePropertiesViewModel.cs
similarity index 95%
rename from src/Artemis.UI.Avalonia/Screens/Device/ViewModels/DevicePropertiesViewModel.cs
rename to src/Artemis.UI.Avalonia/Screens/Device/DevicePropertiesViewModel.cs
index 26341477a..9fe91baf9 100644
--- a/src/Artemis.UI.Avalonia/Screens/Device/ViewModels/DevicePropertiesViewModel.cs
+++ b/src/Artemis.UI.Avalonia/Screens/Device/DevicePropertiesViewModel.cs
@@ -4,7 +4,7 @@ using Artemis.UI.Avalonia.Ninject.Factories;
using RGB.NET.Core;
using ArtemisLed = Artemis.Core.ArtemisLed;
-namespace Artemis.UI.Avalonia.Screens.Device.ViewModels
+namespace Artemis.UI.Avalonia.Screens.Device
{
public class DevicePropertiesViewModel : ActivatableViewModelBase
{
diff --git a/src/Artemis.UI.Avalonia/Screens/Device/ViewModels/DeviceInfoTabViewModel.cs b/src/Artemis.UI.Avalonia/Screens/Device/Tabs/ViewModels/DeviceInfoTabViewModel.cs
similarity index 93%
rename from src/Artemis.UI.Avalonia/Screens/Device/ViewModels/DeviceInfoTabViewModel.cs
rename to src/Artemis.UI.Avalonia/Screens/Device/Tabs/ViewModels/DeviceInfoTabViewModel.cs
index 0e065f8be..4c374130b 100644
--- a/src/Artemis.UI.Avalonia/Screens/Device/ViewModels/DeviceInfoTabViewModel.cs
+++ b/src/Artemis.UI.Avalonia/Screens/Device/Tabs/ViewModels/DeviceInfoTabViewModel.cs
@@ -3,7 +3,7 @@ using Artemis.Core;
using Avalonia;
using RGB.NET.Core;
-namespace Artemis.UI.Avalonia.Screens.Device.ViewModels
+namespace Artemis.UI.Avalonia.Screens.Device.Tabs.ViewModels
{
public class DeviceInfoTabViewModel : ActivatableViewModelBase
{
diff --git a/src/Artemis.UI.Avalonia/Screens/Device/ViewModels/DeviceLedsTabViewModel.cs b/src/Artemis.UI.Avalonia/Screens/Device/Tabs/ViewModels/DeviceLedsTabViewModel.cs
similarity index 97%
rename from src/Artemis.UI.Avalonia/Screens/Device/ViewModels/DeviceLedsTabViewModel.cs
rename to src/Artemis.UI.Avalonia/Screens/Device/Tabs/ViewModels/DeviceLedsTabViewModel.cs
index 176ee1819..ac27f82f8 100644
--- a/src/Artemis.UI.Avalonia/Screens/Device/ViewModels/DeviceLedsTabViewModel.cs
+++ b/src/Artemis.UI.Avalonia/Screens/Device/Tabs/ViewModels/DeviceLedsTabViewModel.cs
@@ -7,7 +7,7 @@ using Artemis.Core;
using DynamicData.Binding;
using ReactiveUI;
-namespace Artemis.UI.Avalonia.Screens.Device.ViewModels
+namespace Artemis.UI.Avalonia.Screens.Device.Tabs.ViewModels
{
public class DeviceLedsTabViewModel : ActivatableViewModelBase
{
diff --git a/src/Artemis.UI.Avalonia/Screens/Device/ViewModels/DevicePropertiesTabViewModel.cs b/src/Artemis.UI.Avalonia/Screens/Device/Tabs/ViewModels/DevicePropertiesTabViewModel.cs
similarity index 99%
rename from src/Artemis.UI.Avalonia/Screens/Device/ViewModels/DevicePropertiesTabViewModel.cs
rename to src/Artemis.UI.Avalonia/Screens/Device/Tabs/ViewModels/DevicePropertiesTabViewModel.cs
index 1d51a69c9..3c04a654d 100644
--- a/src/Artemis.UI.Avalonia/Screens/Device/ViewModels/DevicePropertiesTabViewModel.cs
+++ b/src/Artemis.UI.Avalonia/Screens/Device/Tabs/ViewModels/DevicePropertiesTabViewModel.cs
@@ -9,7 +9,7 @@ using Artemis.UI.Avalonia.Shared.Services.Interfaces;
using ReactiveUI;
using SkiaSharp;
-namespace Artemis.UI.Avalonia.Screens.Device.ViewModels
+namespace Artemis.UI.Avalonia.Screens.Device.Tabs.ViewModels
{
public class DevicePropertiesTabViewModel : ActivatableViewModelBase
{
diff --git a/src/Artemis.UI.Avalonia/Screens/Device/ViewModels/InputMappingsTabViewModel.cs b/src/Artemis.UI.Avalonia/Screens/Device/Tabs/ViewModels/InputMappingsTabViewModel.cs
similarity index 98%
rename from src/Artemis.UI.Avalonia/Screens/Device/ViewModels/InputMappingsTabViewModel.cs
rename to src/Artemis.UI.Avalonia/Screens/Device/Tabs/ViewModels/InputMappingsTabViewModel.cs
index 16e688a11..0556e4d49 100644
--- a/src/Artemis.UI.Avalonia/Screens/Device/ViewModels/InputMappingsTabViewModel.cs
+++ b/src/Artemis.UI.Avalonia/Screens/Device/Tabs/ViewModels/InputMappingsTabViewModel.cs
@@ -8,7 +8,7 @@ using Artemis.UI.Avalonia.Exceptions;
using ReactiveUI;
using RGB.NET.Core;
-namespace Artemis.UI.Avalonia.Screens.Device.ViewModels
+namespace Artemis.UI.Avalonia.Screens.Device.Tabs.ViewModels
{
public class InputMappingsTabViewModel : ActivatableViewModelBase
{
diff --git a/src/Artemis.UI.Avalonia/Screens/Device/Views/DeviceInfoTabView.axaml b/src/Artemis.UI.Avalonia/Screens/Device/Tabs/Views/DeviceInfoTabView.axaml
similarity index 81%
rename from src/Artemis.UI.Avalonia/Screens/Device/Views/DeviceInfoTabView.axaml
rename to src/Artemis.UI.Avalonia/Screens/Device/Tabs/Views/DeviceInfoTabView.axaml
index 7ab1fb957..443b06da8 100644
--- a/src/Artemis.UI.Avalonia/Screens/Device/Views/DeviceInfoTabView.axaml
+++ b/src/Artemis.UI.Avalonia/Screens/Device/Tabs/Views/DeviceInfoTabView.axaml
@@ -3,6 +3,6 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
- x:Class="Artemis.UI.Avalonia.Screens.Device.Views.DeviceInfoTabView">
+ x:Class="Artemis.UI.Avalonia.Screens.Device.Tabs.Views.DeviceInfoTabView">
Welcome to Avalonia!
diff --git a/src/Artemis.UI.Avalonia/Screens/Device/Views/DeviceInfoTabView.axaml.cs b/src/Artemis.UI.Avalonia/Screens/Device/Tabs/Views/DeviceInfoTabView.axaml.cs
similarity index 82%
rename from src/Artemis.UI.Avalonia/Screens/Device/Views/DeviceInfoTabView.axaml.cs
rename to src/Artemis.UI.Avalonia/Screens/Device/Tabs/Views/DeviceInfoTabView.axaml.cs
index 704d98805..dae2666b3 100644
--- a/src/Artemis.UI.Avalonia/Screens/Device/Views/DeviceInfoTabView.axaml.cs
+++ b/src/Artemis.UI.Avalonia/Screens/Device/Tabs/Views/DeviceInfoTabView.axaml.cs
@@ -1,8 +1,7 @@
-using Avalonia;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
-namespace Artemis.UI.Avalonia.Screens.Device.Views
+namespace Artemis.UI.Avalonia.Screens.Device.Tabs.Views
{
public partial class DeviceInfoTabView : UserControl
{
diff --git a/src/Artemis.UI.Avalonia/Screens/Device/Views/DeviceLedsTabView.axaml b/src/Artemis.UI.Avalonia/Screens/Device/Tabs/Views/DeviceLedsTabView.axaml
similarity index 81%
rename from src/Artemis.UI.Avalonia/Screens/Device/Views/DeviceLedsTabView.axaml
rename to src/Artemis.UI.Avalonia/Screens/Device/Tabs/Views/DeviceLedsTabView.axaml
index 1b9e80874..ab528dee6 100644
--- a/src/Artemis.UI.Avalonia/Screens/Device/Views/DeviceLedsTabView.axaml
+++ b/src/Artemis.UI.Avalonia/Screens/Device/Tabs/Views/DeviceLedsTabView.axaml
@@ -3,6 +3,6 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
- x:Class="Artemis.UI.Avalonia.Screens.Device.Views.DeviceLedsTabView">
+ x:Class="Artemis.UI.Avalonia.Screens.Device.Tabs.Views.DeviceLedsTabView">
Welcome to Avalonia!
diff --git a/src/Artemis.UI.Avalonia/Screens/Device/Views/DeviceLedsTabView.axaml.cs b/src/Artemis.UI.Avalonia/Screens/Device/Tabs/Views/DeviceLedsTabView.axaml.cs
similarity index 82%
rename from src/Artemis.UI.Avalonia/Screens/Device/Views/DeviceLedsTabView.axaml.cs
rename to src/Artemis.UI.Avalonia/Screens/Device/Tabs/Views/DeviceLedsTabView.axaml.cs
index 5c080c933..e3dbd1d2f 100644
--- a/src/Artemis.UI.Avalonia/Screens/Device/Views/DeviceLedsTabView.axaml.cs
+++ b/src/Artemis.UI.Avalonia/Screens/Device/Tabs/Views/DeviceLedsTabView.axaml.cs
@@ -1,8 +1,7 @@
-using Avalonia;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
-namespace Artemis.UI.Avalonia.Screens.Device.Views
+namespace Artemis.UI.Avalonia.Screens.Device.Tabs.Views
{
public partial class DeviceLedsTabView : UserControl
{
diff --git a/src/Artemis.UI.Avalonia/Screens/Device/Views/DevicePropertiesTabView.axaml b/src/Artemis.UI.Avalonia/Screens/Device/Tabs/Views/DevicePropertiesTabView.axaml
similarity index 98%
rename from src/Artemis.UI.Avalonia/Screens/Device/Views/DevicePropertiesTabView.axaml
rename to src/Artemis.UI.Avalonia/Screens/Device/Tabs/Views/DevicePropertiesTabView.axaml
index d185ab91d..52e8643bb 100644
--- a/src/Artemis.UI.Avalonia/Screens/Device/Views/DevicePropertiesTabView.axaml
+++ b/src/Artemis.UI.Avalonia/Screens/Device/Tabs/Views/DevicePropertiesTabView.axaml
@@ -4,10 +4,10 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:controls="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia"
- xmlns:viewModels="clr-namespace:Artemis.UI.Avalonia.Screens.Device.ViewModels"
xmlns:converters="clr-namespace:Artemis.UI.Avalonia.Shared.Converters;assembly=Artemis.UI.Avalonia.Shared"
+ xmlns:viewModels="clr-namespace:Artemis.UI.Avalonia.Screens.Device.Tabs.ViewModels"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="1200"
- x:Class="Artemis.UI.Avalonia.Screens.Device.Views.DevicePropertiesTabView">
+ x:Class="Artemis.UI.Avalonia.Screens.Device.Tabs.Views.DevicePropertiesTabView">
diff --git a/src/Artemis.UI.Avalonia/Screens/Device/Views/DevicePropertiesTabView.axaml.cs b/src/Artemis.UI.Avalonia/Screens/Device/Tabs/Views/DevicePropertiesTabView.axaml.cs
similarity index 76%
rename from src/Artemis.UI.Avalonia/Screens/Device/Views/DevicePropertiesTabView.axaml.cs
rename to src/Artemis.UI.Avalonia/Screens/Device/Tabs/Views/DevicePropertiesTabView.axaml.cs
index a8b8c6e05..63d0295a1 100644
--- a/src/Artemis.UI.Avalonia/Screens/Device/Views/DevicePropertiesTabView.axaml.cs
+++ b/src/Artemis.UI.Avalonia/Screens/Device/Tabs/Views/DevicePropertiesTabView.axaml.cs
@@ -1,12 +1,9 @@
-using System.Threading.Tasks;
-using Artemis.UI.Avalonia.Screens.Device.ViewModels;
-using Avalonia;
-using Avalonia.Controls;
+using Artemis.UI.Avalonia.Screens.Device.Tabs.ViewModels;
using Avalonia.Input;
using Avalonia.Markup.Xaml;
using Avalonia.ReactiveUI;
-namespace Artemis.UI.Avalonia.Screens.Device.Views
+namespace Artemis.UI.Avalonia.Screens.Device.Tabs.Views
{
public partial class DevicePropertiesTabView : ReactiveUserControl
{
diff --git a/src/Artemis.UI.Avalonia/Screens/Device/Views/InputMappingsTabView.axaml b/src/Artemis.UI.Avalonia/Screens/Device/Tabs/Views/InputMappingsTabView.axaml
similarity index 80%
rename from src/Artemis.UI.Avalonia/Screens/Device/Views/InputMappingsTabView.axaml
rename to src/Artemis.UI.Avalonia/Screens/Device/Tabs/Views/InputMappingsTabView.axaml
index 50bbb2dbb..c18ce5319 100644
--- a/src/Artemis.UI.Avalonia/Screens/Device/Views/InputMappingsTabView.axaml
+++ b/src/Artemis.UI.Avalonia/Screens/Device/Tabs/Views/InputMappingsTabView.axaml
@@ -3,6 +3,6 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
- x:Class="Artemis.UI.Avalonia.Screens.Device.Views.InputMappingsTabView">
+ x:Class="Artemis.UI.Avalonia.Screens.Device.Tabs.Views.InputMappingsTabView">
Welcome to Avalonia!
diff --git a/src/Artemis.UI.Avalonia/Screens/Device/Views/InputMappingsTabView.axaml.cs b/src/Artemis.UI.Avalonia/Screens/Device/Tabs/Views/InputMappingsTabView.axaml.cs
similarity index 83%
rename from src/Artemis.UI.Avalonia/Screens/Device/Views/InputMappingsTabView.axaml.cs
rename to src/Artemis.UI.Avalonia/Screens/Device/Tabs/Views/InputMappingsTabView.axaml.cs
index e54cccf45..21ea6cf5b 100644
--- a/src/Artemis.UI.Avalonia/Screens/Device/Views/InputMappingsTabView.axaml.cs
+++ b/src/Artemis.UI.Avalonia/Screens/Device/Tabs/Views/InputMappingsTabView.axaml.cs
@@ -1,8 +1,7 @@
-using Avalonia;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
-namespace Artemis.UI.Avalonia.Screens.Device.Views
+namespace Artemis.UI.Avalonia.Screens.Device.Tabs.Views
{
public partial class InputMappingsTabView : UserControl
{
diff --git a/src/Artemis.UI.Avalonia/Services/DebugService.cs b/src/Artemis.UI.Avalonia/Services/DebugService.cs
index b6802edca..80e52ed7a 100644
--- a/src/Artemis.UI.Avalonia/Services/DebugService.cs
+++ b/src/Artemis.UI.Avalonia/Services/DebugService.cs
@@ -1,4 +1,4 @@
-using Artemis.UI.Avalonia.Screens.Debug;
+using Artemis.UI.Avalonia.Screens.Debugger;
using Artemis.UI.Avalonia.Services.Interfaces;
using Artemis.UI.Avalonia.Shared.Services.Interfaces;