Skip to content

Commit 222c916

Browse files
authored
Open directory with a selected item from command line (#6558)
1 parent d04ff9e commit 222c916

File tree

7 files changed

+83
-34
lines changed

7 files changed

+83
-34
lines changed

Files/App.xaml.cs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@ protected override async void OnActivated(IActivatedEventArgs args)
374374

375375
if (parsedCommands != null && parsedCommands.Count > 0)
376376
{
377-
async Task PerformNavigation(string payload)
377+
async Task PerformNavigation(string payload, string selectItem = null)
378378
{
379379
if (!string.IsNullOrEmpty(payload))
380380
{
@@ -385,13 +385,18 @@ async Task PerformNavigation(string payload)
385385
payload = folder.Path; // Convert short name to long name (#6190)
386386
}
387387
}
388+
var paneNavigationArgs = new PaneNavigationArguments
389+
{
390+
LeftPaneNavPathParam = payload,
391+
LeftPaneSelectItemParam = selectItem,
392+
};
388393
if (rootFrame.Content != null)
389394
{
390-
await MainPageViewModel.AddNewTabByPathAsync(typeof(PaneHolderPage), payload);
395+
await MainPageViewModel.AddNewTabByParam(typeof(PaneHolderPage), paneNavigationArgs);
391396
}
392397
else
393398
{
394-
rootFrame.Navigate(typeof(MainPage), payload, new SuppressNavigationTransitionInfo());
399+
rootFrame.Navigate(typeof(MainPage), paneNavigationArgs, new SuppressNavigationTransitionInfo());
395400
}
396401
}
397402
foreach (var command in parsedCommands)
@@ -401,7 +406,15 @@ async Task PerformNavigation(string payload)
401406
case ParsedCommandType.OpenDirectory:
402407
case ParsedCommandType.OpenPath:
403408
case ParsedCommandType.ExplorerShellCommand:
404-
await PerformNavigation(command.Payload);
409+
var selectItemCommand = parsedCommands.FirstOrDefault(x => x.Type == ParsedCommandType.SelectItem);
410+
await PerformNavigation(command.Payload, selectItemCommand?.Payload);
411+
break;
412+
413+
case ParsedCommandType.SelectItem:
414+
if (Path.IsPathRooted(command.Payload))
415+
{
416+
await PerformNavigation(Path.GetDirectoryName(command.Payload), Path.GetFileName(command.Payload));
417+
}
405418
break;
406419

407420
case ParsedCommandType.Unknown:

Files/CommandLine/CommandLineParser.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ private static ParsedCommands ParseSplitArguments(List<KeyValuePair<string, stri
4040
command.Type = ParsedCommandType.OutputPath;
4141
break;
4242

43+
case string s when "-Select".Equals(s, StringComparison.OrdinalIgnoreCase):
44+
command.Type = ParsedCommandType.SelectItem;
45+
break;
46+
4347
default:
4448
//case "-Cmdless":
4549
try

Files/CommandLine/ParsedCommandType.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@ internal enum ParsedCommandType
77
OpenPath,
88
ExplorerShellCommand,
99
OutputPath,
10+
SelectItem,
1011
}
1112
}

Files/ViewModels/MainPageViewModel.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,10 @@ public async void OnNavigatedTo(NavigationEventArgs e)
408408
{
409409
await AddNewTabByPathAsync(typeof(PaneHolderPage), navArgs);
410410
}
411+
else if (e.Parameter is PaneNavigationArguments paneArgs)
412+
{
413+
await AddNewTabByParam(typeof(PaneHolderPage), paneArgs);
414+
}
411415
else if (e.Parameter is TabItemArguments tabArgs)
412416
{
413417
await AddNewTabByParam(tabArgs.InitialPageType, tabArgs.NavigationArg);

Files/Views/ColumnShellPage.xaml.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ protected override void OnNavigatedTo(NavigationEventArgs eventArgs)
329329
{
330330
base.OnNavigatedTo(eventArgs);
331331
Column = (eventArgs.Parameter as ColumnParam).Column;
332-
NavParams = (eventArgs.Parameter as ColumnParam).Path.ToString();
332+
NavParams = new NavigationParams { NavPath = (eventArgs.Parameter as ColumnParam).Path.ToString() };
333333
}
334334

335335
private void AppSettings_SortDirectionPreferenceUpdated(object sender, SortDirection e)
@@ -435,10 +435,10 @@ await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
435435
}
436436
}
437437

438-
private string navParams;
438+
private NavigationParams navParams;
439439
private int Column;
440440

