Skip to content

Commit 4267cf7

Browse files
Add media controller object toggle components
1 parent a8097b2 commit 4267cf7

17 files changed

+397
-89
lines changed
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
// Visual Pinball Engine
2+
// Copyright (C) 2025 freezy and VPE Team
3+
//
4+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
5+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
6+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
7+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
8+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
9+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
10+
// SOFTWARE.
11+
12+
using System.Linq;
13+
using UnityEditor;
14+
using UnityEngine;
15+
using UnityEngine.UIElements;
16+
17+
namespace VisualPinball.Engine.Mpf.Unity.Editor
18+
{
19+
public class DisabledParentObjectHelpBox : VisualElement
20+
{
21+
private readonly HelpBox _box;
22+
private readonly UnityEditor.Editor _editor;
23+
24+
public DisabledParentObjectHelpBox(UnityEditor.Editor editor)
25+
{
26+
_editor = editor;
27+
_box = new HelpBox(
28+
"The game object this component is attached to or one of its parents is disabled. This component" +
29+
" cannot initialize until its parent object becomes active in the hierarchy. It is possible that" +
30+
" events from MPF will be missed.",
31+
HelpBoxMessageType.Warning);
32+
Add(_box);
33+
34+
RegisterCallback<AttachToPanelEvent>(evt =>
35+
{
36+
UpdateHelpBoxVisibility();
37+
EditorApplication.hierarchyChanged += OnHierarchyChanged;
38+
});
39+
40+
RegisterCallback<DetachFromPanelEvent>(evt =>
41+
{
42+
EditorApplication.hierarchyChanged -= OnHierarchyChanged;
43+
});
44+
}
45+
46+
private void OnHierarchyChanged() => UpdateHelpBoxVisibility();
47+
48+
private void UpdateHelpBoxVisibility()
49+
{
50+
_box.style.display = _editor.targets.ToList().Any(IsParentObjectDisabled)
51+
? DisplayStyle.Flex
52+
: DisplayStyle.None;
53+
}
54+
55+
private static bool IsParentObjectDisabled(UnityEngine.Object target) =>
56+
!((Component)target).gameObject.activeInHierarchy;
57+
}
58+
}

Editor/Inspector/DisabledParentObjectHelpBox.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.
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// Visual Pinball Engine
2+
// Copyright (C) 2025 freezy and VPE Team
3+
//
4+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
5+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
6+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
7+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
8+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
9+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
10+
// SOFTWARE.
11+
12+
using UnityEditor;
13+
using UnityEditor.UIElements;
14+
using UnityEngine.UIElements;
15+
using VisualPinball.Engine.Mpf.Unity.MediaController.ObjectToggle;
16+
17+
namespace VisualPinball.Engine.Mpf.Unity.Editor
18+
{
19+
[CustomEditor(typeof(EnableDuringMode)), CanEditMultipleObjects]
20+
public class EnableDuringModeInspector : UnityEditor.Editor
21+
{
22+
public override VisualElement CreateInspectorGUI()
23+
{
24+
var root = new VisualElement();
25+
root.Add(new MissingGleHelpBoxes(this));
26+
root.Add(new DisabledParentObjectHelpBox(this));
27+
InspectorElement.FillDefaultInspector(root, serializedObject, this);
28+
return root;
29+
}
30+
}
31+
}

