Skip to content

Commit ef5f03d

Browse files
committed
Improve renaming to allow inline renaming
- RenameDialog replaced with inline renaming in GenericFileBrowser - Files and folders can now be renamed to the same name but in different case - File extensions can now be changed when renaming files
1 parent 73c879b commit ef5f03d

File tree

4 files changed

+92
-148
lines changed

4 files changed

+92
-148
lines changed

Files UWP/GenericFileBrowser.xaml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@
199199
</Grid.ContextFlyout>
200200
<ProgressBar x:Name="progBar" Height="10" VerticalAlignment="Top" IsIndeterminate="True"/>
201201
<TextBlock Visibility="{x:Bind Mode=TwoWay, Path=TextState.isVisible, UpdateSourceTrigger=PropertyChanged}" x:Name="EmptyText" HorizontalAlignment="Center" Text="This folder is empty." TextWrapping="Wrap" VerticalAlignment="Top" Margin="0,125,0,0"/>
202-
<controls:DataGrid ItemsSource="{x:Bind viewModelInstance.FilesAndFolders}" ScrollViewer.IsScrollInertiaEnabled="True" ClipboardCopyMode="None" RowDetailsVisibilityMode="Collapsed" AllowDrop="True" Drop="AllView_DropAsync" DragLeave="AllView_DragLeave" DragStarting="AllView_DragStarting" SelectionChanged="AllView_SelectionChanged" Margin="24,24,0,0" Grid.Row="3" CellEditEnded="AllView_CellEditEnded" FocusVisualPrimaryThickness="0" SelectionMode="Extended" IsDoubleTapEnabled="True" x:FieldModifier="public" x:Name="AllView" AutoGenerateColumns="False" CanDrag="True" DragOver="AllView_DragOver" IsRightTapEnabled="True" CanUserReorderColumns="False" IsReadOnly="True" HorizontalAlignment="Left">
202+
<controls:DataGrid ItemsSource="{x:Bind viewModelInstance.FilesAndFolders}" ScrollViewer.IsScrollInertiaEnabled="True" ClipboardCopyMode="None" RowDetailsVisibilityMode="Collapsed" AllowDrop="True" Drop="AllView_DropAsync" DragLeave="AllView_DragLeave" DragStarting="AllView_DragStarting" SelectionChanged="AllView_SelectionChanged" Margin="24,24,0,0" Grid.Row="3" PreparingCellForEdit="AllView_PreparingCellForEdit" CellEditEnding="AllView_CellEditEnding" FocusVisualPrimaryThickness="0" SelectionMode="Extended" IsDoubleTapEnabled="True" x:FieldModifier="public" x:Name="AllView" AutoGenerateColumns="False" CanDrag="True" DragOver="AllView_DragOver" IsRightTapEnabled="True" CanUserReorderColumns="False" HorizontalAlignment="Left">
203203
<controls:DataGrid.Resources>
204204
<SolidColorBrush x:Key="DataGridCellFocusVisualPrimaryBrush" Color="Transparent"/>
205205
<SolidColorBrush x:Key="DataGridCellFocusVisualSecondaryBrush" Color="Transparent"/>
@@ -254,7 +254,6 @@
254254
<KeyboardAccelerator Modifiers="Control" Key="S"/>
255255
</MenuFlyoutItem.KeyboardAccelerators>
256256
</MenuFlyoutItem>
257-
258257
<MenuFlyoutSeparator/>
259258
<MenuFlyoutItem Text="Delete" x:Name="DeleteItem" >
260259
<MenuFlyoutItem.Icon>
@@ -332,7 +331,7 @@
332331
</DataTemplate>
333332
</controls:DataGridTemplateColumn.CellTemplate>
334333
</controls:DataGridTemplateColumn>
335-
<controls:DataGridTextColumn DisplayIndex="1" IsReadOnly="True" Header="Name" Width="275" Binding="{Binding FileName}" Tag="Name"/>
334+
<controls:DataGridTextColumn DisplayIndex="1" Header="Name" Width="275" Binding="{Binding FileName}" Tag="Name"/>
336335
<controls:DataGridTextColumn DisplayIndex="2" IsReadOnly="True" Header="Date modified" Width="Auto" Binding="{Binding FileDate}" Tag="Date"/>
337336
<controls:DataGridTextColumn DisplayIndex="3" IsReadOnly="True" Header="Type" Width="150" Binding="{Binding FileType}" Tag="Type"/>
338337
<controls:DataGridTextColumn DisplayIndex="4" x:Name="sizeColumn" IsReadOnly="True" Header="Size" Width="Auto" MinWidth="100" Binding="{Binding FileSize}" Tag="Size"/>

Files UWP/GenericFileBrowser.xaml.cs

