Skip to content

Commit a92a80a

Browse files
committed
PoC for device flag clarity
1 parent 43efc3b commit a92a80a

File tree

3 files changed

+176
-4
lines changed

3 files changed

+176
-4
lines changed

Packages/com.unity.inputsystem/InputSystem/Editor/Debugger/InputDeviceDebuggerWindow.cs

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ internal void OnGUI()
122122
}
123123

124124
////FIXME: with ExpandHeight(false), editor still expands height for some reason....
125-
EditorGUILayout.BeginVertical("OL Box", GUILayout.Height(170));// GUILayout.ExpandHeight(false));
125+
EditorGUILayout.BeginVertical("OL Box", GUILayout.Height(130));// GUILayout.ExpandHeight(false));
126126
EditorGUILayout.LabelField("Name", m_Device.name);
127127
EditorGUILayout.LabelField("Layout", m_Device.layout);
128128
EditorGUILayout.LabelField("Type", m_Device.GetType().Name);
@@ -137,16 +137,39 @@ internal void OnGUI()
137137
EditorGUILayout.LabelField("Device ID", m_DeviceIdString);
138138
if (!string.IsNullOrEmpty(m_DeviceUsagesString))
139139
EditorGUILayout.LabelField("Usages", m_DeviceUsagesString);
140-
if (!string.IsNullOrEmpty(m_DeviceFlagsString))
141-
EditorGUILayout.LabelField("Flags", m_DeviceFlagsString);
142140
if (m_Device is Keyboard)
143141
EditorGUILayout.LabelField("Keyboard Layout", ((Keyboard)m_Device).keyboardLayout);
144142
EditorGUILayout.EndVertical();
145-
143+
144+
DrawFlags();
146145
DrawControlTree();
147146
DrawEventList();
148147
}
149148

149+
private void DrawFlags()
150+
{
151+
GUILayout.BeginHorizontal(EditorStyles.toolbar);
152+
GUILayout.Label("Flags", GUILayout.MinWidth(100), GUILayout.ExpandWidth(true));
153+
GUILayout.FlexibleSpace();
154+
GUILayout.EndHorizontal();
155+
156+
var rect = EditorGUILayout.GetControlRect(GUILayout.ExpandHeight(true));
157+
m_DeviceFlagsTree.OnGUI(rect);
158+
159+
/*const string kTrue = "true";
160+
const string kFalse = "false";
161+
EditorGUILayout.LabelField("Native", m_Device.native ? kTrue : kFalse);
162+
EditorGUILayout.LabelField("Remote", m_Device.remote ? kTrue : kFalse);
163+
EditorGUILayout.LabelField("UpdateBeforeRender", m_Device.updateBeforeRender ? kTrue : kFalse);
164+
EditorGUILayout.LabelField("HasStateCallbacks", m_Device.hasStateCallbacks ? kTrue : kFalse);
165+
EditorGUILayout.LabelField("HasEventMerger", m_Device.hasEventMerger ? kTrue : kFalse);
166+
EditorGUILayout.LabelField("HasEventPreProcessor", m_Device.hasEventPreProcessor ? kTrue : kFalse);
167+
EditorGUILayout.LabelField("DisabledInFrontend", m_Device.disabledInFrontend ? kTrue : kFalse);
168+
EditorGUILayout.LabelField("DisabledInRuntime", m_Device.disabledInRuntime ? kTrue : kFalse);
169+
EditorGUILayout.LabelField("DisabledWWhileInBackground", m_Device.disabledWhileInBackground ? kTrue : kFalse);
170+
EditorGUILayout.LabelField("CanRunInBackground", m_Device.canDeviceRunInBackground ? kTrue : kFalse);*/
171+
}
172+
150173
private void DrawControlTree()
151174
{
152175
var label = m_InputUpdateTypeShownInControlTree == InputUpdateType.Editor
@@ -287,6 +310,11 @@ private void InitializeWith(InputDevice device)
287310
m_DeviceUsagesString = string.Join(", ", device.usages.Select(x => x.ToString()).ToArray());
288311

289312
UpdateDeviceFlags();
313+
314+
// Setup flags
315+
m_DeviceFlagsTree = DeviceFlagsTreeView.Create(m_Device, ref m_DeviceFlagsTreeState, ref m_DeviceFlagsHeaderState);
316+
m_DeviceFlagsTree.Reload();
317+
m_DeviceFlagsTree.ExpandAll();
290318

291319
// Set up event trace. The default trace size of 512kb fits a ton of events and will
292320
// likely bog down the UI if we try to display that many events. Instead, come up
@@ -326,6 +354,8 @@ private void InitializeWith(InputDevice device)
326354
EditorApplication.playModeStateChanged += OnPlayModeChange;
327355
}
328356

