Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature: Add Window Padding Support #1632

Merged
merged 8 commits into from Nov 29, 2022
7 changes: 5 additions & 2 deletions src/renderer/mod.rs
Expand Up @@ -27,7 +27,7 @@ use crate::{
use cursor_renderer::CursorRenderer;
pub use fonts::caching_shaper::CachingShaper;
pub use grid_renderer::GridRenderer;
pub use rendered_window::{LineFragment, RenderedWindow, WindowDrawCommand, WindowDrawDetails};
pub use rendered_window::{LineFragment, RenderedWindow, WindowDrawCommand, WindowDrawDetails, WindowPadding};

#[derive(SettingGroup, Clone)]
pub struct RendererSettings {
Expand Down Expand Up @@ -83,10 +83,11 @@ pub struct Renderer {
profiler: profiler::Profiler,
os_scale_factor: f64,
user_scale_factor: f64,
window_padding: WindowPadding,
}

impl Renderer {
pub fn new(os_scale_factor: f64) -> Self {
pub fn new(os_scale_factor: f64, window_padding: WindowPadding) -> Self {
let user_scale_factor = SETTINGS.get::<WindowSettings>().scale_factor.into();
let scale_factor = user_scale_factor * os_scale_factor;
let cursor_renderer = CursorRenderer::new();
Expand All @@ -109,6 +110,7 @@ impl Renderer {
profiler,
os_scale_factor,
user_scale_factor,
window_padding,
}
}

Expand Down Expand Up @@ -244,6 +246,7 @@ impl Renderer {
grid_id,
(grid_left as f32, grid_top as f32).into(),
(width, height).into(),
self.window_padding,
);
vacant_entry.insert(new_window);
} else {
Expand Down
22 changes: 21 additions & 1 deletion src/renderer/rendered_window.rs
Expand Up @@ -50,6 +50,14 @@ pub enum WindowDrawCommand {
},
}

#[derive(Copy, Clone, Debug)]
pub struct WindowPadding {
pub top: u32,
pub left: u32,
pub right: u32,
pub bottom: u32,
}

fn build_window_surface(parent_canvas: &mut Canvas, pixel_size: (i32, i32)) -> Surface {
let mut context = parent_canvas.recording_context().unwrap();
let budgeted = Budgeted::Yes;
Expand Down Expand Up @@ -147,6 +155,8 @@ pub struct RenderedWindow {
pub current_scroll: f32,
scroll_destination: f32,
scroll_t: f32,

pub padding: WindowPadding,
}

#[derive(Clone, Debug)]
Expand All @@ -163,6 +173,7 @@ impl RenderedWindow {
id: u64,
grid_position: Point,
grid_size: Dimensions,
padding: WindowPadding,
) -> RenderedWindow {
let current_surface = LocatedSurface::new(parent_canvas, grid_renderer, grid_size, 0);

Expand All @@ -185,6 +196,7 @@ impl RenderedWindow {
current_scroll: 0.0,
scroll_destination: 0.0,
scroll_t: 2.0, // 2.0 is out of the 0.0 to 1.0 range and stops animation.
padding,
}
}

Expand Down Expand Up @@ -355,9 +367,17 @@ impl RenderedWindow {
grid_size,
floating_order,
} => {
let Dimensions {
width: font_width,
height: font_height
} = grid_renderer.font_dimensions;

let top_offset = self.padding.top as f32 / font_height as f32;
let left_offset = self.padding.left as f32 / font_width as f32;

let grid_left = grid_left.max(0.0);
let grid_top = grid_top.max(0.0);
let new_destination: Point = (grid_left as f32, grid_top as f32).into();
let new_destination: Point = (grid_left as f32 + left_offset, grid_top as f32 + top_offset).into();
seanstrom marked this conversation as resolved.
Show resolved Hide resolved
let new_grid_size: Dimensions = grid_size.into();

if self.grid_destination != new_destination {
Expand Down
24 changes: 21 additions & 3 deletions src/window/mod.rs
Expand Up @@ -41,7 +41,7 @@ use crate::{
event_aggregator::EVENT_AGGREGATOR,
frame::Frame,
redraw_scheduler::REDRAW_SCHEDULER,
renderer::Renderer,
renderer::{Renderer, WindowPadding},
running_tracker::*,
settings::{
load_last_window_settings, save_window_geometry, PersistentWindowSettings, SETTINGS,
Expand Down Expand Up @@ -74,6 +74,7 @@ pub struct GlutinWindowWrapper {
size_at_startup: PhysicalSize<u32>,
maximized_at_startup: bool,
window_command_receiver: UnboundedReceiver<WindowCommand>,
window_padding: WindowPadding,
}

impl GlutinWindowWrapper {
Expand Down Expand Up @@ -239,10 +240,18 @@ impl GlutinWindowWrapper {
}

fn handle_new_grid_size(&mut self, new_size: PhysicalSize<u32>) {
let window_padding_width = self.window_padding.left + self.window_padding.right;
let window_padding_height = self.window_padding.top + self.window_padding.bottom;

let content_size = PhysicalSize {
width: new_size.width - window_padding_width,
height: new_size.height - window_padding_height,
};

let grid_size = self
.renderer
.grid_renderer
.convert_physical_to_grid(new_size);
.convert_physical_to_grid(content_size);

// Have a minimum size
if grid_size.width < MIN_WINDOW_WIDTH || grid_size.height < MIN_WINDOW_HEIGHT {
Expand Down Expand Up @@ -402,8 +411,16 @@ pub fn create_window() {

log::trace!("repositioned window: {}", did_reposition);

let settings = SETTINGS.get::<WindowSettings>();
let window_padding = WindowPadding {
top: settings.top_padding,
left: settings.left_padding,
right: settings.right_padding,
bottom: settings.bottom_padding,
};

let scale_factor = windowed_context.window().scale_factor();
let renderer = Renderer::new(scale_factor);
let renderer = Renderer::new(scale_factor, window_padding);
seanstrom marked this conversation as resolved.
Show resolved Hide resolved
let saved_inner_size = window.inner_size();

let skia_renderer = SkiaRenderer::new(&windowed_context);
Expand All @@ -429,6 +446,7 @@ pub fn create_window() {
saved_inner_size,
saved_grid_size: None,
window_command_receiver,
window_padding,
};

let mut previous_frame_start = Instant::now();
Expand Down
8 changes: 8 additions & 0 deletions src/window/settings.rs
Expand Up @@ -16,6 +16,10 @@ pub struct WindowSettings {
pub touch_drag_timeout: f32,
pub background_color: String,
pub confirm_quit: bool,
pub top_padding: u32,
pub left_padding: u32,
pub right_padding: u32,
pub bottom_padding: u32,
}

impl Default for WindowSettings {
Expand All @@ -35,6 +39,10 @@ impl Default for WindowSettings {
touch_drag_timeout: 0.17,
background_color: "".to_string(),
confirm_quit: true,
top_padding: 0,
left_padding: 0,
right_padding: 0,
bottom_padding: 0,
}
}
}
Expand Down