Overall improvements (#633)

This commit is contained in:
Masusder 2026-01-25 17:49:44 +01:00 committed by GitHub
parent 31d426f795
commit 669b07f807
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
18 changed files with 675 additions and 293 deletions

@ -1 +1 @@
Subproject commit 32ddcc61539cb8f82a92c8dc2d769ec34375aa37
Subproject commit eaca2ce06fd5908f441936312d3c08f53ecb5edd

View File

@ -104,9 +104,9 @@ public enum EBulkType
Properties = 1 << 1,
Textures = 1 << 2,
Meshes = 1 << 3,
Skeletons = 1 << 4,
Animations = 1 << 5,
Audio = 1 << 6
Animations = 1 << 4,
Audio = 1 << 5,
Code = 1 << 6,
}
public enum EAssetCategory : uint
@ -125,14 +125,18 @@ public enum EAssetCategory : uint
Mesh = AssetCategoryExtensions.CategoryBase + (2 << 16),
StaticMesh = Mesh + 1,
SkeletalMesh = Mesh + 2,
Skeleton = Mesh + 3,
CustomizableObject = Mesh + 3,
NaniteDisplacedMesh = Mesh + 4,
Texture = AssetCategoryExtensions.CategoryBase + (3 << 16),
Materials = AssetCategoryExtensions.CategoryBase + (4 << 16),
Material = Materials + 1,
MaterialEditorData = Materials + 2,
MaterialFunction = Materials + 3,
MaterialParameterCollection = Materials + 4,
MaterialFunctionEditorData = Materials + 4,
MaterialParameterCollection = Materials + 5,
Animation = AssetCategoryExtensions.CategoryBase + (5 << 16),
Skeleton = Animation + 1,
Rig = Animation + 2,
Level = AssetCategoryExtensions.CategoryBase + (6 << 16),
World = Level + 1,
BuildData = Level + 2,
@ -142,9 +146,14 @@ public enum EAssetCategory : uint
ItemDefinitionBase = Data + 1,
CurveBase = Data + 2,
PhysicsAsset = Data + 3,
ObjectRedirector = Data + 4,
PhysicalMaterial = Data + 5,
ByteCode = Data + 6,
Media = AssetCategoryExtensions.CategoryBase + (8 << 16),
Audio = Media + 1,
Video = Media + 2,
Font = Media + 3,
SoundBank = Media + 4,
AudioEvent = Media + 5,
Particle = AssetCategoryExtensions.CategoryBase + (9 << 16),
}

View File

@ -535,17 +535,27 @@
<ToggleButton Width="32"
Height="32"
Cursor="Hand"
Margin="0, 0, 2, 0"
Margin="0,0,2,0"
IsChecked="{Binding IsAssetsExplorerVisible, Mode=TwoWay}"
Style="{StaticResource AssetsExplorerToggleButtonStyle}" />
<ToggleButton Width="32"
Height="32"
Cursor="Hand"
Checked="OnPreviewTexturesToggled"
Focusable="False"
IsChecked="{Binding PreviewTexturesAssetExplorer, Source={x:Static settings:UserSettings.Default}, Mode=TwoWay}">
<ToggleButton.Style>
<Style TargetType="ToggleButton" BasedOn="{StaticResource ModernToggleButtonStyle}">
<Setter Property="ToolTip" Value="Preview Textures (OFF)" />
<Style TargetType="ToggleButton"
BasedOn="{StaticResource ModernToggleButtonStyle}">
<Setter Property="ToolTip"
Value="Preview Textures (OFF)" />
<Style.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Background" Value="MediumPurple" />
<Setter Property="ToolTip" Value="Preview Textures (ON)" />
<Trigger Property="IsChecked"
Value="True">
<Setter Property="Background"
Value="MediumPurple" />
<Setter Property="ToolTip"
Value="Preview Textures (ON)" />
</Trigger>
</Style.Triggers>
</Style>
@ -559,40 +569,6 @@
</Canvas>
</Viewbox>
</ToggleButton>
<ToggleButton Width="32"
Height="32"
Cursor="Hand"
Margin="0, 0, 2, 0"
Checked="OnPreviewTexturesToggled"
ToolTip="Assets Explorer"
Focusable="False"
IsChecked="{Binding IsAssetsExplorerVisible, Mode=TwoWay}"
Style="{StaticResource ModernToggleButtonStyle}">
<Viewbox Width="16"
Height="16">
<Canvas Width="24"
Height="24">
<Path Data="{StaticResource FolderIconAlt}"
Fill="{DynamicResource {x:Static adonisUi:Brushes.ForegroundBrush}}" />
</Canvas>
</Viewbox>
</ToggleButton>
<ToggleButton Width="32"
Height="32"
Cursor="Hand"
ToolTip="File Properties"
Focusable="False"
IsChecked="{Binding IsAssetsExplorerVisible, Converter={x:Static converters:InvertBooleanConverter.Instance}, Mode=TwoWay}"
Style="{StaticResource ModernToggleButtonStyle}">
<Viewbox Width="16"
Height="16">
<Canvas Width="24"
Height="24">
<Path Data="{StaticResource AssetIcon}"
Fill="{DynamicResource {x:Static adonisUi:Brushes.ForegroundBrush}}" />
</Canvas>
</Viewbox>
</ToggleButton>
</StackPanel>
</Border>

View File

@ -21,8 +21,8 @@ using CUE4Parse.FileProvider.Objects;
using CUE4Parse.FileProvider.Vfs;
using CUE4Parse.GameTypes.Aion2.Objects;
using CUE4Parse.GameTypes.AshEchoes.FileProvider;
using CUE4Parse.GameTypes.KRD.Assets.Exports;
using CUE4Parse.GameTypes.SMG.UE4.Assets.Exports.Wwise;
using CUE4Parse.GameTypes.KRD.Assets.Exports;
using CUE4Parse.MappingsProvider;
using CUE4Parse.UE4.AssetRegistry;
using CUE4Parse.UE4.Assets;

View File

