From d7f55fde69d3c545798b4df614e0208db4f95cf0 Mon Sep 17 00:00:00 2001 From: szabolcstarnai Date: Fri, 4 Feb 2022 11:37:27 +0100 Subject: [PATCH 01/13] prevent inserting restricted character in new file dialog --- src/Files/Helpers/DynamicDialogFactory.cs | 41 ++++++++++++++++------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/src/Files/Helpers/DynamicDialogFactory.cs b/src/Files/Helpers/DynamicDialogFactory.cs index df906b8c6eed..660343d5c7b7 100644 --- a/src/Files/Helpers/DynamicDialogFactory.cs +++ b/src/Files/Helpers/DynamicDialogFactory.cs @@ -56,27 +56,42 @@ public static DynamicDialog GetFor_RenameDialog() Opacity = 0.0d }; - inputText.TextChanged += (s, e) => - { - var textBox = s as TextBox; - dialog.ViewModel.AdditionalData = textBox.Text; + string previousInput = ""; + int previousCursorPosition = 0; + bool ignoreTextChange = false; + inputText.TextChanging += (textBox, e) => + { if (FilesystemHelpers.ContainsRestrictedCharacters(textBox.Text)) { - dialog.ViewModel.DynamicButtonsEnabled = DynamicDialogButtons.Cancel; tipText.Opacity = 1.0d; + ignoreTextChange = true; + previousCursorPosition = textBox.SelectionStart - 1; + textBox.Text = previousInput; + textBox.SelectionStart = previousCursorPosition; return; } - else if (!string.IsNullOrWhiteSpace(textBox.Text)) - { - dialog.ViewModel.DynamicButtonsEnabled = DynamicDialogButtons.Primary | DynamicDialogButtons.Cancel; - } - else + }; + + inputText.TextChanged += (s, e) => + { + if (!ignoreTextChange) { - dialog.ViewModel.DynamicButtonsEnabled = DynamicDialogButtons.Cancel; - } + var textBox = s as TextBox; + dialog.ViewModel.AdditionalData = textBox.Text; + if (!string.IsNullOrWhiteSpace(textBox.Text)) + { + dialog.ViewModel.DynamicButtonsEnabled = DynamicDialogButtons.Primary | DynamicDialogButtons.Cancel; + } + else + { + dialog.ViewModel.DynamicButtonsEnabled = DynamicDialogButtons.Cancel; + } + tipText.Opacity = 0.0d; + previousInput = textBox.Text; - tipText.Opacity = 0.0d; + } + ignoreTextChange = false; }; inputText.Loaded += (s, e) => From 6ef246c26a864f2f0af208a666d4042973ba8de1 Mon Sep 17 00:00:00 2001 From: szabolcstarnai Date: Fri, 4 Feb 2022 22:40:04 +0100 Subject: [PATCH 02/13] prevent pasting restricted characters --- .../Helpers/FilesystemHelpers.cs | 14 ++++++++++ src/Files/Helpers/DynamicDialogFactory.cs | 28 +++++++++++++++---- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/Files/Filesystem/FilesystemOperations/Helpers/FilesystemHelpers.cs b/src/Files/Filesystem/FilesystemOperations/Helpers/FilesystemHelpers.cs index 950e18074727..423ddd68083d 100644 --- a/src/Files/Filesystem/FilesystemOperations/Helpers/FilesystemHelpers.cs +++ b/src/Files/Filesystem/FilesystemOperations/Helpers/FilesystemHelpers.cs @@ -1183,6 +1183,20 @@ public static bool ContainsRestrictedFileName(string input) return false; } + public static string FilterRestrictedCharacters(string input) + { + string filtered = ""; + foreach (char c in input) + { + Debug.WriteLine(c); + if (!RestrictedCharacters.Contains(c)) + { + filtered = string.Concat(filtered, c); + } + } + return filtered; + } + #endregion Public Helpers #region IDisposable diff --git a/src/Files/Helpers/DynamicDialogFactory.cs b/src/Files/Helpers/DynamicDialogFactory.cs index 660343d5c7b7..2fe8287baa8b 100644 --- a/src/Files/Helpers/DynamicDialogFactory.cs +++ b/src/Files/Helpers/DynamicDialogFactory.cs @@ -60,15 +60,32 @@ public static DynamicDialog GetFor_RenameDialog() int previousCursorPosition = 0; bool ignoreTextChange = false; + string previousRestrictedAttempt = ""; + + inputText.SelectionChanged += (s, e) => + { + previousCursorPosition = ((TextBox) s).SelectionStart; + }; + inputText.TextChanging += (textBox, e) => { if (FilesystemHelpers.ContainsRestrictedCharacters(textBox.Text)) { - tipText.Opacity = 1.0d; - ignoreTextChange = true; - previousCursorPosition = textBox.SelectionStart - 1; - textBox.Text = previousInput; - textBox.SelectionStart = previousCursorPosition; + if (previousRestrictedAttempt == textBox.Text) + { + textBox.Text = textBox.Text.Remove(textBox.Text.Length - previousRestrictedAttempt.Length); + string filtered = FilesystemHelpers.FilterRestrictedCharacters(previousRestrictedAttempt); + textBox.Text += filtered; + textBox.SelectionStart = previousCursorPosition + Math.Abs(textBox.Text.Length - previousInput.Length); + } + else + { + ignoreTextChange = true; + tipText.Opacity = 1.0d; + previousRestrictedAttempt = textBox.Text; + textBox.Text = previousInput; + textBox.SelectionStart = previousCursorPosition; + } return; } }; @@ -89,7 +106,6 @@ public static DynamicDialog GetFor_RenameDialog() } tipText.Opacity = 0.0d; previousInput = textBox.Text; - } ignoreTextChange = false; }; From 820b6733d6ba9280c719707405c82a05b8c337ab Mon Sep 17 00:00:00 2001 From: szabolcstarnai Date: Sat, 5 Feb 2022 00:22:13 +0100 Subject: [PATCH 03/13] implementing in Details layout --- .../LayoutModes/DetailsLayoutBrowser.xaml | 2 + .../LayoutModes/DetailsLayoutBrowser.xaml.cs | 40 ++++++++++++++++--- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml b/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml index 35d19ab2fb16..e2ab77fb16c6 100644 --- a/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml +++ b/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml @@ -638,6 +638,8 @@ HorizontalAlignment="Left" VerticalAlignment="Center" TextChanged="ListViewTextBoxItemName_TextChanged" + TextChanging="ListViewTextBoxItemName_TextChanging" + SelectionChanged="ListViewTextBoxItemName_SelectionChanged" Visibility="Collapsed"> diff --git a/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml.cs b/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml.cs index 9e852365c5b4..534898c2c19d 100644 --- a/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml.cs +++ b/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml.cs @@ -63,6 +63,11 @@ public double MaxWidthForRenameTextbox public ScrollViewer ContentScroller { get; private set; } + private string previousInput = ""; + private int previousCursorPosition = 0; + private bool ignoreTextChange = false; + private string previousRestrictedAttempt = ""; + public DetailsLayoutBrowser() : base() { InitializeComponent(); @@ -365,21 +370,44 @@ override public void StartRenameItem() textBox.Select(0, selectedTextLength); IsRenamingItem = true; } - - private void ListViewTextBoxItemName_TextChanged(object sender, TextChangedEventArgs e) + private void ListViewTextBoxItemName_SelectionChanged(object s, RoutedEventArgs e) { - var textBox = sender as TextBox; + previousCursorPosition = ((TextBox)s).SelectionStart; + } + private void ListViewTextBoxItemName_TextChanging(TextBox textBox, TextBoxTextChangingEventArgs args) + { if (FilesystemHelpers.ContainsRestrictedCharacters(textBox.Text)) { - FileNameTeachingTip.Visibility = Visibility.Visible; - FileNameTeachingTip.IsOpen = true; + if (previousRestrictedAttempt == textBox.Text) + { + textBox.Text = textBox.Text.Remove(textBox.Text.Length - previousRestrictedAttempt.Length); + string filtered = FilesystemHelpers.FilterRestrictedCharacters(previousRestrictedAttempt); + textBox.Text += filtered; + textBox.SelectionStart = previousCursorPosition + Math.Abs(textBox.Text.Length - previousInput.Length); + } + else + { + ignoreTextChange = true; + FileNameTeachingTip.Visibility = Visibility.Visible; + FileNameTeachingTip.IsOpen = true; + previousRestrictedAttempt = textBox.Text; + textBox.Text = previousInput; + textBox.SelectionStart = previousCursorPosition; + } + return; } - else + } + private void ListViewTextBoxItemName_TextChanged(object sender, TextChangedEventArgs e) + { + if (!ignoreTextChange) { + var textBox = sender as TextBox; FileNameTeachingTip.IsOpen = false; FileNameTeachingTip.Visibility = Visibility.Collapsed; + previousInput = textBox.Text; } + ignoreTextChange = false; } private void RenameTextBox_KeyDown(object sender, KeyRoutedEventArgs e) From 6c3e39d55d6c152ac1a3845895675a6442f58160 Mon Sep 17 00:00:00 2001 From: szabolcstarnai Date: Sat, 5 Feb 2022 12:44:45 +0100 Subject: [PATCH 04/13] fix for Details, implementing in Column view --- src/Files/BaseLayout.cs | 5 +++ .../Views/LayoutModes/ColumnViewBase.xaml | 2 + .../Views/LayoutModes/ColumnViewBase.xaml.cs | 42 ++++++++++++++----- .../LayoutModes/DetailsLayoutBrowser.xaml.cs | 5 --- 4 files changed, 39 insertions(+), 15 deletions(-) diff --git a/src/Files/BaseLayout.cs b/src/Files/BaseLayout.cs index 65cf1e4e0cbe..d5aae13387ee 100644 --- a/src/Files/BaseLayout.cs +++ b/src/Files/BaseLayout.cs @@ -292,6 +292,11 @@ internal set private DispatcherQueueTimer dragOverTimer, tapDebounceTimer; + protected string previousInput = ""; + protected int previousCursorPosition = 0; + protected bool ignoreTextChange = false; + protected string previousRestrictedAttempt = ""; + public BaseLayout() { ItemManipulationModel = new ItemManipulationModel(); diff --git a/src/Files/Views/LayoutModes/ColumnViewBase.xaml b/src/Files/Views/LayoutModes/ColumnViewBase.xaml index 0c0cbf8e540a..9fb9f8c46d30 100644 --- a/src/Files/Views/LayoutModes/ColumnViewBase.xaml +++ b/src/Files/Views/LayoutModes/ColumnViewBase.xaml @@ -308,6 +308,8 @@ VerticalAlignment="Stretch" TextAlignment="Left" TextChanged="ListViewTextBoxItemName_TextChanged" + TextChanging="ListViewTextBoxItemName_TextChanging" + SelectionChanged="ListViewTextBoxItemName_SelectionChanged" TextWrapping="Wrap" Visibility="Collapsed" /> diff --git a/src/Files/Views/LayoutModes/ColumnViewBase.xaml.cs b/src/Files/Views/LayoutModes/ColumnViewBase.xaml.cs index c497a28bff58..1154dd306cc2 100644 --- a/src/Files/Views/LayoutModes/ColumnViewBase.xaml.cs +++ b/src/Files/Views/LayoutModes/ColumnViewBase.xaml.cs @@ -125,23 +125,45 @@ protected override void UnhookEvents() } } - private void ListViewTextBoxItemName_TextChanged(object sender, TextChangedEventArgs e) + private void ListViewTextBoxItemName_SelectionChanged(object s, RoutedEventArgs e) { - var textBox = sender as TextBox; + previousCursorPosition = ((TextBox)s).SelectionStart; + } + private void ListViewTextBoxItemName_TextChanging(TextBox textBox, TextBoxTextChangingEventArgs args) + { if (FilesystemHelpers.ContainsRestrictedCharacters(textBox.Text)) { - FileNameTeachingTip.Visibility = Visibility.Visible; - FileNameTeachingTip.IsOpen = true; - } - else - { - if (FileNameTeachingTip.IsOpen == true) + if (previousRestrictedAttempt == textBox.Text) + { + textBox.Text = textBox.Text.Remove(textBox.Text.Length - previousRestrictedAttempt.Length); + string filtered = FilesystemHelpers.FilterRestrictedCharacters(previousRestrictedAttempt); + textBox.Text += filtered; + textBox.SelectionStart = previousCursorPosition + Math.Abs(textBox.Text.Length - previousInput.Length); + } + else { - FileNameTeachingTip.IsOpen = false; - FileNameTeachingTip.Visibility = Visibility.Collapsed; + ignoreTextChange = true; + FileNameTeachingTip.Visibility = Visibility.Visible; + FileNameTeachingTip.IsOpen = true; + previousRestrictedAttempt = textBox.Text; + textBox.Text = previousInput; + textBox.SelectionStart = previousCursorPosition; } + return; + } + } + + private void ListViewTextBoxItemName_TextChanged(object sender, TextChangedEventArgs e) + { + if (!ignoreTextChange) + { + var textBox = sender as TextBox; + FileNameTeachingTip.IsOpen = false; + FileNameTeachingTip.Visibility = Visibility.Collapsed; + previousInput = textBox.Text; } + ignoreTextChange = false; } public event EventHandler ItemInvoked; diff --git a/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml.cs b/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml.cs index 534898c2c19d..be221c7ff6f4 100644 --- a/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml.cs +++ b/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml.cs @@ -63,11 +63,6 @@ public double MaxWidthForRenameTextbox public ScrollViewer ContentScroller { get; private set; } - private string previousInput = ""; - private int previousCursorPosition = 0; - private bool ignoreTextChange = false; - private string previousRestrictedAttempt = ""; - public DetailsLayoutBrowser() : base() { InitializeComponent(); From 17060b0443f42c5de3af29581450353942078b86 Mon Sep 17 00:00:00 2001 From: szabolcstarnai Date: Sat, 5 Feb 2022 12:44:45 +0100 Subject: [PATCH 05/13] fix for Details, implementing in Column view --- src/Files/BaseLayout.cs | 10 +++++ .../Views/LayoutModes/ColumnViewBase.xaml | 2 + .../Views/LayoutModes/ColumnViewBase.xaml.cs | 43 ++++++++++++++----- .../LayoutModes/DetailsLayoutBrowser.xaml.cs | 15 +++---- 4 files changed, 49 insertions(+), 21 deletions(-) diff --git a/src/Files/BaseLayout.cs b/src/Files/BaseLayout.cs index 65cf1e4e0cbe..61381d47efca 100644 --- a/src/Files/BaseLayout.cs +++ b/src/Files/BaseLayout.cs @@ -292,6 +292,16 @@ internal set private DispatcherQueueTimer dragOverTimer, tapDebounceTimer; + protected string previousInput = ""; + protected int previousCursorPosition = 0; + protected bool ignoreTextChange = false; + protected string previousRestrictedAttempt = ""; + + protected void ListViewTextBoxItemName_SelectionChanged(object s, RoutedEventArgs e) + { + previousCursorPosition = ((TextBox)s).SelectionStart; + } + public BaseLayout() { ItemManipulationModel = new ItemManipulationModel(); diff --git a/src/Files/Views/LayoutModes/ColumnViewBase.xaml b/src/Files/Views/LayoutModes/ColumnViewBase.xaml index 0c0cbf8e540a..9fb9f8c46d30 100644 --- a/src/Files/Views/LayoutModes/ColumnViewBase.xaml +++ b/src/Files/Views/LayoutModes/ColumnViewBase.xaml @@ -308,6 +308,8 @@ VerticalAlignment="Stretch" TextAlignment="Left" TextChanged="ListViewTextBoxItemName_TextChanged" + TextChanging="ListViewTextBoxItemName_TextChanging" + SelectionChanged="ListViewTextBoxItemName_SelectionChanged" TextWrapping="Wrap" Visibility="Collapsed" /> diff --git a/src/Files/Views/LayoutModes/ColumnViewBase.xaml.cs b/src/Files/Views/LayoutModes/ColumnViewBase.xaml.cs index c497a28bff58..97674b5301bc 100644 --- a/src/Files/Views/LayoutModes/ColumnViewBase.xaml.cs +++ b/src/Files/Views/LayoutModes/ColumnViewBase.xaml.cs @@ -125,25 +125,42 @@ protected override void UnhookEvents() } } - private void ListViewTextBoxItemName_TextChanged(object sender, TextChangedEventArgs e) + private void ListViewTextBoxItemName_TextChanging(TextBox textBox, TextBoxTextChangingEventArgs args) { - var textBox = sender as TextBox; - if (FilesystemHelpers.ContainsRestrictedCharacters(textBox.Text)) { - FileNameTeachingTip.Visibility = Visibility.Visible; - FileNameTeachingTip.IsOpen = true; - } - else - { - if (FileNameTeachingTip.IsOpen == true) + if (previousRestrictedAttempt == textBox.Text) + { + textBox.Text = textBox.Text.Remove(textBox.Text.Length - previousRestrictedAttempt.Length); + string filtered = FilesystemHelpers.FilterRestrictedCharacters(previousRestrictedAttempt); + textBox.Text += filtered; + textBox.SelectionStart = previousCursorPosition + Math.Abs(textBox.Text.Length - previousInput.Length); + } + else { - FileNameTeachingTip.IsOpen = false; - FileNameTeachingTip.Visibility = Visibility.Collapsed; + ignoreTextChange = true; + FileNameTeachingTip.Visibility = Visibility.Visible; + FileNameTeachingTip.IsOpen = true; + previousRestrictedAttempt = textBox.Text; + textBox.Text = previousInput; + textBox.SelectionStart = previousCursorPosition; } + return; } } + private void ListViewTextBoxItemName_TextChanged(object sender, TextChangedEventArgs e) + { + if (!ignoreTextChange) + { + var textBox = sender as TextBox; + FileNameTeachingTip.IsOpen = false; + FileNameTeachingTip.Visibility = Visibility.Collapsed; + previousInput = textBox.Text; + } + ignoreTextChange = false; + } + public event EventHandler ItemInvoked; protected override void OnNavigatedTo(NavigationEventArgs eventArgs) @@ -251,6 +268,10 @@ private void RenameTextBox_LostFocus(object sender, RoutedEventArgs e) private async void CommitRename(TextBox textBox) { + previousInput = ""; + previousCursorPosition = 0; + ignoreTextChange = false; + previousRestrictedAttempt = ""; EndRename(textBox); string newItemName = textBox.Text.Trim().TrimEnd('.'); await UIFilesystemHelpers.RenameFileItemAsync(RenamingItem, newItemName, ParentShellPageInstance); diff --git a/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml.cs b/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml.cs index 534898c2c19d..76491c9fab34 100644 --- a/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml.cs +++ b/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml.cs @@ -63,11 +63,6 @@ public double MaxWidthForRenameTextbox public ScrollViewer ContentScroller { get; private set; } - private string previousInput = ""; - private int previousCursorPosition = 0; - private bool ignoreTextChange = false; - private string previousRestrictedAttempt = ""; - public DetailsLayoutBrowser() : base() { InitializeComponent(); @@ -370,10 +365,6 @@ override public void StartRenameItem() textBox.Select(0, selectedTextLength); IsRenamingItem = true; } - private void ListViewTextBoxItemName_SelectionChanged(object s, RoutedEventArgs e) - { - previousCursorPosition = ((TextBox)s).SelectionStart; - } private void ListViewTextBoxItemName_TextChanging(TextBox textBox, TextBoxTextChangingEventArgs args) { @@ -409,7 +400,7 @@ private void ListViewTextBoxItemName_TextChanged(object sender, TextChangedEvent } ignoreTextChange = false; } - + private void RenameTextBox_KeyDown(object sender, KeyRoutedEventArgs e) { if (e.Key == VirtualKey.Escape) @@ -441,6 +432,10 @@ private void RenameTextBox_LostFocus(object sender, RoutedEventArgs e) private async void CommitRename(TextBox textBox) { + previousInput = ""; + previousCursorPosition = 0; + ignoreTextChange = false; + previousRestrictedAttempt = ""; EndRename(textBox); string newItemName = textBox.Text.Trim().TrimEnd('.'); await UIFilesystemHelpers.RenameFileItemAsync(RenamingItem, newItemName, ParentShellPageInstance); From 528a079185819ff7a58eb6253b0e3a81f7b50a33 Mon Sep 17 00:00:00 2001 From: szabolcstarnai Date: Sat, 5 Feb 2022 17:18:01 +0100 Subject: [PATCH 06/13] Grid view --- src/Files/BaseLayout.cs | 2 +- .../Views/LayoutModes/ColumnViewBase.xaml.cs | 5 ++ .../LayoutModes/DetailsLayoutBrowser.xaml.cs | 5 ++ .../Views/LayoutModes/GridViewBrowser.xaml | 5 ++ .../Views/LayoutModes/GridViewBrowser.xaml.cs | 47 ++++++++++++++++++- 5 files changed, 62 insertions(+), 2 deletions(-) diff --git a/src/Files/BaseLayout.cs b/src/Files/BaseLayout.cs index 61381d47efca..f658cfc7a18d 100644 --- a/src/Files/BaseLayout.cs +++ b/src/Files/BaseLayout.cs @@ -297,7 +297,7 @@ internal set protected bool ignoreTextChange = false; protected string previousRestrictedAttempt = ""; - protected void ListViewTextBoxItemName_SelectionChanged(object s, RoutedEventArgs e) + private void ListViewTextBoxItemName_SelectionChanged(object s, RoutedEventArgs e) { previousCursorPosition = ((TextBox)s).SelectionStart; } diff --git a/src/Files/Views/LayoutModes/ColumnViewBase.xaml.cs b/src/Files/Views/LayoutModes/ColumnViewBase.xaml.cs index 97674b5301bc..a384df45b049 100644 --- a/src/Files/Views/LayoutModes/ColumnViewBase.xaml.cs +++ b/src/Files/Views/LayoutModes/ColumnViewBase.xaml.cs @@ -125,6 +125,11 @@ protected override void UnhookEvents() } } + private void ListViewTextBoxItemName_SelectionChanged(object s, RoutedEventArgs e) + { + previousCursorPosition = ((TextBox)s).SelectionStart; + } + private void ListViewTextBoxItemName_TextChanging(TextBox textBox, TextBoxTextChangingEventArgs args) { if (FilesystemHelpers.ContainsRestrictedCharacters(textBox.Text)) diff --git a/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml.cs b/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml.cs index 76491c9fab34..94e3dd7f8daa 100644 --- a/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml.cs +++ b/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml.cs @@ -366,6 +366,11 @@ override public void StartRenameItem() IsRenamingItem = true; } + private void ListViewTextBoxItemName_SelectionChanged(object s, RoutedEventArgs e) + { + previousCursorPosition = ((TextBox)s).SelectionStart; + } + private void ListViewTextBoxItemName_TextChanging(TextBox textBox, TextBoxTextChangingEventArgs args) { if (FilesystemHelpers.ContainsRestrictedCharacters(textBox.Text)) diff --git a/src/Files/Views/LayoutModes/GridViewBrowser.xaml b/src/Files/Views/LayoutModes/GridViewBrowser.xaml index 875d58049b2f..13c154bed4c6 100644 --- a/src/Files/Views/LayoutModes/GridViewBrowser.xaml +++ b/src/Files/Views/LayoutModes/GridViewBrowser.xaml @@ -198,6 +198,8 @@ Text="{x:Bind ItemName, Mode=OneWay}" TextAlignment="Center" TextChanged="GridViewTextBoxItemName_TextChanged" + TextChanging="GridViewTextBoxItemName_TextChanging" + SelectionChanged="GridViewTextBoxItemName_SelectionChanged" TextWrapping="Wrap" /> @@ -336,6 +338,9 @@ Grid.Row="0" HorizontalAlignment="Left" Text="{x:Bind ItemName, Mode=OneWay}" + TextChanged="GridViewTextBoxItemName_TextChanged" + TextChanging="GridViewTextBoxItemName_TextChanging" + SelectionChanged="GridViewTextBoxItemName_SelectionChanged" Visibility="Collapsed" /> Date: Mon, 7 Feb 2022 13:39:26 +0100 Subject: [PATCH 07/13] cleanup --- .../Views/LayoutModes/GridViewBrowser.xaml | 1 - .../Views/LayoutModes/GridViewBrowser.xaml.cs | 17 ----------------- 2 files changed, 18 deletions(-) diff --git a/src/Files/Views/LayoutModes/GridViewBrowser.xaml b/src/Files/Views/LayoutModes/GridViewBrowser.xaml index 0ef778a91293..13c154bed4c6 100644 --- a/src/Files/Views/LayoutModes/GridViewBrowser.xaml +++ b/src/Files/Views/LayoutModes/GridViewBrowser.xaml @@ -337,7 +337,6 @@ x:Name="TileViewTextBoxItemName" Grid.Row="0" HorizontalAlignment="Left" - TextChanged="GridViewTextBoxItemName_TextChanged" Text="{x:Bind ItemName, Mode=OneWay}" TextChanged="GridViewTextBoxItemName_TextChanged" TextChanging="GridViewTextBoxItemName_TextChanging" diff --git a/src/Files/Views/LayoutModes/GridViewBrowser.xaml.cs b/src/Files/Views/LayoutModes/GridViewBrowser.xaml.cs index 28122fe46a5d..f7e1de4c149c 100644 --- a/src/Files/Views/LayoutModes/GridViewBrowser.xaml.cs +++ b/src/Files/Views/LayoutModes/GridViewBrowser.xaml.cs @@ -332,23 +332,6 @@ private void GridViewTextBoxItemName_TextChanged(object sender, TextChangedEvent ignoreTextChange = false; } - /* - private void GridViewTextBoxItemName_TextChanged(object sender, TextChangedEventArgs e) - { - var textBox = sender as TextBox; - - if (FilesystemHelpers.ContainsRestrictedCharacters(textBox.Text)) - { - FileNameTeachingTip.Visibility = Visibility.Visible; - FileNameTeachingTip.IsOpen = true; - } - else - { - FileNameTeachingTip.IsOpen = false; - FileNameTeachingTip.Visibility = Visibility.Collapsed; - } - } - */ private void RenameTextBox_KeyDown(object sender, KeyRoutedEventArgs e) { if (e.Key == VirtualKey.Escape) From 00a81192c2546edcafc52abd1156f0ac456bc623 Mon Sep 17 00:00:00 2001 From: szabolcstarnai Date: Tue, 8 Feb 2022 10:08:20 +0100 Subject: [PATCH 08/13] putting code in helpers --- src/Files/BaseLayout.cs | 37 ++++++++++--- .../Helpers/FilesystemHelpers.cs | 37 ++++++++++++- .../Views/LayoutModes/ColumnViewBase.xaml | 6 +-- .../Views/LayoutModes/ColumnViewBase.xaml.cs | 51 +++--------------- .../LayoutModes/DetailsLayoutBrowser.xaml | 6 +-- .../LayoutModes/DetailsLayoutBrowser.xaml.cs | 50 +++--------------- .../Views/LayoutModes/GridViewBrowser.xaml | 12 ++--- .../Views/LayoutModes/GridViewBrowser.xaml.cs | 52 +++---------------- 8 files changed, 98 insertions(+), 153 deletions(-) diff --git a/src/Files/BaseLayout.cs b/src/Files/BaseLayout.cs index f1b39fdab83b..b1b7a834dc06 100644 --- a/src/Files/BaseLayout.cs +++ b/src/Files/BaseLayout.cs @@ -14,6 +14,7 @@ using Microsoft.Toolkit.Mvvm.DependencyInjection; using Microsoft.Toolkit.Uwp; using Microsoft.Toolkit.Uwp.UI; +using Microsoft.UI.Xaml.Controls; using System; using System.Collections.Concurrent; using System.Collections.Generic; @@ -294,15 +295,39 @@ internal set private DispatcherQueueTimer dragOverTimer, tapDebounceTimer; - protected string previousInput = ""; - protected int previousCursorPosition = 0; - protected bool ignoreTextChange = false; - protected string previousRestrictedAttempt = ""; + public string renameTextBoxPreviousInput { get; set; } = ""; + public int renameTextBoxPreviousCursorPosition { get; set; } = 0; + public bool renameTextBoxIgnoreTextChange { get; set; } = false; + public string renameTextBoxPreviousRestrictedAttempt { get; set; } = ""; - private void ListViewTextBoxItemName_SelectionChanged(object s, RoutedEventArgs e) + protected TeachingTip FileNameTeachingTip; + + protected BaseLayout View; + + protected void SetFileNameTeachingTip(TeachingTip fileNameTeachingTip) + { + FileNameTeachingTip = fileNameTeachingTip; + } + + protected void SetView(BaseLayout view) + { + View = view; + } + + protected void RenameTextBoxItemName_SelectionChanged(object s, RoutedEventArgs e) + { + renameTextBoxPreviousCursorPosition = ((TextBox)s).SelectionStart; + } + + protected void RenameTextBoxItemName_TextChanging(TextBox textBox, TextBoxTextChangingEventArgs args) { - previousCursorPosition = ((TextBox)s).SelectionStart; + FilesystemHelpers.RenameHelperTextChanging(FileNameTeachingTip, textBox, View); } + protected void RenameTextBoxItemName_TextChanged(object sender, TextChangedEventArgs e) + { + FilesystemHelpers.RenameHelperTextChanged(FileNameTeachingTip, (sender as TextBox), View); + } + public BaseLayout() { diff --git a/src/Files/Filesystem/FilesystemOperations/Helpers/FilesystemHelpers.cs b/src/Files/Filesystem/FilesystemOperations/Helpers/FilesystemHelpers.cs index 423ddd68083d..eefe9d151c85 100644 --- a/src/Files/Filesystem/FilesystemOperations/Helpers/FilesystemHelpers.cs +++ b/src/Files/Filesystem/FilesystemOperations/Helpers/FilesystemHelpers.cs @@ -23,6 +23,7 @@ using Windows.Foundation.Collections; using Windows.Graphics.Imaging; using Windows.Storage; +using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; namespace Files.Filesystem @@ -1188,7 +1189,6 @@ public static string FilterRestrictedCharacters(string input) string filtered = ""; foreach (char c in input) { - Debug.WriteLine(c); if (!RestrictedCharacters.Contains(c)) { filtered = string.Concat(filtered, c); @@ -1197,6 +1197,41 @@ public static string FilterRestrictedCharacters(string input) return filtered; } + public static void RenameHelperTextChanging(Microsoft.UI.Xaml.Controls.TeachingTip FileNameTeachingTip, TextBox textBox, BaseLayout view) + { + if (ContainsRestrictedCharacters(textBox.Text)) + { + if (view.renameTextBoxPreviousRestrictedAttempt == textBox.Text) + { + textBox.Text = textBox.Text.Remove(textBox.Text.Length - view.renameTextBoxPreviousRestrictedAttempt.Length); + string filtered = FilterRestrictedCharacters(view.renameTextBoxPreviousRestrictedAttempt); + textBox.Text += filtered; + textBox.SelectionStart = view.renameTextBoxPreviousCursorPosition + Math.Abs(textBox.Text.Length - view.renameTextBoxPreviousInput.Length); + } + else + { + view.renameTextBoxIgnoreTextChange = true; + FileNameTeachingTip.Visibility = Visibility.Visible; + FileNameTeachingTip.IsOpen = true; + view.renameTextBoxPreviousRestrictedAttempt = textBox.Text; + textBox.Text = view.renameTextBoxPreviousInput; + textBox.SelectionStart = view.renameTextBoxPreviousCursorPosition; + } + return; + } + } + + public static void RenameHelperTextChanged(Microsoft.UI.Xaml.Controls.TeachingTip FileNameTeachingTip, TextBox textBox, BaseLayout view) + { + if (!view.renameTextBoxIgnoreTextChange) + { + FileNameTeachingTip.IsOpen = false; + FileNameTeachingTip.Visibility = Visibility.Collapsed; + view.renameTextBoxPreviousInput = textBox.Text; + } + view.renameTextBoxIgnoreTextChange = false; + } + #endregion Public Helpers #region IDisposable diff --git a/src/Files/Views/LayoutModes/ColumnViewBase.xaml b/src/Files/Views/LayoutModes/ColumnViewBase.xaml index 9fb9f8c46d30..56718b9c3c02 100644 --- a/src/Files/Views/LayoutModes/ColumnViewBase.xaml +++ b/src/Files/Views/LayoutModes/ColumnViewBase.xaml @@ -307,9 +307,9 @@ HorizontalAlignment="Stretch" VerticalAlignment="Stretch" TextAlignment="Left" - TextChanged="ListViewTextBoxItemName_TextChanged" - TextChanging="ListViewTextBoxItemName_TextChanging" - SelectionChanged="ListViewTextBoxItemName_SelectionChanged" + TextChanged="RenameTextBoxItemName_TextChanged" + TextChanging="RenameTextBoxItemName_TextChanging" + SelectionChanged="RenameTextBoxItemName_SelectionChanged" TextWrapping="Wrap" Visibility="Collapsed" /> diff --git a/src/Files/Views/LayoutModes/ColumnViewBase.xaml.cs b/src/Files/Views/LayoutModes/ColumnViewBase.xaml.cs index 70e249bd2abd..3ff6a52beae3 100644 --- a/src/Files/Views/LayoutModes/ColumnViewBase.xaml.cs +++ b/src/Files/Views/LayoutModes/ColumnViewBase.xaml.cs @@ -125,47 +125,6 @@ protected override void UnhookEvents() } } - private void ListViewTextBoxItemName_SelectionChanged(object s, RoutedEventArgs e) - { - previousCursorPosition = ((TextBox)s).SelectionStart; - } - - private void ListViewTextBoxItemName_TextChanging(TextBox textBox, TextBoxTextChangingEventArgs args) - { - if (FilesystemHelpers.ContainsRestrictedCharacters(textBox.Text)) - { - if (previousRestrictedAttempt == textBox.Text) - { - textBox.Text = textBox.Text.Remove(textBox.Text.Length - previousRestrictedAttempt.Length); - string filtered = FilesystemHelpers.FilterRestrictedCharacters(previousRestrictedAttempt); - textBox.Text += filtered; - textBox.SelectionStart = previousCursorPosition + Math.Abs(textBox.Text.Length - previousInput.Length); - } - else - { - ignoreTextChange = true; - FileNameTeachingTip.Visibility = Visibility.Visible; - FileNameTeachingTip.IsOpen = true; - previousRestrictedAttempt = textBox.Text; - textBox.Text = previousInput; - textBox.SelectionStart = previousCursorPosition; - } - return; - } - } - - private void ListViewTextBoxItemName_TextChanged(object sender, TextChangedEventArgs e) - { - if (!ignoreTextChange) - { - var textBox = sender as TextBox; - FileNameTeachingTip.IsOpen = false; - FileNameTeachingTip.Visibility = Visibility.Collapsed; - previousInput = textBox.Text; - } - ignoreTextChange = false; - } - public event EventHandler ItemInvoked; protected override void OnNavigatedTo(NavigationEventArgs eventArgs) @@ -208,6 +167,8 @@ private async void ReloadItemIcons() override public void StartRenameItem() { + SetView(this); + SetFileNameTeachingTip(FileNameTeachingTip); RenamingItem = FileList.SelectedItem as ListedItem; if (RenamingItem == null) { @@ -273,10 +234,10 @@ private void RenameTextBox_LostFocus(object sender, RoutedEventArgs e) private async void CommitRename(TextBox textBox) { - previousInput = ""; - previousCursorPosition = 0; - ignoreTextChange = false; - previousRestrictedAttempt = ""; + renameTextBoxPreviousInput = ""; + renameTextBoxPreviousCursorPosition = 0; + renameTextBoxIgnoreTextChange = false; + renameTextBoxPreviousRestrictedAttempt = ""; EndRename(textBox); string newItemName = textBox.Text.Trim().TrimEnd('.'); await UIFilesystemHelpers.RenameFileItemAsync(RenamingItem, newItemName, ParentShellPageInstance); diff --git a/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml b/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml index e2ab77fb16c6..18fd9025f41c 100644 --- a/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml +++ b/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml @@ -637,9 +637,9 @@ MaxWidth="{Binding MaxWidthForRenameTextbox, ElementName=PageRoot, Mode=OneWay}" HorizontalAlignment="Left" VerticalAlignment="Center" - TextChanged="ListViewTextBoxItemName_TextChanged" - TextChanging="ListViewTextBoxItemName_TextChanging" - SelectionChanged="ListViewTextBoxItemName_SelectionChanged" + TextChanged="RenameTextBoxItemName_TextChanged" + TextChanging="RenameTextBoxItemName_TextChanging" + SelectionChanged="RenameTextBoxItemName_SelectionChanged" Visibility="Collapsed"> diff --git a/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml.cs b/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml.cs index 94e3dd7f8daa..56641d07ae8b 100644 --- a/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml.cs +++ b/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml.cs @@ -331,6 +331,8 @@ private async void FileList_SelectionChanged(object sender, SelectionChangedEven override public void StartRenameItem() { + SetView(this); + SetFileNameTeachingTip(FileNameTeachingTip); RenamingItem = SelectedItem; if (RenamingItem == null) { @@ -365,46 +367,6 @@ override public void StartRenameItem() textBox.Select(0, selectedTextLength); IsRenamingItem = true; } - - private void ListViewTextBoxItemName_SelectionChanged(object s, RoutedEventArgs e) - { - previousCursorPosition = ((TextBox)s).SelectionStart; - } - - private void ListViewTextBoxItemName_TextChanging(TextBox textBox, TextBoxTextChangingEventArgs args) - { - if (FilesystemHelpers.ContainsRestrictedCharacters(textBox.Text)) - { - if (previousRestrictedAttempt == textBox.Text) - { - textBox.Text = textBox.Text.Remove(textBox.Text.Length - previousRestrictedAttempt.Length); - string filtered = FilesystemHelpers.FilterRestrictedCharacters(previousRestrictedAttempt); - textBox.Text += filtered; - textBox.SelectionStart = previousCursorPosition + Math.Abs(textBox.Text.Length - previousInput.Length); - } - else - { - ignoreTextChange = true; - FileNameTeachingTip.Visibility = Visibility.Visible; - FileNameTeachingTip.IsOpen = true; - previousRestrictedAttempt = textBox.Text; - textBox.Text = previousInput; - textBox.SelectionStart = previousCursorPosition; - } - return; - } - } - private void ListViewTextBoxItemName_TextChanged(object sender, TextChangedEventArgs e) - { - if (!ignoreTextChange) - { - var textBox = sender as TextBox; - FileNameTeachingTip.IsOpen = false; - FileNameTeachingTip.Visibility = Visibility.Collapsed; - previousInput = textBox.Text; - } - ignoreTextChange = false; - } private void RenameTextBox_KeyDown(object sender, KeyRoutedEventArgs e) { @@ -437,10 +399,10 @@ private void RenameTextBox_LostFocus(object sender, RoutedEventArgs e) private async void CommitRename(TextBox textBox) { - previousInput = ""; - previousCursorPosition = 0; - ignoreTextChange = false; - previousRestrictedAttempt = ""; + renameTextBoxPreviousInput = ""; + renameTextBoxPreviousCursorPosition = 0; + renameTextBoxIgnoreTextChange = false; + renameTextBoxPreviousRestrictedAttempt = ""; EndRename(textBox); string newItemName = textBox.Text.Trim().TrimEnd('.'); await UIFilesystemHelpers.RenameFileItemAsync(RenamingItem, newItemName, ParentShellPageInstance); diff --git a/src/Files/Views/LayoutModes/GridViewBrowser.xaml b/src/Files/Views/LayoutModes/GridViewBrowser.xaml index 13c154bed4c6..2079dafbbb7e 100644 --- a/src/Files/Views/LayoutModes/GridViewBrowser.xaml +++ b/src/Files/Views/LayoutModes/GridViewBrowser.xaml @@ -197,9 +197,9 @@ Background="{ThemeResource SolidBackgroundFillColorSecondary}" Text="{x:Bind ItemName, Mode=OneWay}" TextAlignment="Center" - TextChanged="GridViewTextBoxItemName_TextChanged" - TextChanging="GridViewTextBoxItemName_TextChanging" - SelectionChanged="GridViewTextBoxItemName_SelectionChanged" + TextChanged="RenameTextBoxItemName_TextChanged" + TextChanging="RenameTextBoxItemName_TextChanging" + SelectionChanged="RenameTextBoxItemName_SelectionChanged" TextWrapping="Wrap" /> @@ -338,9 +338,9 @@ Grid.Row="0" HorizontalAlignment="Left" Text="{x:Bind ItemName, Mode=OneWay}" - TextChanged="GridViewTextBoxItemName_TextChanged" - TextChanging="GridViewTextBoxItemName_TextChanging" - SelectionChanged="GridViewTextBoxItemName_SelectionChanged" + TextChanged="RenameTextBoxItemName_TextChanged" + TextChanging="RenameTextBoxItemName_TextChanging" + SelectionChanged="RenameTextBoxItemName_SelectionChanged" Visibility="Collapsed" /> Date: Fri, 11 Feb 2022 23:05:00 +0100 Subject: [PATCH 09/13] fix, distinguish between pasting and writing --- src/Files/BaseLayout.cs | 14 +++-- .../Helpers/FilesystemHelpers.cs | 61 +++++++++++-------- .../Views/LayoutModes/ColumnViewBase.xaml | 2 +- .../Views/LayoutModes/ColumnViewBase.xaml.cs | 2 +- .../LayoutModes/DetailsLayoutBrowser.xaml | 5 +- .../LayoutModes/DetailsLayoutBrowser.xaml.cs | 3 +- .../Views/LayoutModes/GridViewBrowser.xaml | 4 +- .../Views/LayoutModes/GridViewBrowser.xaml.cs | 5 +- 8 files changed, 56 insertions(+), 40 deletions(-) diff --git a/src/Files/BaseLayout.cs b/src/Files/BaseLayout.cs index fd9f57753097..7dd5101a8257 100644 --- a/src/Files/BaseLayout.cs +++ b/src/Files/BaseLayout.cs @@ -301,7 +301,7 @@ internal set public string renameTextBoxPreviousInput { get; set; } = ""; public int renameTextBoxPreviousCursorPosition { get; set; } = 0; - public bool renameTextBoxIgnoreTextChange { get; set; } = false; + public bool renameTextBoxPasted { get; set; } = false; public string renameTextBoxPreviousRestrictedAttempt { get; set; } = ""; protected TeachingTip FileNameTeachingTip; @@ -317,19 +317,21 @@ protected void SetView(BaseLayout view) { View = view; } - + protected void RenameTextBoxItemName_SelectionChanged(object s, RoutedEventArgs e) { renameTextBoxPreviousCursorPosition = ((TextBox)s).SelectionStart; } - + protected void RenameTextBoxItemName_TextChanging(TextBox textBox, TextBoxTextChangingEventArgs args) { - FilesystemHelpers.RenameHelperTextChanging(FileNameTeachingTip, textBox, View); + + FilesystemHelpers.RenameHelperTextChanging(FileNameTeachingTip, textBox, RenamingTextBlock, View); } - protected void RenameTextBoxItemName_TextChanged(object sender, TextChangedEventArgs e) + + protected void RenameTextBoxItemName_Paste(object sender, TextControlPasteEventArgs e) { - FilesystemHelpers.RenameHelperTextChanged(FileNameTeachingTip, (sender as TextBox), View); + renameTextBoxPasted = true; } diff --git a/src/Files/Filesystem/FilesystemOperations/Helpers/FilesystemHelpers.cs b/src/Files/Filesystem/FilesystemOperations/Helpers/FilesystemHelpers.cs index eefe9d151c85..d3b4b61fe596 100644 --- a/src/Files/Filesystem/FilesystemOperations/Helpers/FilesystemHelpers.cs +++ b/src/Files/Filesystem/FilesystemOperations/Helpers/FilesystemHelpers.cs @@ -11,6 +11,7 @@ using Files.ViewModels.Dialogs; using Microsoft.Toolkit.Mvvm.DependencyInjection; using Microsoft.Toolkit.Uwp; +using Microsoft.UI.Xaml.Controls; using System; using System.Collections.Generic; using System.Diagnostics; @@ -1196,40 +1197,48 @@ public static string FilterRestrictedCharacters(string input) } return filtered; } - - public static void RenameHelperTextChanging(Microsoft.UI.Xaml.Controls.TeachingTip FileNameTeachingTip, TextBox textBox, BaseLayout view) + + public static void RenameHelperTextChanging(TeachingTip FileNameTeachingTip, TextBox textBox, TextBlock textBlock, BaseLayout view) { - if (ContainsRestrictedCharacters(textBox.Text)) + if (view.renameTextBoxPreviousInput == "") { - if (view.renameTextBoxPreviousRestrictedAttempt == textBox.Text) - { - textBox.Text = textBox.Text.Remove(textBox.Text.Length - view.renameTextBoxPreviousRestrictedAttempt.Length); - string filtered = FilterRestrictedCharacters(view.renameTextBoxPreviousRestrictedAttempt); - textBox.Text += filtered; - textBox.SelectionStart = view.renameTextBoxPreviousCursorPosition + Math.Abs(textBox.Text.Length - view.renameTextBoxPreviousInput.Length); - } - else + view.renameTextBoxPreviousInput = /*((textBox.Parent as Grid).Children[0] as TextBlock)*/textBlock.Text; + } + bool hasRestrictedCharacter = ContainsRestrictedCharacters(textBox.Text); + if (hasRestrictedCharacter) + { + switch (view.renameTextBoxPasted, view.renameTextBoxPreviousRestrictedAttempt == textBox.Text) { - view.renameTextBoxIgnoreTextChange = true; - FileNameTeachingTip.Visibility = Visibility.Visible; - FileNameTeachingTip.IsOpen = true; - view.renameTextBoxPreviousRestrictedAttempt = textBox.Text; - textBox.Text = view.renameTextBoxPreviousInput; - textBox.SelectionStart = view.renameTextBoxPreviousCursorPosition; + case (true, true): + textBox.Text = textBox.Text.Remove(textBox.Text.Length - view.renameTextBoxPreviousRestrictedAttempt.Length); + string filtered = FilterRestrictedCharacters(view.renameTextBoxPreviousRestrictedAttempt); + textBox.Text += filtered; + textBox.SelectionStart = view.renameTextBoxPreviousCursorPosition + Math.Abs(textBox.Text.Length - view.renameTextBoxPreviousInput.Length); + FileNameTeachingTip.Visibility = Visibility.Collapsed; + FileNameTeachingTip.IsOpen = false; + break; + case (true, false): + FileNameTeachingTip.Visibility = Visibility.Visible; + FileNameTeachingTip.IsOpen = true; + view.renameTextBoxPreviousRestrictedAttempt = textBox.Text; + textBox.Text = view.renameTextBoxPreviousInput; + textBox.SelectionStart = view.renameTextBoxPreviousCursorPosition; + break; + default: + FileNameTeachingTip.Visibility = Visibility.Visible; + FileNameTeachingTip.IsOpen = true; + textBox.Text = view.renameTextBoxPreviousInput; + textBox.SelectionStart = view.renameTextBoxPreviousCursorPosition; + break; } - return; } - } - - public static void RenameHelperTextChanged(Microsoft.UI.Xaml.Controls.TeachingTip FileNameTeachingTip, TextBox textBox, BaseLayout view) - { - if (!view.renameTextBoxIgnoreTextChange) + else { - FileNameTeachingTip.IsOpen = false; FileNameTeachingTip.Visibility = Visibility.Collapsed; - view.renameTextBoxPreviousInput = textBox.Text; + FileNameTeachingTip.IsOpen = false; } - view.renameTextBoxIgnoreTextChange = false; + view.renameTextBoxPreviousInput = textBox.Text; + view.renameTextBoxPasted = false; } #endregion Public Helpers diff --git a/src/Files/Views/LayoutModes/ColumnViewBase.xaml b/src/Files/Views/LayoutModes/ColumnViewBase.xaml index 56718b9c3c02..93e3426685e3 100644 --- a/src/Files/Views/LayoutModes/ColumnViewBase.xaml +++ b/src/Files/Views/LayoutModes/ColumnViewBase.xaml @@ -307,9 +307,9 @@ HorizontalAlignment="Stretch" VerticalAlignment="Stretch" TextAlignment="Left" - TextChanged="RenameTextBoxItemName_TextChanged" TextChanging="RenameTextBoxItemName_TextChanging" SelectionChanged="RenameTextBoxItemName_SelectionChanged" + Paste="RenameTextBoxItemName_Paste" TextWrapping="Wrap" Visibility="Collapsed" /> diff --git a/src/Files/Views/LayoutModes/ColumnViewBase.xaml.cs b/src/Files/Views/LayoutModes/ColumnViewBase.xaml.cs index 3ff6a52beae3..4000695a5f77 100644 --- a/src/Files/Views/LayoutModes/ColumnViewBase.xaml.cs +++ b/src/Files/Views/LayoutModes/ColumnViewBase.xaml.cs @@ -236,7 +236,7 @@ private async void CommitRename(TextBox textBox) { renameTextBoxPreviousInput = ""; renameTextBoxPreviousCursorPosition = 0; - renameTextBoxIgnoreTextChange = false; + renameTextBoxPasted = false; renameTextBoxPreviousRestrictedAttempt = ""; EndRename(textBox); string newItemName = textBox.Text.Trim().TrimEnd('.'); diff --git a/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml b/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml index 18fd9025f41c..6d790e3c133a 100644 --- a/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml +++ b/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml @@ -629,6 +629,7 @@ @@ -637,9 +638,9 @@ MaxWidth="{Binding MaxWidthForRenameTextbox, ElementName=PageRoot, Mode=OneWay}" HorizontalAlignment="Left" VerticalAlignment="Center" - TextChanged="RenameTextBoxItemName_TextChanged" - TextChanging="RenameTextBoxItemName_TextChanging" SelectionChanged="RenameTextBoxItemName_SelectionChanged" + Paste="RenameTextBoxItemName_Paste" + TextChanging="RenameTextBoxItemName_TextChanging" Visibility="Collapsed"> diff --git a/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml.cs b/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml.cs index 56641d07ae8b..f66bdcfc1fb6 100644 --- a/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml.cs +++ b/src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml.cs @@ -346,6 +346,7 @@ override public void StartRenameItem() return; } TextBlock textBlock = listViewItem.FindDescendant("ItemName") as TextBlock; + RenamingTextBlock = textBlock; textBox = listViewItem.FindDescendant("ItemNameTextBox") as TextBox; //TextBlock textBlock = (gridViewItem.ContentTemplateRoot as Grid).FindName("ItemName") as TextBlock; //textBox = (gridViewItem.ContentTemplateRoot as Grid).FindName("TileViewTextBoxItemName") as TextBox; @@ -401,7 +402,7 @@ private async void CommitRename(TextBox textBox) { renameTextBoxPreviousInput = ""; renameTextBoxPreviousCursorPosition = 0; - renameTextBoxIgnoreTextChange = false; + renameTextBoxPasted = false; renameTextBoxPreviousRestrictedAttempt = ""; EndRename(textBox); string newItemName = textBox.Text.Trim().TrimEnd('.'); diff --git a/src/Files/Views/LayoutModes/GridViewBrowser.xaml b/src/Files/Views/LayoutModes/GridViewBrowser.xaml index 2079dafbbb7e..3817d17baa07 100644 --- a/src/Files/Views/LayoutModes/GridViewBrowser.xaml +++ b/src/Files/Views/LayoutModes/GridViewBrowser.xaml @@ -197,9 +197,9 @@ Background="{ThemeResource SolidBackgroundFillColorSecondary}" Text="{x:Bind ItemName, Mode=OneWay}" TextAlignment="Center" - TextChanged="RenameTextBoxItemName_TextChanged" TextChanging="RenameTextBoxItemName_TextChanging" SelectionChanged="RenameTextBoxItemName_SelectionChanged" + Paste="RenameTextBoxItemName_Paste" TextWrapping="Wrap" /> @@ -338,9 +338,9 @@ Grid.Row="0" HorizontalAlignment="Left" Text="{x:Bind ItemName, Mode=OneWay}" - TextChanged="RenameTextBoxItemName_TextChanged" TextChanging="RenameTextBoxItemName_TextChanging" SelectionChanged="RenameTextBoxItemName_SelectionChanged" + Paste="RenameTextBoxItemName_Paste" Visibility="Collapsed" /> Date: Sat, 12 Feb 2022 14:36:50 +0100 Subject: [PATCH 10/13] fix in new item dialog --- src/Files/Helpers/DynamicDialogFactory.cs | 97 ++++++++++++----------- 1 file changed, 52 insertions(+), 45 deletions(-) diff --git a/src/Files/Helpers/DynamicDialogFactory.cs b/src/Files/Helpers/DynamicDialogFactory.cs index 2fe8287baa8b..0d4019e25835 100644 --- a/src/Files/Helpers/DynamicDialogFactory.cs +++ b/src/Files/Helpers/DynamicDialogFactory.cs @@ -6,6 +6,7 @@ using System; using Windows.ApplicationModel.Core; using Windows.System; +using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; namespace Files.Helpers @@ -51,63 +52,69 @@ public static DynamicDialog GetFor_RenameDialog() TextBlock tipText = new TextBlock() { Text = "RenameDialogSymbolsTip/Text".GetLocalized(), - Margin = new Windows.UI.Xaml.Thickness(0, 0, 4, 0), - TextWrapping = Windows.UI.Xaml.TextWrapping.Wrap, + Margin = new Thickness(0, 0, 4, 0), + TextWrapping = TextWrapping.Wrap, Opacity = 0.0d }; - string previousInput = ""; - int previousCursorPosition = 0; - bool ignoreTextChange = false; + bool renameTextBoxPasted = false; + string renameTextBoxPreviousRestrictedAttempt = ""; + int renameTextBoxPreviousCursorPosition = 0; + string renameTextBoxPreviousInput = ""; - string previousRestrictedAttempt = ""; - - inputText.SelectionChanged += (s, e) => + inputText.TextChanging += (textBox, args) => { - previousCursorPosition = ((TextBox) s).SelectionStart; - }; - - inputText.TextChanging += (textBox, e) => - { - if (FilesystemHelpers.ContainsRestrictedCharacters(textBox.Text)) + bool hasRestrictedCharacter = FilesystemHelpers.ContainsRestrictedCharacters(textBox.Text); + if (hasRestrictedCharacter) { - if (previousRestrictedAttempt == textBox.Text) - { - textBox.Text = textBox.Text.Remove(textBox.Text.Length - previousRestrictedAttempt.Length); - string filtered = FilesystemHelpers.FilterRestrictedCharacters(previousRestrictedAttempt); - textBox.Text += filtered; - textBox.SelectionStart = previousCursorPosition + Math.Abs(textBox.Text.Length - previousInput.Length); - } - else + switch (renameTextBoxPasted, renameTextBoxPreviousRestrictedAttempt == textBox.Text) { - ignoreTextChange = true; - tipText.Opacity = 1.0d; - previousRestrictedAttempt = textBox.Text; - textBox.Text = previousInput; - textBox.SelectionStart = previousCursorPosition; + case (true, true): + textBox.Text = textBox.Text.Remove(textBox.Text.Length - renameTextBoxPreviousRestrictedAttempt.Length); + string filtered = FilesystemHelpers.FilterRestrictedCharacters(renameTextBoxPreviousRestrictedAttempt); + textBox.Text += filtered; + textBox.SelectionStart = renameTextBoxPreviousCursorPosition + Math.Abs(textBox.Text.Length - renameTextBoxPreviousInput.Length); + tipText.Opacity = 0.0d; + break; + case (true, false): + tipText.Opacity = 1.0d; + renameTextBoxPreviousRestrictedAttempt = textBox.Text; + textBox.Text = renameTextBoxPreviousInput; + textBox.SelectionStart = renameTextBoxPreviousCursorPosition; + break; + default: + tipText.Opacity = 1.0d; + textBox.Text = renameTextBoxPreviousInput; + textBox.SelectionStart = renameTextBoxPreviousCursorPosition; + break; } - return; } - }; - - inputText.TextChanged += (s, e) => - { - if (!ignoreTextChange) + else { - var textBox = s as TextBox; - dialog.ViewModel.AdditionalData = textBox.Text; - if (!string.IsNullOrWhiteSpace(textBox.Text)) - { - dialog.ViewModel.DynamicButtonsEnabled = DynamicDialogButtons.Primary | DynamicDialogButtons.Cancel; - } - else - { - dialog.ViewModel.DynamicButtonsEnabled = DynamicDialogButtons.Cancel; - } + textBox.SelectionStart++; tipText.Opacity = 0.0d; - previousInput = textBox.Text; } - ignoreTextChange = false; + renameTextBoxPreviousInput = textBox.Text; + renameTextBoxPasted = false; + dialog.ViewModel.AdditionalData = textBox.Text; + if (!string.IsNullOrWhiteSpace(textBox.Text)) + { + dialog.ViewModel.DynamicButtonsEnabled = DynamicDialogButtons.Primary | DynamicDialogButtons.Cancel; + } + else + { + dialog.ViewModel.DynamicButtonsEnabled = DynamicDialogButtons.Cancel; + } + }; + + inputText.SelectionChanged += (s, e) => + { + renameTextBoxPreviousCursorPosition = ((TextBox)s).SelectionStart; + }; + + inputText.Paste += (s, e) => + { + renameTextBoxPasted = true; }; inputText.Loaded += (s, e) => From 24489fef8f21e30f06ef811d947d87368321a36e Mon Sep 17 00:00:00 2001 From: szabolcstarnai Date: Sat, 12 Feb 2022 14:37:05 +0100 Subject: [PATCH 11/13] cleanup --- .../FilesystemOperations/Helpers/FilesystemHelpers.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Files/Filesystem/FilesystemOperations/Helpers/FilesystemHelpers.cs b/src/Files/Filesystem/FilesystemOperations/Helpers/FilesystemHelpers.cs index d3b4b61fe596..65c3e0ee6b3a 100644 --- a/src/Files/Filesystem/FilesystemOperations/Helpers/FilesystemHelpers.cs +++ b/src/Files/Filesystem/FilesystemOperations/Helpers/FilesystemHelpers.cs @@ -1202,7 +1202,7 @@ public static void RenameHelperTextChanging(TeachingTip FileNameTeachingTip, Tex { if (view.renameTextBoxPreviousInput == "") { - view.renameTextBoxPreviousInput = /*((textBox.Parent as Grid).Children[0] as TextBlock)*/textBlock.Text; + view.renameTextBoxPreviousInput = textBlock.Text; } bool hasRestrictedCharacter = ContainsRestrictedCharacters(textBox.Text); if (hasRestrictedCharacter) From 6f9cd770acbf15fc44624f9708257a29b68747b9 Mon Sep 17 00:00:00 2001 From: Marco Gavelli Date: Sat, 19 Mar 2022 20:25:37 +0100 Subject: [PATCH 12/13] Restore changes to view modes --- src/Files.Uwp/Views/LayoutModes/ColumnViewBase.xaml | 4 +++- src/Files.Uwp/Views/LayoutModes/DetailsLayoutBrowser.xaml | 4 +++- src/Files.Uwp/Views/LayoutModes/GridViewBrowser.xaml | 8 ++++---- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/Files.Uwp/Views/LayoutModes/ColumnViewBase.xaml b/src/Files.Uwp/Views/LayoutModes/ColumnViewBase.xaml index d10417d9c8ef..d5bf441e5b3d 100644 --- a/src/Files.Uwp/Views/LayoutModes/ColumnViewBase.xaml +++ b/src/Files.Uwp/Views/LayoutModes/ColumnViewBase.xaml @@ -310,8 +310,10 @@ Margin="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" + Paste="RenameTextBoxItemName_Paste" + SelectionChanged="RenameTextBoxItemName_SelectionChanged" TextAlignment="Left" - TextChanged="ListViewTextBoxItemName_TextChanged" + TextChanging="RenameTextBoxItemName_TextChanging" TextWrapping="Wrap" Visibility="Collapsed" /> diff --git a/src/Files.Uwp/Views/LayoutModes/DetailsLayoutBrowser.xaml b/src/Files.Uwp/Views/LayoutModes/DetailsLayoutBrowser.xaml index 8a50e8853e48..686154a63412 100644 --- a/src/Files.Uwp/Views/LayoutModes/DetailsLayoutBrowser.xaml +++ b/src/Files.Uwp/Views/LayoutModes/DetailsLayoutBrowser.xaml @@ -640,7 +640,9 @@ MaxWidth="{Binding MaxWidthForRenameTextbox, ElementName=PageRoot, Mode=OneWay}" HorizontalAlignment="Left" VerticalAlignment="Center" - TextChanged="ListViewTextBoxItemName_TextChanged" + Paste="RenameTextBoxItemName_Paste" + SelectionChanged="RenameTextBoxItemName_SelectionChanged" + TextChanging="RenameTextBoxItemName_TextChanging" Visibility="Collapsed"> diff --git a/src/Files.Uwp/Views/LayoutModes/GridViewBrowser.xaml b/src/Files.Uwp/Views/LayoutModes/GridViewBrowser.xaml index 66a807393658..bf1a29b3c1b8 100644 --- a/src/Files.Uwp/Views/LayoutModes/GridViewBrowser.xaml +++ b/src/Files.Uwp/Views/LayoutModes/GridViewBrowser.xaml @@ -197,11 +197,11 @@ HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="{ThemeResource SolidBackgroundFillColorSecondary}" + Paste="RenameTextBoxItemName_Paste" + SelectionChanged="RenameTextBoxItemName_SelectionChanged" Text="{x:Bind ItemName, Mode=OneWay}" TextAlignment="Center" TextChanging="RenameTextBoxItemName_TextChanging" - SelectionChanged="RenameTextBoxItemName_SelectionChanged" - Paste="RenameTextBoxItemName_Paste" TextWrapping="Wrap" /> @@ -339,10 +339,10 @@ x:Name="TileViewTextBoxItemName" Grid.Row="0" HorizontalAlignment="Left" + Paste="RenameTextBoxItemName_Paste" + SelectionChanged="RenameTextBoxItemName_SelectionChanged" Text="{x:Bind ItemName, Mode=OneWay}" TextChanging="RenameTextBoxItemName_TextChanging" - SelectionChanged="RenameTextBoxItemName_SelectionChanged" - Paste="RenameTextBoxItemName_Paste" Visibility="Collapsed" /> Date: Sat, 19 Mar 2022 21:01:25 +0100 Subject: [PATCH 13/13] Switch to BeforeTextChanging event to avoid having to keep state as class members. Fix pasting not working the first time. --- src/Files.Uwp/BaseLayout.cs | 59 +++++--------- .../Helpers/FilesystemHelpers.cs | 69 +++-------------- src/Files.Uwp/Helpers/DynamicDialogFactory.cs | 76 ++++++------------- .../Views/LayoutModes/ColumnViewBase.xaml | 4 +- .../Views/LayoutModes/ColumnViewBase.xaml.cs | 28 +++---- .../LayoutModes/DetailsLayoutBrowser.xaml | 4 +- .../LayoutModes/DetailsLayoutBrowser.xaml.cs | 20 ++--- .../Views/LayoutModes/GridViewBrowser.xaml | 8 +- .../Views/LayoutModes/GridViewBrowser.xaml.cs | 24 +++--- 9 files changed, 92 insertions(+), 200 deletions(-) diff --git a/src/Files.Uwp/BaseLayout.cs b/src/Files.Uwp/BaseLayout.cs index 0f2460e7d4fd..bc06dc96d5f9 100644 --- a/src/Files.Uwp/BaseLayout.cs +++ b/src/Files.Uwp/BaseLayout.cs @@ -14,7 +14,6 @@ using CommunityToolkit.Mvvm.DependencyInjection; using Microsoft.Toolkit.Uwp; using Microsoft.Toolkit.Uwp.UI; -using Microsoft.UI.Xaml.Controls; using System; using System.Collections.Concurrent; using System.Collections.Generic; @@ -84,8 +83,6 @@ public abstract class BaseLayout : Page, IBaseLayout, INotifyPropertyChanged public string OldItemName { get; set; } = null; - public TextBlock RenamingTextBlock { get; set; } = null; - private bool isMiddleClickToScrollEnabled = true; public bool IsMiddleClickToScrollEnabled @@ -303,42 +300,6 @@ internal set private DispatcherQueueTimer dragOverTimer, tapDebounceTimer; - public string renameTextBoxPreviousInput { get; set; } = ""; - public int renameTextBoxPreviousCursorPosition { get; set; } = 0; - public bool renameTextBoxPasted { get; set; } = false; - public string renameTextBoxPreviousRestrictedAttempt { get; set; } = ""; - - protected TeachingTip FileNameTeachingTip; - - protected BaseLayout View; - - protected void SetFileNameTeachingTip(TeachingTip fileNameTeachingTip) - { - FileNameTeachingTip = fileNameTeachingTip; - } - - protected void SetView(BaseLayout view) - { - View = view; - } - - protected void RenameTextBoxItemName_SelectionChanged(object s, RoutedEventArgs e) - { - renameTextBoxPreviousCursorPosition = ((TextBox)s).SelectionStart; - } - - protected void RenameTextBoxItemName_TextChanging(TextBox textBox, TextBoxTextChangingEventArgs args) - { - - FilesystemHelpers.RenameHelperTextChanging(FileNameTeachingTip, textBox, RenamingTextBlock, View); - } - - protected void RenameTextBoxItemName_Paste(object sender, TextControlPasteEventArgs e) - { - renameTextBoxPasted = true; - } - - public BaseLayout() { ItemManipulationModel = new ItemManipulationModel(); @@ -1273,6 +1234,26 @@ public void ResetRenameDoubleClick() preRenamingItem = null; tapDebounceTimer.Stop(); } + + protected async void ValidateItemNameInputText(TextBox textBox, TextBoxBeforeTextChangingEventArgs args, Action showError) + { + if (FilesystemHelpers.ContainsRestrictedCharacters(args.NewText)) + { + args.Cancel = true; + await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => + { + var oldSelection = textBox.SelectionStart + textBox.SelectionLength; + var oldText = textBox.Text; + textBox.Text = FilesystemHelpers.FilterRestrictedCharacters(args.NewText); + textBox.SelectionStart = oldSelection + textBox.Text.Length - oldText.Length; + showError?.Invoke(true); + }); + } + else + { + showError?.Invoke(false); + } + } } public class ContextMenuExtensions : DependencyObject diff --git a/src/Files.Uwp/Filesystem/FilesystemOperations/Helpers/FilesystemHelpers.cs b/src/Files.Uwp/Filesystem/FilesystemOperations/Helpers/FilesystemHelpers.cs index 16a1cafc0649..6a0d88414cdc 100644 --- a/src/Files.Uwp/Filesystem/FilesystemOperations/Helpers/FilesystemHelpers.cs +++ b/src/Files.Uwp/Filesystem/FilesystemOperations/Helpers/FilesystemHelpers.cs @@ -9,7 +9,6 @@ using Files.ViewModels.Dialogs; using CommunityToolkit.Mvvm.DependencyInjection; using Microsoft.Toolkit.Uwp; -using Microsoft.UI.Xaml.Controls; using System; using System.Collections.Generic; using System.Diagnostics; @@ -22,8 +21,6 @@ using Windows.Foundation.Collections; using Windows.Graphics.Imaging; using Windows.Storage; -using Windows.UI.Xaml; -using Windows.UI.Xaml.Controls; using Files.Shared.Extensions; using Files.Backend.Extensions; @@ -813,6 +810,16 @@ public static async Task> GetDraggedStorageIte return itemsList; } + public static string FilterRestrictedCharacters(string input) + { + int invalidCharIndex; + while ((invalidCharIndex = input.IndexOfAny(RestrictedCharacters)) >= 0) + { + input = input.Remove(invalidCharIndex, 1); + } + return input; + } + public static bool ContainsRestrictedCharacters(string input) { return input.IndexOfAny(RestrictedCharacters) >= 0; @@ -829,62 +836,6 @@ public static bool ContainsRestrictedFileName(string input) return false; } - public static string FilterRestrictedCharacters(string input) - { - string filtered = ""; - foreach (char c in input) - { - if (!RestrictedCharacters.Contains(c)) - { - filtered = string.Concat(filtered, c); - } - } - return filtered; - } - - public static void RenameHelperTextChanging(TeachingTip FileNameTeachingTip, TextBox textBox, TextBlock textBlock, BaseLayout view) - { - if (view.renameTextBoxPreviousInput == "") - { - view.renameTextBoxPreviousInput = textBlock.Text; - } - bool hasRestrictedCharacter = ContainsRestrictedCharacters(textBox.Text); - if (hasRestrictedCharacter) - { - switch (view.renameTextBoxPasted, view.renameTextBoxPreviousRestrictedAttempt == textBox.Text) - { - case (true, true): - textBox.Text = textBox.Text.Remove(textBox.Text.Length - view.renameTextBoxPreviousRestrictedAttempt.Length); - string filtered = FilterRestrictedCharacters(view.renameTextBoxPreviousRestrictedAttempt); - textBox.Text += filtered; - textBox.SelectionStart = view.renameTextBoxPreviousCursorPosition + Math.Abs(textBox.Text.Length - view.renameTextBoxPreviousInput.Length); - FileNameTeachingTip.Visibility = Visibility.Collapsed; - FileNameTeachingTip.IsOpen = false; - break; - case (true, false): - FileNameTeachingTip.Visibility = Visibility.Visible; - FileNameTeachingTip.IsOpen = true; - view.renameTextBoxPreviousRestrictedAttempt = textBox.Text; - textBox.Text = view.renameTextBoxPreviousInput; - textBox.SelectionStart = view.renameTextBoxPreviousCursorPosition; - break; - default: - FileNameTeachingTip.Visibility = Visibility.Visible; - FileNameTeachingTip.IsOpen = true; - textBox.Text = view.renameTextBoxPreviousInput; - textBox.SelectionStart = view.renameTextBoxPreviousCursorPosition; - break; - } - } - else - { - FileNameTeachingTip.Visibility = Visibility.Collapsed; - FileNameTeachingTip.IsOpen = false; - } - view.renameTextBoxPreviousInput = textBox.Text; - view.renameTextBoxPasted = false; - } - #endregion Public Helpers #region IDisposable diff --git a/src/Files.Uwp/Helpers/DynamicDialogFactory.cs b/src/Files.Uwp/Helpers/DynamicDialogFactory.cs index c0edc810b9ee..43fdd5f40cd2 100644 --- a/src/Files.Uwp/Helpers/DynamicDialogFactory.cs +++ b/src/Files.Uwp/Helpers/DynamicDialogFactory.cs @@ -6,7 +6,6 @@ using System; using Windows.ApplicationModel.Core; using Windows.System; -using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; namespace Files.Helpers @@ -52,69 +51,40 @@ public static DynamicDialog GetFor_RenameDialog() TextBlock tipText = new TextBlock() { Text = "RenameDialogSymbolsTip/Text".GetLocalized(), - Margin = new Thickness(0, 0, 4, 0), - TextWrapping = TextWrapping.Wrap, + Margin = new Windows.UI.Xaml.Thickness(0, 0, 4, 0), + TextWrapping = Windows.UI.Xaml.TextWrapping.Wrap, Opacity = 0.0d }; - bool renameTextBoxPasted = false; - string renameTextBoxPreviousRestrictedAttempt = ""; - int renameTextBoxPreviousCursorPosition = 0; - string renameTextBoxPreviousInput = ""; - - inputText.TextChanging += (textBox, args) => + inputText.BeforeTextChanging += async (textBox, args) => { - bool hasRestrictedCharacter = FilesystemHelpers.ContainsRestrictedCharacters(textBox.Text); - if (hasRestrictedCharacter) + if (FilesystemHelpers.ContainsRestrictedCharacters(args.NewText)) { - switch (renameTextBoxPasted, renameTextBoxPreviousRestrictedAttempt == textBox.Text) + args.Cancel = true; + await inputText.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { - case (true, true): - textBox.Text = textBox.Text.Remove(textBox.Text.Length - renameTextBoxPreviousRestrictedAttempt.Length); - string filtered = FilesystemHelpers.FilterRestrictedCharacters(renameTextBoxPreviousRestrictedAttempt); - textBox.Text += filtered; - textBox.SelectionStart = renameTextBoxPreviousCursorPosition + Math.Abs(textBox.Text.Length - renameTextBoxPreviousInput.Length); - tipText.Opacity = 0.0d; - break; - case (true, false): - tipText.Opacity = 1.0d; - renameTextBoxPreviousRestrictedAttempt = textBox.Text; - textBox.Text = renameTextBoxPreviousInput; - textBox.SelectionStart = renameTextBoxPreviousCursorPosition; - break; - default: - tipText.Opacity = 1.0d; - textBox.Text = renameTextBoxPreviousInput; - textBox.SelectionStart = renameTextBoxPreviousCursorPosition; - break; - } - } - else - { - textBox.SelectionStart++; - tipText.Opacity = 0.0d; - } - renameTextBoxPreviousInput = textBox.Text; - renameTextBoxPasted = false; - dialog.ViewModel.AdditionalData = textBox.Text; - if (!string.IsNullOrWhiteSpace(textBox.Text)) - { - dialog.ViewModel.DynamicButtonsEnabled = DynamicDialogButtons.Primary | DynamicDialogButtons.Cancel; + var oldSelection = textBox.SelectionStart + textBox.SelectionLength; + var oldText = textBox.Text; + textBox.Text = FilesystemHelpers.FilterRestrictedCharacters(args.NewText); + textBox.SelectionStart = oldSelection + textBox.Text.Length - oldText.Length; + tipText.Opacity = 1.0d; + }); } else { - dialog.ViewModel.DynamicButtonsEnabled = DynamicDialogButtons.Cancel; - } - }; + dialog.ViewModel.AdditionalData = textBox.Text; - inputText.SelectionChanged += (s, e) => - { - renameTextBoxPreviousCursorPosition = ((TextBox)s).SelectionStart; - }; + if (!string.IsNullOrWhiteSpace(textBox.Text)) + { + dialog.ViewModel.DynamicButtonsEnabled = DynamicDialogButtons.Primary | DynamicDialogButtons.Cancel; + } + else + { + dialog.ViewModel.DynamicButtonsEnabled = DynamicDialogButtons.Cancel; + } - inputText.Paste += (s, e) => - { - renameTextBoxPasted = true; + tipText.Opacity = 0.0d; + } }; inputText.Loaded += (s, e) => diff --git a/src/Files.Uwp/Views/LayoutModes/ColumnViewBase.xaml b/src/Files.Uwp/Views/LayoutModes/ColumnViewBase.xaml index d5bf441e5b3d..d256c5785a51 100644 --- a/src/Files.Uwp/Views/LayoutModes/ColumnViewBase.xaml +++ b/src/Files.Uwp/Views/LayoutModes/ColumnViewBase.xaml @@ -310,10 +310,8 @@ Margin="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" - Paste="RenameTextBoxItemName_Paste" - SelectionChanged="RenameTextBoxItemName_SelectionChanged" + BeforeTextChanging="ItemNameTextBox_BeforeTextChanging" TextAlignment="Left" - TextChanging="RenameTextBoxItemName_TextChanging" TextWrapping="Wrap" Visibility="Collapsed" /> diff --git a/src/Files.Uwp/Views/LayoutModes/ColumnViewBase.xaml.cs b/src/Files.Uwp/Views/LayoutModes/ColumnViewBase.xaml.cs index a0aa1f838115..d677f40ac684 100644 --- a/src/Files.Uwp/Views/LayoutModes/ColumnViewBase.xaml.cs +++ b/src/Files.Uwp/Views/LayoutModes/ColumnViewBase.xaml.cs @@ -168,8 +168,6 @@ private async void ReloadItemIcons() override public void StartRenameItem() { - SetView(this); - SetFileNameTeachingTip(FileNameTeachingTip); RenamingItem = FileList.SelectedItem as ListedItem; if (RenamingItem == null) { @@ -182,13 +180,11 @@ override public void StartRenameItem() { return; } - RenamingTextBlock = listViewItem.FindDescendant("ItemName") as TextBlock; + TextBlock textBlock = listViewItem.FindDescendant("ItemName") as TextBlock; textBox = listViewItem.FindDescendant("ListViewTextBoxItemName") as TextBox; - //textBlock = (listViewItem.ContentTemplateRoot as Border).FindDescendant("ItemName") as TextBlock; - //textBox = (listViewItem.ContentTemplateRoot as Border).FindDescendant("ListViewTextBoxItemName") as TextBox; - textBox.Text = RenamingTextBlock.Text; - OldItemName = RenamingTextBlock.Text; - RenamingTextBlock.Visibility = Visibility.Collapsed; + textBox.Text = textBlock.Text; + OldItemName = textBlock.Text; + textBlock.Visibility = Visibility.Collapsed; textBox.Visibility = Visibility.Visible; textBox.Focus(FocusState.Pointer); @@ -204,6 +200,15 @@ override public void StartRenameItem() IsRenamingItem = true; } + private void ItemNameTextBox_BeforeTextChanging(TextBox textBox, TextBoxBeforeTextChangingEventArgs args) + { + ValidateItemNameInputText(textBox, args, (showError) => + { + FileNameTeachingTip.Visibility = showError ? Visibility.Visible : Visibility.Collapsed; + FileNameTeachingTip.IsOpen = showError; + }); + } + private void RenameTextBox_KeyDown(object sender, KeyRoutedEventArgs e) { if (e.Key == VirtualKey.Escape) @@ -235,10 +240,6 @@ private void RenameTextBox_LostFocus(object sender, RoutedEventArgs e) private async void CommitRename(TextBox textBox) { - renameTextBoxPreviousInput = ""; - renameTextBoxPreviousCursorPosition = 0; - renameTextBoxPasted = false; - renameTextBoxPreviousRestrictedAttempt = ""; EndRename(textBox); string newItemName = textBox.Text.Trim().TrimEnd('.'); await UIFilesystemHelpers.RenameFileItemAsync(RenamingItem, newItemName, ParentShellPageInstance); @@ -256,8 +257,9 @@ private void EndRename(TextBox textBox) ListViewItem listViewItem = FileList.ContainerFromItem(RenamingItem) as ListViewItem; listViewItem?.Focus(FocusState.Programmatic); + TextBlock textBlock = listViewItem.FindDescendant("ItemName") as TextBlock; textBox.Visibility = Visibility.Collapsed; - RenamingTextBlock.Visibility = Visibility.Visible; + textBlock.Visibility = Visibility.Visible; } textBox.LostFocus -= RenameTextBox_LostFocus; diff --git a/src/Files.Uwp/Views/LayoutModes/DetailsLayoutBrowser.xaml b/src/Files.Uwp/Views/LayoutModes/DetailsLayoutBrowser.xaml index 686154a63412..4c17ca82dc9b 100644 --- a/src/Files.Uwp/Views/LayoutModes/DetailsLayoutBrowser.xaml +++ b/src/Files.Uwp/Views/LayoutModes/DetailsLayoutBrowser.xaml @@ -640,9 +640,7 @@ MaxWidth="{Binding MaxWidthForRenameTextbox, ElementName=PageRoot, Mode=OneWay}" HorizontalAlignment="Left" VerticalAlignment="Center" - Paste="RenameTextBoxItemName_Paste" - SelectionChanged="RenameTextBoxItemName_SelectionChanged" - TextChanging="RenameTextBoxItemName_TextChanging" + BeforeTextChanging="ItemNameTextBox_BeforeTextChanging" Visibility="Collapsed"> diff --git a/src/Files.Uwp/Views/LayoutModes/DetailsLayoutBrowser.xaml.cs b/src/Files.Uwp/Views/LayoutModes/DetailsLayoutBrowser.xaml.cs index 06e4803fae94..b62842b9682a 100644 --- a/src/Files.Uwp/Views/LayoutModes/DetailsLayoutBrowser.xaml.cs +++ b/src/Files.Uwp/Views/LayoutModes/DetailsLayoutBrowser.xaml.cs @@ -331,8 +331,6 @@ private async void FileList_SelectionChanged(object sender, SelectionChangedEven override public void StartRenameItem() { - SetView(this); - SetFileNameTeachingTip(FileNameTeachingTip); RenamingItem = SelectedItem; if (RenamingItem == null) { @@ -346,10 +344,7 @@ override public void StartRenameItem() return; } TextBlock textBlock = listViewItem.FindDescendant("ItemName") as TextBlock; - RenamingTextBlock = textBlock; textBox = listViewItem.FindDescendant("ItemNameTextBox") as TextBox; - //TextBlock textBlock = (gridViewItem.ContentTemplateRoot as Grid).FindName("ItemName") as TextBlock; - //textBox = (gridViewItem.ContentTemplateRoot as Grid).FindName("TileViewTextBoxItemName") as TextBox; textBox.Text = textBlock.Text; OldItemName = textBlock.Text; textBlock.Visibility = Visibility.Collapsed; @@ -368,7 +363,16 @@ override public void StartRenameItem() textBox.Select(0, selectedTextLength); IsRenamingItem = true; } - + + private void ItemNameTextBox_BeforeTextChanging(TextBox textBox, TextBoxBeforeTextChangingEventArgs args) + { + ValidateItemNameInputText(textBox, args, (showError) => + { + FileNameTeachingTip.Visibility = showError ? Visibility.Visible : Visibility.Collapsed; + FileNameTeachingTip.IsOpen = showError; + }); + } + private void RenameTextBox_KeyDown(object sender, KeyRoutedEventArgs e) { if (e.Key == VirtualKey.Escape) @@ -400,10 +404,6 @@ private void RenameTextBox_LostFocus(object sender, RoutedEventArgs e) private async void CommitRename(TextBox textBox) { - renameTextBoxPreviousInput = ""; - renameTextBoxPreviousCursorPosition = 0; - renameTextBoxPasted = false; - renameTextBoxPreviousRestrictedAttempt = ""; EndRename(textBox); string newItemName = textBox.Text.Trim().TrimEnd('.'); await UIFilesystemHelpers.RenameFileItemAsync(RenamingItem, newItemName, ParentShellPageInstance); diff --git a/src/Files.Uwp/Views/LayoutModes/GridViewBrowser.xaml b/src/Files.Uwp/Views/LayoutModes/GridViewBrowser.xaml index bf1a29b3c1b8..a58eeb55b3db 100644 --- a/src/Files.Uwp/Views/LayoutModes/GridViewBrowser.xaml +++ b/src/Files.Uwp/Views/LayoutModes/GridViewBrowser.xaml @@ -197,11 +197,9 @@ HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="{ThemeResource SolidBackgroundFillColorSecondary}" - Paste="RenameTextBoxItemName_Paste" - SelectionChanged="RenameTextBoxItemName_SelectionChanged" + BeforeTextChanging="ItemNameTextBox_BeforeTextChanging" Text="{x:Bind ItemName, Mode=OneWay}" TextAlignment="Center" - TextChanging="RenameTextBoxItemName_TextChanging" TextWrapping="Wrap" /> @@ -339,10 +337,8 @@ x:Name="TileViewTextBoxItemName" Grid.Row="0" HorizontalAlignment="Left" - Paste="RenameTextBoxItemName_Paste" - SelectionChanged="RenameTextBoxItemName_SelectionChanged" + BeforeTextChanging="ItemNameTextBox_BeforeTextChanging" Text="{x:Bind ItemName, Mode=OneWay}" - TextChanging="RenameTextBoxItemName_TextChanging" Visibility="Collapsed" /> + { + FileNameTeachingTip.Visibility = showError ? Visibility.Visible : Visibility.Collapsed; + FileNameTeachingTip.IsOpen = showError; + }); + } + private void RenameTextBox_KeyDown(object sender, KeyRoutedEventArgs e) { if (e.Key == VirtualKey.Escape) @@ -328,10 +328,6 @@ private void RenameTextBox_LostFocus(object sender, RoutedEventArgs e) private async void CommitRename(TextBox textBox) { - renameTextBoxPreviousInput = ""; - renameTextBoxPreviousCursorPosition = 0; - renameTextBoxPasted = false; - renameTextBoxPreviousRestrictedAttempt = ""; EndRename(textBox); string newItemName = textBox.Text.Trim().TrimEnd('.'); await UIFilesystemHelpers.RenameFileItemAsync(RenamingItem, newItemName, ParentShellPageInstance); @@ -361,7 +357,7 @@ private void EndRename(TextBox textBox) textBox.KeyDown -= RenameTextBox_KeyDown; FileNameTeachingTip.IsOpen = false; IsRenamingItem = false; - + // Re-focus selected list item GridViewItem gridViewItem = FileList.ContainerFromItem(RenamingItem) as GridViewItem; gridViewItem?.Focus(FocusState.Programmatic);