-
Notifications
You must be signed in to change notification settings - Fork 99
/
Copy pathSettingsBasedVisualizerEditor.cs
89 lines (76 loc) · 3.06 KB
/
SettingsBasedVisualizerEditor.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
using System.Collections;
using System.Collections.Generic;
using Unity.Robotics.Visualizations;
using Unity.Robotics.ROSTCPConnector.MessageGeneration;
using UnityEditor;
using UnityEngine;
public abstract class SettingsBasedVisualizerEditor<TMessageType, TVisualizerSettings> : Editor
where TMessageType : Message
where TVisualizerSettings : VisualizerSettingsGeneric<TMessageType>
{
protected TVisualizerSettings m_Config;
Editor m_Editor;
public override void OnInspectorGUI()
{
DrawingVisualizerWithSettings<TMessageType, TVisualizerSettings> visualizer = (DrawingVisualizerWithSettings<TMessageType, TVisualizerSettings>)target;
visualizer.Topic = EditorGUILayout.TextField("Topic", visualizer.Topic);
m_Config = visualizer.Settings;
m_Config = (TVisualizerSettings)EditorGUILayout.ObjectField("Visualizer settings", m_Config, typeof(TVisualizerSettings), false);
visualizer.Settings = m_Config;
if (GUI.changed)
{
EditorUtility.SetDirty(target);
if (visualizer.gameObject.scene != null)
{
UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(visualizer.gameObject.scene);
}
GUI.changed = false;
}
EditorGUI.indentLevel++;
OnInspectorGUIForSettings(visualizer);
EditorGUI.indentLevel--;
if (GUI.changed)
{
visualizer.Redraw();
}
}
public void VisualizerRedraw()
{
DrawingVisualizerWithSettings<TMessageType, TVisualizerSettings> visualizer = (DrawingVisualizerWithSettings<TMessageType, TVisualizerSettings>)target;
visualizer.Redraw();
}
protected virtual void OnInspectorGUIForSettings(DrawingVisualizerWithSettings<TMessageType, TVisualizerSettings> visualizer)
{
CreateCachedEditor(m_Config, null, ref m_Editor);
m_Editor.OnInspectorGUI();
}
public void CreateNewDropdown(string[] channels, string label, string channel, System.Action<string> action)
{
if (channels == null)
return;
GUILayout.BeginHorizontal();
GUILayout.Label(label);
if (EditorGUILayout.DropdownButton(new GUIContent(channel), FocusType.Keyboard))
{
var menu = new GenericMenu();
foreach (var c in channels)
menu.AddItem(new GUIContent(c), c == channel, () =>
{
action(c);
VisualizerRedraw();
});
menu.DropDown(new Rect(Event.current.mousePosition.x, Event.current.mousePosition.y, 0f, 0f));
}
GUILayout.EndHorizontal();
}
// NB, this modifies the 'range' array in place
public void CreateMinMaxEditor(string label1, string label2, float[] range)
{
GUILayout.BeginHorizontal();
range[0] = EditorGUILayout.FloatField(label1, range[0]);
//GUILayout.Space(30);
GUILayout.Label(label2);
range[1] = EditorGUILayout.FloatField(range[1], GUILayout.Width(70));
GUILayout.EndHorizontal();
}
}