12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010 |
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
-
- using UnityEditor;
- using UnityEditor.IMGUI.Controls;
- using UnityEngine;
-
- using Codice.Client.BaseCommands;
- using Codice.CM.Common;
-
- using PlasticGui;
- using PlasticGui.WorkspaceWindow.PendingChanges;
- using PlasticGui.WorkspaceWindow.PendingChanges.Changelists;
-
- using Unity.PlasticSCM.Editor.AssetUtils;
- using Unity.PlasticSCM.Editor.UI;
- using Unity.PlasticSCM.Editor.UI.Tree;
- using Unity.PlasticSCM.Editor.AssetsOverlays.Cache;
- using Unity.PlasticSCM.Editor.AssetsOverlays;
-
- namespace Unity.PlasticSCM.Editor.Views.PendingChanges
- {
- internal class PendingChangesTreeView : TreeView
- {
- internal PendingChangesTreeView(
- WorkspaceInfo wkInfo,
- bool isGluonMode,
- PendingChangesTreeHeaderState headerState,
- List<string> columnNames,
- PendingChangesViewMenu menu,
- IAssetStatusCache assetStatusCache)
- : base(new TreeViewState())
- {
- mWkInfo = wkInfo;
- mIsGluonMode = isGluonMode;
- mColumnNames = columnNames;
- mHeaderState = headerState;
- mMenu = menu;
- mAssetStatusCache = assetStatusCache;
-
- mPendingChangesTree = new UnityPendingChangesTree();
-
- multiColumnHeader = new PendingChangesMultiColumnHeader(
- this,
- headerState,
- mPendingChangesTree);
- multiColumnHeader.canSort = true;
- multiColumnHeader.sortingChanged += SortingChanged;
-
- customFoldoutYOffset = UnityConstants.TREEVIEW_FOLDOUT_Y_OFFSET;
- rowHeight = UnityConstants.TREEVIEW_ROW_HEIGHT;
- showAlternatingRowBackgrounds = false;
-
- mCooldownFilterAction = new CooldownWindowDelayer(
- DelayedSearchChanged, UnityConstants.SEARCH_DELAYED_INPUT_ACTION_INTERVAL);
- }
-
- protected override void SingleClickedItem(int id)
- {
- SelectionChanged(new [] { id });
- }
-
- protected override void SelectionChanged(IList<int> selectedIds)
- {
- mHeaderState.UpdateItemColumnHeader(this);
-
- if (mIsSelectionChangedEventDisabled)
- return;
-
- List<UnityEngine.Object> assets = new List<UnityEngine.Object>();
-
- foreach (ChangeInfo changeInfo in GetSelectedChanges(false))
- {
- UnityEngine.Object asset = LoadAsset.FromChangeInfo(changeInfo);
-
- if (asset == null)
- continue;
-
- assets.Add(asset);
- }
-
- UnityEditor.Selection.objects = assets.ToArray();
-
- if (assets.Count == 1)
- EditorGUIUtility.PingObject(assets[0]);
- }
-
- protected void SelectionChanged()
- {
- SelectionChanged(GetSelection());
- }
-
- public override IList<TreeViewItem> GetRows()
- {
- return mRows;
- }
-
- public override void OnGUI(Rect rect)
- {
- MultiColumnHeader.DefaultStyles.background =
- UnityStyles.Tree.Columns;
-
- try
- {
- base.OnGUI(rect);
-
- if (!base.HasFocus())
- return;
-
- Event e = Event.current;
-
- if (e.type != EventType.KeyDown)
- return;
-
- bool isProcessed = mMenu.ProcessKeyActionIfNeeded(e);
-
- if (isProcessed)
- e.Use();
- }
- finally
- {
- MultiColumnHeader.DefaultStyles.background =
- UnityStyles.PendingChangesTab.DefaultMultiColumHeader;
- }
- }
-
- protected override bool CanChangeExpandedState(TreeViewItem item)
- {
- return item is ChangeCategoryTreeViewItem || item is ChangelistTreeViewItem;
- }
-
- protected override TreeViewItem BuildRoot()
- {
- return new TreeViewItem(0, -1, string.Empty);
- }
-
- protected override IList<TreeViewItem> BuildRows(TreeViewItem rootItem)
- {
- try
- {
- RegenerateRows(
- mPendingChangesTree, mTreeViewItemIds, this,
- rootItem, mRows, mExpandCategories);
- }
- finally
- {
- mExpandCategories = false;
- }
-
- return mRows;
- }
-
- protected override void CommandEventHandling()
- {
- // NOTE - empty override to prevent crash when pressing ctrl-a in the treeview
- }
-
- protected override void SearchChanged(string newSearch)
- {
- mCooldownFilterAction.Ping();
- }
-
- protected override void ContextClickedItem(int id)
- {
- mMenu.Popup();
- Repaint();
- }
-
- protected override void BeforeRowsGUI()
- {
- int firstRowVisible;
- int lastRowVisible;
- GetFirstAndLastVisibleRows(out firstRowVisible, out lastRowVisible);
-
- GUI.DrawTexture(new Rect(0,
- firstRowVisible * rowHeight,
- GetRowRect(0).width,
- (lastRowVisible * rowHeight) + 1000),
- Images.GetTreeviewBackgroundTexture());
-
- DrawTreeViewItem.InitializeStyles();
- base.BeforeRowsGUI();
- }
-
- protected override void RowGUI(RowGUIArgs args)
- {
- if (args.item is ChangelistTreeViewItem)
- {
- ChangelistTreeViewItemGUI(
- this,
- args.rowRect, rowHeight,
- (ChangelistTreeViewItem)args.item,
- args.selected, args.focused);
- return;
- }
-
- if (args.item is ChangeCategoryTreeViewItem)
- {
- CategoryTreeViewItemGUI(
- this,
- args.rowRect, rowHeight,
- (ChangeCategoryTreeViewItem)args.item,
- args.selected, args.focused);
- return;
- }
-
- if (args.item is ChangeTreeViewItem)
- {
- ChangeTreeViewItemGUI(
- mWkInfo.ClientPath,
- mIsGluonMode,
- mAssetStatusCache,
- this,
- mPendingChangesTree,
- (ChangeTreeViewItem)args.item,
- args);
- return;
- }
-
- base.RowGUI(args);
- }
-
- internal void BuildModel(List<ChangeInfo> changes, PendingChangesViewCheckedStateManager checkedStateManager)
- {
- mTreeViewItemIds.Clear();
-
- mPendingChangesTree.BuildChangeCategories(
- mWkInfo,
- changes,
- checkedStateManager);
- }
-
- internal ChangeInfo GetChangedForMoved(ChangeInfo moved)
- {
- return mPendingChangesTree.GetChangedForMoved(moved);
- }
-
- internal void Refilter()
- {
- Filter filter = new Filter(searchString);
- mPendingChangesTree.Filter(filter, mColumnNames);
-
- mExpandCategories = true;
- }
-
- internal void Sort()
- {
- int sortedColumnIdx = multiColumnHeader.state.sortedColumnIndex;
- bool sortAscending = multiColumnHeader.IsSortedAscending(sortedColumnIdx);
-
- mPendingChangesTree.Sort(
- mColumnNames[sortedColumnIdx],
- sortAscending);
- }
-
- internal bool GetSelectedPathsToDelete(
- out List<string> privateDirectories,
- out List<string> privateFiles)
- {
- privateDirectories = new List<string>();
- privateFiles = new List<string>();
-
- List<ChangeInfo> dirChanges = new List<ChangeInfo>();
- List<ChangeInfo> fileChanges = new List<ChangeInfo>();
-
- IList<int> selectedIds = GetSelection();
-
- if (selectedIds.Count == 0)
- return false;
-
- foreach (KeyValuePair<PendingChangeInfo, int> item
- in mTreeViewItemIds.GetInfoItems())
- {
- if (!selectedIds.Contains(item.Value))
- continue;
-
- ChangeInfo changeInfo = item.Key.ChangeInfo;
-
- if (ChangeInfoType.IsControlled(changeInfo))
- continue;
-
- if (changeInfo.IsDirectory)
- {
- dirChanges.Add(changeInfo);
- }
- else
- {
- fileChanges.Add(changeInfo);
- }
-
- ChangeInfo metaChangeInfo = mPendingChangesTree.GetMetaChange(changeInfo);
-
- if (metaChangeInfo != null)
- {
- fileChanges.Add(metaChangeInfo);
- }
- }
-
- privateDirectories = dirChanges.Select(
- d => d.GetFullPath()).ToList();
- privateFiles = fileChanges.Select(
- f => f.GetFullPath()).ToList();
-
- return true;
- }
-
- internal void GetCheckedChanges(
- List<ChangelistNode> selectedChangelists,
- bool bExcludePrivates,
- out List<ChangeInfo> changes,
- out List<ChangeInfo> dependenciesCandidates)
- {
- mPendingChangesTree.GetCheckedChanges(
- selectedChangelists,
- bExcludePrivates,
- out changes,
- out dependenciesCandidates);
- }
-
- internal List<ChangeInfo> GetAllChanges()
- {
- return mPendingChangesTree.GetAllChanges();
- }
-
- internal ChangeInfo GetMetaChange(ChangeInfo change)
- {
- if (change == null)
- return null;
-
- return mPendingChangesTree.GetMetaChange(change);
- }
-
- internal List<ChangeInfo> GetDependenciesCandidates(
- List<ChangeInfo> selectedChanges, bool bExcludePrivates)
- {
- return mPendingChangesTree.GetDependenciesCandidates(
- selectedChanges, bExcludePrivates);
- }
-
- internal List<IPlasticTreeNode> GetSelectedNodes()
- {
- List<IPlasticTreeNode> result = new List<IPlasticTreeNode>();
-
- IList<int> selectedIds = GetSelection();
-
- if (selectedIds.Count == 0)
- return result;
-
- foreach (KeyValuePair<IPlasticTreeNode, int> item
- in mTreeViewItemIds.GetCategoryItems())
- {
- if (!selectedIds.Contains(item.Value))
- continue;
-
- result.Add(item.Key);
- }
-
- foreach (KeyValuePair<PendingChangeInfo, int> item
- in mTreeViewItemIds.GetInfoItems())
- {
- if (!selectedIds.Contains(item.Value))
- continue;
-
- result.Add(item.Key);
- }
-
- return result;
- }
-
- internal List<ChangeInfo> GetSelectedChanges(bool includeMetaFiles)
- {
- List<ChangeInfo> result = new List<ChangeInfo>();
-
- IList<int> selectedIds = GetSelection();
-
- if (selectedIds.Count == 0)
- return result;
-
- foreach (KeyValuePair<PendingChangeInfo, int> item
- in mTreeViewItemIds.GetInfoItems())
- {
- if (!selectedIds.Contains(item.Value))
- continue;
-
- result.Add(item.Key.ChangeInfo);
- }
-
- if (includeMetaFiles)
- mPendingChangesTree.FillWithMeta(result);
-
- return result;
- }
-
- internal List<PendingChangeInfo> GetSelectedPendingChangeInfos()
- {
- List<PendingChangeInfo> result = new List<PendingChangeInfo>();
-
- IList<int> selectedIds = GetSelection();
-
- if (selectedIds.Count == 0)
- return result;
-
- foreach (KeyValuePair<PendingChangeInfo, int> item
- in mTreeViewItemIds.GetInfoItems())
- {
- if (!selectedIds.Contains(item.Value))
- continue;
-
- result.Add(item.Key);
- }
-
- return result;
- }
-
- internal List<ChangelistNode> GetSelectedChangelistNodes()
- {
- List<ChangelistNode> result = new List<ChangelistNode>();
-
- IList<int> selectedIds = GetSelection();
-
- if (selectedIds.Count == 0)
- return result;
-
- foreach (KeyValuePair<IPlasticTreeNode, int> item
- in mTreeViewItemIds.GetCategoryItems())
- {
- if (!selectedIds.Contains(item.Value))
- continue;
-
- if (item.Key is ChangelistNode)
- result.Add((ChangelistNode)item.Key);
- }
-
- return result;
- }
-
- internal bool SelectionHasMeta()
- {
- ChangeInfo selectedChangeInfo = GetSelectedRow();
-
- if (selectedChangeInfo == null)
- return false;
-
- return mPendingChangesTree.HasMeta(selectedChangeInfo);
- }
-
- internal ChangeInfo GetSelectedRow()
- {
- IList<int> selectedIds = GetSelection();
-
- if (selectedIds.Count == 0)
- return null;
-
- int selectedId = selectedIds[0];
-
- foreach (KeyValuePair<PendingChangeInfo, int> item
- in mTreeViewItemIds.GetInfoItems())
- {
- if (selectedId == item.Value)
- return item.Key.ChangeInfo;
- }
-
- return null;
- }
-
- internal ChangeInfo GetNearestAddedChange()
- {
- IList<int> selectedIds = GetSelection();
-
- if (selectedIds.Count == 0)
- return null;
-
- int id = selectedIds[0];
-
- IList<TreeViewItem> treeViewItems =
- FindRows(new List<int>() { id });
-
- if (treeViewItems.Count == 0)
- return null;
-
- PendingChangeInfo changeInfo =
- ((ChangeTreeViewItem)treeViewItems[0]).ChangeInfo;
- PendingChangeCategory category =
- (PendingChangeCategory)((IPlasticTreeNode)changeInfo).GetParent();
-
- int itemIndex = category.GetChildPosition(changeInfo);
-
- ChangeInfo result = GetNextExistingAddedItem(category, itemIndex);
-
- if (result != null)
- return result;
-
- return GetPreviousExistingAddedItem(category, itemIndex);
- }
-
- internal void SelectFirstPendingChangeOnTree()
- {
- int treeIdFirstItem = GetTreeIdFirstItem();
-
- if (treeIdFirstItem == -1)
- return;
-
- mIsSelectionChangedEventDisabled = true;
-
- try
- {
- TableViewOperations.SetSelectionAndScroll(
- this, new List<int> { treeIdFirstItem });
- }
- finally
- {
- mIsSelectionChangedEventDisabled = false;
- }
- }
-
- internal void SelectPreviouslySelectedPendingChanges(
- List<ChangeInfo> changesToSelect)
- {
- List<int> idsToSelect = new List<int>();
-
- foreach (ChangeInfo change in changesToSelect)
- {
- int changeId = GetTreeIdForItem(change);
-
- if (changeId == -1)
- continue;
-
- idsToSelect.Add(changeId);
- }
-
- mIsSelectionChangedEventDisabled = true;
- try
- {
- TableViewOperations.SetSelectionAndScroll(
- this, idsToSelect);
- }
- finally
- {
- mIsSelectionChangedEventDisabled = false;
- }
- }
-
- internal int GetCheckedItemCount()
- {
- return CheckableItems.GetCheckedChildNodeCount(mPendingChangesTree.GetNodes());
- }
-
- internal int GetTotalItemCount()
- {
- return CheckableItems.GetTotalChildNodeCount(mPendingChangesTree.GetNodes());
- }
-
- ChangeInfo GetNextExistingAddedItem(
- PendingChangeCategory addedCategory, int targetAddedItemIndex)
- {
- int addedItemsCount = addedCategory.GetChildrenCount();
-
- for (int i = targetAddedItemIndex + 1; i < addedItemsCount; i++)
- {
- ChangeInfo currentChangeInfo = GetExistingAddedItem(addedCategory, i);
-
- if (currentChangeInfo != null)
- return currentChangeInfo;
- }
-
- return null;
- }
-
- ChangeInfo GetPreviousExistingAddedItem(
- PendingChangeCategory addedCategory, int targetAddedItemIndex)
- {
- for (int i = targetAddedItemIndex - 1; i >= 0; i--)
- {
- ChangeInfo currentChangeInfo = GetExistingAddedItem(addedCategory, i);
-
- if (currentChangeInfo != null)
- return currentChangeInfo;
- }
-
- return null;
- }
-
- ChangeInfo GetExistingAddedItem(
- PendingChangeCategory addedCategory, int addedItemIndex)
- {
- ChangeInfo currentChangeInfo = ((PendingChangeInfo)((IPendingChangesNode)addedCategory)
- .GetCurrentChanges()[addedItemIndex]).ChangeInfo;
-
- if (Directory.Exists(currentChangeInfo.Path) ||
- File.Exists(currentChangeInfo.Path))
- return currentChangeInfo;
-
- return null;
- }
-
- int GetTreeIdFirstItem()
- {
- PendingChangeInfo firstChange = mPendingChangesTree.GetFirstPendingChange();
-
- if (firstChange == null)
- return -1;
-
- int changeId;
- if (mTreeViewItemIds.TryGetInfoItemId(firstChange, out changeId))
- return changeId;
-
- return -1;
- }
-
- int GetTreeIdForItem(ChangeInfo change)
- {
- foreach (KeyValuePair<PendingChangeInfo, int> item in mTreeViewItemIds.GetInfoItems())
- {
- ChangeInfo changeInfo = item.Key.ChangeInfo;
-
- if (changeInfo.ChangeTypes != change.ChangeTypes)
- continue;
-
- if (changeInfo.GetFullPath() != change.GetFullPath())
- continue;
-
- return item.Value;
- }
-
- return -1;
- }
-
- void DelayedSearchChanged()
- {
- Refilter();
-
- Sort();
-
- Reload();
-
- TableViewOperations.ScrollToSelection(this);
- }
-
- void SortingChanged(MultiColumnHeader multiColumnHeader)
- {
- Sort();
-
- Reload();
- }
-
- static void ChangelistTreeViewItemGUI(
- PendingChangesTreeView treeView,
- Rect rowRect,
- float rowHeight,
- ChangelistTreeViewItem item,
- bool isSelected,
- bool isFocused)
- {
- string label = item.Changelist.ChangelistInfo.Name;
- string secondaryLabel = item.Changelist.ChangelistInfo.Description;
-
- bool wasChecked = CheckableItems.GetIsCheckedValue(item.Changelist) ?? false;
-
- bool hadCheckedChildren =
- ((ICheckablePlasticTreeCategoryGroup)item.Changelist).GetCheckedCategoriesCount() > 0;
-
- bool hadPartiallyCheckedChildren =
- ((ICheckablePlasticTreeCategoryGroup)item.Changelist).GetPartiallyCheckedCategoriesCount() > 0;
-
- bool isChecked = DrawTreeViewItem.ForCheckableCategoryItem(
- rowRect,
- rowHeight,
- item.depth,
- label,
- secondaryLabel,
- isSelected,
- isFocused,
- wasChecked,
- hadCheckedChildren,
- hadPartiallyCheckedChildren);
-
- if (wasChecked != isChecked)
- {
- CheckableItems.SetCheckedValue(item.Changelist, isChecked);
- treeView.SelectionChanged();
- }
- }
-
- static void CategoryTreeViewItemGUI(
- PendingChangesTreeView treeView,
- Rect rowRect,
- float rowHeight,
- ChangeCategoryTreeViewItem item,
- bool isSelected,
- bool isFocused)
- {
- string label = item.Category.CategoryName;
- string secondaryLabel = item.Category.GetCheckedChangesText();
-
- bool wasChecked = CheckableItems.GetIsCheckedValueForCategory(item.Category) ?? false;
- bool hadCheckedChildren =
- ((ICheckablePlasticTreeCategory)item.Category).GetCheckedChangesCount() > 0;
-
- bool isChecked = DrawTreeViewItem.ForCheckableCategoryItem(
- rowRect,
- rowHeight,
- item.depth,
- label,
- secondaryLabel,
- isSelected,
- isFocused,
- wasChecked,
- hadCheckedChildren,
- false);
-
- if (wasChecked != isChecked)
- {
- CheckableItems.SetCheckedValue(item.Category, isChecked);
- treeView.SelectionChanged();
- }
- }
-
- static void ChangeTreeViewItemGUI(
- string wkPath,
- bool isGluonMode,
- IAssetStatusCache assetStatusCache,
- PendingChangesTreeView treeView,
- UnityPendingChangesTree pendingChangesTree,
- ChangeTreeViewItem item,
- RowGUIArgs args)
- {
- for (int visibleColumnIdx = 0; visibleColumnIdx < args.GetNumVisibleColumns(); visibleColumnIdx++)
- {
- Rect cellRect = args.GetCellRect(visibleColumnIdx);
-
- PendingChangesTreeColumn column =
- (PendingChangesTreeColumn)args.GetColumn(visibleColumnIdx);
-
- ChangeTreeViewItemCellGUI(
- isGluonMode,
- assetStatusCache,
- cellRect,
- treeView.rowHeight,
- treeView,
- pendingChangesTree,
- item,
- column,
- args.selected,
- args.focused);
- }
- }
-
- static void ChangeTreeViewItemCellGUI(
- bool isGluonMode,
- IAssetStatusCache assetStatusCache,
- Rect rect,
- float rowHeight,
- PendingChangesTreeView treeView,
- UnityPendingChangesTree pendingChangesTree,
- ChangeTreeViewItem item,
- PendingChangesTreeColumn column,
- bool isSelected,
- bool isFocused)
- {
- PendingChangeInfo changeInfo = item.ChangeInfo;
-
- string label = changeInfo.GetColumnText(
- PendingChangesTreeHeaderState.GetColumnName(column));
-
- DefaultStyles.label.fontSize = UnityConstants.PENDING_CHANGES_FONT_SIZE;
-
- if (column == PendingChangesTreeColumn.Item)
- {
-
- if (pendingChangesTree.HasMeta(changeInfo.ChangeInfo))
- label = string.Concat(label, UnityConstants.TREEVIEW_META_LABEL);
-
- Texture icon = GetIcon(changeInfo);
-
- bool isConflicted = IsConflicted(
- isGluonMode, assetStatusCache,
- changeInfo.ChangeInfo.GetFullPath());
-
- Texture overlayIcon =
- GetChangesOverlayIcon.ForPendingChange(
- changeInfo.ChangeInfo, isConflicted);
-
- bool wasChecked = ((ICheckablePlasticTreeNode)changeInfo).IsChecked() ?? false;
-
- bool isChecked = DrawTreeViewItem.ForCheckableItemCell(
- rect, rowHeight, item.depth,
- icon, overlayIcon, label,
- isSelected, isFocused, false,
- wasChecked);
-
- ((ICheckablePlasticTreeNode)changeInfo).UpdateCheckedState(isChecked);
-
- if (wasChecked != isChecked)
- {
- UpdateCheckStateForSelection(treeView, item);
- treeView.SelectionChanged();
- }
-
- return;
- }
-
- if (column == PendingChangesTreeColumn.Size)
- {
- DrawTreeViewItem.ForSecondaryLabelRightAligned(
- rect, label, isSelected, isFocused, false);
- return;
- }
-
- DrawTreeViewItem.ForSecondaryLabel(
- rect, label, isSelected, isFocused, false);
- }
-
- static void UpdateCheckStateForSelection(
- PendingChangesTreeView treeView,
- ChangeTreeViewItem senderTreeViewItem)
- {
- IList<int> selectedIds = treeView.GetSelection();
-
- if (selectedIds.Count <= 1)
- return;
-
- if (!selectedIds.Contains(senderTreeViewItem.id))
- return;
-
- bool isChecked = ((ICheckablePlasticTreeNode)senderTreeViewItem.ChangeInfo).IsChecked() ?? false;
-
- foreach (TreeViewItem treeViewItem in treeView.FindRows(selectedIds))
- {
- if (treeViewItem is ChangeCategoryTreeViewItem)
- {
- ((ICheckablePlasticTreeCategory)((ChangeCategoryTreeViewItem)treeViewItem)
- .Category).UpdateCheckedState(isChecked);
- continue;
- }
-
- ((ICheckablePlasticTreeNode)((ChangeTreeViewItem)treeViewItem)
- .ChangeInfo).UpdateCheckedState(isChecked);
- }
- }
-
- static void RegenerateRows(
- UnityPendingChangesTree pendingChangesTree,
- TreeViewItemIds<IPlasticTreeNode, PendingChangeInfo> treeViewItemIds,
- PendingChangesTreeView treeView,
- TreeViewItem rootItem,
- List<TreeViewItem> rows,
- bool expandCategories)
- {
- ClearRows(rootItem, rows);
-
- IEnumerable<IPlasticTreeNode> nodes = pendingChangesTree.GetNodes();
-
- if (nodes == null)
- return;
-
- foreach (IPlasticTreeNode node in nodes)
- {
- if (node is ChangelistNode)
- {
- AddChangelistNode(
- (ChangelistNode)node,
- treeViewItemIds,
- treeView,
- rootItem,
- rows,
- expandCategories);
- continue;
- }
-
- if (node is PendingChangeCategory)
- AddPendingChangeCategory(
- (PendingChangeCategory)node,
- treeViewItemIds,
- treeView,
- rootItem,
- rows,
- expandCategories,
- 0);
- }
-
- if (!expandCategories)
- return;
-
- treeView.state.expandedIDs = treeViewItemIds.GetCategoryIds();
- }
-
- static void AddChangelistNode(
- ChangelistNode changelist,
- TreeViewItemIds<IPlasticTreeNode, PendingChangeInfo> treeViewItemIds,
- PendingChangesTreeView treeView,
- TreeViewItem rootItem,
- List<TreeViewItem> rows,
- bool expandCategories)
- {
- int changelistCategoryId;
- if (!treeViewItemIds.TryGetCategoryItemId(changelist, out changelistCategoryId))
- changelistCategoryId = treeViewItemIds.AddCategoryItem(changelist);
-
- ChangelistTreeViewItem changelistTreeViewItem =
- new ChangelistTreeViewItem(changelistCategoryId, changelist);
-
- rootItem.AddChild(changelistTreeViewItem);
- rows.Add(changelistTreeViewItem);
-
- if (!expandCategories &&
- !treeView.IsExpanded(changelistTreeViewItem.id))
- return;
-
- IEnumerable<IPlasticTreeNode> categories = ((IPlasticTreeNode)changelist).GetChildren();
-
- foreach (IPlasticTreeNode category in categories)
- {
- AddPendingChangeCategory(
- (PendingChangeCategory)category,
- treeViewItemIds,
- treeView,
- changelistTreeViewItem,
- rows,
- expandCategories,
- 1);
- }
- }
-
- static void AddPendingChangeCategory(
- PendingChangeCategory category,
- TreeViewItemIds<IPlasticTreeNode, PendingChangeInfo> treeViewItemIds,
- PendingChangesTreeView treeView,
- TreeViewItem rootItem,
- List<TreeViewItem> rows,
- bool expandCategories,
- int depth)
- {
- int categoryId;
- if (!treeViewItemIds.TryGetCategoryItemId(category, out categoryId))
- categoryId = treeViewItemIds.AddCategoryItem(category);
-
- ChangeCategoryTreeViewItem categoryTreeViewItem =
- new ChangeCategoryTreeViewItem(categoryId, category, depth);
-
- rootItem.AddChild(categoryTreeViewItem);
- rows.Add(categoryTreeViewItem);
-
- if (!expandCategories &&
- !treeView.IsExpanded(categoryTreeViewItem.id))
- return;
-
- foreach (PendingChangeInfo change in ((IPendingChangesNode)category).GetCurrentChanges())
- {
- int changeId;
- if (!treeViewItemIds.TryGetInfoItemId(change, out changeId))
- changeId = treeViewItemIds.AddInfoItem(change);
-
- TreeViewItem changeTreeViewItem =
- new ChangeTreeViewItem(changeId, change, depth + 1);
-
- categoryTreeViewItem.AddChild(changeTreeViewItem);
- rows.Add(changeTreeViewItem);
- }
- }
-
- static void ClearRows(
- TreeViewItem rootItem,
- List<TreeViewItem> rows)
- {
- if (rootItem.hasChildren)
- rootItem.children.Clear();
-
- rows.Clear();
- }
-
- static Texture GetIcon(PendingChangeInfo change)
- {
- if (change.ChangeInfo.IsDirectory)
- return Images.GetDirectoryIcon();
-
- string fullPath = change.ChangeInfo.GetFullPath();
- return Images.GetFileIcon(fullPath);
- }
-
- static bool IsConflicted(
- bool isGluonMode,
- IAssetStatusCache assetStatusCache,
- string fullPath)
- {
- if (!isGluonMode)
- return false;
-
- return ClassifyAssetStatus.IsConflicted(
- assetStatusCache.GetStatus(fullPath));
- }
-
- bool mExpandCategories;
- bool mIsSelectionChangedEventDisabled;
-
- TreeViewItemIds<IPlasticTreeNode, PendingChangeInfo> mTreeViewItemIds =
- new TreeViewItemIds<IPlasticTreeNode, PendingChangeInfo>();
- List<TreeViewItem> mRows = new List<TreeViewItem>();
-
- UnityPendingChangesTree mPendingChangesTree;
- CooldownWindowDelayer mCooldownFilterAction;
-
- readonly PendingChangesTreeHeaderState mHeaderState;
- readonly PendingChangesViewMenu mMenu;
- readonly IAssetStatusCache mAssetStatusCache;
- readonly List<string> mColumnNames;
- readonly bool mIsGluonMode;
- readonly WorkspaceInfo mWkInfo;
- }
- }
|