using System; using System.Collections.Generic; using UnityEditor; using UnityEditor.IMGUI.Controls; using UnityEngine; using Codice.Client.Common.EventTracking; using Codice.CM.Common; using PlasticGui; using Unity.PlasticSCM.Editor.UI; #if UNITY_6000_2_OR_NEWER using TreeView = UnityEditor.IMGUI.Controls.TreeView; using TreeViewItem = UnityEditor.IMGUI.Controls.TreeViewItem; using TreeViewState = UnityEditor.IMGUI.Controls.TreeViewState; #endif namespace Unity.PlasticSCM.Editor { internal class SideBarTreeView : TreeView { internal SideBarTreeView( RepositorySpec repSpec, bool isGluonMode, Action switchSwitchViewAction) : base(new TreeViewState()) { mRepSpec = repSpec; mIsGluonMode = isGluonMode; mSwitchViewAction = switchSwitchViewAction; rowHeight = EditorGUIUtility.singleLineHeight; Reload(); } internal void SetHistoryVisible(bool isVisible) { if (mIsHistoryItemVisible == isVisible) return; mIsHistoryItemVisible = isVisible; Reload(); } internal void SetMergeVisible(bool isVisible) { if (mIsMergeItemVisible == isVisible) return; mIsMergeItemVisible = isVisible; Reload(); } internal void SetSelectedItem(ViewSwitcher.TabType tabType) { if (mIsSelectionChanging) return; mIsSettingSelectedTab = true; if (tabType == ViewSwitcher.TabType.History) SetHistoryVisible(true); if (tabType == ViewSwitcher.TabType.Merge) SetMergeVisible(true); try { foreach (var item in rootItem.children) { var sideBarItem = item as SideBarTreeViewItem; if (sideBarItem == null) continue; if (sideBarItem.TabType != tabType) continue; SetSelection(new List { sideBarItem.id }); FrameItem(sideBarItem.id); break; } } finally { mIsSettingSelectedTab = false; } } internal float GetTotalWidth() { if (mTotalWidth == -1) { mTotalWidth = MeasureMaxWidth.ForTexts( EditorStyles.label, PlasticLocalization.GetString(PlasticLocalization.Name.PendingChangesViewTitle), PlasticLocalization.GetString(PlasticLocalization.Name.IncomingChangesViewTitle), PlasticLocalization.GetString(PlasticLocalization.Name.ChangesetsViewTitle), PlasticLocalization.GetString(PlasticLocalization.Name.ShelvesViewTitle), PlasticLocalization.GetString(PlasticLocalization.Name.BranchesViewTitle), PlasticLocalization.GetString(PlasticLocalization.Name.Labels), PlasticLocalization.GetString(PlasticLocalization.Name.LocksViewTitle), PlasticLocalization.GetString(PlasticLocalization.Name.History), PlasticLocalization.GetString(PlasticLocalization.Name.Merge)); mTotalWidth += LEFT_MARGIN + ICON_SIZE + ICON_MARGIN + RIGHT_MARGIN; } return mTotalWidth; } protected override void RowGUI(RowGUIArgs args) { var item = args.item as SideBarTreeViewItem; if (item == null) return; var contentRect = args.rowRect; contentRect.x += LEFT_MARGIN; contentRect.width -= LEFT_MARGIN; var iconRect = contentRect; iconRect.width = ICON_SIZE; iconRect.height = ICON_SIZE; iconRect.y += (contentRect.height - ICON_SIZE) * 0.5f; Texture icon = GetItemIcon(item.TabType); if (icon != null) { GUI.DrawTexture(iconRect, icon); } var labelRect = contentRect; labelRect.x += ICON_SIZE + ICON_MARGIN; labelRect.width -= ICON_SIZE + ICON_MARGIN; GUI.Label(labelRect, item.displayName, EditorStyles.label); } protected override TreeViewItem BuildRoot() { var root = new TreeViewItem { id = -1, depth = -1 }; root.children = new List(); root.AddChild(new SideBarTreeViewItem { id = 0, depth = 0, displayName = PlasticLocalization.Name.PendingChangesViewTitle.GetString(), TabType = ViewSwitcher.TabType.PendingChanges, }); root.AddChild(new SideBarTreeViewItem { id = 2, depth = 0, displayName = PlasticLocalization.Name.IncomingChangesViewTitle.GetString(), TabType = ViewSwitcher.TabType.IncomingChanges, }); root.AddChild(new SideBarTreeViewItem { id = 3, depth = 0, displayName = PlasticLocalization.Name.ChangesetsViewTitle.GetString(), TabType = ViewSwitcher.TabType.Changesets, }); root.AddChild(new SideBarTreeViewItem { id = 4, depth = 0, displayName = PlasticLocalization.Name.ShelvesViewTitle.GetString(), TabType = ViewSwitcher.TabType.Shelves, }); root.AddChild(new SideBarTreeViewItem { id = 5, depth = 0, displayName = PlasticLocalization.Name.BranchesViewTitle.GetString(), TabType = ViewSwitcher.TabType.Branches, }); if (!mIsGluonMode) { root.AddChild(new SideBarTreeViewItem { id = 6, depth = 0, displayName = PlasticLocalization.Name.Labels.GetString(), TabType = ViewSwitcher.TabType.Labels, }); } root.AddChild(new SideBarTreeViewItem { id = 7, depth = 0, displayName = PlasticLocalization.Name.LocksViewTitle.GetString(), TabType = ViewSwitcher.TabType.Locks, }); if (mIsHistoryItemVisible) { root.AddChild(new SideBarTreeViewItem { id = 8, depth = 0, displayName = PlasticLocalization.Name.History.GetString(), TabType = ViewSwitcher.TabType.History, }); } if (mIsMergeItemVisible) { root.AddChild(new SideBarTreeViewItem { id = 9, depth = 0, displayName = PlasticLocalization.Name.Merge.GetString(), TabType = ViewSwitcher.TabType.Merge, }); } return root; } protected override void SelectionChanged(IList selectedIds) { base.SelectionChanged(selectedIds); if (mIsSettingSelectedTab) return; if (selectedIds.Count == 0) return; var item = FindItem(selectedIds[0], rootItem) as SideBarTreeViewItem; if (item == null) return; mIsSelectionChanging = true; try { if (item.TabType == ViewSwitcher.TabType.Shelves) { TrackFeatureUseEvent.For( mRepSpec, TrackFeatureUseEvent.Features.UnityPackage.ShowShelvesViewFromToolbarButton); } mSwitchViewAction(item.TabType); } finally { mIsSelectionChanging = false; } } protected override bool CanMultiSelect(TreeViewItem item) { // Disable multi-selection return false; } Texture GetItemIcon(ViewSwitcher.TabType tabType) { switch (tabType) { case ViewSwitcher.TabType.PendingChanges: return Images.GetPendingChangesViewIcon(); case ViewSwitcher.TabType.IncomingChanges: return Images.GetIncomingChangesViewIcon(); case ViewSwitcher.TabType.Changesets: return Images.GetChangesetsIcon(); case ViewSwitcher.TabType.Shelves: return Images.GetShelveIcon(); case ViewSwitcher.TabType.Branches: return Images.GetBranchesIcon(); case ViewSwitcher.TabType.Labels: return Images.GetLabelIcon(); case ViewSwitcher.TabType.Locks: return Images.GetLockIcon(); case ViewSwitcher.TabType.History: return Images.GetHistoryIcon(); case ViewSwitcher.TabType.Merge: return Images.GetMergeViewIcon(); } return null; } class SideBarTreeViewItem : TreeViewItem { public ViewSwitcher.TabType TabType { get; set; } } bool mIsSelectionChanging; bool mIsSettingSelectedTab; bool mIsHistoryItemVisible = false; bool mIsMergeItemVisible = false; float mTotalWidth = -1; readonly Action mSwitchViewAction; readonly bool mIsGluonMode; readonly RepositorySpec mRepSpec; const int ICON_SIZE = 16; const int ICON_MARGIN = 4; const int LEFT_MARGIN = 15; const int RIGHT_MARGIN = 5; } }