A game about forced loneliness, made by TACStudios
1using UnityEditor.SceneManagement;
2using UnityEngine;
3using UnityEngine.Tilemaps;
4
5namespace UnityEditor.Tilemaps
6{
7 internal class TilemapFocusModeUtility
8 {
9 internal enum TilemapFocusMode
10 {
11 None = 0,
12 Tilemap = 1,
13 Grid = 2
14 }
15 private static readonly string k_TilemapFocusModeEditorPref = "TilemapFocusMode";
16
17 internal static TilemapFocusMode focusMode
18 {
19 get
20 {
21 return (TilemapFocusMode)EditorPrefs.GetInt(k_TilemapFocusModeEditorPref, (int)TilemapFocusMode.None);
22 }
23 set
24 {
25 EditorPrefs.SetInt(k_TilemapFocusModeEditorPref, (int)value);
26 }
27 }
28
29 internal static void OnSceneViewGUI(SceneView sceneView)
30 {
31 if ((GridPaintingState.defaultBrush == null || GridPaintingState.scenePaintTarget == null) && focusMode != TilemapFocusMode.None)
32 {
33 // case 946284: Disable Focus if focus mode is set but there is nothing to focus on
34 DisableFocus();
35 focusMode = TilemapFocusMode.None;
36 }
37 }
38
39 internal static void OnScenePaintTargetChanged(GameObject scenePaintTarget)
40 {
41 DisableFocus();
42 EnableFocus();
43 SceneView.RepaintAll();
44 }
45
46 internal static void OnBrushChanged(GridBrushBase brush)
47 {
48 DisableFocus();
49 if (brush is GridBrush)
50 EnableFocus();
51 SceneView.RepaintAll();
52 }
53
54 internal static void SetFocusMode(TilemapFocusMode tilemapFocusMode)
55 {
56 if (tilemapFocusMode != focusMode)
57 {
58 DisableFocus();
59 focusMode = tilemapFocusMode;
60 EnableFocus();
61 }
62 }
63
64 private static void EnableFocus()
65 {
66 if (GridPaintingState.scenePaintTarget == null)
67 return;
68
69 switch (focusMode)
70 {
71 case TilemapFocusMode.Tilemap:
72 {
73 FilterSingleSceneObjectInScene(GridPaintingState.scenePaintTarget.GetInstanceID());
74 break;
75 }
76 case TilemapFocusMode.Grid:
77 {
78 Tilemap tilemap = GridPaintingState.scenePaintTarget.GetComponent<Tilemap>();
79 if (tilemap != null && tilemap.layoutGrid != null)
80 {
81 FilterSingleSceneObjectInScene(tilemap.layoutGrid.gameObject.GetInstanceID());
82 }
83 break;
84 }
85 }
86 }
87
88 private static void DisableFocus()
89 {
90 if (focusMode == TilemapFocusMode.None)
91 return;
92
93 StageHandle currentStageHandle = StageUtility.GetCurrentStageHandle();
94 if (currentStageHandle.IsValid() && !currentStageHandle.isMainStage)
95 {
96 HierarchyProperty.ClearSceneObjectsFilterInScene(new[] { currentStageHandle.customScene });
97 }
98 else
99 {
100 HierarchyProperty.ClearSceneObjectsFilter();
101 }
102
103 if (SceneView.lastActiveSceneView != null)
104 {
105 SceneView.lastActiveSceneView.SetSceneViewFiltering(false);
106 SceneView.lastActiveSceneView.Repaint();
107 }
108 }
109
110 private static void FilterSingleSceneObjectInScene(int instanceID)
111 {
112 if (SceneView.lastActiveSceneView != null)
113 SceneView.lastActiveSceneView.SetSceneViewFiltering(true);
114
115 StageHandle currentStageHandle = StageUtility.GetCurrentStageHandle();
116 if (currentStageHandle.IsValid() && !currentStageHandle.isMainStage)
117 {
118 HierarchyProperty.FilterSingleSceneObjectInScene(instanceID
119 , false
120 , new[] { currentStageHandle.customScene });
121 }
122 else
123 {
124 HierarchyProperty.FilterSingleSceneObject(instanceID, false);
125 }
126
127 if (SceneView.lastActiveSceneView != null)
128 SceneView.lastActiveSceneView.Repaint();
129 }
130 }
131}