dock: Fix add_panel with placement to split size. (#212)
https://github.com/user-attachments/assets/7177bd8f-5b19-4959-8d60-cae583173e73
This commit is contained in:
parent
acabaf32c8
commit
f6b4e5a591
3 changed files with 31 additions and 32 deletions
|
|
@ -55,34 +55,29 @@ impl StoryWorkspace {
|
|||
let dock_area = cx.new_view(|cx| DockArea::new("main-dock", stack_panel.clone(), cx));
|
||||
let weak_dock_area = dock_area.downgrade();
|
||||
|
||||
let center_tab_panel =
|
||||
cx.new_view(|cx| TabPanel::new(Some(stack_panel.clone()), weak_dock_area.clone(), cx));
|
||||
let left_tab_panel =
|
||||
cx.new_view(|cx| TabPanel::new(Some(stack_panel.clone()), weak_dock_area.clone(), cx));
|
||||
let right_tab_panel =
|
||||
cx.new_view(|cx| TabPanel::new(Some(stack_panel.clone()), weak_dock_area.clone(), cx));
|
||||
let center_tab_panel = cx.new_view(|cx| TabPanel::new(None, weak_dock_area.clone(), cx));
|
||||
let left_tab_panel = cx.new_view(|cx| {
|
||||
let stack_panel = cx.new_view(|cx| StackPanel::new(Axis::Vertical, cx));
|
||||
TabPanel::new(Some(stack_panel), weak_dock_area.clone(), cx)
|
||||
});
|
||||
|
||||
let right_tab_panel = cx.new_view(|cx| {
|
||||
let stack_panel = cx.new_view(|cx| StackPanel::new(Axis::Vertical, cx));
|
||||
TabPanel::new(Some(stack_panel), weak_dock_area.clone(), cx)
|
||||
});
|
||||
|
||||
stack_panel.update(cx, |view, cx| {
|
||||
let left_stack_panel = cx.new_view(|cx| StackPanel::new(Axis::Vertical, cx));
|
||||
left_stack_panel.update(cx, |view, cx| {
|
||||
view.add_panel(left_tab_panel.clone(), None, weak_dock_area.clone(), cx);
|
||||
});
|
||||
view.add_panel(
|
||||
left_stack_panel.clone(),
|
||||
left_tab_panel.clone(),
|
||||
Some(px(300.)),
|
||||
weak_dock_area.clone(),
|
||||
cx,
|
||||
);
|
||||
|
||||
view.add_panel(center_tab_panel.clone(), None, weak_dock_area.clone(), cx);
|
||||
|
||||
let right_stack_panel = cx.new_view(|cx| StackPanel::new(Axis::Vertical, cx));
|
||||
right_stack_panel.update(cx, |view, cx| {
|
||||
view.add_panel(right_tab_panel.clone(), None, weak_dock_area.clone(), cx);
|
||||
});
|
||||
view.add_panel(
|
||||
right_stack_panel.clone(),
|
||||
Some(px(340.)),
|
||||
right_tab_panel.clone(),
|
||||
Some(px(350.)),
|
||||
weak_dock_area.clone(),
|
||||
cx,
|
||||
);
|
||||
|
|
@ -213,7 +208,7 @@ impl StoryWorkspace {
|
|||
"Render SVG image and Chart",
|
||||
ImageStory::view(cx).into(),
|
||||
right_tab_panel.clone(),
|
||||
None,
|
||||
Some(Placement::Bottom),
|
||||
None,
|
||||
true,
|
||||
cx,
|
||||
|
|
@ -280,8 +275,8 @@ impl StoryWorkspace {
|
|||
"Calendar",
|
||||
"A calendar component.",
|
||||
CalendarStory::view(cx).into(),
|
||||
center_tab_panel.clone(),
|
||||
None,
|
||||
right_tab_panel.clone(),
|
||||
Some(Placement::Bottom),
|
||||
None,
|
||||
true,
|
||||
cx,
|
||||
|
|
|
|||
|
|
@ -146,7 +146,7 @@ impl StackPanel {
|
|||
P: Panel,
|
||||
{
|
||||
resizable_panel()
|
||||
.content_view(panel.view())
|
||||
.content_view(panel.into())
|
||||
.when_some(size, |this, size| this.size(size))
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -93,7 +93,7 @@ impl ResizablePanelGroup {
|
|||
let mut panel = panel;
|
||||
panel.axis = self.axis;
|
||||
panel.group = Some(cx.view().clone());
|
||||
self.sizes.push(panel.size.unwrap_or_default());
|
||||
self.sizes.push(panel.initial_size.unwrap_or_default());
|
||||
self.panels.push(cx.new_view(|_| panel));
|
||||
}
|
||||
|
||||
|
|
@ -101,7 +101,9 @@ impl ResizablePanelGroup {
|
|||
let mut panel = panel;
|
||||
panel.axis = self.axis;
|
||||
panel.group = Some(cx.view().clone());
|
||||
self.sizes.insert(ix, panel.size.unwrap_or_default());
|
||||
|
||||
self.sizes
|
||||
.insert(ix, panel.initial_size.unwrap_or_default());
|
||||
self.panels.insert(ix, cx.new_view(|_| panel));
|
||||
cx.notify()
|
||||
}
|
||||
|
|
@ -114,9 +116,14 @@ impl ResizablePanelGroup {
|
|||
cx: &mut ViewContext<Self>,
|
||||
) {
|
||||
let mut panel = panel;
|
||||
|
||||
let old_panel = self.panels[ix].clone();
|
||||
let old_panel_initial_size = old_panel.read(cx).initial_size;
|
||||
|
||||
panel.initial_size = old_panel_initial_size;
|
||||
panel.axis = self.axis;
|
||||
panel.group = Some(cx.view().clone());
|
||||
self.sizes[ix] = panel.size.unwrap_or_default();
|
||||
self.sizes[ix] = panel.initial_size.unwrap_or_default();
|
||||
self.panels[ix] = cx.new_view(|_| panel);
|
||||
cx.notify()
|
||||
}
|
||||
|
|
@ -327,6 +334,7 @@ impl ResizablePanel {
|
|||
self
|
||||
}
|
||||
|
||||
/// Set the initial size of the panel.
|
||||
pub fn size(mut self, size: Pixels) -> Self {
|
||||
self.initial_size = Some(size);
|
||||
self
|
||||
|
|
@ -369,16 +377,12 @@ impl Render for ResizablePanel {
|
|||
.when(self.axis.is_vertical(), |this| this.min_h(PANEL_MIN_SIZE))
|
||||
.when(self.axis.is_horizontal(), |this| this.min_w(PANEL_MIN_SIZE))
|
||||
.when_some(self.initial_size, |this, size| {
|
||||
// The changed_size is None, that mean the initial size for the panel, so we need set flex_shrink_0
|
||||
// The `self.size` is None, that mean the initial size for the panel, so we need set flex_shrink_0
|
||||
// To let it keep the initial size.
|
||||
this.when(self.size.is_none(), |this| this.flex_shrink_0())
|
||||
.when(self.axis.is_vertical(), |this| this.h(size))
|
||||
.when(self.axis.is_horizontal(), |this| this.w(size))
|
||||
})
|
||||
.when_some(self.size, |this, size| {
|
||||
this.when(self.axis.is_vertical(), |this| this.h(size))
|
||||
.when(self.axis.is_horizontal(), |this| this.w(size))
|
||||
.flex_basis(size)
|
||||
})
|
||||
.when_some(self.size, |this, size| this.flex_basis(size))
|
||||
.child({
|
||||
canvas(
|
||||
move |bounds, cx| view.update(cx, |r, cx| r.update_size(bounds, cx)),
|
||||
|
|
|
|||
Loading…
Reference in a new issue