@ -9,11 +9,14 @@ using System.Windows.Media.Imaging;
using CUE4Parse.FileProvider.Objects;
using CUE4Parse.GameTypes.FN.Assets.Exports.DataAssets;
using CUE4Parse.GameTypes.SMG.UE4.Assets.Exports.Wwise;
using CUE4Parse.GameTypes.SMG.UE4.Assets.Objects;
using CUE4Parse.UE4.Assets;
using CUE4Parse.UE4.Assets.Exports;
using CUE4Parse.UE4.Assets.Exports.Animation;
using CUE4Parse.UE4.Assets.Exports.BuildData;
using CUE4Parse.UE4.Assets.Exports.Component;
using CUE4Parse.UE4.Assets.Exports.CriWare;
using CUE4Parse.UE4.Assets.Exports.CustomizableObject;
using CUE4Parse.UE4.Assets.Exports.Engine;
using CUE4Parse.UE4.Assets.Exports.Engine.Font;
using CUE4Parse.UE4.Assets.Exports.Fmod;
@ -22,6 +25,7 @@ using CUE4Parse.UE4.Assets.Exports.Internationalization;
using CUE4Parse.UE4.Assets.Exports.LevelSequence;
using CUE4Parse.UE4.Assets.Exports.Material;
using CUE4Parse.UE4.Assets.Exports.Material.Editor;
using CUE4Parse.UE4.Assets.Exports.Nanite;
using CUE4Parse.UE4.Assets.Exports.Niagara;
using CUE4Parse.UE4.Assets.Exports.SkeletalMesh;
using CUE4Parse.UE4.Assets.Exports.Sound;
@ -88,6 +92,16 @@ public class GameFileViewModel(GameFile asset) : ViewModel
}
}
private EBulkType _assetActions = EBulkType.None;
public EBulkType AssetActions
{
get => _assetActions;
private set
{
SetProperty(ref _assetActions, value);
}
}
private ImageSource _previewImage;
public ImageSource PreviewImage
{
@ -101,6 +115,13 @@ public class GameFileViewModel(GameFile asset) : ViewModel
}
}
private int _numTextures = 0;
public int NumTextures
{
get => _numTextures;
private set => SetProperty(ref _numTextures, value);
}
public Task ExtractAsync()
=> ApplicationService.ThreadWorkerView.Begin(cancellationToken =>
_applicationView.CUE4Parse.ExtractSelected(cancellationToken, [Asset]));
@ -142,6 +163,7 @@ public class GameFileViewModel(GameFile asset) : ViewModel
if (Asset.Extension is "umap")
{
AssetCategory = EAssetCategory.World;
AssetActions = EBulkType.Meshes | EBulkType.Textures | EBulkType.Audio | EBulkType.Code;
ResolvedAssetType = "World";
Resolved |= EResolveCompute.Preview;
return Task.CompletedTask;
@ -149,6 +171,7 @@ public class GameFileViewModel(GameFile asset) : ViewModel
if (Asset.NameWithoutExtension.EndsWith("_BuiltData"))
{
AssetCategory = EAssetCategory.BuildData;
AssetActions = EBulkType.Textures;
ResolvedAssetType = "MapBuildDataRegistry";
Resolved |= EResolveCompute.Preview;
return Task.CompletedTask;
@ -172,49 +195,59 @@ public class GameFileViewModel(GameFile asset) : ViewModel
var dummy = ((AbstractUePackage) pkg).ConstructObject(pointer.Class?.Object?.Value as UStruct, pkg);
ResolvedAssetType = dummy.ExportType;
AssetCategory = dummy switch
(AssetCategory, AssetActions) = dummy switch
{
URigVMBlueprintGeneratedClass => EAssetCategory.RigVMBlueprintGeneratedClass,
UAnimBlueprintGeneratedClass => EAssetCategory.AnimBlueprintGeneratedClass,
UWidgetBlueprintGeneratedClass => EAssetCategory.WidgetBlueprintGeneratedClass,
UBlueprintGeneratedClass or UFunction => EAssetCategory.BlueprintGeneratedClass,
UUserDefinedEnum => EAssetCategory.UserDefinedEnum,
UUserDefinedStruct => EAssetCategory.UserDefinedStruct,
UBlueprintCore => EAssetCategory.Blueprint,
UClassCookedMetaData or UStructCookedMetaData or UEnumCookedMetaData => EAssetCategory.CookedMetaData,
URigVMBlueprintGeneratedClass => (EAssetCategory.RigVMBlueprintGeneratedClass, EBulkType.Code),
UAnimBlueprintGeneratedClass => (EAssetCategory.AnimBlueprintGeneratedClass, EBulkType.Code),
UWidgetBlueprintGeneratedClass => (EAssetCategory.WidgetBlueprintGeneratedClass, EBulkType.Code),
UBlueprintGeneratedClass or UFunction => (EAssetCategory.BlueprintGeneratedClass, EBulkType.Code),
UUserDefinedEnum => (EAssetCategory.UserDefinedEnum, EBulkType.None),
UUserDefinedStruct => (EAssetCategory.UserDefinedStruct, EBulkType.Code),
UBlueprintCore => (EAssetCategory.Blueprint, EBulkType.Code),
UClassCookedMetaData or UStructCookedMetaData or UEnumCookedMetaData => (EAssetCategory.CookedMetaData, EBulkType.None),
UStaticMesh => EAssetCategory.StaticMesh,
USkeletalMesh => EAssetCategory.SkeletalMesh,
UPhysicsAsset => EAssetCategory.PhysicsAsset,
UStaticMesh => (EAssetCategory.StaticMesh, EBulkType.Meshes),
USkeletalMesh => (EAssetCategory.SkeletalMesh, EBulkType.Meshes),
UCustomizableObject => (EAssetCategory.CustomizableObject, EBulkType.None),
UNaniteDisplacedMesh => (EAssetCategory.NaniteDisplacedMesh, EBulkType.None),
UTexture => EAssetCategory.Texture,
UTexture => (EAssetCategory.Texture, EBulkType.Textures),
UMaterialInterface => EAssetCategory.Material,
UMaterialInterfaceEditorOnlyData => EAssetCategory.MaterialEditorData,
UMaterialFunction => EAssetCategory.MaterialFunction,
UMaterialParameterCollection => EAssetCategory.MaterialParameterCollection,
UMaterialInterface => (EAssetCategory.Material, EBulkType.None),
UMaterialInterfaceEditorOnlyData => (EAssetCategory.MaterialEditorData, EBulkType.None),
UMaterialFunction => (EAssetCategory.MaterialFunction, EBulkType.None),
UMaterialFunctionEditorOnlyData => (EAssetCategory.MaterialFunctionEditorData, EBulkType.None),
UMaterialParameterCollection => (EAssetCategory.MaterialParameterCollection, EBulkType.None),
UAnimationAsset => EAssetCategory.Animation,
USkeleton => EAssetCategory.Skeleton,
UAnimationAsset => (EAssetCategory.Animation, EBulkType.Animations),
USkeleton => (EAssetCategory.Skeleton, EBulkType.Meshes),
URig => (EAssetCategory.Rig, EBulkType.None),
UWorld => EAssetCategory.World,
UMapBuildDataRegistry => EAssetCategory.BuildData,
ULevelSequence => EAssetCategory.LevelSequence,
UFoliageType => EAssetCategory.Foliage,
UWorld => (EAssetCategory.World, EBulkType.Meshes | EBulkType.Textures | EBulkType.Audio | EBulkType.Code),
UMapBuildDataRegistry => (EAssetCategory.BuildData, EBulkType.Textures),
ULevelSequence => (EAssetCategory.LevelSequence, EBulkType.Code),
UFoliageType => (EAssetCategory.Foliage, EBulkType.None),
UItemDefinitionBase => EAssetCategory.ItemDefinitionBase,
UDataAsset or UDataTable or UCurveTable or UStringTable => EAssetCategory.Data,
UCurveBase => EAssetCategory.CurveBase,
UItemDefinitionBase => (EAssetCategory.ItemDefinitionBase, EBulkType.Textures),
UDataAsset or UDataTable or UCurveTable or UStringTable => (EAssetCategory.Data, EBulkType.None),
UCurveBase => (EAssetCategory.CurveBase, EBulkType.None),
UPhysicsAsset => (EAssetCategory.PhysicsAsset, EBulkType.None),
UObjectRedirector => (EAssetCategory.ObjectRedirector, EBulkType.None),
UPhysicalMaterial => (EAssetCategory.PhysicalMaterial, EBulkType.None),
UWwiseAssetLibrary or USoundBase or UAkMediaAssetData or UAtomWaveBank or USoundAtomCue
or UAtomCueSheet or USoundAtomCueSheet or UFMODBank or UFMODEvent or UAkAudioType
or UExternalSource or UExternalSourceBank => EAssetCategory.Audio,
UFileMediaSource => EAssetCategory.Video,
UFont or UFontFace => EAssetCategory.Font,
USoundAtomCue or UAkAudioEvent or USoundCue or UFMODEvent => (EAssetCategory.AudioEvent, EBulkType.Audio),
UNiagaraSystem or UNiagaraScriptBase or UParticleSystem => EAssetCategory.Particle,
UFMODBank or UAkAudioBank or UAtomWaveBank or UAkInitBank => (EAssetCategory.SoundBank, EBulkType.Audio),
_ => EAssetCategory.All
UWwiseAssetLibrary or USoundBase or UAkMediaAssetData or UAtomCueSheet
or USoundAtomCueSheet or UAkAudioType or UExternalSource or UExternalSourceBank => (EAssetCategory.Audio, EBulkType.Audio),
UFileMediaSource => (EAssetCategory.Video, EBulkType.None),
UFont or UFontFace or USMGLocaleFontUMG => (EAssetCategory.Font, EBulkType.None),
UNiagaraSystem or UNiagaraScriptBase or UParticleSystem => (EAssetCategory.Particle, EBulkType.None),
_ => (EAssetCategory.All, EBulkType.None),
};
switch (AssetCategory)
@ -224,6 +257,9 @@ public class GameFileViewModel(GameFile asset) : ViewModel
if (!resolve.HasFlag(EResolveCompute.Preview))
break;
if (pointer.Object.Value is UTexture2DArray textureArray && textureArray.GetFirstMip() is { SizeZ: > 1 } firstMip)
NumTextures = firstMip.SizeZ;
var img = texture.Decode(MaxPreviewSize, UserSettings.Default.CurrentDir.TexturePlatform);
if (img != null)
{
@ -297,18 +333,25 @@ public class GameFileViewModel(GameFile asset) : ViewModel
case "xml":
AssetCategory = EAssetCategory.Data;
break;
case "ushaderbytecode":
AssetCategory = EAssetCategory.ByteCode;
break;
case "wav":
case "bank":
case "bnk":
case "pck":
case "awb":
case "acb":
case "awb": // This is technically soundbank and should be below but I want it to be distinguishable from "acb"
case "xvag":
case "flac":
case "at9":
case "wem":
case "ogg":
AssetCategory = EAssetCategory.Audio;
AssetActions = EBulkType.Audio;
break;
case "acb":
case "bank":
case "bnk":
case "pck":
AssetCategory = EAssetCategory.SoundBank;
AssetActions = EBulkType.Audio;
break;
case "ufont":
case "otf":
@ -325,6 +368,7 @@ public class GameFileViewModel(GameFile asset) : ViewModel
{
Resolved |= ~EResolveCompute.Preview;
AssetCategory = EAssetCategory.Texture;
AssetActions = EBulkType.Textures;
if (!resolve.HasFlag(EResolveCompute.Preview))
break;

View File

@ -10,14 +10,23 @@
<SolidColorBrush x:Key="CookedMetaDataBrush" Color="Yellow" />
<SolidColorBrush x:Key="UserDefinedEnumBrush" Color="DarkGoldenrod" />
<SolidColorBrush x:Key="UserDefinedStructBrush" Color="Tan" />
<SolidColorBrush x:Key="CustomizableObjectBrush" Color="DarkRed" />
<SolidColorBrush x:Key="NaniteDisplacedMeshBrush" Color="ForestGreen" />
<SolidColorBrush x:Key="MaterialBrush" Color="BurlyWood" />
<SolidColorBrush x:Key="MaterialEditorBrush" Color="Yellow" />
<SolidColorBrush x:Key="RigBrush" Color="YellowGreen" />
<SolidColorBrush x:Key="BinaryBrush" Color="Yellow" />
<SolidColorBrush x:Key="TextureBrush" Color="MediumPurple" />
<SolidColorBrush x:Key="ConfigBrush" Color="LightSlateGray" />
<SolidColorBrush x:Key="AudioBrush" Color="MediumSeaGreen" />
<SolidColorBrush x:Key="SoundBankBrush" Color="DarkSeaGreen" />
<SolidColorBrush x:Key="AudioEventBrush" Color="DarkTurquoise" />
<SolidColorBrush x:Key="VideoBrush" Color="IndianRed" />
<SolidColorBrush x:Key="DataTableBrush" Color="SteelBlue" />
<SolidColorBrush x:Key="CurveBrush" Color="HotPink" />
@ -32,4 +41,5 @@
<SolidColorBrush x:Key="AnimationBrush" Color="Coral" />
<SolidColorBrush x:Key="LuaBrush" Color="DarkBlue" />
<SolidColorBrush x:Key="JsonXmlBrush" Color="LightGreen" />
<SolidColorBrush x:Key="CodeBrush" Color="SandyBrown" />
</ResourceDictionary>

View File

@ -86,7 +86,7 @@
<Binding.Converter>
<converters:AnyItemMeetsConditionConverter>
<converters:AnyItemMeetsConditionConverter.Conditions>
<converters:ItemCategoryCondition Category="Blueprints" />
<converters:ItemActionCondition Action="Code" />
</converters:AnyItemMeetsConditionConverter.Conditions>
</converters:AnyItemMeetsConditionConverter>
</Binding.Converter>
@ -157,10 +157,9 @@
<MenuItem.IsEnabled>
<Binding Path="PlacementTarget.SelectedItems" RelativeSource="{RelativeSource AncestorType=ContextMenu}">
<Binding.Converter>
<converters:AnyItemMeetsConditionConverter ConditionMode="Or">
<converters:AnyItemMeetsConditionConverter>
<converters:AnyItemMeetsConditionConverter.Conditions>
<converters:ItemCategoryCondition Category="Texture" />
<converters:ItemCategoryCondition Category="ItemDefinitionBase" />
<converters:ItemActionCondition Action="Textures" />
</converters:AnyItemMeetsConditionConverter.Conditions>
</converters:AnyItemMeetsConditionConverter>
</Binding.Converter>
@ -186,7 +185,7 @@
<Binding.Converter>
<converters:AnyItemMeetsConditionConverter>
<converters:AnyItemMeetsConditionConverter.Conditions>
<converters:ItemCategoryCondition Category="Mesh" />
<converters:ItemActionCondition Action="Meshes" />
</converters:AnyItemMeetsConditionConverter.Conditions>
</converters:AnyItemMeetsConditionConverter>
</Binding.Converter>
@ -212,7 +211,7 @@
<Binding.Converter>
<converters:AnyItemMeetsConditionConverter>
<converters:AnyItemMeetsConditionConverter.Conditions>
<converters:ItemCategoryCondition Category="Animation" />
<converters:ItemActionCondition Action="Animations" />
</converters:AnyItemMeetsConditionConverter.Conditions>
</converters:AnyItemMeetsConditionConverter>
</Binding.Converter>
@ -238,7 +237,7 @@
<Binding.Converter>
<converters:AnyItemMeetsConditionConverter>
<converters:AnyItemMeetsConditionConverter.Conditions>
<converters:ItemCategoryCondition Category="Audio" />
<converters:ItemActionCondition Action="Audio" />
</converters:AnyItemMeetsConditionConverter.Conditions>
</converters:AnyItemMeetsConditionConverter>
</Binding.Converter>

View File

@ -44,6 +44,26 @@
</MultiBinding>
</Path.Fill>
</Path>
<ContentPresenter Content="{Binding NumTextures}">
<ContentPresenter.Style>
<Style TargetType="ContentPresenter">
<Setter Property="ContentTemplate"
Value="{StaticResource TextureNumTemplate}" />
<Style.Triggers>
<DataTrigger Binding="{Binding Content, RelativeSource={RelativeSource Self}}"
Value="0">
<Setter Property="Visibility"
Value="Collapsed" />
</DataTrigger>
<DataTrigger Binding="{Binding Content, RelativeSource={RelativeSource Self}}"
Value="{x:Null}">
<Setter Property="Visibility"
Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</ContentPresenter.Style>
</ContentPresenter>
</Grid>
<Rectangle Grid.Row="1" Fill="{Binding Fill, ElementName=FallbackIcon, FallbackValue=Red}" />

View File

@ -34,6 +34,7 @@
<Setter Property="Background" Value="{DynamicResource {x:Static adonisUi:Brushes.Layer0BackgroundBrush}}" />
<EventSetter Event="MouseDoubleClick" Handler="OnMouseDoubleClick" />
<EventSetter Event="PreviewMouseRightButtonDown" Handler="OnPreviewMouseRightButtonDown" />
<Setter Property="Template">
<Setter.Value>
@ -114,4 +115,97 @@
<local:FolderButton2 ContextMenu="{StaticResource FolderContextMenu}" />
</DataTemplate>
<DataTemplate x:Key="TextureNumTemplate">
<Border VerticalAlignment="Top"
HorizontalAlignment="Right"
Margin="4"
Padding="6,2"
CornerRadius="3"
Opacity="0.85"
Background="{DynamicResource {x:Static adonisUi:Brushes.Layer3BackgroundBrush}}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding}"
Foreground="White"
FontSize="11"
FontWeight="SemiBold"
VerticalAlignment="Center"
Margin="0,0,5,0" />
<Path Data="{StaticResource TextureIcon}"
Fill="White"
Width="12"
Height="12"
Stretch="Uniform"
VerticalAlignment="Center" />
</StackPanel>
</Border>
</DataTemplate>
<Style x:Key="AssetsListBox" TargetType="ListBox" BasedOn="{StaticResource {x:Type ListBox}}">
<Setter Property="ItemsSource" Value="{Binding SelectedItem.AssetsList.AssetsView, ElementName=AssetsFolderName, IsAsync=True}" />
<Setter Property="SelectionMode" Value="Extended" />
<Setter Property="ContextMenu" Value="{StaticResource FileContextMenu}" />
<Setter Property="VirtualizingPanel.IsVirtualizing" Value="True" />
<Setter Property="VirtualizingPanel.VirtualizationMode" Value="Recycling" />
<Setter Property="adonisExtensions:ScrollViewerExtension.VerticalScrollBarExpansionMode" Value="NeverExpand"/>
<Setter Property="adonisExtensions:ScrollViewerExtension.VerticalScrollBarPlacement" Value="Docked"/>
<Setter Property="adonisExtensions:ScrollViewerExtension.HorizontalScrollBarExpansionMode" Value="NeverExpand"/>
<Setter Property="adonisExtensions:ScrollViewerExtension.HorizontalScrollBarPlacement" Value="Docked"/>
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Image x:Name="ListImage" Source="/FModel;component/Resources/unknown_asset.png"
Width="16" Height="16" HorizontalAlignment="Center" Margin="0 0 3 0" />
<TextBlock Grid.Column="1" HorizontalAlignment="Left" Text="{Binding Asset.Name}" />
</Grid>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Asset.Extension}" Value="uasset">
<Setter TargetName="ListImage" Property="Source" Value="/FModel;component/Resources/asset.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Asset.Extension}" Value="ini">
<Setter TargetName="ListImage" Property="Source" Value="/FModel;component/Resources/asset_ini.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Asset.Extension}" Value="png">
<Setter TargetName="ListImage" Property="Source" Value="/FModel;component/Resources/asset_png.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Asset.Extension}" Value="psd">
<Setter TargetName="ListImage" Property="Source" Value="/FModel;component/Resources/asset_psd.png" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</Setter.Value>
</Setter>
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource {x:Type ListBoxItem}}">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
<Setter Property="Padding" Value="5 3" />
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
<Setter Property="controls:ListBoxItemBehavior.IsBroughtIntoViewWhenSelected" Value="True" />
<EventSetter Event="PreviewMouseRightButtonDown" Handler="OnPreviewMouseRightButtonDown" />
</Style>
</Setter.Value>
</Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding Items.Count, RelativeSource={RelativeSource Self}, FallbackValue=0}" Value="0">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Grid>
<TextBlock Text="No packages found in folder" FontWeight="SemiBold" TextAlignment="Center"
Foreground="{DynamicResource {x:Static adonisUi:Brushes.ErrorBrush}}" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</ResourceDictionary>

View File

@ -1,5 +1,7 @@
using System;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Threading;
using FModel.Services;
using FModel.ViewModels;
@ -47,6 +49,39 @@ public partial class ResourcesDictionary
childFolder.IsSelected = true;
break;
}
}
// Hack to force re-evaluation of context menu options, also prevents menu flicker from happening
private void OnPreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
if (sender is not ListBoxItem item)
return;
if (item.DataContext is not GameFileViewModel)
return;
var listBox = ItemsControl.ItemsControlFromItemContainer(item) as ListBox;
if (listBox == null)
return;
if (!item.IsSelected)
{
listBox.UnselectAll();
item.IsSelected = true;
}
item.Focus();
var contextMenu = listBox.FindResource("FileContextMenu") as ContextMenu;
if (contextMenu is not null)
{
listBox.ContextMenu = null;
item.Dispatcher.BeginInvoke(new Action(() =>
{
contextMenu.DataContext = listBox.DataContext;
listBox.ContextMenu = contextMenu;
contextMenu.PlacementTarget = listBox;
contextMenu.IsOpen = true;
}), DispatcherPriority.Input);
}
e.Handled = true;
}
}

