A game about forced loneliness, made by TACStudios
1using System;
2
3using Codice.Client.Commands;
4using UnityEditor;
5using UnityEngine;
6
7using Codice.Client.Common;
8using Codice.CM.Client.Differences.Merge;
9using Codice.CM.Common;
10using PlasticGui;
11using PlasticGui.WorkspaceWindow.Merge;
12using Unity.PlasticSCM.Editor.UI;
13using Unity.PlasticSCM.Editor.UI.Progress;
14
15namespace Unity.PlasticSCM.Editor.Views.Merge.Developer
16{
17 internal class MergeOptionsDialog : PlasticDialog
18 {
19 internal bool MergeBothRadioToggleIsChecked { get { return mMergeBothRadioToggle; } }
20 internal bool MergeFromDestinationRadioToggleIsChecked { get { return mMergeFromDestinationRadioToggle; } }
21 internal bool MergeFromSourceRadioToggleIsChecked { get { return mMergeFromSourceRadioToggle; } }
22 internal bool OnlyOneRadioToggleIsChecked { get { return mOnlyOneRadioToggle; } }
23 internal bool ForcedRadioToggleIsChecked { get { return mForcedRadioToggle; } }
24 internal bool IgnoreMergeTrackingToggleIsChecked
25 {
26 get { return mIgnoreMergeTrackingToggle; }
27 set { mIgnoreMergeTrackingToggle = value; }
28 }
29 internal bool AutomaticAncestorRadioToggleIsChecked { get { return mAutomaticAncestorRadioToggle; } }
30 internal bool ManualAncestorRadioToggleIsChecked { get { return mManualAncestorRadioToggle; } }
31 internal string AncestorTextField { set { mAncestorTextField = value; } }
32
33 internal static bool MergeOptions(MergeDialogParameters mergeDialogParameters)
34 {
35 MergeOptionsDialog dialog = Create(
36 mergeDialogParameters,
37 new ProgressControlsForDialogs());
38
39 dialog.SetMergeOptions();
40
41 return dialog.RunModal(focusedWindow) == ResponseType.Ok;
42 }
43
44 internal static MergeOptionsDialog MergeOptionsForTesting(MergeDialogParameters mergeDialogParameters)
45 {
46 MergeOptionsDialog dialog = Create(
47 mergeDialogParameters,
48 new ProgressControlsForDialogs());
49
50 dialog.SetMergeOptions();
51 return dialog;
52 }
53
54 protected override Rect DefaultRect
55 {
56 get
57 {
58 var baseRect = base.DefaultRect;
59 return new Rect(baseRect.x, baseRect.y, 600, 450);
60 }
61 }
62
63 protected override string GetTitle()
64 {
65 return PlasticLocalization.GetString(
66 PlasticLocalization.Name.MergeOptionsTitle);
67 }
68
69 protected override void OnModalGUI()
70 {
71 GUILayout.Label(
72 PlasticLocalization.Name.MergeOptionsTitle.GetString(),
73 UnityStyles.Dialog.MessageTitle);
74
75 GUILayout.Label(
76 PlasticLocalization.Name.MergeOptionsExplanation.GetString(),
77 UnityStyles.Paragraph);
78
79 DrawSection(
80 PlasticLocalization.Name.MergeOptionsContributorsTitle.GetString(),
81 DoMergeContributorsArea);
82
83 DrawSection(
84 PlasticLocalization.Name.ConflictResolutionTitle.GetString(),
85 DoMergeConflictResolutionArea);
86
87 DrawSection(
88 PlasticLocalization.Name.MergeOptionSkipMergeTrackingTitle.GetString(),
89 DoSkipMergeTrackingArea);
90
91 DrawSection(
92 PlasticLocalization.Name.MergeOptionAdvancedTitle.GetString(),
93 DoAdvancedArea);
94
95 DrawProgressForDialogs.For(
96 mProgressControls.ProgressData);
97
98 DoButtonsArea();
99
100 mProgressControls.ForcedUpdateProgress(this);
101 }
102
103 void DoMergeContributorsArea()
104 {
105 if (GUILayout.Toggle(
106 mMergeBothRadioToggle,
107 PlasticLocalization.Name.MergeOptionBoth.GetString(),
108 UnityStyles.Dialog.RadioToggle))
109 {
110 CheckMergeBothRadioToggle();
111 }
112
113 GUI.enabled = mParameters.IsRegularMerge();
114
115 if (GUILayout.Toggle(
116 mMergeFromDestinationRadioToggle,
117 PlasticLocalization.Name.MergeOptionFromDestination.GetString(),
118 UnityStyles.Dialog.RadioToggle))
119 {
120 CheckMergeFromDestinationRadioToggle();
121 }
122
123 if (GUILayout.Toggle(
124 mMergeFromSourceRadioToggle,
125 PlasticLocalization.Name.MergeOptionFromSource.GetString(),
126 UnityStyles.Dialog.RadioToggle))
127 {
128 CheckMergeFromSourceRadioToggle();
129 }
130
131 GUI.enabled = true;
132 }
133
134 internal void CheckMergeBothRadioToggle()
135 {
136 mMergeBothRadioToggle = true;
137 mMergeFromDestinationRadioToggle = false;
138 mMergeFromSourceRadioToggle = false;
139 }
140
141 internal void CheckMergeFromDestinationRadioToggle()
142 {
143 mMergeBothRadioToggle = false;
144 mMergeFromDestinationRadioToggle = true;
145 mMergeFromSourceRadioToggle = false;
146 }
147
148 internal void CheckMergeFromSourceRadioToggle()
149 {
150 mMergeBothRadioToggle = false;
151 mMergeFromDestinationRadioToggle = false;
152 mMergeFromSourceRadioToggle = true;
153 }
154
155 void DoMergeConflictResolutionArea()
156 {
157 if (GUILayout.Toggle(
158 mOnlyOneRadioToggle,
159 Styles.ManualConflictResolution,
160 UnityStyles.Dialog.RadioToggle))
161 {
162 CheckOnlyOneRadioToggle();
163 }
164
165 if (GUILayout.Toggle(
166 mForcedRadioToggle,
167 Styles.AutomaticConflictResolution,
168 UnityStyles.Dialog.RadioToggle))
169 {
170 CheckForcedRadioToggle();
171 }
172 }
173
174 internal void CheckOnlyOneRadioToggle()
175 {
176 mOnlyOneRadioToggle = true;
177 mForcedRadioToggle = false;
178 }
179
180 internal void CheckForcedRadioToggle()
181 {
182 mOnlyOneRadioToggle = false;
183 mForcedRadioToggle = true;
184 }
185
186 void DoSkipMergeTrackingArea()
187 {
188 using (new EditorGUILayout.HorizontalScope())
189 {
190 GUI.enabled = !mParameters.IsRegularMerge();
191
192 mIgnoreMergeTrackingToggle = GUILayout.Toggle(
193 mIgnoreMergeTrackingToggle,
194 PlasticLocalization.Name.MergeOptionSkipMergeTrackingExplanation.GetString(),
195 UnityStyles.Dialog.CheckBox);
196
197 GUI.enabled = true;
198
199 if (GUILayout.Button(Images.GetInfoIcon(), UnityStyles.Dialog.FlatButton))
200 {
201 ShowSkipMergeTrackingHelp();
202 }
203
204 GUILayout.FlexibleSpace();
205 }
206 }
207
208 void ShowSkipMergeTrackingHelp()
209 {
210 GuiMessage.ShowInformation(
211 PlasticLocalization.GetString(
212 PlasticLocalization.Name.MergeOptionSkipMergeTrackingHelpTitle),
213 PlasticLocalization.GetString(
214 PlasticLocalization.Name.MergeOptionSkipMergeTrackingHelp));
215 }
216
217 void DoAdvancedArea()
218 {
219 GUI.enabled = mParameters.IsRegularMerge();
220
221 if (GUILayout.Toggle(
222 mAutomaticAncestorRadioToggle,
223 PlasticLocalization.Name.MergeOptionAutomaticCalculateAncestor.GetString(),
224 UnityStyles.Dialog.RadioToggle))
225 {
226 CheckAutomaticAncestorRadioToggle();
227 }
228
229 using (new EditorGUILayout.HorizontalScope())
230 {
231 if (GUILayout.Toggle(
232 mManualAncestorRadioToggle,
233 PlasticLocalization.Name.MergeOptionManualSpecifyAncestor.GetString(),
234 UnityStyles.Dialog.RadioToggle))
235 {
236 CheckManualAncestorRadioToggle();
237 }
238
239 GUI.enabled = mParameters.IsRegularMerge() && mManualAncestorRadioToggle;
240
241 GUILayout.Space(5);
242
243 mAncestorTextField = GUILayout.TextField(mAncestorTextField, GUILayout.Width(90));
244
245 if (mManualAncestorRadioToggle)
246 {
247 GUILayout.Label(PlasticLocalization.Name.
248 MergeOptionManualSpecifyAncestorExample.GetString());
249 }
250
251 GUILayout.FlexibleSpace();
252 }
253
254 GUI.enabled = true;
255 }
256
257 internal void CheckAutomaticAncestorRadioToggle()
258 {
259 mAutomaticAncestorRadioToggle = true;
260 mManualAncestorRadioToggle = false;
261 }
262
263 internal void CheckManualAncestorRadioToggle()
264 {
265 mAutomaticAncestorRadioToggle = false;
266 mManualAncestorRadioToggle = true;
267 }
268
269 void DoButtonsArea()
270 {
271 using (new EditorGUILayout.HorizontalScope())
272 {
273 GUILayout.FlexibleSpace();
274
275 if (Application.platform == RuntimePlatform.WindowsEditor)
276 {
277 DoSaveButton();
278 DoCancelButton();
279 return;
280 }
281
282 DoCancelButton();
283 DoSaveButton();
284 }
285 }
286
287 void DoSaveButton()
288 {
289 if (!AcceptButton(PlasticLocalization.Name.SaveButton.GetString()))
290 return;
291
292 OkButtonWithValidationAction();
293 }
294
295 void DoCancelButton()
296 {
297 if (!NormalButton(PlasticLocalization.Name.CancelButton.GetString()))
298 return;
299
300 CancelButtonAction();
301 }
302
303 void SetMergeOptions()
304 {
305 if (mParameters.Options == null)
306 return;
307
308 MergeDialogOptions mergeOptions = mParameters.Options;
309
310 SetMergeContributorOptions(mergeOptions);
311 SetSkipMergeTrackingOptions(mergeOptions);
312 SetConflictResolutionOptions(mergeOptions);
313 SetResolutionStrategyOptions(mParameters);
314 }
315
316 void SetMergeContributorOptions(MergeDialogOptions mergeOptions)
317 {
318 switch (mergeOptions.Contributor)
319 {
320 case MergeContributorType.MergeContributors:
321 {
322 mMergeBothRadioToggle = true;
323 break;
324 }
325 case MergeContributorType.KeepDestination:
326 {
327 mMergeFromDestinationRadioToggle = true;
328 break;
329 }
330 case MergeContributorType.KeepSource:
331 {
332 mMergeFromSourceRadioToggle = true;
333 break;
334 }
335 }
336 }
337
338 void SetSkipMergeTrackingOptions(MergeDialogOptions mergeOptions)
339 {
340 mIgnoreMergeTrackingToggle = mergeOptions.IgnoreMergeTracking;
341 }
342
343 void SetConflictResolutionOptions(MergeDialogOptions mergeOptions)
344 {
345 switch (mergeOptions.ResolutionType)
346 {
347 case MergeResolutionType.OnlyOne:
348 {
349 mOnlyOneRadioToggle = true;
350 break;
351 }
352 default:
353 {
354 mForcedRadioToggle = true;
355 break;
356 }
357 }
358 }
359
360 void SetResolutionStrategyOptions(MergeDialogParameters parameters)
361 {
362 if (parameters.Strategy == MergeStrategy.Manual && parameters.AncestorSpec != null)
363 {
364 mManualAncestorRadioToggle = true;
365 mAncestorTextField = parameters.AncestorSpec.csNumber.ToString();
366 }
367 else
368 {
369 mAutomaticAncestorRadioToggle = true;
370 }
371 }
372
373 internal void OkButtonWithValidationAction()
374 {
375 mParameters.SaveParameters(
376 mMergeBothRadioToggle,
377 mMergeFromDestinationRadioToggle,
378 mMergeFromSourceRadioToggle,
379 mIgnoreMergeTrackingToggle,
380 mOnlyOneRadioToggle,
381 mAutomaticAncestorRadioToggle);
382
383 if (mParameters.Strategy != MergeStrategy.Manual)
384 {
385 OkButtonAction();
386 return;
387 }
388
389 MergeDialogValidation.AsyncValidation(
390 mParameters,
391 mAncestorTextField,
392 this,
393 mProgressControls);
394 }
395
396 static void DrawSection(string title, Action drawContent)
397 {
398 EditorGUILayout.Space(10);
399 GUILayout.Label(
400 title,
401 UnityStyles.Dialog.SectionTitle);
402
403 using (new EditorGUILayout.HorizontalScope())
404 {
405 EditorGUILayout.Space(15);
406
407 using (new EditorGUILayout.VerticalScope())
408 {
409 drawContent();
410 }
411
412 GUILayout.FlexibleSpace();
413 }
414 }
415
416 static MergeOptionsDialog Create(
417 MergeDialogParameters parameters,
418 ProgressControlsForDialogs progressControls)
419 {
420 var instance = CreateInstance<MergeOptionsDialog>();
421 instance.mParameters = parameters;
422 instance.mProgressControls = progressControls;
423 instance.mEnterKeyAction = instance.OkButtonWithValidationAction;
424 instance.mEscapeKeyAction = instance.CancelButtonAction;
425 return instance;
426 }
427
428 class Styles
429 {
430 internal static GUIContent ManualConflictResolution =
431 new GUIContent(PlasticLocalization.GetString(
432 PlasticLocalization.Name.ManualConflictResolution),
433 PlasticLocalization.GetString(
434 PlasticLocalization.Name.ManualConflictResolutionTooltip));
435 internal static GUIContent AutomaticConflictResolution =
436 new GUIContent(PlasticLocalization.GetString(
437 PlasticLocalization.Name.AutomaticConflictResolution),
438 PlasticLocalization.GetString(
439 PlasticLocalization.Name.AutomaticConflictResolutionTooltip));
440 }
441
442 bool mMergeBothRadioToggle;
443 bool mMergeFromDestinationRadioToggle;
444 bool mMergeFromSourceRadioToggle;
445
446 bool mOnlyOneRadioToggle;
447 bool mForcedRadioToggle;
448
449 bool mIgnoreMergeTrackingToggle;
450
451 bool mAutomaticAncestorRadioToggle;
452 bool mManualAncestorRadioToggle;
453 string mAncestorTextField;
454
455 ProgressControlsForDialogs mProgressControls;
456 MergeDialogParameters mParameters;
457 }
458}