From 7ba2efcde2914f9e2fc6131ccd3fb19d81890178 Mon Sep 17 00:00:00 2001 From: Imbris Date: Sun, 22 Nov 2020 04:05:37 -0500 Subject: [PATCH] Attempt to fix ui bug with changing screens causing inventory slots and such to disappear, presumably due to dpi differences --- voxygen/src/hud/mod.rs | 4 ++++ voxygen/src/ui/mod.rs | 24 ++++++++++++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/voxygen/src/hud/mod.rs b/voxygen/src/hud/mod.rs index 6377d57d8a..e0d74a5ba3 100644 --- a/voxygen/src/hud/mod.rs +++ b/voxygen/src/hud/mod.rs @@ -2471,6 +2471,10 @@ impl Hud { } true }, + WinEvent::ScaleFactorChanged(scale_factor) => { + self.ui.scale_factor_changed(scale_factor); + false + }, WinEvent::InputUpdate(GameInput::ToggleInterface, true) if !self.typing() => { self.show.toggle_ui(); true diff --git a/voxygen/src/ui/mod.rs b/voxygen/src/ui/mod.rs index 363ae5442b..51fcf90a46 100644 --- a/voxygen/src/ui/mod.rs +++ b/voxygen/src/ui/mod.rs @@ -115,6 +115,8 @@ pub struct Ui { ingame_locals: Vec>, // Window size for updating scaling window_resized: Option>, + // Scale factor changed + scale_factor_changed: Option, // Used to delay cache resizing until after current frame is drawn need_cache_resize: bool, // Scaling of the ui @@ -153,6 +155,7 @@ impl Ui { default_globals: renderer.create_consts(&[Globals::default()])?, ingame_locals: Vec::new(), window_resized: None, + scale_factor_changed: None, need_cache_resize: false, scale, tooltip_manager, @@ -169,6 +172,10 @@ impl Ui { self.ui.handle_event(Input::Resize(w, h)); } + pub fn scale_factor_changed(&mut self, scale_factor: f64) { + self.scale_factor_changed = Some(scale_factor); + } + // Get a copy of Scale pub fn scale(&self) -> Scale { self.scale } @@ -284,8 +291,15 @@ impl Ui { self.tooltip_manager .maintain(self.ui.global_input(), self.scale.scale_factor_logical()); + // Handle scale factor changing + let need_resize = if let Some(scale_factor) = self.scale_factor_changed.take() { + self.scale.scale_factor_changed(scale_factor) + } else { + false + }; + // Handle window resizing. - if let Some(new_dims) = self.window_resized.take() { + let need_resize = if let Some(new_dims) = self.window_resized.take() { let (old_w, old_h) = self.scale.scaled_resolution().into_tuple(); self.scale.window_resized(new_dims); let (w, h) = self.scale.scaled_resolution().into_tuple(); @@ -296,7 +310,13 @@ impl Ui { // Somewhat inefficient for elements that won't change size after a window // resize let res = renderer.get_resolution(); - self.need_cache_resize = res.x > 0 && res.y > 0 && !(old_w == w && old_h == h); + res.x > 0 && res.y > 0 && !(old_w == w && old_h == h) + } else { + false + } || need_resize; + + if need_resize { + self.need_cache_resize = true; } if self.need_cache_resize {