diff --git a/Files/App.xaml.cs b/Files/App.xaml.cs index 92957f459d92..c72b89107e3e 100644 --- a/Files/App.xaml.cs +++ b/Files/App.xaml.cs @@ -369,7 +369,7 @@ protected override async void OnActivated(IActivatedEventArgs args) if (parsedCommands != null && parsedCommands.Count > 0) { - async Task PerformNavigation(string payload) + async Task PerformNavigation(string payload, string selectItem = null) { if (!string.IsNullOrEmpty(payload)) { @@ -380,13 +380,18 @@ async Task PerformNavigation(string payload) payload = folder.Path; // Convert short name to long name (#6190) } } + var paneNavigationArgs = new PaneNavigationArguments + { + LeftPaneNavPathParam = payload, + LeftPaneSelectItemParam = selectItem, + }; if (rootFrame.Content != null) { - await MainPageViewModel.AddNewTabByPathAsync(typeof(PaneHolderPage), payload); + await MainPageViewModel.AddNewTabByParam(typeof(PaneHolderPage), paneNavigationArgs); } else { - rootFrame.Navigate(typeof(MainPage), payload, new SuppressNavigationTransitionInfo()); + rootFrame.Navigate(typeof(MainPage), paneNavigationArgs, new SuppressNavigationTransitionInfo()); } } foreach (var command in parsedCommands) @@ -396,7 +401,15 @@ async Task PerformNavigation(string payload) case ParsedCommandType.OpenDirectory: case ParsedCommandType.OpenPath: case ParsedCommandType.ExplorerShellCommand: - await PerformNavigation(command.Payload); + var selectItemCommand = parsedCommands.FirstOrDefault(x => x.Type == ParsedCommandType.SelectItem); + await PerformNavigation(command.Payload, selectItemCommand?.Payload); + break; + + case ParsedCommandType.SelectItem: + if (Path.IsPathRooted(command.Payload)) + { + await PerformNavigation(Path.GetDirectoryName(command.Payload), Path.GetFileName(command.Payload)); + } break; case ParsedCommandType.Unknown: diff --git a/Files/CommandLine/CommandLineParser.cs b/Files/CommandLine/CommandLineParser.cs index 0af0908cb25e..50f02906b16c 100644 --- a/Files/CommandLine/CommandLineParser.cs +++ b/Files/CommandLine/CommandLineParser.cs @@ -40,6 +40,10 @@ private static ParsedCommands ParseSplitArguments(List } } - private string navParams; + private NavigationParams navParams; private int Column; - public string NavParams + public NavigationParams NavParams { get => navParams; set @@ -456,12 +456,12 @@ public string NavParams private void OnNavigationParamsChanged() { - if (string.IsNullOrEmpty(NavParams) || NavParams == "Home".GetLocalized()) + if (string.IsNullOrEmpty(NavParams?.NavPath) || NavParams.NavPath == "Home".GetLocalized()) { ItemDisplayFrame.Navigate(typeof(WidgetsPage), new NavigationArguments() { - NavPathParam = NavParams, + NavPathParam = NavParams?.NavPath, AssociatedTabInstance = this }); } @@ -470,14 +470,15 @@ private void OnNavigationParamsChanged() ItemDisplayFrame.Navigate(typeof(ColumnViewBase), new NavigationArguments() { - NavPathParam = NavParams, + NavPathParam = NavParams.NavPath, + SelectItems = !string.IsNullOrWhiteSpace(NavParams.SelectItem) ? new[] { NavParams.SelectItem } : null, AssociatedTabInstance = this }); } } public static readonly DependencyProperty NavParamsProperty = - DependencyProperty.Register("NavParams", typeof(string), typeof(ColumnShellPage), new PropertyMetadata(null)); + DependencyProperty.Register("NavParams", typeof(NavigationParams), typeof(ColumnShellPage), new PropertyMetadata(null)); private TabItemArguments tabItemArguments; diff --git a/Files/Views/ModernShellPage.xaml.cs b/Files/Views/ModernShellPage.xaml.cs index 81ad186980cb..ee401ac95175 100644 --- a/Files/Views/ModernShellPage.xaml.cs +++ b/Files/Views/ModernShellPage.xaml.cs @@ -349,7 +349,14 @@ private void ModernShellPage_BackNavRequested(object sender, EventArgs e) protected override void OnNavigatedTo(NavigationEventArgs eventArgs) { base.OnNavigatedTo(eventArgs); - NavParams = eventArgs.Parameter.ToString(); + if (eventArgs.Parameter is string navPath) + { + NavParams = new NavigationParams { NavPath = navPath }; + } + else if (eventArgs.Parameter is NavigationParams navParams) + { + NavParams = navParams; + } } private void AppSettings_SortDirectionPreferenceUpdated(object sender, SortDirection e) @@ -469,9 +476,9 @@ await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () => } } - private string navParams; + private NavigationParams navParams; - public string NavParams + public NavigationParams NavParams { get => navParams; set @@ -489,28 +496,29 @@ public string NavParams private void OnNavigationParamsChanged() { - if (string.IsNullOrEmpty(NavParams) || NavParams == "Home".GetLocalized()) + if (string.IsNullOrEmpty(NavParams?.NavPath) || NavParams.NavPath == "Home".GetLocalized()) { ItemDisplayFrame.Navigate(typeof(WidgetsPage), new NavigationArguments() { - NavPathParam = NavParams, + NavPathParam = NavParams?.NavPath, AssociatedTabInstance = this }, new EntranceNavigationTransitionInfo()); } else { - ItemDisplayFrame.Navigate(InstanceViewModel.FolderSettings.GetLayoutType(NavParams), + ItemDisplayFrame.Navigate(InstanceViewModel.FolderSettings.GetLayoutType(NavParams.NavPath), new NavigationArguments() { - NavPathParam = NavParams, + NavPathParam = NavParams.NavPath, + SelectItems = !string.IsNullOrWhiteSpace(NavParams?.SelectItem) ? new[] { NavParams.SelectItem } : null, AssociatedTabInstance = this }); } } public static readonly DependencyProperty NavParamsProperty = - DependencyProperty.Register("NavParams", typeof(string), typeof(ModernShellPage), new PropertyMetadata(null)); + DependencyProperty.Register("NavParams", typeof(NavigationParams), typeof(ModernShellPage), new PropertyMetadata(null)); private TabItemArguments tabItemArguments; @@ -1130,6 +1138,12 @@ public class PathBoxItem public string Path { get; set; } } + public class NavigationParams + { + public string NavPath { get; set; } + public string SelectItem { get; set;} + } + public class NavigationArguments { public string NavPathParam { get; set; } = null; diff --git a/Files/Views/PaneHolderPage.xaml.cs b/Files/Views/PaneHolderPage.xaml.cs index e574e4bbe9b1..9d8b0ca90959 100644 --- a/Files/Views/PaneHolderPage.xaml.cs +++ b/Files/Views/PaneHolderPage.xaml.cs @@ -83,9 +83,9 @@ public bool IsMultiPaneEnabled get => UserSettingsService.MultitaskingSettingsService.IsDualPaneEnabled && !(Window.Current.Bounds.Width <= 750); } - private string navParamsLeft; + private NavigationParams navParamsLeft; - public string NavParamsLeft + public NavigationParams NavParamsLeft { get => navParamsLeft; set @@ -98,9 +98,9 @@ public string NavParamsLeft } } - private string navParamsRight; + private NavigationParams navParamsRight; - public string NavParamsRight + public NavigationParams NavParamsRight { get => navParamsRight; set @@ -227,13 +227,21 @@ protected override void OnNavigatedTo(NavigationEventArgs eventArgs) if (eventArgs.Parameter is string navPath) { - NavParamsLeft = navPath; - NavParamsRight = "Home".GetLocalized(); + NavParamsLeft = new NavigationParams { NavPath = navPath }; + NavParamsRight = new NavigationParams { NavPath = "Home".GetLocalized() }; } if (eventArgs.Parameter is PaneNavigationArguments paneArgs) { - NavParamsLeft = paneArgs.LeftPaneNavPathParam; - NavParamsRight = paneArgs.RightPaneNavPathParam; + NavParamsLeft = new NavigationParams + { + NavPath = paneArgs.LeftPaneNavPathParam, + SelectItem = paneArgs.LeftPaneSelectItemParam + }; + NavParamsRight = new NavigationParams + { + NavPath = paneArgs.RightPaneNavPathParam, + SelectItem = paneArgs.RightPaneSelectItemParam + }; IsRightPaneVisible = IsMultiPaneEnabled && paneArgs.RightPaneNavPathParam != null; } @@ -242,8 +250,10 @@ protected override void OnNavigatedTo(NavigationEventArgs eventArgs) InitialPageType = typeof(PaneHolderPage), NavigationArg = new PaneNavigationArguments() { - LeftPaneNavPathParam = NavParamsLeft, - RightPaneNavPathParam = IsRightPaneVisible ? NavParamsRight : null + LeftPaneNavPathParam = NavParamsLeft?.NavPath, + LeftPaneSelectItemParam = NavParamsLeft?.SelectItem, + RightPaneNavPathParam = IsRightPaneVisible ? NavParamsRight?.NavPath : null, + RightPaneSelectItemParam = IsRightPaneVisible ? NavParamsRight?.SelectItem : null, } }; } @@ -288,7 +298,7 @@ private void Pane_ContentChanged(object sender, TabItemArguments e) public void OpenPathInNewPane(string path) { IsRightPaneVisible = true; - NavParamsRight = path; + NavParamsRight = new NavigationParams { NavPath = path }; } private void KeyboardAccelerator_Invoked(KeyboardAccelerator sender, KeyboardAcceleratorInvokedEventArgs args) @@ -310,9 +320,9 @@ private void KeyboardAccelerator_Invoked(KeyboardAccelerator sender, KeyboardAcc case (true, true, false, VirtualKey.Right): // ctrl + shift + "->" select right pane if (UserSettingsService.MultitaskingSettingsService.IsDualPaneEnabled) { - if (string.IsNullOrEmpty(NavParamsRight)) + if (string.IsNullOrEmpty(NavParamsRight?.NavPath)) { - NavParamsRight = "Home".GetLocalized(); + NavParamsRight = new NavigationParams { NavPath = "Home".GetLocalized() }; } IsRightPaneVisible = true; ActivePane = PaneRight; @@ -326,9 +336,9 @@ private void KeyboardAccelerator_Invoked(KeyboardAccelerator sender, KeyboardAcc case (false, true, true, VirtualKey.Add): // alt + shift + "+" open pane if (UserSettingsService.MultitaskingSettingsService.IsDualPaneEnabled) { - if (string.IsNullOrEmpty(NavParamsRight)) + if (string.IsNullOrEmpty(NavParamsRight?.NavPath)) { - NavParamsRight = "Home".GetLocalized(); + NavParamsRight = new NavigationParams { NavPath = "Home".GetLocalized() }; } IsRightPaneVisible = true; } @@ -369,6 +379,8 @@ public void Dispose() public class PaneNavigationArguments { public string LeftPaneNavPathParam { get; set; } = null; + public string LeftPaneSelectItemParam { get; set; } = null; public string RightPaneNavPathParam { get; set; } = null; + public string RightPaneSelectItemParam { get; set; } = null; } } \ No newline at end of file