// Copyright (c) 2025 TerraByte Inc. // // A modal editor window that displays pull conflicts and allows the user // to select files to reset before proceeding. using UnityEditor; using UnityEngine; using System.Collections.Generic; namespace Terra.Arbitrator.GUI { public class ConflictResolutionWindow : EditorWindow { private List _conflictingFiles; private string _fileBeingReset; private Vector2 _scrollPosition; private ArbitratorController _controller; /// /// Shows a modal window to display pull conflicts and get user action. /// /// Reference to the arbitrator controller /// The list of files that have conflicts. public static void ShowWindow(ArbitratorController controller, List conflictingFiles) { var window = GetWindow(true, "Pull Conflicts Detected", true); window.minSize = new Vector2(600, 400); window._controller = controller; window._conflictingFiles = new List(conflictingFiles); window.ShowModalUtility(); } private void OnGUI() { 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); EditorGUILayout.LabelField("Conflicting Files:", EditorStyles.boldLabel); _scrollPosition = EditorGUILayout.BeginScrollView(_scrollPosition, EditorStyles.helpBox); foreach (var file in new List(_conflictingFiles)) { DrawFileRow(file); } EditorGUILayout.EndScrollView(); EditorGUILayout.Space(); DrawActionButtons(); } private void DrawFileRow(string filePath) { EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField(new GUIContent(filePath, filePath)); var isThisFileLoading = _fileBeingReset == filePath; EditorGUI.BeginDisabledGroup(isThisFileLoading || !string.IsNullOrEmpty(_fileBeingReset)); if (GUILayout.Button(isThisFileLoading ? "Resetting..." : "Reset", GUILayout.Width(100))) { HandleResetFile(filePath); } EditorGUI.EndDisabledGroup(); EditorGUILayout.EndHorizontal(); } private void HandleResetFile(string filePath) { _fileBeingReset = filePath; Repaint(); _controller.ResetSingleConflictingFile(filePath, () => { _conflictingFiles.Remove(filePath); _fileBeingReset = null; Repaint(); }); } private void DrawActionButtons() { EditorGUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if (GUILayout.Button("Proceed with Pull (Risky)", GUILayout.Height(30), GUILayout.Width(180))) { _controller.PerformSafePullWithLock(); Close(); } if (GUILayout.Button("Cancel", GUILayout.Height(30))) { Close(); } EditorGUILayout.EndHorizontal(); } } }