public HierarchicalGroup CreateGroup(string presetsKey, string displayName = "", string prependWithDefault = null) { Func <IEnumerable <object> > groupPresets = () => { var result = UserPresetsControl.GroupPresets(presetsKey); if (prependWithDefault != null) { var menuItem = new HierarchicalItem { Header = new TextBlock { Text = prependWithDefault, FontStyle = FontStyles.Italic } }; HierarchicalItemsView.SetValue(menuItem, null); result = result.Prepend(menuItem); } return(result); }; var group = new HierarchicalGroup(displayName, groupPresets()); var handler = new EventHandler((sender, e) => { group.ReplaceEverythingBy(groupPresets()); }); PresetsManager.Instance.Watcher(presetsKey).Update += handler; _presetsHandlersToRemove.Add(new PresetsHandlerToRemove { Key = presetsKey, Handler = handler }); return(group); }
public static IEnumerable<object> GroupPresets(string presetsKey, Action<ISavedPresetEntry> action) { var group = new HierarchicalGroup("", UserPresetsControl.GroupPresets(presetsKey)); var result = new HierarchicalItemsView(o => { action((ISavedPresetEntry)o); }, group, false); return result; }
public static IEnumerable <T> OfType <T>([NotNull] this HierarchicalGroup source) { if (source == null) { throw new ArgumentNullException(nameof(source)); } return(source.Flatten().OfType <T>()); }
public static IEnumerable <object> GroupPresets(string presetsKey, [CanBeNull] Action <ISavedPresetEntry> action) { var group = new HierarchicalGroup("", UserPresetsControl.GroupPresets(presetsKey)); var result = new HierarchicalItemsView(o => { action?.Invoke((ISavedPresetEntry)o); }, group, false); return(result); }
public HierarchicalItemsView Create(string presetsKey, Action<ISavedPresetEntry> action, string displayName = "") { var group = new HierarchicalGroup(displayName, UserPresetsControl.GroupPresets(presetsKey)); var result = new HierarchicalItemsView(o => { action((ISavedPresetEntry)o); }, group, false); var handler = new EventHandler((sender, e) => { group.ReplaceEverythingBy(UserPresetsControl.GroupPresets(presetsKey)); }); PresetsManager.Instance.Watcher(presetsKey).Update += handler; _presetsHandlersToRemove.Add(new PresetsHandlerToRemove { Key = presetsKey, Handler = handler }); return result; }
public ViewModel() { Entries = new ChangeableObservableCollection <PresetPerMode>(); Modes = new BetterObservableCollection <Mode>(); AppPresets = new HierarchicalGroup("", UserPresetsControl.GroupPresets(AcSettingsHolder.AppsPresetsKey)); AudioPresets = new HierarchicalGroup("", UserPresetsControl.GroupPresets(AcSettingsHolder.AudioPresetsKey)); VideoPresets = new HierarchicalGroup("", UserPresetsControl.GroupPresets(AcSettingsHolder.VideoPresetsKey)); UpdateModes(); FilesStorage.Instance.Watcher(ContentCategory.PresetsPerModeConditions).Update += OnCategoriesUpdate; Saveable.Initialize(); Entries.CollectionChanged += OnCollectionChanged; Entries.ItemPropertyChanged += OnItemPropertyChanged; }
public static IEnumerable <object> Flatten([NotNull] this HierarchicalGroup source) { foreach (var i in source) { var g = i as HierarchicalGroup; if (g != null) { foreach (var r in g.Flatten()) { yield return(r); } } else { yield return(i); } } }
public RaceGridViewModel(bool ignoreStartingPosition = false, [CanBeNull] string keySaveable = KeySaveable) { IgnoreStartingPosition = ignoreStartingPosition; _saveable = new SaveHelper <SaveableData>(keySaveable, () => { var data = new SaveableData { ModeId = Mode.Id, FilterValue = FilterValue, ShuffleCandidates = ShuffleCandidates, AiLevelFixed = AiLevelFixed, AiLevelArrangeRandom = AiLevelArrangeRandom, AiLevelArrangeReverse = AiLevelArrangeReverse, AiLevel = AiLevel, AiLevelMin = AiLevelMin, OpponentsNumber = OpponentsNumber, StartingPosition = StartingPosition, }; if (Mode == BuiltInGridMode.CandidatesManual) { var priority = false; data.CarIds = NonfilteredList.Select(x => { if (x.CandidatePriority != 1) { priority = true; } return(x.Car.Id); }).ToArray(); if (priority) { data.CandidatePriorities = NonfilteredList.Select(x => x.CandidatePriority).ToArray(); } } else if (Mode == BuiltInGridMode.Custom) { data.CarIds = NonfilteredList.Where(x => !x.SpecialEntry).Select(x => x.Car.Id).ToArray(); } if (data.CarIds != null) { var filtered = NonfilteredList.Where(x => !x.SpecialEntry).ToList(); if (filtered.Any(x => x.AiLevel.HasValue)) { data.AiLevels = filtered.Select(x => x.AiLevel ?? -1).ToArray(); } if (filtered.Any(x => x.Name != null)) { data.Names = filtered.Select(x => x.Name).ToArray(); } if (filtered.Any(x => x.Nationality != null)) { data.Nationalities = filtered.Select(x => x.Nationality).ToArray(); } if (filtered.Any(x => x.CarSkin != null)) { data.SkinIds = filtered.Select(x => x.CarSkin?.Id).ToArray(); } } return(data); }, data => { ShuffleCandidates = data.ShuffleCandidates ?? true; AiLevelFixed = data.AiLevelFixed ?? false; AiLevelArrangeRandom = data.AiLevelArrangeRandomly.HasValue ? (data.AiLevelArrangeRandomly.Value ? 1d : 0d) : data.AiLevelArrangeRandom ?? 0.1d; AiLevelArrangeReverse = data.AiLevelArrangeReverse ?? false; AiLevel = data.AiLevel ?? 95; AiLevelMin = data.AiLevelMin ?? 85; FilterValue = data.FilterValue; ErrorMessage = null; var mode = Modes.GetByIdOrDefault <IRaceGridMode>(data.ModeId); if (mode == null) { NonfatalError.NotifyBackground(ToolsStrings.RaceGrid_GridModeIsMissing, string.Format(ToolsStrings.RaceGrid_GridModeIsMissing_Commentary, data.ModeId)); Mode = BuiltInGridMode.SameCar; } else { Mode = mode; } if (Mode.CandidatesMode) { if (Mode == BuiltInGridMode.CandidatesManual && data.CarIds != null) { // TODO: Async? NonfilteredList.ReplaceEverythingBy(data.CarIds.Select(x => CarsManager.Instance.GetById(x)).Select((x, i) => { if (x == null) { return(null); } var aiLevel = data.AiLevels?.ElementAtOrDefault(i); var carSkinId = data.SkinIds?.ElementAtOrDefault(i); return(new RaceGridEntry(x) { CandidatePriority = data.CandidatePriorities?.ElementAtOr(i, 1) ?? 1, AiLevel = aiLevel >= 0 ? aiLevel : (int?)null, Name = data.Names?.ElementAtOrDefault(i), Nationality = data.Nationalities?.ElementAtOrDefault(i), CarSkin = carSkinId != null ? x.GetSkinById(carSkinId) : null, }); }).NonNull()); } else { NonfilteredList.Clear(); } SetOpponentsNumberInternal(data.OpponentsNumber ?? 7); } else { NonfilteredList.ReplaceEverythingBy(data.CarIds?.Select(x => CarsManager.Instance.GetById(x)).Select((x, i) => { if (x == null) { return(null); } var aiLevel = data.AiLevels?.ElementAtOrDefault(i); var carSkinId = data.SkinIds?.ElementAtOrDefault(i); return(new RaceGridEntry(x) { AiLevel = aiLevel >= 0 ? aiLevel : null, Name = data.Names?.ElementAtOrDefault(i), Nationality = data.Nationalities?.ElementAtOrDefault(i), CarSkin = carSkinId != null ? x.GetSkinById(carSkinId) : null, }); }).NonNull() ?? new RaceGridEntry[0]); } StartingPosition = data.StartingPosition ?? 7; FinishLoading(); }, Reset); _presetsHelper = new PresetsMenuHelper(); _randomGroup = new HierarchicalGroup(ToolsStrings.RaceGrid_Random); UpdateRandomModes(); Modes = new HierarchicalGroup { BuiltInGridMode.SameCar, _randomGroup, BuiltInGridMode.Custom, _presetsHelper.Create(PresetableKeyValue, p => { ImportFromPresetData(p.ReadData()); }, ControlsStrings.Common_Presets) }; NonfilteredList.CollectionChanged += OnCollectionChanged; NonfilteredList.ItemPropertyChanged += OnItemPropertyChanged; FilteredView = new BetterListCollectionView(NonfilteredList) { CustomSort = this }; // _saveable.Initialize(); FilesStorage.Instance.Watcher(ContentCategory.GridTypes).Update += OnGridTypesUpdate; }
public RaceGridViewModel(bool ignoreStartingPosition = false) { IgnoreStartingPosition = ignoreStartingPosition; _saveable = new SaveHelper<SaveableData>(KeySaveable, () => { var data = new SaveableData { ModeId = Mode.Id, FilterValue = FilterValue, ShuffleCandidates = ShuffleCandidates, AiLevelFixed = AiLevelFixed, AiLevelArrangeRandom = AiLevelArrangeRandom, AiLevelArrangeReverse = AiLevelArrangeReverse, AiLevel = AiLevel, AiLevelMin = AiLevelMin, OpponentsNumber = OpponentsNumber, StartingPosition = StartingPosition, }; if (Mode == BuiltInGridMode.CandidatesManual) { var priority = false; data.CarIds = NonfilteredList.Select(x => { if (x.CandidatePriority != 1) priority = true; return x.Car.Id; }).ToArray(); if (priority) { data.CandidatePriorities = NonfilteredList.Select(x => x.CandidatePriority).ToArray(); } } else if (Mode == BuiltInGridMode.Custom) { data.CarIds = NonfilteredList.Where(x => !x.SpecialEntry).Select(x => x.Car.Id).ToArray(); } if (data.CarIds != null) { var filtered = NonfilteredList.Where(x => !x.SpecialEntry).ToList(); if (filtered.Any(x => x.AiLevel.HasValue)) { data.AiLevels = filtered.Select(x => x.AiLevel ?? -1).ToArray(); } if (filtered.Any(x => x.Name != null)) { data.Names = filtered.Select(x => x.Name).ToArray(); } if (filtered.Any(x => x.Nationality != null)) { data.Nationalities = filtered.Select(x => x.Nationality).ToArray(); } if (filtered.Any(x => x.CarSkin != null)) { data.SkinIds = filtered.Select(x => x.CarSkin?.Id).ToArray(); } } return data; }, data => { ShuffleCandidates = data.ShuffleCandidates ?? true; AiLevelFixed = data.AiLevelFixed ?? false; AiLevelArrangeRandom = data.AiLevelArrangeRandomly.HasValue ? (data.AiLevelArrangeRandomly.Value ? 1d : 0d) : data.AiLevelArrangeRandom ?? 0.1d; AiLevelArrangeReverse = data.AiLevelArrangeReverse ?? false; AiLevel = data.AiLevel ?? 95; AiLevelMin = data.AiLevelMin ?? 85; FilterValue = data.FilterValue; ErrorMessage = null; var mode = Modes.GetByIdOrDefault<IRaceGridMode>(data.ModeId); if (mode == null) { NonfatalError.NotifyBackground(ToolsStrings.RaceGrid_GridModeIsMissing, string.Format(ToolsStrings.RaceGrid_GridModeIsMissing_Commentary, data.ModeId)); Mode = BuiltInGridMode.SameCar; } else { Mode = mode; } if (Mode.CandidatesMode) { if (Mode == BuiltInGridMode.CandidatesManual && data.CarIds != null) { // TODO: Async? NonfilteredList.ReplaceEverythingBy(data.CarIds.Select(x => CarsManager.Instance.GetById(x)).Select((x, i) => { if (x == null) return null; var aiLevel = data.AiLevels?.ElementAtOrDefault(i); var carSkinId = data.SkinIds?.ElementAtOrDefault(i); return new RaceGridEntry(x) { CandidatePriority = data.CandidatePriorities?.ElementAtOr(i, 1) ?? 1, AiLevel = aiLevel >= 0 ? aiLevel : (int?)null, Name = data.Names?.ElementAtOrDefault(i), Nationality = data.Nationalities?.ElementAtOrDefault(i), CarSkin = carSkinId != null ? x.GetSkinById(carSkinId) : null, }; }).NonNull()); } else { NonfilteredList.Clear(); } SetOpponentsNumberInternal(data.OpponentsNumber ?? 7); } else { NonfilteredList.ReplaceEverythingBy(data.CarIds?.Select(x => CarsManager.Instance.GetById(x)).Select((x, i) => { if (x == null) return null; var aiLevel = data.AiLevels?.ElementAtOrDefault(i); var carSkinId = data.SkinIds?.ElementAtOrDefault(i); return new RaceGridEntry(x) { AiLevel = aiLevel >= 0 ? aiLevel : null, Name = data.Names?.ElementAtOrDefault(i), Nationality = data.Nationalities?.ElementAtOrDefault(i), CarSkin = carSkinId != null ? x.GetSkinById(carSkinId) : null, }; }).NonNull() ?? new RaceGridEntry[0]); } StartingPosition = data.StartingPosition ?? 7; FinishLoading(); }, Reset); _presetsHelper = new PresetsMenuHelper(); _randomGroup = new HierarchicalGroup(ToolsStrings.RaceGrid_Random); UpdateRandomModes(); Modes = new HierarchicalGroup { BuiltInGridMode.SameCar, _randomGroup, BuiltInGridMode.Custom, _presetsHelper.Create(PresetableKeyValue, p => { ImportFromPresetData(p.ReadData()); }, ControlsStrings.Common_Presets) }; NonfilteredList.CollectionChanged += OnCollectionChanged; FilteredView = new BetterListCollectionView(NonfilteredList) { CustomSort = this }; // _saveable.Initialize(); FilesStorage.Instance.Watcher(ContentCategory.GridTypes).Update += OnGridTypesUpdate; }
public static T FirstOrDefault <T>([NotNull] this HierarchicalGroup source, Func <T, bool> filter) { return(source.HierarchicalWhere(filter).FirstOrDefault()); }
public static IEnumerable <T> HierarchicalWhere <T>([NotNull] this HierarchicalGroup source, Func <T, bool> filter) { return(source.OfType <T>().Where(filter)); }
public static T GetByIdOrDefault <T>([NotNull] this HierarchicalGroup source, string id) where T : IWithId { return(source.OfType <T>().GetByIdOrDefault(id)); }
public static T FirstOrDefault <T>([NotNull] this HierarchicalGroup source) { return(source.OfType <T>().FirstOrDefault()); }