PWBPreferences.cs 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995
  1. /*
  2. Copyright (c) 2022 Omar Duarte
  3. Unauthorized copying of this file, via any medium is strictly prohibited.
  4. Writen by Omar Duarte, 2022.
  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. using UnityEngine;
  14. using System.Linq;
  15. namespace PluginMaster
  16. {
  17. public class PWBPreferences : UnityEditor.EditorWindow
  18. {
  19. #region COMMON
  20. private int _tab = 0;
  21. private Vector2 _mainScrollPosition = Vector2.zero;
  22. private static PWBPreferences _instance = null;
  23. [UnityEditor.MenuItem("Tools/Plugin Master/Prefab World Builder/Preferences...", false, 1250)]
  24. public static void ShowWindow() => _instance = GetWindow<PWBPreferences>("PWB Preferences");
  25. private void OnEnable()
  26. {
  27. _instance = this;
  28. }
  29. private void OnGUI()
  30. {
  31. using (new GUILayout.HorizontalScope())
  32. {
  33. _tab = GUILayout.Toolbar(_tab, new string[] { "General", "Shortcuts" });
  34. GUILayout.FlexibleSpace();
  35. }
  36. using (var scrollView = new UnityEditor.EditorGUILayout.ScrollViewScope(_mainScrollPosition,
  37. false, false, GUI.skin.horizontalScrollbar, GUI.skin.verticalScrollbar, UnityEditor.EditorStyles.helpBox))
  38. {
  39. _mainScrollPosition = scrollView.scrollPosition;
  40. if (_tab == 0) GeneralSettings();
  41. else Shortcuts();
  42. }
  43. UpdateCombination();
  44. }
  45. #endregion
  46. #region GENERAL SETTINGS
  47. private bool _dataGroupOpen = true;
  48. //private bool _autoSaveGroupOpen = true;
  49. private bool _unsavedChangesGroupOpen = true;
  50. private bool _gizmosGroupOpen = true;
  51. private bool _toolbarGroupOpen = true;
  52. private bool _pinToolGroupOpen = true;
  53. private bool _gravityToolGroupOpen = true;
  54. private bool _BrushesGroupOpen = true;
  55. private bool _tempCollidersGroupOpen = true;
  56. private bool _palettesGroupOpen = true;
  57. private bool _editModeGroupOpen = true;
  58. private void GeneralSettings()
  59. {
  60. _dataGroupOpen
  61. = UnityEditor.EditorGUILayout.BeginFoldoutHeaderGroup(_dataGroupOpen, "Data Settings");
  62. if (_dataGroupOpen) DataGroup();
  63. UnityEditor.EditorGUILayout.EndFoldoutHeaderGroup();
  64. /*_autoSaveGroupOpen
  65. = UnityEditor.EditorGUILayout.BeginFoldoutHeaderGroup(_autoSaveGroupOpen, "Auto-Save Settings");
  66. if (_autoSaveGroupOpen) AutoSaveGroup();
  67. UnityEditor.EditorGUILayout.EndFoldoutHeaderGroup();
  68. */
  69. _unsavedChangesGroupOpen = UnityEditor.EditorGUILayout.BeginFoldoutHeaderGroup(_unsavedChangesGroupOpen,
  70. "Unsaved Changes");
  71. if (_unsavedChangesGroupOpen) UnsavedChangesGroup();
  72. UnityEditor.EditorGUILayout.EndFoldoutHeaderGroup();
  73. _gizmosGroupOpen = UnityEditor.EditorGUILayout.BeginFoldoutHeaderGroup(_gizmosGroupOpen, "Gizmos");
  74. if (_gizmosGroupOpen) GizmosGroup();
  75. UnityEditor.EditorGUILayout.EndFoldoutHeaderGroup();
  76. _toolbarGroupOpen = UnityEditor.EditorGUILayout.BeginFoldoutHeaderGroup(_toolbarGroupOpen, "Toolbar");
  77. if (_toolbarGroupOpen) ToolbarGroup();
  78. UnityEditor.EditorGUILayout.EndFoldoutHeaderGroup();
  79. _tempCollidersGroupOpen = UnityEditor.EditorGUILayout.BeginFoldoutHeaderGroup(_tempCollidersGroupOpen,
  80. "Temp Colliders");
  81. if (_tempCollidersGroupOpen) TempCollidersGroup();
  82. UnityEditor.EditorGUILayout.EndFoldoutHeaderGroup();
  83. _pinToolGroupOpen = UnityEditor.EditorGUILayout.BeginFoldoutHeaderGroup(_pinToolGroupOpen, "Pin Tool");
  84. if (_pinToolGroupOpen) PinToolGroup();
  85. UnityEditor.EditorGUILayout.EndFoldoutHeaderGroup();
  86. _gravityToolGroupOpen = UnityEditor.EditorGUILayout.BeginFoldoutHeaderGroup(_gravityToolGroupOpen, "Gravity Tool");
  87. if (_gravityToolGroupOpen) GravityToolGroup();
  88. UnityEditor.EditorGUILayout.EndFoldoutHeaderGroup();
  89. _editModeGroupOpen = UnityEditor.EditorGUILayout.BeginFoldoutHeaderGroup(_editModeGroupOpen, "Edit mode");
  90. if (_editModeGroupOpen) EditModeGroup();
  91. UnityEditor.EditorGUILayout.EndFoldoutHeaderGroup();
  92. _BrushesGroupOpen = UnityEditor.EditorGUILayout.BeginFoldoutHeaderGroup(_BrushesGroupOpen, "Brushes");
  93. if (_BrushesGroupOpen) BrushesGroup();
  94. UnityEditor.EditorGUILayout.EndFoldoutHeaderGroup();
  95. _palettesGroupOpen = UnityEditor.EditorGUILayout.BeginFoldoutHeaderGroup(_palettesGroupOpen, "Palettes");
  96. if (_palettesGroupOpen) PalettesGroup();
  97. UnityEditor.EditorGUILayout.EndFoldoutHeaderGroup();
  98. }
  99. private void DataGroup()
  100. {
  101. using (new GUILayout.HorizontalScope(UnityEditor.EditorStyles.helpBox))
  102. {
  103. UnityEditor.EditorGUIUtility.labelWidth = 90;
  104. UnityEditor.EditorGUILayout.LabelField("Data directory:"
  105. , PWBSettings.fullDataDir, UnityEditor.EditorStyles.textField);
  106. if (GUILayout.Button("...", GUILayout.Width(29), GUILayout.Height(20)))
  107. {
  108. var directory = UnityEditor.EditorUtility.OpenFolderPanel("Select data directory...",
  109. PWBSettings.fullDataDir, "Data");
  110. if (System.IO.Directory.Exists(directory)) PWBSettings.SetDataDir(directory);
  111. }
  112. }
  113. }
  114. /*
  115. private void AutoSaveGroup()
  116. {
  117. using (new GUILayout.HorizontalScope(UnityEditor.EditorStyles.helpBox))
  118. {
  119. GUILayout.Label("Auto-Save Every:");
  120. PWBCore.staticData.autoSavePeriodMinutes
  121. = UnityEditor.EditorGUILayout.IntSlider(PWBCore.staticData.autoSavePeriodMinutes, 1, 10);
  122. GUILayout.Label("minutes");
  123. GUILayout.FlexibleSpace();
  124. }
  125. }
  126. */
  127. private static readonly string[] _unsavedChangesActionNames = { "Ask if want to save", "Save", "Discard" };
  128. private void UnsavedChangesGroup()
  129. {
  130. using (new GUILayout.VerticalScope(UnityEditor.EditorStyles.helpBox))
  131. {
  132. UnityEditor.EditorGUIUtility.labelWidth = 45;
  133. PWBCore.staticData.unsavedChangesAction = (PWBData.UnsavedChangesAction)
  134. UnityEditor.EditorGUILayout.Popup("Action:",
  135. (int)PWBCore.staticData.unsavedChangesAction, _unsavedChangesActionNames);
  136. }
  137. }
  138. private void GizmosGroup()
  139. {
  140. using (new GUILayout.VerticalScope(UnityEditor.EditorStyles.helpBox))
  141. {
  142. using (new GUILayout.VerticalScope(UnityEditor.EditorStyles.helpBox))
  143. {
  144. UnityEditor.EditorGUIUtility.labelWidth = 110;
  145. PWBCore.staticData.controPointSize = UnityEditor.EditorGUILayout.IntSlider("Control point size:",
  146. PWBCore.staticData.controPointSize, 1, 3);
  147. using (new GUILayout.HorizontalScope())
  148. {
  149. GUILayout.Label("Selected control point:", GUILayout.Width(150));
  150. UnityEditor.EditorGUIUtility.labelWidth = 40;
  151. PWBCore.staticData.selectedContolPointColor = UnityEditor.EditorGUILayout.ColorField(
  152. "color:", PWBCore.staticData.selectedContolPointColor);
  153. GUILayout.Space(20);
  154. PWBCore.staticData.selectedControlPointBlink = UnityEditor.EditorGUILayout.ToggleLeft(
  155. "Blink on mouse move", PWBCore.staticData.selectedControlPointBlink);
  156. }
  157. }
  158. using (new GUILayout.VerticalScope(UnityEditor.EditorStyles.helpBox))
  159. {
  160. PWBCore.staticData.showInfoText
  161. = UnityEditor.EditorGUILayout.ToggleLeft("Show info text", PWBCore.staticData.showInfoText);
  162. }
  163. }
  164. }
  165. private void ToolbarGroup()
  166. {
  167. using (new GUILayout.VerticalScope(UnityEditor.EditorStyles.helpBox))
  168. {
  169. PWBCore.staticData.closeAllWindowsWhenClosingTheToolbar
  170. = UnityEditor.EditorGUILayout.ToggleLeft("Close all windows when closing the toolbar",
  171. PWBCore.staticData.closeAllWindowsWhenClosingTheToolbar);
  172. PWBCore.staticData.openToolPropertiesWhenAToolIsSelected
  173. = UnityEditor.EditorGUILayout.ToggleLeft("Open tool properties when a tool is selected",
  174. PWBCore.staticData.openToolPropertiesWhenAToolIsSelected);
  175. }
  176. }
  177. private void PinToolGroup()
  178. {
  179. using (new GUILayout.VerticalScope(UnityEditor.EditorStyles.helpBox))
  180. {
  181. UnityEditor.EditorGUIUtility.labelWidth = 155;
  182. PinManager.rotationSnapValue = UnityEditor.EditorGUILayout.Slider("Rotation snap value (Deg):",
  183. PinManager.rotationSnapValue, 0f, 360f);
  184. }
  185. }
  186. private void GravityToolGroup()
  187. {
  188. using (new GUILayout.VerticalScope(UnityEditor.EditorStyles.helpBox))
  189. {
  190. UnityEditor.EditorGUIUtility.labelWidth = 182;
  191. GravityToolManager.surfaceDistanceSensitivity
  192. = UnityEditor.EditorGUILayout.Slider("Distance to surface sensitivity:",
  193. GravityToolManager.surfaceDistanceSensitivity, 0f, 1f);
  194. }
  195. }
  196. private void BrushesGroup()
  197. {
  198. using (new GUILayout.VerticalScope(UnityEditor.EditorStyles.helpBox))
  199. {
  200. UnityEditor.EditorGUIUtility.labelWidth = 110;
  201. PWBCore.staticData.openBrushPropertiesWhenABrushIsSelected
  202. = UnityEditor.EditorGUILayout.ToggleLeft("Open brush properties when a brush is selected",
  203. PWBCore.staticData.openBrushPropertiesWhenABrushIsSelected);
  204. PWBCore.staticData.thumbnailLayer = UnityEditor.EditorGUILayout.IntField("Thumbnail Layer:",
  205. PWBCore.staticData.thumbnailLayer);
  206. PWBCore.staticData.createThumbnailsFolder
  207. = UnityEditor.EditorGUILayout.ToggleLeft("Group all thumbnails folders into a single folder",
  208. PWBCore.staticData.createThumbnailsFolder);
  209. }
  210. }
  211. private void PalettesGroup()
  212. {
  213. using (new GUILayout.VerticalScope(UnityEditor.EditorStyles.helpBox))
  214. {
  215. PWBCore.staticData.selectTheNextPaletteInAlphabeticalOrder
  216. = UnityEditor.EditorGUILayout.ToggleLeft("Select the next palette in alphabetical order",
  217. PWBCore.staticData.selectTheNextPaletteInAlphabeticalOrder);
  218. }
  219. }
  220. private static readonly string[] _tempCollidersActionNames = { "Never create temp colliders",
  221. "Create all temp colliders at once", "Create temp colliders within the frustum" };
  222. private void TempCollidersGroup()
  223. {
  224. using (new GUILayout.VerticalScope(UnityEditor.EditorStyles.helpBox))
  225. {
  226. UnityEditor.EditorGUIUtility.labelWidth = 45;
  227. PWBCore.staticData.tempCollidersAction = (PWBData.TempCollidersAction)
  228. UnityEditor.EditorGUILayout.Popup("Action:",
  229. (int)PWBCore.staticData.tempCollidersAction, _tempCollidersActionNames);
  230. }
  231. }
  232. private void EditModeGroup()
  233. {
  234. using (new GUILayout.VerticalScope(UnityEditor.EditorStyles.helpBox))
  235. {
  236. UnityEditor.EditorGUIUtility.labelWidth = 120;
  237. PWBCore.staticData.maxPreviewCountInEditMode
  238. = UnityEditor.EditorGUILayout.IntField(new GUIContent("Max Preview Count:",
  239. "Defines the maximum number of pre-existing objects displayed as preview in Edit Mode." +
  240. "This setting can optimize performance, especially for scenes with numerous objects"),
  241. PWBCore.staticData.maxPreviewCountInEditMode);
  242. }
  243. }
  244. #endregion
  245. #region SHORTCUTS
  246. private bool _floorCategory = false;
  247. private bool _wallCategory = false;
  248. private bool _pinCategory = false;
  249. private bool _brushCategory = false;
  250. private bool _gravityCategory = false;
  251. private bool _lineCategory = false;
  252. private bool _shapeCategory = false;
  253. private bool _tilingCategory = false;
  254. private bool _eraserCategory = false;
  255. private bool _replacerCategory = false;
  256. private bool _selectionCategory = false;
  257. private bool _circleSelectCategory = false;
  258. private bool _gridCategory = false;
  259. private bool _paletteCategory = false;
  260. private bool _gizmosCategory = false;
  261. private bool _toolbarCategory = true;
  262. private PWBKeyShortcut _selectedShortcut = null;
  263. private static Texture2D _warningTexture = null;
  264. private static Texture2D warningTexture
  265. {
  266. get
  267. {
  268. if (_warningTexture == null) _warningTexture = Resources.Load<Texture2D>("Sprites/Warning");
  269. return _warningTexture;
  270. }
  271. }
  272. private UnityEditor.IMGUI.Controls.MultiColumnHeaderState _multiColumnHeaderState;
  273. private UnityEditor.IMGUI.Controls.MultiColumnHeader _multiColumnHeader;
  274. private UnityEditor.IMGUI.Controls.MultiColumnHeaderState.Column[] _columns;
  275. private void InitializeMultiColumn()
  276. {
  277. _columns = new UnityEditor.IMGUI.Controls.MultiColumnHeaderState.Column[]
  278. {
  279. new UnityEditor.IMGUI.Controls.MultiColumnHeaderState.Column()
  280. {
  281. allowToggleVisibility = false,
  282. autoResize = true,
  283. minWidth = 320,
  284. width = 330,
  285. canSort = false,
  286. headerContent = new GUIContent("Command"),
  287. headerTextAlignment = TextAlignment.Left,
  288. },
  289. new UnityEditor.IMGUI.Controls.MultiColumnHeaderState.Column()
  290. {
  291. allowToggleVisibility = false,
  292. autoResize = true,
  293. minWidth = 266,
  294. maxWidth = 266,
  295. width = 266,
  296. canSort = false,
  297. headerContent = new GUIContent("Shortcut"),
  298. headerTextAlignment = TextAlignment.Left,
  299. }
  300. };
  301. _multiColumnHeaderState = new UnityEditor.IMGUI.Controls.MultiColumnHeaderState(columns: _columns);
  302. _multiColumnHeader = new UnityEditor.IMGUI.Controls.MultiColumnHeader(state: _multiColumnHeaderState);
  303. _multiColumnHeader.visibleColumnsChanged += (multiColumnHeader) => multiColumnHeader.ResizeToFit();
  304. _multiColumnHeader.ResizeToFit();
  305. }
  306. private static readonly Color _lighterColor = Color.white * 0.3f;
  307. private static readonly Color _darkerColor = Color.white * 0.1f;
  308. private void SelectProfileItem(object value)
  309. {
  310. PWBSettings.selectedProfileIdx = (int)value;
  311. Repaint();
  312. }
  313. private static readonly EventModifiers[] _modifierOptions = new EventModifiers[]
  314. {
  315. EventModifiers.None,
  316. EventModifiers.Control,
  317. EventModifiers.Alt,
  318. EventModifiers.Shift,
  319. EventModifiers.Control | EventModifiers.Alt,
  320. EventModifiers.Control | EventModifiers.Shift,
  321. EventModifiers.Alt | EventModifiers.Shift,
  322. EventModifiers.Control | EventModifiers.Alt | EventModifiers.Shift,
  323. };
  324. private static readonly string[] _modifierDisplayedOptions = new string[]
  325. {
  326. "Disabled",
  327. "Ctrl",
  328. "Alt",
  329. "Shift",
  330. "Ctrl+Alt",
  331. "Ctrl+Shift",
  332. "Alt+Shift",
  333. "Ctrl+Alt+Shift"
  334. };
  335. private static readonly string[] _mouseEventsDisplayedOptions = new string[]
  336. {
  337. "Mouse scroll wheel",
  338. "R Btn horizontal drag",
  339. "R Btn vertical drag",
  340. "Mid Btn horizontal drag",
  341. "Mid Btn vertical drag"
  342. };
  343. private void SelectCategory(ref bool category)
  344. {
  345. _gridCategory = false;
  346. _pinCategory = false;
  347. _brushCategory = false;
  348. _gravityCategory = false;
  349. _lineCategory = false;
  350. _shapeCategory = false;
  351. _tilingCategory = false;
  352. _eraserCategory = false;
  353. _replacerCategory = false;
  354. _selectionCategory = false;
  355. _circleSelectCategory = false;
  356. _paletteCategory = false;
  357. _toolbarCategory = false;
  358. _floorCategory = false;
  359. _wallCategory = false;
  360. _gizmosCategory = false;
  361. category = true;
  362. }
  363. public static void SelectToolCategory(ToolManager.PaintTool tool)
  364. {
  365. if (_instance == null) return;
  366. switch (tool)
  367. {
  368. case ToolManager.PaintTool.PIN:
  369. _instance.SelectCategory(ref _instance._pinCategory);
  370. break;
  371. case ToolManager.PaintTool.BRUSH:
  372. _instance.SelectCategory(ref _instance._brushCategory);
  373. break;
  374. case ToolManager.PaintTool.GRAVITY:
  375. _instance.SelectCategory(ref _instance._gravityCategory);
  376. break;
  377. case ToolManager.PaintTool.LINE:
  378. _instance.SelectCategory(ref _instance._lineCategory);
  379. break;
  380. case ToolManager.PaintTool.SHAPE:
  381. _instance.SelectCategory(ref _instance._shapeCategory);
  382. break;
  383. case ToolManager.PaintTool.TILING:
  384. _instance.SelectCategory(ref _instance._tilingCategory);
  385. break;
  386. case ToolManager.PaintTool.ERASER:
  387. _instance.SelectCategory(ref _instance._eraserCategory);
  388. break;
  389. case ToolManager.PaintTool.REPLACER:
  390. _instance.SelectCategory(ref _instance._replacerCategory);
  391. break;
  392. case ToolManager.PaintTool.SELECTION:
  393. _instance.SelectCategory(ref _instance._selectionCategory);
  394. break;
  395. case ToolManager.PaintTool.CIRCLE_SELECT:
  396. _instance.SelectCategory(ref _instance._circleSelectCategory);
  397. break;
  398. default: return;
  399. }
  400. _instance.Repaint();
  401. }
  402. private void Shortcuts()
  403. {
  404. if (_multiColumnHeader == null) InitializeMultiColumn();
  405. string shortcutString(PWBKeyShortcut shortcut)
  406. {
  407. if ((object)shortcut == (object)_selectedShortcut) return string.Empty;
  408. return shortcut.combination.ToString();
  409. }
  410. GUIStyle shortcutStyle(PWBKeyShortcut shortcut)
  411. {
  412. if ((object)shortcut == (object)_selectedShortcut) return UnityEditor.EditorStyles.textField;
  413. return UnityEditor.EditorStyles.label;
  414. }
  415. var categoryButton = new GUIStyle(UnityEditor.EditorStyles.toolbarButton);
  416. categoryButton.alignment = TextAnchor.UpperLeft;
  417. using (new GUILayout.HorizontalScope(UnityEditor.EditorStyles.helpBox))
  418. {
  419. GUILayout.Label("Profile:");
  420. if (GUILayout.Button(PWBSettings.shortcuts.profileName,
  421. UnityEditor.EditorStyles.popup, GUILayout.MinWidth(100)))
  422. {
  423. GUI.FocusControl(null);
  424. var menu = new UnityEditor.GenericMenu();
  425. var profileNames = PWBSettings.shotcutProfileNames;
  426. for (int i = 0; i < profileNames.Length; ++i)
  427. menu.AddItem(new GUIContent(profileNames[i]),
  428. PWBSettings.selectedProfileIdx == i, SelectProfileItem, i);
  429. menu.AddSeparator(string.Empty);
  430. menu.AddItem(new GUIContent("Factory Reset Selected Profile"), false, PWBSettings.ResetSelectedProfile);
  431. menu.ShowAsContext();
  432. }
  433. GUILayout.FlexibleSpace();
  434. }
  435. using (new GUILayout.HorizontalScope())
  436. {
  437. const int categoryColumnW = 100;
  438. using (new GUILayout.VerticalScope(GUILayout.Width(categoryColumnW)))
  439. {
  440. if (GUILayout.Toggle(_toolbarCategory, "Toolbar", categoryButton)) SelectCategory(ref _toolbarCategory);
  441. if (GUILayout.Toggle(_gizmosCategory, "Gizmos", categoryButton)) SelectCategory(ref _gizmosCategory);
  442. if (GUILayout.Toggle(_pinCategory, "Pin", categoryButton)) SelectCategory(ref _pinCategory);
  443. if (GUILayout.Toggle(_brushCategory, "Brush", categoryButton)) SelectCategory(ref _brushCategory);
  444. if (GUILayout.Toggle(_gravityCategory, "Gravity", categoryButton)) SelectCategory(ref _gravityCategory);
  445. if (GUILayout.Toggle(_lineCategory, "Line", categoryButton)) SelectCategory(ref _lineCategory);
  446. if (GUILayout.Toggle(_shapeCategory, "Shape", categoryButton)) SelectCategory(ref _shapeCategory);
  447. if (GUILayout.Toggle(_tilingCategory, "Tiling", categoryButton)) SelectCategory(ref _tilingCategory);
  448. if (GUILayout.Toggle(_eraserCategory, "Eraser", categoryButton)) SelectCategory(ref _eraserCategory);
  449. if (GUILayout.Toggle(_replacerCategory, "Replacer", categoryButton)) SelectCategory(ref _replacerCategory);
  450. if (GUILayout.Toggle(_floorCategory, "Floor", categoryButton)) SelectCategory(ref _floorCategory);
  451. if (GUILayout.Toggle(_wallCategory, "Wall", categoryButton)) SelectCategory(ref _wallCategory);
  452. if (GUILayout.Toggle(_selectionCategory, "Selection", categoryButton))
  453. SelectCategory(ref _selectionCategory);
  454. if (GUILayout.Toggle(_circleSelectCategory, "Circle Select", categoryButton))
  455. SelectCategory(ref _circleSelectCategory);
  456. if (GUILayout.Toggle(_gridCategory, "Grid", categoryButton)) SelectCategory(ref _gridCategory);
  457. if (GUILayout.Toggle(_paletteCategory, "Palette", categoryButton)) SelectCategory(ref _paletteCategory);
  458. using (new UnityEditor.EditorGUI.DisabledGroupScope(true))
  459. GUILayout.Box(new GUIContent(), new GUIStyle(categoryButton) { fixedHeight = 427 });
  460. }
  461. GUILayout.Space(2);
  462. using (new GUILayout.VerticalScope())
  463. {
  464. var minX = categoryColumnW + 10;
  465. var shorcutPanelRect = new Rect(minX, 28, position.width - categoryColumnW - 20, position.height);
  466. float columnHeight = UnityEditor.EditorGUIUtility.singleLineHeight;
  467. Rect columnRectPrototype = new Rect(shorcutPanelRect) { height = columnHeight };
  468. _multiColumnHeader.OnGUI(rect: columnRectPrototype, xScroll: 0.0f);
  469. void ContextMenu(PWBShortcut shortcut, UnityEditor.GenericMenu.MenuFunction DisableFunction)
  470. {
  471. bool shortcutIsUSM = false;
  472. if (shortcut is PWBKeyShortcut)
  473. {
  474. var keyShortcut = shortcut as PWBKeyShortcut;
  475. shortcutIsUSM = keyShortcut.combination is PWBKeyCombinationUSM;
  476. }
  477. void ResetToDefault()
  478. {
  479. PWBSettings.ResetShortcutToDefault(shortcut);
  480. if (shortcutIsUSM)
  481. {
  482. var keyShortcut = shortcut as PWBKeyShortcut;
  483. (keyShortcut.combination as PWBKeyCombinationUSM).Reset();
  484. }
  485. PWBSettings.UpdateShrotcutsConflictsAndSaveFile();
  486. }
  487. var menu = new UnityEditor.GenericMenu();
  488. menu.AddItem(new GUIContent("Reset to default"), false, ResetToDefault);
  489. if (!shortcutIsUSM) menu.AddItem(new GUIContent("Disable shortcut"), false, DisableFunction);
  490. menu.ShowAsContext();
  491. }
  492. int row = 0;
  493. void ShortcutRow(PWBKeyShortcut shortcut)
  494. {
  495. Rect rowRect = new Rect(columnRectPrototype);
  496. rowRect.y += columnHeight * (++row);
  497. UnityEditor.EditorGUI.DrawRect(rowRect, row % 2 == 0 ? _darkerColor : _lighterColor);
  498. Rect columnRect = _multiColumnHeader.GetColumnRect(0);
  499. columnRect.y = rowRect.y;
  500. var cellRect = _multiColumnHeader.GetCellRect(0, columnRect);
  501. cellRect.x += minX;
  502. UnityEditor.EditorGUI.LabelField(cellRect, new GUIContent(shortcut.name));
  503. ////////////////
  504. columnRect = _multiColumnHeader.GetColumnRect(1);
  505. columnRect.y = rowRect.y;
  506. cellRect = _multiColumnHeader.GetCellRect(1, columnRect);
  507. var cellW = cellRect.width;
  508. var shortcutText = shortcutString(shortcut);
  509. if (shortcut is PWBTwoStepKeyShortcut)
  510. {
  511. cellRect.x += minX;
  512. cellRect.width = 20;
  513. var twoStepShortcut = shortcut as PWBTwoStepKeyShortcut;
  514. using (var check = new UnityEditor.EditorGUI.ChangeCheckScope())
  515. {
  516. var firstStepEnabled = UnityEditor.EditorGUI.Toggle(cellRect,
  517. twoStepShortcut.firstStepEnabled);
  518. if (check.changed)
  519. {
  520. twoStepShortcut.firstStepEnabled = firstStepEnabled;
  521. PWBSettings.UpdateShrotcutsConflictsAndSaveFile();
  522. }
  523. }
  524. cellRect.x += 20;
  525. cellRect.width = cellW - 40;
  526. if (twoStepShortcut.firstStepEnabled)
  527. shortcutText = PWBSettings.shortcuts.gridEnableShortcuts.combination.ToString() + ", "
  528. + shortcutText;
  529. }
  530. else
  531. {
  532. cellRect.x += minX;
  533. cellRect.width = cellW - 20;
  534. }
  535. UnityEditor.EditorGUI.LabelField(cellRect, new GUIContent(shortcutText),
  536. shortcutStyle(shortcut));
  537. if (cellRect.Contains(Event.current.mousePosition)
  538. && Event.current.type == EventType.MouseDown)
  539. {
  540. if (Event.current.button == 0)
  541. {
  542. _selectedShortcut = shortcut;
  543. Repaint();
  544. }
  545. else if (Event.current.button == 1)
  546. {
  547. void Remove()
  548. {
  549. shortcut.combination.Set(KeyCode.None);
  550. PWBSettings.UpdateShrotcutsConflictsAndSaveFile();
  551. }
  552. ContextMenu(shortcut, Remove);
  553. }
  554. }
  555. if (!shortcut.conflicted) return;
  556. cellRect.x += cellW - 20;
  557. if (shortcut is PWBTwoStepKeyShortcut) cellRect.x -= 20;
  558. cellRect.width = 20;
  559. string conflictGroup = string.Empty;
  560. PWBKeyShortcut conflictedShortcut;
  561. if (PWBSettings.GetShortcutConflict(shortcut, out conflictedShortcut))
  562. {
  563. if ((conflictedShortcut.group & PWBShortcut.Group.GRID) != 0)
  564. conflictGroup = "Grid - ";
  565. else if ((conflictedShortcut.group & PWBShortcut.Group.PIN) != 0)
  566. conflictGroup = "Pin - ";
  567. else if ((conflictedShortcut.group & PWBShortcut.Group.BRUSH) != 0)
  568. conflictGroup = "Brush - ";
  569. else if ((conflictedShortcut.group & PWBShortcut.Group.GRAVITY) != 0)
  570. conflictGroup = "Gravity - ";
  571. else if ((conflictedShortcut.group & PWBShortcut.Group.LINE) != 0)
  572. conflictGroup = "Line - ";
  573. else if ((conflictedShortcut.group & PWBShortcut.Group.SHAPE) != 0)
  574. conflictGroup = "Shape - ";
  575. else if ((conflictedShortcut.group & PWBShortcut.Group.TILING) != 0)
  576. conflictGroup = "Tiling - ";
  577. else if ((conflictedShortcut.group & PWBShortcut.Group.ERASER) != 0)
  578. conflictGroup = "Eraser - ";
  579. else if ((conflictedShortcut.group & PWBShortcut.Group.REPLACER) != 0)
  580. conflictGroup = "Replacer - ";
  581. else if ((conflictedShortcut.group & PWBShortcut.Group.SELECTION) != 0)
  582. conflictGroup = "Selection - ";
  583. else if ((conflictedShortcut.group & PWBShortcut.Group.PALETTE) != 0)
  584. conflictGroup = "Palette - ";
  585. else if ((conflictedShortcut.group & PWBShortcut.Group.CIRCLE_SELECT) != 0)
  586. conflictGroup = "Circle Select - ";
  587. else if ((conflictedShortcut.group & PWBShortcut.Group.EXTRUDE) != 0)
  588. conflictGroup = "Extrude - ";
  589. else if ((conflictedShortcut.group & PWBShortcut.Group.MIRROR) != 0)
  590. conflictGroup = "Mirror - ";
  591. else if ((conflictedShortcut.group & PWBShortcut.Group.FLOOR) != 0)
  592. conflictGroup = "Floor - ";
  593. else if ((conflictedShortcut.group & PWBShortcut.Group.WALL) != 0)
  594. conflictGroup = "Wall - ";
  595. }
  596. var conflictText = $"Conflict with {conflictGroup}{conflictedShortcut.name}";
  597. UnityEditor.EditorGUI.LabelField(cellRect, new GUIContent(warningTexture, conflictText));
  598. if (cellRect.Contains(Event.current.mousePosition) && Event.current.type == EventType.MouseDown)
  599. UnityEditor.EditorUtility.DisplayDialog("Shortcut Conflict", conflictText, "OK");
  600. }
  601. void MouseShortcutRow(PWBMouseShortcut shortcut, bool scrollWheelOnly = false)
  602. {
  603. Rect rowRect = new Rect(columnRectPrototype);
  604. rowRect.y += columnHeight * (++row);
  605. UnityEditor.EditorGUI.DrawRect(rowRect, row % 2 == 0 ? _darkerColor : _lighterColor);
  606. Rect columnRect = _multiColumnHeader.GetColumnRect(0);
  607. columnRect.y = rowRect.y;
  608. var cellRect = _multiColumnHeader.GetCellRect(0, columnRect);
  609. cellRect.x += minX;
  610. UnityEditor.EditorGUI.LabelField(cellRect, new GUIContent(shortcut.name));
  611. ////////////////
  612. columnRect = _multiColumnHeader.GetColumnRect(1);
  613. columnRect.y = rowRect.y;
  614. cellRect = _multiColumnHeader.GetCellRect(1, columnRect);
  615. cellRect.x += minX;
  616. if (cellRect.Contains(Event.current.mousePosition)
  617. && Event.current.type == EventType.MouseDown && Event.current.button == 1)
  618. {
  619. void Remove()
  620. {
  621. shortcut.combination.Set(EventModifiers.None, PWBMouseCombination.MouseEvents.NONE);
  622. PWBSettings.UpdateShrotcutsConflictsAndSaveFile();
  623. }
  624. ContextMenu(shortcut, Remove);
  625. }
  626. cellRect.width = 100;
  627. int modId = System.Array.IndexOf(_modifierOptions, shortcut.combination.modifiers);
  628. PWBMouseCombination.MouseEvents mouseEvent = shortcut.combination.mouseEvent;
  629. void SetCombination()
  630. {
  631. shortcut.combination.Set(_modifierOptions[modId], mouseEvent);
  632. PWBSettings.UpdateShrotcutsConflictsAndSaveFile();
  633. }
  634. using (var check = new UnityEditor.EditorGUI.ChangeCheckScope())
  635. {
  636. modId = UnityEditor.EditorGUI.Popup(cellRect, modId,
  637. _modifierDisplayedOptions);
  638. if (check.changed)
  639. {
  640. var combi = new PWBMouseCombination(_modifierOptions[modId], mouseEvent);
  641. var combiString = _modifierDisplayedOptions[modId];
  642. if (modId > 0) combiString += " + Mouse scroll wheel";
  643. if (PWBSettings.shortcuts.CheckMouseConflicts(combi, shortcut, out string conflicts))
  644. {
  645. if (BindingConflictDialog(combiString, conflicts)) SetCombination();
  646. }
  647. else SetCombination();
  648. }
  649. }
  650. cellRect.x += cellRect.width;
  651. cellRect.width = 149;
  652. if (shortcut.combination.modifiers != EventModifiers.None)
  653. {
  654. if (scrollWheelOnly) UnityEditor.EditorGUI.LabelField(cellRect, "+ Mouse scroll wheel");
  655. else
  656. {
  657. using (var check = new UnityEditor.EditorGUI.ChangeCheckScope())
  658. {
  659. mouseEvent = (PWBMouseCombination.MouseEvents)(UnityEditor.EditorGUI.Popup(cellRect,
  660. (int)mouseEvent - 1, _mouseEventsDisplayedOptions) + 1);
  661. if (check.changed)
  662. {
  663. var combi = new PWBMouseCombination(_modifierOptions[modId], mouseEvent);
  664. var combiString = _modifierDisplayedOptions[modId];
  665. if (modId > 0)
  666. combiString += " + " + _mouseEventsDisplayedOptions[(int)mouseEvent - 1];
  667. if (PWBSettings.shortcuts.CheckMouseConflicts(combi, shortcut, out string conflicts))
  668. {
  669. if (BindingConflictDialog(combiString, conflicts)) SetCombination();
  670. }
  671. else SetCombination();
  672. }
  673. }
  674. }
  675. }
  676. if (!shortcut.conflicted) return;
  677. cellRect.x += cellRect.width;
  678. cellRect.width = 20;
  679. UnityEditor.EditorGUI.LabelField(cellRect, new GUIContent(warningTexture));
  680. }
  681. void EditModeRows()
  682. {
  683. ShortcutRow(PWBSettings.shortcuts.editModeToggle);
  684. ShortcutRow(PWBSettings.shortcuts.editModeDeleteItemAndItsChildren);
  685. ShortcutRow(PWBSettings.shortcuts.editModeDeleteItemButNotItsChildren);
  686. ShortcutRow(PWBSettings.shortcuts.editModeSelectParent);
  687. ShortcutRow(PWBSettings.shortcuts.editModeDuplicate);
  688. }
  689. void SelectionRows()
  690. {
  691. ShortcutRow(PWBSettings.shortcuts.selectionRotate90YCW);
  692. ShortcutRow(PWBSettings.shortcuts.selectionRotate90YCCW);
  693. ShortcutRow(PWBSettings.shortcuts.selectionRotate90XCW);
  694. ShortcutRow(PWBSettings.shortcuts.selectionRotate90XCCW);
  695. ShortcutRow(PWBSettings.shortcuts.selectionRotate90ZCW);
  696. ShortcutRow(PWBSettings.shortcuts.selectionRotate90ZCCW);
  697. ShortcutRow(PWBSettings.shortcuts.selectionToggleSpace);
  698. }
  699. if (_toolbarCategory)
  700. {
  701. ShortcutRow(PWBSettings.shortcuts.toolbarPinToggle);
  702. ShortcutRow(PWBSettings.shortcuts.toolbarBrushToggle);
  703. ShortcutRow(PWBSettings.shortcuts.toolbarGravityToggle);
  704. ShortcutRow(PWBSettings.shortcuts.toolbarLineToggle);
  705. ShortcutRow(PWBSettings.shortcuts.toolbarShapeToggle);
  706. ShortcutRow(PWBSettings.shortcuts.toolbarTilingToggle);
  707. ShortcutRow(PWBSettings.shortcuts.toolbarReplacerToggle);
  708. ShortcutRow(PWBSettings.shortcuts.toolbarEraserToggle);
  709. ShortcutRow(PWBSettings.shortcuts.toolbarSelectionToggle);
  710. ShortcutRow(PWBSettings.shortcuts.toolbarExtrudeToggle);
  711. ShortcutRow(PWBSettings.shortcuts.toolbarMirrorToggle);
  712. ShortcutRow(PWBSettings.shortcuts.toolbarFloorToggle);
  713. ShortcutRow(PWBSettings.shortcuts.toolbarWallToggle);
  714. }
  715. else if (_gizmosCategory)
  716. {
  717. ShortcutRow(PWBSettings.shortcuts.gizmosToggleInfotext);
  718. }
  719. else if (_pinCategory)
  720. {
  721. ShortcutRow(PWBSettings.shortcuts.pinMoveHandlesUp);
  722. ShortcutRow(PWBSettings.shortcuts.pinMoveHandlesDown);
  723. ShortcutRow(PWBSettings.shortcuts.pinSelectPrevHandle);
  724. ShortcutRow(PWBSettings.shortcuts.pinSelectNextHandle);
  725. ShortcutRow(PWBSettings.shortcuts.pinSelectPivotHandle);
  726. ShortcutRow(PWBSettings.shortcuts.pinToggleRepeatItem);
  727. ShortcutRow(PWBSettings.shortcuts.pinResetScale);
  728. ShortcutRow(PWBSettings.shortcuts.pinRotate90YCW);
  729. ShortcutRow(PWBSettings.shortcuts.pinRotate90YCCW);
  730. ShortcutRow(PWBSettings.shortcuts.pinRotateAStepYCW);
  731. ShortcutRow(PWBSettings.shortcuts.pinRotateAStepYCCW);
  732. ShortcutRow(PWBSettings.shortcuts.pinRotate90XCW);
  733. ShortcutRow(PWBSettings.shortcuts.pinRotate90XCCW);
  734. ShortcutRow(PWBSettings.shortcuts.pinRotateAStepXCW);
  735. ShortcutRow(PWBSettings.shortcuts.pinRotateAStepXCCW);
  736. ShortcutRow(PWBSettings.shortcuts.pinRotate90ZCW);
  737. ShortcutRow(PWBSettings.shortcuts.pinRotate90ZCCW);
  738. ShortcutRow(PWBSettings.shortcuts.pinRotateAStepZCW);
  739. ShortcutRow(PWBSettings.shortcuts.pinRotateAStepZCCW);
  740. ShortcutRow(PWBSettings.shortcuts.pinResetRotation);
  741. ShortcutRow(PWBSettings.shortcuts.pinSnapRotationToGrid);
  742. ShortcutRow(PWBSettings.shortcuts.pinAdd1UnitToSurfDist);
  743. ShortcutRow(PWBSettings.shortcuts.pinSubtract1UnitFromSurfDist);
  744. ShortcutRow(PWBSettings.shortcuts.pinAdd01UnitToSurfDist);
  745. ShortcutRow(PWBSettings.shortcuts.pinSubtract01UnitFromSurfDist);
  746. ShortcutRow(PWBSettings.shortcuts.pinResetSurfDist);
  747. ShortcutRow(PWBSettings.shortcuts.pinSelectPreviousItem);
  748. ShortcutRow(PWBSettings.shortcuts.pinSelectNextItem);
  749. ShortcutRow(PWBSettings.shortcuts.pinFlipX);
  750. MouseShortcutRow(PWBSettings.shortcuts.pinSelectNextItemScroll, true);
  751. MouseShortcutRow(PWBSettings.shortcuts.pinScale);
  752. MouseShortcutRow(PWBSettings.shortcuts.pinRotateAroundY);
  753. MouseShortcutRow(PWBSettings.shortcuts.pinRotateAroundYSnaped);
  754. MouseShortcutRow(PWBSettings.shortcuts.pinRotateAroundX);
  755. MouseShortcutRow(PWBSettings.shortcuts.pinRotateAroundXSnaped);
  756. MouseShortcutRow(PWBSettings.shortcuts.pinRotateAroundZ);
  757. MouseShortcutRow(PWBSettings.shortcuts.pinRotateAroundZSnaped);
  758. MouseShortcutRow(PWBSettings.shortcuts.pinSurfDist);
  759. }
  760. else if (_brushCategory)
  761. {
  762. ShortcutRow(PWBSettings.shortcuts.brushUpdatebrushstroke);
  763. ShortcutRow(PWBSettings.shortcuts.brushResetRotation);
  764. MouseShortcutRow(PWBSettings.shortcuts.brushRadius);
  765. MouseShortcutRow(PWBSettings.shortcuts.brushDensity);
  766. MouseShortcutRow(PWBSettings.shortcuts.brushRotate);
  767. }
  768. else if (_gravityCategory)
  769. {
  770. ShortcutRow(PWBSettings.shortcuts.brushUpdatebrushstroke);
  771. ShortcutRow(PWBSettings.shortcuts.brushResetRotation);
  772. ShortcutRow(PWBSettings.shortcuts.gravityAdd1UnitToSurfDist);
  773. ShortcutRow(PWBSettings.shortcuts.gravitySubtract1UnitFromSurfDist);
  774. ShortcutRow(PWBSettings.shortcuts.gravityAdd01UnitToSurfDist);
  775. ShortcutRow(PWBSettings.shortcuts.gravitySubtract01UnitFromSurfDist);
  776. MouseShortcutRow(PWBSettings.shortcuts.gravitySurfDist);
  777. MouseShortcutRow(PWBSettings.shortcuts.brushRadius);
  778. MouseShortcutRow(PWBSettings.shortcuts.brushDensity);
  779. MouseShortcutRow(PWBSettings.shortcuts.brushRotate);
  780. }
  781. else if (_lineCategory)
  782. {
  783. ShortcutRow(PWBSettings.shortcuts.lineSelectAllPoints);
  784. ShortcutRow(PWBSettings.shortcuts.lineDeselectAllPoints);
  785. ShortcutRow(PWBSettings.shortcuts.lineToggleCurve);
  786. ShortcutRow(PWBSettings.shortcuts.lineToggleClosed);
  787. EditModeRows();
  788. ShortcutRow(PWBSettings.shortcuts.lineEditModeTypeToggle);
  789. MouseShortcutRow(PWBSettings.shortcuts.lineEditGap);
  790. }
  791. else if (_shapeCategory)
  792. {
  793. EditModeRows();
  794. }
  795. else if (_tilingCategory)
  796. {
  797. SelectionRows();
  798. EditModeRows();
  799. MouseShortcutRow(PWBSettings.shortcuts.tilingEditSpacing1);
  800. MouseShortcutRow(PWBSettings.shortcuts.tilingEditSpacing2);
  801. }
  802. else if (_eraserCategory)
  803. {
  804. MouseShortcutRow(PWBSettings.shortcuts.brushRadius);
  805. }
  806. else if (_replacerCategory)
  807. {
  808. MouseShortcutRow(PWBSettings.shortcuts.brushRadius);
  809. }
  810. else if (_selectionCategory)
  811. {
  812. ShortcutRow(PWBSettings.shortcuts.selectionTogglePositionHandle);
  813. ShortcutRow(PWBSettings.shortcuts.selectionToggleRotationHandle);
  814. ShortcutRow(PWBSettings.shortcuts.selectionToggleScaleHandle);
  815. ShortcutRow(PWBSettings.shortcuts.selectionEditCustomHandle);
  816. SelectionRows();
  817. }
  818. else if (_floorCategory)
  819. {
  820. ShortcutRow(PWBSettings.shortcuts.floorRotate90YCW);
  821. }
  822. else if (_wallCategory)
  823. {
  824. ShortcutRow(PWBSettings.shortcuts.wallHalfTurn);
  825. }
  826. else if (_circleSelectCategory)
  827. {
  828. MouseShortcutRow(PWBSettings.shortcuts.brushRadius);
  829. }
  830. else if (_gridCategory)
  831. {
  832. ShortcutRow(PWBSettings.shortcuts.gridEnableShortcuts);
  833. ShortcutRow(PWBSettings.shortcuts.gridToggle);
  834. ShortcutRow(PWBSettings.shortcuts.gridToggleSnaping);
  835. ShortcutRow(PWBSettings.shortcuts.gridToggleLock);
  836. ShortcutRow(PWBSettings.shortcuts.gridSetOriginPosition);
  837. ShortcutRow(PWBSettings.shortcuts.gridSetOriginRotation);
  838. ShortcutRow(PWBSettings.shortcuts.gridSetSize);
  839. ShortcutRow(PWBSettings.shortcuts.gridFrameOrigin);
  840. ShortcutRow(PWBSettings.shortcuts.gridTogglePositionHandle);
  841. ShortcutRow(PWBSettings.shortcuts.gridToggleRotationHandle);
  842. ShortcutRow(PWBSettings.shortcuts.gridToggleSpacingHandle);
  843. ShortcutRow(PWBSettings.shortcuts.gridMoveOriginUp);
  844. ShortcutRow(PWBSettings.shortcuts.gridMoveOriginDown);
  845. ShortcutRow(PWBSettings.shortcuts.gridNextOrigin);
  846. }
  847. else if (_paletteCategory)
  848. {
  849. ShortcutRow(PWBSettings.shortcuts.paletteDeleteBrush);
  850. ShortcutRow(PWBSettings.shortcuts.palettePreviousBrush);
  851. ShortcutRow(PWBSettings.shortcuts.paletteNextBrush);
  852. ShortcutRow(PWBSettings.shortcuts.palettePreviousPalette);
  853. ShortcutRow(PWBSettings.shortcuts.paletteNextPalette);
  854. ShortcutRow(PWBSettings.shortcuts.palettePickBrush);
  855. ShortcutRow(PWBSettings.shortcuts.paletteReplaceSceneSelection);
  856. MouseShortcutRow(PWBSettings.shortcuts.paletteNextBrushScroll, true);
  857. MouseShortcutRow(PWBSettings.shortcuts.paletteNextPaletteScroll, true);
  858. }
  859. GUILayout.Space((row + 2) * columnHeight);
  860. if (_gridCategory)
  861. {
  862. UnityEditor.EditorGUILayout.HelpBox("These shortcuts work in two steps."
  863. + "\nFirst you have to activate the shortcuts with "
  864. + PWBSettings.shortcuts.gridEnableShortcuts.combination
  865. + ".\nFor example to toggle the grid you have to press "
  866. + PWBSettings.shortcuts.gridEnableShortcuts.combination + " and then "
  867. + PWBSettings.shortcuts.gridToggle.combination + "."
  868. + "\nUnchecking disables the first step.",
  869. UnityEditor.MessageType.Info);
  870. }
  871. }
  872. }
  873. }
  874. private bool BindingConflictDialog(string combi, string conflicts)
  875. => UnityEditor.EditorUtility.DisplayDialog("Binding Conflict", "The key " + combi
  876. + " is already assigned to: \n" + conflicts + "\n Do you want to create the conflict?",
  877. "Create Conflict", "Cancel");
  878. private void UpdateCombination()
  879. {
  880. if (_selectedShortcut == null) return;
  881. if (Event.current == null) return;
  882. if (Event.current.type != EventType.KeyDown) return;
  883. if (Event.current.keyCode == KeyCode.Escape)
  884. {
  885. Repaint();
  886. _selectedShortcut = null;
  887. return;
  888. }
  889. if (Event.current.keyCode < KeyCode.Space || Event.current.keyCode > KeyCode.F15) return;
  890. var combi = new PWBKeyCombination(Event.current.keyCode, Event.current.modifiers);
  891. Event.current.Use();
  892. void SetCombination()
  893. {
  894. _selectedShortcut.combination.Set(Event.current.keyCode, Event.current.modifiers);
  895. if (_selectedShortcut.combination is PWBKeyCombinationUSM)
  896. (_selectedShortcut.combination as PWBKeyCombinationUSM).Rebind(Event.current.keyCode,
  897. Event.current.modifiers);
  898. PWBSettings.UpdateShrotcutsConflictsAndSaveFile();
  899. }
  900. if (PWBSettings.shortcuts.CheckConflicts(combi, _selectedShortcut, out string conflicts))
  901. {
  902. if (BindingConflictDialog(combi.ToString(), conflicts)) SetCombination();
  903. }
  904. else SetCombination();
  905. _selectedShortcut = null;
  906. Repaint();
  907. }
  908. #endregion
  909. }
  910. }