A game about forced loneliness, made by TACStudios
1using UnityEditor;
2using UnityEngine;
3
4using Codice.CM.Common;
5using PlasticGui.WorkspaceWindow.QueryViews.Changesets;
6using PlasticGui;
7using Unity.PlasticSCM.Editor.Tool;
8using Unity.PlasticSCM.Editor.UI;
9
10namespace Unity.PlasticSCM.Editor.Views.Changesets
11{
12 internal class ChangesetsViewMenu
13 {
14 internal GenericMenu Menu { get { return mMenu; } }
15
16 public interface IMenuOperations
17 {
18 void DiffBranch();
19 ChangesetExtendedInfo GetSelectedChangeset();
20 }
21
22 internal ChangesetsViewMenu(
23 IChangesetMenuOperations changesetMenuOperations,
24 IMenuOperations menuOperations,
25 bool isGluonMode)
26 {
27 mChangesetMenuOperations = changesetMenuOperations;
28 mMenuOperations = menuOperations;
29 mIsGluonMode = isGluonMode;
30
31 BuildComponents();
32 }
33
34 internal void Popup()
35 {
36 mMenu = new GenericMenu();
37
38 UpdateMenuItems(mMenu);
39
40 mMenu.ShowAsContext();
41 }
42
43 internal bool ProcessKeyActionIfNeeded(Event e)
44 {
45 int selectedChangesetsCount = mChangesetMenuOperations.GetSelectedChangesetsCount();
46
47 ChangesetMenuOperations operationToExecute = GetMenuOperations(
48 e, selectedChangesetsCount > 1);
49
50 if (operationToExecute == ChangesetMenuOperations.None)
51 return false;
52
53 ChangesetMenuOperations operations = ChangesetMenuUpdater.GetAvailableMenuOperations(
54 selectedChangesetsCount,
55 mIsGluonMode,
56 mMenuOperations.GetSelectedChangeset().BranchId,
57 mLoadedBranchId,
58 false);
59
60 if (!operations.HasFlag(operationToExecute))
61 return false;
62
63 ProcessMenuOperation(operationToExecute);
64 return true;
65 }
66
67 internal void SetLoadedBranchId(long loadedBranchId)
68 {
69 mLoadedBranchId = loadedBranchId;
70 }
71
72 void DiffChangesetMenuItem_Click()
73 {
74 mChangesetMenuOperations.DiffChangeset();
75 }
76
77 void DiffSelectedChangesetsMenuItem_Click()
78 {
79 mChangesetMenuOperations.DiffSelectedChangesets();
80 }
81
82 void RevertToChangesetMenuItem_Click()
83 {
84 mChangesetMenuOperations.RevertToChangeset();
85 }
86
87 void DiffBranchMenuItem_Click()
88 {
89 mMenuOperations.DiffBranch();
90 }
91
92 void CreateBranchFromChangesetMenuItem_Click()
93 {
94 mChangesetMenuOperations.CreateBranch();
95 }
96
97 void SwitchToChangesetMenuItem_Click()
98 {
99 mChangesetMenuOperations.SwitchToChangeset();
100 }
101
102 void MergeChangesetMenuItem_Click()
103 {
104 mChangesetMenuOperations.MergeChangeset();
105 }
106
107 void CreateCodeReviewMenuItem_Click()
108 {
109 mChangesetMenuOperations.CreateCodeReview();
110 }
111
112 void UpdateMenuItems(GenericMenu menu)
113 {
114 ChangesetExtendedInfo singleSelectedChangeset = mMenuOperations.GetSelectedChangeset();
115
116 ChangesetMenuOperations operations = ChangesetMenuUpdater.GetAvailableMenuOperations(
117 mChangesetMenuOperations.GetSelectedChangesetsCount(),
118 mIsGluonMode,
119 singleSelectedChangeset.BranchId,
120 mLoadedBranchId,
121 false);
122
123 AddDiffChangesetMenuItem(
124 mDiffChangesetMenuItemContent,
125 menu,
126 singleSelectedChangeset,
127 operations,
128 DiffChangesetMenuItem_Click);
129
130 AddChangesetsMenuItem(
131 mDiffSelectedChangesetsMenuItemContent,
132 menu,
133 operations,
134 ChangesetMenuOperations.DiffSelectedChangesets,
135 DiffSelectedChangesetsMenuItem_Click);
136
137 if (!IsOnMainBranch(singleSelectedChangeset))
138 {
139 menu.AddSeparator(string.Empty);
140
141 AddDiffBranchMenuItem(
142 mDiffBranchMenuItemContent,
143 menu,
144 singleSelectedChangeset,
145 operations,
146 DiffBranchMenuItem_Click);
147 }
148
149 menu.AddSeparator(string.Empty);
150
151 AddChangesetsMenuItem(
152 mCreateBranchMenuItemContent,
153 menu,
154 operations,
155 ChangesetMenuOperations.CreateBranch,
156 CreateBranchFromChangesetMenuItem_Click);
157
158 AddChangesetsMenuItem(
159 mSwitchToChangesetMenuItemContent,
160 menu,
161 operations,
162 ChangesetMenuOperations.SwitchToChangeset,
163 SwitchToChangesetMenuItem_Click);
164
165 if (!mIsGluonMode)
166 {
167 AddChangesetsMenuItem(
168 mRevertToChangesetMenuItemContent,
169 menu,
170 operations,
171 ChangesetMenuOperations.RevertToChangeset,
172 RevertToChangesetMenuItem_Click);
173
174 menu.AddSeparator(string.Empty);
175
176 AddChangesetsMenuItem(
177 mMergeChangesetMenuItemContent,
178 menu,
179 operations,
180 ChangesetMenuOperations.MergeChangeset,
181 MergeChangesetMenuItem_Click);
182 }
183
184 menu.AddSeparator(string.Empty);
185
186 AddChangesetsMenuItem(
187 mCreateCodeReviewMenuItemContent,
188 menu,
189 operations,
190 ChangesetMenuOperations.CreateCodeReview,
191 CreateCodeReviewMenuItem_Click);
192 }
193
194 void ProcessMenuOperation(
195 ChangesetMenuOperations operationToExecute)
196 {
197 if (operationToExecute == ChangesetMenuOperations.DiffChangeset)
198 {
199 DiffChangesetMenuItem_Click();
200 return;
201 }
202
203 if (operationToExecute == ChangesetMenuOperations.DiffSelectedChangesets)
204 {
205 DiffSelectedChangesetsMenuItem_Click();
206 return;
207 }
208
209 if (operationToExecute == ChangesetMenuOperations.MergeChangeset)
210 {
211 MergeChangesetMenuItem_Click();
212 return;
213 }
214 }
215
216 static void AddChangesetsMenuItem(
217 GUIContent menuItemContent,
218 GenericMenu menu,
219 ChangesetMenuOperations operations,
220 ChangesetMenuOperations operationsToCheck,
221 GenericMenu.MenuFunction menuFunction)
222 {
223 if (operations.HasFlag(operationsToCheck))
224 {
225 menu.AddItem(
226 menuItemContent,
227 false,
228 menuFunction);
229
230 return;
231 }
232
233 menu.AddDisabledItem(menuItemContent);
234 }
235
236 static void AddDiffChangesetMenuItem(
237 GUIContent menuItemContent,
238 GenericMenu menu,
239 ChangesetExtendedInfo changeset,
240 ChangesetMenuOperations operations,
241 GenericMenu.MenuFunction menuFunction)
242 {
243 string changesetName =
244 changeset != null ?
245 changeset.ChangesetId.ToString() :
246 string.Empty;
247
248 menuItemContent.text = string.Format("{0} {1}",
249 PlasticLocalization.GetString(
250 PlasticLocalization.Name.DiffChangesetMenuItem,
251 changesetName),
252 GetPlasticShortcut.ForDiff());
253
254 if (operations.HasFlag(ChangesetMenuOperations.DiffChangeset))
255 {
256 menu.AddItem(
257 menuItemContent,
258 false,
259 menuFunction);
260 return;
261 }
262
263 menu.AddDisabledItem(
264 menuItemContent);
265 }
266
267 static void AddDiffBranchMenuItem(
268 GUIContent menuItemContent,
269 GenericMenu menu,
270 ChangesetExtendedInfo changeset,
271 ChangesetMenuOperations operations,
272 GenericMenu.MenuFunction menuFunction)
273 {
274 menuItemContent.text =
275 PlasticLocalization.Name.DiffBranchMenuItem.GetString(
276 GetShorten.BranchNameFromChangeset(changeset));
277
278 if (operations.HasFlag(ChangesetMenuOperations.DiffChangeset))
279 {
280 menu.AddItem(
281 menuItemContent,
282 false,
283 menuFunction);
284 return;
285 }
286
287 menu.AddDisabledItem(
288 menuItemContent);
289 }
290
291 static bool IsOnMainBranch(ChangesetExtendedInfo singleSeletedChangeset)
292 {
293 if (singleSeletedChangeset == null)
294 return false;
295
296 return singleSeletedChangeset.BranchName == MAIN_BRANCH_NAME;
297 }
298
299 static ChangesetMenuOperations GetMenuOperations(
300 Event e, bool isMultipleSelection)
301 {
302 if (Keyboard.IsControlOrCommandKeyPressed(e) &&
303 Keyboard.IsKeyPressed(e, KeyCode.D))
304 return isMultipleSelection ?
305 ChangesetMenuOperations.DiffSelectedChangesets :
306 ChangesetMenuOperations.DiffChangeset;
307
308 if (Keyboard.IsControlOrCommandKeyPressed(e) &&
309 Keyboard.IsKeyPressed(e, KeyCode.M))
310 return ChangesetMenuOperations.MergeChangeset;
311
312 return ChangesetMenuOperations.None;
313 }
314
315 void BuildComponents()
316 {
317 mDiffChangesetMenuItemContent = new GUIContent(string.Empty);
318 mDiffSelectedChangesetsMenuItemContent = new GUIContent(string.Format("{0} {1}",
319 PlasticLocalization.GetString(PlasticLocalization.Name.ChangesetMenuItemDiffSelected),
320 GetPlasticShortcut.ForDiff()));
321 mDiffBranchMenuItemContent = new GUIContent();
322 mCreateBranchMenuItemContent = new GUIContent(
323 PlasticLocalization.GetString(PlasticLocalization.Name.ChangesetMenuItemCreateBranch));
324 mSwitchToChangesetMenuItemContent = new GUIContent(
325 PlasticLocalization.GetString(PlasticLocalization.Name.ChangesetMenuItemSwitchToChangeset));
326 mRevertToChangesetMenuItemContent = new GUIContent(
327 PlasticLocalization.GetString(PlasticLocalization.Name.ChangesetMenuItemRevertToChangeset));
328 mMergeChangesetMenuItemContent = new GUIContent(string.Format("{0} {1}",
329 PlasticLocalization.GetString(PlasticLocalization.Name.ChangesetMenuItemMergeFromChangeset),
330 GetPlasticShortcut.ForMerge()));
331 mCreateCodeReviewMenuItemContent = new GUIContent(
332 PlasticLocalization.Name.ChangesetMenuCreateANewCodeReview.GetString());
333 }
334
335 GenericMenu mMenu;
336
337 GUIContent mDiffChangesetMenuItemContent;
338 GUIContent mDiffSelectedChangesetsMenuItemContent;
339 GUIContent mDiffBranchMenuItemContent;
340 GUIContent mCreateBranchMenuItemContent;
341 GUIContent mSwitchToChangesetMenuItemContent;
342 GUIContent mRevertToChangesetMenuItemContent;
343 GUIContent mMergeChangesetMenuItemContent;
344 GUIContent mCreateCodeReviewMenuItemContent;
345
346 readonly IChangesetMenuOperations mChangesetMenuOperations;
347 readonly IMenuOperations mMenuOperations;
348 readonly bool mIsGluonMode;
349
350 long mLoadedBranchId = -1;
351
352 const string MAIN_BRANCH_NAME = "/main";
353 }
354}