441-
public string NavParams
441+
public NavigationParams NavParams
442442
{
443443
get => navParams;
444444
set
@@ -456,12 +456,12 @@ public string NavParams
456456

457457
private void OnNavigationParamsChanged()
458458
{
459-
if (string.IsNullOrEmpty(NavParams) || NavParams == "Home".GetLocalized())
459+
if (string.IsNullOrEmpty(NavParams?.NavPath) || NavParams.NavPath == "Home".GetLocalized())
460460
{
461461
ItemDisplayFrame.Navigate(typeof(WidgetsPage),
462462
new NavigationArguments()
463463
{
464-
NavPathParam = NavParams,
464+
NavPathParam = NavParams?.NavPath,
465465
AssociatedTabInstance = this
466466
});
467467
}
@@ -470,14 +470,15 @@ private void OnNavigationParamsChanged()
470470
ItemDisplayFrame.Navigate(typeof(ColumnViewBase),
471471
new NavigationArguments()
472472
{
473-
NavPathParam = NavParams,
473+
NavPathParam = NavParams.NavPath,
474+
SelectItems = !string.IsNullOrWhiteSpace(NavParams.SelectItem) ? new[] { NavParams.SelectItem } : null,
474475
AssociatedTabInstance = this
475476
});
476477
}
477478
}
478479

479480
public static readonly DependencyProperty NavParamsProperty =
480-
DependencyProperty.Register("NavParams", typeof(string), typeof(ColumnShellPage), new PropertyMetadata(null));
481+
DependencyProperty.Register("NavParams", typeof(NavigationParams), typeof(ColumnShellPage), new PropertyMetadata(null));
481482

482483
private TabItemArguments tabItemArguments;
483484

Files/Views/ModernShellPage.xaml.cs

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,14 @@ private void ModernShellPage_BackNavRequested(object sender, EventArgs e)
349349
protected override void OnNavigatedTo(NavigationEventArgs eventArgs)
350350
{
351351
base.OnNavigatedTo(eventArgs);
352-
NavParams = eventArgs.Parameter.ToString();
352+
if (eventArgs.Parameter is string navPath)
353+
{
354+
NavParams = new NavigationParams { NavPath = navPath };
355+
}
356+
else if (eventArgs.Parameter is NavigationParams navParams)
357+
{
358+
NavParams = navParams;
359+
}
353360
}
354361

355362
private void AppSettings_SortDirectionPreferenceUpdated(object sender, SortDirection e)
@@ -469,9 +476,9 @@ await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
469476
}
470477
}
471478

472-
private string navParams;
479+
private NavigationParams navParams;
473480

474-
public string NavParams
481+
public NavigationParams NavParams
475482
{
476483
get => navParams;
477484
set
@@ -489,28 +496,29 @@ public string NavParams
489496

490497
private void OnNavigationParamsChanged()
491498
{
492-
if (string.IsNullOrEmpty(NavParams) || NavParams == "Home".GetLocalized())
499+
if (string.IsNullOrEmpty(NavParams?.NavPath) || NavParams.NavPath == "Home".GetLocalized())
493500
{
494501
ItemDisplayFrame.Navigate(typeof(WidgetsPage),
495502
new NavigationArguments()
496503
{
497-
NavPathParam = NavParams,
504+
NavPathParam = NavParams?.NavPath,
498505
AssociatedTabInstance = this
499506
}, new EntranceNavigationTransitionInfo());
500507
}
501508
else
502509
{
503-
ItemDisplayFrame.Navigate(InstanceViewModel.FolderSettings.GetLayoutType(NavParams),
510+
ItemDisplayFrame.Navigate(InstanceViewModel.FolderSettings.GetLayoutType(NavParams.NavPath),
504511
new NavigationArguments()
505512
{
506-
NavPathParam = NavParams,
513+
NavPathParam = NavParams.NavPath,
514+
SelectItems = !string.IsNullOrWhiteSpace(NavParams?.SelectItem) ? new[] { NavParams.SelectItem } : null,
507515
AssociatedTabInstance = this
508516
});
509517
}
510518
}
511519

512520
public static readonly DependencyProperty NavParamsProperty =
513-
DependencyProperty.Register("NavParams", typeof(string), typeof(ModernShellPage), new PropertyMetadata(null));
521+
DependencyProperty.Register("NavParams", typeof(NavigationParams), typeof(ModernShellPage), new PropertyMetadata(null));
514522

515523
private TabItemArguments tabItemArguments;
516524

@@ -1130,6 +1138,12 @@ public class PathBoxItem
11301138
public string Path { get; set; }
11311139
}
11321140

1141+
public class NavigationParams
1142+
{
1143+
public string NavPath { get; set; }
1144+
public string SelectItem { get; set;}
1145+
}
1146+
11331147
public class NavigationArguments
11341148
{
11351149
public string NavPathParam { get; set; } = null;

Files/Views/PaneHolderPage.xaml.cs

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,9 @@ public bool IsMultiPaneEnabled
8383
get => UserSettingsService.MultitaskingSettingsService.IsDualPaneEnabled && !(Window.Current.Bounds.Width <= 750);
8484
}
8585

86-
private string navParamsLeft;
86+
private NavigationParams navParamsLeft;
8787

88-
public string NavParamsLeft
88+
public NavigationParams NavParamsLeft
8989
{
9090
get => navParamsLeft;
9191
set
@@ -98,9 +98,9 @@ public string NavParamsLeft
9898
}
9999
}
100100

