4949using System . Collections . Concurrent ;
5050using System . Collections . Specialized ;
5151using System . Diagnostics ;
52+ using System . IO . MemoryMappedFiles ;
5253using System . Linq ;
5354using System . Reflection ;
5455using System . Runtime . Caching ;
@@ -299,14 +300,17 @@ private async Task RunInteractiveAsync(CancellationToken ct = default)
299300
300301 cmd = AnsiConsole . Prompt ( ConsoleElements . Prm_Command ) ;
301302
303+ if ( cmd == R2 . Chc_Exit ) {
304+ return ;
305+ }
302306 if ( cmd == R2 . Chc_Back ) {
303307 break ;
304308 }
305309
306- var sel = GetResultItemIndexes ( sr ) ;
310+ var sel = GetSelectionChoice ( sr ) ;
307311 var sri = sel . Item ;
308312
309- s_logger . LogInformation ( "Selected {Item} {Scn} | {Idx1}, {Idx2}" , sel . Item , sel . IsScannedItem , sel . ItemIdx , sel . ScanIdx ) ;
313+ s_logger . LogDebug ( "Selected {Item} {Scn} | {Idx1}, {Idx2}" , sel . Item , sel . IsScannedItem , sel . ItemIdx , sel . ScanIdx ) ;
310314
311315 // s_logger.LogTrace("Interactive: {ResItem}", sri);
312316
@@ -322,12 +326,12 @@ await AnsiConsole.Live(srTable).StartAsync(async (f) =>
322326 s_logger . LogTrace ( "Scanning {Item}" , sri ) ;
323327 bool scannedOk = false ;
324328 scannedOk = await sri . ScanAsync2 ( m_ctsRun . Token ) ;
325-
329+
326330
327331 if ( ! scannedOk ) {
328332 return ;
329333 }
330-
334+
331335 /*if (!tbl.TryGetValue(sel.Item, out var idx)) {
332336 for (int j = 0; j < sel.Item.ScannedItems.Count; j++) {
333337 tbl[sel.Item.ScannedItems[j]] = j;
@@ -337,11 +341,10 @@ await AnsiConsole.Live(srTable).StartAsync(async (f) =>
337341 var idx = tbl [ sel . Item . Parent ] ;
338342
339343 int row ;
340-
344+
341345 row = sr . Results . IndexOf ( sri ) ;
342346
343347 // row = idx;
344-
345348 // row = GetRowForItem(sri);
346349 // row = sr.Index(sel.Item, sel.Scanned);
347350
@@ -371,7 +374,6 @@ await AnsiConsole.Live(srTable).StartAsync(async (f) =>
371374 }
372375
373376
374-
375377 /*if (sr.ScannedResults.TryGetValue(sri, out SearchResultItem[] scanned)) {
376378 int i = 0;
377379
@@ -403,20 +405,8 @@ await AnsiConsole.Live(srTable).StartAsync(async (f) =>
403405
404406 AnsiConsole . Live ( srTable ) . Start ( f =>
405407 {
406- // var row = GetRowForItem(sri);
407- // var row = SearchResultItem.FindSumIndex(sri);
408- // var row = sr.Index(sri);
409-
410- // var row = sr.Index(sel.Item, sel.Scanned);
411-
412- // var row = sel.Index();
413-
414- var row = tbl [ sel . Item ] ;
415-
416- // var row = (sel.ScanIdx == -1 ? 0 : sel.ScanIdx) + sel.ItemIdx;
417-
418- // var row2 = sriPak;
419- // var row = row2.RootIdx + (row2.ScnIdx == -1 ? 0 : (row2.ScnIdx + 1));
408+ //todo
409+ var row = sel . ItemIdx ;
420410
421411 sri . CalculateSimilarity ( Query . Source ) ;
422412
@@ -441,7 +431,33 @@ await AnsiConsole.Live(srTable).StartAsync(async (f) =>
441431 }
442432
443433 if ( cmd == R2 . Chc_Download ) {
444- //todo
434+
435+ var ok = sri . TryWriteToFile ( ) ;
436+
437+ if ( ok ) {
438+ AC . AlternateScreen ( ( ) =>
439+ {
440+ var gr = new Grid ( ) ;
441+ gr . AddColumns ( new GridColumn [ ] { new ( ) , new ( ) } ) ;
442+ gr . AddRow ( new IRenderable [ ] { new Text ( "File" , ConsoleElements . Sty_Name ) , new Text ( sri . LocalFilePath ) } ) ;
443+ AnsiConsole . Write ( gr ) ;
444+ var prompt = new ConfirmationPrompt ( "Open?" ) { } ;
445+ var choice = AnsiConsole . Prompt ( prompt ) ;
446+
447+ if ( choice ) {
448+ var proc = Process . Start ( new ProcessStartInfo ( )
449+ {
450+ FileName = sri . LocalFilePath ,
451+ WorkingDirectory = "" ,
452+ UseShellExecute = true
453+ } ) ;
454+
455+ proc ? . WaitForExit ( ) ;
456+ proc . Dispose ( ) ;
457+ }
458+ } ) ;
459+ }
460+
445461 }
446462
447463 cont :
@@ -496,7 +512,7 @@ private CanvasImage GetPreview(SearchResultItem sri)
496512 var key = sri . Url ;
497513 var val = m_prevCache . Get ( key ) ;
498514
499- CanvasImage ci = val as CanvasImage ;
515+ var ci = val as CanvasImage ;
500516
501517 if ( ci is null ) {
502518 str = sri . GetStream ( ) ;
@@ -536,7 +552,6 @@ private void ShowPreview(CanvasImage ci, SearchResultItem ui)
536552 ldc . Refresh ( ) ;
537553 var cki = AnsiConsole . Console . Input . ReadKey ( true ) ;
538554
539-
540555 if ( cki . HasValue ) {
541556
542557 switch ( cki . Value . Key ) {
0 commit comments