diff --git a/FModel/MainWindow.xaml b/FModel/MainWindow.xaml index 5399f247..982f89f4 100644 --- a/FModel/MainWindow.xaml +++ b/FModel/MainWindow.xaml @@ -207,12 +207,17 @@ - + - + + + + + + diff --git a/FModel/MainWindow.xaml.cs b/FModel/MainWindow.xaml.cs index 0b4fc284..dd5a3830 100644 --- a/FModel/MainWindow.xaml.cs +++ b/FModel/MainWindow.xaml.cs @@ -389,6 +389,11 @@ namespace FModel if (FModel_AssetsPathTree.HasItems && FModel_AssetsPathTree.SelectedItem is TreeviewViewModel treeItem) await SortedTreeviewVm.ExtractFolder(treeItem).ConfigureAwait(false); } + private async void FModel_MI_Directory_Export_Click(object sender, RoutedEventArgs e) + { + if (FModel_AssetsPathTree.HasItems && FModel_AssetsPathTree.SelectedItem is TreeviewViewModel treeItem) + await SortedTreeviewVm.ExportFolder(treeItem).ConfigureAwait(false); + } private void FModel_MI_Directory_Save_Click(object sender, RoutedEventArgs e) { if (FModel_AssetsPathTree.HasItems && FModel_AssetsPathTree.SelectedItem is TreeviewViewModel treeItem) diff --git a/FModel/Properties/Resources.Designer.cs b/FModel/Properties/Resources.Designer.cs index 87586091..e09b1bab 100644 --- a/FModel/Properties/Resources.Designer.cs +++ b/FModel/Properties/Resources.Designer.cs @@ -955,6 +955,15 @@ namespace FModel.Properties { } } + /// + /// Recherche une chaîne localisée semblable à Export Directory. + /// + public static string ExportDirectory { + get { + return ResourceManager.GetString("ExportDirectory", resourceCulture); + } + } + /// /// Recherche une chaîne localisée semblable à Extract. /// diff --git a/FModel/Properties/Resources.resx b/FModel/Properties/Resources.resx index 7290728f..e5379ade 100644 --- a/FModel/Properties/Resources.resx +++ b/FModel/Properties/Resources.resx @@ -1103,4 +1103,7 @@ It's now the most used free software to leak on Fortnite. ..\Resources\EIconDesign_NoBackground.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Export Directory + \ No newline at end of file diff --git a/FModel/ViewModels/MenuItem/PakMenuItemViewModel.cs b/FModel/ViewModels/MenuItem/PakMenuItemViewModel.cs index 4fca9769..45090560 100644 --- a/FModel/ViewModels/MenuItem/PakMenuItemViewModel.cs +++ b/FModel/ViewModels/MenuItem/PakMenuItemViewModel.cs @@ -213,7 +213,7 @@ namespace FModel.ViewModels.MenuItem { DiscordIntegration.Update( $"{Globals.CachedPakFiles.Count}/{MenuItems.pakFiles.GetPakCount()} {Properties.Resources.PakFiles}", - string.Format("{0} - {1}", Globals.Game, + string.Format("{0} - {1}", Globals.Game.ActualGame, mode == EPakLoader.All ? Properties.Resources.AllFiles : mode == EPakLoader.New ? Properties.Resources.NewFiles : mode == EPakLoader.Modified ? Properties.Resources.ModifiedFiles : diff --git a/FModel/ViewModels/Treeview/SortedTreeviewViewModel.cs b/FModel/ViewModels/Treeview/SortedTreeviewViewModel.cs index bec504d4..4fcb8258 100644 --- a/FModel/ViewModels/Treeview/SortedTreeviewViewModel.cs +++ b/FModel/ViewModels/Treeview/SortedTreeviewViewModel.cs @@ -1,13 +1,17 @@ using FModel.Utils; +using FModel.ViewModels.Buttons; using FModel.ViewModels.DataGrid; using FModel.ViewModels.ListBox; +using FModel.ViewModels.StatusBar; using PakReader.Pak; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; +using System.Diagnostics; using System.Linq; using System.Text; using System.Text.RegularExpressions; +using System.Threading; using System.Threading.Tasks; using System.Windows.Data; @@ -88,6 +92,46 @@ namespace FModel.ViewModels.Treeview if (entriesToExtract.Any()) await Assets.GetUserSelection(entriesToExtract); } + + public static async Task ExportFolder(TreeviewViewModel treeItem) + { + string fullPath = treeItem.GetFullPath().Substring(1); + Stopwatch timer = Stopwatch.StartNew(); + ExtractStopVm.stopViewModel.IsEnabled = true; + ExtractStopVm.extractViewModel.IsEnabled = false; + StatusBarVm.statusBarViewModel.Set(string.Empty, Properties.Resources.Loading); + Tasks.TokenSource = new CancellationTokenSource(); + + await Task.Run(() => + { + foreach (var entry in DataGridVm.dataGridViewModel) // current loaded pak files + { + if (Tasks.TokenSource.IsCancellationRequested) + throw new TaskCanceledException(Properties.Resources.Canceled); + + var m = Regex.Match(entry.Name, $"{fullPath}/*", RegexOptions.IgnoreCase); + if (m.Success) + { + if (Globals.CachedPakFiles.TryGetValue(entry.PakFile, out PakFileReader pak)) + { + if (pak.TryGetValue("/" + entry.Name.Substring(0, entry.Name.LastIndexOf(".")), out var pakEntry)) // remove the extension to get the entry + { + Assets.Export(pakEntry, true); + } + } + } + } + }).ContinueWith(t => + { + timer.Stop(); + ExtractStopVm.stopViewModel.IsEnabled = false; + ExtractStopVm.extractViewModel.IsEnabled = true; + + if (t.Exception != null) Tasks.TaskCompleted(t.Exception); + else StatusBarVm.statusBarViewModel.Set(string.Format(Properties.Resources.TimeElapsed, timer.ElapsedMilliseconds), Properties.Resources.Success); + }, + TaskScheduler.FromCurrentSynchronizationContext()); + } } public class SortedTreeviewViewModel : PropertyChangedBase