Browse Source

Listen for raw key events in DevTools.

That way we can detect the Ctrl+Shift key combination anywhere.
pull/404/head
Steven Kirk 11 years ago
parent
commit
96235fba17
  1. 36
      src/Perspex.Diagnostics/DevTools.paml.cs

36
src/Perspex.Diagnostics/DevTools.paml.cs

@ -1,11 +1,16 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Reactive.Linq;
using Perspex.Controls; using Perspex.Controls;
using Perspex.Controls.Primitives;
using Perspex.Controls.Templates; using Perspex.Controls.Templates;
using Perspex.Diagnostics.ViewModels; using Perspex.Diagnostics.ViewModels;
using Perspex.Input; using Perspex.Input;
using Perspex.Input.Raw;
using Perspex.Interactivity; using Perspex.Interactivity;
using Perspex.Markup.Xaml; using Perspex.Markup.Xaml;
using Perspex.VisualTree;
using ReactiveUI; using ReactiveUI;
namespace Perspex.Diagnostics namespace Perspex.Diagnostics
@ -13,13 +18,17 @@ namespace Perspex.Diagnostics
public class DevTools : UserControl public class DevTools : UserControl
{ {
private static Dictionary<Window, Window> s_open = new Dictionary<Window, Window>(); private static Dictionary<Window, Window> s_open = new Dictionary<Window, Window>();
private IDisposable _keySubscription;
public DevTools(IControl root) public DevTools(IControl root)
{ {
InitializeComponent(); InitializeComponent();
Root = root; Root = root;
DataContext = new DevToolsViewModel(root); DataContext = new DevToolsViewModel(root);
Root.PointerMoved += RootPointerMoved;
_keySubscription = InputManager.Instance.RawEventReceived
.OfType<RawKeyEventArgs>()
.Subscribe(RawKeyDown);
} }
public IControl Root { get; } public IControl Root { get; }
@ -45,31 +54,34 @@ namespace Perspex.Diagnostics
} }
else else
{ {
var devTools = new DevTools(window);
devToolsWindow = new Window devToolsWindow = new Window
{ {
Width = 1024, Width = 1024,
Height = 512, Height = 512,
Content = new DevTools(window), Content = devTools,
DataTemplates = new DataTemplates DataTemplates = new DataTemplates
{ {
new ViewLocator<ReactiveObject>(), new ViewLocator<ReactiveObject>(),
} }
}; };
devToolsWindow.Closed += DevToolsClosed; devToolsWindow.Closed += devTools.DevToolsClosed;
s_open.Add((Window)sender, devToolsWindow); s_open.Add((Window)sender, devToolsWindow);
devToolsWindow.Show(); devToolsWindow.Show();
} }
} }
} }
private static void DevToolsClosed(object sender, EventArgs e) private void DevToolsClosed(object sender, EventArgs e)
{ {
var devToolsWindow = (Window)sender; var devToolsWindow = (Window)sender;
var devTools = (DevTools)devToolsWindow.Content; var devTools = (DevTools)devToolsWindow.Content;
var window = (Window)devTools.Root; var window = (Window)devTools.Root;
s_open.Remove(window); s_open.Remove(window);
_keySubscription.Dispose();
devToolsWindow.Closed -= DevToolsClosed; devToolsWindow.Closed -= DevToolsClosed;
} }
@ -78,14 +90,20 @@ namespace Perspex.Diagnostics
PerspexXamlLoader.Load(this); PerspexXamlLoader.Load(this);
} }
private void RootPointerMoved(object sender, PointerEventArgs e) private void RawKeyDown(RawKeyEventArgs e)
{ {
var modifiers = InputModifiers.Control | InputModifiers.Shift; const InputModifiers modifiers = InputModifiers.Control | InputModifiers.Shift;
if ((e.InputModifiers & modifiers) == modifiers) if ((e.Modifiers) == modifiers)
{ {
var vm = (DevToolsViewModel)DataContext; var point = MouseDevice.Instance.GetPosition(Root);
vm.SelectControl((IControl)e.Source); var control = Root.GetVisualsAt(point).FirstOrDefault(x => !(x is AdornerLayer));
if (control != null)
{
var vm = (DevToolsViewModel)DataContext;
vm.SelectControl((IControl)control);
}
} }
} }
} }

Loading…
Cancel
Save