IEnumerable<ISolution> ISolutionsFactory.GetSolutions(AcError error) {
switch (error.Type) {
case AcErrorType.Load_Base:
return null;
case AcErrorType.Data_JsonIsMissing:
return new[] {
Solve.TryToCreateNewFile((AcJsonObjectNew)error.Target)
}.Concat(Solve.TryToFindRenamedFile(error.Target.Location, ((AcJsonObjectNew)error.Target).JsonFilename)).Where(x => x != null);
case AcErrorType.Data_JsonIsDamaged:
return new[] {
new MultiSolution(
AppStrings.Solution_RestoreJsonFile,
AppStrings.Solution_RestoreJsonFile_Details,
e => {
var t = (AcJsonObjectNew)e.Target;
if (!Solve.TryToRestoreDamagedJsonFile(t.JsonFilename, JObjectRestorationSchemeProvider.GetScheme(t))) {
throw new SolvingException(AppStrings.Solution_CannotRestoreJsonFile);
}
}),
Solve.TryToCreateNewFile((AcJsonObjectNew)error.Target)
}.Concat(Solve.TryToFindRenamedFile(error.Target.Location, ((AcJsonObjectNew)error.Target).JsonFilename)).Where(x => x != null);
case AcErrorType.Data_ObjectNameIsMissing:
return new[] {
new MultiSolution(
AppStrings.Solution_SetName,
AppStrings.Solution_SetName_Details,
e => {
var value = Prompt.Show(AppStrings.Solution_SetName_Prompt, AppStrings.Common_NewName,
AcStringValues.NameFromId(e.Target.Id), maxLength: 200);
if (value == null) throw new SolvingException();
e.Target.NameEditable = value;
}) { IsUiSolution = true },
new MultiSolution(
AppStrings.Solution_SetNameFromId,
string.Format(AppStrings.Solution_SetNameFromId_Details, AcStringValues.NameFromId(error.Target.Id)),
e => {
e.Target.NameEditable = AcStringValues.NameFromId(e.Target.Id);
}),
};
case AcErrorType.Data_CarBrandIsMissing: {
var guess = AcStringValues.BrandFromName(error.Target.DisplayName);
return new[] {
new Solution(
AppStrings.Solution_SetBrandName,
AppStrings.Solution_SetBrandName_Details,
e => {
var value = Prompt.Show(AppStrings.Solution_SetBrandName_Prompt, AppStrings.Common_NewBrandName, guess,
maxLength: 200,
suggestions: SuggestionLists.CarBrandsList);
if (value == null) throw new SolvingException();
((CarObject)e.Target).Brand = value;
}) { IsUiSolution = true },
guess == null ? null : new Solution(
AppStrings.Solution_SetBrandNameFromName,
string.Format(AppStrings.Solution_SetBrandNameFromName_Details, guess),
e => {
((CarObject)e.Target).Brand = guess;
})
}.NonNull();
}
case AcErrorType.Data_IniIsMissing:
return Solve.TryToFindRenamedFile(error.Target.Location, ((AcIniObject)error.Target).IniFilename).Union(new[] {
new MultiSolution(
AppStrings.Solution_RemoveObject,
AppStrings.Solution_RemoveObject_Details,
e => {
e.Target.DeleteCommand.Execute(null);
})
});
case AcErrorType.Weather_ColorCurvesIniIsMissing:
return Solve.TryToFindRenamedFile(error.Target.Location, ((WeatherObject)error.Target).ColorCurvesIniFilename).Union(new[] {
new MultiSolution(
AppStrings.Solution_GenerateNew,
AppStrings.Solution_GenerateNew_Details,
e => {
File.WriteAllText(((WeatherObject)e.Target).ColorCurvesIniFilename, "");
}),
new MultiSolution(
AppStrings.Solution_RemoveObject,
AppStrings.Solution_RemoveObject_Details,
e => {
e.Target.DeleteCommand.Execute(null);
})
});
case AcErrorType.Data_IniIsDamaged:
return Solve.TryToFindRenamedFile(error.Target.Location, ((AcIniObject)error.Target).IniFilename).Union(new[] {
new MultiSolution(
AppStrings.Solution_RemoveObject,
AppStrings.Solution_RemoveObject_Details,
e => {
e.Target.DeleteCommand.Execute(null);
})
});
case AcErrorType.Data_UiDirectoryIsMissing:
// TODO
break;
case AcErrorType.Car_ParentIsMissing:
return new[] {
new MultiSolution(
AppStrings.Solution_MakeIndependent,
AppStrings.Solution_MakeIndependent_Details,
e => {
((CarObject)e.Target).ParentId = null;
}),
new MultiSolution(
AppStrings.Solution_ChangeParent,
AppStrings.Solution_ChangeParent_Details,
e => {
var target = (CarObject)e.Target;
new ChangeCarParentDialog(target).ShowDialog();
if (target.Parent == null) {
throw new SolvingException();
}
}) { IsUiSolution = true }
}.Concat(Solve.TryToFindRenamedFile(error.Target.Location, ((AcJsonObjectNew)error.Target).JsonFilename)).NonNull();
case AcErrorType.Car_BrandBadgeIsMissing: {
var car = (CarObject)error.Target;
var fit = FilesStorage.Instance.GetContentFile(ContentCategory.BrandBadges, $"{car.Brand}.png");
return new ISolution[] {
fit.Exists ? new MultiSolution(
string.Format(AppStrings.Solution_SetBrandBadge, car.Brand),
AppStrings.Solution_SetBrandBadge_Details,
e => {
var c = (CarObject)e.Target;
var f = FilesStorage.Instance.GetContentFile(ContentCategory.BrandBadges, $"{c.Brand}.png");
if (!f.Exists) return;
File.Copy(f.Filename, c.BrandBadge);
}) : null,
new MultiSolution(
AppStrings.Solution_ChangeBrandBadge,
AppStrings.Solution_ChangeBrandBadge_Details,
e => {
var target = (CarObject)e.Target;
new BrandBadgeEditor(target).ShowDialog();
if (!File.Exists(target.BrandBadge)) {
throw new SolvingException();
}
}) { IsUiSolution = true }
}.Concat(Solve.TryToFindRenamedFile(error.Target.Location, ((CarObject)error.Target).BrandBadge)).NonNull();
}
case AcErrorType.Car_UpgradeIconIsMissing: {
var car = (CarObject)error.Target;
var label = UpgradeIconEditor.TryToGuessLabel(car.DisplayName) ?? @"S1";
var fit = FilesStorage.Instance.GetContentFile(ContentCategory.UpgradeIcons, $"{label}.png");
return new ISolution[] {
fit.Exists ? new MultiSolution(
string.Format(AppStrings.Solution_SetUpgradeIcon, label),
AppStrings.Solution_SetUpgradeIcon_Details,
e => {
var c = (CarObject)e.Target;
var l = UpgradeIconEditor.TryToGuessLabel(c.DisplayName) ?? @"S1";
var f = FilesStorage.Instance.GetContentFile(ContentCategory.UpgradeIcons, $"{l}.png");
if (!f.Exists) return;
File.Copy(f.Filename, c.UpgradeIcon);
}) : null,
new MultiSolution(
AppStrings.Solution_ChangeUpgradeIcon,
AppStrings.Solution_ChangeUpgradeIcon_Details,
e => {
var target = (CarObject)e.Target;
new UpgradeIconEditor(target).ShowDialog();
if (!File.Exists(target.UpgradeIcon)) {
throw new SolvingException();
}
}) { IsUiSolution = true }
}.Concat(Solve.TryToFindRenamedFile(error.Target.Location, ((CarObject)error.Target).UpgradeIcon)).NonNull();
}
case AcErrorType.Showroom_Kn5IsMissing:
return new[] {
new MultiSolution(
AppStrings.Solution_MakeEmptyModel,
AppStrings.Solution_MakeEmptyModel_Details,
e => {
Kn5.CreateEmpty().SaveAll(((ShowroomObject)e.Target).Kn5Filename);
})
}.Concat(Solve.TryToFindAnyFile(error.Target.Location, ((ShowroomObject)error.Target).Kn5Filename, @"*.kn5")).Where(x => x != null);
case AcErrorType.Data_KunosCareerEventsAreMissing:
break;
case AcErrorType.Data_KunosCareerConditions:
break;
case AcErrorType.Data_KunosCareerContentIsMissing:
break;
case AcErrorType.Data_KunosCareerTrackIsMissing:
break;
case AcErrorType.Data_KunosCareerCarIsMissing:
break;
case AcErrorType.Data_KunosCareerCarSkinIsMissing:
break;
case AcErrorType.Data_KunosCareerWeatherIsMissing:
break;
case AcErrorType.CarSkins_SkinsAreMissing:
return new[] {
new MultiSolution(
AppStrings.Solution_CreateEmptySkin,
AppStrings.Solution_CreateEmptySkin_Details,
e => {
var target = Path.Combine(((CarObject)e.Target).SkinsDirectory, "default");
Directory.CreateDirectory(target);
File.WriteAllText(Path.Combine(target, "ui_skin.json"), JsonConvert.SerializeObject(new {
skinname = @"Default",
drivername = "",
country = "",
team = "",
number = 0
}));
})
}.Union(((CarObject)error.Target).SkinsManager.WrappersList.Where(x => !x.Value.Enabled).Select(x => new MultiSolution(
string.Format(AppStrings.Solution_EnableSkin, x.Value.DisplayName),
AppStrings.Solution_EnableSkin_Details,
(IAcError e) => {
((CarSkinObject)x.Loaded()).ToggleCommand.Execute(null);
}
)))
.Concat(Solve.TryToFindRenamedFile(error.Target.Location, ((CarObject)error.Target).SkinsDirectory, true)).NonNull();
case AcErrorType.CarSkins_DirectoryIsUnavailable:
return null;
case AcErrorType.Font_BitmapIsMissing:
return Solve.TryToFindRenamedFile(Path.GetDirectoryName(error.Target.Location), ((FontObject)error.Target).FontBitmap);
case AcErrorType.Font_UsedButDisabled:
return new[] {
new MultiSolution(
AppStrings.Solution_Enable,
AppStrings.Solution_Enable_Details,
e => {
e.Target.ToggleCommand.Execute(null);
})
};
case AcErrorType.CarSetup_TrackIsMissing:
return new[] {
new Solution(
AppStrings.Solution_FindTrack,
AppStrings.Solution_FindTrack_Details,
e => {
Process.Start($@"http://assetto-db.com/track/{((CarSetupObject)e.Target).TrackId}");
}),
new MultiSolution(
AppStrings.Solution_MakeGeneric,
AppStrings.Solution_MakeGeneric_Details,
e => {
((CarSetupObject)e.Target).TrackId = null;
})
};
case AcErrorType.CarSkin_PreviewIsMissing:
return new ISolution[] {
new MultiSolution(
AppStrings.Solution_GeneratePreview,
AppStrings.Solution_GeneratePreview_Details,
e => {
var list = e.ToList();
var carId = ((CarSkinObject)list[0].Target).CarId;
var skinIds = list.Select(x => x.Target.Id).ToArray();
if (!new CarUpdatePreviewsDialog(CarsManager.Instance.GetById(carId), skinIds,
SelectedCarPage.ViewModel.GetAutoUpdatePreviewsDialogMode()).ShowDialog()) {
throw new SolvingException();
}
}) { IsUiSolution = true },
new MultiSolution(
AppStrings.Solution_SetupPreview,
AppStrings.Solution_SetupPreview_Details,
e => {
var list = e.ToList();
var carId = ((CarSkinObject)list[0].Target).CarId;
var skinIds = list.Select(x => x.Target.Id).ToArray();
if (!new CarUpdatePreviewsDialog(CarsManager.Instance.GetById(carId), skinIds,
CarUpdatePreviewsDialog.DialogMode.Options).ShowDialog()) {
throw new SolvingException();
}
}) { IsUiSolution = true }
};
case AcErrorType.CarSkin_LiveryIsMissing:
return new ISolution[] {
new AsyncMultiSolution(
AppStrings.Solution_GenerateLivery,
AppStrings.Solution_GenerateLivery_Details,
e => LiveryIconEditor.GenerateAsync((CarSkinObject)e.Target)),
new AsyncMultiSolution(
AppStrings.Solution_RandomLivery,
AppStrings.Solution_RandomLivery_Details,
e => LiveryIconEditor.GenerateRandomAsync((CarSkinObject)e.Target)),
new MultiSolution(
AppStrings.Solution_SetupLivery,
AppStrings.Solution_SetupLivery_Details,
e => {
if (!new LiveryIconEditor((CarSkinObject)e.Target).ShowDialog()) {
throw new SolvingException();
}
}) { IsUiSolution = true }
};
case AcErrorType.Replay_TrackIsMissing:
return new[] {
new MultiSolution(
AppStrings.Solution_RemoveReplay,
AppStrings.Solution_RemoveReplay_Details,
e => {
e.Target.DeleteCommand.Execute(null);
})
};
case AcErrorType.Replay_InvalidName:
return new[] {
new MultiSolution(
AppStrings.Solution_FixName,
AppStrings.Solution_FixName_Details,
e => {
e.Target.NameEditable = Regex.Replace(e.Target.NameEditable ?? @"-", @"[\[\]]", "");
})
};
default:
return null;
}
return null;
}
}