Skip to content

Cross-platform Stride.Launcher#3276

Open
Kryptos-FR wants to merge 51 commits into
masterfrom
feature/launcher-avalonia-cherrypick
Open

Cross-platform Stride.Launcher#3276
Kryptos-FR wants to merge 51 commits into
masterfrom
feature/launcher-avalonia-cherrypick

Conversation

@Kryptos-FR

Copy link
Copy Markdown
Member

PR Details

New Launcher using Avalonia instead of WPF. Still needs some love.

(note: recreated from #3027 after history rewrite)

Related Issue

#1503

Types of changes

  • Docs change / refactoring / dependency upgrade
  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)

Checklist

  • My change requires a change to the documentation.
  • I have added tests to cover my changes.
  • All new and existing tests passed.
  • I have built and run the editor to try this change out.

Kryptos-FR and others added 30 commits April 21, 2026 13:10
Use MarkView.Avalonia library for markdown
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.
…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.
Kryptos-FR and others added 21 commits April 27, 2026 23:19
- 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)
- Add cross-platform IPC: Windows HWND broadcast + Linux named pipe
- Update launcher documentation (port-status.md, cross-platform.md)
- Add editor selector ComboBox to choose between WPF and Avalonia GameStudio
- Auto-install companion editor package (WPF/Avalonia) after primary install
- Query NuGet store directly for installed editor paths (works across sessions)
- Persist preferred editor choice in launcher settings
- Add EditorNameConverter for friendly display names
- Disable editor/framework selectors during install
- Update launcher documentation (port-status.md)
On Linux (and other non-Windows platforms):
- CanStart requires the Avalonia editor to be present; Start button stays
  greyed out for versions that only have a WPF (Stride.GameStudio) package.
- UpdateAvailableEditors re-evaluates CanStart after editor discovery,
  since UpdateStatus runs before AvailableEditors is populated.
- EditorNameConverter returns 'Game Studio' without '(Avalonia)' qualifier,
  as there is no WPF alternative to distinguish from.
- TryInstallCompanionsAsync skips the Stride.GameStudio (WPF) companion
  install on non-Windows platforms.

The EditorSelector ComboBox is already hidden when AvailableEditors.Count <= 1,
so the dropdown never appears on Linux.
- Drop all Xenko package references (Names.Xenko, GameStudioNames.Xenko,
  MainPackageIds entries for Xenko/Xenko.GameStudio) since backward
  compatibility with pre-Stride packages is no longer needed
- Simplify PackageFilterExtensions to only match Stride.GameStudio and
  Stride.GameStudio.Avalonia.Desktop
- Remove CheckDeprecatedSourcesCommand (prompted users to add the old
  Xenko NuGet source) and its AskAddNugetDeprecatedSource string resource
- Remove old Xenko executable fallback paths from StrideVersionViewModel
- Remove the 'Show/Hide beta versions' toggle button: it existed solely
  to surface old Xenko (major < 3) packages; with those gone the button
  had no effect. Removes ShowBetaVersions, IsBeta, IsBetaVersion, the
  toggle button AXAML, and the ToggleShowBetaVersions/ToggleHideBetaVersions
  string resources
- Update NugetStore.MainPackageIds to include Stride.GameStudio.Avalonia.Desktop
- Update launcher README
Update all docs under docs/launcher/ to match the code changes:
- cross-platform.md: remove Xenko.GameStudio.exe from Windows fallbacks
- lifecycle.md: remove Bin/Windows/Xenko.GameStudio.exe legacy path
- README.md: s/Stride\/Xenko versions/Stride versions/
- versions.md: remove 'Beta filter' section (ShowBetaVersions / IsBetaVersion),
  update StrideStoreAlternateVersionViewModel description, remove Xenko.GameStudio.exe
  mention, update RemoveUnusedPackages description
- viewmodels.md: remove IsBeta from StrideVersionViewModel description,
  remove 'e.g. legacy Xenko ID' from StrideStoreAlternateVersionViewModel
- port-status.md: remove ShowBetaVersions toggle bullet
Replace the verbose in-progress tracking doc with a focused reviewer
reference. Drop all resolved regression history and done roadmap items.
Keep only:
- What's ported (brief feature list)
- Deliberate changes table (so reviewers don't revert intentional choices)
- Open items: .NET 10.0 probe decision + post-merge future work
- Cross-references
Resolve launcher (Avalonia) vs WPF conflicts; take master's xunit runner; add Stride.Cli to launcher solution; implement multi-checkbox dialog for Avalonia.
@Kryptos-FR Kryptos-FR added the area-Launcher Stride Launcher label Jul 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-Launcher Stride Launcher

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants