123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- // 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.Linq;
- using UnityEngine.Scripting;
- using Terra.Arbitrator.Services;
- using System.Collections.Generic;
- namespace Terra.Arbitrator.GUI
- {
- [Preserve]
- public class ConflictResolutionWindow : EditorWindow
- {
- private Vector2 _scrollPosition;
- private GUIStyle _wordWrapStyle;
- private IConflictSource _conflictSource;
- private ArbitratorController _controller;
- private List<GitChange> _conflictingFiles;
- /// <summary>
- /// Shows a modal window to display pull conflicts and get user action.
- /// </summary>
- /// <param name="controller">Reference to the arbitrator controller</param>
- /// <param name="conflictingFiles">The list of files that have conflicts.</param>
- /// <param name="source">The source of the conflict (e.g., pull, stash).</param>
- public static void ShowWindow(ArbitratorController controller, IReadOnlyList<GitChange> conflictingFiles, IConflictSource source)
- {
- var window = GetWindow<ConflictResolutionWindow>(true, "Pull Conflicts Detected", true);
- window.minSize = new Vector2(600, 400);
- window._controller = controller;
- window._conflictingFiles = new List<GitChange>(conflictingFiles);
- window._conflictSource = source;
- window.ShowModalUtility();
- }
- private void OnGUI()
- {
- _wordWrapStyle ??= new GUIStyle(EditorStyles.label) { wordWrap = true };
-
- EditorGUILayout.HelpBox("A pull would result in conflicts with your local changes. To proceed with a clean pull, you must choose a resolution for the conflicting files listed below.", MessageType.Warning);
- EditorGUILayout.LabelField($"Mine: {_conflictSource?.MineLabel ?? "Your Changes"}", EditorStyles.boldLabel);
- EditorGUILayout.LabelField($"Theirs: {_conflictSource?.TheirsLabel ?? "Incoming Changes"}", EditorStyles.boldLabel);
-
- EditorGUILayout.BeginHorizontal(EditorStyles.toolbar);
- GUILayout.Label("Filename");
- GUILayout.FlexibleSpace();
- GUILayout.Label(""); //Spacer
- GUILayout.FlexibleSpace();
- GUILayout.Label("Choice", GUILayout.Width(70));
- EditorGUILayout.EndHorizontal();
- _scrollPosition = EditorGUILayout.BeginScrollView(_scrollPosition, EditorStyles.helpBox);
- if (_conflictingFiles != null)
- {
- foreach (var change in _conflictingFiles)
- {
- DrawFileRow(change);
- }
- }
- EditorGUILayout.EndScrollView();
- EditorGUILayout.Space();
- DrawActionButtons();
- }
-
- private void DrawFileRow(GitChange change)
- {
- EditorGUILayout.BeginHorizontal(EditorStyles.helpBox);
- EditorGUILayout.LabelField(new GUIContent(change.FilePath, change.FilePath), _wordWrapStyle, GUILayout.ExpandWidth(true));
- change.Resolution = (GitChange.ConflictResolution)EditorGUILayout.EnumPopup(change.Resolution, GUILayout.Width(70));
-
- EditorGUILayout.EndHorizontal();
- }
- private void DrawActionButtons()
- {
- EditorGUILayout.BeginHorizontal();
- GUILayout.FlexibleSpace();
- var allResolved = _conflictingFiles != null && _conflictingFiles.All(c => c.Resolution != GitChange.ConflictResolution.None);
- var pullButtonText = allResolved ? "Resolve Safely" : "Resolve with Unchosen (Risky)";
- if (GUILayout.Button(pullButtonText, GUILayout.Height(30), GUILayout.Width(180)))
- {
- if (_controller != null && _conflictSource != null)
- {
- _controller.ResolveConflicts(_conflictingFiles, _conflictSource);
- }
- Close();
- }
- if (GUILayout.Button("Cancel", GUILayout.Height(30)))
- {
- Close();
- }
-
- EditorGUILayout.EndHorizontal();
- }
- }
- }
|