View File

@ -51,6 +51,16 @@ public interface IItemCondition
bool Matches(GameFileViewModel item);
}
public class ItemActionCondition : IItemCondition
{
public EBulkType Action { get; set; }
public bool Matches(GameFileViewModel item)
{
return item != null && item.AssetActions.HasFlag(Action);
}
}
public class ItemCategoryCondition : IItemCondition
{
public EAssetCategory Category { get; set; }

View File

@ -32,25 +32,34 @@ public class FileToGeometryConverter : IMultiValueConverter
EAssetCategory.StaticMesh => ("StaticMeshIconAlt", "NeutralBrush"),
EAssetCategory.SkeletalMesh => ("SkeletalMeshIconAlt", "NeutralBrush"),
EAssetCategory.Skeleton => ("SkeletonIcon", "NeutralBrush"),
EAssetCategory.CustomizableObject => ("StaticMeshIconAlt", "CustomizableObjectBrush"),
EAssetCategory.NaniteDisplacedMesh => ("StaticMeshIconAlt", "NaniteDisplacedMeshBrush"),
EAssetCategory.Material => ("MaterialIcon", "MaterialBrush"),
EAssetCategory.MaterialEditorData => ("MaterialIcon", "MaterialEditorBrush"),
EAssetCategory.MaterialParameterCollection => ("MaterialParameterCollectionIcon", "MaterialBrush"),
EAssetCategory.MaterialFunction => ("MaterialFunctionIcon", "MaterialBrush"),
EAssetCategory.MaterialFunctionEditorData => ("MaterialFunctionIcon", "MaterialEditorBrush"),
EAssetCategory.Animation => ("AnimationIconAlt", "AnimationBrush"),
EAssetCategory.Skeleton => ("SkeletonIcon", "NeutralBrush"),
EAssetCategory.Rig => ("AnimationIconAlt", "NeutralBrush"),
EAssetCategory.World => ("WorldIcon", "WorldBrush"),
EAssetCategory.BuildData => ("MapIconAlt", "BuildDataBrush"),
EAssetCategory.LevelSequence => ("ClapperIcon", "LevelSequenceBrush"),
EAssetCategory.Foliage => ("FoliageIcon", "FoliageBrush"),
EAssetCategory.PhysicsAsset => ("PhysicsIcon", "NeutralBrush"),
EAssetCategory.CurveBase => ("CurveIcon", "CurveBrush"),
EAssetCategory.ItemDefinitionBase => ("DataTableIcon", "NeutralBrush"),
EAssetCategory.CurveBase => ("CurveIcon", "CurveBrush"),
EAssetCategory.PhysicsAsset => ("PhysicsIcon", "NeutralBrush"),
EAssetCategory.ObjectRedirector => ("RedirectorIcon", "ConfigBrush"),
EAssetCategory.PhysicalMaterial => ("MaterialIcon", "NeutralBrush"),
EAssetCategory.Audio => ("AudioIconAlt", "AudioBrush"),
EAssetCategory.SoundBank => ("AudioIconAlt", "SoundBankBrush"),
EAssetCategory.AudioEvent => ("AudioIconAlt", "AudioEventBrush"),
EAssetCategory.Video => ("VideoIcon", "VideoBrush"),
EAssetCategory.Font => ("FontIcon", "NeutralBrush"),
@ -73,6 +82,8 @@ public class FileToGeometryConverter : IMultiValueConverter
_ => ("DataTableIcon", "NeutralBrush")
},
EAssetCategory.ByteCode => ("CodeIcon", "CodeBrush"),
_ => ("AssetIcon", "NeutralBrush")
};

