Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Handle manually installed mods in ConsoleUI #2666

Merged
merged 1 commit into from
Jan 27, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -519,7 +519,7 @@ All notable changes to this project will be documented in this file.

### Features

- [GUI] The CKAN Identifer for each mod is now shown in their metadata panel. (plague006, #1476)
- [GUI] The CKAN Identifier for each mod is now shown in their metadata panel. (plague006, #1476)
- [GUI] Double-clicking on a filename in the 'Contents' panel now opens the directory containing that file. (Postremus, #1443)
- [GUI] The progress bar now shows the progress of downloading to the cache. (Postremus, #1445)
- [GUI] Mods can now be searched by their CKAN identifier in the name textbox (Postremus, #1475)
Expand Down
23 changes: 12 additions & 11 deletions ConsoleUI/ModInfoScreen.cs
Original file line number Diff line number Diff line change
Expand Up @@ -297,9 +297,10 @@ private int addDependencies(int top = 8)
return top - 1;
}

private DateTime InstalledOn(string identifier)
private DateTime? InstalledOn(string identifier)
{
return registry.InstalledModule(identifier).InstallTime;
// This can be null for manually installed mods
return registry.InstalledModule(identifier)?.InstallTime;
}

private int addVersionDisplay()
Expand All @@ -323,13 +324,13 @@ private int addVersionDisplay()

if (installed) {

DateTime instTime = InstalledOn(mod.identifier);
DateTime? instTime = InstalledOn(mod.identifier);

if (latestIsInstalled) {

addVersionBox(
boxLeft, boxTop, boxRight, boxTop + boxH - 1,
() => $"Latest/Installed {instTime.ToString("d")}",
() => $"Latest/Installed {instTime?.ToString("d") ?? "manually"}",
() => ConsoleTheme.Current.ActiveFrameFg,
true,
new List<CkanModule>() {inst}
Expand All @@ -349,7 +350,7 @@ private int addVersionDisplay()

addVersionBox(
boxLeft, boxTop, boxRight, boxTop + boxH - 1,
() => $"Installed {instTime.ToString("d")}",
() => $"Installed {instTime?.ToString("d") ?? "manually"}",
() => ConsoleTheme.Current.ActiveFrameFg,
true,
new List<CkanModule>() {inst}
Expand Down Expand Up @@ -385,12 +386,12 @@ private int addVersionDisplay()

} else {

DateTime instTime = InstalledOn(mod.identifier);
DateTime? instTime = InstalledOn(mod.identifier);
// Mod is no longer indexed, but we can generate a display
// of the old info about it from when we installed it
addVersionBox(
boxLeft, boxTop, boxRight, boxTop + boxH - 1,
() => $"UNAVAILABLE/Installed {instTime.ToString("d")}",
() => $"UNAVAILABLE/Installed {instTime?.ToString("d") ?? "manually"}",
() => ConsoleTheme.Current.AlertFrameFg,
true,
new List<CkanModule>() {mod}
Expand All @@ -413,14 +414,14 @@ private void addVersionBox(int l, int t, int r, int b, Func<string> title, Func<

if (releases != null && releases.Count > 0) {

ModuleVersion minMod = null, maxMod = null;
KspVersion minKsp = null, maxKsp = null;
ModuleVersion minMod = null, maxMod = null;
KspVersion minKsp = null, maxKsp = null;
Registry.GetMinMaxVersions(releases, out minMod, out maxMod, out minKsp, out maxKsp);
AddObject(new ConsoleLabel(
l + 2, t + 1, r - 2,
() => minMod == maxMod
? $"{ModuleInstaller.WithAndWithoutEpoch(minMod.ToString())}"
: $"{ModuleInstaller.WithAndWithoutEpoch(minMod.ToString())} - {ModuleInstaller.WithAndWithoutEpoch(maxMod.ToString())}",
? $"{ModuleInstaller.WithAndWithoutEpoch(minMod?.ToString() ?? "???")}"
: $"{ModuleInstaller.WithAndWithoutEpoch(minMod?.ToString() ?? "???")} - {ModuleInstaller.WithAndWithoutEpoch(maxMod?.ToString() ?? "???")}",
null,
color
));
Expand Down
8 changes: 5 additions & 3 deletions ConsoleUI/ModListHelpDialog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,10 @@ public ModListHelpDialog() : base()
AddObject(symbolTb);
symbolTb.AddLine("Status Symbols");
symbolTb.AddLine("==============");
symbolTb.AddLine($"{installed} Installed");
symbolTb.AddLine($"{upgradable} Upgradeable");
symbolTb.AddLine($"! Unavailable");
symbolTb.AddLine($"{installed} Installed");
symbolTb.AddLine($"{upgradable} Upgradeable");
symbolTb.AddLine($"{autodetected} Manually installed");
symbolTb.AddLine($"! Unavailable");
symbolTb.AddLine(" ");
symbolTb.AddLine("Basic Keys");
symbolTb.AddLine("==========");
Expand Down Expand Up @@ -65,6 +66,7 @@ public ModListHelpDialog() : base()

private static readonly string installed = Symbols.checkmark;
private static readonly string upgradable = Symbols.greaterEquals;
private static readonly string autodetected = Symbols.infinity;
}

}
18 changes: 15 additions & 3 deletions ConsoleUI/ModListScreen.cs
Original file line number Diff line number Diff line change
Expand Up @@ -185,10 +185,13 @@ public ModListScreen(KSPManager mgr, bool dbg)

moduleList.AddTip("-", "Remove",
() => moduleList.Selection != null
&& (registry.IsInstalled(moduleList.Selection.identifier, false))
&& registry.IsInstalled(moduleList.Selection.identifier, false)
&& !registry.IsAutodetected(moduleList.Selection.identifier)
);
moduleList.AddBinding(Keys.Minus, (object sender) => {
if (moduleList.Selection != null && registry.IsInstalled(moduleList.Selection.identifier, false)) {
if (moduleList.Selection != null
&& registry.IsInstalled(moduleList.Selection.identifier, false)
&& !registry.IsAutodetected(moduleList.Selection.identifier)) {
plan.ToggleRemove(moduleList.Selection);
}
return true;
Expand Down Expand Up @@ -547,6 +550,7 @@ public static string StatusSymbol(InstallStatus st)
case InstallStatus.Installed: return installed;
case InstallStatus.Installing: return installing;
case InstallStatus.NotInstalled: return notinstalled;
case InstallStatus.AutoDetected: return autodetected;
default: return "";
}
}
Expand Down Expand Up @@ -581,6 +585,7 @@ private long totalInstalledDownloadSize()
private static readonly string upgradable = Symbols.greaterEquals;
private static readonly string upgrading = "^";
private static readonly string removing = "-";
private static readonly string autodetected = Symbols.infinity;
}

/// <summary>
Expand Down Expand Up @@ -659,7 +664,9 @@ public void Reset()
public InstallStatus GetModStatus(KSPManager manager, IRegistryQuerier registry, string identifier)
{
if (registry.IsInstalled(identifier, false)) {
if (Remove.Contains(identifier)) {
if (registry.IsAutodetected(identifier)) {
return InstallStatus.AutoDetected;
} else if (Remove.Contains(identifier)) {
return InstallStatus.Removing;
} else if (registry.HasUpdate(identifier, manager.CurrentInstance.VersionCriteria())) {
if (Upgrade.Contains(identifier)) {
Expand Down Expand Up @@ -789,5 +796,10 @@ public enum InstallStatus {
/// This mod is installed and we are planning to upgrade it
/// </summary>
Upgrading,

/// <summary>
/// This mod was installed manually
/// </summary>
AutoDetected,
};
}
4 changes: 4 additions & 0 deletions ConsoleUI/Toolkit/Symbols.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@ public static class Symbols {
/// >= symbol
/// </summary>
public static readonly string greaterEquals = cp437s(0xf2);
/// <summary>
/// Infinity symbol
/// </summary>
public static readonly string infinity = cp437s(0xec);

/// <summary>
/// Hashed square box for drawing scrollbars
Expand Down
2 changes: 1 addition & 1 deletion Core/Registry/IRegistryQuerier.cs
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ public interface IRegistryQuerier
/// Gets the installed version of a mod. Does not check for provided or autodetected mods.
/// </summary>
/// <returns>The module or null if not found</returns>
CkanModule GetInstalledVersion(string identifer);
CkanModule GetInstalledVersion(string identifier);

/// <summary>
/// Attempts to find a module with the given identifier and version.
Expand Down
23 changes: 14 additions & 9 deletions Core/Registry/Registry.cs
Original file line number Diff line number Diff line change
Expand Up @@ -633,24 +633,29 @@ public KspVersion LatestCompatibleKSP(string identifier)
/// <param name="minKsp">Return parameter for the lowest game version</param>
/// <param name="maxKsp">Return parameter for the highest game version</param>
public static void GetMinMaxVersions(IEnumerable<CkanModule> modVersions,
out ModuleVersion minMod, out ModuleVersion maxMod,
out KspVersion minKsp, out KspVersion maxKsp)
out ModuleVersion minMod, out ModuleVersion maxMod,
out KspVersion minKsp, out KspVersion maxKsp)
{
minMod = maxMod = null;
minKsp = maxKsp = null;
foreach (CkanModule rel in modVersions) {
if (minMod == null || minMod > rel.version) {
foreach (CkanModule rel in modVersions.Where(v => v != null))
{
if (minMod == null || minMod > rel.version)
{
minMod = rel.version;
}
if (maxMod == null || maxMod < rel.version) {
if (maxMod == null || maxMod < rel.version)
{
maxMod = rel.version;
}
KspVersion relMin = rel.EarliestCompatibleKSP();
KspVersion relMax = rel.LatestCompatibleKSP();
if (minKsp == null || !minKsp.IsAny && (minKsp > relMin || relMin.IsAny)) {
if (minKsp == null || !minKsp.IsAny && (minKsp > relMin || relMin.IsAny))
{
minKsp = relMin;
}
if (maxKsp == null || !maxKsp.IsAny && (maxKsp < relMax || relMax.IsAny)) {
if (maxKsp == null || !maxKsp.IsAny && (maxKsp < relMax || relMax.IsAny))
{
maxKsp = relMax;
}
}
Expand Down Expand Up @@ -1010,10 +1015,10 @@ public ModuleVersion InstalledVersion(string modIdentifier, bool with_provides=t
/// <summary>
/// <see cref = "IRegistryQuerier.GetInstalledVersion" />
/// </summary>
public CkanModule GetInstalledVersion(string mod_identifer)
public CkanModule GetInstalledVersion(string mod_identifier)
{
InstalledModule installedModule;
return installed_modules.TryGetValue(mod_identifer, out installedModule)
return installed_modules.TryGetValue(mod_identifier, out installedModule)
? installedModule.Module
: null;
}
Expand Down
2 changes: 1 addition & 1 deletion Core/Types/ModuleInstallDescriptor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ public object Clone()
}

/// <summary>
/// Returns a default install stanza for the identifer provided.
/// Returns a default install stanza for the identifier provided.
/// </summary>
public static ModuleInstallDescriptor DefaultInstallStanza(string ident, ZipFile zipfile)
{
Expand Down
4 changes: 3 additions & 1 deletion Core/Versioning/KspVersionRange.cs
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,9 @@ private static string DeriveString(KspVersionRange versionRange)

private static string SameVersionString(KspVersion v)
{
return v.IsAny ? "all versions" : v.ToString();
return v == null ? "???"
: v.IsAny ? "all versions"
: v.ToString();
}

/// <summary>
Expand Down