private async Task Edit(IBuildViewModel build) { var nameBefore = build.Build.Name; var buildVm = build as IBuildViewModel <PoEBuild>; var folderVm = build as IBuildViewModel <BuildFolder>; if (buildVm != null) { await _dialogCoordinator.EditBuildAsync(this, buildVm, _buildValidator); } else if (folderVm != null) { var name = await _dialogCoordinator.ShowValidatingInputDialogAsync(this, L10n.Message("Edit Folder"), L10n.Message("Enter the new name for this folder below."), folderVm.Build.Name, s => _buildValidator.ValidateExistingFolderName(s, folderVm)); if (!string.IsNullOrWhiteSpace(name)) { folderVm.Build.Name = name; await SaveBuildToFile(build); } } else { throw new ArgumentException("Argument's IBuild implementation is not supported"); } if (build.Build.Name != nameBefore) { await SaveBuildToFile(build.Parent); } }
private async Task Delete(IBuildViewModel build) { if (TreeFind <BuildViewModel>(b => b == CurrentBuild, build) != null) { await _dialogCoordinator.ShowInfoAsync(this, L10n.Message("The currently opened build can not be deleted.")); return; } if (build is IBuildFolderViewModel) { var result = await _dialogCoordinator.ShowQuestionAsync(this, string.Format(L10n.Message("This will delete the build folder \"{0}\" and all its contents.\n"), build.Build.Name) + L10n.Message("Do you want to continue?")); if (result != MessageBoxResult.Yes) { return; } } build.IsSelected = false; build.Parent.IsSelected = true; build.Parent.Children.Remove(build); await DeleteBuildFile(build); }
private void MoveDown(IBuildViewModel build) { var list = build.Parent.Children; var i = list.IndexOf(build); list.Move(i, i + 1); }
private async Task Paste(IBuildViewModel target) { var targetFolder = target as IBuildFolderViewModel ?? target.Parent; IBuildViewModel pasted; if (_clipboardIsCopy) { var newBuild = _buildClipboard.Build.DeepClone() as PoEBuild; if (newBuild == null) { throw new InvalidOperationException("Can only copy builds, not folders."); } newBuild.Name = Util.FindDistinctName(newBuild.Name, targetFolder.Children.Select(b => b.Build.Name)); pasted = new BuildViewModel(newBuild, Filter); } else { pasted = _buildClipboard; _buildClipboard = null; } targetFolder.Children.Add(pasted); // Folders and non-dirty builds need to be saved to create the new file. var build = pasted.Build as PoEBuild; if (build == null || !build.IsDirty) { await SaveBuildToFile(pasted); } }
private bool Filter(IBuildViewModel b) { if (ClassFilter == null) { return(true); } var build = b as BuildViewModel; if (build == null) { return(true); } if (ClassFilter != NoFilterItem) { if (ClassFilter.CharacterClass != build.CharacterClass) { return(false); } if (ClassFilter.AscendancyClass != null && ClassFilter.AscendancyClass != build.AscendancyClass) { return(false); } } return(string.IsNullOrEmpty(TextFilter) || build.Build.Name.Contains(TextFilter, StringComparison.InvariantCultureIgnoreCase)); }
private string BasePathFor(IBuildViewModel build) { var fileName = SerializationUtils.EncodeFileName(build.Build.Name); return(build.Parent == null ? _options.BuildsSavePath // Root folder is not directly part of the path : Path.Combine(BasePathFor(build.Parent), fileName)); }
private bool CanPaste(IBuildViewModel target) { if (target == null || _buildClipboard == null) { return(false); } var targetFolder = target as IBuildFolderViewModel ?? target.Parent; return(_buildValidator.CanMoveTo(_buildClipboard, targetFolder)); }
private async Task Cut(IBuildViewModel build) { build.IsSelected = false; build.Parent.IsSelected = true; build.Parent.Children.Remove(build); await DeleteBuildFile(build); _buildClipboard = build; _clipboardIsCopy = false; }
public EditBuildViewModel(IBuildViewModel <PoEBuild> buildVm, BuildValidator buildValidator) { _buildVm = buildVm; _buildValidator = buildValidator; var build = buildVm.Build; Name = build.Name; Note = build.Note; CharacterName = build.CharacterName; AccountName = build.AccountName; LastUpdated = build.LastUpdated; }
private static string ValidateName(string name, string fullPath, IBuildViewModel build, IBuildFolderViewModel parent) { if (!IsNameUnique(name, build, parent)) { return(L10n.Message("A build or folder with this name already exists.")); } string message; IsNameValid(name, fullPath, out message); return(message); }
private static void TreeTraverse <T>(Action <T> action, IBuildViewModel current) where T : class, IBuildViewModel { var t = current as T; if (t != null) { action(t); } var folder = current as BuildFolderViewModel; folder?.Children.ForEach(b => TreeTraverse(action, b)); }
private static T TreeFind <T>(Predicate <T> predicate, IBuildViewModel current) where T : class, IBuildViewModel { var t = current as T; if (t != null && predicate(t)) { return(t); } var folder = current as BuildFolderViewModel; return(folder?.Children.Select(build => TreeFind(predicate, build)).FirstOrDefault(r => r != null)); }
public async Task<bool> EditBuildAsync(object context, IBuildViewModel<PoEBuild> buildVm, BuildValidator buildValidator) { var vm = new EditBuildViewModel(buildVm, buildValidator); if (!await ShowDialogAsync(context, vm, new EditBuildWindow())) { return false; } var build = buildVm.Build; build.Name = vm.Name; build.Note = vm.Note; build.AccountName = vm.AccountName; build.CharacterName = vm.CharacterName; return true; }
private async Task DeleteBuildFile(IBuildViewModel build) { try { using (_changingFileSystemMonitor.Enter()) { PersistentData.DeleteBuild(build.Build); } } catch (Exception e) { Log.Error($"Build deletion failed for '{build.Build.Name}'", e); await _dialogCoordinator.ShowErrorAsync(this, L10n.Message("An error occurred during a delete operation."), e.Message); } }
private async Task Cut(IBuildViewModel build) { build.IsSelected = false; build.Parent.IsSelected = true; build.Parent.Children.Remove(build); await DeleteBuildFile(build); _buildClipboard = build; _clipboardIsCopy = false; var poeBuild = build.Build as PoEBuild; if (poeBuild != null) { CopyToClipboard(poeBuild); } }
public async Task <bool> EditBuildAsync(object context, IBuildViewModel <PoEBuild> buildVm, BuildValidator buildValidator) { var vm = new EditBuildViewModel(buildVm, buildValidator); if (!await ShowDialogAsync(context, vm, new EditBuildWindow())) { return(false); } var build = buildVm.Build; build.Name = vm.Name; build.Note = vm.Note; build.AccountName = vm.AccountName; build.CharacterName = vm.CharacterName; return(true); }
/// <summary> /// Returns true iff <paramref name="build"/> can be moved to <paramref name="parent"/>. /// </summary> public bool CanMoveTo(IBuildViewModel build, IBuildFolderViewModel parent) { if (!IsNameUnique(build.Build.Name, build, parent)) return false; var parentPath = BasePathFor(parent); var folder = build as IBuildFolderViewModel; if (folder == null) { return CanBeChildOf(build, parentPath); } else { var parentDepth = GetDepthOfFolder(parent); return CanBeChildOf(folder, parentPath, parentDepth); } }
private static async Task TreeTraverseAsync <T>(Func <T, Task> action, IBuildViewModel current) where T : class, IBuildViewModel { var t = current as T; if (t != null) { await action(t); } var folder = current as BuildFolderViewModel; if (folder == null) { return; } foreach (var build in folder.Children) { await TreeTraverseAsync(action, build); } }
/// <summary> /// Returns true iff <paramref name="build"/> can be moved to <paramref name="parent"/>. /// </summary> public bool CanMoveTo(IBuildViewModel build, IBuildFolderViewModel parent) { if (!IsNameUnique(build.Build.Name, build, parent)) { return(false); } var parentPath = BasePathFor(parent); var folder = build as IBuildFolderViewModel; if (folder == null) { return(CanBeChildOf(build, parentPath)); } else { var parentDepth = GetDepthOfFolder(parent); return(CanBeChildOf(folder, parentPath, parentDepth)); } }
private async Task Paste(IBuildViewModel target) { var targetFolder = target as IBuildFolderViewModel ?? target.Parent; IBuildViewModel pasted; if (CanPasteFromClipboard() && !CanPasteNonClipboard(target)) { var b = await PasteFromClipboard(BuildRoot); if (b == null) { return; } pasted = new BuildViewModel(b, Filter); } else if (_clipboardIsCopy) { if (!(_buildClipboard.Build is PoEBuild oldBuild)) { throw new InvalidOperationException("Can only copy builds, not folders."); } var newName = Util.FindDistinctName(oldBuild.Name, targetFolder.Children.Select(b => b.Build.Name)); var newBuild = PoEBuild.CreateNotRevertableCopy(oldBuild, newName); pasted = new BuildViewModel(newBuild, Filter); } else { pasted = _buildClipboard; _buildClipboard = null; } targetFolder.Children.Add(pasted); // Folders and non-dirty builds need to be saved to create the new file. var build = pasted.Build as PoEBuild; if (build == null || !build.IsDirty) { await SaveBuildToFile(pasted); } }
/// <summary> /// Returns an string that contains an error message if it is not null or empty that describes /// why <paramref name="name"/> is not allowed as a name for <paramref name="build"/>. /// </summary> public string ValidateExistingFileName(string name, IBuildViewModel build) { return ValidateName(name, PathForBuild(name, build.Parent), build, build.Parent); }
private static string ValidateName(string name, string fullPath, IBuildViewModel build, IBuildFolderViewModel parent) { if (!IsNameUnique(name, build, parent)) { return L10n.Message("A build or folder with this name already exists."); } string message; IsNameValid(name, fullPath, out message); return message; }
private static bool IsNameUnique(string name, IBuildViewModel build, IBuildFolderViewModel parent) { return parent.Children.All(b => b == build || b.Build.Name != name); }
private string PathForFolder(string name, IBuildViewModel parent) { return Path.Combine(BasePathFor(parent), FileNameForFolder(name)); }
private void Copy(IBuildViewModel <PoEBuild> build) { _buildClipboard = build; _clipboardIsCopy = true; }
private string BasePathFor(IBuildViewModel build) { var fileName = SerializationUtils.EncodeFileName(build.Build.Name); return build.Parent == null ? _options.BuildsSavePath // Root folder is not directly part of the path : Path.Combine(BasePathFor(build.Parent), fileName); }
private void SetParent(IBuildViewModel build) { build.Parent = this; build.SkillTree = SkillTree; }
private static bool CanBeChildOf(IBuildViewModel build, string parentPath) { var name = build.Build.Name; return(IsNameValid(name, Path.Combine(parentPath, FileNameForBuild(name)))); }
private void UnsetParent(IBuildViewModel build) { build.Parent = null; }
private string PathForFolder(string name, IBuildViewModel parent) { return(Path.Combine(BasePathFor(parent), FileNameForFolder(name))); }
private static bool IsNameUnique(string name, IBuildViewModel build, IBuildFolderViewModel parent) { return(parent.Children.All(b => b == build || b.Build.Name != name)); }
/// <summary> /// Returns an string that contains an error message if it is not null or empty that describes /// why <paramref name="name"/> is not allowed as a name for <paramref name="folder"/>. /// </summary> public string ValidateExistingFolderName(string name, IBuildViewModel folder) { return ValidateName(name, PathForFolder(name, folder.Parent), folder, folder.Parent); }
private static bool CanBeChildOf(IBuildViewModel build, string parentPath) { var name = build.Build.Name; return IsNameValid(name, Path.Combine(parentPath, FileNameForBuild(name))); }
/// <summary> /// Returns an string that contains an error message if it is not null or empty that describes /// why <paramref name="name"/> is not allowed as a name for <paramref name="folder"/>. /// </summary> public string ValidateExistingFolderName(string name, IBuildViewModel folder) { return(ValidateName(name, PathForFolder(name, folder.Parent), folder, folder.Parent)); }
private bool CanPaste(IBuildViewModel target) { return(CanPasteFromClipboard() || CanPasteNonClipboard(target)); }
/// <summary> /// Returns an string that contains an error message if it is not null or empty that describes /// why <paramref name="name"/> is not allowed as a name for <paramref name="build"/>. /// </summary> public string ValidateExistingFileName(string name, IBuildViewModel build) { return(ValidateName(name, PathForBuild(name, build.Parent), build, build.Parent)); }
public BuildMonitor(IBuildStatus status, ITeamCityApi api, IBuildViewModel setup) { Status = status ?? throw new ArgumentNullException(nameof(status)); Api = api ?? throw new ArgumentNullException(nameof(api)); Setup = setup ?? throw new ArgumentNullException(nameof(setup)); }