Skip to content

Commit 2e93cfb

Browse files
authored
Merge pull request #249 from jeffsieu/improved-rename
Allow inline, direct renaming in file list
2 parents bb9e94e + fce875c commit 2e93cfb

File tree

5 files changed

+144
-152
lines changed

5 files changed

+144
-152
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}" PreviewKeyDown="AllView_PreviewKeyDown" 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}" PreviewKeyDown="AllView_PreviewKeyDown" 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: 25 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ public sealed partial class GenericFileBrowser : Page
2929
public Page GFBPageName;
3030
public ContentDialog AddItemBox;
3131
public ContentDialog NameBox;
32+
public string previousFileName;
3233
public TextBox inputFromRename;
3334
public string inputForRename;
3435
public Flyout CopiedFlyout;
@@ -81,11 +82,6 @@ public GenericFileBrowser()
8182
OpenInNewWindowItem.Click += tabInstance.instanceInteraction.OpenInNewWindowItem_Click;
8283
}
8384

84-
private void AddItem_Click(object sender, RoutedEventArgs e)
85-
{
86-
//await AddDialog.ShowAsync();
87-
}
88-
8985
private void Clipboard_ContentChanged(object sender, object e)
9086
{
9187
try
@@ -128,7 +124,6 @@ protected override void OnNavigatedTo(NavigationEventArgs eventArgs)
128124

129125
Clipboard_ContentChanged(null, null);
130126
tabInstance.AlwaysPresentCommands.isEnabled = true;
131-
tabInstance.AddItemButton.Click += AddItem_Click;
132127

133128
TextState.isVisible = Visibility.Collapsed;
134129

@@ -198,7 +193,6 @@ protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
198193
//this.Bindings.StopTracking();
199194
}
200195

201-
202196
private void AllView_DragOver(object sender, DragEventArgs e)
203197
{
204198
e.AcceptedOperation = DataPackageOperation.Copy;
@@ -228,37 +222,32 @@ private void ContentDialog_PrimaryButtonClick(ContentDialog sender, ContentDialo
228222
this.progressBar.Visibility = Visibility.Collapsed;
229223
}
230224

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

264253
private void ContentDialog_Loaded(object sender, RoutedEventArgs e)
@@ -330,7 +319,7 @@ private void RightClickContextMenu_Opened(object sender, object e)
330319
OpenInNewWindowItem.Visibility = Visibility.Visible;
331320
}
332321
}
333-
322+
334323
private void AllView_PreviewKeyDown(object sender, KeyRoutedEventArgs e)
335324
{
336325
if (e.Key == VirtualKey.Enter)

Files UWP/Interacts/Interaction.cs

Lines changed: 40 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -565,130 +565,61 @@ public async void DeleteItem_Click(object sender, RoutedEventArgs e)
565565
}
566566
}
567567