Lines changed: 24 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public sealed partial class GenericFileBrowser : Page
2727
public Page GFBPageName;
2828
public ContentDialog AddItemBox;
2929
public ContentDialog NameBox;
30+
public string previousFileName;
3031
public TextBox inputFromRename;
3132
public string inputForRename;
3233
public Flyout CopiedFlyout;
@@ -79,11 +80,6 @@ public GenericFileBrowser()
7980
OpenInNewWindowItem.Click += tabInstance.instanceInteraction.OpenInNewWindowItem_Click;
8081
}
8182

82-
private void AddItem_Click(object sender, RoutedEventArgs e)
83-
{
84-
//await AddDialog.ShowAsync();
85-
}
86-
8783
private void Clipboard_ContentChanged(object sender, object e)
8884
{
8985
try
@@ -126,7 +122,6 @@ protected override void OnNavigatedTo(NavigationEventArgs eventArgs)
126122

127123
Clipboard_ContentChanged(null, null);
128124
tabInstance.AlwaysPresentCommands.isEnabled = true;
129-
tabInstance.AddItemButton.Click += AddItem_Click;
130125

131126
TextState.isVisible = Visibility.Collapsed;
132127

@@ -196,7 +191,6 @@ protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
196191
//this.Bindings.StopTracking();
197192
}
198193

199-
200194
private void AllView_DragOver(object sender, DragEventArgs e)
201195
{
202196
e.AcceptedOperation = DataPackageOperation.Copy;
@@ -226,37 +220,32 @@ private void ContentDialog_PrimaryButtonClick(ContentDialog sender, ContentDialo
226220
this.progressBar.Visibility = Visibility.Collapsed;
227221
}
228222

229-
private async void AllView_CellEditEnded(object sender, DataGridCellEditEndedEventArgs e)
223+
private void AllView_PreparingCellForEdit(object sender, DataGridPreparingCellForEditEventArgs e)
230224
{
231-
var newCellText = (data.SelectedItem as ListedItem)?.FileName;
232-
var selectedItem = tabInstance.instanceViewModel.FilesAndFolders[e.Row.GetIndex()];
233-
if(selectedItem.FileType == "Folder")
234-
{
235-
StorageFolder FolderToRename = await StorageFolder.GetFolderFromPathAsync(selectedItem.FilePath);
236-
if(FolderToRename.Name != newCellText)
237-
{
238-
await FolderToRename.RenameAsync(newCellText);
239-
AllView.CommitEdit();
240-
}
241-
else
242-
{
243-
AllView.CancelEdit();
244-
}
245-
}
246-
else
225+
var textBox = e.EditingElement as TextBox;
226+
var selectedItem = data.SelectedItem as ListedItem;
227+
int extensionLength = selectedItem.DotFileExtension?.Length ?? 0;
228+
229+
previousFileName = selectedItem.FileName;
230+
textBox.Focus(FocusState.Programmatic); // Without this, cannot edit text box when renaming via right-click
231+
textBox.Select(0, selectedItem.FileName.Length - extensionLength);
232+
}
233+
234+
private async void AllView_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
235+
{
236+
if (e.EditAction == DataGridEditAction.Cancel)
237+
return;
238+
239+
var selectedItem = data.SelectedItem as ListedItem;
240+
string currentName = previousFileName;
241+
string newName = (e.EditingElement as TextBox).Text;
242+
243+
bool successful = await tabInstance.instanceInteraction.RenameFileItem(selectedItem, currentName, newName);
244+
if (!successful)
247245
{
248-
StorageFile fileToRename = await StorageFile.GetFileFromPathAsync(selectedItem.FilePath);
249-
if (fileToRename.Name != newCellText)
250-
{
251-
await fileToRename.RenameAsync(newCellText);
252-
AllView.CommitEdit();
253-
}
254-
else
255-
{
256-
AllView.CancelEdit();
257-
}
246+
selectedItem.FileName = currentName;
247+
((sender as DataGrid).Columns[1].GetCellContent(e.Row) as TextBlock).Text = currentName;
258248
}
259-
//Navigation.NavigationActions.Refresh_Click(null, null);
260249
}
261250

262251
private void ContentDialog_Loaded(object sender, RoutedEventArgs e)
@@ -328,7 +317,6 @@ private void RightClickContextMenu_Opened(object sender, object e)
328317
OpenInNewWindowItem.Visibility = Visibility.Visible;
329318
}
330319
}
331-
332320
}
333321

334322
public class EmptyFolderTextState : INotifyPropertyChanged

Files UWP/Interacts/Interaction.cs

Lines changed: 35 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -820,130 +820,56 @@ public async void DeleteItem_Click(object sender, RoutedEventArgs e)
820820
}
821821
}
822822

