@@ -265,6 +265,8 @@ impl<P: Debug> Debug for BlockProperties<P> {
pub enum BlockStyle {
Fixed,
Flex,
+ /// Like `Flex` but doesn't use the gutter
+ FlexClipped,
Sticky,
}
@@ -272,6 +274,7 @@ pub enum BlockStyle {
pub struct EditorMargins {
pub gutter: GutterDimensions,
pub right: Pixels,
+ pub extended_right: Pixels,
}
#[derive(gpui::AppContext, gpui::VisualContext)]
@@ -393,8 +396,8 @@ impl Block {
Block::Custom(block) => block.style,
Block::ExcerptBoundary { .. }
| Block::FoldedBuffer { .. }
- | Block::BufferHeader { .. }
- | Block::Spacer { .. } => BlockStyle::Sticky,
+ | Block::BufferHeader { .. } => BlockStyle::Sticky,
+ Block::Spacer { .. } => BlockStyle::FlexClipped,
}
}
@@ -1707,7 +1710,7 @@ pub(crate) fn balancing_block(
Some(BlockProperties {
placement: their_placement,
height: my_block.height,
- style: BlockStyle::Sticky,
+ style: BlockStyle::FlexClipped,
render: Arc::new(move |cx| {
crate::EditorElement::render_spacer_block(
cx.block_id,
@@ -4224,7 +4224,15 @@ impl EditorElement {
.size
.width
.max(fixed_block_max_width)
- .max(editor_margins.gutter.width + *scroll_width)
+ .max(
+ editor_margins.gutter.width + *scroll_width + editor_margins.extended_right,
+ )
+ .into(),
+ (BlockStyle::FlexClipped, _) => hitbox
+ .size
+ .width
+ .max(fixed_block_max_width)
+ .max(*scroll_width + editor_margins.extended_right)
.into(),
(BlockStyle::Fixed, _) => unreachable!(),
};
@@ -4267,7 +4275,7 @@ impl EditorElement {
element,
available_space: size(width, element_size.height.into()),
style,
- overlaps_gutter: !block.place_near(),
+ overlaps_gutter: !block.place_near() && style != BlockStyle::FlexClipped,
is_buffer_header: block.is_buffer_header(),
});
}
@@ -4281,12 +4289,17 @@ impl EditorElement {
let style = block.style();
let width = match style {
BlockStyle::Fixed => AvailableSpace::MinContent,
- BlockStyle::Flex => AvailableSpace::Definite(
+ BlockStyle::Flex => {
+ AvailableSpace::Definite(hitbox.size.width.max(fixed_block_max_width).max(
+ editor_margins.gutter.width + *scroll_width + editor_margins.extended_right,
+ ))
+ }
+ BlockStyle::FlexClipped => AvailableSpace::Definite(
hitbox
.size
.width
.max(fixed_block_max_width)
- .max(editor_margins.gutter.width + *scroll_width),
+ .max(*scroll_width + editor_margins.extended_right),
),
BlockStyle::Sticky => AvailableSpace::Definite(hitbox.size.width),
};
@@ -4346,6 +4359,7 @@ impl EditorElement {
&self,
blocks: &mut Vec<BlockLayout>,
hitbox: &Hitbox,
+ gutter_hitbox: &Hitbox,
line_height: Pixels,
scroll_position: gpui::Point<ScrollOffset>,
scroll_pixel_position: gpui::Point<ScrollPixelOffset>,
@@ -4367,6 +4381,10 @@ impl EditorElement {
hitbox.origin + point(Pixels::ZERO, hitbox.size.height)
};
+ if block.style == BlockStyle::FlexClipped {
+ origin += point(gutter_hitbox.size.width, Pixels::ZERO);
+ }
+
if !matches!(block.style, BlockStyle::Sticky) {
origin += point(Pixels::from(-scroll_pixel_position.x), Pixels::ZERO);
}
@@ -9561,11 +9579,12 @@ impl Element for EditorElement {
let right_margin = minimap_width + vertical_scrollbar_width;
- let editor_width =
- text_width - gutter_dimensions.margin - 2 * em_width - right_margin;
+ let extended_right = 2 * em_width + right_margin;
+ let editor_width = text_width - gutter_dimensions.margin - extended_right;
let editor_margins = EditorMargins {
gutter: gutter_dimensions,
right: right_margin,
+ extended_right,
};
snapshot = self.editor.update(cx, |editor, cx| {
@@ -10449,6 +10468,7 @@ impl Element for EditorElement {
self.layout_blocks(
&mut blocks,
&hitbox,
+ &gutter_hitbox,
line_height,
scroll_position,
scroll_pixel_position,