568-
public async void RenameItem_Click(object sender, RoutedEventArgs e)
568+
public void RenameItem_Click(object sender, RoutedEventArgs e)
569569
{
570-
571570
if (App.selectedTabInstance.accessibleContentFrame.SourcePageType == typeof(GenericFileBrowser))
572571
{
573-
var CurrentInstance = App.selectedTabInstance;
574-
RenameDialog renameDialog = new RenameDialog();
575-
renameDialog.inputBox.Text = "";
576-
577-
try
578-
{
579-
var ItemSelected = (CurrentInstance.accessibleContentFrame.Content as GenericFileBrowser).data.SelectedIndex;
580-
var RowData = tabInstance.instanceViewModel.FilesAndFolders[ItemSelected];
581-
await renameDialog.ShowAsync();
582-
var input = renameDialog.storedRenameInput;
583-
if (input != null)
584-
{
585-
if (RowData.FileType == "Folder")
586-
{
587-
var item = await StorageFolder.GetFolderFromPathAsync(RowData.FilePath);
588-
await item.RenameAsync(input, NameCollisionOption.FailIfExists);
589-
tabInstance.instanceViewModel.RemoveFileOrFolder(RowData);
590-
tabInstance.instanceViewModel.AddFileOrFolder(new ListedItem(item.FolderRelativeId)
591-
{
592-
FileName = input,
593-
FileDateReal = DateTimeOffset.Now,
594-
EmptyImgVis = Visibility.Collapsed,
595-
FolderImg = Visibility.Visible,
596-
FileIconVis = Visibility.Collapsed,
597-
FileType = "Folder",
598-
FileImg = null,
599-
FilePath = Path.Combine(tabInstance.instanceViewModel.Universal.path, input)
600-
});
601-
}
602-
else
603-
{
604-
var item = await StorageFile.GetFileFromPathAsync(RowData.FilePath);
605-
await item.RenameAsync(input + RowData.DotFileExtension, NameCollisionOption.FailIfExists);
606-
tabInstance.instanceViewModel.RemoveFileOrFolder(RowData);
607-
tabInstance.instanceViewModel.AddFileOrFolder(new ListedItem(item.FolderRelativeId)
608-
{
609-
FileName = input,
610-
FileDateReal = DateTimeOffset.Now,
611-
EmptyImgVis = Visibility.Visible,
612-
FolderImg = Visibility.Collapsed,
613-
FileIconVis = Visibility.Collapsed,
614-
FileType = RowData.FileType,
615-
FileImg = null,
616-
FilePath = Path.Combine(tabInstance.instanceViewModel.Universal.path, input + RowData.DotFileExtension),
617-
DotFileExtension = RowData.DotFileExtension
618-
});
619-
}
620-
}
621-
622-
}
623-
catch (Exception)
624-
{
625-
MessageDialog itemAlreadyExistsDialog = new MessageDialog("An item with this name already exists in this folder", "Try again");
626-
await itemAlreadyExistsDialog.ShowAsync();
627-
}
628-
CurrentInstance.FS.isEnabled = false;
572+
var fileBrowser = App.selectedTabInstance.accessibleContentFrame.Content as GenericFileBrowser;
573+
if (fileBrowser.AllView.SelectedItem != null)
574+
fileBrowser.AllView.CurrentColumn = fileBrowser.AllView.Columns[1];
575+
fileBrowser.AllView.BeginEdit();
629576
}
630577
else if (App.selectedTabInstance.accessibleContentFrame.SourcePageType == typeof(PhotoAlbum))
631578
{
632-
var CurrentInstance = App.selectedTabInstance;
633-
RenameDialog renameDialog = new RenameDialog();
634-
renameDialog.inputBox.Text = "";
579+
var photoAlbum = App.selectedTabInstance.accessibleContentFrame.Content as PhotoAlbum;
580+
photoAlbum.StartRename();
581+
}
582+
}
635583

636-
try
584+
public async Task<bool> RenameFileItem(ListedItem item, string oldName, string newName)
585+
{
586+
if (oldName == newName)
587+
return true;
588+
bool isRenamedSameNameDiffCase = oldName.ToLower() == newName.ToLower();
589+
try
590+
{
591+
if (newName != "")
637592
{
638-
var ItemSelected = (tabInstance.accessibleContentFrame.Content as PhotoAlbum).gv.SelectedIndex;
639-
var BoxData = tabInstance.instanceViewModel.FilesAndFolders[ItemSelected];
640-
await renameDialog.ShowAsync();
641-
var input = renameDialog.storedRenameInput;
642-
if (input != null)
593+
if (item.FileType == "Folder")
643594
{
644-
if (BoxData.FileType == "Folder")
645-
{
646-
var item = await StorageFolder.GetFolderFromPathAsync(BoxData.FilePath);
647-
await item.RenameAsync(input, NameCollisionOption.FailIfExists);
648-
tabInstance.instanceViewModel.RemoveFileOrFolder(BoxData);
649-
tabInstance.instanceViewModel.AddFileOrFolder(new ListedItem(item.FolderRelativeId)
650-
{
651-
FileName = input,
652-
FileDateReal = DateTimeOffset.Now,
653-
EmptyImgVis = Visibility.Collapsed,
654-
FolderImg = Visibility.Visible,
655-
FileIconVis = Visibility.Collapsed,
656-
FileType = "Folder",
657-
FileImg = null,
658-
FilePath = Path.Combine(tabInstance.instanceViewModel.Universal.path, input)
659-
});
660-
}
595+
var folder = await StorageFolder.GetFolderFromPathAsync(item.FilePath);
596+
if (isRenamedSameNameDiffCase)
597+
throw new InvalidOperationException();
598+
//await folder.RenameAsync(newName, NameCollisionOption.ReplaceExisting);
661599
else
662-
{
663-
var item = await StorageFile.GetFileFromPathAsync(BoxData.FilePath);
664-
await item.RenameAsync(input + BoxData.DotFileExtension, NameCollisionOption.FailIfExists);
665-
tabInstance.instanceViewModel.RemoveFileOrFolder(BoxData);
666-
tabInstance.instanceViewModel.AddFileOrFolder(new ListedItem(item.FolderRelativeId)
667-
{
668-
FileName = input,
669-
FileDateReal = DateTimeOffset.Now,
670-
EmptyImgVis = Visibility.Visible,
671-
FolderImg = Visibility.Collapsed,
672-
FileIconVis = Visibility.Collapsed,
673-
FileType = BoxData.FileType,
674-
FileImg = null,
675-
FilePath = Path.Combine(tabInstance.instanceViewModel.Universal.path, input + BoxData.DotFileExtension),
676-
DotFileExtension = BoxData.DotFileExtension
677-
});
678-
}
600+
await folder.RenameAsync(newName, NameCollisionOption.FailIfExists);
601+
}
602+
else
603+
{
604+
var file = await StorageFile.GetFileFromPathAsync(item.FilePath);
605+
if (isRenamedSameNameDiffCase)
606+
throw new InvalidOperationException();
607+
//await file.RenameAsync(newName, NameCollisionOption.ReplaceExisting);
608+
else
609+
await file.RenameAsync(newName, NameCollisionOption.FailIfExists);
679610
}
680-
681-
}
682-
catch (Exception)
683-
{
684-
MessageDialog itemAlreadyExistsDialog = new MessageDialog("An item with this name already exists in this folder", "Try again");
685-
await itemAlreadyExistsDialog.ShowAsync();
686611
}
687-
CurrentInstance.FS.isEnabled = false;
688612
}
613+
catch (Exception)
614+
{
615+
MessageDialog itemAlreadyExistsDialog = new MessageDialog("An item with this name already exists in this folder", "Try again");
616+
await itemAlreadyExistsDialog.ShowAsync();
617+
return false;
618+
}
619+
tabInstance.FS.isEnabled = false;
620+
return true;
689621
}
690622

