Skip to content

Commit

Permalink
Conflicting recommendations check for ConsoleUI
Browse files Browse the repository at this point in the history
  • Loading branch information
HebaruSan committed May 9, 2024
1 parent 9fb7436 commit 8d50fd7
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 14 deletions.
60 changes: 47 additions & 13 deletions ConsoleUI/DependencyScreen.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,15 +66,20 @@ public DependencyScreen(GameInstanceManager mgr, Registry reg, ChangePlan cp, Ha
);
dependencyList.AddTip("+", Properties.Resources.Toggle);
dependencyList.AddBinding(Keys.Plus, (object sender, ConsoleTheme theme) => {
ChangePlan.toggleContains(accepted, dependencyList.Selection.module);
var mod = dependencyList.Selection.module;
if (accepted.Contains(mod) || TryWithoutConflicts(accepted.Append(mod))) {
ChangePlan.toggleContains(accepted, mod);
}
return true;
});

dependencyList.AddTip($"{Properties.Resources.Ctrl}+A", Properties.Resources.SelectAll);
dependencyList.AddBinding(Keys.CtrlA, (object sender, ConsoleTheme theme) => {
foreach (var kvp in dependencies) {
if (!accepted.Contains(kvp.Key)) {
ChangePlan.toggleContains(accepted, kvp.Key);
if (TryWithoutConflicts(dependencies.Keys)) {
foreach (var kvp in dependencies) {
if (!accepted.Contains(kvp.Key)) {
ChangePlan.toggleContains(accepted, kvp.Key);
}
}
}
return true;
Expand Down Expand Up @@ -107,16 +112,15 @@ public DependencyScreen(GameInstanceManager mgr, Registry reg, ChangePlan cp, Ha

AddTip("F9", Properties.Resources.Accept);
AddBinding(Keys.F9, (object sender, ConsoleTheme theme) => {
foreach (CkanModule mod in accepted) {
plan.Install.Add(mod);
}
// Add the rest to rejected
foreach (var kvp in dependencies) {
if (!accepted.Contains(kvp.Key)) {
rejected.Add(kvp.Key.identifier);
}
if (TryWithoutConflicts(accepted)) {
plan.Install.UnionWith(accepted);
// Add the rest to rejected
rejected.UnionWith(dependencies.Keys
.Except(accepted)
.Select(m => m.identifier));
return false;
}
return false;
return true;
});
}

Expand Down Expand Up @@ -178,6 +182,36 @@ private string StatusSymbol(CkanModule mod)
=> accepted.Contains(mod) ? installing
: notinstalled;

private bool TryWithoutConflicts(IEnumerable<CkanModule> toAdd)
{
if (HasConflicts(toAdd, out List<string> conflictDescriptions)) {
RaiseError("{0}", string.Join(Environment.NewLine,
conflictDescriptions));
return false;
}
return true;
}

private bool HasConflicts(IEnumerable<CkanModule> toAdd,
out List<string> descriptions)
{
try
{
var resolver = new RelationshipResolver(
plan.Install.Concat(toAdd).Distinct(),
plan.Remove.Select(ident => registry.InstalledModule(ident)?.Module),
RelationshipResolverOptions.ConflictsOpts(), registry,
manager.CurrentInstance.VersionCriteria());
descriptions = resolver.ConflictDescriptions.ToList();
return descriptions.Count > 0;
}
catch (DependencyNotSatisfiedKraken k)
{
descriptions = new List<string>() { k.Message };
return true;
}
}

private readonly HashSet<CkanModule> accepted = new HashSet<CkanModule>();
private readonly HashSet<string> rejected;

Expand Down
3 changes: 2 additions & 1 deletion ConsoleUI/InstallScreen.cs
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,8 @@ public override void Run(ConsoleTheme theme, Action<ConsoleTheme> process = null
registry.InstalledModules
.Select(im => im.Module)
.ToArray(),
plan.Install))
plan.Install)
?? m)
.ToArray();
inst.InstallList(iList, resolvOpts, regMgr, ref possibleConfigOnlyDirs, dl);
plan.Install.Clear();
Expand Down

0 comments on commit 8d50fd7

Please sign in to comment.