View File

@ -21,7 +21,9 @@ public class FolderToGeometryConverter : IValueConverter
{
"textures" or "texture" or "ui" or "icons" or "umgassets" or "hud" or "hdri" or "tex" => ("TextureIconAlt", "TextureBrush"),
"config" or "tags" => ("ConfigIcon", "ConfigBrush"),
"audio" or "wwiseaudio" or "wwise" or "fmod" or "soundbanks" or "banks" or "sound" or "sounds" or "cue" => ("AudioIconAlt", "AudioBrush"),
"audio" or "wwiseaudio" or "wwise" or "fmod" or "sound" or "sounds" or "cue" => ("AudioIconAlt", "AudioBrush"),
"soundbanks" or "banks" => ("AudioIconAlt", "SoundBankBrush"),
"audioevent" or "audioevents" => ("AudioIconAlt", "AudioEventBrush"),
"movies" or "video" or "videos" or "cinematics" => ("VideoIcon", "VideoBrush"),
"data" or "datatable" or "datatables" => ("DataTableIcon", "DataTableBrush"),
"curves" => ("CurveIcon", "CurveBrush"),
@ -39,6 +41,7 @@ public class FolderToGeometryConverter : IValueConverter
"locale" or "localization" or "l10n" => ("LocaleIcon", "LocalizationBrush"),
"skeleton" or "skeletons" => ("SkeletonIcon", "NeutralBrush"),
"certificate" or "certificates" => ("CertificateIcon", "NeutralBrush"),
"fonts" or "font" => ("FontIcon", "NeutralBrush"),
_ => (null, "NeutralBrush"),
};

