/// <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);
            }
        }
Beispiel #2
0
 /// <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;
     }
 }
Beispiel #5
0
        /// <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;
        }
Beispiel #6
0
        /// <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;
        }