823-
public async void RenameItem_Click(object sender, RoutedEventArgs e)
823+
public void RenameItem_Click(object sender, RoutedEventArgs e)
824824
{
825-
826825
if (App.selectedTabInstance.accessibleContentFrame.SourcePageType == typeof(GenericFileBrowser))
827826
{
828-
var CurrentInstance = App.selectedTabInstance;
829-
RenameDialog renameDialog = new RenameDialog();
830-
renameDialog.inputBox.Text = "";
831-
832-
try
833-
{
834-
var ItemSelected = (CurrentInstance.accessibleContentFrame.Content as GenericFileBrowser).data.SelectedIndex;
835-
var RowData = tabInstance.instanceViewModel.FilesAndFolders[ItemSelected];
836-
await renameDialog.ShowAsync();
837-
var input = renameDialog.storedRenameInput;
838-
if (input != null)
839-
{
840-
if (RowData.FileType == "Folder")
841-
{
842-
var item = await StorageFolder.GetFolderFromPathAsync(RowData.FilePath);
843-
await item.RenameAsync(input, NameCollisionOption.FailIfExists);
844-
tabInstance.instanceViewModel.RemoveFileOrFolder(RowData);
845-
tabInstance.instanceViewModel.AddFileOrFolder(new ListedItem(item.FolderRelativeId)
846-
{
847-
FileName = input,
848-
FileDateReal = DateTimeOffset.Now,
849-
EmptyImgVis = Visibility.Collapsed,
850-
FolderImg = Visibility.Visible,
851-
FileIconVis = Visibility.Collapsed,
852-
FileType = "Folder",
853-
FileImg = null,
854-
FilePath = Path.Combine(tabInstance.instanceViewModel.Universal.path, input)
855-
});
856-
}
857-
else
858-
{
859-
var item = await StorageFile.GetFileFromPathAsync(RowData.FilePath);
860-
await item.RenameAsync(input + RowData.DotFileExtension, NameCollisionOption.FailIfExists);
861-
tabInstance.instanceViewModel.RemoveFileOrFolder(RowData);
862-
tabInstance.instanceViewModel.AddFileOrFolder(new ListedItem(item.FolderRelativeId)
863-
{
864-
FileName = input,
865-
FileDateReal = DateTimeOffset.Now,
866-
EmptyImgVis = Visibility.Visible,
867-
FolderImg = Visibility.Collapsed,
868-
FileIconVis = Visibility.Collapsed,
869-
FileType = RowData.FileType,
870-
FileImg = null,
871-
FilePath = Path.Combine(tabInstance.instanceViewModel.Universal.path, input + RowData.DotFileExtension),
872-
DotFileExtension = RowData.DotFileExtension
873-
});
874-
}
875-
}
876-
877-
}
878-
catch (Exception)
879-
{
880-
MessageDialog itemAlreadyExistsDialog = new MessageDialog("An item with this name already exists in this folder", "Try again");
881-
await itemAlreadyExistsDialog.ShowAsync();
882-
}
883-
CurrentInstance.FS.isEnabled = false;
827+
var fileBrowser = App.selectedTabInstance.accessibleContentFrame.Content as GenericFileBrowser;
828+
fileBrowser.AllView.BeginEdit();
884829
}
885830
else if (App.selectedTabInstance.accessibleContentFrame.SourcePageType == typeof(PhotoAlbum))
886831
{
887-
var CurrentInstance = App.selectedTabInstance;
888-
RenameDialog renameDialog = new RenameDialog();
889-
renameDialog.inputBox.Text = "";
832+
var photoAlbum = App.selectedTabInstance.accessibleContentFrame.Content as PhotoAlbum;
833+
photoAlbum.ShowRenameDialog();
834+
}
835+
}
890836

