A game about forced loneliness, made by TACStudios
1using System;
2
3using UnityEditor.VersionControl;
4
5using Codice;
6using Codice.Client.Commands.Tree;
7using Codice.Client.Commands.WkTree;
8using Codice.CM.Common;
9using PlasticGui;
10using Unity.PlasticSCM.Editor.AssetsOverlays.Cache;
11using Unity.PlasticSCM.Editor.AssetsOverlays;
12using Unity.PlasticSCM.Editor.AssetUtils;
13
14namespace Unity.PlasticSCM.Editor.AssetMenu
15{
16 [Flags]
17 internal enum AssetMenuOperations : byte
18 {
19 None = 0,
20 Checkout = 1 << 0,
21 Diff = 1 << 1,
22 History = 1 << 2,
23 Add = 1 << 3,
24 Checkin = 1 << 4,
25 Undo = 1 << 5,
26 CopyFilePath = 1 << 6
27 }
28
29 internal class SelectedAssetGroupInfo
30 {
31 internal int SelectedCount;
32
33 internal bool IsControlledSelection;
34 internal bool IsCheckedInSelection;
35 internal bool IsCheckedOutSelection;
36 internal bool IsPrivateSelection;
37 internal bool IsAddedSelection;
38 internal bool IsFileSelection;
39 internal bool IsMovedSelection;
40 internal bool HasAnyAddedInSelection;
41 internal bool HasAnyRemoteLockedInSelection;
42
43 internal static SelectedAssetGroupInfo BuildFromAssetList(
44 WorkspaceInfo wkInfo,
45 AssetList assetList,
46 IPlasticAPI plasticApi,
47 IAssetStatusCache statusCache)
48 {
49 bool isCheckedInSelection = true;
50 bool isControlledSelection = true;
51 bool isCheckedOutSelection = true;
52 bool isPrivateSelection = true;
53 bool isAddedSelection = true;
54 bool isFileSelection = true;
55 bool isMovedSelection = true;
56 bool hasAnyAddedInSelection = false;
57 bool hasAnyRemoteLockedInSelection = false;
58
59 int selectedCount = 0;
60
61 foreach (Asset asset in assetList)
62 {
63 string fullPath = AssetsPath.GetFullPathUnderWorkspace.
64 ForAsset(wkInfo.ClientPath, asset.path);
65
66 if (fullPath == null)
67 continue;
68
69 SelectedAssetGroupInfo singleFileGroupInfo = BuildFromSingleFile(
70 fullPath, asset.isFolder, wkInfo, plasticApi, statusCache);
71
72 if (!singleFileGroupInfo.IsCheckedInSelection)
73 isCheckedInSelection = false;
74
75 if (!singleFileGroupInfo.IsControlledSelection)
76 isControlledSelection = false;
77
78 if (!singleFileGroupInfo.IsCheckedOutSelection)
79 isCheckedOutSelection = false;
80
81 if (!singleFileGroupInfo.IsPrivateSelection)
82 isPrivateSelection = false;
83
84 if (!singleFileGroupInfo.IsAddedSelection)
85 isAddedSelection = false;
86
87 if (!singleFileGroupInfo.IsFileSelection)
88 isFileSelection = false;
89
90 if (!singleFileGroupInfo.IsMovedSelection)
91 isMovedSelection = false;
92
93 if (singleFileGroupInfo.HasAnyAddedInSelection)
94 hasAnyAddedInSelection = true;
95
96 if (singleFileGroupInfo.HasAnyRemoteLockedInSelection)
97 hasAnyRemoteLockedInSelection = true;
98
99 selectedCount++;
100 }
101
102 return new SelectedAssetGroupInfo()
103 {
104 IsCheckedInSelection = isCheckedInSelection,
105 IsCheckedOutSelection = isCheckedOutSelection,
106 IsControlledSelection = isControlledSelection,
107 IsPrivateSelection = isPrivateSelection,
108 IsAddedSelection = isAddedSelection,
109 IsFileSelection = isFileSelection,
110 IsMovedSelection = isMovedSelection,
111 HasAnyAddedInSelection = hasAnyAddedInSelection,
112 HasAnyRemoteLockedInSelection = hasAnyRemoteLockedInSelection,
113 SelectedCount = selectedCount,
114 };
115 }
116
117 internal static SelectedAssetGroupInfo BuildFromSingleFile(
118 string fullPath,
119 bool isDirectory,
120 WorkspaceInfo wkInfo,
121 IPlasticAPI plasticApi,
122 IAssetStatusCache statusCache)
123 {
124 bool isCheckedInSelection = true;
125 bool isControlledSelection = true;
126 bool isCheckedOutSelection = true;
127 bool isPrivateSelection = true;
128 bool isAddedSelection = true;
129 bool isFileSelection = true;
130 bool isMovedSelection = false;
131 bool hasAnyAddedInSelection = false;
132 bool hasAnyRemoteLockedInSelection = false;
133
134 WorkspaceTreeNode wkTreeNode = plasticApi.
135 GetWorkspaceTreeNode(fullPath);
136
137 if (isDirectory)
138 isFileSelection = false;
139
140 if (CheckWorkspaceTreeNodeStatus.IsPrivate(wkTreeNode))
141 isControlledSelection = false;
142 else
143 isPrivateSelection = false;
144
145 if (CheckWorkspaceTreeNodeStatus.IsCheckedOut(wkTreeNode))
146 isCheckedInSelection = false;
147 else
148 isCheckedOutSelection = false;
149
150 if (CheckWorkspaceTreeNodeStatus.IsAdded(wkTreeNode))
151 hasAnyAddedInSelection = true;
152 else
153 isAddedSelection = false;
154
155 if (wkTreeNode != null)
156 {
157 TreeChangedNode treeChangedNode = plasticApi.
158 GetChangedNodeForPath(wkInfo, fullPath);
159
160 if (treeChangedNode != null)
161 isMovedSelection = treeChangedNode.MovedDst;
162 }
163
164 AssetStatus assetStatus = statusCache.GetStatus(fullPath);
165
166 if (ClassifyAssetStatus.IsLockedRemote(assetStatus))
167 hasAnyRemoteLockedInSelection = true;
168
169 return new SelectedAssetGroupInfo()
170 {
171 IsCheckedInSelection = isCheckedInSelection,
172 IsCheckedOutSelection = isCheckedOutSelection,
173 IsControlledSelection = isControlledSelection,
174 IsPrivateSelection = isPrivateSelection,
175 IsAddedSelection = isAddedSelection,
176 IsFileSelection = isFileSelection,
177 IsMovedSelection = isMovedSelection,
178 HasAnyAddedInSelection = hasAnyAddedInSelection,
179 HasAnyRemoteLockedInSelection = hasAnyRemoteLockedInSelection,
180 SelectedCount = 1,
181 };
182 }
183 }
184
185 internal interface IAssetMenuVCSOperations
186 {
187 void ShowPendingChanges();
188 void Add();
189 void Checkout();
190 void Checkin();
191 void Undo();
192 void ShowDiff();
193 void ShowHistory();
194 }
195
196 internal interface IAssetMenuCopyPathOperation
197 {
198 void CopyFilePath(bool relativePath);
199 }
200
201 internal static class AssetMenuUpdater
202 {
203 internal static AssetMenuOperations GetAvailableMenuOperations(
204 SelectedAssetGroupInfo info)
205 {
206 AssetMenuOperations result = AssetMenuOperations.None;
207
208 if (info.SelectedCount == 0)
209 {
210 return result;
211 }
212
213 result |= AssetMenuOperations.CopyFilePath;
214
215 if (info.IsControlledSelection &&
216 info.IsCheckedInSelection &&
217 info.IsFileSelection &&
218 !info.HasAnyRemoteLockedInSelection)
219 {
220 result |= AssetMenuOperations.Checkout;
221 }
222
223 if (info.IsFileSelection &&
224 info.IsPrivateSelection)
225 {
226 result |= AssetMenuOperations.Add;
227 }
228
229 if (info.IsFileSelection &&
230 info.IsControlledSelection &&
231 info.IsCheckedOutSelection)
232 {
233 result |= AssetMenuOperations.Checkin;
234 }
235
236 if ((info.IsControlledSelection &&
237 info.IsMovedSelection) ||
238 (info.IsFileSelection &&
239 info.IsControlledSelection &&
240 info.IsCheckedOutSelection))
241 {
242 result |= AssetMenuOperations.Undo;
243 }
244
245 if (info.SelectedCount == 1 &&
246 info.IsControlledSelection &&
247 !info.HasAnyAddedInSelection &&
248 info.IsFileSelection)
249 {
250 result |= AssetMenuOperations.Diff;
251 }
252
253 if (info.SelectedCount == 1 &&
254 info.IsControlledSelection &&
255 !info.HasAnyAddedInSelection)
256 {
257 result |= AssetMenuOperations.History;
258 }
259
260 return result;
261 }
262 }
263}