View File

@ -90,4 +90,6 @@
<Geometry x:Key="FoliageIcon">m397.529,58.225c-37.359,0-72.27,11.235-100.957,32.49-25.401,18.819-44.228,44.84-51.653,71.391-8.498,30.386-1.593,57.841 18.431,75.96-6.892,12.102-13.298,24.592-18.372,36.707-4.66-11.592-10.865-21.973-17.882-31.224 9.949-15.808 11.327-35.12 3.511-54.911-7.36-18.635-22.266-35.818-41.974-48.386-21.258-13.556-46.288-20.721-72.383-20.721-33.485,0-67.836,12.078-99.338,34.928l-16.912,12.268 20.162,5.478c33.26,9.036 59.805,34.679 83.225,57.303 23.91,23.098 46.495,44.914 72.659,44.921 0.004,0 0.008,0 0.012,0 12.875,0 25.18-5.146 37.498-15.667 11.82,16.664 20.228,37.094 20.228,61.938v127h20c0,0 0.018-122.778 0.018-129.384 0-15.96 9.362-39.486 26.042-68.882 12.387,6.689 23.962,9.954 35.235,9.954 36.76,0 60.665-35.173 85.974-72.41 22.59-33.238 48.194-70.911 86.29-90.421l18.581-9.516-19.061-8.516c-30.153-13.47-60.209-20.3-89.334-20.3zm-221.471,196.203c-0.002,0-0.004,0-0.007,0-18.085-0.005-36.938-18.218-58.768-39.306-20.663-19.961-43.588-42.108-72.305-55.135 23.345-13.586 47.248-20.456 71.272-20.456 48.227,0 84.676,28.4 95.755,56.453 2.869,7.266 5.835,19.295 0.99,31.335-17.942-18.216-37.69-30.663-49.979-38.408-3.594-2.266-6.698-4.222-8.771-5.695l-11.59,16.299c2.526,1.797 5.85,3.892 9.697,6.316 12.659,7.979 31.868,20.09 48.451,37.523-8.638,7.436-16.76,11.074-24.745,11.074zm208.452-78.693c-23.213,34.155-43.261,63.652-69.432,63.652-7.676,0-15.897-2.358-24.996-7.165 0.894-1.439 1.797-2.886 2.722-4.348 19.815-31.329 39.938-56.696 40.139-56.949l-15.649-12.454c-1.715,2.155-22.828,28.846-43.394,61.905-12.095-13.03-15.666-31.622-9.72-52.884 6.252-22.354 22.397-44.482 44.298-60.708 17.584-13.028 47.309-28.56 89.051-28.56 20.458,0 41.53,3.779 62.861,11.258-32.716,22.745-55.46,56.209-75.88,86.253z</Geometry>
<Geometry x:Key="MaterialParameterCollectionIcon">M165.446 34.793c-23.17.023-45.634 12.97-54.612 36.323l-83.67 326.167c-12.673 94.537 81.04 88.742 137.957 65.396 81.422-33.396 181.723-29.213 263.244-8.26l6.45-17.218c-7.38-2.638-15.334-5.988-22.252-8.039.473-4.364.955-8.72 1.437-13.074l23.038 4.118 3.234-18.1c-8.074-1.441-16.147-2.885-24.221-4.328.615-5.403 1.238-10.799 1.87-16.189l22.134 3.278 2.693-18.186c-7.548-1.12-15.098-2.238-22.647-3.355.456-3.765.91-7.53 1.375-11.29 7.615 1.092 15.231 2.183 22.847 3.273l2.607-18.2-23.164-3.316c.46-3.593 1.29-9.988 1.76-13.577l22.781 2.55 2.045-17.57c-7.467-.834-14.935-1.671-22.402-2.508.783-5.767 1.917-11.182 2.728-16.943 7.67 1.12 15.341 2.244 23.012 3.368l2.31-17.139c-7.683-1.127-15.366-2.25-23.05-3.374.792-5.415 1.252-10.129 2.071-15.542 7.074 1.264 14.149 2.528 21.223 3.79l3.232-18.1-21.654-3.866c.736-4.676 1.473-9.35 2.23-14.026 6.978 1.673 13.955 3.347 20.932 5.022L465.276 208c-7.401-1.778-14.803-3.554-22.204-5.33a2809.25 2809.25 0 0 1 2.132-12.477c6.98 1.583 13.961 3.165 20.942 4.746l4.064-17.93c-7.271-1.65-14.543-3.298-21.815-4.946.769-4.267 1.55-8.535 2.342-12.805l20.742 5.151 4.431-17.843-21.751-5.405c.741-3.847 1.494-7.696 2.254-11.548l20.28 5.014 4.413-17.849-21.057-5.207a2444.47 2444.47 0 0 1 2.571-12.374c8.386 2.41 13.13 2.364 21.41 4.99L486 88.456c-83.808-26.776-179.25-33.22-244.192-6.453-24.337 114.036-37.305 221.4-68.032 338.64-3.407 13-14.47 21.89-27.342 28.064-27 11.608-64.033 13.778-84.63-4.91-10.971-10.34-16.174-27.036-12.467-47.579 2.303-12.762 10.883-21.986 20.834-26.378 19.749-7.074 43.492-4.25 58.893 7.95 12.463 9.302 12.318 38.283-3.882 31.82-9.639-6.17-1.964-11.851-8.615-17.378-11.6-7.428-26.42-10.872-38.972-5.57-5.564 2.455-8.887 5.737-10.166 12.822-2.94 16.29.685 24.996 6.985 30.933 18.333 13.49 45.279 10.495 64.068 1.712 10.045-4.82 16.277-11.436 17.511-16.147 30.538-116.518 43.443-224.123 68.293-339.964-11.796-28.344-35.67-41.247-58.84-41.225z M341 395l-36 -40 -45 20 3 -13 24 -11c5,-2 9,-4 11,-5 -2,-2 -5,-5 -8,-8l-19 -21 2 -12 33 36 49 -22 -3 13 -33 15c-2,1 -4,2 -6,2 2,2 4,4 5,5l24 26 -3 13zm-15 -177l-10 54 -9 -2 10 -54 9 2zm25 5l-10 54 -9 -2 10 -54 9 2zm39 -76l-2 10 -64 -12c2,3 4,6 5,11 2,4 3,8 3,12l-10 -2c-2,-6 -4,-12 -7,-17 -3,-5 -6,-9 -9,-11l1 -6 82 16z</Geometry>
<Geometry x:Key="CertificateIcon">M4,3C2.89,3 2,3.89 2,5V15A2,2 0 0,0 4,17H12V22L15,19L18,22V17H20A2,2 0 0,0 22,15V8L22,6V5A2,2 0 0,0 20,3H16V3H4M12,5L15,7L18,5V8.5L21,10L18,11.5V15L15,13L12,15V11.5L9,10L12,8.5V5M4,5H9V7H4V5M4,9H7V11H4V9M4,13H9V15H4V13Z</Geometry>
<Geometry x:Key="RedirectorIcon">M289.718,1208.22 L283.795,1202.28 C283.404,1201.89 282.768,1201.89 282.376,1202.28 C281.984,1202.68 282,1203.35 282,1204 L282,1207 L266,1207 L266,1204 C266,1203.35 266.016,1202.68 265.624,1202.28 C265.232,1201.89 264.597,1201.89 264.205,1202.28 L258.282,1208.22 C258.073,1208.43 257.983,1208.71 257.998,1208.98 C257.983,1209.26 258.073,1209.54 258.282,1209.75 L264.205,1215.69 C264.597,1216.08 265.232,1216.08 265.624,1215.69 C266.016,1215.29 266,1214.39 266,1214 L266,1211 L282,1211 L282,1214 C282,1214.65 281.984,1215.29 282.376,1215.69 C282.768,1216.08 283.404,1216.08 283.795,1215.69 L289.718,1209.75 C289.927,1209.54 290.017,1209.26 290.002,1208.98 C290.017,1208.71 289.927,1208.43 289.718,1208.22</Geometry>
<Geometry x:Key="CodeIcon">M13,9H18.5L13,3.5V9M6,2H14L20,8V20A2,2 0 0,1 18,22H6C4.89,22 4,21.1 4,20V4C4,2.89 4.89,2 6,2M6.12,15.5L9.86,19.24L11.28,17.83L8.95,15.5L11.28,13.17L9.86,11.76L6.12,15.5M17.28,15.5L13.54,11.76L12.12,13.17L14.45,15.5L12.12,17.83L13.54,19.24L17.28,15.5Z</Geometry>
</ResourceDictionary>

