A game about forced loneliness, made by TACStudios
1using UnityEditor;
2using UnityEngine;
3
4using PlasticGui;
5using PlasticGui.WorkspaceWindow.Merge;
6using Unity.PlasticSCM.Editor.UI;
7
8namespace Unity.PlasticSCM.Editor.Views.Merge.Developer
9{
10 internal class MergeViewFileConflictMenu
11 {
12 internal interface IMetaMenuOperations
13 {
14 void DiffSourceWithAncestor();
15 void DiffDestinationWithAncestor();
16 void DiffSourceWithDestination();
17 void ShowHistory();
18 bool SelectionHasMeta();
19 }
20
21 internal GenericMenu Menu { get { return mMenu; } }
22
23 internal MergeViewFileConflictMenu(
24 IMergeViewMenuOperations mergeViewMenuOperations,
25 IMetaMenuOperations mergeMetaMenuOperations,
26 bool isIncomingMerge,
27 bool isMergeTo,
28 bool isShelvesetMerge = false)
29 {
30 mMergeViewMenuOperations = mergeViewMenuOperations;
31 mMergeMetaMenuOperations = mergeMetaMenuOperations;
32 mIsShelvesetMerge = isShelvesetMerge;
33
34 BuildComponents(isIncomingMerge, isMergeTo);
35 }
36
37 internal void Popup()
38 {
39 mMenu = new GenericMenu();
40
41 UpdateMenuItems(mMenu);
42
43 mMenu.ShowAsContext();
44 }
45
46 internal bool ProcessKeyActionIfNeeded(Event e)
47 {
48 MergeMenuOperations operationToExecute = GetMenuOperations(e);
49
50 if (operationToExecute == MergeMenuOperations.None)
51 return false;
52
53 SelectedMergeChangesGroupInfo info =
54 mMergeViewMenuOperations.GetSelectedMergeChangesGroupInfo();
55 MergeMenuOperations operations =
56 UpdateMergeMenu.GetAvailableMenuOperations(info);
57
58 if (!operations.HasFlag(operationToExecute))
59 return false;
60
61 ProcessMenuOperation(operationToExecute, mMergeViewMenuOperations);
62 return true;
63 }
64
65 void MergeSelectedFilesMenuItem_Click()
66 {
67 mMergeViewMenuOperations.MergeContributors();
68 }
69
70 void MergeKeepingSourceChangesMenuItem_Click()
71 {
72 mMergeViewMenuOperations.MergeKeepingSourceChanges();
73 }
74
75 void MergeKeepingWorkspaceChangesMenuItem_Click()
76 {
77 mMergeViewMenuOperations.MergeKeepingWorkspaceChanges();
78 }
79
80 void DiffSourceWithDestinationMenuItem_Click()
81 {
82 mMergeViewMenuOperations.DiffSourceWithDestination();
83 }
84
85 void DiffDestinationWithAncestorMenuItem_Click()
86 {
87 mMergeViewMenuOperations.DiffDestinationWithAncestor();
88 }
89
90 void DiffSourceWithAncestorMenuItem_Click()
91 {
92 mMergeViewMenuOperations.DiffSourceWithAncestor();
93 }
94
95 void DiffMetaSourceWithDestinationMenuItem_Click()
96 {
97 mMergeMetaMenuOperations.DiffSourceWithDestination();
98 }
99
100 void DiffMetaDestinationWithAncestorMenuItem_Click()
101 {
102 mMergeMetaMenuOperations.DiffDestinationWithAncestor();
103 }
104
105 void DiffMetaSourceWithAncestorMenuItem_Click()
106 {
107 mMergeMetaMenuOperations.DiffSourceWithAncestor();
108 }
109
110 void HistoryMetaMenuItem_Click()
111 {
112 mMergeMetaMenuOperations.ShowHistory();
113 }
114
115 void CopyFilePathMenuItem_Click()
116 {
117 mMergeViewMenuOperations.CopyFilePath(relativePath: false);
118 }
119
120 void CopyRelativeFilePathMenuItem_Click()
121 {
122 mMergeViewMenuOperations.CopyFilePath(relativePath: true);
123 }
124
125 void HistoryMenuItem_Click()
126 {
127 mMergeViewMenuOperations.ShowHistory();
128 }
129
130 void UpdateMenuItems(GenericMenu menu)
131 {
132 SelectedMergeChangesGroupInfo info =
133 mMergeViewMenuOperations.GetSelectedMergeChangesGroupInfo();
134 MergeMenuOperations operations =
135 UpdateMergeMenu.GetAvailableMenuOperations(info);
136
137 if (operations == MergeMenuOperations.None)
138 {
139 menu.AddDisabledItem(GetNoActionMenuItemContent());
140 return;
141 }
142
143 if (!mIsShelvesetMerge)
144 {
145 AddMergeActions(menu, operations);
146
147 menu.AddSeparator(string.Empty);
148 }
149
150 AddDiffActions(menu, info, operations);
151
152 if (mMergeMetaMenuOperations.SelectionHasMeta())
153 {
154 menu.AddSeparator(string.Empty);
155
156 AddMetaActions(menu, info, operations);
157 }
158
159 menu.AddSeparator(string.Empty);
160
161 AddCopyFilePathActions(menu, operations);
162
163 menu.AddSeparator(string.Empty);
164
165 AddHistoryMenuItem(mHistoryMenuItemContent, menu, operations, HistoryMenuItem_Click);
166 }
167
168 void AddMergeActions(
169 GenericMenu menu,
170 MergeMenuOperations operations)
171 {
172 AddMergeSelectedFilesMenuItem(
173 mMergeSelectedFilesMenuItemContent, menu, operations, MergeSelectedFilesMenuItem_Click);
174
175 AddMergeKeepingSourceChangesMenuItem(
176 mMergeKeepingSourceChangesMenuItemContent, menu, operations, MergeKeepingSourceChangesMenuItem_Click);
177
178 AddMergeKeepingWorkspaceChangesMenuItem(
179 mMergeKeepingWorkspaceChangesMenuItemContent, menu, operations, MergeKeepingWorkspaceChangesMenuItem_Click);
180 }
181
182 void AddDiffActions(
183 GenericMenu menu,
184 SelectedMergeChangesGroupInfo info,
185 MergeMenuOperations operations)
186 {
187 mDiffSourceWithDestinationMenuItemContent.text =
188 UnityMenuItem.EscapedText(info.DiffSourceWithDestinationMenuItemText);
189 AddDiffSourceWithDestinationMenuItem(
190 mDiffSourceWithDestinationMenuItemContent, menu, operations, DiffSourceWithDestinationMenuItem_Click);
191
192 AddDiffDestinationWithAncestorMenuItem(
193 mDiffDestinationWithAncestorMenuItemContent, menu, operations, DiffDestinationWithAncestorMenuItem_Click);
194
195 AddDiffSourceWithAncestorMenuItem(
196 mDiffSourceWithAncestorMenuItem, menu, operations, DiffSourceWithAncestorMenuItem_Click);
197 }
198
199 void AddMetaActions(
200 GenericMenu menu,
201 SelectedMergeChangesGroupInfo info,
202 MergeMenuOperations operations)
203 {
204 mDiffMetaSourceWithDestinationMenuItemContent.text = string.Format(
205 "{0}/{1}",
206 MetaPath.META_EXTENSION,
207 UnityMenuItem.EscapedText(info.DiffSourceWithDestinationMenuItemText));
208 AddDiffSourceWithDestinationMenuItem(
209 mDiffMetaSourceWithDestinationMenuItemContent, menu, operations, DiffMetaSourceWithDestinationMenuItem_Click);
210
211 AddDiffDestinationWithAncestorMenuItem(
212 mDiffMetaDestinationWithAncestorMenuItemContent, menu, operations, DiffMetaDestinationWithAncestorMenuItem_Click);
213
214 AddDiffSourceWithAncestorMenuItem(
215 mDiffMetaSourceWithAncestorMenuItemContent, menu, operations, DiffMetaSourceWithAncestorMenuItem_Click);
216
217 AddHistoryMenuItem(
218 mHistoryMetaMenuItemContent, menu, operations, HistoryMetaMenuItem_Click);
219 }
220
221 void AddCopyFilePathActions(
222 GenericMenu menu,
223 MergeMenuOperations operations)
224 {
225 AddCopyFilePathMenuItem(
226 mCopyFilePathMenuItemContent, menu, operations, CopyFilePathMenuItem_Click);
227
228 AddCopyFilePathMenuItem(
229 mCopyRelativeFilePathMenuItemContent, menu, operations, CopyRelativeFilePathMenuItem_Click);
230 }
231
232 GUIContent GetNoActionMenuItemContent()
233 {
234 if (mNoActionMenuItemContent == null)
235 {
236 mNoActionMenuItemContent = new GUIContent(
237 PlasticLocalization.GetString(
238 PlasticLocalization.Name.NoActionMenuItem));
239 }
240
241 return mNoActionMenuItemContent;
242 }
243
244 static void AddMergeSelectedFilesMenuItem(
245 GUIContent menuItemContent,
246 GenericMenu menu,
247 MergeMenuOperations operations,
248 GenericMenu.MenuFunction menuFunction)
249 {
250 if (operations.HasFlag(MergeMenuOperations.MergeContributors))
251 {
252 menu.AddItem(
253 menuItemContent,
254 false,
255 menuFunction);
256
257 return;
258 }
259
260 menu.AddDisabledItem(menuItemContent);
261 }
262
263 static void AddMergeKeepingSourceChangesMenuItem(
264 GUIContent menuItemContent,
265 GenericMenu menu,
266 MergeMenuOperations operations,
267 GenericMenu.MenuFunction menuFunction)
268 {
269 if (operations.HasFlag(MergeMenuOperations.MergeKeepingSourceChanges))
270 {
271 menu.AddItem(
272 menuItemContent,
273 false,
274 menuFunction);
275
276 return;
277 }
278
279 menu.AddDisabledItem(menuItemContent);
280 }
281
282 static void AddMergeKeepingWorkspaceChangesMenuItem(
283 GUIContent menuItemContent,
284 GenericMenu menu,
285 MergeMenuOperations operations,
286 GenericMenu.MenuFunction menuFunction)
287 {
288 if (operations.HasFlag(MergeMenuOperations.MergeKeepingWorkspaceChanges))
289 {
290 menu.AddItem(
291 menuItemContent,
292 false,
293 menuFunction);
294
295 return;
296 }
297
298 menu.AddDisabledItem(menuItemContent);
299 }
300
301 static void AddDiffSourceWithDestinationMenuItem(
302 GUIContent menuItemContent,
303 GenericMenu menu,
304 MergeMenuOperations operations,
305 GenericMenu.MenuFunction menuFunction)
306 {
307 if (operations.HasFlag(MergeMenuOperations.DiffSourceWithDestination))
308 {
309 menu.AddItem(
310 menuItemContent,
311 false,
312 menuFunction);
313
314 return;
315 }
316
317 menu.AddDisabledItem(menuItemContent);
318 }
319
320 static void AddDiffDestinationWithAncestorMenuItem(
321 GUIContent menuItemContent,
322 GenericMenu menu,
323 MergeMenuOperations operations,
324 GenericMenu.MenuFunction menuFunction)
325 {
326 if (!operations.HasFlag(MergeMenuOperations.DiffDestinationWithAncestor))
327 return;
328
329 menu.AddItem(
330 menuItemContent,
331 false,
332 menuFunction);
333 }
334
335 static void AddDiffSourceWithAncestorMenuItem(
336 GUIContent menuItemContent,
337 GenericMenu menu,
338 MergeMenuOperations operations,
339 GenericMenu.MenuFunction menuFunction)
340 {
341 if (operations.HasFlag(MergeMenuOperations.DiffSourceWithAncestor))
342 {
343 menu.AddItem(
344 menuItemContent,
345 false,
346 menuFunction);
347
348 return;
349 }
350
351 menu.AddDisabledItem(menuItemContent);
352 }
353
354 static void AddCopyFilePathMenuItem(
355 GUIContent menuItemContent,
356 GenericMenu menu,
357 MergeMenuOperations operations,
358 GenericMenu.MenuFunction menuFunction)
359 {
360 if (operations.HasFlag(MergeMenuOperations.CopyFilePath))
361 {
362 menu.AddItem(
363 menuItemContent,
364 false,
365 menuFunction);
366
367 return;
368 }
369
370 menu.AddDisabledItem(menuItemContent);
371 }
372
373 static void AddHistoryMenuItem(
374 GUIContent menuItemContent,
375 GenericMenu menu,
376 MergeMenuOperations operations,
377 GenericMenu.MenuFunction menuFunction)
378 {
379 if (operations.HasFlag(MergeMenuOperations.ShowHistory))
380 {
381 menu.AddItem(
382 menuItemContent,
383 false,
384 menuFunction);
385
386 return;
387 }
388
389 menu.AddDisabledItem(menuItemContent);
390 }
391
392 static MergeMenuOperations GetMenuOperations(Event e)
393 {
394 if (Keyboard.IsControlOrCommandKeyPressed(e) &&
395 Keyboard.IsKeyPressed(e, KeyCode.H))
396 return MergeMenuOperations.ShowHistory;
397
398 return MergeMenuOperations.None;
399 }
400
401 static void ProcessMenuOperation(
402 MergeMenuOperations operationToExecute,
403 IMergeViewMenuOperations mergeViewMenuOperations)
404 {
405 if (operationToExecute == MergeMenuOperations.ShowHistory)
406 {
407 mergeViewMenuOperations.ShowHistory();
408 return;
409 }
410 }
411
412 void BuildComponents(
413 bool isIncomingMerge,
414 bool isMergeTo)
415 {
416 mMergeSelectedFilesMenuItemContent = new GUIContent(
417 PlasticLocalization.GetString(PlasticLocalization.
418 Name.MergeSelectedFiles));
419
420 mMergeKeepingSourceChangesMenuItemContent = new GUIContent(
421 UnityMenuItem.EscapedText(
422 MergeViewTexts.GetMergeKeepingSourceChangesMenuItemText(
423 isIncomingMerge, isMergeTo)));
424
425 mMergeKeepingWorkspaceChangesMenuItemContent = new GUIContent(
426 UnityMenuItem.EscapedText(
427 MergeViewTexts.GetMergeKeepingWorkspaceChangesMenuItemText(
428 isIncomingMerge, isMergeTo)));
429
430 string diffSourceWithAncestorText = UnityMenuItem.EscapedText(
431 MergeViewTexts.GetDiffSourceWithAncestorMenuItemText(isIncomingMerge));
432
433 mDiffSourceWithDestinationMenuItemContent = new GUIContent(string.Empty);
434
435 mDiffDestinationWithAncestorMenuItemContent = new GUIContent(
436 UnityMenuItem.EscapedText(
437 PlasticLocalization.GetString(
438 PlasticLocalization.Name.DiffDestinationWithAncestor)));
439
440 mDiffSourceWithAncestorMenuItem = new GUIContent(
441 diffSourceWithAncestorText);
442
443 mDiffMetaSourceWithDestinationMenuItemContent = new GUIContent(string.Empty);
444 mDiffMetaDestinationWithAncestorMenuItemContent = new GUIContent(
445 string.Format(
446 "{0}/{1}",
447 MetaPath.META_EXTENSION,
448 UnityMenuItem.EscapedText(
449 PlasticLocalization.GetString(
450 PlasticLocalization.Name.DiffDestinationWithAncestor))));
451
452 mDiffMetaSourceWithAncestorMenuItemContent = new GUIContent(
453 string.Format(
454 "{0}/{1}",
455 MetaPath.META_EXTENSION,
456 diffSourceWithAncestorText));
457
458 mHistoryMetaMenuItemContent = new GUIContent(
459 string.Format(
460 "{0}/{1}",
461 MetaPath.META_EXTENSION,
462 PlasticLocalization.Name.ItemsMenuItemHistory.GetString()));
463
464 mCopyFilePathMenuItemContent = new GUIContent(PlasticLocalization.Name.CopyFilePathMenuItem.GetString());
465
466 mCopyRelativeFilePathMenuItemContent =
467 new GUIContent(PlasticLocalization.Name.CopyRelativeFilePathMenuItem.GetString());
468
469 mHistoryMenuItemContent = new GUIContent(string.Format("{0} {1}",
470 PlasticLocalization.Name.ItemsMenuItemHistory.GetString(),
471 GetPlasticShortcut.ForHistory()));
472 }
473
474 GenericMenu mMenu;
475
476 GUIContent mNoActionMenuItemContent;
477
478 GUIContent mMergeSelectedFilesMenuItemContent;
479 GUIContent mMergeKeepingSourceChangesMenuItemContent;
480 GUIContent mMergeKeepingWorkspaceChangesMenuItemContent;
481
482 GUIContent mDiffSourceWithDestinationMenuItemContent;
483 GUIContent mDiffDestinationWithAncestorMenuItemContent;
484 GUIContent mDiffSourceWithAncestorMenuItem;
485
486 GUIContent mDiffMetaSourceWithDestinationMenuItemContent;
487 GUIContent mDiffMetaDestinationWithAncestorMenuItemContent;
488 GUIContent mDiffMetaSourceWithAncestorMenuItemContent;
489 GUIContent mHistoryMetaMenuItemContent;
490
491 GUIContent mCopyFilePathMenuItemContent;
492 GUIContent mCopyRelativeFilePathMenuItemContent;
493 GUIContent mHistoryMenuItemContent;
494
495 readonly IMergeViewMenuOperations mMergeViewMenuOperations;
496 readonly IMetaMenuOperations mMergeMetaMenuOperations;
497
498 readonly bool mIsShelvesetMerge;
499 }
500}