diff --git a/client-gui/src/gui_app.rs b/client-gui/src/gui_app.rs index 58c6b01..681179a 100644 --- a/client-gui/src/gui_app.rs +++ b/client-gui/src/gui_app.rs @@ -5,7 +5,7 @@ use client_network::{ }; use crossbeam_channel::{Receiver, Sender}; use egui::{ - Align, CentralPanel, CollapsingHeader, Color32, Context, CornerRadius, Frame, Layout, + Align, CentralPanel, CollapsingHeader, Color32, Context, CornerRadius, Frame, Id, Layout, ProgressBar, Response, ScrollArea, SidePanel, Stroke, TopBottomPanel, Ui, Vec2, ViewportCommand, }; @@ -372,8 +372,28 @@ impl eframe::App for P2PClientApp { } if self.show_choose_server_window { + let full_rect = ctx.input(|i| i.screen_rect()); + let modal_size = egui::vec2(400.0, 160.0); + let modal_pos = (full_rect.center() - modal_size * 0.5).to_vec2(); + + // 1) blocker (background order) — captures input except modal area + egui::Area::new(Id::new("modal_blocker_bg")) + .order(egui::Order::Background) + .show(ctx, |ui| { + let painter = ui.painter(); + painter.rect_filled(full_rect, 0.0, egui::Color32::from_black_alpha(160)); + + // create an interactable that covers the full rect so clicks are eaten + // but leave the modal rect uncovered by marking it non-interactive below. + let sense = egui::Sense::click_and_drag(); + ui.allocate_exact_size(full_rect.size(), sense); + }); egui::Window::new("Choose the server") .resizable(false) + .collapsible(false) + .title_bar(true) + .anchor(egui::Align2::CENTER_CENTER, egui::Vec2::ZERO) + .fixed_size(modal_size) .show(ctx, |ui| { ScrollArea::vertical() .auto_shrink([false; 2])