@@ -278,30 +278,58 @@ private async Task RequireFolderSelectionAsync()
278278
279279 private async void ImportPdf_OnClick ( object ? sender , RoutedEventArgs e )
280280 {
281- if ( _storagePickerOpen )
281+ var note = ViewModel . SelectedNote ;
282+ if ( note is null || ! ViewModel . CanImportPdfIntoNote ( note ) )
282283 {
284+ ViewModel . StatusText = "Select a Markdown note before importing a PDF" ;
283285 return ;
284286 }
285287
286- var note = ViewModel . SelectedNote ;
287- if ( note is null || ! ViewModel . CanImportPdfIntoNote ( note ) )
288+ var paths = await PickPdfPathsAsync ( "Import PDF into note" ) ;
289+
290+ if ( paths . Length > 0 )
288291 {
289- ViewModel . StatusText = "Select a Markdown note before importing a PDF" ;
292+ await ViewModel . ImportPdfFilesAsync (
293+ note ,
294+ paths ,
295+ MarkdownEditor . CaretIndex ) ;
296+ }
297+ }
298+
299+ private async void ImportPdfDocuments_OnClick ( object ? sender , RoutedEventArgs e )
300+ {
301+ if ( ! ViewModel . CanImportPdfDocuments )
302+ {
303+ ViewModel . StatusText = "Open a Markdown folder before importing PDF documents" ;
290304 return ;
291305 }
292306
293- string [ ] paths ;
307+ var paths = await PickPdfPathsAsync ( "Import PDF documents" ) ;
308+ if ( paths . Length > 0 )
309+ {
310+ // This command deliberately creates converted notes instead of modifying the selected editor.
311+ await ImportPdfDocumentsAsync ( paths ) ;
312+ }
313+ }
314+
315+ private async Task < string [ ] > PickPdfPathsAsync ( string title )
316+ {
317+ if ( _storagePickerOpen )
318+ {
319+ return [ ] ;
320+ }
321+
294322 _storagePickerOpen = true ;
295323 try
296324 {
297325 var results = await StorageProvider . OpenFilePickerAsync (
298326 new FilePickerOpenOptions
299327 {
300- Title = "Import PDF" ,
328+ Title = title ,
301329 AllowMultiple = true ,
302330 FileTypeFilter = [ PdfFileType ]
303331 } ) ;
304- paths = results
332+ return results
305333 . Select ( file => file . TryGetLocalPath ( ) )
306334 . Where ( path => ! string . IsNullOrWhiteSpace ( path ) )
307335 . Cast < string > ( )
@@ -311,14 +339,30 @@ private async void ImportPdf_OnClick(object? sender, RoutedEventArgs e)
311339 {
312340 _storagePickerOpen = false ;
313341 }
342+ }
314343
315- if ( paths . Length > 0 )
344+ private async Task ImportPdfDocumentsAsync ( IReadOnlyList < string > paths )
345+ {
346+ var importedPdfs = await ViewModel . ImportPdfDocumentsAsync ( paths ) ;
347+ if ( importedPdfs . Length == 0 )
316348 {
317- await ViewModel . ImportPdfFilesAsync (
318- note ,
319- paths ,
320- MarkdownEditor . CaretIndex ) ;
349+ return ;
321350 }
351+
352+ if ( ! await _pluginManager . TriggerDocumentConversionAsync ( ) )
353+ {
354+ ViewModel . StatusText =
355+ "PDF documents were imported. Activate Document Conversion to create their Markdown notes." ;
356+ return ;
357+ }
358+
359+ var convertedPath = importedPdfs
360+ . Select ( pdf => Path . ChangeExtension ( pdf . DestinationPath , ".md" ) )
361+ . FirstOrDefault ( File . Exists ) ;
362+ // Reload only after the plugin returns so the note list and search index include completed outputs.
363+ await ViewModel . LoadMarkdownFolderAsync (
364+ ViewModel . CurrentFolderPath ,
365+ convertedPath ) ;
322366 }
323367
324368 private void MainWindow_OnDragOver ( object ? sender , DragEventArgs e )
@@ -330,7 +374,8 @@ private void MainWindow_OnDragOver(object? sender, DragEventArgs e)
330374 ".pdf" ,
331375 StringComparison . OrdinalIgnoreCase ) ) == true ;
332376 e . DragEffects = hasPdf
333- && ViewModel . CanImportPdfIntoNote ( ViewModel . SelectedNote )
377+ && ( ViewModel . CanImportPdfIntoNote ( ViewModel . SelectedNote )
378+ || ViewModel . CanImportPdfDocuments )
334379 ? DragDropEffects . Copy
335380 : DragDropEffects . None ;
336381 }
@@ -347,20 +392,24 @@ private async void MainWindow_OnDrop(object? sender, DragEventArgs e)
347392 . Cast < string > ( )
348393 . Distinct ( StringComparer . OrdinalIgnoreCase )
349394 . ToArray ( ) ?? [ ] ;
350- if ( note is null
351- || paths . Length == 0
352- || ! ViewModel . CanImportPdfIntoNote ( note ) )
395+ if ( paths . Length == 0 )
353396 {
354- ViewModel . StatusText =
355- "Drop PDF files while a Markdown note is selected" ;
397+ ViewModel . StatusText = "Drop one or more PDF files into NoteManager" ;
356398 return ;
357399 }
358400
359401 e . Handled = true ;
360- await ViewModel . ImportPdfFilesAsync (
361- note ,
362- paths ,
363- MarkdownEditor . CaretIndex ) ;
402+ if ( ViewModel . CanImportPdfIntoNote ( note ) )
403+ {
404+ await ViewModel . ImportPdfFilesAsync (
405+ note ! ,
406+ paths ,
407+ MarkdownEditor . CaretIndex ) ;
408+ return ;
409+ }
410+
411+ // With no selected Markdown editor, a window drop imports documents for conversion.
412+ await ImportPdfDocumentsAsync ( paths ) ;
364413 }
365414
366415 private async void Tags_OnClick ( object ? sender , RoutedEventArgs e )
0 commit comments