1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-13 05:48:35 +00:00

Debugger - Added quick access button to main window

Debugger - Bring debugger to front if already open instead of creating a new one
This commit is contained in:
Robert 2020-06-24 22:39:50 +02:00
parent 2b7a507725
commit 28bcfcc95a
7 changed files with 104 additions and 29 deletions

View File

@ -16,28 +16,23 @@ namespace Artemis.Core.Plugins.Abstract.DataModels.Attributes
public string Description { get; set; } public string Description { get; set; }
/// <summary> /// <summary>
/// Gets or sets the an optional input prefix to show before input elements in the UI. /// Gets or sets the an optional prefix to show before displaying elements in the UI.
/// </summary> /// </summary>
public string InputPrefix { get; set; } public string Prefix { get; set; }
/// <summary> /// <summary>
/// Gets or sets an optional input affix to show behind input elements in the UI. /// Gets or sets an optional affix to show behind displaying elements in the UI.
/// </summary> /// </summary>
public string InputAffix { get; set; } public string Affix { get; set; }
/// <summary> /// <summary>
/// Gets or sets an optional maximum input value, only enforced in the UI. /// Gets or sets an optional maximum value, this value is not enforced but used for percentage calculations.
/// </summary> /// </summary>
public object MaxInputValue { get; set; } public object MaxValue { get; set; }
/// <summary> /// <summary>
/// Gets or sets the input drag step size, used in the UI. /// Gets or sets an optional minimum value, this value is not enforced but used for percentage calculations.
/// </summary> /// </summary>
public float InputStepSize { get; set; } public object MinValue { get; set; }
/// <summary>
/// Gets or sets an optional minimum input value, only enforced in the UI.
/// </summary>
public object MinInputValue { get; set; }
} }
} }

View File

@ -57,7 +57,15 @@
IsNavigationDrawerOpen="{Binding IsSidebarVisible, Mode=TwoWay}" IsNavigationDrawerOpen="{Binding IsSidebarVisible, Mode=TwoWay}"
Title="{Binding ActiveItem.DisplayName}" Title="{Binding ActiveItem.DisplayName}"
ShowNavigationDrawerButton="True" ShowNavigationDrawerButton="True"
DockPanel.Dock="Top" /> DockPanel.Dock="Top">
<StackPanel>
<!-- Bug: materialDesign:RippleAssist.RippleOnTop doesn't look as nice but otherwise it doesn't work at all, not sure why -->
<Button Style="{StaticResource MaterialDesignIconForegroundButton}" ToolTip="Open debugger" Command="{s:Action ShowDebugger}"
materialDesign:RippleAssist.RippleOnTop="True">
<materialDesign:PackIcon Kind="Matrix" />
</Button>
</StackPanel>
</mde:AppBar>
<ContentControl s:View.Model="{Binding ActiveItem}" Style="{StaticResource InitializingFade}" /> <ContentControl s:View.Model="{Binding ActiveItem}" Style="{StaticResource InitializingFade}" />
</DockPanel> </DockPanel>
</materialDesign:DrawerHost> </materialDesign:DrawerHost>

View File

