protected async void Item_DragOver(object sender, DragEventArgs e) { var deferral = e.GetDeferral(); ListedItem item = GetItemFromElement(sender); SetSelectedItemOnUi(item); if (dragOverItem != item) { dragOverItem = item; dragOverTimer.Stop(); dragOverTimer.Debounce(() => { if (dragOverItem != null && !InstanceViewModel.IsPageTypeSearchResults) { dragOverItem = null; dragOverTimer.Stop(); ParentShellPageInstance.InteractionOperations.OpenItem_Click(null, null); } }, TimeSpan.FromMilliseconds(1000), false); } if (e.DataView.Contains(StandardDataFormats.StorageItems)) { IReadOnlyList <IStorageItem> draggedItems; try { draggedItems = await e.DataView.GetStorageItemsAsync(); } catch (Exception ex) when((uint)ex.HResult == 0x80040064) { e.AcceptedOperation = DataPackageOperation.None; deferral.Complete(); return; } e.Handled = true; e.DragUIOverride.IsCaptionVisible = true; if (InstanceViewModel.IsPageTypeSearchResults || draggedItems.AreItemsAlreadyInFolder(item.ItemPath) || draggedItems.Any(draggedItem => draggedItem.Path == item.ItemPath)) { e.AcceptedOperation = DataPackageOperation.None; } // Items from the same drive as this folder are dragged into this folder, so we move the items instead of copy else if (draggedItems.AreItemsInSameDrive(item.ItemPath)) { e.DragUIOverride.Caption = string.Format("MoveToFolderCaptionText".GetLocalized(), item.ItemName); e.AcceptedOperation = DataPackageOperation.Move; } else { e.DragUIOverride.Caption = string.Format("CopyToFolderCaptionText".GetLocalized(), item.ItemName); e.AcceptedOperation = DataPackageOperation.Copy; } } deferral.Complete(); }
private async void PathBoxItem_DragOver(object sender, DragEventArgs e) { if (!((sender as Grid).DataContext is PathBoxItem pathBoxItem) || pathBoxItem.Path == "Home" || pathBoxItem.Path == "NewTab".GetLocalized()) { return; } if (dragOverPath != pathBoxItem.Path) { dragOverPath = pathBoxItem.Path; dragOverTimer.Stop(); if (dragOverPath != (this as INavigationToolbar).PathComponents.LastOrDefault()?.Path) { dragOverTimer.Debounce(() => { if (dragOverPath != null) { dragOverTimer.Stop(); ItemDraggedOverPathItem?.Invoke(this, new PathNavigationEventArgs() { ItemPath = dragOverPath, LayoutType = AppSettings.GetLayoutType() }); dragOverPath = null; } }, TimeSpan.FromMilliseconds(1000), false); } } if (!e.DataView.Contains(StandardDataFormats.StorageItems)) { e.AcceptedOperation = DataPackageOperation.None; return; } e.Handled = true; var deferral = e.GetDeferral(); var storageItems = await e.DataView.GetStorageItemsAsync(); if (!storageItems.Any(storageItem => storageItem.Path.Replace(pathBoxItem.Path, string.Empty). Trim(Path.DirectorySeparatorChar). Contains(Path.DirectorySeparatorChar))) { e.AcceptedOperation = DataPackageOperation.None; } else { e.DragUIOverride.IsCaptionVisible = true; e.DragUIOverride.Caption = string.Format("MoveToFolderCaptionText".GetLocalized(), pathBoxItem.Title); e.AcceptedOperation = DataPackageOperation.Move; } deferral.Complete(); }
private void TokenBox_TextChanged(AutoSuggestBox sender, AutoSuggestBoxTextChangedEventArgs args) { if (!args.CheckCurrent()) { return; } if (args.Reason == AutoSuggestionBoxTextChangeReason.UserInput) { var text = sender.Text; var list = SuggestedItemsSource as IList; if (list != null) { _typeTimer.Debounce( async() => { var graph = ProviderManager.Instance.GlobalProvider.Graph; if (graph != null) { // If empty, will clear out list.Clear(); if (!string.IsNullOrWhiteSpace(text)) { foreach (var user in (await graph.FindUserAsync(text)).CurrentPage) { // Exclude people in suggested list that we already have picked if (!Items.Any(person => (person as Person)?.Id == user.Id)) { list.Add(user.ToPerson()); } } // Grab ids of current suggestions var ids = list.Cast <object>().Select(person => (person as Person).Id); foreach (var contact in (await graph.FindPersonAsync(text)).CurrentPage) { // Exclude people in suggested list that we already have picked // Or already suggested if (!Items.Any(person => (person as Person)?.Id == contact.Id) && !ids.Any(id => id == contact.Id)) { list.Add(contact); } } } } // TODO: If we don't have Graph connection and just list of Person should we auto-filter here? }, TimeSpan.FromSeconds(0.3)); } } }
private void AllView_PreparingCellForEdit(object sender, DataGridPreparingCellForEditEventArgs e) { if (ParentShellPageInstance.FilesystemViewModel.WorkingDirectory.StartsWith(AppSettings.RecycleBinPath)) { // Do not rename files and folders inside the recycle bin AllView.CancelEdit(); // Cancel the edit operation return; } // Only cancel if this event was triggered by a tap // Do not cancel when user presses F2 or context menu if (e.EditingEventArgs is TappedRoutedEventArgs) { if (AppSettings.OpenItemsWithOneclick) { AllView.CancelEdit(); // Cancel the edit operation return; } if (!tapDebounceTimer.IsEnabled) { tapDebounceTimer.Debounce(() => { tapDebounceTimer.Stop(); AllView.BeginEdit(); // EditingEventArgs will be null }, TimeSpan.FromMilliseconds(700), false); } else { tapDebounceTimer.Stop(); ParentShellPageInstance.InteractionOperations.OpenItem_Click(null, null); // Open selected files } AllView.CancelEdit(); // Cancel the edit operation return; } int extensionLength = SelectedItem.FileExtension?.Length ?? 0; oldItemName = SelectedItem.ItemName; renamingTextBox = e.EditingElement as TextBox; renamingTextBox.Focus(FocusState.Programmatic); // Without this,the user cannot edit the text box when renaming via right-click int selectedTextLength = SelectedItem.ItemName.Length; if (AppSettings.ShowFileExtensions) { selectedTextLength -= extensionLength; } renamingTextBox.Select(0, selectedTextLength); renamingTextBox.TextChanged += TextBox_TextChanged; e.EditingElement.LosingFocus += EditingElement_LosingFocus; IsRenamingItem = true; }
protected async void Item_DragOver(object sender, DragEventArgs e) { var deferral = e.GetDeferral(); ListedItem item = GetItemFromElement(sender); SetSelectedItemOnUi(item); if (dragOverItem != item) { dragOverItem = item; dragOverTimer.Stop(); dragOverTimer.Debounce(() => { if (dragOverItem != null) { dragOverItem = null; dragOverTimer.Stop(); AssociatedInteractions.OpenItem_Click(null, null); } }, TimeSpan.FromMilliseconds(1000), false); } if (e.DataView.Contains(StandardDataFormats.StorageItems)) { e.Handled = true; IReadOnlyList <IStorageItem> draggedItems = await e.DataView.GetStorageItemsAsync(); if (draggedItems.AreItemsAlreadyInFolder(item.ItemPath) || draggedItems.Any(draggedItem => draggedItem.Path == item.ItemPath)) { e.AcceptedOperation = DataPackageOperation.None; } // Items from the same drive as this folder are dragged into this folder, so we move the items instead of copy else if (draggedItems.AreItemsInSameDrive(item.ItemPath)) { e.DragUIOverride.Caption = string.Format("MoveToFolderCaptionText".GetLocalized(), item.ItemName); e.AcceptedOperation = DataPackageOperation.Move; } else { e.DragUIOverride.Caption = string.Format("CopyToFolderCaptionText".GetLocalized(), item.ItemName); e.AcceptedOperation = DataPackageOperation.Copy; } } deferral.Complete(); }
private void NavigationViewItem_DragEnter(object sender, DragEventArgs e) { VisualStateManager.GoToState(sender as Microsoft.UI.Xaml.Controls.NavigationViewItem, "DragEnter", false); if ((sender as Microsoft.UI.Xaml.Controls.NavigationViewItem).DataContext is INavigationControlItem) { dragOverItem = sender; dragOverTimer.Stop(); dragOverTimer.Debounce(() => { if (dragOverItem != null) { dragOverTimer.Stop(); OpenSidebarItem(dragOverItem as Microsoft.UI.Xaml.Controls.NavigationViewItem); dragOverItem = null; } }, TimeSpan.FromMilliseconds(1000), false); } }
private void AllView_BeginningEdit(object sender, DataGridBeginningEditEventArgs e) { if (ParentShellPageInstance.FilesystemViewModel.WorkingDirectory.StartsWith(AppSettings.RecycleBinPath)) { // Do not rename files and folders inside the recycle bin e.Cancel = true; return; } if (e.EditingEventArgs is TappedRoutedEventArgs) { // A tap should never trigger an immediate edit e.Cancel = true; if (AppSettings.OpenItemsWithOneclick || tapDebounceTimer.IsEnabled) { // If we handle a tap in one-click mode or handling a second tap within a timer duration, // just stop the timer (to avoid extra edits). // The relevant handlers (item pressed / double-click) will kick in and handle this tap tapDebounceTimer.Stop(); } else { // We have an edit due to the first tap in the double-click mode // Let's wait to see if there is another tap (double click). tapDebounceTimer.Debounce(() => { tapDebounceTimer.Stop(); // EditingEventArgs will be null allowing us to know this edit is not originated by tap AllView.BeginEdit(); }, TimeSpan.FromMilliseconds(700), false); } } else { // If we got here, then the edit is not triggered by tap. // We proceed with the edit, and stop the timer to avoid extra edits. tapDebounceTimer.Stop(); } }
private void TokenBox_TextChanged(AutoSuggestBox sender, AutoSuggestBoxTextChangedEventArgs args) { if (!args.CheckCurrent()) { return; } if (args.Reason == AutoSuggestionBoxTextChangeReason.UserInput) { var text = sender.Text; _typeTimer.Debounce( async() => { var graph = ProviderManager.Instance.GlobalProvider.Graph; if (graph != null) { // If empty, clear out if (string.IsNullOrWhiteSpace(text)) { SuggestedPeople.Clear(); } else { SuggestedPeople.Clear(); foreach (var contact in (await graph.FindPersonAsync(text)).CurrentPage) { if (!PickedPeople.Any(person => person.Id == contact.Id)) { SuggestedPeople.Add(contact); } } } } // TODO: If we don't have Graph connection and just list of Person should we auto-filter here? }, TimeSpan.FromSeconds(0.3)); } }