101-
private string navParamsRight;
101+
private NavigationParams navParamsRight;
102102

103-
public string NavParamsRight
103+
public NavigationParams NavParamsRight
104104
{
105105
get => navParamsRight;
106106
set
@@ -227,13 +227,21 @@ protected override void OnNavigatedTo(NavigationEventArgs eventArgs)
227227

228228
if (eventArgs.Parameter is string navPath)
229229
{
230-
NavParamsLeft = navPath;
231-
NavParamsRight = "Home".GetLocalized();
230+
NavParamsLeft = new NavigationParams { NavPath = navPath };
231+
NavParamsRight = new NavigationParams { NavPath = "Home".GetLocalized() };
232232
}
233233
if (eventArgs.Parameter is PaneNavigationArguments paneArgs)
234234
{
235-
NavParamsLeft = paneArgs.LeftPaneNavPathParam;
236-
NavParamsRight = paneArgs.RightPaneNavPathParam;
235+
NavParamsLeft = new NavigationParams
236+
{
237+
NavPath = paneArgs.LeftPaneNavPathParam,
238+
SelectItem = paneArgs.LeftPaneSelectItemParam
239+
};
240+
NavParamsRight = new NavigationParams
241+
{
242+
NavPath = paneArgs.RightPaneNavPathParam,
243+
SelectItem = paneArgs.RightPaneSelectItemParam
244+
};
237245
IsRightPaneVisible = IsMultiPaneEnabled && paneArgs.RightPaneNavPathParam != null;
238246
}
239247

@@ -242,8 +250,10 @@ protected override void OnNavigatedTo(NavigationEventArgs eventArgs)
242250
InitialPageType = typeof(PaneHolderPage),
243251
NavigationArg = new PaneNavigationArguments()
244252
{
245-
LeftPaneNavPathParam = NavParamsLeft,
246-
RightPaneNavPathParam = IsRightPaneVisible ? NavParamsRight : null
253+
LeftPaneNavPathParam = NavParamsLeft?.NavPath,
254+
LeftPaneSelectItemParam = NavParamsLeft?.SelectItem,
255+
RightPaneNavPathParam = IsRightPaneVisible ? NavParamsRight?.NavPath : null,
256+
RightPaneSelectItemParam = IsRightPaneVisible ? NavParamsRight?.SelectItem : null,
247257
}
248258
};
249259
}
@@ -288,7 +298,7 @@ private void Pane_ContentChanged(object sender, TabItemArguments e)
288298
public void OpenPathInNewPane(string path)
289299
{
290300
IsRightPaneVisible = true;
291-
NavParamsRight = path;
301+
NavParamsRight = new NavigationParams { NavPath = path };
292302
}
293303

294304
private void KeyboardAccelerator_Invoked(KeyboardAccelerator sender, KeyboardAcceleratorInvokedEventArgs args)
@@ -310,9 +320,9 @@ private void KeyboardAccelerator_Invoked(KeyboardAccelerator sender, KeyboardAcc
310320
case (true, true, false, VirtualKey.Right): // ctrl + shift + "->" select right pane
311321
if (UserSettingsService.MultitaskingSettingsService.IsDualPaneEnabled)
312322
{
313-
if (string.IsNullOrEmpty(NavParamsRight))
323+
if (string.IsNullOrEmpty(NavParamsRight?.NavPath))
314324
{
315-
NavParamsRight = "Home".GetLocalized();
325+
NavParamsRight = new NavigationParams { NavPath = "Home".GetLocalized() };
316326
}
317327
IsRightPaneVisible = true;
318328
ActivePane = PaneRight;
@@ -326,9 +336,9 @@ private void KeyboardAccelerator_Invoked(KeyboardAccelerator sender, KeyboardAcc
326336
case (false, true, true, VirtualKey.Add): // alt + shift + "+" open pane
327337
if (UserSettingsService.MultitaskingSettingsService.IsDualPaneEnabled)
328338
{
329-
if (string.IsNullOrEmpty(NavParamsRight))
339+
if (string.IsNullOrEmpty(NavParamsRight?.NavPath))
330340
{
331-
NavParamsRight = "Home".GetLocalized();
341+
NavParamsRight = new NavigationParams { NavPath = "Home".GetLocalized() };
332342
}
333343
IsRightPaneVisible = true;
334344
}
@@ -369,6 +379,8 @@ public void Dispose()
369379
public class PaneNavigationArguments
370380
{
371381
public string LeftPaneNavPathParam { get; set; } = null;
382+
public string LeftPaneSelectItemParam { get; set; } = null;
372383
public string RightPaneNavPathParam { get; set; } = null;
384+
public string RightPaneSelectItemParam { get; set; } = null;
373385
}
374386
}

0 commit comments

Comments
 (0)