diff --git a/src/widget/canvas.rs b/src/widget/canvas.rs index f60c6bf..40f2b35 100644 --- a/src/widget/canvas.rs +++ b/src/widget/canvas.rs @@ -104,7 +104,8 @@ impl CanvasWidget { CanvasWidget { viewport: Viewport { content_size: Size::new(0.0, 0.0), - rect: druid::Rect::new(0.0, 0.0, 0.0, 0.0), + view_origin: Point::new(0.0, 0.0), + view_size: Size::new(0.0, 0.0), }, widget_size: Size::new(0.0, 0.0), scroll_component: ScrollComponent::new(), @@ -112,11 +113,10 @@ impl CanvasWidget { } fn widget_to_viewport(&self) -> Affine { - let viewport_rect_size = self.viewport.rect.size(); - if !viewport_rect_size.is_empty() && !self.widget_size.is_empty() { - let scale_x = viewport_rect_size.width / self.widget_size.width; - let scale_y = viewport_rect_size.height / self.widget_size.height; - Affine::translate(self.viewport.rect.origin().to_vec2()) + if !self.viewport.view_size.is_empty() && !self.widget_size.is_empty() { + let scale_x = self.viewport.view_size.width / self.widget_size.width; + let scale_y = self.viewport.view_size.height / self.widget_size.height; + Affine::translate(self.viewport.view_origin.to_vec2()) * Affine::scale_non_uniform(scale_x, scale_y) } else { Affine::scale(1.0) // identity @@ -189,7 +189,7 @@ impl Widget for CanvasWidget { data.handle_event(ctx, event, self.widget_to_viewport(), env); } if let Some(transform) = viewport_transform { - let mut new_rect = transform.transform_rect_bbox(self.viewport.rect); + let mut new_rect = transform.transform_rect_bbox(self.viewport.view_rect()); if new_rect.x0 <= 0f64 { new_rect.x1 -= new_rect.x0; new_rect.x0 = 0f64; @@ -198,7 +198,7 @@ impl Widget for CanvasWidget { new_rect.y1 -= new_rect.y0; new_rect.y0 = 0f64; } - self.viewport.rect = new_rect; + self.viewport.view_origin = new_rect.origin(); self.scroll_component .reset_scrollbar_fade(|d| ctx.request_timer(d), env); ctx.request_paint(); @@ -267,13 +267,14 @@ impl Widget for CanvasWidget { let page_content_size = data.versioned_canvas.get().content_size(); let transform = self.widget_to_viewport(); - self.viewport.rect = - transform.transform_rect_bbox(rect) - .with_origin(self.viewport.rect.origin()); + //self.viewport.rect = + // transform.transform_rect_bbox(rect) + // .with_origin(self.viewport.rect.origin()); + self.viewport.view_size = transform.transform_rect_bbox(rect).size(); self.viewport.content_size = druid::Size::new( - self.viewport.rect.x1.max(page_content_size.width), - self.viewport.rect.y1.max(page_content_size.height), + self.viewport.view_rect().x1.max(page_content_size.width), + self.viewport.view_rect().y1.max(page_content_size.height), ); //log::debug!("{:#?}", &self.viewport);