From 0c21a36c100d9ede411e3c5c3ae269f56f737f43 Mon Sep 17 00:00:00 2001 From: Dwedit Date: Sat, 25 May 2019 02:09:43 -0500 Subject: [PATCH 1/3] Simply code for keyboard control, and force to pick a more suitable node (selected node) if it loses track of the tree node. --- .../Controls/FileList/FileTreeView.cs | 162 ++++++++++-------- 1 file changed, 86 insertions(+), 76 deletions(-) diff --git a/WinDirStat.Net.Wpf.Single/Controls/FileList/FileTreeView.cs b/WinDirStat.Net.Wpf.Single/Controls/FileList/FileTreeView.cs index c1a7cab..8b96d86 100644 --- a/WinDirStat.Net.Wpf.Single/Controls/FileList/FileTreeView.cs +++ b/WinDirStat.Net.Wpf.Single/Controls/FileList/FileTreeView.cs @@ -230,82 +230,92 @@ internal void HandleExpanding(FileItemViewModel node) { } protected override void OnKeyDown(KeyEventArgs e) { - FileTreeViewItem container = e.OriginalSource as FileTreeViewItem; - switch (e.Key) { - case Key.Left: - if (container != null && ItemsControl.ItemsControlFromItemContainer(container) == this) { - if (container.Node.IsExpanded) { - container.Node.IsExpanded = false; - } - else if (container.Node.Parent != null) { - this.FocusNode(container.Node.Parent); - } - e.Handled = true; - } - break; - case Key.Right: - if (container != null && ItemsControl.ItemsControlFromItemContainer(container) == this) { - if (!container.Node.IsExpanded && container.Node.ShowExpander) { - container.Node.IsExpanded = true; - } - else if (container.Node.Children.Count > 0) { - // jump to first child: - container.MoveFocus(new TraversalRequest(FocusNavigationDirection.Down)); - } - e.Handled = true; - } - break; - case Key.Return: - if (container != null && Keyboard.Modifiers == ModifierKeys.None && this.SelectedItems.Count == 1 && this.SelectedItem == container.Node) { - e.Handled = true; - container.Node.ActivateItem(); - } - break; - case Key.Space: - if (container != null && Keyboard.Modifiers == ModifierKeys.None && this.SelectedItems.Count == 1 && this.SelectedItem == container.Node) { - e.Handled = true; - /*if (container.Node.IsCheckable) { - if (container.Node.IsChecked == null) // If partially selected, we want to select everything - container.Node.IsChecked = true; - else - container.Node.IsChecked = !container.Node.IsChecked; - } - else {*/ - container.Node.ActivateItem(); - //} - } - break; - case Key.Add: - if (container != null && ItemsControl.ItemsControlFromItemContainer(container) == this) { - if (container.Node.ShowExpander) - container.Node.IsExpanded = true; - e.Handled = true; - } - break; - case Key.Subtract: - if (container != null && ItemsControl.ItemsControlFromItemContainer(container) == this) { - container.Node.IsExpanded = false; - e.Handled = true; - } - break; - case Key.Multiply: - if (container != null && ItemsControl.ItemsControlFromItemContainer(container) == this) { - if (container.Node.ShowExpander) { - container.Node.IsExpanded = true; - ExpandRecursively(container.Node); - } - e.Handled = true; - } - break; - case Key.Divide: - if (container != null && ItemsControl.ItemsControlFromItemContainer(container) == this) { - if (container.Node.Parent != null) { - FocusNode(container.Node.Parent); - } - e.Handled = true; - } - break; - } + FileItemViewModel selectedItem = null; + if (this.SelectedItems.Count == 1) + { + selectedItem = this.SelectedItem as FileItemViewModel; + } + + { + FileTreeViewItem container = e.OriginalSource as FileTreeViewItem; + if (container != null) + { + selectedItem = container.Node; + } + else + { + if (selectedItem != null) + { + FocusNode(selectedItem); + } + } + } + + if (selectedItem != null) + { + switch (e.Key) + { + case Key.Left: + if (selectedItem.IsExpanded) + { + selectedItem.IsExpanded = false; + } + else if (selectedItem.Parent != null) + { + this.FocusNode(selectedItem.Parent); + } + e.Handled = true; + break; + case Key.Right: + if (!selectedItem.IsExpanded && selectedItem.ShowExpander) + { + selectedItem.IsExpanded = true; + } + else if (selectedItem.Children.Count > 0) + { + // jump to first child: + var firstChild = selectedItem.Children.FirstOrDefault(); + if (firstChild != null) + { + FocusNode(firstChild); + } + } + e.Handled = true; + break; + case Key.Return: + e.Handled = true; + selectedItem.ActivateItem(); + break; + case Key.Space: + e.Handled = true; + selectedItem.ActivateItem(); + break; + case Key.Add: + if (selectedItem.ShowExpander) + selectedItem.IsExpanded = true; + e.Handled = true; + break; + case Key.Subtract: + selectedItem.IsExpanded = false; + e.Handled = true; + break; + case Key.Multiply: + if (selectedItem.ShowExpander) + { + selectedItem.IsExpanded = true; + ExpandRecursively(selectedItem); + } + e.Handled = true; + break; + case Key.Divide: + if (selectedItem.Parent != null) + { + FocusNode(selectedItem.Parent); + } + e.Handled = true; + break; + } + } if (!e.Handled) base.OnKeyDown(e); } From 31a7259d96c6545acdcec01f4541dd4d78f199bb Mon Sep 17 00:00:00 2001 From: Robert Jordan Date: Tue, 28 May 2019 10:53:25 -0400 Subject: [PATCH 2/3] Format PR to project coding standards * Spaces to Tabs * Braces start on same line. --- .../Controls/FileList/FileTreeView.cs | 159 ++++++++---------- 1 file changed, 73 insertions(+), 86 deletions(-) diff --git a/WinDirStat.Net.Wpf.Single/Controls/FileList/FileTreeView.cs b/WinDirStat.Net.Wpf.Single/Controls/FileList/FileTreeView.cs index 8b96d86..02921ef 100644 --- a/WinDirStat.Net.Wpf.Single/Controls/FileList/FileTreeView.cs +++ b/WinDirStat.Net.Wpf.Single/Controls/FileList/FileTreeView.cs @@ -230,92 +230,79 @@ internal void HandleExpanding(FileItemViewModel node) { } protected override void OnKeyDown(KeyEventArgs e) { - FileItemViewModel selectedItem = null; - if (this.SelectedItems.Count == 1) - { - selectedItem = this.SelectedItem as FileItemViewModel; - } - - { - FileTreeViewItem container = e.OriginalSource as FileTreeViewItem; - if (container != null) - { - selectedItem = container.Node; - } - else - { - if (selectedItem != null) - { - FocusNode(selectedItem); - } - } - } - - if (selectedItem != null) - { - switch (e.Key) - { - case Key.Left: - if (selectedItem.IsExpanded) - { - selectedItem.IsExpanded = false; - } - else if (selectedItem.Parent != null) - { - this.FocusNode(selectedItem.Parent); - } - e.Handled = true; - break; - case Key.Right: - if (!selectedItem.IsExpanded && selectedItem.ShowExpander) - { - selectedItem.IsExpanded = true; - } - else if (selectedItem.Children.Count > 0) - { - // jump to first child: - var firstChild = selectedItem.Children.FirstOrDefault(); - if (firstChild != null) - { - FocusNode(firstChild); - } - } - e.Handled = true; - break; - case Key.Return: - e.Handled = true; - selectedItem.ActivateItem(); - break; - case Key.Space: - e.Handled = true; - selectedItem.ActivateItem(); - break; - case Key.Add: - if (selectedItem.ShowExpander) - selectedItem.IsExpanded = true; - e.Handled = true; - break; - case Key.Subtract: - selectedItem.IsExpanded = false; - e.Handled = true; - break; - case Key.Multiply: - if (selectedItem.ShowExpander) - { - selectedItem.IsExpanded = true; - ExpandRecursively(selectedItem); - } - e.Handled = true; - break; - case Key.Divide: - if (selectedItem.Parent != null) - { - FocusNode(selectedItem.Parent); - } - e.Handled = true; - break; - } - } + FileItemViewModel selectedItem = null; + if (this.SelectedItems.Count == 1) { + selectedItem = this.SelectedItem as FileItemViewModel; + } + + { + FileTreeViewItem container = e.OriginalSource as FileTreeViewItem; + if (container != null) { + selectedItem = container.Node; + } + else { + if (selectedItem != null) { + FocusNode(selectedItem); + } + } + } + + if (selectedItem != null) { + switch (e.Key) { + case Key.Left: + if (selectedItem.IsExpanded) { + selectedItem.IsExpanded = false; + } + else if (selectedItem.Parent != null) { + this.FocusNode(selectedItem.Parent); + } + e.Handled = true; + break; + case Key.Right: + if (!selectedItem.IsExpanded && selectedItem.ShowExpander) { + selectedItem.IsExpanded = true; + } + else if (selectedItem.Children.Count > 0) { + // jump to first child: + var firstChild = selectedItem.Children.FirstOrDefault(); + if (firstChild != null) { + FocusNode(firstChild); + } + } + e.Handled = true; + break; + case Key.Return: + e.Handled = true; + selectedItem.ActivateItem(); + break; + case Key.Space: + e.Handled = true; + selectedItem.ActivateItem(); + break; + case Key.Add: + if (selectedItem.ShowExpander) + selectedItem.IsExpanded = true; + e.Handled = true; + break; + case Key.Subtract: + selectedItem.IsExpanded = false; + e.Handled = true; + break; + case Key.Multiply: + if (selectedItem.ShowExpander) { + selectedItem.IsExpanded = true; + ExpandRecursively(selectedItem); + } + e.Handled = true; + break; + case Key.Divide: + if (selectedItem.Parent != null) { + FocusNode(selectedItem.Parent); + } + e.Handled = true; + break; + } + } if (!e.Handled) base.OnKeyDown(e); } From b61075d92d917628cc5404066a6967f9d1ff68a8 Mon Sep 17 00:00:00 2001 From: Robert Jordan Date: Tue, 28 May 2019 11:05:42 -0400 Subject: [PATCH 3/3] Re-add missing Key checks. Rewrite obtaining of selectedItem Switching to `selectedItem` certainly made things look nicer. A lot of the redundant checks can be sent somewhere else. * Reordered getting of `selectedItem`. Re-add `ItemsControl.ItemsControlFromItemContainer(container)`. * Re-added `(Keyboard.Modifiers == ModifierKeys.None && SelectedItems.Count == 1)` check to Activate item. * Added some descriptive comments. --- .../Controls/FileList/FileTreeView.cs | 56 ++++++++++++------- 1 file changed, 37 insertions(+), 19 deletions(-) diff --git a/WinDirStat.Net.Wpf.Single/Controls/FileList/FileTreeView.cs b/WinDirStat.Net.Wpf.Single/Controls/FileList/FileTreeView.cs index 02921ef..05789c1 100644 --- a/WinDirStat.Net.Wpf.Single/Controls/FileList/FileTreeView.cs +++ b/WinDirStat.Net.Wpf.Single/Controls/FileList/FileTreeView.cs @@ -231,20 +231,23 @@ internal void HandleExpanding(FileItemViewModel node) { protected override void OnKeyDown(KeyEventArgs e) { FileItemViewModel selectedItem = null; - if (this.SelectedItems.Count == 1) { - selectedItem = this.SelectedItem as FileItemViewModel; - } - + if (e.OriginalSource is FileTreeViewItem container && + ItemsControl.ItemsControlFromItemContainer(container) == this) { - FileTreeViewItem container = e.OriginalSource as FileTreeViewItem; - if (container != null) { - selectedItem = container.Node; - } - else { - if (selectedItem != null) { - FocusNode(selectedItem); - } - } + selectedItem = container.Node; + } + else if (e.OriginalSource == this) { + // When the FileTreeFlattener collection is reset, focus will be shifted to the FileTreeView. + selectedItem = SelectedItem as FileItemViewModel; + if (selectedItem != null) + FocusNode(selectedItem); + } + else { + // If we're reaching this, then we may be in some subcontrol of a file item, that control may want + // focus. We'll keep this uncommented out for now until we determine handling needs to be changed. + selectedItem = SelectedItem as FileItemViewModel; + if (selectedItem != null) + FocusNode(selectedItem); } if (selectedItem != null) { @@ -254,7 +257,7 @@ protected override void OnKeyDown(KeyEventArgs e) { selectedItem.IsExpanded = false; } else if (selectedItem.Parent != null) { - this.FocusNode(selectedItem.Parent); + FocusNode(selectedItem.Parent); } e.Handled = true; break; @@ -272,16 +275,31 @@ protected override void OnKeyDown(KeyEventArgs e) { e.Handled = true; break; case Key.Return: - e.Handled = true; - selectedItem.ActivateItem(); - break; case Key.Space: + if (Keyboard.Modifiers == ModifierKeys.None && SelectedItems.Count == 1) { + e.Handled = true; + selectedItem.ActivateItem(); + } + break; + /*case Key.Space: + // Normally Space has special functionality, but we don't support checkboxes. e.Handled = true; selectedItem.ActivateItem(); - break; + if (Keyboard.Modifiers == ModifierKeys.None && SelectedItems.Count == 1) { + e.Handled = true; + if (selectedItem.IsCheckable) { + // If partially selected, we want to select everything + selectedItem.IsChecked = !(selectedItem.IsChecked ?? false); + } + else { + selectedItem.ActivateItem(); + } + } + break;*/ case Key.Add: - if (selectedItem.ShowExpander) + if (selectedItem.ShowExpander) { selectedItem.IsExpanded = true; + } e.Handled = true; break; case Key.Subtract: