PWBToolbarOverlay.cs 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618
  1. /*
  2. Copyright (c) 2021 Omar Duarte
  3. Unauthorized copying of this file, via any medium is strictly prohibited.
  4. Writen by Omar Duarte, 2021.
  5. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  6. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  7. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  8. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  9. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  10. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  11. THE SOFTWARE.
  12. */
  13. #if UNITY_2021_2_OR_NEWER
  14. using UnityEngine;
  15. using UnityEditor.Overlays;
  16. using UnityEditor.Toolbars;
  17. using UnityEngine.UIElements;
  18. namespace PluginMaster
  19. {
  20. #region TOGGLE MANAGER
  21. public static class ToggleManager
  22. {
  23. private static System.Collections.Generic.Dictionary<ToolManager.PaintTool, IPWBToogle> _toogles = null;
  24. private static System.Collections.Generic.Dictionary<ToolManager.PaintTool, IPWBToogle> toogles
  25. {
  26. get
  27. {
  28. if (_toogles == null)
  29. {
  30. _toogles = new System.Collections.Generic.Dictionary<ToolManager.PaintTool, IPWBToogle>()
  31. {
  32. {ToolManager.PaintTool.PIN, PinToggle.instance },
  33. {ToolManager.PaintTool.BRUSH, BrushToggle.instance},
  34. {ToolManager.PaintTool.GRAVITY, GravityToggle.instance},
  35. {ToolManager.PaintTool.LINE, LineToggle.instance},
  36. {ToolManager.PaintTool.SHAPE, ShapeToggle.instance},
  37. {ToolManager.PaintTool.TILING, TilingToggle.instance},
  38. {ToolManager.PaintTool.REPLACER, ReplacerToggle.instance},
  39. {ToolManager.PaintTool.ERASER, EraserToggle.instance},
  40. {ToolManager.PaintTool.SELECTION, SelectionToggle.instance},
  41. {ToolManager.PaintTool.CIRCLE_SELECT, CircleSelectToggle.instance},
  42. {ToolManager.PaintTool.EXTRUDE, ExtrudeToggle.instance},
  43. {ToolManager.PaintTool.MIRROR, MirrorToggle.instance}
  44. };
  45. }
  46. return _toogles;
  47. }
  48. }
  49. public static void DeselectOthers(string id)
  50. {
  51. foreach (var toggle in toogles.Values)
  52. {
  53. if (toggle == null) continue;
  54. if (id != toggle.id && toggle.value) toggle.value = false;
  55. }
  56. }
  57. public static string GetTooltip(string tooltip, string keyCombination) => tooltip + " ... " + keyCombination;
  58. public static string iconPath => UnityEditor.EditorGUIUtility.isProSkin ? "Sprites/" : "Sprites/LightTheme/";
  59. }
  60. #endregion
  61. #region TOGGLE BASE
  62. interface IPWBToogle
  63. {
  64. public string id { get; }
  65. public ToolManager.PaintTool tool { get; }
  66. public bool value { get; set; }
  67. }
  68. public abstract class ToolToggleBase<T> : UnityEditor.Toolbars.EditorToolbarToggle,
  69. IPWBToogle where T : UnityEditor.Toolbars.EditorToolbarToggle, new()
  70. {
  71. private static ToolToggleBase<T> _instance = null;
  72. public static ToolToggleBase<T> instance => _instance;
  73. public abstract string id { get; }
  74. public abstract ToolManager.PaintTool tool { get; }
  75. public ToolToggleBase()
  76. {
  77. _instance = this;
  78. this.RegisterValueChangedCallback(OnValueChange);
  79. ToolManager.OnToolChange += OnToolChange;
  80. }
  81. private void OnToolChange(ToolManager.PaintTool prevTool)
  82. {
  83. if (tool == prevTool || tool == ToolManager.tool) PWBIO.OnToolChange(prevTool);
  84. if (tool == prevTool && tool != ToolManager.tool && value) value = false;
  85. if (tool == ToolManager.tool && !value) value = true;
  86. }
  87. private void OnValueChange(UnityEngine.UIElements.ChangeEvent<bool> evt)
  88. {
  89. if (evt.newValue)
  90. {
  91. ToolManager.tool = tool;
  92. ToggleManager.DeselectOthers(id);
  93. }
  94. else if (tool == ToolManager.tool) ToolManager.DeselectTool();
  95. }
  96. }
  97. #endregion
  98. #region TOOLBAR OVERLAY MANAGER
  99. public static class ToolbarOverlayManager
  100. {
  101. public static void OnToolbarDisplayedChanged()
  102. {
  103. if (!PWBCore.staticData.closeAllWindowsWhenClosingTheToolbar) return;
  104. if (PWBPropPlacementToolbarOverlay.IsDisplayed) return;
  105. if (PWBSelectionToolbarOverlay.IsDisplayed) return;
  106. if (PWBGridToolbarOverlay.IsDisplayed) return;
  107. if (ModularEnvironmentsToolbarOverlay.IsDisplayed) return;
  108. if (SettingsAndDocsToolbarOverlay.IsDisplayed) return;
  109. PWBIO.CloseAllWindows();
  110. }
  111. }
  112. #endregion
  113. #region MODULAR ENVIRONMENTS TOOLS
  114. [UnityEditor.Toolbars.EditorToolbarElement(ID, typeof(UnityEditor.SceneView))]
  115. public class WallsToggle : ToolToggleBase<WallsToggle>
  116. {
  117. public const string ID = "PWB/WallsToggle";
  118. public override string id => ID;
  119. public override ToolManager.PaintTool tool => ToolManager.PaintTool.WALL;
  120. public WallsToggle() : base()
  121. {
  122. icon = Resources.Load<Texture2D>(ToggleManager.iconPath + "Walls");
  123. tooltip = ToggleManager.GetTooltip("Walls", PWBSettings.shortcuts.toolbarWallToggle.combination.ToString());
  124. }
  125. }
  126. [UnityEditor.Toolbars.EditorToolbarElement(ID, typeof(UnityEditor.SceneView))]
  127. public class FloorsToggle : ToolToggleBase<FloorsToggle>
  128. {
  129. public const string ID = "PWB/FloorsToggle";
  130. public override string id => ID;
  131. public override ToolManager.PaintTool tool => ToolManager.PaintTool.FLOOR;
  132. public FloorsToggle() : base()
  133. {
  134. icon = Resources.Load<Texture2D>(ToggleManager.iconPath + "Floors");
  135. tooltip = ToggleManager.GetTooltip("Floors", PWBSettings.shortcuts.toolbarFloorToggle.combination.ToString());
  136. }
  137. }
  138. [Icon("Assets/PluginMaster/DesignTools/PrefabWorldBuilder/Editor/Resources/Sprites/Walls.png")]
  139. [UnityEditor.Overlays.Overlay(typeof(UnityEditor.SceneView), "PWB/Modular Environments Tools", true)]
  140. public class ModularEnvironmentsToolbarOverlay : UnityEditor.Overlays.ToolbarOverlay
  141. {
  142. private static bool _isDisplayed = false;
  143. ModularEnvironmentsToolbarOverlay() : base(FloorsToggle.ID, WallsToggle.ID) => displayedChanged += OndisplayedChanged;
  144. private void OndisplayedChanged(bool value)
  145. {
  146. _isDisplayed = value;
  147. ToolbarOverlayManager.OnToolbarDisplayedChanged();
  148. }
  149. public static bool IsDisplayed => _isDisplayed;
  150. }
  151. #endregion
  152. #region PROP PLACEMENT TOOLS
  153. [UnityEditor.Toolbars.EditorToolbarElement(ID, typeof(UnityEditor.SceneView))]
  154. public class PinToggle : ToolToggleBase<PinToggle>
  155. {
  156. public const string ID = "PWB/PinToggle";
  157. public override string id => ID;
  158. public override ToolManager.PaintTool tool => ToolManager.PaintTool.PIN;
  159. public PinToggle() : base()
  160. {
  161. icon = Resources.Load<Texture2D>(ToggleManager.iconPath + "Pin");
  162. tooltip = ToggleManager.GetTooltip("Pin", PWBSettings.shortcuts.toolbarPinToggle.combination.ToString());
  163. }
  164. }
  165. [UnityEditor.Toolbars.EditorToolbarElement(ID, typeof(UnityEditor.SceneView))]
  166. public class BrushToggle : ToolToggleBase<BrushToggle>
  167. {
  168. public const string ID = "PWB/BrushToggle";
  169. public override string id => ID;
  170. public override ToolManager.PaintTool tool => ToolManager.PaintTool.BRUSH;
  171. public BrushToggle() : base()
  172. {
  173. icon = Resources.Load<Texture2D>(ToggleManager.iconPath + "Brush");
  174. tooltip = ToggleManager.GetTooltip("Brush", PWBSettings.shortcuts.toolbarBrushToggle.combination.ToString());
  175. }
  176. }
  177. [UnityEditor.Toolbars.EditorToolbarElement(ID, typeof(UnityEditor.SceneView))]
  178. public class GravityToggle : ToolToggleBase<GravityToggle>
  179. {
  180. public const string ID = "PWB/GravityToggle";
  181. public override string id => ID;
  182. public override ToolManager.PaintTool tool => ToolManager.PaintTool.GRAVITY;
  183. public GravityToggle() : base()
  184. {
  185. icon = Resources.Load<Texture2D>(ToggleManager.iconPath + "GravityTool");
  186. tooltip = ToggleManager.GetTooltip("Gravity Brush",
  187. PWBSettings.shortcuts.toolbarGravityToggle.combination.ToString());
  188. }
  189. }
  190. [UnityEditor.Toolbars.EditorToolbarElement(ID, typeof(UnityEditor.SceneView))]
  191. public class LineToggle : ToolToggleBase<LineToggle>
  192. {
  193. public const string ID = "PWB/LineToggle";
  194. public override string id => ID;
  195. public override ToolManager.PaintTool tool => ToolManager.PaintTool.LINE;
  196. public LineToggle() : base()
  197. {
  198. icon = Resources.Load<Texture2D>(ToggleManager.iconPath + "Line");
  199. tooltip = ToggleManager.GetTooltip("Line", PWBSettings.shortcuts.toolbarLineToggle.combination.ToString());
  200. }
  201. }
  202. [UnityEditor.Toolbars.EditorToolbarElement(ID, typeof(UnityEditor.SceneView))]
  203. public class ShapeToggle : ToolToggleBase<ShapeToggle>
  204. {
  205. public const string ID = "PWB/ShapeToggle";
  206. public override string id => ID;
  207. public override ToolManager.PaintTool tool => ToolManager.PaintTool.SHAPE;
  208. public ShapeToggle() : base()
  209. {
  210. icon = Resources.Load<Texture2D>(ToggleManager.iconPath + "Shape");
  211. tooltip = ToggleManager.GetTooltip("Shape", PWBSettings.shortcuts.toolbarShapeToggle.combination.ToString());
  212. }
  213. }
  214. [UnityEditor.Toolbars.EditorToolbarElement(ID, typeof(UnityEditor.SceneView))]
  215. public class TilingToggle : ToolToggleBase<TilingToggle>
  216. {
  217. public const string ID = "PWB/TilingToggle";
  218. public override string id => ID;
  219. public override ToolManager.PaintTool tool => ToolManager.PaintTool.TILING;
  220. public TilingToggle() : base()
  221. {
  222. icon = Resources.Load<Texture2D>(ToggleManager.iconPath + "Tiling");
  223. tooltip = ToggleManager.GetTooltip("Tiling", PWBSettings.shortcuts.toolbarTilingToggle.combination.ToString());
  224. }
  225. }
  226. [UnityEditor.Toolbars.EditorToolbarElement(ID, typeof(UnityEditor.SceneView))]
  227. public class ReplacerToggle : ToolToggleBase<ReplacerToggle>
  228. {
  229. public const string ID = "PWB/ReplacerToggle";
  230. public override string id => ID;
  231. public override ToolManager.PaintTool tool => ToolManager.PaintTool.REPLACER;
  232. public ReplacerToggle() : base()
  233. {
  234. icon = Resources.Load<Texture2D>(ToggleManager.iconPath + "Replace");
  235. tooltip = ToggleManager.GetTooltip("Replacer", PWBSettings.shortcuts.toolbarReplacerToggle.combination.ToString());
  236. }
  237. }
  238. [UnityEditor.Toolbars.EditorToolbarElement(ID, typeof(UnityEditor.SceneView))]
  239. public class EraserToggle : ToolToggleBase<EraserToggle>
  240. {
  241. public const string ID = "PWB/EraserToggle";
  242. public override string id => ID;
  243. public override ToolManager.PaintTool tool => ToolManager.PaintTool.ERASER;
  244. public EraserToggle() : base()
  245. {
  246. icon = Resources.Load<Texture2D>(ToggleManager.iconPath + "Eraser");
  247. tooltip = ToggleManager.GetTooltip("Eraser", PWBSettings.shortcuts.toolbarEraserToggle.combination.ToString());
  248. }
  249. }
  250. [Icon("Assets/PluginMaster/DesignTools/PrefabWorldBuilder/Editor/Resources/Sprites/Brush.png")]
  251. [UnityEditor.Overlays.Overlay(typeof(UnityEditor.SceneView), "PWB/Prop Placement Tools", true)]
  252. public class PWBPropPlacementToolbarOverlay : UnityEditor.Overlays.ToolbarOverlay
  253. {
  254. private static bool _isDisplayed = false;
  255. PWBPropPlacementToolbarOverlay() : base(PinToggle.ID, BrushToggle.ID, GravityToggle.ID, LineToggle.ID,
  256. ShapeToggle.ID, TilingToggle.ID, ReplacerToggle.ID, EraserToggle.ID)
  257. {
  258. this.displayedChanged += OndisplayedChanged;
  259. }
  260. private void OndisplayedChanged(bool value)
  261. {
  262. _isDisplayed = value;
  263. ToolbarOverlayManager.OnToolbarDisplayedChanged();
  264. }
  265. public static bool IsDisplayed => _isDisplayed;
  266. }
  267. #endregion
  268. #region SELECTION TOOLS
  269. [UnityEditor.Toolbars.EditorToolbarElement(ID, typeof(UnityEditor.SceneView))]
  270. public class SelectionToggle : ToolToggleBase<SelectionToggle>
  271. {
  272. public const string ID = "PWB/SelectionToggle";
  273. public override string id => ID;
  274. public override ToolManager.PaintTool tool => ToolManager.PaintTool.SELECTION;
  275. public SelectionToggle() : base()
  276. {
  277. icon = Resources.Load<Texture2D>(ToggleManager.iconPath + "Selection");
  278. tooltip = ToggleManager.GetTooltip("Selection",
  279. PWBSettings.shortcuts.toolbarSelectionToggle.combination.ToString());
  280. }
  281. }
  282. [UnityEditor.Toolbars.EditorToolbarElement(ID, typeof(UnityEditor.SceneView))]
  283. public class CircleSelectToggle : ToolToggleBase<CircleSelectToggle>
  284. {
  285. public const string ID = "PWB/CircleSelectToggle";
  286. public override string id => ID;
  287. public override ToolManager.PaintTool tool => ToolManager.PaintTool.CIRCLE_SELECT;
  288. public CircleSelectToggle() : base()
  289. {
  290. icon = Resources.Load<Texture2D>(ToggleManager.iconPath + "CircleSelect");
  291. tooltip = ToggleManager.GetTooltip("Circle Select",
  292. PWBSettings.shortcuts.toolbarCircleSelectToggle.combination.ToString());
  293. }
  294. }
  295. [UnityEditor.Toolbars.EditorToolbarElement(ID, typeof(UnityEditor.SceneView))]
  296. public class ExtrudeToggle : ToolToggleBase<ExtrudeToggle>
  297. {
  298. public const string ID = "PWB/ExtrudeToggle";
  299. public override string id => ID;
  300. public override ToolManager.PaintTool tool => ToolManager.PaintTool.EXTRUDE;
  301. public ExtrudeToggle() : base()
  302. {
  303. icon = Resources.Load<Texture2D>(ToggleManager.iconPath + "Extrude");
  304. tooltip = ToggleManager.GetTooltip("Extrude", PWBSettings.shortcuts.toolbarExtrudeToggle.combination.ToString());
  305. }
  306. }
  307. [UnityEditor.Toolbars.EditorToolbarElement(ID, typeof(UnityEditor.SceneView))]
  308. public class MirrorToggle : ToolToggleBase<MirrorToggle>
  309. {
  310. public const string ID = "PWB/MirrorToggle";
  311. public override string id => ID;
  312. public override ToolManager.PaintTool tool => ToolManager.PaintTool.MIRROR;
  313. public MirrorToggle() : base()
  314. {
  315. icon = Resources.Load<Texture2D>(ToggleManager.iconPath + "Mirror");
  316. tooltip = ToggleManager.GetTooltip("Mirror", PWBSettings.shortcuts.toolbarMirrorToggle.combination.ToString());
  317. }
  318. }
  319. [Icon("Assets/PluginMaster/DesignTools/PrefabWorldBuilder/Editor/Resources/Sprites/Selection.png")]
  320. [UnityEditor.Overlays.Overlay(typeof(UnityEditor.SceneView), "PWB/Selection Tools", true)]
  321. public class PWBSelectionToolbarOverlay : UnityEditor.Overlays.ToolbarOverlay
  322. {
  323. private static bool _isDisplayed = false;
  324. PWBSelectionToolbarOverlay() : base(SelectionToggle.ID, CircleSelectToggle.ID, ExtrudeToggle.ID, MirrorToggle.ID)
  325. {
  326. this.displayedChanged += OndisplayedChanged;
  327. }
  328. private void OndisplayedChanged(bool value)
  329. {
  330. _isDisplayed = value;
  331. ToolbarOverlayManager.OnToolbarDisplayedChanged();
  332. }
  333. public static bool IsDisplayed => _isDisplayed;
  334. }
  335. #endregion
  336. #region GRID TOOLS
  337. [UnityEditor.Toolbars.EditorToolbarElement(ID, typeof(UnityEditor.SceneView))]
  338. public class GridTypeToggle : UnityEditor.Toolbars.EditorToolbarButton
  339. {
  340. public const string ID = "PWB/GridTypeToggle";
  341. private Texture2D _radialGridIcon = null;
  342. private Texture2D _rectGridIcon = null;
  343. public GridTypeToggle() : base()
  344. {
  345. UpdateIcon();
  346. clicked += OnClick;
  347. SnapManager.settings.OnDataChanged += UpdateIcon;
  348. }
  349. public void UpdateIcon()
  350. {
  351. if (_radialGridIcon == null) _radialGridIcon = Resources.Load<Texture2D>(ToggleManager.iconPath + "RadialGrid");
  352. if (_rectGridIcon == null) _rectGridIcon = Resources.Load<Texture2D>(ToggleManager.iconPath + "Grid");
  353. icon = SnapManager.settings.radialGridEnabled ? _rectGridIcon : _radialGridIcon;
  354. tooltip = SnapManager.settings.radialGridEnabled ? "Grid" : "Radial Grid";
  355. }
  356. private void OnClick()
  357. {
  358. SnapManager.settings.radialGridEnabled = !SnapManager.settings.radialGridEnabled;
  359. UpdateIcon();
  360. SnapSettingsWindow.RepaintWindow();
  361. }
  362. }
  363. public abstract class GridBarToggle : EditorToolbarDropdownToggle
  364. {
  365. public GridBarToggle()
  366. {
  367. SnapManager.settings.OnDataChanged += UpdateValue;
  368. UnityEditor.SceneView.duringSceneGui += UpdateValue;
  369. }
  370. protected abstract void UpdateValue();
  371. private void UpdateValue(UnityEditor.SceneView sceneView) => UpdateValue();
  372. }
  373. [UnityEditor.Toolbars.EditorToolbarElement(ID, typeof(UnityEditor.SceneView))]
  374. public class SnapToggle : GridBarToggle, UnityEditor.Toolbars.IAccessContainerWindow
  375. {
  376. public const string ID = "PWB/SnapToggle";
  377. public UnityEditor.EditorWindow containerWindow { get; set; }
  378. public SnapToggle() : base()
  379. {
  380. icon = Resources.Load<Texture2D>(ToggleManager.iconPath + "SnapOn");
  381. tooltip = "Enable snapping";
  382. dropdownClicked += ShowSnapWindow;
  383. this.RegisterValueChangedCallback(OnValueChange);
  384. }
  385. protected override void UpdateValue() => value = SnapManager.settings.snappingEnabled;
  386. private void OnValueChange(UnityEngine.UIElements.ChangeEvent<bool> evt)
  387. {
  388. SnapManager.settings.snappingEnabled = evt.newValue;
  389. SnapSettingsWindow.RepaintWindow();
  390. }
  391. private void ShowSnapWindow()
  392. {
  393. var settings = SnapManager.settings;
  394. var menu = new UnityEditor.GenericMenu();
  395. if (settings.radialGridEnabled)
  396. {
  397. menu.AddItem(new GUIContent("Snap To Radius"), settings.snapToRadius,
  398. () => settings.snapToRadius = !settings.snapToRadius);
  399. menu.AddItem(new GUIContent("Snap To Circunference"), settings.snapToCircunference,
  400. () => settings.snapToCircunference = !settings.snapToCircunference);
  401. }
  402. else
  403. {
  404. menu.AddItem(new GUIContent("X"), settings.snappingOnX, () => settings.snappingOnX = !settings.snappingOnX);
  405. menu.AddItem(new GUIContent("Y"), settings.snappingOnY, () => settings.snappingOnY = !settings.snappingOnY);
  406. menu.AddItem(new GUIContent("Z"), settings.snappingOnZ, () => settings.snappingOnZ = !settings.snappingOnZ);
  407. }
  408. menu.ShowAsContext();
  409. SnapSettingsWindow.RepaintWindow();
  410. }
  411. }
  412. [UnityEditor.Toolbars.EditorToolbarElement(ID, typeof(UnityEditor.SceneView))]
  413. public class GridToggle : GridBarToggle, UnityEditor.Toolbars.IAccessContainerWindow
  414. {
  415. public const string ID = "PWB/GridToggle";
  416. public UnityEditor.EditorWindow containerWindow { get; set; }
  417. private void UpdateIcon()
  418. {
  419. var settings = SnapManager.settings;
  420. icon = Resources.Load<Texture2D>(ToggleManager.iconPath + "ShowGrid"
  421. + (settings.gridOnY ? "Y" : (settings.gridOnX ? "X" : "Z")));
  422. }
  423. public GridToggle() : base()
  424. {
  425. UpdateIcon();
  426. tooltip = "Show grid";
  427. dropdownClicked += ShowGridWindow;
  428. this.RegisterValueChangedCallback(OnValueChange);
  429. var settings = SnapManager.settings;
  430. }
  431. protected override void UpdateValue() => value = SnapManager.settings.visibleGrid;
  432. private void OnValueChange(UnityEngine.UIElements.ChangeEvent<bool> evt)
  433. => SnapManager.settings.visibleGrid = evt.newValue;
  434. private void ShowGridWindow()
  435. {
  436. var settings = SnapManager.settings;
  437. var menu = new UnityEditor.GenericMenu();
  438. menu.AddItem(new GUIContent("X"), settings.gridOnX,
  439. () =>
  440. {
  441. settings.gridOnX = !settings.gridOnX;
  442. UpdateIcon();
  443. });
  444. menu.AddItem(new GUIContent("Y"), settings.gridOnY,
  445. () =>
  446. {
  447. settings.gridOnY = !settings.gridOnY;
  448. UpdateIcon();
  449. });
  450. menu.AddItem(new GUIContent("Z"), settings.gridOnZ,
  451. () =>
  452. {
  453. settings.gridOnZ = !settings.gridOnZ;
  454. UpdateIcon();
  455. });
  456. menu.ShowAsContext();
  457. }
  458. }
  459. [UnityEditor.Toolbars.EditorToolbarElement(ID, typeof(UnityEditor.SceneView))]
  460. public class LockGridToggle : UnityEditor.Toolbars.EditorToolbarToggle
  461. {
  462. public const string ID = "PWB/LockGridToggle";
  463. public LockGridToggle()
  464. {
  465. UpdteIcon();
  466. this.RegisterValueChangedCallback(OnValueChange);
  467. SnapManager.settings.OnDataChanged += UpdateValue;
  468. UnityEditor.SceneView.duringSceneGui += UpdateValue;
  469. }
  470. protected void UpdateValue() => value = SnapManager.settings.lockedGrid;
  471. private void UpdateValue(UnityEditor.SceneView sceneView) => UpdateValue();
  472. private void UpdteIcon()
  473. {
  474. icon = Resources.Load<Texture2D>(ToggleManager.iconPath
  475. + (SnapManager.settings.lockedGrid ? "LockGrid" : "UnlockGrid"));
  476. tooltip = SnapManager.settings.lockedGrid ? "Lock the grid origin in place" : "Unlock the grid origin";
  477. }
  478. private void OnValueChange(UnityEngine.UIElements.ChangeEvent<bool> evt)
  479. {
  480. SnapManager.settings.lockedGrid = evt.newValue;
  481. UpdteIcon();
  482. }
  483. }
  484. [UnityEditor.Toolbars.EditorToolbarElement(ID, typeof(UnityEditor.SceneView))]
  485. public class GridSettingsButton : UnityEditor.Toolbars.EditorToolbarButton
  486. {
  487. public const string ID = "PWB/GridSettingsButton";
  488. public GridSettingsButton()
  489. {
  490. icon = Resources.Load<Texture2D>(ToggleManager.iconPath + "SnapSettings");
  491. tooltip = "Grid & Snapping Settings";
  492. clicked += SnapSettingsWindow.ShowWindow;
  493. }
  494. }
  495. [Icon("Assets/PluginMaster/DesignTools/PrefabWorldBuilder/Editor/Resources/Sprites/Grid.png")]
  496. [UnityEditor.Overlays.Overlay(typeof(UnityEditor.SceneView), "PWB/Grid Tools", true)]
  497. public class PWBGridToolbarOverlay : UnityEditor.Overlays.ToolbarOverlay
  498. {
  499. private static bool _isDisplayed = false;
  500. PWBGridToolbarOverlay() : base(GridTypeToggle.ID, SnapToggle.ID,
  501. GridToggle.ID, LockGridToggle.ID)
  502. {
  503. this.displayedChanged += OndisplayedChanged;
  504. }
  505. private void OndisplayedChanged(bool value)
  506. {
  507. _isDisplayed = value;
  508. ToolbarOverlayManager.OnToolbarDisplayedChanged();
  509. }
  510. public static bool IsDisplayed => _isDisplayed;
  511. }
  512. #endregion
  513. #region SETTINGS & DOCS
  514. [UnityEditor.Toolbars.EditorToolbarElement(ID, typeof(UnityEditor.SceneView))]
  515. public class PropertiesButton : UnityEditor.Toolbars.EditorToolbarButton
  516. {
  517. public const string ID = "PWB/PropertiesButton";
  518. public PropertiesButton()
  519. {
  520. icon = Resources.Load<Texture2D>(ToggleManager.iconPath + "ToolProperties");
  521. tooltip = "Tool Properties";
  522. clicked += ToolProperties.ShowWindow;
  523. }
  524. }
  525. [UnityEditor.Toolbars.EditorToolbarElement(ID, typeof(UnityEditor.SceneView))]
  526. public class HelpButton : UnityEditor.Toolbars.EditorToolbarButton
  527. {
  528. public const string ID = "PWB/HelpButton";
  529. public HelpButton()
  530. {
  531. icon = Resources.Load<Texture2D>(ToggleManager.iconPath + "Help");
  532. tooltip = "Documentation";
  533. clicked += PWBCore.OpenDocFile;
  534. }
  535. }
  536. [UnityEditor.Toolbars.EditorToolbarElement(ID, typeof(UnityEditor.SceneView))]
  537. public class PreferencesButton : UnityEditor.Toolbars.EditorToolbarButton
  538. {
  539. public const string ID = "PWB/PreferencesButton";
  540. public PreferencesButton()
  541. {
  542. icon = Resources.Load<Texture2D>(ToggleManager.iconPath + "preferences");
  543. tooltip = "PWB Preferences";
  544. clicked += PWBPreferences.ShowWindow;
  545. }
  546. }
  547. [Icon("Assets/PluginMaster/DesignTools/PrefabWorldBuilder/Editor/Resources/Sprites/ToolProperties.png")]
  548. [UnityEditor.Overlays.Overlay(typeof(UnityEditor.SceneView), "PWB/Settings & Docs", true)]
  549. public class SettingsAndDocsToolbarOverlay : UnityEditor.Overlays.ToolbarOverlay
  550. {
  551. private static bool _isDisplayed = false;
  552. SettingsAndDocsToolbarOverlay()
  553. : base(PropertiesButton.ID, GridSettingsButton.ID, PreferencesButton.ID, HelpButton.ID)
  554. => displayedChanged += OndisplayedChanged;
  555. private void OndisplayedChanged(bool value)
  556. {
  557. _isDisplayed = value;
  558. ToolbarOverlayManager.OnToolbarDisplayedChanged();
  559. }
  560. public static bool IsDisplayed => _isDisplayed;
  561. }
  562. #endregion
  563. }
  564. #endif