feat(mission-control): custom tiles — open any console program as a tile

Programs are configured in Settings → Custom tiles and stored in ui.config.json.
A tile with a fixed folder starts on click; without one it offers a submenu of
home, the list folders and browse.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
CubeGameLP
2026-10-05 20:09:19 +02:00
co-authored by Claude Opus 5.5
parent 43b03e4837
commit f37b59d58f
12 changed files with 340 additions and 32 deletions
@@ -149,21 +149,18 @@ public partial class MissionControlView : UserControl
private void OnRecentSessionsFlyoutOpening(object? sender, EventArgs e) => _ = _vm?.RefreshRecentSessionsAsync();
// Ad-hoc ConPTY session: the view owns the folder picker, the VM only takes the chosen path.
private async void BrowseForSessionAsync()
// The view owns the folder picker (it needs a TopLevel); the VM decides what to open with the path.
private async System.Threading.Tasks.Task<string?> PickFolderAsync()
{
if (DataContext is not MissionControlViewModel vm) return;
var topLevel = TopLevel.GetTopLevel(this);
if (topLevel is null) return;
if (topLevel is null) return null;
var folders = await topLevel.StorageProvider.OpenFolderPickerAsync(new FolderPickerOpenOptions
{
Title = "Choose a directory",
AllowMultiple = false,
});
if (folders.Count == 0) return;
await vm.OpenAdHocConPtySessionAsync(folders[0].Path.LocalPath);
return folders.Count == 0 ? null : folders[0].Path.LocalPath;
}
private void OnDataContextChanged(object? sender, EventArgs e)
@@ -172,7 +169,7 @@ public partial class MissionControlView : UserControl
{
_vm.Panes.CollectionChanged -= OnPanesChanged;
_vm.PropertyChanged -= OnViewModelPropertyChanged;
_vm.BrowseForSessionRequested = null;
_vm.PickFolderAsync = null;
_vm.ConfirmAsync = null;
}
@@ -182,7 +179,7 @@ public partial class MissionControlView : UserControl
{
_vm.Panes.CollectionChanged += OnPanesChanged;
_vm.PropertyChanged += OnViewModelPropertyChanged;
_vm.BrowseForSessionRequested = BrowseForSessionAsync;
_vm.PickFolderAsync = PickFolderAsync;
_vm.ConfirmAsync = ShowConfirmAsync;
}