Skip to content

Commit 1a88978

Browse files
author
Pavel Benak
committed
Smooth resizing fix requiring baseview's PR RustAudio/baseview#211 to be merged
1 parent e8a43d4 commit 1a88978

File tree

2 files changed

+51
-25
lines changed

2 files changed

+51
-25
lines changed

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ mod renderer;
22
mod translate;
33
mod window;
44

5-
pub use window::{EguiWindow, KeyCapture, Queue};
5+
pub use window::{screen_cursor_pos, EguiWindow, KeyCapture, Queue};
66

77
pub use egui;
88
pub use renderer::GraphicsConfig;

src/window.rs

Lines changed: 50 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use baseview::{
55
WindowScalePolicy,
66
};
77
use copypasta::ClipboardProvider;
8-
use egui::{pos2, vec2, Pos2, Rect, Rgba, ViewportCommand};
8+
use egui::{pos2, vec2, Id, Pos2, Rect, Rgba, ViewportCommand};
99
use keyboard_types::Modifiers;
1010
use raw_window_handle::HasRawWindowHandle;
1111

@@ -24,6 +24,14 @@ pub struct Queue<'a> {
2424
key_capture: &'a mut KeyCapture,
2525
}
2626

27+
fn screen_cursor_pos_id() -> Id {
28+
Id::new("egui_baseview_screen_cursor_pos")
29+
}
30+
31+
pub fn screen_cursor_pos(ctx: &egui::Context) -> Option<egui::Pos2> {
32+
ctx.data(|data| data.get_temp::<egui::Pos2>(screen_cursor_pos_id()))
33+
}
34+
2735
impl<'a> Queue<'a> {
2836
pub(crate) fn new(
2937
bg_color: &'a mut Rgba,
@@ -317,6 +325,23 @@ where
317325
self.egui_input.modifiers.shift = !(*modifiers & Modifiers::SHIFT).is_empty();
318326
self.egui_input.modifiers.command = !(*modifiers & Modifiers::CONTROL).is_empty();
319327
}
328+
329+
fn apply_window_resize(&mut self, physical_size: PhySize, pixels_per_point: f32) {
330+
self.pixels_per_point = pixels_per_point;
331+
self.points_per_pixel = pixels_per_point.recip();
332+
self.physical_size = physical_size;
333+
334+
let screen_rect = calculate_screen_rect(self.physical_size, self.points_per_pixel);
335+
self.egui_input.screen_rect = Some(screen_rect);
336+
337+
if let Some(viewport_info) = self.egui_input.viewports.get_mut(&self.viewport_id) {
338+
viewport_info.native_pixels_per_point = Some(self.pixels_per_point);
339+
viewport_info.inner_rect = Some(screen_rect);
340+
}
341+
342+
// Schedule to repaint on the next frame.
343+
self.repaint_after = Some(Instant::now());
344+
}
320345
}
321346

322347
impl<State, U> WindowHandler for EguiWindow<State, U>
@@ -367,10 +392,21 @@ where
367392
ViewportCommand::Close => {
368393
window.close();
369394
}
370-
ViewportCommand::InnerSize(size) => window.resize(baseview::Size {
371-
width: size.x.max(1.0) as f64,
372-
height: size.y.max(1.0) as f64,
373-
}),
395+
ViewportCommand::InnerSize(size) => {
396+
let logical_size = size.max(vec2(1.0, 1.0));
397+
398+
window.resize(baseview::Size {
399+
width: logical_size.x as f64,
400+
height: logical_size.y as f64,
401+
});
402+
403+
let physical_size = PhySize {
404+
width: (logical_size.x * self.pixels_per_point).round() as u32,
405+
height: (logical_size.y * self.pixels_per_point).round() as u32,
406+
};
407+
408+
self.apply_window_resize(physical_size, self.pixels_per_point);
409+
}
374410
_ => {}
375411
}
376412
}
@@ -451,13 +487,18 @@ where
451487
baseview::Event::Mouse(event) => match event {
452488
baseview::MouseEvent::CursorMoved {
453489
position,
490+
screen_position,
454491
modifiers,
455492
} => {
456493
self.update_modifiers(modifiers);
457494

458495
let pos = pos2(position.x as f32, position.y as f32);
459496
self.pointer_pos_in_points = Some(pos);
460497
self.egui_input.events.push(egui::Event::PointerMoved(pos));
498+
499+
let screen_pos = pos2(screen_position.x as f32, screen_position.y as f32);
500+
self.egui_ctx
501+
.data_mut(|data| data.insert_temp(screen_cursor_pos_id(), screen_pos));
461502
}
462503
baseview::MouseEvent::ButtonPressed { button, modifiers } => {
463504
self.update_modifiers(modifiers);
@@ -522,6 +563,8 @@ where
522563
baseview::MouseEvent::CursorLeft => {
523564
self.pointer_pos_in_points = None;
524565
self.egui_input.events.push(egui::Event::PointerGone);
566+
self.egui_ctx
567+
.data_mut(|data| data.remove::<egui::Pos2>(screen_cursor_pos_id()));
525568
}
526569
_ => {}
527570
},
@@ -608,29 +651,12 @@ where
608651
}
609652
baseview::Event::Window(event) => match event {
610653
baseview::WindowEvent::Resized(window_info) => {
611-
self.pixels_per_point = match self.scale_policy {
654+
let pixels_per_point = match self.scale_policy {
612655
WindowScalePolicy::ScaleFactor(scale) => scale,
613656
WindowScalePolicy::SystemScaleFactor => window_info.scale(),
614657
} as f32;
615-
self.points_per_pixel = self.pixels_per_point.recip();
616-
617-
self.physical_size = window_info.physical_size();
618-
619-
let screen_rect =
620-
calculate_screen_rect(self.physical_size, self.points_per_pixel);
621-
622-
self.egui_input.screen_rect = Some(screen_rect);
623-
624-
let viewport_info = self
625-
.egui_input
626-
.viewports
627-
.get_mut(&self.viewport_id)
628-
.unwrap();
629-
viewport_info.native_pixels_per_point = Some(self.pixels_per_point);
630-
viewport_info.inner_rect = Some(screen_rect);
631658

632-
// Schedule to repaint on the next frame.
633-
self.repaint_after = Some(Instant::now());
659+
self.apply_window_resize(window_info.physical_size(), pixels_per_point);
634660
}
635661
baseview::WindowEvent::Focused => {
636662
self.egui_input

0 commit comments

Comments
 (0)