diff --git a/src/UnityExtension/Assets/Editor/GitHub.Unity/GitHub.Unity.csproj b/src/UnityExtension/Assets/Editor/GitHub.Unity/GitHub.Unity.csproj index c8b780926..1ddcf006f 100644 --- a/src/UnityExtension/Assets/Editor/GitHub.Unity/GitHub.Unity.csproj +++ b/src/UnityExtension/Assets/Editor/GitHub.Unity/GitHub.Unity.csproj @@ -102,6 +102,7 @@ + diff --git a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/BaseWindow.cs b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/BaseWindow.cs index 6d66a00f6..03ce9534c 100644 --- a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/BaseWindow.cs +++ b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/BaseWindow.cs @@ -17,21 +17,15 @@ public virtual void Initialize(IApplicationManager applicationManager) Logger.Trace("Initialize ApplicationManager:{0} Initialized:{1}", applicationManager, initialized); } - public void InitializeWindow(IApplicationManager applicationManager) + public void InitializeWindow(IApplicationManager applicationManager, bool requiresRedraw = true) { - if (inLayout) - { - initializeWasCalled = true; - cachedManager = applicationManager; - return; - } - + initialized = true; + initializeWasCalled = true; Manager = applicationManager; cachedRepository = Environment.Repository; - initialized = true; Initialize(applicationManager); - OnRepositoryChanged(null); - Redraw(); + if (requiresRedraw) + Redraw(); } public virtual void Redraw() @@ -51,14 +45,14 @@ public virtual void Awake() { Logger.Trace("Awake Initialized:{0}", initialized); if (!initialized) - InitializeWindow(EntryPoint.ApplicationManager); + InitializeWindow(EntryPoint.ApplicationManager, false); } public virtual void OnEnable() { Logger.Trace("OnEnable Initialized:{0}", initialized); if (!initialized) - InitializeWindow(EntryPoint.ApplicationManager); + InitializeWindow(EntryPoint.ApplicationManager, false); } public virtual void OnDisable() @@ -81,8 +75,9 @@ private void OnGUI() { if (Event.current.type == EventType.layout) { - if (cachedRepository != Environment.Repository) + if (cachedRepository != Environment.Repository || initializeWasCalled) { + initializeWasCalled = false; OnRepositoryChanged(cachedRepository); cachedRepository = Environment.Repository; } @@ -95,11 +90,6 @@ private void OnGUI() if (Event.current.type == EventType.repaint) { inLayout = false; - if (initializeWasCalled) - { - initializeWasCalled = false; - InitializeWindow(cachedManager); - } } } @@ -113,7 +103,7 @@ public virtual void OnSelectionChange() public IApplicationManager Manager { get; private set; } public abstract bool IsBusy { get; } public IRepository Repository { get { return inLayout ? cachedRepository : Environment.Repository; } } - public bool HasRepository { get { return Environment.RepositoryPath != null; } } + public bool HasRepository { get { return Repository != null; } } protected ITaskManager TaskManager { get { return Manager.TaskManager; } } protected IGitClient GitClient { get { return Manager.GitClient; } } diff --git a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/HistoryView.cs b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/HistoryView.cs index 19b3987ad..f2cfcf278 100644 --- a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/HistoryView.cs +++ b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/HistoryView.cs @@ -28,8 +28,6 @@ class HistoryView : Subview private const string PushConfirmCancel = "Cancel"; private const string CommitDetailsTitle = "Commit details"; private const string ClearSelectionButton = "×"; - private const string NoRepoTitle = "No Git repository found for this project"; - private const string NoRepoDescription = "Initialize a Git repository to track changes and collaborate with others."; private const string PublishButton = "Publish"; private const string FetchActionTitle = "Fetch Changes"; private const string FetchButtonText = "Fetch"; @@ -116,12 +114,6 @@ public override void OnSelectionChange() public override void OnGUI() { - if (!HasRepository) - { - DoOfferToInitializeRepositoryGUI(); - return; - } - OnEmbeddedGUI(); } @@ -223,66 +215,6 @@ private void MaybeUpdateData() } } - private void DoOfferToInitializeRepositoryGUI() - { - var headerRect = EditorGUILayout.BeginHorizontal(Styles.HeaderBoxStyle); - { - GUILayout.Space(5); - GUILayout.BeginVertical(GUILayout.Width(16)); - { - GUILayout.Space(5); - - var iconRect = GUILayoutUtility.GetRect(new GUIContent(Styles.BigLogo), GUIStyle.none, GUILayout.Height(20), GUILayout.Width(20)); - iconRect.y = headerRect.center.y - (iconRect.height / 2); - GUI.DrawTexture(iconRect, Styles.BigLogo, ScaleMode.ScaleToFit); - - GUILayout.Space(5); - } - GUILayout.EndVertical(); - - GUILayout.Space(5); - - GUILayout.BeginVertical(); - { - var headerContent = new GUIContent(NoRepoTitle); - var headerTitleRect = GUILayoutUtility.GetRect(headerContent, Styles.HeaderTitleStyle); - headerTitleRect.y = headerRect.center.y - (headerTitleRect.height / 2); - - GUI.Label(headerTitleRect, headerContent, Styles.HeaderTitleStyle); - } - GUILayout.EndVertical(); - } - EditorGUILayout.EndHorizontal(); - - GUILayout.BeginVertical(Styles.GenericBoxStyle); - { - GUILayout.FlexibleSpace(); - - GUILayout.Label(NoRepoDescription, Styles.CenteredLabel); - - GUILayout.BeginHorizontal(); - GUILayout.FlexibleSpace(); - - EditorGUI.BeginDisabledGroup(isBusy); - { - if (GUILayout.Button(Localization.InitializeRepositoryButtonText, "Button")) - { - isBusy = true; - Manager.InitializeRepository() - .FinallyInUI(() => isBusy = false) - .Start(); - } - } - EditorGUI.EndDisabledGroup(); - - GUILayout.FlexibleSpace(); - GUILayout.EndHorizontal(); - - GUILayout.FlexibleSpace(); - } - GUILayout.EndVertical(); - } - public void OnEmbeddedGUI() { // History toolbar diff --git a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/InitProjectView.cs b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/InitProjectView.cs new file mode 100644 index 000000000..c8ee372a3 --- /dev/null +++ b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/InitProjectView.cs @@ -0,0 +1,103 @@ +#pragma warning disable 649 + +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEditor; +using UnityEngine; +using Object = UnityEngine.Object; + +namespace GitHub.Unity +{ + [Serializable] + class InitProjectView : Subview + { + private const string NoRepoTitle = "No Git repository found for this project"; + private const string NoRepoDescription = "Initialize a Git repository to track changes and collaborate with others."; + + [SerializeField] private bool isBusy; + [SerializeField] private bool isPublished; + + public override void OnDataUpdate() + { + base.OnDataUpdate(); + MaybeUpdateData(); + } + + public override void OnRepositoryChanged(IRepository oldRepository) + { + base.OnRepositoryChanged(oldRepository); + Refresh(); + } + + public override void OnGUI() + { + var headerRect = EditorGUILayout.BeginHorizontal(Styles.HeaderBoxStyle); + { + GUILayout.Space(5); + GUILayout.BeginVertical(GUILayout.Width(16)); + { + GUILayout.Space(5); + + var iconRect = GUILayoutUtility.GetRect(new GUIContent(Styles.BigLogo), GUIStyle.none, GUILayout.Height(20), GUILayout.Width(20)); + iconRect.y = headerRect.center.y - (iconRect.height / 2); + GUI.DrawTexture(iconRect, Styles.BigLogo, ScaleMode.ScaleToFit); + + GUILayout.Space(5); + } + GUILayout.EndVertical(); + + GUILayout.Space(5); + + GUILayout.BeginVertical(); + { + var headerContent = new GUIContent(NoRepoTitle); + var headerTitleRect = GUILayoutUtility.GetRect(headerContent, Styles.HeaderTitleStyle); + headerTitleRect.y = headerRect.center.y - (headerTitleRect.height / 2); + + GUI.Label(headerTitleRect, headerContent, Styles.HeaderTitleStyle); + } + GUILayout.EndVertical(); + } + EditorGUILayout.EndHorizontal(); + + GUILayout.BeginVertical(Styles.GenericBoxStyle); + { + GUILayout.FlexibleSpace(); + + GUILayout.Label(NoRepoDescription, Styles.CenteredLabel); + + GUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + + EditorGUI.BeginDisabledGroup(isBusy); + { + if (GUILayout.Button(Localization.InitializeRepositoryButtonText, "Button")) + { + isBusy = true; + Manager.InitializeRepository() + .FinallyInUI(() => isBusy = false) + .Start(); + } + } + EditorGUI.EndDisabledGroup(); + + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + + GUILayout.FlexibleSpace(); + } + GUILayout.EndVertical(); + } + + private void MaybeUpdateData() + { + isPublished = Repository != null && Repository.CurrentRemote.HasValue; + } + + public override bool IsBusy + { + get { return isBusy; } + } + } +} diff --git a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/Window.cs b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/Window.cs index a83539c7a..cf9da47f6 100644 --- a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/Window.cs +++ b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/Window.cs @@ -14,6 +14,7 @@ class Window : BaseWindow private const string Title = "GitHub"; private const string LaunchMenu = "Window/GitHub"; private const string BadNotificationDelayError = "A delay of {0} is shorter than the default delay and thus would get pre-empted."; + private const string InitializeTitle = "Initialize"; private const string HistoryTitle = "History"; private const string ChangesTitle = "Changes"; private const string BranchesTitle = "Branches"; @@ -24,8 +25,9 @@ class Window : BaseWindow private const string Window_RepoBranchTooltip = "Active branch"; [NonSerialized] private double notificationClearTime = -1; - + [SerializeField] private SubTab changeTab = SubTab.History; [SerializeField] private SubTab activeTab = SubTab.History; + [SerializeField] private InitProjectView initProjectView = new InitProjectView(); [SerializeField] private BranchesView branchesView = new BranchesView(); [SerializeField] private ChangesView changesView = new ChangesView(); [SerializeField] private HistoryView historyView = new HistoryView(); @@ -71,10 +73,14 @@ public override void Initialize(IApplicationManager applicationManager) { base.Initialize(applicationManager); + if (!HasRepository && activeTab != SubTab.InitProject && activeTab != SubTab.Settings) + changeTab = activeTab = SubTab.InitProject; + HistoryView.InitializeView(this); ChangesView.InitializeView(this); BranchesView.InitializeView(this); SettingsView.InitializeView(this); + InitProjectView.InitializeView(this); } public override void OnEnable() @@ -128,8 +134,16 @@ public override void OnRepositoryChanged(IRepository oldRepository) DetachHandlers(oldRepository); AttachHandlers(Repository); + if (Repository != null && activeTab == SubTab.InitProject) + { + changeTab = SubTab.History; + } + + UpdateActiveTab(); + if (ActiveView != null) ActiveView.OnRepositoryChanged(oldRepository); + } public override void OnSelectionChange() @@ -206,7 +220,7 @@ private bool MaybeUpdateData(out string repoRemote) if (Repository.CurrentRemote.HasValue) repoRemote = Repository.CurrentRemote.Value.Name; } - else if (!HasRepository) + else { if (repoBranch != null) { @@ -237,7 +251,6 @@ private void DetachHandlers(IRepository repository) return; repository.OnRepositoryInfoChanged -= RefreshOnMainThread; } - private void DoHeaderGUI() { GUILayout.BeginHorizontal(Styles.HeaderBoxStyle); @@ -268,7 +281,7 @@ private void DoToolbarGUI() // Subtabs & toolbar Rect mainNavRect = EditorGUILayout.BeginHorizontal(EditorStyles.toolbar); { - SubTab changeTab = activeTab; + changeTab = activeTab; EditorGUI.BeginChangeCheck(); { if (HasRepository) @@ -279,14 +292,14 @@ private void DoToolbarGUI() } else { - changeTab = TabButton(SubTab.History, HistoryTitle, changeTab); + changeTab = TabButton(SubTab.InitProject, InitializeTitle, changeTab); } changeTab = TabButton(SubTab.Settings, SettingsTitle, changeTab); } if (EditorGUI.EndChangeCheck()) { - SetActiveTab(changeTab); + UpdateActiveTab(); } GUILayout.FlexibleSpace(); @@ -297,7 +310,7 @@ private void DoToolbarGUI() EditorGUILayout.EndHorizontal(); } - private void SetActiveTab(SubTab changeTab) + private void UpdateActiveTab() { if (changeTab != activeTab) { @@ -313,10 +326,10 @@ private void SwitchView(Subview fromView, Subview toView) if (fromView != null) fromView.OnDisable(); - toView.OnEnable(); - Refresh(); + // this triggers a repaint + Repaint(); } private void DoAccountDropdown() @@ -380,6 +393,25 @@ private static SubTab TabButton(SubTab tab, string title, SubTab activeTab) return GUILayout.Toggle(activeTab == tab, title, EditorStyles.toolbarButton) ? tab : activeTab; } + private Subview ToView(SubTab tab) + { + switch (tab) + { + case SubTab.InitProject: + return initProjectView; + case SubTab.History: + return historyView; + case SubTab.Changes: + return changesView; + case SubTab.Branches: + return branchesView; + case SubTab.Settings: + return settingsView; + default: + throw new ArgumentOutOfRangeException(); + } + } + public HistoryView HistoryView { get { return historyView; } @@ -400,37 +432,25 @@ public SettingsView SettingsView get { return settingsView; } } - public override bool IsBusy + public InitProjectView InitProjectView { - get { return false; } + get { return initProjectView; } } private Subview ActiveView { - get - { - return ToView(activeTab); - } + get { return ToView(activeTab); } } - private Subview ToView(SubTab tab) + public override bool IsBusy { - switch (tab) - { - case SubTab.History: - return historyView; - case SubTab.Changes: - return changesView; - case SubTab.Branches: - return branchesView; - case SubTab.Settings: - default: - return settingsView; - } + get { return false; } } private enum SubTab { + None, + InitProject, History, Changes, Branches,