Unreal Engine Archives Explorer
Go to file
Rob Trame 58e5e3c74b
feat(aed): Replace ICSharpCode.AvalonEdit with AvaloniaEdit [P2-008] (#77)
* feat(aed): migrate ICSharpCode.AvalonEdit → AvaloniaEdit across all views

Replace all ICSharpCode.AvalonEdit.* references with AvaloniaEdit.*
throughout the codebase. This makes the text editor components
cross-platform by using the Avalonia port of the editor.

Files migrated (namespace-only change):
- Extensions/AvalonExtensions.cs
- Extensions/StringExtensions.cs
- ViewModels/TabControlViewModel.cs
- Views/Resources/Controls/EndpointEditor.xaml.cs
- Views/Resources/Controls/DictionaryEditor.xaml.cs
- Views/Resources/Controls/Aed/HexColorElementGenerator.cs
- Views/Resources/Controls/Aed/GamePathElementGenerator.cs
- Views/Resources/Controls/Aed/JumpElementGenerator.cs
- Views/Resources/Controls/Aed/BraceFoldingStrategy.cs

Files migrated (full API migration):
- Views/Resources/Controls/Aed/HexColorVisualLineText.cs
  - Add Avalonia.Media.TextFormatting using for TextRun
  - CreateTextRun: use base.CreateTextRun() + SetForegroundBrush()
  - Remove OnQueryCursor (no Avalonia equivalent)
- Views/Resources/Controls/Aed/GamePathVisualLineText.cs
  - Same CreateTextRun pattern
  - OnMouseDown → OnPointerPressed(PointerPressedEventArgs)
  - Keyboard.Modifiers → e.KeyModifiers parameter
- Views/Resources/Controls/Aed/JumpVisualLineText.cs
  - Same pattern as GamePathVisualLineText
- Views/Resources/Controls/PropertiesPopout.xaml.cs
  - WPF ToolTip → Avalonia ToolTip.SetTip/SetIsOpen
  - MouseEventArgs → PointerEventArgs
  - PointerWheelEventArgs (was PointerWheelChangedEventArgs)
  - OnPreviewMouseWheel: e.Delta.Y * 2.4
- Views/Resources/Controls/AvalonEditor.xaml
  - Namespaces: WPF → Avalonia + AvaloniaEdit
  - DataTrigger/ZIndex → IsVisible binding
  - AdonisUI watermark → built-in TextBox Watermark property
  - AdonisUI brush refs → ThemeForegroundBrush
  - ToolTip.Tip attribute syntax
  - Remove XAML-bound events (wired in constructor)
- Views/Resources/Controls/AvalonEditor.xaml.cs
  - Remove CommandBindings (WPF-only RoutedUICommand)
  - Wire events in constructor: PointerHover, PointerHoverStopped,
    PointerWheelChangedEvent (tunnel), PointerReleased
  - Key.System → Key.Left/Right + Alt modifier check
  - OnPointerWheelChanged with PointerWheelEventArgs

Closes #28

* fix(aed): address review findings and PR comments

Critical (C1):
- Migrate PropertiesPopout.xaml from WPF/AdonisUI to Avalonia Window.
  Root element: AdonisWindow → Window; namespaces updated; AdonisUI
  brushes/watermark/events removed; Width set to 800 (was SystemParameters
  screen-relative which has no Avalonia equivalent).

Major (M1):
- Wire PointerHover, PointerHoverStopped and tunnelling
  PointerWheelChangedEvent in PropertiesPopout constructor, since
  these events live on TextArea.TextView and cannot be bound in XAML
  as TextEditor event attributes.

Minor (Min1):
- Rename OnPreviewKeyDown → OnKeyDown in both AvalonEditor.xaml and
  .cs; the event is Avalonia KeyDown (bubble), not a WPF tunnel event.

PR comments:
- Fix TabItem ambiguity in AvalonEditor.xaml.cs: add using alias
  VmTabItem = FModel.ViewModels.TabItem and update all casts (was
  ambiguous with Avalonia.Controls.TabItem).
- Fix FModel.ViewModels.TabItem fully-qualified in PropertiesPopout
  constructor parameter (ViewModels.TabItem did not resolve in context).
- Brush leak in VisualLineText.CreateTextRun: add explicit else-branch
  TextRunProperties.SetForegroundBrush(null) so the separator token
  always resets to the default, preventing colour leakage if the
  shared TextRunProperties object is reused across invocations.
- Cache tooltip Border/TextBlock in both AvalonEditor and
  PropertiesPopout; update Background/Foreground/Text on each hover
  rather than allocating new controls each time.

Suggestion (S2):
- Remove no-op BraceFoldingStrategy constructor eager UpdateFoldings
  call (result was discarded; JsonFoldingStrategies.UpdateFoldings
  performs the actual FoldingManager installation).

* fix(aed): mark Ctrl+Scroll event handled to prevent scroll-through

Set e.Handled = true in OnPointerWheelChanged in both AvalonEditor
and PropertiesPopout so that Ctrl+Wheel resizes the font only, without
also scrolling the document content.

* fix(aed): remove unused TextEditor parameter from BraceFoldingStrategy

The constructor no longer uses its parameter after the eager
UpdateFoldings call was removed. Drop the parameter entirely and
update the single call site in JsonFoldingStrategies.
2026-03-15 17:25:11 -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(aed): Replace ICSharpCode.AvalonEdit with AvaloniaEdit [P2-008] (#77) 2026-03-15 17:25:11 -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.