891-
try
837+
public async Task<bool> RenameFileItem(ListedItem item, string oldName, string newName)
838+
{
839+
if (oldName == newName)
840+
return true;
841+
try
842+
{
843+
if (newName != "")
892844
{
893-
var ItemSelected = (tabInstance.accessibleContentFrame.Content as PhotoAlbum).gv.SelectedIndex;
894-
var BoxData = tabInstance.instanceViewModel.FilesAndFolders[ItemSelected];
895-
await renameDialog.ShowAsync();
896-
var input = renameDialog.storedRenameInput;
897-
if (input != null)
845+
if (item.FileType == "Folder")
898846
{
899-
if (BoxData.FileType == "Folder")
900-
{
901-
var item = await StorageFolder.GetFolderFromPathAsync(BoxData.FilePath);
902-
await item.RenameAsync(input, NameCollisionOption.FailIfExists);
903-
tabInstance.instanceViewModel.RemoveFileOrFolder(BoxData);
904-
tabInstance.instanceViewModel.AddFileOrFolder(new ListedItem(item.FolderRelativeId)
905-
{
906-
FileName = input,
907-
FileDateReal = DateTimeOffset.Now,
908-
EmptyImgVis = Visibility.Collapsed,
909-
FolderImg = Visibility.Visible,
910-
FileIconVis = Visibility.Collapsed,
911-
FileType = "Folder",
912-
FileImg = null,
913-
FilePath = Path.Combine(tabInstance.instanceViewModel.Universal.path, input)
914-
});
915-
}
847+
var folder = await StorageFolder.GetFolderFromPathAsync(item.FilePath);
848+
if (oldName.ToLower() == newName.ToLower())
849+
await folder.RenameAsync(newName, NameCollisionOption.ReplaceExisting);
916850
else
917-
{
918-
var item = await StorageFile.GetFileFromPathAsync(BoxData.FilePath);
919-
await item.RenameAsync(input + BoxData.DotFileExtension, NameCollisionOption.FailIfExists);
920-
tabInstance.instanceViewModel.RemoveFileOrFolder(BoxData);
921-
tabInstance.instanceViewModel.AddFileOrFolder(new ListedItem(item.FolderRelativeId)
922-
{
923-
FileName = input,
924-
FileDateReal = DateTimeOffset.Now,
925-
EmptyImgVis = Visibility.Visible,
926-
FolderImg = Visibility.Collapsed,
927-
FileIconVis = Visibility.Collapsed,
928-
FileType = BoxData.FileType,
929-
FileImg = null,
930-
FilePath = Path.Combine(tabInstance.instanceViewModel.Universal.path, input + BoxData.DotFileExtension),
931-
DotFileExtension = BoxData.DotFileExtension
932-
});
933-
}
851+
await folder.RenameAsync(newName, NameCollisionOption.FailIfExists);
852+
}
853+
else
854+
{
855+
var file = await StorageFile.GetFileFromPathAsync(item.FilePath);
856+
if (oldName.ToLower() == newName.ToLower())
857+
await file.RenameAsync(newName, NameCollisionOption.ReplaceExisting);
858+
else
859+
await file.RenameAsync(newName, NameCollisionOption.FailIfExists);
934860
}
935-
936-
}
937-
catch (Exception)
938-
{
939-
MessageDialog itemAlreadyExistsDialog = new MessageDialog("An item with this name already exists in this folder", "Try again");
940-
await itemAlreadyExistsDialog.ShowAsync();
941861
}
942-
CurrentInstance.FS.isEnabled = false;
943862
}
863+
catch (Exception)
864+
{
865+
MessageDialog itemAlreadyExistsDialog = new MessageDialog("An item with this name already exists in this folder", "Try again");
866+
await itemAlreadyExistsDialog.ShowAsync();
867+
return false;
868+
}
869+
tabInstance.FS.isEnabled = false;
870+
return true;
944871
}
945872

946-
947873
public List<DataGridRow> dataGridRows = new List<DataGridRow>();
948874
public List<GridViewItem> gridViewItems = new List<GridViewItem>();
949875
public async void CutItem_Click(object sender, RoutedEventArgs e)

Files UWP/PhotoAlbum.xaml.cs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
using Microsoft.Xaml.Interactivity;
2525
using System.Text.RegularExpressions;
2626
using Interaction = Files.Interacts.Interaction;
27+
using Files.Dialogs;
2728

2829
namespace Files
2930
{
@@ -309,5 +310,35 @@ private void RightClickContextMenu_Opened(object sender, object e)
309310
OpenInNewWindowItem.Visibility = Visibility.Visible;
310311
}
311312
}
313+
314+
public async void ShowRenameDialog()
315+
{
316+
try
317+
{
318+
var selectedItem = FileList.SelectedItem as ListedItem;
319+
RenameDialog renameDialog = new RenameDialog();
320+
var textBox = renameDialog.inputBox;
321+
int extensionLength = selectedItem.DotFileExtension?.Length ?? 0;
322+
323+
textBox.Text = selectedItem.FileName;
324+
textBox.Select(0, selectedItem.FileName.Length - extensionLength);
325+
326+
await renameDialog.ShowAsync();
327+
328+
string currentName = selectedItem.FileName;
329+
string newName = renameDialog.storedRenameInput;
330+
331+
if (newName == null)
332+
return;
333+
334+
Debug.WriteLine(currentName);
335+
Debug.WriteLine(newName);
336+
await tabInstance.instanceInteraction.RenameFileItem(selectedItem, currentName, newName);
337+
}
338+
catch (Exception)
339+
{
340+
341+
}
342+
}
312343
}
313344
}

0 commit comments

Comments
 (0)