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 };
        }
Example #3
0
 public LiveryIconEditorDialog(CarSkinObject skin)
 {
     InitializeComponent();
     DataContext = new LiveryIconEditor(skin, false, false, null, Result);
     Buttons     = new[] { OkButton, CancelButton };
     GuessColors();
 }
Example #4
0
            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);
            }
        }
Example #6
0
        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);
        }
Example #7
0
 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;
         });
     }
 }
Example #8
0
 private void CarNode_PropertyChanged(object sender, PropertyChangedEventArgs e)
 {
     switch (e.PropertyName)
     {
     case nameof(Renderer.CarNode.CurrentSkin):
         Skin = Car.GetSkinById(Renderer?.CarNode?.CurrentSkin ?? "");
         break;
     }
 }
Example #9
0
        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());
        }
Example #10
0
 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;
            }
Example #12
0
        void ILoadableContent.Load()
        {
            do
            {
                _carObject = CarsManager.Instance.GetById(_carId);
                if (_carObject == null)
                {
                    _object = null;
                    return;
                }

                _object = _carObject?.SkinsManager.GetById(_id);
            } while (_carObject.Outdated);
        }
Example #13
0
        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);
        }
Example #14
0
            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());
            }
Example #15
0
        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);
        }
Example #16
0
        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);
        }
Example #17
0
        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);
        }
Example #18
0
        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));
        }
Example #19
0
        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);
        }
Example #20
0
            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;
                }
            }
Example #21
0
        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;
            }
        }
Example #22
0
            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);
                });
            }
Example #23
0
            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();
            }
Example #24
0
        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);
                }
            }
        }
Example #25
0
 public Task CreateLiveryAsync(CarSkinObject skin, Color[] colors, string preferredStyle)
 {
     return(LiveryIconEditor.GenerateAsync(skin, colors, preferredStyle));
 }
Example #26
0
        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);
                }
            }
        }
Example #27
0
 public static void SetCarSkin(DependencyObject obj, CarSkinObject value)
 {
     obj.SetValue(CarSkinProperty, value);
 }
Example #28
0
 Task ICustomShowroomWrapper.StartAsync(CarObject car, CarSkinObject skin, string presetFilename)
 {
     return(StartAsync(car, skin, presetFilename));
 }
Example #29
0
 public static Task StartAsync(CarObject car, CarSkinObject skin = null, string presetFilename = null)
 {
     return(StartAsync(AcPaths.GetMainCarFilename(car.Location, car.AcdData, true), skin?.Id, presetFilename));
 }
Example #30
0
        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 };
        }