@@ -325,7 +325,7 @@ enum Message {
325
325
SearchClear ,
326
326
SearchInput ( String ) ,
327
327
TabMessage ( tab:: Message ) ,
328
- TabRescan ( Vec < tab:: Item > ) ,
328
+ TabRescan ( Location , Option < tab :: Item > , Vec < tab:: Item > ) ,
329
329
TabView ( tab:: View ) ,
330
330
ToggleFoldersFirst ,
331
331
ZoomDefault ,
@@ -494,6 +494,11 @@ impl App {
494
494
break ;
495
495
}
496
496
}
497
+ if children. is_empty ( ) {
498
+ if let Some ( item) = & self . tab . parent_item_opt {
499
+ children. push ( item. preview_view ( self . tab . config . icon_sizes , true ) ) ;
500
+ }
501
+ }
497
502
}
498
503
}
499
504
}
@@ -505,8 +510,11 @@ impl App {
505
510
let icon_sizes = self . tab . config . icon_sizes ;
506
511
Command :: perform (
507
512
async move {
508
- match tokio:: task:: spawn_blocking ( move || location. scan ( icon_sizes) ) . await {
509
- Ok ( items) => message:: app ( Message :: TabRescan ( items) ) ,
513
+ let location2 = location. clone ( ) ;
514
+ match tokio:: task:: spawn_blocking ( move || location2. scan ( icon_sizes) ) . await {
515
+ Ok ( ( parent_item_opt, items) ) => {
516
+ message:: app ( Message :: TabRescan ( location, parent_item_opt, items) )
517
+ }
510
518
Err ( err) => {
511
519
log:: warn!( "failed to rescan: {}" , err) ;
512
520
message:: none ( )
@@ -1408,74 +1416,85 @@ impl Application for App {
1408
1416
}
1409
1417
return Command :: batch ( commands) ;
1410
1418
}
1411
- Message :: TabRescan ( mut items) => {
1412
- // Filter
1413
- if let Some ( filter_i) = self . filter_selected {
1414
- if let Some ( filter) = self . filters . get ( filter_i) {
1415
- // Parse filters
1416
- let mut parsed_globs = Vec :: new ( ) ;
1417
- let mut parsed_mimes = Vec :: new ( ) ;
1418
- for pattern in filter. patterns . iter ( ) {
1419
- match pattern {
1420
- DialogFilterPattern :: Glob ( value) => {
1421
- match glob:: Pattern :: new ( value) {
1422
- Ok ( glob) => parsed_globs. push ( glob) ,
1423
- Err ( err) => {
1424
- log:: warn!( "failed to parse glob {:?}: {}" , value, err) ;
1419
+ Message :: TabRescan ( location, parent_item_opt, mut items) => {
1420
+ if location == self . tab . location {
1421
+ // Filter
1422
+ if let Some ( filter_i) = self . filter_selected {
1423
+ if let Some ( filter) = self . filters . get ( filter_i) {
1424
+ // Parse filters
1425
+ let mut parsed_globs = Vec :: new ( ) ;
1426
+ let mut parsed_mimes = Vec :: new ( ) ;
1427
+ for pattern in filter. patterns . iter ( ) {
1428
+ match pattern {
1429
+ DialogFilterPattern :: Glob ( value) => {
1430
+ match glob:: Pattern :: new ( value) {
1431
+ Ok ( glob) => parsed_globs. push ( glob) ,
1432
+ Err ( err) => {
1433
+ log:: warn!(
1434
+ "failed to parse glob {:?}: {}" ,
1435
+ value,
1436
+ err
1437
+ ) ;
1438
+ }
1425
1439
}
1426
1440
}
1427
- }
1428
- DialogFilterPattern :: Mime ( value) => {
1429
- match mime_guess:: Mime :: from_str ( value) {
1430
- Ok ( mime) => parsed_mimes. push ( mime) ,
1431
- Err ( err) => {
1432
- log:: warn!( "failed to parse mime {:?}: {}" , value, err) ;
1441
+ DialogFilterPattern :: Mime ( value) => {
1442
+ match mime_guess:: Mime :: from_str ( value) {
1443
+ Ok ( mime) => parsed_mimes. push ( mime) ,
1444
+ Err ( err) => {
1445
+ log:: warn!(
1446
+ "failed to parse mime {:?}: {}" ,
1447
+ value,
1448
+ err
1449
+ ) ;
1450
+ }
1433
1451
}
1434
1452
}
1435
1453
}
1436
1454
}
1437
- }
1438
-
1439
- items. retain ( |item| {
1440
- if item. metadata . is_dir ( ) {
1441
- // Directories are always shown
1442
- return true ;
1443
- }
1444
1455
1445
- // Check for mime type match (first because it is faster)
1446
- for mime in parsed_mimes . iter ( ) {
1447
- if mime == & item . mime {
1456
+ items . retain ( |item| {
1457
+ if item . metadata . is_dir ( ) {
1458
+ // Directories are always shown
1448
1459
return true ;
1449
1460
}
1450
- }
1451
1461
1452
- // Check for glob match (last because it is slower)
1453
- for glob in parsed_globs. iter ( ) {
1454
- if glob. matches ( & item. name ) {
1455
- return true ;
1462
+ // Check for mime type match (first because it is faster)
1463
+ for mime in parsed_mimes. iter ( ) {
1464
+ if mime == & item. mime {
1465
+ return true ;
1466
+ }
1467
+ }
1468
+
1469
+ // Check for glob match (last because it is slower)
1470
+ for glob in parsed_globs. iter ( ) {
1471
+ if glob. matches ( & item. name ) {
1472
+ return true ;
1473
+ }
1456
1474
}
1457
- }
1458
1475
1459
- // No filters matched
1460
- false
1461
- } ) ;
1476
+ // No filters matched
1477
+ false
1478
+ } ) ;
1479
+ }
1462
1480
}
1463
- }
1464
1481
1465
- // Select based on filename
1466
- if let DialogKind :: SaveFile { filename } = & self . flags . kind {
1467
- for item in items. iter_mut ( ) {
1468
- item. selected = & item. name == filename;
1482
+ // Select based on filename
1483
+ if let DialogKind :: SaveFile { filename } = & self . flags . kind {
1484
+ for item in items. iter_mut ( ) {
1485
+ item. selected = & item. name == filename;
1486
+ }
1469
1487
}
1470
- }
1471
1488
1472
- self . tab . set_items ( items) ;
1489
+ self . tab . parent_item_opt = parent_item_opt;
1490
+ self . tab . set_items ( items) ;
1473
1491
1474
- // Reset focus on location change
1475
- if self . search_get ( ) . is_some ( ) {
1476
- return widget:: text_input:: focus ( self . search_id . clone ( ) ) ;
1477
- } else {
1478
- return widget:: text_input:: focus ( self . filename_id . clone ( ) ) ;
1492
+ // Reset focus on location change
1493
+ if self . search_get ( ) . is_some ( ) {
1494
+ return widget:: text_input:: focus ( self . search_id . clone ( ) ) ;
1495
+ } else {
1496
+ return widget:: text_input:: focus ( self . filename_id . clone ( ) ) ;
1497
+ }
1479
1498
}
1480
1499
}
1481
1500
Message :: TabView ( view) => {
0 commit comments