diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index c4828cc7d3..200a9743d6 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -6905,7 +6905,7 @@ impl Editor { ) .child( h_flex() - .h(line_height + BORDER_WIDTH * px(2.)) + .h(line_height + BORDER_WIDTH * 2.) .px_1p5() .gap_1() // Workaround: For some reason, there's a gap if we don't do this diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index b9ceca457d..b07938ef28 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -3303,7 +3303,7 @@ impl EditorElement { let offset = scroll_position - max_row as f32; if offset > 0.0 { - origin.y -= Pixels(offset) * line_height; + origin.y -= offset * line_height; } break; } @@ -4524,7 +4524,7 @@ impl EditorElement { hunk_hitbox.origin.x - hunk_hitbox.size.width, hunk_hitbox.origin.y, ), - size(hunk_hitbox.size.width * px(2.), hunk_hitbox.size.height), + size(hunk_hitbox.size.width * 2., hunk_hitbox.size.height), ), cx.theme().colors().version_control_deleted, Corners::all(1. * line_height), @@ -7859,10 +7859,10 @@ impl ScrollbarRangeData { let text_bounds_size = size(longest_line_width, max_row.0 as f32 * letter_size.height); let settings = EditorSettings::get_global(cx); - let scroll_beyond_last_line: Pixels = match settings.scroll_beyond_last_line { - ScrollBeyondLastLine::OnePage => px(scrollbar_bounds.size.height / letter_size.height), - ScrollBeyondLastLine::Off => px(1.), - ScrollBeyondLastLine::VerticalScrollMargin => px(1.0 + settings.vertical_scroll_margin), + let scroll_beyond_last_line: f32 = match settings.scroll_beyond_last_line { + ScrollBeyondLastLine::OnePage => scrollbar_bounds.size.height / letter_size.height, + ScrollBeyondLastLine::Off => 1.0, + ScrollBeyondLastLine::VerticalScrollMargin => 1.0 + settings.vertical_scroll_margin, }; let right_margin = if longest_line_width + longest_line_blame_width >= editor_width { @@ -8534,7 +8534,7 @@ fn compute_auto_height_layout( snapshot = editor.snapshot(window, cx); } - let scroll_height = Pixels::from(snapshot.max_point().row().next_row().0) * line_height; + let scroll_height = (snapshot.max_point().row().next_row().0 as f32) * line_height; let height = scroll_height .max(line_height) .min(line_height * max_lines as f32); diff --git a/crates/editor/src/hover_popover.rs b/crates/editor/src/hover_popover.rs index 5670e774c3..e15b0681e7 100644 --- a/crates/editor/src/hover_popover.rs +++ b/crates/editor/src/hover_popover.rs @@ -29,7 +29,7 @@ use workspace::{OpenOptions, OpenVisible, Workspace}; pub const HOVER_REQUEST_DELAY_MILLIS: u64 = 200; pub const MIN_POPOVER_CHARACTER_WIDTH: f32 = 20.; -pub const MIN_POPOVER_LINE_HEIGHT: Pixels = px(4.); +pub const MIN_POPOVER_LINE_HEIGHT: f32 = 4.; pub const HOVER_POPOVER_GAP: Pixels = px(10.); /// Bindable action which uses the most recent selection head to trigger a hover diff --git a/crates/file_finder/src/file_finder.rs b/crates/file_finder/src/file_finder.rs index 305ed69d97..a796de6f3b 100644 --- a/crates/file_finder/src/file_finder.rs +++ b/crates/file_finder/src/file_finder.rs @@ -1067,7 +1067,7 @@ fn full_path_budget( small_em: Pixels, max_width: Pixels, ) -> usize { - ((px(max_width / px(0.8)) - px(file_name.len() as f32) * normal_em) / small_em) as usize + (((max_width / 0.8) - file_name.len() * normal_em) / small_em) as usize } impl PickerDelegate for FileFinderDelegate { diff --git a/crates/gpui/src/geometry.rs b/crates/gpui/src/geometry.rs index ce3f9bde0d..d559a6db1b 100644 --- a/crates/gpui/src/geometry.rs +++ b/crates/gpui/src/geometry.rs @@ -2468,7 +2468,7 @@ impl std::fmt::Display for Pixels { } } -impl std::ops::Div for Pixels { +impl Div for Pixels { type Output = f32; fn div(self, rhs: Self) -> Self::Output { @@ -2497,18 +2497,10 @@ impl std::ops::Rem for Pixels { } impl Mul for Pixels { - type Output = Pixels; + type Output = Self; - fn mul(self, other: f32) -> Pixels { - Pixels(self.0 * other) - } -} - -impl Mul for Pixels { - type Output = Pixels; - - fn mul(self, other: usize) -> Pixels { - Pixels(self.0 * other as f32) + fn mul(self, rhs: f32) -> Self { + Self(self.0 * rhs) } } @@ -2516,13 +2508,29 @@ impl Mul for f32 { type Output = Pixels; fn mul(self, rhs: Pixels) -> Self::Output { - Pixels(self * rhs.0) + rhs * self + } +} + +impl Mul for Pixels { + type Output = Self; + + fn mul(self, rhs: usize) -> Self { + self * (rhs as f32) + } +} + +impl Mul for usize { + type Output = Pixels; + + fn mul(self, rhs: Pixels) -> Pixels { + rhs * self } } impl MulAssign for Pixels { - fn mul_assign(&mut self, other: f32) { - self.0 *= other; + fn mul_assign(&mut self, rhs: f32) { + self.0 *= rhs; } } @@ -2617,14 +2625,6 @@ impl Pixels { } } -impl Mul for Pixels { - type Output = Pixels; - - fn mul(self, rhs: Pixels) -> Self::Output { - Pixels(self.0 * rhs.0) - } -} - impl Eq for Pixels {} impl PartialOrd for Pixels { @@ -2821,7 +2821,9 @@ impl From for DevicePixels { /// a single logical pixel may correspond to multiple physical pixels. By using `ScaledPixels`, /// dimensions and positions can be specified in a way that scales appropriately across different /// display resolutions. -#[derive(Clone, Copy, Default, Add, AddAssign, Sub, SubAssign, Div, PartialEq, PartialOrd)] +#[derive( + Clone, Copy, Default, Add, AddAssign, Sub, SubAssign, Div, DivAssign, PartialEq, PartialOrd, +)] #[repr(transparent)] pub struct ScaledPixels(pub(crate) f32); @@ -2877,6 +2879,72 @@ impl From for u32 { } } +impl Div for ScaledPixels { + type Output = f32; + + fn div(self, rhs: Self) -> Self::Output { + self.0 / rhs.0 + } +} + +impl std::ops::DivAssign for ScaledPixels { + fn div_assign(&mut self, rhs: Self) { + *self = Self(self.0 / rhs.0); + } +} + +impl std::ops::RemAssign for ScaledPixels { + fn rem_assign(&mut self, rhs: Self) { + self.0 %= rhs.0; + } +} + +impl std::ops::Rem for ScaledPixels { + type Output = Self; + + fn rem(self, rhs: Self) -> Self { + Self(self.0 % rhs.0) + } +} + +impl Mul for ScaledPixels { + type Output = Self; + + fn mul(self, rhs: f32) -> Self { + Self(self.0 * rhs) + } +} + +impl Mul for f32 { + type Output = ScaledPixels; + + fn mul(self, rhs: ScaledPixels) -> Self::Output { + rhs * self + } +} + +impl Mul for ScaledPixels { + type Output = Self; + + fn mul(self, rhs: usize) -> Self { + self * (rhs as f32) + } +} + +impl Mul for usize { + type Output = ScaledPixels; + + fn mul(self, rhs: ScaledPixels) -> ScaledPixels { + rhs * self + } +} + +impl MulAssign for ScaledPixels { + fn mul_assign(&mut self, rhs: f32) { + self.0 *= rhs; + } +} + /// Represents a length in rems, a unit based on the font-size of the window, which can be assigned with [`Window::set_rem_size`][set_rem_size]. /// /// Rems are used for defining lengths that are scalable and consistent across different UI elements. diff --git a/crates/outline_panel/src/outline_panel.rs b/crates/outline_panel/src/outline_panel.rs index 45b47d323c..e64210a84f 100644 --- a/crates/outline_panel/src/outline_panel.rs +++ b/crates/outline_panel/src/outline_panel.rs @@ -4586,7 +4586,7 @@ impl OutlinePanel { .with_render_fn( cx.entity().clone(), move |outline_panel, params, _, _| { - const LEFT_OFFSET: f32 = 14.; + const LEFT_OFFSET: Pixels = px(14.); let indent_size = params.indent_size; let item_height = params.item_height; @@ -4602,11 +4602,10 @@ impl OutlinePanel { .map(|(ix, layout)| { let bounds = Bounds::new( point( - px(layout.offset.x as f32) * indent_size - + px(LEFT_OFFSET), - px(layout.offset.y as f32) * item_height, + layout.offset.x * indent_size + LEFT_OFFSET, + layout.offset.y * item_height, ), - size(px(1.), px(layout.length as f32) * item_height), + size(px(1.), layout.length * item_height), ); ui::RenderedIndentGuide { bounds, diff --git a/crates/project_panel/src/project_panel.rs b/crates/project_panel/src/project_panel.rs index e04b15850f..11940f6dba 100644 --- a/crates/project_panel/src/project_panel.rs +++ b/crates/project_panel/src/project_panel.rs @@ -4571,9 +4571,9 @@ impl Render for ProjectPanel { .with_render_fn( cx.entity().clone(), move |this, params, _, cx| { - const LEFT_OFFSET: f32 = 14.; - const PADDING_Y: f32 = 4.; - const HITBOX_OVERDRAW: f32 = 3.; + const LEFT_OFFSET: Pixels = px(14.); + const PADDING_Y: Pixels = px(4.); + const HITBOX_OVERDRAW: Pixels = px(3.); let active_indent_guide_index = this.find_active_indent_guide(¶ms.indent_guides, cx); @@ -4589,19 +4589,16 @@ impl Render for ProjectPanel { let offset = if layout.continues_offscreen { px(0.) } else { - px(PADDING_Y) + PADDING_Y }; let bounds = Bounds::new( point( - px(layout.offset.x as f32) * indent_size - + px(LEFT_OFFSET), - px(layout.offset.y as f32) * item_height - + offset, + layout.offset.x * indent_size + LEFT_OFFSET, + layout.offset.y * item_height + offset, ), size( px(1.), - px(layout.length as f32) * item_height - - px(offset.0 * 2.), + layout.length * item_height - offset * 2., ), ); ui::RenderedIndentGuide { @@ -4610,12 +4607,11 @@ impl Render for ProjectPanel { is_active: Some(idx) == active_indent_guide_index, hitbox: Some(Bounds::new( point( - bounds.origin.x - px(HITBOX_OVERDRAW), + bounds.origin.x - HITBOX_OVERDRAW, bounds.origin.y, ), size( - bounds.size.width - + px(2. * HITBOX_OVERDRAW), + bounds.size.width + HITBOX_OVERDRAW * 2., bounds.size.height, ), )), diff --git a/crates/terminal_view/src/terminal_element.rs b/crates/terminal_view/src/terminal_element.rs index 1f39e64b55..d5fc188c77 100644 --- a/crates/terminal_view/src/terminal_element.rs +++ b/crates/terminal_view/src/terminal_element.rs @@ -662,7 +662,8 @@ impl Element for TerminalElement { let dimensions = { let rem_size = window.rem_size(); let font_pixels = text_style.font_size.to_pixels(rem_size); - let line_height = font_pixels * line_height.to_pixels(rem_size); + // TODO: line_height should be an f32 not an AbsoluteLength. + let line_height = font_pixels * line_height.to_pixels(rem_size).0; let font_id = cx.text_system().resolve_font(&text_style.font()); let cell_width = text_system diff --git a/crates/ui/src/components/indent_guides.rs b/crates/ui/src/components/indent_guides.rs index 312eb5163c..fdee604055 100644 --- a/crates/ui/src/components/indent_guides.rs +++ b/crates/ui/src/components/indent_guides.rs @@ -172,10 +172,10 @@ mod uniform_list { .map(|layout| RenderedIndentGuide { bounds: Bounds::new( point( - px(layout.offset.x as f32) * self.indent_size, - px(layout.offset.y as f32) * item_height, + layout.offset.x * self.indent_size, + layout.offset.y * item_height, ), - size(px(1.), px(layout.length as f32) * item_height), + size(px(1.), layout.length * item_height), ), layout, is_active: false,