@ -10,6 +10,7 @@ using Artemis.Core.Services.Interfaces;
using Artemis.UI.Events; using Artemis.UI.Events;
using Artemis.UI.Screens.Settings; using Artemis.UI.Screens.Settings;
using Artemis.UI.Screens.Sidebar; using Artemis.UI.Screens.Sidebar;
using Artemis.UI.Services.Interfaces;
using Artemis.UI.Utilities; using Artemis.UI.Utilities;
using MaterialDesignThemes.Wpf; using MaterialDesignThemes.Wpf;
using Stylet; using Stylet;
@ -20,16 +21,19 @@ namespace Artemis.UI.Screens
{ {
private readonly PluginSetting<ApplicationColorScheme> _colorScheme; private readonly PluginSetting<ApplicationColorScheme> _colorScheme;
private readonly ICoreService _coreService; private readonly ICoreService _coreService;
private readonly IDebugService _debugService;
private readonly IEventAggregator _eventAggregator; private readonly IEventAggregator _eventAggregator;
private readonly ThemeWatcher _themeWatcher; private readonly ThemeWatcher _themeWatcher;
private bool _lostFocus;
private readonly Timer _titleUpdateTimer; private readonly Timer _titleUpdateTimer;
private bool _lostFocus;
public RootViewModel(IEventAggregator eventAggregator, SidebarViewModel sidebarViewModel, ISettingsService settingsService, ICoreService coreService) public RootViewModel(IEventAggregator eventAggregator, SidebarViewModel sidebarViewModel, ISettingsService settingsService, ICoreService coreService,
IDebugService debugService)
{ {
SidebarViewModel = sidebarViewModel; SidebarViewModel = sidebarViewModel;
_eventAggregator = eventAggregator; _eventAggregator = eventAggregator;
_coreService = coreService; _coreService = coreService;
_debugService = debugService;
_titleUpdateTimer = new Timer(500); _titleUpdateTimer = new Timer(500);
_titleUpdateTimer.Elapsed += (sender, args) => UpdateWindowTitle(); _titleUpdateTimer.Elapsed += (sender, args) => UpdateWindowTitle();
@ -69,6 +73,11 @@ namespace Artemis.UI.Screens
_eventAggregator.Publish(new MainWindowFocusChangedEvent(true)); _eventAggregator.Publish(new MainWindowFocusChangedEvent(true));
} }
public void ShowDebugger()
{
_debugService.ShowDebugger();
}
public void WindowKeyDown(object sender, KeyEventArgs e) public void WindowKeyDown(object sender, KeyEventArgs e)
{ {
_eventAggregator.Publish(new MainWindowKeyEvent(true, e)); _eventAggregator.Publish(new MainWindowKeyEvent(true, e));

View File

@ -25,7 +25,7 @@
DockPanel.Dock="Top" DockPanel.Dock="Top"
Margin="-18 0 0 0"> Margin="-18 0 0 0">
<mde:AppBar.AppIcon> <mde:AppBar.AppIcon>
<materialDesign:PackIcon Kind="BugReport" Width="20" Height="28" /> <materialDesign:PackIcon Kind="Matrix" Width="20" Height="28" />
</mde:AppBar.AppIcon> </mde:AppBar.AppIcon>
<materialDesign:PopupBox DockPanel.Dock="Right" PlacementMode="BottomAndAlignRightEdges" StaysOpen="False"> <materialDesign:PopupBox DockPanel.Dock="Right" PlacementMode="BottomAndAlignRightEdges" StaysOpen="False">

View File

@ -10,12 +10,11 @@ using Artemis.Core.Services.Interfaces;
using Artemis.Core.Services.Storage.Interfaces; using Artemis.Core.Services.Storage.Interfaces;
using Artemis.Core.Utilities; using Artemis.Core.Utilities;
using Artemis.UI.Ninject.Factories; using Artemis.UI.Ninject.Factories;
using Artemis.UI.Screens.Settings.Debug;
using Artemis.UI.Screens.Settings.Tabs.Devices; using Artemis.UI.Screens.Settings.Tabs.Devices;
using Artemis.UI.Screens.Settings.Tabs.Plugins; using Artemis.UI.Screens.Settings.Tabs.Plugins;
using Artemis.UI.Services.Interfaces;
using Artemis.UI.Shared.Services.Interfaces; using Artemis.UI.Shared.Services.Interfaces;
using Artemis.UI.Shared.Utilities; using Artemis.UI.Shared.Utilities;
using Ninject;
using Serilog.Events; using Serilog.Events;
using Stylet; using Stylet;
@ -23,29 +22,24 @@ namespace Artemis.UI.Screens.Settings
{ {
public class SettingsViewModel : MainScreenViewModel public class SettingsViewModel : MainScreenViewModel
{ {
private readonly IDebugService _debugService;
private readonly IDeviceSettingsVmFactory _deviceSettingsVmFactory; private readonly IDeviceSettingsVmFactory _deviceSettingsVmFactory;
private readonly IDialogService _dialogService; private readonly IDialogService _dialogService;
private readonly IKernel _kernel;
private readonly IPluginService _pluginService; private readonly IPluginService _pluginService;
private readonly ISettingsService _settingsService; private readonly ISettingsService _settingsService;
private readonly ISurfaceService _surfaceService; private readonly ISurfaceService _surfaceService;
private readonly IWindowManager _windowManager; private readonly IWindowManager _windowManager;
public SettingsViewModel(IKernel kernel, public SettingsViewModel(ISurfaceService surfaceService, IPluginService pluginService, IDialogService dialogService, IWindowManager windowManager,
ISurfaceService surfaceService, IDebugService debugService, ISettingsService settingsService, IDeviceSettingsVmFactory deviceSettingsVmFactory)
IPluginService pluginService,
IDialogService dialogService,
IWindowManager windowManager,
ISettingsService settingsService,
IDeviceSettingsVmFactory deviceSettingsVmFactory)
{ {
DisplayName = "Settings"; DisplayName = "Settings";
_kernel = kernel;
_surfaceService = surfaceService; _surfaceService = surfaceService;
_pluginService = pluginService; _pluginService = pluginService;
_dialogService = dialogService; _dialogService = dialogService;
_windowManager = windowManager; _windowManager = windowManager;
_debugService = debugService;
_settingsService = settingsService; _settingsService = settingsService;
_deviceSettingsVmFactory = deviceSettingsVmFactory; _deviceSettingsVmFactory = deviceSettingsVmFactory;
@ -160,7 +154,7 @@ namespace Artemis.UI.Screens.Settings
public void ShowDebugger() public void ShowDebugger()
{ {
_windowManager.ShowWindow(_kernel.Get<DebugViewModel>()); _debugService.ShowDebugger();
} }
public async Task ShowLogsFolder() public async Task ShowLogsFolder()

View File

@ -0,0 +1,62 @@
using System.Windows;
using Artemis.UI.Screens.Settings.Debug;
using Artemis.UI.Services.Interfaces;
using MaterialDesignExtensions.Controls;
using Ninject;
using Stylet;
namespace Artemis.UI.Services
{
public class DebugService : IDebugService
{
private readonly IKernel _kernel;
private readonly IWindowManager _windowManager;
private DebugViewModel _debugViewModel;
public DebugService(IKernel kernel, IWindowManager windowManager)
{
_kernel = kernel;
_windowManager = windowManager;
}
public void ShowDebugger()
{
if (_debugViewModel != null)
BringDebuggerToForeground();
else
CreateDebugger();
}
private void CreateDebugger()
{
_debugViewModel = _kernel.Get<DebugViewModel>();
_debugViewModel.Closed += DebugViewModelOnClosed;
_windowManager.ShowWindow(_debugViewModel);
}
private void DebugViewModelOnClosed(object sender, CloseEventArgs e)
{
_debugViewModel.Closed -= DebugViewModelOnClosed;
_debugViewModel = null;
}
private void BringDebuggerToForeground()
{
var materialWindow = (MaterialWindow) _debugViewModel.View;
// Not as straightforward as you might think, this ensures the window always shows, even if it's behind another window etc.
// https://stackoverflow.com/a/4831839/5015269
if (!materialWindow.IsVisible)
materialWindow.Show();
if (materialWindow.WindowState == WindowState.Minimized)
materialWindow.WindowState = WindowState.Normal;
materialWindow.Activate();
materialWindow.Topmost = true; // important
materialWindow.Topmost = false; // important
materialWindow.Focus();
}
}
}

View File

@ -0,0 +1,7 @@
namespace Artemis.UI.Services.Interfaces
{
public interface IDebugService : IArtemisUIService
{
void ShowDebugger();
}
}