internal void PopulateEditorList(AchievementScriptInterpreter interpreter) { var editors = new List <ViewerViewModelBase>(); if (Script != null) { editors.Add(Script); } var selectedEditor = (SelectedEditor != null) ? SelectedEditor.Title : null; if (interpreter != null) { GeneratedAchievementCount = interpreter.Achievements.Count(); editors.Capacity += GeneratedAchievementCount; if (!String.IsNullOrEmpty(interpreter.RichPresence)) { var richPresenceViewModel = new RichPresenceViewModel(this, interpreter.RichPresence); if (richPresenceViewModel.Lines.Any()) { richPresenceViewModel.SourceLine = interpreter.RichPresenceLine; editors.Add(richPresenceViewModel); } } foreach (var achievement in interpreter.Achievements) { var achievementViewModel = new AchievementViewModel(this); achievementViewModel.Generated.Asset = achievement; editors.Add(achievementViewModel); } foreach (var leaderboard in interpreter.Leaderboards) { var leaderboardViewModel = new LeaderboardViewModel(this); leaderboardViewModel.Generated.Asset = leaderboard; editors.Add(leaderboardViewModel); } } else { GeneratedAchievementCount = 0; } if (_publishedAchievements.Count > 0 || _publishedLeaderboards.Count > 0) { MergePublished(editors); } if (_localAssets != null) { MergeLocal(editors); } UpdateTemporaryIds(editors); SelectedEditor = editors.FirstOrDefault(e => e.Title == selectedEditor); Editors = editors; }
private void MergeAchievements(List <ViewerViewModelBase> editors, IEnumerable <AssetBase> assets, Action <AssetViewModelBase, AssetBase> assign) { var mergeAssets = new List <AssetBase>(assets); if (mergeAssets.Count == 0) { return; } var assetEditors = new List <AssetViewModelBase>(); if (assets.First() is Achievement) { assetEditors.AddRange(editors.OfType <AchievementViewModel>()); } else { assetEditors.AddRange(editors.OfType <LeaderboardViewModel>()); } // first pass - look for ID matches for (int i = assetEditors.Count - 1; i >= 0; i--) { AssetBase mergeAsset = null; var assetEditor = assetEditors[i]; if (assetEditor.Generated.Id > 0) { mergeAsset = mergeAssets.FirstOrDefault(a => a.Id == assetEditor.Generated.Id); } if (mergeAsset == null && assetEditor.Published.Id > 0) { mergeAsset = mergeAssets.FirstOrDefault(a => a.Id == assetEditor.Published.Id); } if (mergeAsset != null) { assign(assetEditor, mergeAsset); mergeAssets.Remove(mergeAsset); assetEditors.RemoveAt(i); } } // second pass - look for title matches for (int i = mergeAssets.Count - 1; i >= 0; i--) { var mergeAsset = mergeAssets[i]; var assetEditor = assetEditors.FirstOrDefault(a => (String.Compare(a.Generated.Title.Text, mergeAsset.Title, StringComparison.InvariantCultureIgnoreCase) == 0 || String.Compare(a.Published.Title.Text, mergeAsset.Title, StringComparison.InvariantCultureIgnoreCase) == 0) ); if (assetEditor != null) { assign(assetEditor, mergeAsset); mergeAssets.RemoveAt(i); assetEditors.Remove(assetEditor); } } // third pass - look for description matches for (int i = mergeAssets.Count - 1; i >= 0; i--) { var mergeAsset = mergeAssets[i]; var assetEditor = assetEditors.FirstOrDefault(a => String.Compare(a.Generated.Description.Text, mergeAsset.Description, StringComparison.InvariantCultureIgnoreCase) == 0); if (assetEditor != null) { assign(assetEditor, mergeAsset); mergeAssets.RemoveAt(i); assetEditors.Remove(assetEditor); } } // TODO: attempt to match requirements // create new entries for each remaining unmerged achievement foreach (var mergeAsset in mergeAssets) { AssetViewModelBase assetEditor; if (mergeAsset is Achievement) { assetEditor = new AchievementViewModel(this); } else { assetEditor = new LeaderboardViewModel(this); } assign(assetEditor, mergeAsset); editors.Add(assetEditor); } }