dock: Fix panel should have a maximal width restriction when resizing (#443)
https://github.com/user-attachments/assets/617336d2-5392-4eba-a1b4-f1234c8d2eec
This commit is contained in:
parent
142d092867
commit
53fe5823ef
1 changed files with 42 additions and 7 deletions
|
|
@ -3,8 +3,8 @@
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use gpui::{
|
use gpui::{
|
||||||
div, prelude::FluentBuilder as _, px, Axis, Element, InteractiveElement as _, IntoElement,
|
div, prelude::FluentBuilder as _, px, Axis, Element, Entity, InteractiveElement as _,
|
||||||
MouseMoveEvent, MouseUpEvent, ParentElement as _, Pixels, Point, Render,
|
IntoElement, MouseMoveEvent, MouseUpEvent, ParentElement as _, Pixels, Point, Render,
|
||||||
StatefulInteractiveElement, Style, Styled as _, View, ViewContext, VisualContext as _,
|
StatefulInteractiveElement, Style, Styled as _, View, ViewContext, VisualContext as _,
|
||||||
WeakView, WindowContext,
|
WeakView, WindowContext,
|
||||||
};
|
};
|
||||||
|
|
@ -264,18 +264,39 @@ impl Dock {
|
||||||
cx.new_view(|_| info.clone())
|
cx.new_view(|_| info.clone())
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn resize(&mut self, mouse_position: Point<Pixels>, cx: &mut ViewContext<Self>) {
|
fn resize(&mut self, mouse_position: Point<Pixels>, cx: &mut ViewContext<Self>) {
|
||||||
if !self.is_resizing {
|
if !self.is_resizing {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let area_bounds = self
|
let dock_area = self
|
||||||
.dock_area
|
.dock_area
|
||||||
.upgrade()
|
.upgrade()
|
||||||
.expect("DockArea is missing")
|
.expect("DockArea is missing")
|
||||||
.read(cx)
|
.read(cx);
|
||||||
.bounds;
|
let area_bounds = dock_area.bounds;
|
||||||
|
let mut left_dock_size = Pixels(0.0);
|
||||||
|
let mut right_dock_size = Pixels(0.0);
|
||||||
|
|
||||||
|
// Get the size of the left dock if it's open and not the current dock
|
||||||
|
if let Some(left_dock) = &dock_area.left_dock {
|
||||||
|
if left_dock.entity_id() != cx.view().entity_id() {
|
||||||
|
let left_dock_read = left_dock.read(cx);
|
||||||
|
if left_dock_read.is_open() {
|
||||||
|
left_dock_size = left_dock_read.size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the size of the right dock if it's open and not the current dock
|
||||||
|
if let Some(right_dock) = &dock_area.right_dock {
|
||||||
|
if right_dock.entity_id() != cx.view().entity_id() {
|
||||||
|
let right_dock_read = right_dock.read(cx);
|
||||||
|
if right_dock_read.is_open() {
|
||||||
|
right_dock_size = right_dock_read.size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let size = match self.placement {
|
let size = match self.placement {
|
||||||
DockPlacement::Left => mouse_position.x - area_bounds.left(),
|
DockPlacement::Left => mouse_position.x - area_bounds.left(),
|
||||||
|
|
@ -283,8 +304,22 @@ impl Dock {
|
||||||
DockPlacement::Bottom => area_bounds.bottom() - mouse_position.y,
|
DockPlacement::Bottom => area_bounds.bottom() - mouse_position.y,
|
||||||
DockPlacement::Center => unreachable!(),
|
DockPlacement::Center => unreachable!(),
|
||||||
};
|
};
|
||||||
|
match self.placement {
|
||||||
|
DockPlacement::Left => {
|
||||||
|
let max_size = area_bounds.size.width - PANEL_MIN_SIZE - right_dock_size;
|
||||||
|
self.size = size.clamp(PANEL_MIN_SIZE, max_size);
|
||||||
|
}
|
||||||
|
DockPlacement::Right => {
|
||||||
|
let max_size = area_bounds.size.width - PANEL_MIN_SIZE - left_dock_size;
|
||||||
|
self.size = size.clamp(PANEL_MIN_SIZE, max_size);
|
||||||
|
}
|
||||||
|
DockPlacement::Bottom => {
|
||||||
|
let max_size = area_bounds.size.height - PANEL_MIN_SIZE;
|
||||||
|
self.size = size.clamp(PANEL_MIN_SIZE, max_size);
|
||||||
|
}
|
||||||
|
DockPlacement::Center => unreachable!(),
|
||||||
|
}
|
||||||
|
|
||||||
self.size = size.max(PANEL_MIN_SIZE);
|
|
||||||
cx.notify();
|
cx.notify();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue