@@ -93,10 +93,10 @@ pub struct App {
93
93
needs_restart : bool ,
94
94
self_update_rid : Option < MessageHandle < SelfUpdateProgress > > ,
95
95
original_exe_path : Option < PathBuf > ,
96
- detailed_mod_info_window : Option < WindowDetailedModInfo > ,
97
- mod_details : Option < ModDetails > ,
98
- fetch_mod_details_rid : Option < MessageHandle < ( ) > > ,
99
- mod_details_thumbnail_texture_handle : Option < egui:: TextureHandle > ,
96
+ detailed_mod_info_windows : HashMap < u32 , WindowDetailedModInfo > ,
97
+ mod_details : HashMap < u32 , ModDetails > ,
98
+ fetch_mod_details_rid : HashMap < u32 , MessageHandle < ( ) > > ,
99
+ mod_details_thumbnail_texture_handle : HashMap < u32 , egui:: TextureHandle > ,
100
100
}
101
101
102
102
#[ derive( Default ) ]
@@ -156,10 +156,10 @@ impl App {
156
156
needs_restart : false ,
157
157
self_update_rid : None ,
158
158
original_exe_path : None ,
159
- detailed_mod_info_window : None ,
160
- mod_details : None ,
161
- fetch_mod_details_rid : None ,
162
- mod_details_thumbnail_texture_handle : None ,
159
+ detailed_mod_info_windows : HashMap :: default ( ) ,
160
+ mod_details : HashMap :: default ( ) ,
161
+ fetch_mod_details_rid : HashMap :: default ( ) ,
162
+ mod_details_thumbnail_texture_handle : HashMap :: default ( ) ,
163
163
} )
164
164
}
165
165
@@ -441,9 +441,8 @@ impl App {
441
441
. on_hover_text_at_pointer ( "View details" )
442
442
. clicked ( )
443
443
{
444
- self . detailed_mod_info_window =
445
- Some ( WindowDetailedModInfo { info : info. clone ( ) } ) ;
446
- self . fetch_mod_details_rid = Some ( message:: FetchModDetails :: send (
444
+ self . detailed_mod_info_windows . insert ( modio_id, WindowDetailedModInfo { info : info. clone ( ) } ) ;
445
+ self . fetch_mod_details_rid . insert ( modio_id, message:: FetchModDetails :: send (
447
446
& mut self . request_counter ,
448
447
ui. ctx ( ) ,
449
448
self . tx . clone ( ) ,
@@ -1411,40 +1410,35 @@ impl App {
1411
1410
}
1412
1411
}
1413
1412
1414
- fn show_detailed_mod_info ( & mut self , ctx : & egui:: Context ) {
1415
- if let Some ( WindowDetailedModInfo { info } ) = & self . detailed_mod_info_window {
1416
- egui:: Area :: new ( "detailed-mod-info-overlay" )
1417
- . movable ( false )
1418
- . fixed_pos ( Pos2 :: ZERO )
1419
- . order ( egui:: Order :: Background )
1420
- . show ( ctx, |ui| {
1421
- egui:: Frame :: none ( )
1422
- . fill ( Color32 :: from_rgba_unmultiplied ( 0 , 0 , 0 , 127 ) )
1423
- . show ( ui, |ui| {
1424
- ui. allocate_space ( ui. available_size ( ) ) ;
1425
- } )
1426
- } ) ;
1413
+ fn show_detailed_mod_info ( & mut self , ctx : & egui:: Context , modio_id : u32 ) {
1414
+ let mut to_remove = Vec :: new ( ) ;
1427
1415
1416
+ if let Some ( WindowDetailedModInfo { info } ) = self . detailed_mod_info_windows . get ( & modio_id)
1417
+ {
1428
1418
let mut open = true ;
1429
1419
1430
1420
egui:: Window :: new ( & info. name )
1431
1421
. open ( & mut open)
1432
1422
. collapsible ( false )
1433
- . anchor ( Align2 :: CENTER_TOP , Vec2 :: new ( 0.0 , 30.0 ) )
1434
- . resizable ( false )
1435
- . show ( ctx, |ui| self . show_detailed_mod_info_inner ( ui) ) ;
1423
+ . movable ( true )
1424
+ . resizable ( true )
1425
+ . show ( ctx, |ui| self . show_detailed_mod_info_inner ( ui, modio_id ) ) ;
1436
1426
1437
1427
if !open {
1438
- self . detailed_mod_info_window = None ;
1439
- self . mod_details = None ;
1440
- self . fetch_mod_details_rid = None ;
1441
- self . mod_details_thumbnail_texture_handle = None ;
1428
+ to_remove. push ( modio_id) ;
1442
1429
}
1443
1430
}
1431
+
1432
+ for id in to_remove {
1433
+ self . detailed_mod_info_windows . remove ( & id) ;
1434
+ self . mod_details . remove ( & id) ;
1435
+ self . fetch_mod_details_rid . remove ( & id) ;
1436
+ self . mod_details_thumbnail_texture_handle . remove ( & id) ;
1437
+ }
1444
1438
}
1445
1439
1446
- fn show_detailed_mod_info_inner ( & mut self , ui : & mut egui:: Ui ) {
1447
- if let Some ( mod_details) = & self . mod_details {
1440
+ fn show_detailed_mod_info_inner ( & mut self , ui : & mut egui:: Ui , modio_id : u32 ) {
1441
+ if let Some ( mod_details) = & self . mod_details . get ( & modio_id ) {
1448
1442
let scroll_area_height = ( ui. available_height ( ) - 60.0 ) . clamp ( 0.0 , f32:: INFINITY ) ;
1449
1443
1450
1444
egui:: ScrollArea :: vertical ( )
@@ -1455,7 +1449,8 @@ impl App {
1455
1449
. show ( ui, |ui| {
1456
1450
let texture: & egui:: TextureHandle = self
1457
1451
. mod_details_thumbnail_texture_handle
1458
- . get_or_insert_with ( || {
1452
+ . entry ( modio_id)
1453
+ . or_insert_with ( || {
1459
1454
ui. ctx ( ) . load_texture (
1460
1455
format ! ( "{} image" , mod_details. r#mod. name) ,
1461
1456
{
@@ -1628,7 +1623,16 @@ impl eframe::App for App {
1628
1623
self . show_settings ( ctx) ;
1629
1624
self . show_lints_toggle ( ctx) ;
1630
1625
self . show_lint_report ( ctx) ;
1631
- self . show_detailed_mod_info ( ctx) ;
1626
+
1627
+ let modio_ids = self
1628
+ . detailed_mod_info_windows
1629
+ . keys ( )
1630
+ . copied ( )
1631
+ . collect :: < Vec < _ > > ( ) ;
1632
+
1633
+ for modio_id in modio_ids {
1634
+ self . show_detailed_mod_info ( ctx, modio_id) ;
1635
+ }
1632
1636
1633
1637
egui:: TopBottomPanel :: bottom ( "bottom_panel" ) . show ( ctx, |ui| {
1634
1638
ui. with_layout ( egui:: Layout :: right_to_left ( Align :: TOP ) , |ui| {
@@ -1637,8 +1641,8 @@ impl eframe::App for App {
1637
1641
&& self . update_rid . is_none ( )
1638
1642
&& self . lint_rid . is_none ( )
1639
1643
&& self . self_update_rid . is_none ( )
1640
- && self . detailed_mod_info_window . is_none ( )
1641
- && self . fetch_mod_details_rid . is_none ( )
1644
+ && self . detailed_mod_info_windows . is_empty ( )
1645
+ && self . fetch_mod_details_rid . is_empty ( )
1642
1646
&& self . state . config . drg_pak_path . is_some ( ) ,
1643
1647
|ui| {
1644
1648
if let Some ( args) = & self . args {
0 commit comments