async Task ILoadableContent.LoadAsync(CancellationToken cancellationToken) { _object = await ReplaysManager.Instance.GetByIdAsync(_id); if (_object?.TrackId != null) { var trackObject = await TracksManager.Instance.GetByIdAsync(_object.TrackId); if (_object.TrackConfiguration != null) { _trackObject = trackObject?.GetLayoutByLayoutId(_object.TrackConfiguration) ?? trackObject; } else { _trackObject = trackObject; } } if (_object?.CarId != null) { _carObject = await CarsManager.Instance.GetByIdAsync(_object.CarId); _carSkinObject = _carObject == null ? null : (_object.CarSkinId != null ? await _carObject.SkinsManager.GetByIdAsync(_object.CarSkinId) : null) ?? _carObject.SelectedSkin; } if (_object?.WeatherId != null) { _weather = await WeatherManager.Instance.GetByIdAsync(_object.WeatherId); } }
public CarTextureDialog([CanBeNull] BaseRenderer renderer, [CanBeNull] CarSkinObject activeSkin, [NotNull] Kn5 kn5, [NotNull] string textureName) { DataContext = new CarTextureDialogViewModel(renderer, activeSkin, kn5, textureName); InitializeComponent(); Buttons = new[] { CloseButton }; }
public LiveryIconEditorDialog(CarSkinObject skin) { InitializeComponent(); DataContext = new LiveryIconEditor(skin, false, false, null, Result); Buttons = new[] { OkButton, CancelButton }; GuessColors(); }
public bool setCurrentCar(string carId, string skinId = null) { _car = CarsManager.Instance.GetById(carId); _carSkin = skinId != null?_car?.GetSkinById(skinId) : null; return(_car != null); }
void ILoadableContent.Load() { _object = ReplaysManager.Instance.GetById(_id); if (_object?.TrackId != null) { var trackObject = TracksManager.Instance.GetById(_object.TrackId); if (_object.TrackConfiguration != null) { _trackObject = trackObject?.GetLayoutByLayoutId(_object.TrackConfiguration) ?? trackObject; } else { _trackObject = trackObject; } } if (_object?.CarId != null) { _carObject = CarsManager.Instance.GetById(_object.CarId); _carSkinObject = _carObject == null ? null : (_object.CarSkinId != null ? _carObject.SkinsManager.GetById(_object.CarSkinId) : null) ?? _carObject.SelectedSkin; } if (_object?.WeatherId != null) { _weather = WeatherManager.Instance.GetById(_object.WeatherId); } }
public void SetCarObjectMenu(ContextMenu menu, CarObject car, CarSkinObject skin) { menu.AddItem("Manage setups", () => CarSetupsListPage.Open(car)) .AddItem("Manage skins", () => CarSkinsListPage.Open(car)) .AddSeparator(); CarBlock.OnShowroomContextMenu(menu, car, skin); menu.AddSeparator(); var ratingBar = new RatingBar { Rating = car.Rating ?? 0 }; ratingBar.SetBinding(RatingBar.RatingProperty, new Binding("Rating") { Source = car }); menu.AddItem(new MenuItem { StaysOpenOnClick = true, Header = new DockPanel { Margin = new Thickness(0d, 0d, -40d, 0d), Children = { new TextBlock { Text = "Rating:", Width = 80 }, ratingBar, new FavouriteButton { IsChecked = car.IsFavourite } } } }); menu.AddItem(new MenuItem { StaysOpenOnClick = true, Header = new DockPanel { Margin = new Thickness(0d, 0d, -40d, 0d), Children = { new TextBlock { Text = "Notes:", Width = 80 }, new NotesBlock { AcObject = car } } } }); menu.AddSeparator(); if (!QuickDrive.IsActive()) { menu.AddItem("Open car in Quick Drive", () => QuickDrive.Show(car, skin?.Id)); } menu.AddItem("Open car in Content tab", () => CarsListPage.Show(car, skin?.Id)) .AddItem(AppStrings.Toolbar_Folder, car.ViewInExplorer); }
private void OnCarNodePropertyChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs) { if (propertyChangedEventArgs.PropertyName == nameof(CarNode.CurrentSkin)) { _busy.Do(() => { Skin = Car != null ? (Car.GetSkinById(CarNode?.CurrentSkin ?? "") ?? Car.SelectedSkin) : null; }); } }
private void CarNode_PropertyChanged(object sender, PropertyChangedEventArgs e) { switch (e.PropertyName) { case nameof(Renderer.CarNode.CurrentSkin): Skin = Car.GetSkinById(Renderer?.CarNode?.CurrentSkin ?? ""); break; } }
private static async Task <string> TryGetCarSkinChecksumAsync(CarSkinObject skin) { var md5 = MD5.Create(); var hashes = new List <string>(); await Task.Run(() => hashes.AddRange(GetSkinFiles(skin).Select(file => File.ReadAllBytes(file.FullName)).Select( data => md5.ComputeHash(data).ToLowerCaseHexString()))); return(md5.ComputeHash(Encoding.UTF8.GetBytes(hashes.JoinToString())).ToLowerCaseHexString()); }
private static IEnumerable <FileInfo> GetSkinFiles(CarSkinObject skin) { return(from file in new DirectoryInfo(skin.Location).GetFiles("*.*").OrderBy(x => x.Name) where !string.Equals(file.Name, @"preview.jpg", StringComparison.OrdinalIgnoreCase) && !string.Equals(file.Name, @"livery.png", StringComparison.OrdinalIgnoreCase) && file.Name.EndsWith(@".dds", StringComparison.OrdinalIgnoreCase) || file.Name.EndsWith(@".png", StringComparison.OrdinalIgnoreCase) || file.Name.EndsWith(@".jpg", StringComparison.OrdinalIgnoreCase) || file.Name.EndsWith(@".jpeg", StringComparison.OrdinalIgnoreCase) select file); }
public CarTextureDialogViewModel([CanBeNull] BaseRenderer renderer, [CanBeNull] CarSkinObject activeSkin, [NotNull] Kn5 kn5, [NotNull] string textureName) { _renderer = renderer; _activeSkin = activeSkin; _kn5 = kn5; TextureName = textureName; var format = Regex.Match(textureName, @"(?<=\.)([a-zA-Z]{3,4})$").Value; TextureFormat = string.IsNullOrWhiteSpace(format) ? null : format.ToUpperInvariant(); byte[] data; Data = kn5.TexturesData.TryGetValue(textureName, out data) ? data : null; }
void ILoadableContent.Load() { do { _carObject = CarsManager.Instance.GetById(_carId); if (_carObject == null) { _object = null; return; } _object = _carObject?.SkinsManager.GetById(_id); } while (_carObject.Outdated); }
async Task ILoadableContent.LoadAsync(CancellationToken cancellationToken) { do { _carObject = await CarsManager.Instance.GetByIdAsync(_carId); if (_carObject == null) { _object = null; return; } _object = await _carObject.SkinsManager.GetByIdAsync(_id); } while (_carObject.Outdated); }
private IEnumerable <string> GetDetails(int currentIndex, CarObject car, CarSkinObject skin, int?currentEntrySkinsLeft) { var left = LeftSkins(currentIndex) + (currentEntrySkinsLeft ?? _approximateSkinsPerCarSkins / _approximateSkinsPerCarCars); var speed = _shotSkins / _started.Elapsed.TotalMinutes; var remainingTime = speed < 0.0001 ? "Unknown" : $"About {TimeSpan.FromMinutes(left / speed).ToReadableTime()}"; var remainingItems = $"About {left} {PluralizingConverter.Pluralize(left, ControlsStrings.CustomShowroom_SkinHeader).ToSentenceMember()}"; return(new[] { $"Car: {car?.DisplayName}", $"Skin: {skin?.DisplayName ?? "?"}", $"Speed: {speed:F2} {PluralizingConverter.Pluralize(10, ControlsStrings.CustomShowroom_SkinHeader).ToSentenceMember()}/{"min"}", $"Time remaining: {remainingTime}", $"Items remaining: {remainingItems}", _recyclingWarning ? "[i]Recycling seems to take too long? If so, it can always be disabled in Settings.[/i]" : null }.NonNull()); }
private static ImageUtils.ImageInformation GetInformation(CarObject car, CarSkinObject skin, string presetName, string checksum) { var result = new ImageUtils.ImageInformation { Software = $"ContentManager {BuildInformation.AppVersion}", Comment = presetName == null ? $"Settings checksum: {checksum}" : $"Used preset: {presetName} (checksum: {checksum})" }; if (SettingsHolder.CustomShowroom.DetailedExifForPreviews) { result.Subject = $"{car.DisplayName}"; result.Title = $"{car.DisplayName} ({skin.DisplayName})"; result.Tags = car.Tags.ToArray(); result.Author = skin.Author ?? car.Author; } return(result); }
public void SetCarObjectMenu(ContextMenu menu, CarObject car, CarSkinObject skin) { menu.AddItem("Manage setups", () => CarSetupsListPage.Open(car)) .AddItem("Manage skins", () => CarSkinsListPage.Open(car)) .AddSeparator(); CarBlock.OnShowroomContextMenu(menu, car, skin); menu.AddSeparator(); if (!QuickDrive.IsActive()) { menu.AddItem("Open car in Quick Drive", () => QuickDrive.Show(car, skin?.Id)); } menu.AddItem("Open car in Content tab", () => CarsListPage.Show(car, skin?.Id)) .AddItem(AppStrings.Toolbar_Folder, car.ViewInExplorer); }
public static CarObject Show([CanBeNull] CarObject car, [CanBeNull] ref CarSkinObject carSkin) { var dialog = new SelectCarDialog(car ?? CarsManager.Instance.GetDefault()) { SelectedSkin = car?.SkinsActualList.Contains(carSkin) == true ? carSkin : car?.SelectedSkin }; dialog.ShowDialog(); if (dialog.IsResultOk) { carSkin = dialog.SelectedSkin; return(dialog.SelectedCar); } return(null); }
private static async Task <Tuple <string, int> > GetCarSkinChecksumSizeAsync(CarSkinObject skin) { var md5 = MD5.Create(); var hashes = new List <string>(); var totalSize = 0; await Task.Run(() => { foreach (var file in GetSkinFiles(skin)) { var data = File.ReadAllBytes(file.FullName); hashes.Add(md5.ComputeHash(data).ToLowerCaseHexString()); totalSize += data.Length; } }); var finalHash = md5.ComputeHash(Encoding.UTF8.GetBytes(hashes.JoinToString())).ToLowerCaseHexString(); return(Tuple.Create(finalHash, totalSize)); }
public static MultiSolution TryToCreateNewFile(AcJsonObjectNew target) { if (target is ShowroomObject) { return(new MultiSolution( ToolsStrings.Solving_CreateNewFile, ToolsStrings.Solving_CreateNewFile_Commentary, e => { var jObject = new JObject { [@"name"] = AcStringValues.NameFromId(e.Target.Id) }; FileUtils.EnsureFileDirectoryExists(((AcJsonObjectNew)e.Target).JsonFilename); File.WriteAllText(((AcJsonObjectNew)e.Target).JsonFilename, jObject.ToString()); })); } if (target is CarSkinObject) { return(new MultiSolution( ToolsStrings.Solving_CreateNewFile, ToolsStrings.Solving_CreateNewFile_Commentary, e => { var jObject = new JObject { [@"skinname"] = CarSkinObject.NameFromId(e.Target.Id), [@"drivername"] = "", [@"country"] = "", [@"team"] = "", [@"number"] = @"0" }; if (!SettingsHolder.Content.SkinsSkipPriority) { jObject[@"priority"] = 1; } FileUtils.EnsureFileDirectoryExists(((AcJsonObjectNew)e.Target).JsonFilename); File.WriteAllText(((AcJsonObjectNew)e.Target).JsonFilename, jObject.ToString()); })); } return(null); }
private void Renderer_CarNodeUpdated() { if (_carNode != null) { _carNode.PropertyChanged -= CarNode_PropertyChanged; } _carNode = Renderer.CarNode; var carId = Renderer.CarNode?.CarId; Car = carId == null ? null : CarsManager.Instance.GetById(carId); Skin = Car?.GetSkinById(Renderer.CarNode?.CurrentSkin ?? ""); if (_carNode != null) { _carNode.PropertyChanged += CarNode_PropertyChanged; } }
private LiveryIconEditor(CarSkinObject skin, bool quickMode, bool randomMode) { _quickMode = quickMode; Skin = skin; DataContext = this; InitializeComponent(); if (randomMode) { SelectedShape = Shapes.RandomElement(); } else { SelectedShape = Shapes.GetByIdOrDefault(ValuesStorage.GetString(KeyShape)) ?? Shapes.FirstOrDefault(); } SelectedStyle = Styles.GetByIdOrDefault(ValuesStorage.GetString(KeyStyle)) ?? Styles.FirstOrDefault(); SelectedNumbers = string.IsNullOrWhiteSpace(skin.SkinNumber) || skin.SkinNumber == @"0" ? Numbers.FirstOrDefault() : Numbers.GetByIdOrDefault(ValuesStorage.GetString(KeyNumbers)) ?? Numbers.FirstOrDefault(); Buttons = new[] { OkButton, CancelButton }; Model.Value = string.IsNullOrWhiteSpace(skin.SkinNumber) ? @"0" : skin.SkinNumber; Model.TextColorValue = Colors.White; try { using (var bitmap = Image.FromFile(skin.PreviewImage)) { var colors = ImageUtils.GetBaseColors((Bitmap)bitmap); Model.ColorValue = colors.Select(x => (System.Drawing.Color?)x).FirstOrDefault()?.ToColor() ?? Colors.White; Model.SecondaryColorValue = colors.Select(x => (System.Drawing.Color?)x).ElementAtOrDefault(1)?.ToColor() ?? Colors.Black; Model.TertiaryColorValue = colors.Select(x => (System.Drawing.Color?)x).ElementAtOrDefault(2)?.ToColor() ?? Colors.Black; } } catch (Exception e) { Logging.Warning("Can’t find base colors: " + e); Model.ColorValue = Colors.White; Model.SecondaryColorValue = Colors.Black; Model.TertiaryColorValue = Colors.Black; } }
public ViewModel([NotNull] DarkKn5ObjectRenderer renderer, [NotNull] CarObject carObject, string skinId) { if (renderer == null) { throw new ArgumentNullException(nameof(renderer)); } Renderer = renderer; Settings = new CmPreviewsSettings(renderer); renderer.PropertyChanged += Renderer_PropertyChanged; Renderer_CarNodeUpdated(); renderer.Tick += Renderer_Tick; Car = carObject; Skin = skinId == null ? Car.SelectedSkin : Car.GetSkinById(skinId); Car.SkinsManager.EnsureLoadedAsync().Forget(); Saveable = new SaveHelper <SaveableData>("__CmPreviewsTools", () => new SaveableData(), o => { }, () => { Reset(false); }); }
public ViewModel([NotNull] ToolsKn5ObjectRenderer renderer, CarObject carObject, string skinId) { if (renderer == null) { throw new ArgumentNullException(nameof(renderer)); } Renderer = renderer; renderer.PropertyChanged += Renderer_PropertyChanged; Renderer_CarNodeUpdated(); renderer.Tick += Renderer_Tick; Car = carObject; Skin = skinId == null ? Car.SelectedSkin : Car.GetSkinById(skinId); Car.SkinsManager.EnsureLoadedAsync().Forget(); Saveable = new SaveHelper <SaveableData>("__LiteShowroomTools", () => new SaveableData { AmbientShadowDiffusion = AmbientShadowDiffusion, AmbientShadowBrightness = AmbientShadowBrightness, AmbientShadowIterations = AmbientShadowIterations, AmbientShadowHideWheels = AmbientShadowHideWheels, AmbientShadowFade = AmbientShadowFade, LiveReload = renderer.MagickOverride, }, o => { AmbientShadowDiffusion = o.AmbientShadowDiffusion; AmbientShadowBrightness = o.AmbientShadowBrightness; AmbientShadowIterations = o.AmbientShadowIterations; AmbientShadowHideWheels = o.AmbientShadowHideWheels; AmbientShadowFade = o.AmbientShadowFade ?? true; renderer.MagickOverride = o.LiveReload; }, () => { Reset(false); }); Saveable.Initialize(); }
public static async Task UpdateKn5(this IKn5 kn5, BaseRenderer renderer = null, CarSkinObject skin = null) { if (!kn5.IsEditable) { throw new Exception("Can’t save KN5 loaded unusually"); } var backup = kn5.OriginalFilename + ".backup"; try { if (!File.Exists(backup)) { FileUtils.HardLinkOrCopy(kn5.OriginalFilename, backup); } } catch (Exception e) { Logging.Warning(e); } await Task.Run(() => { using (var f = FileUtils.RecycleOriginal(kn5.OriginalFilename)) { try { kn5.Save(f.Filename); } catch { FileUtils.TryToDelete(f.Filename); throw; } } }); if (renderer != null) { var car = skin == null ? null : CarsManager.Instance.GetById(skin.CarId); var slot = (renderer as ToolsKn5ObjectRenderer)?.MainSlot; if (car != null && slot != null) { slot.SetCar(CarDescription.FromKn5(kn5, car.Location, car.AcdData)); slot.SelectSkin(skin.Id); } } }
public Task CreateLiveryAsync(CarSkinObject skin, Color[] colors, string preferredStyle) { return(LiveryIconEditor.GenerateAsync(skin, colors, preferredStyle)); }
public static async Task UpdateKn5(this Kn5 kn5, BaseRenderer renderer = null, CarSkinObject skin = null) { if (kn5.MaterialLoader != DefaultKn5MaterialLoader.Instance || kn5.NodeLoader != DefaultKn5NodeLoader.Instance) { throw new Exception("Can’t save KN5 loaded unusually"); } var backup = kn5.OriginalFilename + ".backup"; try { if (!File.Exists(backup)) { FileUtils.HardLinkOrCopy(kn5.OriginalFilename, backup); } } catch (Exception e) { Logging.Warning(e); } await Task.Run(() => { using (var f = FileUtils.RecycleOriginal(kn5.OriginalFilename)) { try { if (kn5.TextureLoader == DefaultKn5TextureLoader.Instance) { kn5.Save(f.Filename); } else { Logging.Debug("Extra special mode for saving KN5s without textures loaded"); kn5.Save(f.Filename, new ExistingKn5Textures(kn5.OriginalFilename)); } } catch { FileUtils.TryToDelete(f.Filename); throw; } } }); if (renderer != null) { var car = skin == null ? null : CarsManager.Instance.GetById(skin.CarId); var slot = (renderer as ToolsKn5ObjectRenderer)?.MainSlot; if (car != null && slot != null) { slot.SetCar(CarDescription.FromKn5(kn5, car.Location, car.AcdData)); slot.SelectSkin(skin.Id); } } }
public static void SetCarSkin(DependencyObject obj, CarSkinObject value) { obj.SetValue(CarSkinProperty, value); }
Task ICustomShowroomWrapper.StartAsync(CarObject car, CarSkinObject skin, string presetFilename) { return(StartAsync(car, skin, presetFilename)); }
public static Task StartAsync(CarObject car, CarSkinObject skin = null, string presetFilename = null) { return(StartAsync(AcPaths.GetMainCarFilename(car.Location, car.AcdData, true), skin?.Id, presetFilename)); }
public Kn5TextureDialog([CanBeNull] BaseRenderer renderer, [CanBeNull] CarObject car, [CanBeNull] CarSkinObject activeSkin, [NotNull] Kn5 kn5, [NotNull] string textureName, uint materialId, string slotName) { DataContext = new ViewModel(renderer, car, activeSkin, kn5, textureName, materialId, slotName) { Close = () => Close() }; InitializeComponent(); Buttons = new[] { CloseButton }; }