Cross-platform Stride.Launcher#3027
Conversation
7b72320 to
03f94a4
Compare
| /// Returns path of Launcher (we can't use Assembly.GetEntryAssembly().Location in .NET Core, especially with self-publish). | ||
| /// </summary> | ||
| /// <returns></returns> | ||
| internal static string? GetExecutablePath() => Environment.ProcessPath; |
There was a problem hiding this comment.
nitpick: Could this property not be used directly?
There was a problem hiding this comment.
I think I just replaced code from the previous implementation to make it cross-platform without changing the overall structure. We could inline it manually.
On the other hand, the method name is a bit more explicit. It's likely inlined anyway by the compiler, so it's just a matter of preference.
| } | ||
|
|
||
| // Avalonia configuration, don't remove; also used by visual designer. | ||
| public static AppBuilder BuildAvaloniaApp() |
There was a problem hiding this comment.
nitpick: This method seems to be unused. It would be great to integrate with RunNewApp somehow
There was a problem hiding this comment.
It's used by the Avalonia plugin. It's needed for the designer.
03f94a4 to
e96d938
Compare
|
@Jklawreszuk I have merged back master to this PR's branch. It's mostly working but it would be nice to also support (un-)installing the Stride packages on Linux even if we can't fully use it there yet. Did you want to contribute to it? The branch is on this repo, so feel free to push commits if you want. |
|
I am sorry, but it took some time to review all the files.Overall, it looks great! A quite accurate implementation of the original Launcher. However, I have a few comments:
Other than that I didnt notice nothing unusual 😅 |
|
@Kryptos-FR Once the changes have been merged, I will try to adapt Launcher to Linux if necessary. But I think that installing/uninstalling packages works correctly, no? |
|
I don't remember if it does work. I assume since it's restoring packages it should. I guess we'll know soon. |
e96d938 to
e161999
Compare
ab329f3 to
482bd28
Compare
Use MarkView.Avalonia library for markdown
e161999 to
4950387
Compare
|
@Kryptos-FR Have you tested it on Windows? It seems to work fine on Linux. They only issue I see is the empty button in the release notes page |
Complete the launcher README with build, versioning and layout notes, and add a hub-and-spoke documentation set under docs/launcher/ covering architecture, view models, views, version management, self-update, settings, localization, packaging, lifecycle and cross-platform notes.
Captures the full delta between the current Avalonia branch and the WPF launcher on master — including silent regressions that are not marked with TODO/FIXME — and a phased roadmap to close the gap for cross-platform parity. Notes Stride.Metrics and PrivacyPolicyHelper as deliberate, permanent removals.
…ncher port roadmap Adds a test-infrastructure phase covering bootstrap of Stride.Launcher.Tests, view-model and Avalonia-headless integration tests, and CI wiring for both Windows and Linux.
…rsistence proposal
309b8af to
73d9945
Compare
|
@Jklawreszuk I have also tested on Linux. I fixed a few minors issues, though the phantom button remains. There are now a few docmentation files about the launcher. If you can review them, that would be nice. One of the document is a tracker for this current porting effort and will be removed once all tasks are completed. |
… versioning scheme
…wn ViewModelBase Copies the ViewModelBase implementation from Stride.Core.Presentation (minus IDestroyable/IViewModelServiceProvider) so the runner has no external MVVM dependency. Renames SetProperty → SetValue to match Stride's API.
System.Drawing.Common was previously imported as a dependency for Avalonia.
…uncement panels
- Root Grid gains ClipToBounds="True" so panels are hidden while off-screen.
- Release-notes Grid: IsVisible replaced by Classes.visible + TransformOperationsTransition
(translateX(2000px) → translateX(0), 1s CubicEaseOut). Selector anchored to class
rn-slide to prevent descendant Grids from inheriting the transform.
- Release-notes header: empty Button/TextBlock stubs replaced with a working close
button (ActiveReleaseNotes.ToggleCommand) and a version title TextBlock.
- Release-notes content Grid gains Margin="{StaticResource BorderThicknessTile}" (12px)
to match master's TileBorderThickness spacing.
- Release-notes DockPanel gains BackgroundTileAlpha background (matches master's
TileAlphaBackgroundBrush = #C0434343).
- Announcement Border: IsVisible replaced by Classes.visible + same transition approach,
selector anchored to class ann-slide.
- docs: mark Phase 3 items complete in port-status.md; correct two pre-existing
entries (CurrentToolTip and StaysOpenContextMenu) that were already implemented.
Master rewrote URLs ending in .md to .html before opening so docs links resolve to rendered pages instead of raw markdown source.
…ttingsService wrapper
…behind to ILauncherSettingsService
…Service in port-status
f5ba39f to
9f482bb
Compare
- InstallLatestVersion: add missing return after 'already in progress' dialog so DownloadCommand.Execute() is not called while a download is already running (MainViewModel.cs) - AnnouncementViewModel: clear MainViewModel.Announcement when Validated becomes true so the overlay actually slides out when the user clicks OK; the Announcement setter now subscribes/unsubscribes PropertyChanged on the incoming view model (MainViewModel.cs) - SelfUpdater: gate the force-reinstall probe inside if (OperatingSystem.IsWindows()); on Linux the probe was silently downloading StrideSetup.exe and then crashing at Process.Start (SelfUpdater.cs) docs/launcher/port-status.md updated with struck-through entries for all three fixes and the Phase 4 self-update item revised accordingly.
The commented-out RevokeAllPrivacyPolicy() call in UninstallAsync was a placeholder from the WPF-to-Avalonia port. Telemetry and the privacy-policy consent flow were permanently removed when the port started, so any residual registry keys or settings files left by the old WPF launcher are harmless orphans that do not need to be scrubbed. - Remove the commented line and its FIXME: xplat-launcher marker (Launcher.cs) - Update cross-platform.md: drop the 'keep it for now' note - Update port-status.md: mark Phase 2 item 4 closed; update the Deliberate changes table row for privacy policy
…pleted is intentional
MinimalApp.OnFrameworkInitializationCompleted is empty by design: the
crash-report and already-running-instance dialog paths in Launcher.cs
each construct and wire their window directly inside their own AppMain
callback, so no framework-level initialisation (no MainViewModel, no
markdown pipeline, no services) is needed.
- Update 'Features removed without a replacement' section to explain the
design rather than flag it as a concern
- Close Phase 2 item 3 ('Review MinimalApp paths')
… right-click offset Right-click events on the Button inside each row were not reliably bubbling up to the outer Border's ContextMenu on Linux. Moving the ContextMenu to the Button directly — and adding VerticalAlignment="Stretch" — ensures the menu opens wherever the row is visually hit-tested.
- Mark 'Show in Explorer' as fixed (cross-platform since commit c2555d0): update 'already ported' bullet and strike through the regression entry with the three-platform implementation detail - Correct slide animation duration from 0.5s to 1s in both the Fixed description and the Phase 3 roadmap entries (1s was intentional)

PR Details
New Launcher using Avalonia instead of WPF. Still needs some love.
Related Issue
#1503
Types of changes
Checklist