コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        private void MoveDown(IBuildViewModel build)
        {
            var list = build.Parent.Children;
            var i    = list.IndexOf(build);

            list.Move(i, i + 1);
        }
コード例 #4
0
        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);
            }
        }
コード例 #5
0
        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));
        }
コード例 #6
0
        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));
        }
コード例 #7
0
        private bool CanPaste(IBuildViewModel target)
        {
            if (target == null || _buildClipboard == null)
            {
                return(false);
            }
            var targetFolder = target as IBuildFolderViewModel ?? target.Parent;

            return(_buildValidator.CanMoveTo(_buildClipboard, targetFolder));
        }
コード例 #8
0
        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;
        }
コード例 #9
0
        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;
        }
コード例 #10
0
        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);
        }
コード例 #11
0
        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));
        }
コード例 #12
0
        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));
        }
コード例 #13
0
 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;
 }
コード例 #14
0
 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);
     }
 }
コード例 #15
0
        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);
            }
        }
コード例 #16
0
        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);
        }
コード例 #17
0
        /// <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);
            }
        }
コード例 #18
0
        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);
            }
        }
コード例 #19
0
        /// <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));
            }
        }
コード例 #20
0
        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);
            }
        }
コード例 #21
0
 /// <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);
 }
コード例 #22
0
 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;
 }
コード例 #23
0
 private static bool IsNameUnique(string name, IBuildViewModel build, IBuildFolderViewModel parent)
 {
     return parent.Children.All(b => b == build || b.Build.Name != name);
 }
コード例 #24
0
 private string PathForFolder(string name, IBuildViewModel parent)
 {
     return Path.Combine(BasePathFor(parent), FileNameForFolder(name));
 }
コード例 #25
0
 private void Copy(IBuildViewModel <PoEBuild> build)
 {
     _buildClipboard  = build;
     _clipboardIsCopy = true;
 }
コード例 #26
0
 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);
 }
コード例 #27
0
 private void SetParent(IBuildViewModel build)
 {
     build.Parent    = this;
     build.SkillTree = SkillTree;
 }
コード例 #28
0
        private static bool CanBeChildOf(IBuildViewModel build, string parentPath)
        {
            var name = build.Build.Name;

            return(IsNameValid(name, Path.Combine(parentPath, FileNameForBuild(name))));
        }
コード例 #29
0
 private void UnsetParent(IBuildViewModel build)
 {
     build.Parent = null;
 }
コード例 #30
0
 private string PathForFolder(string name, IBuildViewModel parent)
 {
     return(Path.Combine(BasePathFor(parent), FileNameForFolder(name)));
 }
コード例 #31
0
 private static bool IsNameUnique(string name, IBuildViewModel build, IBuildFolderViewModel parent)
 {
     return(parent.Children.All(b => b == build || b.Build.Name != name));
 }
コード例 #32
0
 /// <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);
 }
コード例 #33
0
 private static bool CanBeChildOf(IBuildViewModel build, string parentPath)
 {
     var name = build.Build.Name;
     return IsNameValid(name, Path.Combine(parentPath, FileNameForBuild(name)));
 }
コード例 #34
0
 /// <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));
 }
コード例 #35
0
 private bool CanPaste(IBuildViewModel target)
 {
     return(CanPasteFromClipboard() || CanPasteNonClipboard(target));
 }
コード例 #36
0
 /// <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));
 }
コード例 #37
0
 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));
 }