/// <summary> /// Обновление статуса и команд правого элемента на основе дочерних. /// </summary> /// <param name="synchronizedItems">Синхронизируемые элементы, статусы и команды которых будут обновлены.</param> public void RefreshRightItemStatusesAndCommandsFromChilds(ISynchronizedItems synchronizedItems) { if (synchronizedItems.ChildItemsCount > 0) { var notEquallyChilds = synchronizedItems.ChildItems.Where(r => r.RightItem.Status.StatusEnum != ItemStatusEnum.Equally).ToArray(); if (notEquallyChilds.Length == 0) { // Если все дочерние строки имеют статус Equally, то и данная строка должна иметь такой сатус, и команд никаких быть при этом не должно. synchronizedItems.RightItem.UpdateStatus(ItemStatusEnum.Equally); synchronizedItems.RightItem.SyncCommand.SetCommandAction(null); } else if (notEquallyChilds.Any(r => r.RightItem.Status.StatusEnum == ItemStatusEnum.Unknown)) { ItemStatusUnknown(synchronizedItems.RightItem); } else { var rightStatuses = notEquallyChilds.Select(r => r.RightItem.Status.StatusEnum).Distinct().ToArray(); if (rightStatuses.Length == 1) { SetItemStatusAndCommands(synchronizedItems.RightItem, rightStatuses.First(), notEquallyChilds.Select(r => r.RightItem.SyncCommand.CommandAction)); } else { ItemStatusUnknown(synchronizedItems.RightItem); } } } }
private void RemoveSynchronizedDirectories(ISynchronizedItems synchronizedDirectories) { var removingRow = Rows.Single(r => r.LeftItem.Directory == synchronizedDirectories.LeftDirectory && r.RightItem.Directory == synchronizedDirectories.RightDirectory); DeleteRow(null, removingRow); }
private void AddChildRows(IRowViewModel row, ISynchronizedItems synchronizedItems) { foreach (var child in synchronizedItems.ChildItems) { var childRow = CreateRowViewModel(child); child.DeletedEvent += () => { DeleteRowEvent?.Invoke(row, childRow); }; AddRowEvent?.Invoke(row, childRow); } }
/// <summary> /// Создание строки, отображающей отслеживаемые элементы. /// </summary> /// <param name="synchronizedItems">Пара синхронизируемых элементов, на основе которых строится строка.</param> /// <returns>Строка, отображающая отслеживаемые элементы.</returns> public IRowViewModel CreateRowViewModel(ISynchronizedItems synchronizedItems) { var result = new RowViewModel(new ItemViewModel(synchronizedItems.LeftItem), new ItemViewModel(synchronizedItems.RightItem), null); synchronizedItems.InProcessChangedEvent += (bool inProcess) => { result.InProcess = inProcess; }; AddChildRows(result, synchronizedItems); synchronizedItems.DirectoriesIsLoadedEvent += (ISynchronizedItems loadedItems) => { AddChildRows(result, loadedItems); }; return(result); }
private void AddChildItem(ISynchronizedItems child) { _childItemsLock.EnterWriteLock(); try { _childItems.Add(child); } finally { _childItemsLock.ExitWriteLock(); } child.DeleteEvent += DeleteChild; child.LeftItem.StatusChangedEvent += RefreshLeftItemStatusAndCommands; child.RightItem.StatusChangedEvent += RefreshRightItemStatusAndCommands; child.InProcessChangedEvent += ChildInProcessChanged; }
private void DeleteChildWithoutUpdateParent(ISynchronizedItems child) { _childItemsLock.EnterWriteLock(); try { _childItems.Remove(child); } finally { _childItemsLock.ExitWriteLock(); } // Раз строка удаляется, больше за ней следить не надо. child.DeleteEvent -= DeleteChild; child.LeftItem.StatusChangedEvent -= RefreshLeftItemStatusAndCommands; child.RightItem.StatusChangedEvent -= RefreshRightItemStatusAndCommands; child.IsDeleted(); }
private ISynchronizedItem GetChildItemByName(ISynchronizedItems synchronizedItems, bool isLeft, string childItemName) { var item = isLeft ? synchronizedItems.LeftItem : synchronizedItems.RightItem; if (item.Name == childItemName) { return(item); } foreach (var childItem in synchronizedItems.ChildItems) { var result = GetChildItemByName(childItem, isLeft, childItemName); if (result != null) { return(result); } } return(null); }
private void DeleteChild(ISynchronizedItems deletingItems) { DeleteChildWithoutUpdateParent(deletingItems); RefreshLeftItemStatusAndCommands(); RefreshRightItemStatusAndCommands(); }
private void AddSynchronizedDirectories(ISynchronizedItems synchronizedDirectories) { AddRow(null, _rowViewModelFactory.CreateRowViewModel(synchronizedDirectories)); }
public void RefreshRightItemStatusesAndCommandsFromChilds(ISynchronizedItems synchronizedItems) { RefreshedRightItemSynchronizedItemsList.Add(synchronizedItems); }
public async Task Load() { var testSettingsStorage = new TestSettingsStorage(); ISynchronizedItems removedSynchronizedDirectories = null; var loadedDirectories = new List <IDirectory>(); using (var testDirectory = new TestDirectory()) { var settingsRow1 = new SettingsRow(testDirectory.CreateDirectory("1"), testDirectory.CreateDirectory("2"), true, null); var settingsRow2 = new SettingsRow(testDirectory.CreateDirectory("3"), testDirectory.CreateDirectory("4"), false, null); var settingsRow3 = new SettingsRow(testDirectory.CreateDirectory("5"), testDirectory.CreateDirectory("6"), true, new[] { "tiff" }); var settingsRow4 = new SettingsRow(testDirectory.CreateDirectory("7"), testDirectory.CreateDirectory("8"), true, new[] { "tiff" }); var settingsRow5 = new SettingsRow(testDirectory.CreateDirectory("9"), testDirectory.CreateDirectory("10"), true, null); testSettingsStorage.SettingsRows = new[] { settingsRow1, settingsRow2, settingsRow3, settingsRow4, settingsRow5 }; var synchronizedDirectoriesManager = new SynchronizedDirectoriesManager(testSettingsStorage, new SynchronizedItemFactory(new ItemFactory()), new SynchronizedItemsStatusAndCommandsUpdater(null)); await synchronizedDirectoriesManager.Load(); // Загрузка до изменения настроек. var oldSynchronizedDirectory2 = synchronizedDirectoriesManager.SynchronizedDirectories[1]; var oldSynchronizedDirectory3 = synchronizedDirectoriesManager.SynchronizedDirectories[2]; var oldSynchronizedDirectory4 = synchronizedDirectoriesManager.SynchronizedDirectories[3]; foreach (var synchronizedDirectory in synchronizedDirectoriesManager.SynchronizedDirectories) { synchronizedDirectory.LeftDirectory.LoadedDirectoryEvent += (IDirectory loadedDirecory) => { loadedDirectories.Add(loadedDirecory); }; synchronizedDirectory.RightDirectory.LoadedDirectoryEvent += (IDirectory loadedDirecory) => { loadedDirectories.Add(loadedDirecory); }; } synchronizedDirectoriesManager.RemoveSynchronizedDirectoriesEvent += (ISynchronizedItems synchronizedDirectories) => { removedSynchronizedDirectories = synchronizedDirectories; }; settingsRow1.IsUsed = false; // Эта строка при загрузке должна будет удалиться. settingsRow2.IsUsed = true; // Эта строка при загрузке должна будет добавиться. // Эта строка при загрузке должна будет инициализировать новую из-за изменения коллекции ExcludedExtensions. settingsRow3.ExcludedExtensions = new[] { "jpg" }; await synchronizedDirectoriesManager.Load(); // Загрузка после изменения настроек. Assert.Equal(4, synchronizedDirectoriesManager.SynchronizedDirectories.Length); // Проверим удалённую директорию. Assert.NotNull(removedSynchronizedDirectories); Assert.Equal(settingsRow1.LeftDirectory.DirectoryPath, removedSynchronizedDirectories.LeftDirectory.FullPath); Assert.Equal(settingsRow1.RightDirectory.DirectoryPath, removedSynchronizedDirectories.RightDirectory.FullPath); // Записи на синхронизируемые директории должны оставаться прежними. Assert.Equal(oldSynchronizedDirectory2, synchronizedDirectoriesManager.SynchronizedDirectories[0]); Assert.Equal(oldSynchronizedDirectory3, synchronizedDirectoriesManager.SynchronizedDirectories[1]); Assert.Equal(oldSynchronizedDirectory4, synchronizedDirectoriesManager.SynchronizedDirectories[2]); // Лишь две директории одной записи должны были обновиться. Assert.Equal(2, loadedDirectories.Count); Assert.Contains(oldSynchronizedDirectory2.LeftDirectory, loadedDirectories); Assert.Contains(oldSynchronizedDirectory2.RightDirectory, loadedDirectories); // И массивы исключаемых из рассмотрения расширений файлов тоже должны были обновиться. Assert.Equal(settingsRow3.ExcludedExtensions, oldSynchronizedDirectory2.LeftDirectory.ExcludedExtensions); Assert.Equal(settingsRow3.ExcludedExtensions, oldSynchronizedDirectory2.RightDirectory.ExcludedExtensions); // Эта запись на синхронизируемую директорию должна быть добавленной из-за включения строки настройки. var synchronizedDirectory3 = synchronizedDirectoriesManager.SynchronizedDirectories[3]; Assert.Equal(settingsRow2.LeftDirectory.DirectoryPath, synchronizedDirectory3.LeftDirectory.FullPath); Assert.Equal(settingsRow2.RightDirectory.DirectoryPath, synchronizedDirectory3.RightDirectory.FullPath); } }