691-
692623
public List<DataGridRow> dataGridRows = new List<DataGridRow>();
693624
public List<GridViewItem> gridViewItems = new List<GridViewItem>();
694625
public async void CutItem_Click(object sender, RoutedEventArgs e)

Files UWP/PhotoAlbum.xaml

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -512,10 +512,10 @@
512512
</GridView.ItemContainerStyle>
513513
<GridView.ItemTemplate>
514514
<DataTemplate x:DataType="local2:ListedItem">
515-
<Grid IsRightTapEnabled="True" RightTapped="StackPanel_RightTapped" Width="125" Height="125" Tag="{x:Bind RowIndex}" Padding="0" ToolTipService.ToolTip="{Binding FileName}" Background="Transparent" Margin="0, 0, 0, 0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
515+
<Grid IsRightTapEnabled="True" RightTapped="StackPanel_RightTapped" Width="125" Height="Auto" Tag="{x:Bind RowIndex}" Padding="0" ToolTipService.ToolTip="{Binding FileName}" Background="Transparent" Margin="0, 0, 0, 0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
516516
<Grid.RowDefinitions>
517517
<RowDefinition Height="100"/>
518-
<RowDefinition Height="25"/>
518+
<RowDefinition Height="Auto"/>
519519
</Grid.RowDefinitions>
520520
<Grid Grid.Row="0" Tag="ItemImage" Width="125" Height="100">
521521
<Grid Padding="12" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Name="Picture" Visibility="{x:Bind FileIconVis}">
@@ -532,9 +532,11 @@
532532
</Grid>
533533
</Grid>
534534
</Grid>
535-
<TextBlock Grid.Row="1" Margin="10,0" MaxHeight="25" HorizontalTextAlignment="Center" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Text="{x:Bind FileName}" TextTrimming="CharacterEllipsis" TextWrapping="NoWrap"/>
535+
<StackPanel Grid.Row="1">
536+
<TextBlock Margin="0,0,0,10" HorizontalTextAlignment="Center" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Text="{x:Bind FileName}" TextTrimming="CharacterEllipsis" TextWrapping="NoWrap"/>
537+
<TextBox Visibility="Collapsed" Margin="0" TextAlignment="Center" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Text="{x:Bind FileName}" TextWrapping="Wrap"></TextBox>
538+
</StackPanel>
536539
</Grid>
537-
538540
</DataTemplate>
539541
</GridView.ItemTemplate>
540542
</GridView>

0 commit comments

Comments
 (0)