From a585dff09db0206caf48ab2c95230c0bccf27cda Mon Sep 17 00:00:00 2001 From: irrlicht Date: Sat, 13 Jun 2026 19:32:39 +0200 Subject: [PATCH] Fixed double mouse lock logic --- src/render/mod.rs | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/src/render/mod.rs b/src/render/mod.rs index f0a12bf..930e52d 100644 --- a/src/render/mod.rs +++ b/src/render/mod.rs @@ -280,13 +280,12 @@ impl App { let PhysicalKey::Code(code) = key.physical_key else { return; }; let down = key.state == ElementState::Pressed; - // Escape: erst die (Flycam-)Maus freigeben; sonst das Menü - // umschalten — über denselben exec-Trichter wie Konsole und Klick. - // Im Dialog tut Escape nichts (der Dialog endet über seine Choices). + // Escape togglet das Menü über denselben exec-Trichter wie Konsole + // und Klick. Der Lock-Zustand folgt danach automatisch dem Modus + // (siehe redraw). Im Dialog tut Escape nichts (Dialog endet über + // seine Choices). if code == KeyCode::Escape && down { - if self.input.grabbed { - self.set_grab(false); - } else if !matches!(self.session.mode, Mode::Dialog(_)) { + if !matches!(self.session.mode, Mode::Dialog(_)) { let r = self.session.exec("menu"); for out in r.output { println!("{out}"); } if r.quit { event_loop.exit(); } @@ -311,16 +310,18 @@ impl App { let now = Instant::now(); let dt = self.last.replace(now).map_or(0.0, |prev| (now - prev).as_secs_f32()); - if matches!(self.session.mode, Mode::Free) { + // Lock-Zustand folgt dem Modus: nur in Free ist die Flycam aktiv + // (Maus gefangen, relativer Blick). Menü/Dialog geben die Maus frei + // fürs UI. So gibt es keine parallele Lock-Logik mehr. + let fly = matches!(self.session.mode, Mode::Free); + if fly != self.input.grabbed { self.set_grab(fly); } + + if fly { self.camera.apply_mouse(self.input.mouse_dx, self.input.mouse_dy, MOUSE_SENS); let fwd = axis(self.input.fwd, self.input.back); let right = axis(self.input.right, self.input.left); let up = axis(self.input.up, self.input.down); self.camera.translate(fwd, right, up, MOVE_SPEED * dt); - } else if self.input.grabbed { - // Nicht-Free (Dialog/Menü) → Maus freigeben, damit das UI klickbar - // ist und der Maus-Cursor statt des HUD-Pointers erscheint. - self.set_grab(false); } // Delta immer verwerfen, auch im Dialog — sonst springt der Blick // beim Fortsetzen um die aufgestaute Bewegung. @@ -342,16 +343,14 @@ impl App { ); // Vorgemerkten Klick auflösen: über einem Klickziel → dessen Aktion - // durch denselben exec-Trichter wie die Konsole; sonst im Free-Modus - // die Maus für die Flycam greifen. + // durch denselben exec-Trichter wie die Konsole. Klick in der freien + // Welt tut (noch) nichts — hier käme später der `use`-Raycast. if self.pending_click { self.pending_click = false; if let Some(action) = screen.hover_action.clone() { let r = self.session.exec(&action); for out in r.output { println!("{out}"); } if r.quit { event_loop.exit(); } - } else if matches!(self.session.mode, Mode::Free) && !self.input.grabbed { - self.set_grab(true); } }