View File

@ -215,25 +215,48 @@
</Style.Triggers>
</Style>
<Style x:Key="AssetsFolderTreeView" TargetType="TreeView" BasedOn="{StaticResource {x:Type TreeView}}">
<Setter Property="ItemsSource" Value="{Binding CUE4Parse.AssetsFolder.FoldersView, IsAsync=True}" />
<Setter Property="adonisExtensions:ScrollViewerExtension.VerticalScrollBarExpansionMode" Value="NeverExpand"/>
<Setter Property="adonisExtensions:ScrollViewerExtension.VerticalScrollBarPlacement" Value="Docked"/>
<Setter Property="adonisExtensions:ScrollViewerExtension.HorizontalScrollBarExpansionMode" Value="NeverExpand"/>
<Setter Property="adonisExtensions:ScrollViewerExtension.HorizontalScrollBarPlacement" Value="Docked"/>
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
<Style x:Key="AssetsFolderTreeView"
TargetType="TreeView"
BasedOn="{StaticResource {x:Type TreeView}}">
<Setter Property="ItemsSource"
Value="{Binding CUE4Parse.AssetsFolder.FoldersView, IsAsync=True}" />
<Setter Property="adonisExtensions:ScrollViewerExtension.VerticalScrollBarExpansionMode"
Value="NeverExpand" />
<Setter Property="adonisExtensions:ScrollViewerExtension.VerticalScrollBarPlacement"
Value="Docked" />
<Setter Property="adonisExtensions:ScrollViewerExtension.HorizontalScrollBarExpansionMode"
Value="NeverExpand" />
<Setter Property="adonisExtensions:ScrollViewerExtension.HorizontalScrollBarPlacement"
Value="Docked" />
<Setter Property="HorizontalContentAlignment"
Value="Stretch" />
<Setter Property="ItemTemplate">
<Setter.Value>
<HierarchicalDataTemplate ItemsSource="{Binding FoldersView, IsAsync=True}">
<StackPanel Orientation="Horizontal">
<Image x:Name="TreeImage" Source="/FModel;component/Resources/folder.png"
Width="16" Height="16" HorizontalAlignment="Center" Margin="0 0 3.5 0" />
<Border x:Name="TreeBadge" CornerRadius="5" Height="10" MinWidth="10" Background="#705542"
Margin="-10.5 0 4.5 0" VerticalAlignment="Bottom">
<TextBlock Text="{Binding AssetsList.Assets.Count}" Margin="2.5 0 2.5 0" Padding="1 0 0 0"
FontSize="7" Foreground="White" VerticalAlignment="Center" HorizontalAlignment="Center" />
<Image x:Name="TreeImage"
Source="/FModel;component/Resources/folder.png"
Width="16"
Height="16"
HorizontalAlignment="Center"
Margin="0 0 3.5 0" />
<Border x:Name="TreeBadge"
CornerRadius="5"
Height="10"
MinWidth="10"
Background="#705542"
Margin="-10.5 0 4.5 0"
VerticalAlignment="Bottom">
<TextBlock Text="{Binding AssetsList.Assets.Count}"
Margin="2.5 0 2.5 0"
Padding="1 0 0 0"
FontSize="7"
Foreground="White"
VerticalAlignment="Center"
HorizontalAlignment="Center" />
</Border>
<TextBlock Text="{Binding Header}" HorizontalAlignment="Left">
<TextBlock Text="{Binding Header}"
HorizontalAlignment="Left">
<TextBlock.ToolTip>
<ToolTip>
<TextBlock>
@ -250,119 +273,233 @@
</TextBlock>
</StackPanel>
<HierarchicalDataTemplate.Triggers>
<DataTrigger Binding="{Binding FoldersView.Count}" Value="0">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/empty_folder.png" />
<DataTrigger Binding="{Binding FoldersView.Count}"
Value="0">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/empty_folder.png" />
</DataTrigger>
<DataTrigger Binding="{Binding AssetsList.Assets.Count}" Value="0">
<Setter TargetName="TreeBadge" Property="Visibility" Value="Collapsed" />
<DataTrigger Binding="{Binding AssetsList.Assets.Count}"
Value="0">
<Setter TargetName="TreeBadge"
Property="Visibility"
Value="Collapsed" />
</DataTrigger>
<DataTrigger Binding="{Binding Header}" Value="Config">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/gear.png" />
<DataTrigger Binding="{Binding Header}"
Value="Config">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/gear.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header}" Value="Plugins">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/puzzle.png" />
<DataTrigger Binding="{Binding Header}"
Value="Plugins">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/puzzle.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header}" Value="Windows">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/windows.png" />
<DataTrigger Binding="{Binding Header}"
Value="Windows">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/windows.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header}" Value="Android">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/android.png" />
<DataTrigger Binding="{Binding Header}"
Value="Android">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/android.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header}" Value="IOS">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/apple.png" />
<DataTrigger Binding="{Binding Header}"
Value="IOS">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/apple.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header}" Value="Mac">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/apple.png" />
<DataTrigger Binding="{Binding Header}"
Value="Mac">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/apple.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header}" Value="Linux">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/linux.png" />
<DataTrigger Binding="{Binding Header}"
Value="Linux">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/linux.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header}" Value="LinuxAArch64">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/linux.png" />
<DataTrigger Binding="{Binding Header}"
Value="LinuxAArch64">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/linux.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header}" Value="Unix">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/unix.png" />
<DataTrigger Binding="{Binding Header}"
Value="Unix">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/unix.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header}" Value="Weapons">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/weapon.png" />
<DataTrigger Binding="{Binding Header}"
Value="Weapons">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/weapon.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header}" Value="Localization">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/localization.png" />
<DataTrigger Binding="{Binding Header}"
Value="Localization">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/localization.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header}" Value="Internationalization">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/localization.png" />
<DataTrigger Binding="{Binding Header}"
Value="Internationalization">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/localization.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header}" Value="UI">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/ui.png" />
<DataTrigger Binding="{Binding Header}"
Value="UI">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/ui.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header}" Value="Sounds">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/sound.png" />
<DataTrigger Binding="{Binding Header}"
Value="Sounds">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/sound.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header}" Value="2dAssets">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/texture.png" />
<DataTrigger Binding="{Binding Header}"
Value="2dAssets">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/texture.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header}" Value="Textures">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/texture.png" />
<DataTrigger Binding="{Binding Header}"
Value="Textures">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/texture.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header}" Value="Engine">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/engine.png" />
<DataTrigger Binding="{Binding Header}"
Value="Engine">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/engine.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header}" Value="EngineContent">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/engine.png" />
<DataTrigger Binding="{Binding Header}"
Value="EngineContent">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/engine.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header}" Value="Platforms">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/pc.png" />
<DataTrigger Binding="{Binding Header}"
Value="Platforms">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/pc.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header}" Value="Fortnite">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/fortnite.png" />
<DataTrigger Binding="{Binding Header}"
Value="Fortnite">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/fortnite.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header}" Value="FortniteGame">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/fortnitebr.png" />
<DataTrigger Binding="{Binding Header}"
Value="FortniteGame">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/fortnitebr.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header}" Value="WorldExplorers">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/battlebreakers.png" />
<DataTrigger Binding="{Binding Header}"
Value="WorldExplorers">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/battlebreakers.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header}" Value="OakGame">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/borderlands.png" />
<DataTrigger Binding="{Binding Header}"
Value="OakGame">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/borderlands.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header}" Value="ShooterGame">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/valorant.png" />
<DataTrigger Binding="{Binding Header}"
Value="ShooterGame">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/valorant.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header}" Value="RogueCompany">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/roguecompany.png" />
<DataTrigger Binding="{Binding Header}"
Value="RogueCompany">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/roguecompany.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header}" Value="g3">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/spellbreak.png" />
<DataTrigger Binding="{Binding Header}"
Value="g3">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/spellbreak.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header}" Value="SwGame">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/fallenorder.png" />
<DataTrigger Binding="{Binding Header}"
Value="SwGame">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/fallenorder.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header}" Value="Prospect">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/thecycle.png" />
<DataTrigger Binding="{Binding Header}"
Value="Prospect">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/thecycle.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header}" Value="Materials">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/materialicon.png" />
<DataTrigger Binding="{Binding Header}"
Value="Materials">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/materialicon.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header, Converter={x:Static converters:CaseInsensitiveStringEqualsConverter.Instance}, ConverterParameter='Blueprints'}" Value="True">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/blueprint.png" />
<DataTrigger Binding="{Binding Header, Converter={x:Static converters:CaseInsensitiveStringEqualsConverter.Instance}, ConverterParameter='Blueprints'}"
Value="True">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/blueprint.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header}" Value="Cinematics">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/cinematics.png" />
<DataTrigger Binding="{Binding Header}"
Value="Cinematics">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/cinematics.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header}" Value="Movies">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/cinematics.png" />
<DataTrigger Binding="{Binding Header}"
Value="Movies">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/cinematics.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header}" Value="Audio">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/sound.png" />
<DataTrigger Binding="{Binding Header}"
Value="Audio">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/sound.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header}" Value="Creative">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/creative.png" />
<DataTrigger Binding="{Binding Header}"
Value="Creative">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/creative.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header}" Value="Athena">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/athena.png" />
<DataTrigger Binding="{Binding Header}"
Value="Athena">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/athena.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Header, Converter={x:Static converters:CaseInsensitiveStringEqualsConverter.Instance}, ConverterParameter='StateOfDecay2'}" Value="True">
<Setter TargetName="TreeImage" Property="Source" Value="/FModel;component/Resources/stateofdecay2.png" />
<DataTrigger Binding="{Binding Header, Converter={x:Static converters:CaseInsensitiveStringEqualsConverter.Instance}, ConverterParameter='StateOfDecay2'}"
Value="True">
<Setter TargetName="TreeImage"
Property="Source"
Value="/FModel;component/Resources/stateofdecay2.png" />
</DataTrigger>
</HierarchicalDataTemplate.Triggers>
</HierarchicalDataTemplate>
@ -370,25 +507,32 @@
</Setter>
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style TargetType="{x:Type TreeViewItem}" BasedOn="{StaticResource TreeViewItemStyle}">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
<Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
<Setter Property="ContextMenu" Value="{StaticResource FolderContextMenu}" />
<Setter Property="controls:TreeViewItemBehavior.IsBroughtIntoViewWhenSelected" Value="True"/>
<Setter Property="Padding" Value="5 3" />
<Style TargetType="{x:Type TreeViewItem}"
BasedOn="{StaticResource TreeViewItemStyle}">
<Setter Property="HorizontalContentAlignment"
Value="Stretch" />
<Setter Property="IsSelected"
Value="{Binding IsSelected, Mode=TwoWay}" />
<Setter Property="IsExpanded"
Value="{Binding IsExpanded, Mode=TwoWay}" />
<Setter Property="ContextMenu"
Value="{StaticResource FolderContextMenu}" />
<Setter Property="controls:TreeViewItemBehavior.IsBroughtIntoViewWhenSelected"
Value="True" />
<Setter Property="Padding"
Value="5 3" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TreeViewItem">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition/>
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<Border x:Name="Border"
@ -398,7 +542,7 @@
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="{TemplateBinding adonisExtensions:CornerRadiusExtension.CornerRadius}"/>
CornerRadius="{TemplateBinding adonisExtensions:CornerRadiusExtension.CornerRadius}" />
<Border x:Name="SpotlightLayer"
Grid.Row="0"
@ -409,7 +553,7 @@
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="{TemplateBinding adonisExtensions:CornerRadiusExtension.CornerRadius}"
adonisExtensions:CursorSpotlightExtension.MouseEventSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=TreeViewItem}}"
SnapsToDevicePixels="False"/>
SnapsToDevicePixels="False" />
<ToggleButton x:Name="Expander"
Grid.Row="0"
@ -425,9 +569,13 @@
<ToggleButton.Template>
<ControlTemplate TargetType="ToggleButton">
<Border Background="Transparent">
<Viewbox Width="16" Height="16" HorizontalAlignment="Center">
<Canvas Width="24" Height="24">
<Path Fill="{TemplateBinding Foreground}" Data="{StaticResource ArrowIcon}"/>
<Viewbox Width="16"
Height="16"
HorizontalAlignment="Center">
<Canvas Width="24"
Height="24">
<Path Fill="{TemplateBinding Foreground}"
Data="{StaticResource ArrowIcon}" />
</Canvas>
</Viewbox>
</Border>
@ -435,15 +583,16 @@
</ToggleButton.Template>
<ToggleButton.Margin>
<MultiBinding Converter="{x:Static adonisConverters:ValuesToThicknessConverter.Instance}">
<Binding Path="Padding.Left" RelativeSource="{RelativeSource TemplatedParent}"/>
<Binding Source="0"/>
<Binding Source="8"/>
<Binding Source="0"/>
<Binding Path="Padding.Left"
RelativeSource="{RelativeSource TemplatedParent}" />
<Binding Source="0" />
<Binding Source="8" />
<Binding Source="0" />
</MultiBinding>
</ToggleButton.Margin>
<ToggleButton.RenderTransform>
<RotateTransform x:Name="ExpanderRotateTransform"
Angle="-90"/>
Angle="-90" />
</ToggleButton.RenderTransform>
</ToggleButton>
@ -459,9 +608,12 @@
<system:Double>-5</system:Double>
</Binding.Source>
</Binding>
<Binding Path="Padding.Top" RelativeSource="{RelativeSource TemplatedParent}"/>
<Binding Path="Padding.Right" RelativeSource="{RelativeSource TemplatedParent}"/>
<Binding Path="Padding.Bottom" RelativeSource="{RelativeSource TemplatedParent}"/>
<Binding Path="Padding.Top"
RelativeSource="{RelativeSource TemplatedParent}" />
<Binding Path="Padding.Right"
RelativeSource="{RelativeSource TemplatedParent}" />
<Binding Path="Padding.Bottom"
RelativeSource="{RelativeSource TemplatedParent}" />
</MultiBinding>
</ContentPresenter.Margin>
</ContentPresenter>
@ -469,22 +621,26 @@
<ItemsPresenter x:Name="ItemsHost"
Grid.Row="1"
Grid.Column="1"
Grid.ColumnSpan="2"/>
Grid.ColumnSpan="2" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsExpanded" Value="False">
<Setter TargetName="ItemsHost" Property="Visibility" Value="Collapsed"/>
<Trigger Property="IsExpanded"
Value="False">
<Setter TargetName="ItemsHost"
Property="Visibility"
Value="Collapsed" />
</Trigger>
<Trigger Property="IsExpanded" Value="True">
<Trigger Property="IsExpanded"
Value="True">
<Trigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Angle"
Storyboard.TargetName="ExpanderRotateTransform"
Duration="00:00:0.2"
To="-45"/>
To="-45" />
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
@ -494,14 +650,17 @@
<DoubleAnimation Storyboard.TargetProperty="Angle"
Storyboard.TargetName="ExpanderRotateTransform"
Duration="00:00:0.2"
From="-45"/>
From="-45" />
</Storyboard>
</BeginStoryboard>
</Trigger.ExitActions>
</Trigger>
<Trigger Property="HasItems" Value="False">
<Setter TargetName="Expander" Property="Visibility" Value="Hidden"/>
<Trigger Property="HasItems"
Value="False">
<Setter TargetName="Expander"
Property="Visibility"
Value="Hidden" />
</Trigger>
</ControlTemplate.Triggers>
@ -512,78 +671,15 @@
</Setter.Value>
</Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding Items.Count, RelativeSource={RelativeSource Self}, FallbackValue=0}" Value="0">
<DataTrigger Binding="{Binding Items.Count, RelativeSource={RelativeSource Self}, FallbackValue=0}"
Value="0">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Grid>
<TextBlock Text="No folders found in archives, make sure you loaded at least one" FontWeight="SemiBold" TextAlignment="Center"
Foreground="{DynamicResource {x:Static adonisUi:Brushes.ErrorBrush}}" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
<Style x:Key="AssetsListBox" TargetType="ListBox" BasedOn="{StaticResource {x:Type ListBox}}">
<Setter Property="ItemsSource" Value="{Binding SelectedItem.AssetsList.AssetsView, ElementName=AssetsFolderName, IsAsync=True}" />
<Setter Property="SelectionMode" Value="Extended" />
<Setter Property="ContextMenu" Value="{StaticResource FileContextMenu}" />
<Setter Property="VirtualizingPanel.IsVirtualizing" Value="True" />
<Setter Property="VirtualizingPanel.VirtualizationMode" Value="Recycling" />
<Setter Property="adonisExtensions:ScrollViewerExtension.VerticalScrollBarExpansionMode" Value="NeverExpand"/>
<Setter Property="adonisExtensions:ScrollViewerExtension.VerticalScrollBarPlacement" Value="Docked"/>
<Setter Property="adonisExtensions:ScrollViewerExtension.HorizontalScrollBarExpansionMode" Value="NeverExpand"/>
<Setter Property="adonisExtensions:ScrollViewerExtension.HorizontalScrollBarPlacement" Value="Docked"/>
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Image x:Name="ListImage" Source="/FModel;component/Resources/unknown_asset.png"
Width="16" Height="16" HorizontalAlignment="Center" Margin="0 0 3 0" />
<TextBlock Grid.Column="1" HorizontalAlignment="Left" Text="{Binding Asset.Name}" />
</Grid>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Asset.Extension}" Value="uasset">
<Setter TargetName="ListImage" Property="Source" Value="/FModel;component/Resources/asset.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Asset.Extension}" Value="ini">
<Setter TargetName="ListImage" Property="Source" Value="/FModel;component/Resources/asset_ini.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Asset.Extension}" Value="png">
<Setter TargetName="ListImage" Property="Source" Value="/FModel;component/Resources/asset_png.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Asset.Extension}" Value="psd">
<Setter TargetName="ListImage" Property="Source" Value="/FModel;component/Resources/asset_psd.png" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</Setter.Value>
</Setter>
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource {x:Type ListBoxItem}}">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
<Setter Property="Padding" Value="5 3" />
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
<Setter Property="controls:ListBoxItemBehavior.IsBroughtIntoViewWhenSelected" Value="True" />
</Style>
</Setter.Value>
</Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding Items.Count, RelativeSource={RelativeSource Self}, FallbackValue=0}" Value="0">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Grid>
<TextBlock Text="No packages found in folder" FontWeight="SemiBold" TextAlignment="Center"
<TextBlock Text="No folders found in archives, make sure you loaded at least one"
FontWeight="SemiBold"
TextAlignment="Center"
Foreground="{DynamicResource {x:Static adonisUi:Brushes.ErrorBrush}}" />
</Grid>
</ControlTemplate>
@ -1976,4 +2072,79 @@
</Setter>
</Style>
<Style x:Key="AssetsExplorerToggleButtonStyle"
TargetType="ToggleButton">
<Setter Property="Background"
Value="{DynamicResource {x:Static adonisUi:Brushes.Layer1BackgroundBrush}}" />
<Setter Property="BorderBrush"
Value="{DynamicResource {x:Static adonisUi:Brushes.Layer3BackgroundBrush}}" />
<Setter Property="BorderThickness"
Value="1" />
<Setter Property="Padding"
Value="4" />
<Setter Property="ToolTip">
<Setter.Value>
<ToolTip Content="{Binding SwitchAssetExplorer, Source={x:Static settings:UserSettings.Default}}"
ContentStringFormat="Assets Explorer ({0})" />
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ToggleButton">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="8">
<Viewbox Width="18"
Height="18">
<Canvas Width="24"
Height="24">
<Path x:Name="IconPath"
Data="{StaticResource FolderIconAlt}"
Fill="{DynamicResource {x:Static adonisUi:Brushes.ForegroundBrush}}" />
</Canvas>
</Viewbox>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked"
Value="True">
<Setter TargetName="IconPath"
Property="Data"
Value="{StaticResource FolderIconAlt}" />
<Setter Property="Background"
Value="{DynamicResource {x:Static adonisUi:Brushes.AccentBrush}}" />
</Trigger>
<Trigger Property="IsChecked"
Value="False">
<Setter TargetName="IconPath"
Property="Data"
Value="{StaticResource AssetIcon}" />
<Setter Property="Background"
Value="{DynamicResource {x:Static adonisUi:Brushes.Layer1BackgroundBrush}}" />
</Trigger>
<Trigger Property="IsChecked"
Value="False">
<Setter TargetName="IconPath"
Property="Data"
Value="{StaticResource AssetIcon}" />
<Setter Property="Background"
Value="{DynamicResource {x:Static adonisUi:Brushes.Layer1BackgroundBrush}}" />
<Setter Property="ToolTip">
<Setter.Value>
<ToolTip Content="{Binding SwitchAssetExplorer, Source={x:Static settings:UserSettings.Default}}"
ContentStringFormat="File Properties ({0})" />
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="IsMouseOver"
Value="True">
<Setter Property="Background"
Value="{DynamicResource {x:Static adonisUi:Brushes.Layer3BackgroundBrush}}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

View File

@ -197,7 +197,7 @@
</Viewbox>
</MenuItem.Icon>
<MenuItem.IsEnabled>
<Binding Path="PlacementTarget.DataContext" RelativeSource="{RelativeSource AncestorType=ContextMenu}">
<Binding Path="PlacementTarget.SelectedItem" RelativeSource="{RelativeSource AncestorType=ContextMenu}">
<Binding.Converter>
<converters:GameFileMeetsConditionConverter>
<converters:GameFileMeetsConditionConverter.Conditions>

View File

@ -43,9 +43,6 @@ public partial class SearchView
public void FocusTab(ESearchViewTab view)
{
if (_currentTab == view)
return;
_currentTab = view;
SearchTabControl.SelectedIndex = view switch
{
@ -53,6 +50,7 @@ public partial class SearchView
ESearchViewTab.RefView => 1,
_ => SearchTabControl.SelectedIndex
};
WindowState = WindowState.Normal;
CurrentTextBox?.Focus();
CurrentTextBox?.SelectAll();
}

View File

@ -247,7 +247,7 @@ public class Options
{
return _game switch
{
"LIESOFP" => true,
"LIESOFP" or "CODEVEIN2" => true,
_ => false,
};
}