diff --git a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerFileManagerVM.cs b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerFileManagerVM.cs index 96dceda2..5741665f 100644 --- a/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerFileManagerVM.cs +++ b/Wabbajack.App.Wpf/ViewModels/Compiler/CompilerFileManagerVM.cs @@ -53,12 +53,14 @@ namespace Wabbajack { public FileTreeViewItem(DirectoryInfo dir) { - Header = new FileTreeItemVM(dir); + base.Header = new FileTreeItemVM(dir); } public FileTreeViewItem(FileInfo file) { - Header = new FileTreeItemVM(file); + base.Header = new FileTreeItemVM(file); } + public new FileTreeItemVM Header => base.Header as FileTreeItemVM; + public static FileTreeViewItem Placeholder => default; } public class FileTreeItemVM : ReactiveObject, IDisposable { @@ -123,10 +125,9 @@ namespace Wabbajack private readonly Client _wjClient; [Reactive] public CompilerSettingsVM Settings { get; set; } = new(); - public IEnumerable Files { get; set; } + public ObservableCollection Files { get; set; } public ICommand PrevCommand { get; set; } - public CompilerFileManagerVM(ILogger logger, DTOSerializer dtos, SettingsManager settingsManager, IServiceProvider serviceProvider, LogStream loggerProvider, ResourceMonitor resourceMonitor, CompilerSettingsInferencer inferencer, Client wjClient) : base(logger) @@ -161,7 +162,7 @@ namespace Wabbajack LoadCompilerSettings.Send(Settings.ToCompilerSettings()); } - private IEnumerable LoadFiles(DirectoryInfo parent) + private ObservableCollection LoadFiles(DirectoryInfo parent) { var parentTreeItem = new FileTreeViewItem(parent) { @@ -176,9 +177,9 @@ namespace Wabbajack { return parent.EnumerateDirectories() .OrderBy(dir => dir.Name) - .Select(dir => new FileTreeViewItem(dir) { ItemsSource = (dir.EnumerateDirectories().Any() || dir.EnumerateFiles().Any()) ? new ObservableCollection([new TreeViewItem() { Header = "Loading..." }]) : null}).Select(item => { + .Select(dir => new FileTreeViewItem(dir) { ItemsSource = (dir.EnumerateDirectories().Any() || dir.EnumerateFiles().Any()) ? new ObservableCollection([FileTreeViewItem.Placeholder]) : null}).Select(item => { item.Expanded += LoadingItem_Expanded; - var header = (FileTreeItemVM)item.Header; + var header = item.Header; header.PathRelativeToRoot = ((AbsolutePath)header.Info.FullName).RelativeTo(Settings.Source); if (Settings.NoMatchInclude.Contains(header.PathRelativeToRoot)) { header.CompilerFileState = CompilerFileState.NoMatchInclude; } else if(Settings.Include.Contains(header.PathRelativeToRoot)) { header.CompilerFileState = CompilerFileState.Include; } @@ -193,7 +194,7 @@ namespace Wabbajack header.SpecialFileState = Settings.AlwaysEnabled.Any(p => header.PathRelativeToRoot.InFolder(p)); break; } - item.Header = header; + header.PropertyChanged += Header_PropertyChanged; return item; }) .Concat(parent.EnumerateFiles() @@ -201,13 +202,36 @@ namespace Wabbajack .Select(file => new FileTreeViewItem(file))); } + private void Header_PropertyChanged(object sender, PropertyChangedEventArgs e) + { + if(e.PropertyName == nameof(FileTreeItemVM.SpecialFileState)) + { + var updatedItem = (FileTreeItemVM)sender; + IEnumerable currentEnumerable = null; + for (int i = 0; i < updatedItem.PathRelativeToRoot.Depth - 1; i++) + { + if (currentEnumerable == null) + currentEnumerable = ((IEnumerable)Files.ElementAt(0).ItemsSource); + + var currentItem = currentEnumerable.First(x => x.Header.IsDirectory && updatedItem.PathRelativeToRoot.Parts[i] == x.Header.Info.Name); + currentItem.Header.SpecialFileState = updatedItem.CompilerFileState != CompilerFileState.AutoMatch; + currentEnumerable = (IEnumerable)currentItem.ItemsSource; + } + } + } + private void LoadingItem_Expanded(object sender, System.Windows.RoutedEventArgs e) { var parent = (FileTreeViewItem)e.OriginalSource; - var children = parent.ItemsSource.OfType(); - var firstChild = children.Any() ? children.First().Header : null; - if (firstChild != null && firstChild is string firstString && firstString == "Loading...") - parent.ItemsSource = LoadDirectoryContents((DirectoryInfo)((FileTreeItemVM)parent.Header).Info); + foreach(var child in parent.ItemsSource) + { + if (child == FileTreeViewItem.Placeholder) + { + parent.ItemsSource = LoadDirectoryContents((DirectoryInfo)parent.Header.Info); + break; + } + break; + } } private IEnumerable GetDirectoryContents(DirectoryInfo dir) @@ -247,7 +271,6 @@ namespace Wabbajack lastPath = allSavedCompilerSettings[0]; if (lastPath == default || !lastPath.FileExists() || lastPath.FileName.Extension != Ext.CompilerSettings) return; - //ModlistLocation.TargetPath = lastPath; } } } diff --git a/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml b/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml index 9f2545f2..eba04e70 100644 --- a/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml +++ b/Wabbajack.App.Wpf/Views/Compiler/CompilerDetailsView.xaml @@ -51,10 +51,10 @@ - - + +