StashedChangesWindow.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. // Copyright (c) 2025 TerraByte Inc.
  2. //
  3. // A new, non-dockable editor window for viewing and managing changes
  4. // stored in the 'Better Git Stash'.
  5. using UnityEditor;
  6. using UnityEngine;
  7. using System.IO;
  8. using UnityEngine.Scripting;
  9. using Terra.Arbitrator.Services;
  10. using System.Collections.Generic;
  11. namespace Terra.Arbitrator.GUI
  12. {
  13. [Preserve]
  14. public class StashedChangesWindow : EditorWindow
  15. {
  16. private ArbitratorController _controller;
  17. private List<GitChange> _stashedFiles;
  18. private Vector2 _scrollPosition;
  19. public static void ShowWindow(ArbitratorController controller, List<GitChange> stashedFiles)
  20. {
  21. var window = GetWindow<StashedChangesWindow>(true, "Stashed Changes", true);
  22. window.minSize = new Vector2(500, 350);
  23. window._controller = controller;
  24. window._stashedFiles = stashedFiles;
  25. window.ShowUtility();
  26. }
  27. private void OnGUI()
  28. {
  29. if (_controller == null || _stashedFiles == null)
  30. {
  31. EditorGUILayout.LabelField("No data available.");
  32. return;
  33. }
  34. DrawHeader();
  35. DrawFileList();
  36. DrawFooter();
  37. }
  38. private void DrawHeader()
  39. {
  40. EditorGUILayout.LabelField("Files in 'Better Git Stash'", EditorStyles.boldLabel);
  41. EditorGUILayout.BeginHorizontal();
  42. if (GUILayout.Button("Apply Stash", GUILayout.Height(30)))
  43. {
  44. _controller.ApplyStash();
  45. Close();
  46. }
  47. if (GUILayout.Button("Discard Stash", GUILayout.Height(30)))
  48. {
  49. if (EditorUtility.DisplayDialog("Discard Stash?", "Are you sure you want to discard the 'Better Git Stash'? This action cannot be undone.", "Yes, Discard", "Cancel"))
  50. {
  51. _controller.DiscardStash();
  52. Close();
  53. }
  54. }
  55. EditorGUILayout.EndHorizontal();
  56. EditorGUILayout.Space();
  57. }
  58. private void DrawFileList()
  59. {
  60. _scrollPosition = EditorGUILayout.BeginScrollView(_scrollPosition, EditorStyles.helpBox);
  61. foreach (var change in _stashedFiles)
  62. {
  63. EditorGUILayout.BeginHorizontal(EditorStyles.helpBox);
  64. var status = change.Status switch {
  65. LibGit2Sharp.ChangeKind.Added => "[+]",
  66. LibGit2Sharp.ChangeKind.Deleted => "[-]",
  67. LibGit2Sharp.ChangeKind.Modified => "[M]",
  68. _ => "[?]"
  69. };
  70. EditorGUILayout.LabelField(new GUIContent(status, change.Status.ToString()), GUILayout.Width(25));
  71. EditorGUILayout.LabelField(new GUIContent(change.FilePath, change.FilePath));
  72. if (GUILayout.Button("Diff", GUILayout.Width(60)))
  73. {
  74. _controller.DiffStashedFile(change);
  75. }
  76. EditorGUILayout.EndHorizontal();
  77. }
  78. EditorGUILayout.EndScrollView();
  79. }
  80. private void DrawFooter()
  81. {
  82. GUILayout.FlexibleSpace();
  83. EditorGUILayout.BeginHorizontal();
  84. GUILayout.FlexibleSpace();
  85. if (GUILayout.Button("Close", GUILayout.Width(100)))
  86. {
  87. Close();
  88. }
  89. EditorGUILayout.EndHorizontal();
  90. EditorGUILayout.Space();
  91. }
  92. }
  93. }