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}