Unreal Engine Archives Explorer
Go to file
Rob Trame 1506c71665
feat(P2-004): migrate all 26 IValueConverter/IMultiValueConverter implementations to Avalonia (#71)
* feat(P2-004): migrate all 19 converters from WPF to Avalonia (#17)

Migrates every converter in FModel/Views/Resources/Converters/ off
System.Windows.Data / System.Windows.Markup / System.Windows.Shell
and onto Avalonia.Data.Converters equivalents.

Changes by converter:

Simple using-swap only (IValueConverter interface unchanged):
  AnyItemMeetsConditionConverter, CommitMessageConverter,
  DateTimeToDateConverter, FolderToSeparatorTagConverter,
  GameFileMeetsConditionConverter, InvertBooleanConverter,
  IsNullToBoolReversedConverter, RelativeDateTimeConverter,
  StringToGameConverter, TrimRightToLeftConverter

BoolToRenderModeConverter:
  System.Windows.Media.BitmapScalingMode → Avalonia.Media.Imaging.BitmapInterpolationMode
  (NearestNeighbor → None, Linear → HighQuality);
  typed helper method return type updated accordingly.

BorderThicknessToStrokeThicknessConverter:
  System.Windows.Thickness → Avalonia.Thickness (same properties).

InvertBoolToVisibilityConverter:
  Visibility.Visible/Collapsed/Hidden → bool; Avalonia uses IsVisible (bool).
  Hidden concept does not exist on Avalonia — both Collapsed and Hidden map to false.

RatioConverter:
  Removed MarkupExtension base class (PresentationFramework — Windows-only).
  Added Instance singleton; use {x:Static converters:RatioConverter.Instance} in XAML.

RatioToGridLengthConverter:
  System.Windows.GridLength/GridUnitType → Avalonia.GridLength/GridUnitType.
  IMultiValueConverter signature: object[] → IList<object?>, ConvertBack removed.

StatusToTaskbarStateConverter:
  Stubbed out — System.Windows.Shell.TaskbarItemProgressState has no cross-platform
  Avalonia equivalent. Returns null; tracked by TODO(P2-015).
  MarkupExtension removed; added Instance singleton.

TabSizeConverter:
  System.Windows.Controls.TabControl → Avalonia.Controls.TabControl.
  ActualWidth → Bounds.Width; Items.Count → ItemCount.
  IMultiValueConverter: object[] → IList<object?>, ConvertBack removed.

FileToGeometryConverter:
  System.Windows.Media.{Geometry,Brush} → Avalonia.Media.{Geometry,IBrush}.
  Application.Current.FindResource → Application.Current.TryGetResource(key, null, out var r).
  IMultiValueConverter: object[] → IList<object?>, ConvertBack removed.

FolderToGeometryConverter:
  Same Geometry/IBrush/TryGetResource changes as FileToGeometryConverter.

Already migrated (no changes):
  BoolToToggleConverter, CaseInsensitiveStringEqualsConverter,
  EndpointToTypeConverter, EnumToStringConverter, IsNotZeroConverter,
  MultiParameterConverter, SizeToStringConverter

Build: 1266 errors baseline → 1174 after this commit (92 fewer).
Zero errors introduced in Converters/.

* fix(P2-004): address PR #71 review findings

M1 (PR comment): FolderToGeometryConverter — remove duplicate if condition
  (copy-paste artifact: identical guard appeared twice consecutively)

M2 (PR comment): TabSizeConverter — two fixes
  - divisor guard: return 0 when ItemCount == 0 to prevent divide-by-zero
  - double.Parse now uses CultureInfo.InvariantCulture (XAML ConverterParameter
    values are always invariant-culture strings; avoids FormatException on
    locales that use comma as decimal separator)

PR comment: BoolToRenderModeConverter — typed helper Convert(bool) now
  implements the mapping directly instead of delegating to the interface
  method with null culture; eliminates fragile null-culture call chain

m2: StatusToTaskbarStateConverter — reverted from IMultiValueConverter back
  to IValueConverter to match the original WPF single-value binding contract
  (EStatusKind → TaskbarItemProgressState was always a single-value binding);
  also removed unused System.Collections.Generic using

m1: Aligned all ten 'simple-swap' IValueConverter implementations to use
  Avalonia-idiomatic nullable signatures (object? value, object? parameter,
  object? return) matching the Avalonia interface definition; previously these
  retained the non-nullable WPF-era signatures which were inconsistent with the
  nine converters already updated in the same commit

S1: Renamed InvertBoolToVisibilityConverter class → InvertBoolConverter to
  reflect that it returns bool (for IsVisible) not WPF Visibility;
  file rename is deferred pending terminal access
2026-03-14 15:40:56 -06:00
.github chore: update identity, branding, and CI for FModel Linux fork (#69) 2026-03-12 11:13:00 -06:00
.vscode Set up dev env 2026-03-11 15:51:34 -06:00
CUE4Parse@06fbf1aced chore: point CUE4Parse submodule at r6e/CUE4Parse-Linux (#66) 2026-03-11 19:49:17 -06:00
FModel feat(P2-004): migrate all 26 IValueConverter/IMultiValueConverter implementations to Avalonia (#71) 2026-03-14 15:40:56 -06:00
.editorconfig chore: update identity, branding, and CI for FModel Linux fork (#69) 2026-03-12 11:13:00 -06:00
.gitignore Finish setting up env 2026-03-11 17:28:01 -06:00
.gitmodules chore: point CUE4Parse submodule at r6e/CUE4Parse-Linux (#66) 2026-03-11 19:49:17 -06:00
LICENSE Re-add GPL-3 license 2021-05-22 16:33:08 -04:00
NOTICE chore: update identity, branding, and CI for FModel Linux fork (#69) 2026-03-12 11:13:00 -06:00
README.md chore: update identity, branding, and CI for FModel Linux fork (#69) 2026-03-12 11:13:00 -06:00

FModel Linux — Unreal Engine Archives Explorer for Linux

CI Status Latest


This is an unofficial Linux port of FModel, originally created by Asval (4sval) and contributors. It is not affiliated with or endorsed by the upstream project or its maintainers. Please do not report Linux-port-specific issues upstream.

Description

FModel Linux is a Linux port of FModel — an archive explorer for Unreal Engine games. It uses CUE4Parse as its core parsing library, providing robust support for the latest UE4 and UE5 archive formats, along with a comprehensive set of tools for previewing and converting game packages.

This fork replaces the Windows-only WPF UI stack with Avalonia UI and removes other Windows-specific dependencies to enable native Linux support. It is maintained by r6e.

Installation

Installation instructions for the Linux port are available in the project wiki (work in progress).

For the upstream Windows release, refer to the official FModel installation guide.

Supporting the Upstream Project

This fork does not accept donations. If you find FModel valuable, please consider supporting the original FModel project and its contributors.

License

FModel Linux is a derivative work licensed under GPL-3. The original FModel project is copyright © Asval and FModel contributors. Licenses of third-party libraries used are listed in NOTICE.