ConflictResolutionWindow.cs 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. // Copyright (c) 2025 TerraByte Inc.
  2. //
  3. // A modal editor window that displays pull conflicts and allows the user
  4. // to select files to reset before proceeding.
  5. using UnityEditor;
  6. using UnityEngine;
  7. using System.Collections.Generic;
  8. namespace Terra.Arbitrator.GUI
  9. {
  10. public class ConflictResolutionWindow : EditorWindow
  11. {
  12. private List<string> _conflictingFiles;
  13. private string _fileBeingReset;
  14. private Vector2 _scrollPosition;
  15. private ArbitratorController _controller;
  16. /// <summary>
  17. /// Shows a modal window to display pull conflicts and get user action.
  18. /// </summary>
  19. /// <param name="controller">Reference to the arbitrator controller</param>
  20. /// <param name="conflictingFiles">The list of files that have conflicts.</param>
  21. public static void ShowWindow(ArbitratorController controller, List<string> conflictingFiles)
  22. {
  23. var window = GetWindow<ConflictResolutionWindow>(true, "Pull Conflicts Detected", true);
  24. window.minSize = new Vector2(600, 400);
  25. window._controller = controller;
  26. window._conflictingFiles = new List<string>(conflictingFiles);
  27. window.ShowModalUtility();
  28. }
  29. private void OnGUI()
  30. {
  31. EditorGUILayout.HelpBox("A pull would result in conflicts with your local changes. To proceed with a clean pull, you must reset your local changes for the conflicting files listed below.", MessageType.Warning);
  32. EditorGUILayout.LabelField("Conflicting Files:", EditorStyles.boldLabel);
  33. _scrollPosition = EditorGUILayout.BeginScrollView(_scrollPosition, EditorStyles.helpBox);
  34. foreach (var file in new List<string>(_conflictingFiles))
  35. {
  36. DrawFileRow(file);
  37. }
  38. EditorGUILayout.EndScrollView();
  39. EditorGUILayout.Space();
  40. DrawActionButtons();
  41. }
  42. private void DrawFileRow(string filePath)
  43. {
  44. EditorGUILayout.BeginHorizontal();
  45. EditorGUILayout.LabelField(new GUIContent(filePath, filePath));
  46. var isThisFileLoading = _fileBeingReset == filePath;
  47. EditorGUI.BeginDisabledGroup(isThisFileLoading || !string.IsNullOrEmpty(_fileBeingReset));
  48. if (GUILayout.Button(isThisFileLoading ? "Resetting..." : "Reset", GUILayout.Width(100)))
  49. {
  50. HandleResetFile(filePath);
  51. }
  52. EditorGUI.EndDisabledGroup();
  53. EditorGUILayout.EndHorizontal();
  54. }
  55. private void HandleResetFile(string filePath)
  56. {
  57. _fileBeingReset = filePath;
  58. Repaint();
  59. _controller.ResetSingleConflictingFile(filePath, () =>
  60. {
  61. _conflictingFiles.Remove(filePath);
  62. _fileBeingReset = null;
  63. Repaint();
  64. });
  65. }
  66. private void DrawActionButtons()
  67. {
  68. EditorGUILayout.BeginHorizontal();
  69. GUILayout.FlexibleSpace();
  70. if (GUILayout.Button("Proceed with Pull (Risky)", GUILayout.Height(30), GUILayout.Width(180)))
  71. {
  72. _controller.PerformSafePullWithLock();
  73. Close();
  74. }
  75. if (GUILayout.Button("Cancel", GUILayout.Height(30)))
  76. {
  77. Close();
  78. }
  79. EditorGUILayout.EndHorizontal();
  80. }
  81. }
  82. }