1+ using System . Collections . Generic ;
2+ using System . Linq ;
3+ using System . Threading . Tasks ;
4+ using UnityEditor ;
5+ using UnityEditor . IMGUI . Controls ;
6+ using UnityEngine ;
7+
8+ namespace Abuksigun . UnityGitUI
9+ {
10+ public class GitReflogWindow : EditorWindow
11+ {
12+ private string guid ;
13+ private LazyTreeView < ReflogEntry > treeView ;
14+
15+ [ MenuItem ( "Window/Git UI/Reflog" ) ]
16+ public static void Invoke ( )
17+ {
18+ if ( EditorWindow . GetWindow < GitReflogWindow > ( ) is { } window && window )
19+ {
20+ window . titleContent = new GUIContent ( "Git Reflog" , EditorGUIUtility . IconContent ( "d_UnityEditor.ConsoleWindow" ) . image ) ;
21+ window . InitializeTreeView ( ) ;
22+ window . Show ( ) ;
23+ }
24+ }
25+
26+ private void InitializeTreeView ( )
27+ {
28+ var state = new TreeViewState ( ) ;
29+ var columns = new MultiColumnHeaderState . Column [ ]
30+ {
31+ new MultiColumnHeaderState . Column { width = 100 , headerContent = new GUIContent ( "Hash" ) } ,
32+ new MultiColumnHeaderState . Column { width = 100 , headerContent = new GUIContent ( "Date" ) } ,
33+ new MultiColumnHeaderState . Column { width = 200 , headerContent = new GUIContent ( "Type" ) } ,
34+ new MultiColumnHeaderState . Column { width = 400 , headerContent = new GUIContent ( "Message" ) , autoResize = true } ,
35+ } ;
36+ var multiColumnHeader = new MultiColumnHeader ( new MultiColumnHeaderState ( columns ) ) ;
37+
38+ treeView = new LazyTreeView < ReflogEntry > ( GenerateReflogItems , state , false , multiColumnHeader , DrawCell ) ;
39+ }
40+
41+ private void OnGUI ( )
42+ {
43+ var module = GUIUtils . ModuleGuidToolbar ( Utils . GetSelectedGitModules ( ) . ToList ( ) , guid ) ;
44+ guid = module ? . Guid ?? guid ;
45+ var refLogEntries = module . RefLogEntries . GetResultOrDefault ( ) ;
46+ treeView ? . Draw ( position . size , refLogEntries , contextMenuCallback : id => ShowContextMenu ( module , refLogEntries . FirstOrDefault ( x => x . GetHashCode ( ) == id ) ) ) ;
47+ }
48+
49+ private List < TreeViewItem > GenerateReflogItems ( IEnumerable < ReflogEntry > reflogEntries )
50+ {
51+ return reflogEntries . Select ( entry => new LazyTreeView < ReflogEntry > . CustomViewItem { id = entry . GetHashCode ( ) , data = entry } as TreeViewItem ) . ToList ( ) ;
52+ }
53+
54+ private void DrawCell ( TreeViewItem item , int column , Rect cellRect )
55+ {
56+ var entry = ( item as LazyTreeView < ReflogEntry > . CustomViewItem ) . data ;
57+ switch ( column )
58+ {
59+ case 0 :
60+ EditorGUI . LabelField ( cellRect , entry . Hash . Substring ( 0 , 7 ) ) ;
61+ break ;
62+ case 1 :
63+ EditorGUI . LabelField ( cellRect , entry . Time ) ;
64+ break ;
65+ case 2 :
66+ EditorGUI . LabelField ( cellRect , entry . EntryType ) ;
67+ break ;
68+ case 3 :
69+ EditorGUI . LabelField ( cellRect , entry . Comment ) ;
70+ break ;
71+ }
72+ }
73+
74+ private void ShowContextMenu ( Module module , ReflogEntry entry )
75+ {
76+ var menu = new GenericMenu ( ) ;
77+ menu . AddItem ( new GUIContent ( "Checkout" ) , false , ( ) => Checkout ( module , entry . Hash ) ) ;
78+ menu . AddItem ( new GUIContent ( "Create branch" ) , false , ( ) => CreateBranchFrom ( module , entry ) ) ;
79+ menu . ShowAsContext ( ) ;
80+ }
81+
82+ private void Checkout ( Module module , string hash )
83+ {
84+ module . Checkout ( hash ) ;
85+ }
86+
87+ private void CreateBranchFrom ( Module module , ReflogEntry entry )
88+ {
89+ bool checkout = false ;
90+ string branchName = "reflog-branch" ;
91+ _ = GUIUtils . ShowModalWindow ( "Create Branch" , new Vector2Int ( 300 , 150 ) , ( window ) =>
92+ {
93+ GUILayout . Label ( "New Branch Name: " ) ;
94+ branchName = EditorGUILayout . TextField ( branchName ) ;
95+ checkout = GUILayout . Toggle ( checkout , "Checkout to this branch" ) ;
96+ GUILayout . Space ( 40 ) ;
97+ if ( GUILayout . Button ( "Ok" , GUILayout . Width ( 200 ) ) )
98+ {
99+ var modules = Utils . GetSelectedGitModules ( ) ;
100+ _ = Task . WhenAll ( modules . Select ( module => module . CreateBranchFrom ( branchName , entry . Hash ) ) ) ;
101+ window . Close ( ) ;
102+ }
103+ } ) ;
104+ }
105+ }
106+ }
0 commit comments