/// <summary> /// Maps the pretty print hierarchy. /// </summary> /// <param name="definition">The definition.</param> private void MapHierarchicalDefinition(IDefinition definition) { bool shouldAdd = false; var parentDirectoryCI = ResolveHierarchalParentDirectory(definition); var hierarchicalDefinition = mainHierarchalDefinitions.GetFirstByNameNoLock(nameof(IHierarchicalDefinitions.Name), parentDirectoryCI); if (hierarchicalDefinition == null) { hierarchicalDefinition = DIResolver.Get <IHierarchicalDefinitions>(); hierarchicalDefinition.Name = parentDirectoryCI; childHierarchicalDefinitions.TryAdd(parentDirectoryCI, new ConcurrentIndexedList <IHierarchicalDefinitions>(nameof(IHierarchicalDefinitions.Name))); shouldAdd = true; } bool exists = false; IHierarchicalDefinitions child = null; if (childHierarchicalDefinitions.TryGetValue(hierarchicalDefinition.Name, out var children)) { child = children.GetFirstByNameNoLock(nameof(IHierarchicalDefinitions.Name), definition.Id); exists = child != null; } if (!exists) { child = DIResolver.Get <IHierarchicalDefinitions>(); child.Name = definition.Id; child.Key = definition.TypeAndId; child.FileNames.Add(definition.FileCI); children.Add(child); if (shouldAdd) { mainHierarchalDefinitions.Add(hierarchicalDefinition); } } else { if (!child.FileNames.Contains(definition.FileCI)) { child.FileNames.Add(definition.FileCI); } } if (child.Mods == null) { child.Mods = new List <string>(); } if (!child.Mods.Contains(definition.ModName)) { child.Mods.Add(definition.ModName); } if (hierarchicalDefinition.Mods == null) { hierarchicalDefinition.Mods = new List <string>(); } if (!hierarchicalDefinition.Mods.Contains(definition.ModName)) { hierarchicalDefinition.Mods.Add(definition.ModName); } }
/// <summary> /// Sets the parameters. /// </summary> /// <param name="hierarchicalDefinition">The hierarchical definition.</param> public virtual void SetParameters(IHierarchicalDefinitions hierarchicalDefinition) { InvalidConflictPath = string.Empty; if (!IsConflictSolverAvailable && hierarchicalDefinition != null) { if (hierarchicalDefinition.AdditionalData is IDefinition definition) { HoveredDefinition = hierarchicalDefinition; InvalidConflictPath = modPatchCollectionService.ResolveFullDefinitionPath(definition); } } }
/// <summary> /// Resets the view. /// </summary> /// <param name="hierarchicalDefinitions">The hierarchical definitions.</param> protected virtual void Bind(IEnumerable <IHierarchicalDefinitions> hierarchicalDefinitions) { var index = PreviousConflictIndex; PreviousConflictIndex = null; if (hierarchicalDefinitions != null) { HierarchicalDefinitions = hierarchicalDefinitions.ToObservableCollection(); if (HierarchicalDefinitions.Any() && SelectedHierarchicalDefinition == null) { SelectedParentHierarchicalDefinition = HierarchicalDefinitions.FirstOrDefault(); } if (SelectedParentHierarchicalDefinition != null) { var conflictName = SelectedParentHierarchicalDefinition.Name; SelectedParentHierarchicalDefinition = null; var newSelected = HierarchicalDefinitions.FirstOrDefault(p => p.Name.Equals(conflictName)); if (newSelected != null) { PreviousConflictIndex = index; if (PreviousConflictIndex.GetValueOrDefault() > (newSelected.Children.Count - 1)) { PreviousConflictIndex = newSelected.Children.Count - 1; } SelectedParentHierarchicalDefinition = newSelected; } if (SelectedParentHierarchicalDefinition.Children.Count > 0) { SelectedHierarchicalDefinition = SelectedParentHierarchicalDefinition.Children.FirstOrDefault(); } } } else { HierarchicalDefinitions = null; } }
/// <summary> /// Resets the view. /// </summary> /// <param name="hierarchicalDefinitions">The hierarchical definitions.</param> protected virtual void Bind(IEnumerable <IHierarchicalDefinitions> hierarchicalDefinitions) { if (hierarchicalDefinitions != null) { IHierarchicalDefinitions selectedParent = null; if (SelectedParentHierarchicalDefinition != null) { selectedParent = SelectedParentHierarchicalDefinition; } HierarchicalDefinitions = hierarchicalDefinitions.ToObservableCollection(); if (HierarchicalDefinitions.Any() && SelectedHierarchicalDefinitions.Count == 0) { if (selectedParent != null) { SelectedParentHierarchicalDefinition = HierarchicalDefinitions.FirstOrDefault(p => p.Name.Equals(selectedParent.Name)); } else { SelectedParentHierarchicalDefinition = HierarchicalDefinitions.FirstOrDefault(); } } if (SelectedParentHierarchicalDefinition != null) { var conflictName = SelectedParentHierarchicalDefinition.Name; SelectedParentHierarchicalDefinition = null; var newSelected = HierarchicalDefinitions.FirstOrDefault(p => p.Name.Equals(conflictName)); if (newSelected != null) { SelectedParentHierarchicalDefinition = newSelected; } } } else { HierarchicalDefinitions = null; } }
/// <summary> /// resolve conflict as an asynchronous operation. /// </summary> /// <param name="resolve">if set to <c>true</c> [resolve].</param> protected virtual async Task ResolveConflictAsync(bool resolve) { if (ResolvingConflict) { return; } ResolvingConflict = true; if (ModCompareSelector.VirtualDefinitions?.Count() > 0) { IHierarchicalDefinitions conflictParent = null; int?conflictParentIdx = null; int parentIdx = HierarchalConflicts.ToList().IndexOf(SelectedParentConflict); foreach (var item in HierarchalConflicts) { if (item.Children.Contains(SelectedConflict)) { conflictParent = item; var conflictParentChildren = new List <IHierarchicalDefinitions>(item.Children); conflictParentIdx = conflictParentChildren.IndexOf(SelectedConflict); break; } } var id = idGenerator.GetNextId(); await TriggerOverlayAsync(id, true, localizationManager.GetResource(LocalizationResources.Conflict_Solver.OverlayResolve)); IDefinition patchDefinition = null; if (!IsBinaryConflict) { patchDefinition = ModCompareSelector.VirtualDefinitions.FirstOrDefault(p => modPatchCollectionService.IsPatchMod(p.ModName)); } else { if (resolve) { patchDefinition = takeLeftBinary ? ModCompareSelector.LeftSelectedDefinition : ModCompareSelector.RightSelectedDefinition; } else { patchDefinition = ModCompareSelector.Definitions.FirstOrDefault(); } } if (patchDefinition != null) { var generatedFileNames = patchDefinition.GeneratedFileNames; foreach (var fileNames in ModCompareSelector.Definitions.Select(p => p.GeneratedFileNames)) { foreach (var item in fileNames) { generatedFileNames.Add(item); } } patchDefinition.GeneratedFileNames = generatedFileNames; SyncCode(patchDefinition); try { if (resolve ? await modPatchCollectionService.ApplyModPatchAsync(Conflicts, patchDefinition, SelectedModCollection.Name) : await modPatchCollectionService.IgnoreModPatchAsync(Conflicts, patchDefinition, SelectedModCollection.Name)) { await FilterHierarchalConflictsAsync(Conflicts); IHierarchicalDefinitions selectedConflict = null; if (conflictParentIdx.HasValue && HierarchalConflicts.Any()) { foreach (var item in HierarchalConflicts) { if (item.Name.Equals(conflictParent.Name)) { if (conflictParentIdx.Value > (item.Children.Count - 1)) { conflictParentIdx = item.Children.Count - 1; } else if (conflictParentIdx.Value < 0) { conflictParentIdx = 0; } selectedConflict = item.Children.Select(p => p).ToList()[conflictParentIdx.GetValueOrDefault()]; break; } } } SelectedConflict = selectedConflict; ResetConflicts.Refresh(); } } catch (Exception ex) { var title = localizationManager.GetResource(LocalizationResources.SavingError.Title); var message = localizationManager.GetResource(LocalizationResources.SavingError.Message); logger.Error(ex); notificationAction.ShowNotification(title, message, NotificationType.Error, 30); } } if (SelectedConflict == null) { if (parentIdx > (HierarchalConflicts.Count() - 1)) { parentIdx = HierarchalConflicts.Count() - 1; } else if (parentIdx < 0) { parentIdx = 0; } if (HierarchalConflicts.Any()) { SelectedParentConflict = HierarchalConflicts.ElementAt(parentIdx); } } await TriggerOverlayAsync(id, false); } ResolvingConflict = false; }
/// <summary> /// Filters the hierarchal conflicts asynchronous. /// </summary> /// <param name="conflictResult">The conflict result.</param> /// <param name="selectedDefinitionOverride">The selected definition override.</param> /// <returns>Task.</returns> protected virtual async Task FilterHierarchalConflictsAsync(IConflictResult conflictResult, IHierarchicalDefinitions selectedDefinitionOverride = null) { while (filteringConflicts) { await Task.Delay(25); } filteringConflicts = true; var index = PreviousConflictIndex; PreviousConflictIndex = null; if (conflictResult != null && conflictResult.Conflicts != null) { var conflicts = conflictResult.Conflicts.GetHierarchicalDefinitions().ToList(); var resolved = new List <IHierarchicalDefinitions>(); if (conflictResult.ResolvedConflicts != null) { resolved.AddRange(conflictResult.ResolvedConflicts.GetHierarchicalDefinitions()); } if (conflictResult.IgnoredConflicts != null) { resolved.AddRange(conflictResult.IgnoredConflicts.GetHierarchicalDefinitions()); } if (conflictResult.RuleIgnoredConflicts != null) { resolved.AddRange(conflictResult.RuleIgnoredConflicts.GetHierarchicalDefinitions()); } foreach (var topLevelResolvedConflicts in resolved) { IEnumerable <IHierarchicalDefinitions> topLevelConflicts; if (topLevelResolvedConflicts.Name.StartsWith(LocalizationDirectory, StringComparison.OrdinalIgnoreCase)) { topLevelConflicts = conflicts.Where(p => p.Name.StartsWith(LocalizationDirectory, StringComparison.OrdinalIgnoreCase)); } else { topLevelConflicts = conflicts.Where(p => p.Name.Equals(topLevelResolvedConflicts.Name)); } if (topLevelConflicts.Any()) { foreach (var topLevelConflict in topLevelConflicts) { foreach (var childResolvedConflict in topLevelResolvedConflicts.Children) { var child = topLevelConflict.Children.FirstOrDefault(p => p.Key.Equals(childResolvedConflict.Key)); if (child != null) { topLevelConflict.Children.Remove(child); } } } } conflicts.RemoveAll(p => p.Children == null || p.Children.Count == 0); } var invalid = conflictResult.AllConflicts.GetByValueType(ValueType.Invalid); if (invalid?.Count() > 0) { var invalidDef = DIResolver.Get <IHierarchicalDefinitions>(); invalidDef.Name = Invalid; invalidDef.Key = InvalidKey; var children = new List <IHierarchicalDefinitions>(); foreach (var item in invalid) { var invalidChild = DIResolver.Get <IHierarchicalDefinitions>(); invalidChild.Name = item.File; var message = item.ErrorColumn.HasValue || item.ErrorLine.HasValue ? localizationManager.GetResource(LocalizationResources.Conflict_Solver.InvalidConflicts.Error) : localizationManager.GetResource(LocalizationResources.Conflict_Solver.InvalidConflicts.ErrorNoLine); invalidChild.Key = Smart.Format(message, new { item.ModName, Line = item.ErrorLine, Column = item.ErrorColumn, Environment.NewLine, Message = item.ErrorMessage, item.File }); invalidChild.AdditionalData = item; children.Add(invalidChild); } invalidDef.Children = children; conflicts.Add(invalidDef); } HierarchalConflicts = conflicts.ToObservableCollection(); NumberOfConflictsCaption = Smart.Format(localizationManager.GetResource(LocalizationResources.Conflict_Solver.ConflictCount), new { Count = conflicts.Where(p => p.Key != InvalidKey).SelectMany(p => p.Children).Count() }); if (HierarchalConflicts.Any() && SelectedParentConflict == null) { SelectedParentConflict = HierarchalConflicts.FirstOrDefault(); } if (SelectedParentConflict != null) { var conflictName = SelectedParentConflict.Name; SelectedParentConflict = null; var newSelected = HierarchalConflicts.FirstOrDefault(p => p.Name.Equals(conflictName)); if (newSelected != null) { PreviousConflictIndex = index; if (selectedDefinitionOverride != null) { var overrideMatch = newSelected.Children.FirstOrDefault(p => p.Key.Equals(selectedDefinitionOverride.Key)); if (overrideMatch != null) { PreviousConflictIndex = newSelected.Children.ToList().IndexOf(overrideMatch); } } if (PreviousConflictIndex.GetValueOrDefault() > (newSelected.Children.Count - 1)) { PreviousConflictIndex = newSelected.Children.Count - 1; } SelectedParentConflict = newSelected; } } } else { HierarchalConflicts = null; } filteringConflicts = false; }