diff --git a/CUE4Parse b/CUE4Parse
index cfff57a0..cb72c6e1 160000
--- a/CUE4Parse
+++ b/CUE4Parse
@@ -1 +1 @@
-Subproject commit cfff57a0483501e0fa555dff5bf542748afe0bab
+Subproject commit cb72c6e181687bc9b748ba09928677763057dd3a
diff --git a/FModel/MainWindow.xaml b/FModel/MainWindow.xaml
index 614b866e..cc5becb0 100644
--- a/FModel/MainWindow.xaml
+++ b/FModel/MainWindow.xaml
@@ -4,6 +4,7 @@
xmlns:local="clr-namespace:FModel"
xmlns:viewModels="clr-namespace:FModel.ViewModels"
xmlns:controls="clr-namespace:FModel.Views.Resources.Controls"
+ xmlns:explorer="clr-namespace:FModel.Views.Resources.Controls.Explorer"
xmlns:inputs="clr-namespace:FModel.Views.Resources.Controls.Inputs"
xmlns:converters="clr-namespace:FModel.Views.Resources.Converters"
xmlns:settings="clr-namespace:FModel.Settings"
@@ -558,7 +559,7 @@
DataContext="{Binding CUE4Parse.AssetsFolder.SelectedFolder.PathAtThisPoint}" />
-
@@ -574,9 +575,9 @@
-
+
-
@@ -594,7 +595,7 @@
-
+
diff --git a/FModel/MainWindow.xaml.cs b/FModel/MainWindow.xaml.cs
index a8c98f06..2202edb9 100644
--- a/FModel/MainWindow.xaml.cs
+++ b/FModel/MainWindow.xaml.cs
@@ -271,21 +271,17 @@ public partial class MainWindow
if (sender is not ItemContainerGenerator { Status: GeneratorStatus.ContainersGenerated } generator)
return;
- var foundVisibleItem = false;
- var itemCount = generator.Items.Count;
+ var list = ReferenceEquals(generator, AssetsExplorer.ItemContainerGenerator) ? AssetsExplorer
+ : ReferenceEquals(generator, AssetsListExplorer.ItemContainerGenerator) ? AssetsListExplorer
+ : AssetsListName;
- for (var i = 0; i < itemCount; i++)
+ if (!list.IsVisible || list.FindVisualChild() is not { } panel)
+ return;
+
+ foreach (var container in panel.Children.OfType())
{
- var container = generator.ContainerFromIndex(i);
- if (container == null)
+ if (container is FrameworkElement { IsVisible: true, DataContext: GameFileViewModel file })
{
- if (foundVisibleItem) break; // we're past the visible range already
- continue; // keep scrolling to find visible items
- }
-
- if (container is FrameworkElement { IsVisible: true } && generator.Items[i] is GameFileViewModel file)
- {
- foundVisibleItem = true;
file.OnIsVisible();
}
}
@@ -303,7 +299,6 @@ public partial class MainWindow
public void SelectFolder(TreeItem folder)
{
_applicationView.SelectedLeftTabIndex = 1;
- UpdateLayout();
AssetsFolderName.SelectFolder(folder);
AssetsFolderName.FocusSelection();
}
diff --git a/FModel/ViewModels/AssetsFolderViewModel.cs b/FModel/ViewModels/AssetsFolderViewModel.cs
index 44fb35cd..43d4b964 100644
--- a/FModel/ViewModels/AssetsFolderViewModel.cs
+++ b/FModel/ViewModels/AssetsFolderViewModel.cs
@@ -101,9 +101,9 @@ public class TreeItem : ViewModel
{
get
{
+ // BulkPopulate sorts Folders before this view is created
_filteredFoldersView ??= new ListCollectionView(Folders)
{
- SortDescriptions = { new SortDescription(nameof(Header), ListSortDirection.Ascending) },
Filter = e => ItemFilter(e, SearchText.Trim().Split(' ', StringSplitOptions.RemoveEmptyEntries))
};
return _filteredFoldersView;
diff --git a/FModel/Views/Resources/Controls/Explorer/AssetExplorerListBox.cs b/FModel/Views/Resources/Controls/Explorer/AssetExplorerListBox.cs
new file mode 100644
index 00000000..b3ea662c
--- /dev/null
+++ b/FModel/Views/Resources/Controls/Explorer/AssetExplorerListBox.cs
@@ -0,0 +1,20 @@
+using System.Collections;
+using System.Windows.Controls;
+using System.Windows.Controls.Primitives;
+using FModel.Extensions;
+
+namespace FModel.Views.Resources.Controls.Explorer;
+
+public class AssetExplorerListBox : ListBox
+{
+ protected override void OnItemsSourceChanged(IEnumerable oldValue, IEnumerable newValue)
+ {
+ base.OnItemsSourceChanged(oldValue, newValue);
+
+ // Always start at the top, otherwise inherited offset can cause items not to be visible when we change folder
+ if (this.FindVisualChild() is IScrollInfo scroll)
+ {
+ scroll.SetVerticalOffset(0);
+ }
+ }
+}
diff --git a/FModel/Views/Resources/Controls/Explorer/Resources.xaml b/FModel/Views/Resources/Controls/Explorer/Resources.xaml
index f218f65e..95b5e7bd 100644
--- a/FModel/Views/Resources/Controls/Explorer/Resources.xaml
+++ b/FModel/Views/Resources/Controls/Explorer/Resources.xaml
@@ -9,6 +9,16 @@
xmlns:adonisExtensions="clr-namespace:AdonisUI.Extensions;assembly=AdonisUI"
xmlns:adonisConverters="clr-namespace:AdonisUI.Converters;assembly=AdonisUI"
x:Class="FModel.Views.Resources.Controls.TiledExplorer.ResourcesDictionary">
+
+
+
+
+
+
+
+
+
+
@@ -69,14 +79,7 @@
-
-
-
-
-
-
-
+
@@ -201,7 +204,7 @@
-
+
-
+
diff --git a/FModel/Views/Resources/Controls/Explorer/Resources.xaml.cs b/FModel/Views/Resources/Controls/Explorer/Resources.xaml.cs
index 0951a8b2..31ce1002 100644
--- a/FModel/Views/Resources/Controls/Explorer/Resources.xaml.cs
+++ b/FModel/Views/Resources/Controls/Explorer/Resources.xaml.cs
@@ -44,7 +44,7 @@ public partial class ResourcesDictionary
{
if (sender is not ListBoxItem item)
return;
- if (item.DataContext is not GameFileViewModel)
+ if (item.DataContext is not (GameFileViewModel or TreeItem))
return;
var listBox = ItemsControl.ItemsControlFromItemContainer(item) as ListBox;
if (listBox == null)
@@ -57,9 +57,20 @@ public partial class ResourcesDictionary
}
item.Focus();
- var contextMenu = listBox.FindResource("FileContextMenu") as ContextMenu;
+ var isFolder = item.DataContext is TreeItem;
+ var contextMenu = listBox.FindResource(isFolder ? "FolderContextMenu" : "FileContextMenu") as ContextMenu;
if (contextMenu is not null)
{
+ if (isFolder)
+ {
+ // Create FolderContextMenu only on right-click
+ listBox.ContextMenu = null;
+ contextMenu.PlacementTarget = item;
+ contextMenu.IsOpen = true;
+ e.Handled = true;
+ return;
+ }
+
listBox.ContextMenu = null;
item.Dispatcher.BeginInvoke(new Action(() =>
{
diff --git a/FModel/Views/Resources/Controls/Explorer/TiledExplorer/FolderButton.xaml b/FModel/Views/Resources/Controls/Explorer/TiledExplorer/FolderButton.xaml
index bd545f03..5bc7bf12 100644
--- a/FModel/Views/Resources/Controls/Explorer/TiledExplorer/FolderButton.xaml
+++ b/FModel/Views/Resources/Controls/Explorer/TiledExplorer/FolderButton.xaml
@@ -20,36 +20,13 @@