357+
//private List<ValueTuple<string, bool>> m_Flags = new List<ValueTuple<string, bool>>();
358+
329359
private void UpdateDeviceFlags()
330360
{
331361
var flags = new List<string>();
@@ -397,6 +427,7 @@ internal static InputUpdateType DetermineUpdateTypeToShow(InputDevice device)
397427
private InputDevice.DeviceFlags m_DeviceFlags;
398428
private InputControlTreeView m_ControlTree;
399429
private InputEventTreeView m_EventTree;
430+
private DeviceFlagsTreeView m_DeviceFlagsTree;
400431
private bool m_NeedControlValueRefresh;
401432
private bool m_ReloadEventTree;
402433
private InputEventTrace.ReplayController m_ReplayController;
@@ -406,8 +437,10 @@ internal static InputUpdateType DetermineUpdateTypeToShow(InputDevice device)
406437
[SerializeField] private int m_DeviceId = InputDevice.InvalidDeviceId;
407438
[SerializeField] private TreeViewState m_ControlTreeState;
408439
[SerializeField] private TreeViewState m_EventTreeState;
440+
[SerializeField] private TreeViewState m_DeviceFlagsTreeState;
409441
[SerializeField] private MultiColumnHeaderState m_ControlTreeHeaderState;
410442
[SerializeField] private MultiColumnHeaderState m_EventTreeHeaderState;
443+
[SerializeField] private MultiColumnHeaderState m_DeviceFlagsHeaderState;
411444
[SerializeField] private bool m_EventTraceDisabled;
412445

413446
private static List<InputDeviceDebuggerWindow> s_OpenDebuggerWindows;
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
using UnityEditor;
2+
using UnityEditor.IMGUI.Controls;
3+
4+
#if UNITY_EDITOR
5+
6+
namespace UnityEngine.InputSystem.Editor
7+
{
8+
public class DeviceFlagsTreeView : TreeView
9+
{
10+
private InputDevice m_Device;
11+
12+
private enum ColumnId
13+
{
14+
Name,
15+
Value,
16+
COUNT
17+
}
18+
19+
public static DeviceFlagsTreeView Create(InputDevice device, ref TreeViewState treeState, ref MultiColumnHeaderState headerState)
20+
{
21+
if (treeState == null)
22+
treeState = new TreeViewState();
23+
24+
var newHeaderState = CreateHeaderState();
25+
if (headerState != null)
26+
MultiColumnHeaderState.OverwriteSerializedFields(headerState, newHeaderState);
27+
headerState = newHeaderState;
28+
29+
var header = new MultiColumnHeader(headerState);
30+
return new DeviceFlagsTreeView(treeState, header, device);
31+
}
32+
33+
private static MultiColumnHeaderState CreateHeaderState()
34+
{
35+
var columns = new MultiColumnHeaderState.Column[(int)ColumnId.COUNT];
36+
37+
columns[(int)ColumnId.Name] = new MultiColumnHeaderState.Column()
38+
{
39+
width = 320,
40+
minWidth = 60,
41+
headerContent = new GUIContent("Name"),
42+
canSort = false
43+
};
44+
columns[(int)ColumnId.Value] = new MultiColumnHeaderState.Column()
45+
{
46+
width = 80,
47+
minWidth = 60,
48+
headerContent = new GUIContent("Value"),
49+
canSort = false
50+
};
51+
52+
return new MultiColumnHeaderState(columns);
53+
}
54+
55+
private DeviceFlagsTreeView(TreeViewState state, MultiColumnHeader multiColumnHeader, InputDevice device)
56+
: base(state, multiColumnHeader)
57+
{
58+
m_Device = device;
59+
Reload();
60+
}
61+
62+
private void AddFlag(TreeViewItem root, InputDevice.DeviceFlags flag)
63+
{
64+
root.AddChild(new FlagItem()
65+
{
66+
id = 1,
67+
depth = 1,
68+
displayName = "",
69+
Flag = flag
70+
});
71+
}
72+
73+
protected override TreeViewItem BuildRoot()
74+
{
75+
var root = new TreeViewItem { id = 0, depth = -1, displayName = "Root" };
76+
77+
AddFlag(root, InputDevice.DeviceFlags.Native);
78+
AddFlag(root, InputDevice.DeviceFlags.Remote);
79+
80+
AddFlag(root, InputDevice.DeviceFlags.CanRunInBackground);
81+
AddFlag(root, InputDevice.DeviceFlags.CanRunInBackgroundHasBeenQueried);
82+
83+
AddFlag(root, InputDevice.DeviceFlags.UpdateBeforeRender);
84+
AddFlag(root, InputDevice.DeviceFlags.HasStateCallbacks);
85+
AddFlag(root, InputDevice.DeviceFlags.HasControlsWithDefaultState);
86+
AddFlag(root, InputDevice.DeviceFlags.HasDontResetControls);
87+
AddFlag(root, InputDevice.DeviceFlags.HasEventMerger);
88+
AddFlag(root, InputDevice.DeviceFlags.HasEventPreProcessor);
89+
90+
AddFlag(root, InputDevice.DeviceFlags.DisabledInFrontend);
91+
AddFlag(root, InputDevice.DeviceFlags.DisabledInRuntime);
92+
AddFlag(root, InputDevice.DeviceFlags.DisabledWhileInBackground);
93+
AddFlag(root, InputDevice.DeviceFlags.DisabledStateHasBeenQueriedFromRuntime);
94+
95+
return root;
96+
}
97+
98+
protected override void RowGUI(RowGUIArgs args)
99+
{
100+
var columnCount = args.GetNumVisibleColumns();
101+
for (var i = 0; i < columnCount; ++i)
102+
{
103+
var item = (FlagItem)args.item;
104+
ColumnGUI(args.GetCellRect(i), item.Flag, args.GetColumn(i));
105+
}
106+
}
107+
108+
private unsafe void ColumnGUI(Rect cellRect, InputDevice.DeviceFlags flag, int column)
109+
{
110+
CenterRectUsingSingleLineHeight(ref cellRect);
111+
112+
switch (column)
113+
{
114+
case (int)ColumnId.Name:
115+
GUI.Label(cellRect, flag.ToString());
116+
break;
117+
case (int)ColumnId.Value:
118+
{
119+
var isSet = ((m_Device.m_DeviceFlags & flag) != 0);
120+
if (isSet)
121+
GUI.Label(cellRect, "true", EditorStyles.boldLabel);
122+
else
123+
GUI.Label(cellRect, "false");
124+
}
125+
break;
126+
}
127+
}
128+
129+
private class FlagItem : TreeViewItem
130+
{
131+
public InputDevice.DeviceFlags Flag;
132+
}
133+
}
134+
}
135+
136+
#endif // UNITY_EDITOR

Packages/com.unity.inputsystem/InputSystem/Editor/Internal/DeviceFlagsTreeView.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)