// Copyright (c) 2025 TerraByte Inc. // // A new, non-dockable editor window for viewing and managing changes // stored in the 'Better Git Stash'. using UnityEditor; using UnityEngine; using System.IO; using UnityEngine.Scripting; using Terra.Arbitrator.Services; using System.Collections.Generic; namespace Terra.Arbitrator.GUI { [Preserve] public class StashedChangesWindow : EditorWindow { private ArbitratorController _controller; private List _stashedFiles; private Vector2 _scrollPosition; public static void ShowWindow(ArbitratorController controller, List stashedFiles) { var window = GetWindow(true, "Stashed Changes", true); window.minSize = new Vector2(500, 350); window._controller = controller; window._stashedFiles = stashedFiles; window.ShowUtility(); } private void OnGUI() { if (_controller == null || _stashedFiles == null) { EditorGUILayout.LabelField("No data available."); return; } DrawHeader(); DrawFileList(); DrawFooter(); } private void DrawHeader() { EditorGUILayout.LabelField("Files in 'Better Git Stash'", EditorStyles.boldLabel); EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("Apply Stash", GUILayout.Height(30))) { _controller.ApplyStash(); Close(); } if (GUILayout.Button("Discard Stash", GUILayout.Height(30))) { if (EditorUtility.DisplayDialog("Discard Stash?", "Are you sure you want to discard the 'Better Git Stash'? This action cannot be undone.", "Yes, Discard", "Cancel")) { _controller.DiscardStash(); Close(); } } EditorGUILayout.EndHorizontal(); EditorGUILayout.Space(); } private void DrawFileList() { _scrollPosition = EditorGUILayout.BeginScrollView(_scrollPosition, EditorStyles.helpBox); foreach (var change in _stashedFiles) { EditorGUILayout.BeginHorizontal(EditorStyles.helpBox); var status = change.Status switch { LibGit2Sharp.ChangeKind.Added => "[+]", LibGit2Sharp.ChangeKind.Deleted => "[-]", LibGit2Sharp.ChangeKind.Modified => "[M]", _ => "[?]" }; EditorGUILayout.LabelField(new GUIContent(status, change.Status.ToString()), GUILayout.Width(25)); EditorGUILayout.LabelField(new GUIContent(change.FilePath, change.FilePath)); if (GUILayout.Button("Diff", GUILayout.Width(60))) { _controller.DiffStashedFile(change); } EditorGUILayout.EndHorizontal(); } EditorGUILayout.EndScrollView(); } private void DrawFooter() { GUILayout.FlexibleSpace(); EditorGUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if (GUILayout.Button("Close", GUILayout.Width(100))) { Close(); } EditorGUILayout.EndHorizontal(); EditorGUILayout.Space(); } } }