Editor/Inspector/EnableDuringModeInspector.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.
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
using System.Linq;
2+
using UnityEditor;
3+
using UnityEngine;
4+
using UnityEngine.UIElements;
5+
6+
namespace VisualPinball.Engine.Mpf.Unity.Editor
7+
{
8+
public class MissingGleHelpBoxes : VisualElement
9+
{
10+
private readonly HelpBox _missingGleHelpBox;
11+
private readonly HelpBox _misconfiguredGleHelpBox;
12+
private readonly UnityEditor.Editor _editor;
13+
14+
public MissingGleHelpBoxes(UnityEditor.Editor editor)
15+
{
16+
_editor = editor;
17+
_missingGleHelpBox = new HelpBox(
18+
"This component must be on a game object that is underneath an "
19+
+ "'MPF Game Logic' component in the scene hierarchy.",
20+
HelpBoxMessageType.Error
21+
);
22+
Add(_missingGleHelpBox);
23+
24+
_misconfiguredGleHelpBox = new HelpBox(
25+
"The MPF game logic engine is not configured to use the included media "
26+
+ $"controller. Set 'Media Controller' to '{MpfMediaController.Included}' "
27+
+ "in the game logic engine inspector.",
28+
HelpBoxMessageType.Error
29+
);
30+
Add(_misconfiguredGleHelpBox);
31+
32+
RegisterCallback<AttachToPanelEvent>(evt =>
33+
{
34+
UpdateHelpBoxVisibility();
35+
EditorApplication.hierarchyChanged += OnHierarchyChanged;
36+
});
37+
38+
RegisterCallback<DetachFromPanelEvent>(evt =>
39+
{
40+
EditorApplication.hierarchyChanged -= OnHierarchyChanged;
41+
});
42+
}
43+
44+
private void OnHierarchyChanged() => UpdateHelpBoxVisibility();
45+
46+
private void UpdateHelpBoxVisibility()
47+
{
48+
if (_editor.targets.ToList().Any(IsGleMissing))
49+
_missingGleHelpBox.style.display = DisplayStyle.Flex;
50+
else
51+
_missingGleHelpBox.style.display = DisplayStyle.None;
52+
if (_editor.targets.ToList().Any(IsGleMisconfigured))
53+
_misconfiguredGleHelpBox.style.display = DisplayStyle.Flex;
54+
else
55+
_misconfiguredGleHelpBox.style.display = DisplayStyle.None;
56+
}
57+
58+
private MpfGamelogicEngine GetParentGle(UnityEngine.Object target)
59+
{
60+
return ((Component)target).GetComponentInParent<MpfGamelogicEngine>();
61+
}
62+
63+
private bool IsGleMissing(UnityEngine.Object target) => GetParentGle(target) == null;
64+
65+
private bool IsGleMisconfigured(UnityEngine.Object target)
66+
{
67+
return !IsGleMissing(target)
68+
&& GetParentGle(target).MediaControllerSetting != MpfMediaController.Included;
69+
}
70+
}
71+
}

Editor/Inspector/MissingGleHelpBoxes.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.
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Visual Pinball Engine
2+
// Copyright (C) 2025 freezy and VPE Team
3+
//
4+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
5+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
6+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
7+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
8+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
9+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
10+
// SOFTWARE.
11+
12+
using UnityEditor;
13+
using UnityEditor.UIElements;
14+
using UnityEngine.UIElements;
15+
using VisualPinball.Engine.Mpf.Unity.MediaController.Text;
16+
17+
namespace VisualPinball.Engine.Mpf.Unity.Editor
18+
{
19+
[
20+
CustomEditor(typeof(MonitoredVariableTextBase), editorForChildClasses: true),
21+
CanEditMultipleObjects
22+
]
23+
public class MonitoredVariableTextInspector : UnityEditor.Editor
24+
{
25+
public override VisualElement CreateInspectorGUI()
26+
{
27+
var root = new VisualElement();
28+
root.Add(new MissingGleHelpBoxes(this));
29+
InspectorElement.FillDefaultInspector(root, serializedObject, this);
30+
return root;
31+
}
32+
}
33+
}
File renamed without changes.

Editor/Inspector/MpfMonitorInspector.cs

Lines changed: 0 additions & 89 deletions
This file was deleted.
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// Visual Pinball Engine
2+
// Copyright (C) 2025 freezy and VPE Team
3+
//
4+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
5+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
6+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
7+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
8+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
9+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
10+
// SOFTWARE.
11+
12+
using UnityEditor;
13+
using UnityEditor.UIElements;
14+
using UnityEngine.UIElements;
15+
using VisualPinball.Engine.Mpf.Unity.MediaController.ObjectToggle;
16+
17+
namespace VisualPinball.Engine.Mpf.Unity.Editor
18+
{
19+
[CustomEditor(typeof(ToggleOnEvent)), CanEditMultipleObjects]
20+
public class ToggleOnEventIInspector : UnityEditor.Editor
21+
{
22+
public override VisualElement CreateInspectorGUI()
23+
{
24+
var root = new VisualElement();
25+
root.Add(new MissingGleHelpBoxes(this));
26+
root.Add(new DisabledParentObjectHelpBox(this));
27+
InspectorElement.FillDefaultInspector(root, serializedObject, this);
28+
return root;
29+
}
30+
}
31+
}

0 commit comments

Comments
 (0)