forked from 1b-agent/opencadstudio-upstream
style: apply cargo fmt across workspace (as on main)
Formats the branch the way main's 9cf9ff2 did, so merging main only
conflicts where the code itself differs.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013RyGiMXcsf9HTKfqDxaQGt
This commit is contained in:
532 files changed
+56995
-33416
No files matched your search
+75
-22
@@ -39,7 +39,9 @@ fn dock_app() -> OpenCADStudio {
|
||||
|
||||
/// Where the current dock drag would land, if it has started.
|
||||
fn drag_target(app: &OpenCADStudio) -> Option<crate::ui::dock::DropTarget> {
|
||||
app.dock_drag.and_then(|d| d.movement()).and_then(|(_, _, target)| target)
|
||||
app.dock_drag
|
||||
.and_then(|d| d.movement())
|
||||
.and_then(|(_, _, target)| target)
|
||||
}
|
||||
|
||||
/// Press `id`'s title bar at `from`, drag to `to`, and return the target
|
||||
@@ -205,7 +207,10 @@ fn dock_drop_over_the_viewport_floats_the_panel() {
|
||||
);
|
||||
assert!(matches!(target, Some(DropTarget::Float { .. })));
|
||||
assert!(app.dock.right.is_empty());
|
||||
let f = app.dock.float_rect(PanelId::BlockPalette).expect("floating");
|
||||
let f = app
|
||||
.dock
|
||||
.float_rect(PanelId::BlockPalette)
|
||||
.expect("floating");
|
||||
assert!(f.x > 600.0 && f.x < 800.0 && f.y > 350.0 && f.y < 400.0);
|
||||
// Dragging a floating panel keeps the grab point under the pointer.
|
||||
let target = drag_panel(
|
||||
@@ -214,7 +219,13 @@ fn dock_drop_over_the_viewport_floats_the_panel() {
|
||||
iced::Point::new(f.x + 20.0, f.y + 10.0),
|
||||
iced::Point::new(f.x + 120.0, f.y + 60.0),
|
||||
);
|
||||
assert_eq!(target, Some(DropTarget::Float { x: f.x + 100.0, y: f.y + 50.0 }));
|
||||
assert_eq!(
|
||||
target,
|
||||
Some(DropTarget::Float {
|
||||
x: f.x + 100.0,
|
||||
y: f.y + 50.0
|
||||
})
|
||||
);
|
||||
// Opening a floating panel must not re-dock it.
|
||||
assert!(app.dock.is_placed(PanelId::BlockPalette));
|
||||
}
|
||||
@@ -233,7 +244,10 @@ fn dock_dragging_an_icon_into_another_group_lands_between_its_icons() {
|
||||
let (layout, _) = app.dock_strip_layout(DockSide::Left);
|
||||
// Drag the Blocks icon (group 1) to between Properties and Browser.
|
||||
let _ = app.on_dock(DockMsg::IconPress(PanelId::BlockPalette));
|
||||
let _ = app.on_dock(DockMsg::DragMove(iced::Point::new(20.0, layout[1].icons_top + 10.0)));
|
||||
let _ = app.on_dock(DockMsg::DragMove(iced::Point::new(
|
||||
20.0,
|
||||
layout[1].icons_top + 10.0,
|
||||
)));
|
||||
let _ = app.on_dock(DockMsg::DragMove(iced::Point::new(
|
||||
20.0,
|
||||
layout[0].icons_top + STRIP_CELL_H + 2.0,
|
||||
@@ -267,7 +281,10 @@ fn dock_grip_drag_moves_a_whole_group() {
|
||||
app.dock.right.clear();
|
||||
let (layout, plus_top) = app.dock_strip_layout(DockSide::Left);
|
||||
let _ = app.on_dock(DockMsg::GroupGrab(DockSide::Left, 0));
|
||||
let _ = app.on_dock(DockMsg::DragMove(iced::Point::new(18.0, layout[0].top + 2.0)));
|
||||
let _ = app.on_dock(DockMsg::DragMove(iced::Point::new(
|
||||
18.0,
|
||||
layout[0].top + 2.0,
|
||||
)));
|
||||
let _ = app.on_dock(DockMsg::DragMove(iced::Point::new(18.0, plus_top + 10.0)));
|
||||
let _ = app.on_dock(DockMsg::DragRelease);
|
||||
assert_eq!(app.dock.left[0].panels, vec![PanelId::BlockPalette]);
|
||||
@@ -309,7 +326,10 @@ fn dock_splitter_drag_changes_pallet_heights() {
|
||||
use crate::app::config::DockSide;
|
||||
use crate::ui::dock::{DockGroup, DockMsg, PanelId};
|
||||
let mut app = dock_app();
|
||||
app.dock.left = vec![DockGroup::stack(vec![PanelId::BlockPalette, PanelId::Properties])];
|
||||
app.dock.left = vec![DockGroup::stack(vec![
|
||||
PanelId::BlockPalette,
|
||||
PanelId::Properties,
|
||||
])];
|
||||
app.dock.right.clear();
|
||||
let _ = app.on_dock(DockMsg::SplitGrab(DockSide::Left, 0, 0, 1));
|
||||
let _ = app.on_dock(DockMsg::DragMove(iced::Point::new(100.0, 450.0)));
|
||||
@@ -361,7 +381,13 @@ fn dock_hover_reveals_groups_only_on_an_auto_hiding_edge() {
|
||||
fn dock_float_resize_grows_the_panel() {
|
||||
use crate::ui::dock::{DockMsg, FloatPanel, PanelId};
|
||||
let mut app = dock_app();
|
||||
app.dock.float(FloatPanel::new(PanelId::BlockPalette, 100.0, 100.0, 260.0, 300.0));
|
||||
app.dock.float(FloatPanel::new(
|
||||
PanelId::BlockPalette,
|
||||
100.0,
|
||||
100.0,
|
||||
260.0,
|
||||
300.0,
|
||||
));
|
||||
let _ = app.on_dock(DockMsg::FloatResizeGrab(PanelId::BlockPalette, false));
|
||||
let _ = app.on_dock(DockMsg::DragMove(iced::Point::new(360.0, 400.0)));
|
||||
let _ = app.on_dock(DockMsg::DragMove(iced::Point::new(400.0, 450.0)));
|
||||
@@ -395,16 +421,25 @@ fn dock_edge_menu_adds_and_hides_pallets() {
|
||||
// Unchecking hides it but keeps its place.
|
||||
let _ = app.on_dock(DockMsg::EdgeMenuToggle(DockSide::Left, PanelId::Browser));
|
||||
assert!(!app.show_browser);
|
||||
assert_eq!(app.dock.location(PanelId::Browser), Some((DockSide::Left, 1)));
|
||||
assert_eq!(
|
||||
app.dock.location(PanelId::Browser),
|
||||
Some((DockSide::Left, 1))
|
||||
);
|
||||
// Opening it again from the same edge reuses that place.
|
||||
let _ = app.on_dock(DockMsg::EdgeMenuToggle(DockSide::Left, PanelId::Browser));
|
||||
assert_eq!(app.dock.left.len(), 2);
|
||||
// A pallet open on the other edge is not checked here: picking it
|
||||
// moves it over instead of hiding it.
|
||||
let _ = app.on_dock(DockMsg::EdgeMenuToggle(DockSide::Left, PanelId::BlockPalette));
|
||||
let _ = app.on_dock(DockMsg::EdgeMenuToggle(
|
||||
DockSide::Left,
|
||||
PanelId::BlockPalette,
|
||||
));
|
||||
assert!(app.show_block_palette);
|
||||
assert!(app.dock.right.is_empty());
|
||||
assert_eq!(app.dock.location(PanelId::BlockPalette), Some((DockSide::Left, 2)));
|
||||
assert_eq!(
|
||||
app.dock.location(PanelId::BlockPalette),
|
||||
Some((DockSide::Left, 2))
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -435,7 +470,10 @@ fn layers_command_opens_a_floating_pallet_and_toggles_it_closed() {
|
||||
let _ = app.update(Message::ToggleLayers);
|
||||
assert!(app.show_layers);
|
||||
assert!(app.active_modal.is_none(), "no modal backdrop");
|
||||
let f = app.dock.float_rect(PanelId::Layers).expect("floats on first use");
|
||||
let f = app
|
||||
.dock
|
||||
.float_rect(PanelId::Layers)
|
||||
.expect("floats on first use");
|
||||
assert!(f.x > 0.0 && f.y >= 0.0);
|
||||
let _ = app.update(Message::ToggleLayers);
|
||||
assert!(!app.show_layers);
|
||||
@@ -467,10 +505,9 @@ fn find_in_view(app: &OpenCADStudio, label: &str) -> iced::Point {
|
||||
let mut find = Selector::find(label);
|
||||
ui.operate(&renderer, &mut widget::operation::black_box(&mut find));
|
||||
match widget::Operation::finish(&find) {
|
||||
widget::operation::Outcome::Some(Some(target)) => target
|
||||
.visible_bounds()
|
||||
.expect("visible")
|
||||
.center(),
|
||||
widget::operation::Outcome::Some(Some(target)) => {
|
||||
target.visible_bounds().expect("visible").center()
|
||||
}
|
||||
_ => panic!("{label} not found"),
|
||||
}
|
||||
}
|
||||
@@ -510,11 +547,16 @@ fn docked_title_bar_double_click_floats_the_pallet_in_the_real_view() {
|
||||
use crate::ui::dock::PanelId;
|
||||
let mut app = dock_app();
|
||||
let press = iced::Event::Mouse(iced::mouse::Event::ButtonPressed(iced::mouse::Button::Left));
|
||||
let release =
|
||||
iced::Event::Mouse(iced::mouse::Event::ButtonReleased(iced::mouse::Button::Left));
|
||||
let release = iced::Event::Mouse(iced::mouse::Event::ButtonReleased(
|
||||
iced::mouse::Button::Left,
|
||||
));
|
||||
// The block palette's title text sits in its docked title bar.
|
||||
let title = find_in_view(&app, "Blocks");
|
||||
drive_view(&mut app, title, &[press.clone(), release.clone(), press, release]);
|
||||
drive_view(
|
||||
&mut app,
|
||||
title,
|
||||
&[press.clone(), release.clone(), press, release],
|
||||
);
|
||||
assert!(
|
||||
app.dock.float_rect(PanelId::BlockPalette).is_some(),
|
||||
"a double-click on a docked title bar floats the pallet"
|
||||
@@ -541,7 +583,9 @@ fn hovering_a_strip_icon_reveals_an_auto_hiding_edge_in_the_real_view() {
|
||||
drive_view(
|
||||
&mut app,
|
||||
icon,
|
||||
&[iced::Event::Mouse(iced::mouse::Event::CursorMoved { position: icon })],
|
||||
&[iced::Event::Mouse(iced::mouse::Event::CursorMoved {
|
||||
position: icon,
|
||||
})],
|
||||
);
|
||||
let _ = app.on_dock(DockMsg::HoverSettled(app.dock_hover_gen));
|
||||
assert!(
|
||||
@@ -577,7 +621,10 @@ fn dock_double_clicks_float_and_dock_panels() {
|
||||
assert!(f.x > 0.0, "floats clear of the left edge");
|
||||
let _ = app.on_dock(DockMsg::DockTo(PanelId::Properties, DockSide::Right));
|
||||
assert!(app.dock.floating.is_empty());
|
||||
assert_eq!(app.dock.location(PanelId::Properties), Some((DockSide::Right, 1)));
|
||||
assert_eq!(
|
||||
app.dock.location(PanelId::Properties),
|
||||
Some((DockSide::Right, 1))
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -607,11 +654,17 @@ fn floating_menu_docks_and_allow_docking_keeps_a_drag_floating() {
|
||||
let _ = app.on_dock(DockMsg::DragMove(iced::Point::new(10.0, 60.0)));
|
||||
assert!(matches!(drag_target(&app), Some(DropTarget::Float { .. })));
|
||||
let _ = app.on_dock(DockMsg::DragRelease);
|
||||
let f = app.dock.float_rect(PanelId::BlockPalette).expect("still floating");
|
||||
let f = app
|
||||
.dock
|
||||
.float_rect(PanelId::BlockPalette)
|
||||
.expect("still floating");
|
||||
assert!(!f.docking, "moving it keeps the choice");
|
||||
// The menu's Dock left still docks it.
|
||||
let _ = app.on_dock(DockMsg::FloatMenu(Some(PanelId::BlockPalette)));
|
||||
let _ = app.on_dock(DockMsg::DockTo(PanelId::BlockPalette, DockSide::Left));
|
||||
assert_eq!(app.dock_float_menu, None);
|
||||
assert_eq!(app.dock.location(PanelId::BlockPalette).map(|(s, _)| s), Some(DockSide::Left));
|
||||
assert_eq!(
|
||||
app.dock.location(PanelId::BlockPalette).map(|(s, _)| s),
|
||||
Some(DockSide::Left)
|
||||
);
|
||||
}
|
||||
+21
-5
@@ -384,7 +384,11 @@ impl OpenCADStudio {
|
||||
|
||||
/// Start `drag`, peeking `peek` (a pallet being dragged or resized stays
|
||||
/// shown on an auto-hiding edge).
|
||||
fn dock_begin(&mut self, drag: crate::ui::dock::DockDrag, peek: Option<crate::ui::dock::PanelId>) {
|
||||
fn dock_begin(
|
||||
&mut self,
|
||||
drag: crate::ui::dock::DockDrag,
|
||||
peek: Option<crate::ui::dock::PanelId>,
|
||||
) {
|
||||
if let crate::ui::dock::DockDrag::Move { panel, .. } = drag {
|
||||
self.dock.raise_float(panel);
|
||||
}
|
||||
@@ -501,7 +505,8 @@ impl OpenCADStudio {
|
||||
/// when it has no place yet (opened for the first time, or never moved).
|
||||
pub(crate) fn dock_open_at_default(&mut self, id: crate::ui::dock::PanelId) {
|
||||
if !self.dock.is_placed(id) {
|
||||
self.dock.dock(id, crate::app::config::DockSide::Right, usize::MAX);
|
||||
self.dock
|
||||
.dock(id, crate::app::config::DockSide::Right, usize::MAX);
|
||||
}
|
||||
self.dock_reveal(id);
|
||||
}
|
||||
@@ -517,7 +522,8 @@ impl OpenCADStudio {
|
||||
let (ww, wh) = self.dock_workspace_size();
|
||||
let (w, h) = self.dock_float_size(PanelId::Layers);
|
||||
let (x, y) = (((ww - w) * 0.5).max(0.0), ((wh - h) * 0.5).max(0.0));
|
||||
self.dock.float(FloatPanel::new(PanelId::Layers, x, y, w, h));
|
||||
self.dock
|
||||
.float(FloatPanel::new(PanelId::Layers, x, y, w, h));
|
||||
self.save_config();
|
||||
}
|
||||
self.dock.raise_float(PanelId::Layers);
|
||||
@@ -557,7 +563,13 @@ impl OpenCADStudio {
|
||||
pub(crate) fn dock_workspace_size(&self) -> (f32, f32) {
|
||||
(
|
||||
self.win_size.0,
|
||||
self.tabs[self.active_tab].scene.selection.borrow().view.vp_size.1,
|
||||
self.tabs[self.active_tab]
|
||||
.scene
|
||||
.selection
|
||||
.borrow()
|
||||
.view
|
||||
.vp_size
|
||||
.1,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -745,7 +757,11 @@ impl OpenCADStudio {
|
||||
.find(|(_, _, bottom)| p.y < *bottom)
|
||||
.or(spans.last())
|
||||
{
|
||||
let index = if p.y < (top + bottom) * 0.5 { pos } else { pos + 1 };
|
||||
let index = if p.y < (top + bottom) * 0.5 {
|
||||
pos
|
||||
} else {
|
||||
pos + 1
|
||||
};
|
||||
return DropTarget::Join {
|
||||
side,
|
||||
group: gi,
|
||||
|
||||
+97
-61
@@ -55,7 +55,11 @@ impl OpenCADStudio {
|
||||
.on_right_press(Message::Dock(crate::ui::dock::DockMsg::EdgeMenu(None)))
|
||||
.into(),
|
||||
);
|
||||
layers.push(place_at(dock_edge_menu(side, &checked), x.max(0.0), plus_top));
|
||||
layers.push(place_at(
|
||||
dock_edge_menu(side, &checked),
|
||||
x.max(0.0),
|
||||
plus_top,
|
||||
));
|
||||
}
|
||||
}
|
||||
// An open floating title-bar menu, over its own click catcher.
|
||||
@@ -82,21 +86,20 @@ impl OpenCADStudio {
|
||||
.height(Fill)
|
||||
.into();
|
||||
use crate::ui::dock::DockDrag;
|
||||
let capturing = self.dock_drag.is_some()
|
||||
|| self.xref_col_drag.is_some()
|
||||
|| self.xref_split_drag;
|
||||
let capturing =
|
||||
self.dock_drag.is_some() || self.xref_col_drag.is_some() || self.xref_split_drag;
|
||||
let mut capture = mouse_area(workspace);
|
||||
if capturing {
|
||||
capture = capture
|
||||
.on_move(move |p| Message::Dock(crate::ui::dock::DockMsg::DragMove(p)))
|
||||
.on_release(Message::Dock(crate::ui::dock::DockMsg::DragRelease))
|
||||
.interaction(match self.dock_drag {
|
||||
Some(DockDrag::FloatSize { from_left: true, .. }) => {
|
||||
iced::mouse::Interaction::ResizingDiagonallyUp
|
||||
}
|
||||
Some(DockDrag::FloatSize { from_left: false, .. }) => {
|
||||
iced::mouse::Interaction::ResizingDiagonallyDown
|
||||
}
|
||||
Some(DockDrag::FloatSize {
|
||||
from_left: true, ..
|
||||
}) => iced::mouse::Interaction::ResizingDiagonallyUp,
|
||||
Some(DockDrag::FloatSize {
|
||||
from_left: false, ..
|
||||
}) => iced::mouse::Interaction::ResizingDiagonallyDown,
|
||||
Some(DockDrag::Split { .. }) => iced::mouse::Interaction::ResizingVertically,
|
||||
Some(DockDrag::Move { .. }) => iced::mouse::Interaction::Grabbing,
|
||||
// Widths, the Layer Manager column and the xref drags.
|
||||
@@ -193,8 +196,8 @@ impl OpenCADStudio {
|
||||
let mut items: Vec<Element<'_, Message>> = Vec::new();
|
||||
for gi in self.dock_visible_groups(side) {
|
||||
let is_shown = shown == Some(gi);
|
||||
let lit = target_group == Some(gi)
|
||||
|| (!dragging && self.dock_grip_hover == Some((side, gi)));
|
||||
let lit =
|
||||
target_group == Some(gi) || (!dragging && self.dock_grip_hover == Some((side, gi)));
|
||||
let group_dragged =
|
||||
dragging && movement.is_some_and(|(_, group, _)| group == Some((side, gi)));
|
||||
let panels = self.dock_group_visible(side, gi);
|
||||
@@ -204,7 +207,8 @@ impl OpenCADStudio {
|
||||
for id in panels {
|
||||
let faded = group_dragged
|
||||
|| (dragging
|
||||
&& movement.is_some_and(|(panel, group, _)| group.is_none() && panel == id));
|
||||
&& movement
|
||||
.is_some_and(|(panel, group, _)| group.is_none() && panel == id));
|
||||
let glyph = if faded {
|
||||
crate::ui::icons::themed_disabled(id.icon(), 20.0)
|
||||
} else if is_shown {
|
||||
@@ -324,24 +328,27 @@ impl OpenCADStudio {
|
||||
);
|
||||
}
|
||||
items.push(Space::new().height(STRIP_PLUS_GAP).into());
|
||||
let plus = button(crate::ui::icons::themed_secondary(crate::ui::icons::PLUS, 14.0))
|
||||
.on_press(Message::Dock(DockMsg::EdgeMenu(Some(side))))
|
||||
.style(|theme: &Theme, status| button::Style {
|
||||
background: Some(Background::Color(match status {
|
||||
button::Status::Hovered | button::Status::Pressed => {
|
||||
theme.palette().background.weak.color
|
||||
}
|
||||
_ => theme.palette().background.weakest.color,
|
||||
})),
|
||||
border: Border {
|
||||
radius: 14.0.into(),
|
||||
..Default::default()
|
||||
},
|
||||
let plus = button(crate::ui::icons::themed_secondary(
|
||||
crate::ui::icons::PLUS,
|
||||
14.0,
|
||||
))
|
||||
.on_press(Message::Dock(DockMsg::EdgeMenu(Some(side))))
|
||||
.style(|theme: &Theme, status| button::Style {
|
||||
background: Some(Background::Color(match status {
|
||||
button::Status::Hovered | button::Status::Pressed => {
|
||||
theme.palette().background.weak.color
|
||||
}
|
||||
_ => theme.palette().background.weakest.color,
|
||||
})),
|
||||
border: Border {
|
||||
radius: 14.0.into(),
|
||||
..Default::default()
|
||||
})
|
||||
.width(Length::Fixed(28.0))
|
||||
.height(Length::Fixed(28.0))
|
||||
.padding(7);
|
||||
},
|
||||
..Default::default()
|
||||
})
|
||||
.width(Length::Fixed(28.0))
|
||||
.height(Length::Fixed(28.0))
|
||||
.padding(7);
|
||||
items.push(container(plus).center_x(Length::Fixed(DOCK_STRIP_W)).into());
|
||||
container(column(items))
|
||||
.width(Length::Fixed(DOCK_STRIP_W))
|
||||
@@ -377,15 +384,15 @@ impl OpenCADStudio {
|
||||
crate::ui::dock::PanelId::BlockPalette => {
|
||||
crate::ui::window::block_palette::view(&self.block_palette, width, chrome)
|
||||
}
|
||||
crate::ui::dock::PanelId::ExternalReferences => self.xref_manager.view(
|
||||
width,
|
||||
chrome,
|
||||
tab.xref_missing,
|
||||
&tab.scene.document,
|
||||
),
|
||||
crate::ui::dock::PanelId::ExternalReferences => {
|
||||
self.xref_manager
|
||||
.view(width, chrome, tab.xref_missing, &tab.scene.document)
|
||||
}
|
||||
crate::ui::dock::PanelId::Browser => crate::ui::window::browser::view(
|
||||
&tab.scene.document,
|
||||
tab.sketch_session.as_ref().map(|session| session.name.as_str()),
|
||||
tab.sketch_session
|
||||
.as_ref()
|
||||
.map(|session| session.name.as_str()),
|
||||
width,
|
||||
chrome,
|
||||
),
|
||||
@@ -444,7 +451,12 @@ impl OpenCADStudio {
|
||||
tab: &'a DocumentTab,
|
||||
) -> Element<'a, Message> {
|
||||
use crate::ui::dock::DockMsg;
|
||||
let FloatFrame { x, y, bar_left, hidden } = self.dock_float_frame(f);
|
||||
let FloatFrame {
|
||||
x,
|
||||
y,
|
||||
bar_left,
|
||||
hidden,
|
||||
} = self.dock_float_frame(f);
|
||||
let hovered = self.dock_title_hover == Some(f.id);
|
||||
let bar = floating_title_bar(f.id, self.dock.auto_collapse(f.id), bar_left, hovered);
|
||||
let content: Element<'_, Message> = if hidden {
|
||||
@@ -533,7 +545,12 @@ impl OpenCADStudio {
|
||||
let hidden = self.dock.auto_collapse(f.id) && self.dock_peek != Some(f.id);
|
||||
// A hidden panel keeps its title bar where it sits when shown.
|
||||
let x = if hidden && !bar_left { f.x + f.w } else { f.x };
|
||||
let frame = FloatFrame { x, y: f.y, bar_left, hidden };
|
||||
let frame = FloatFrame {
|
||||
x,
|
||||
y: f.y,
|
||||
bar_left,
|
||||
hidden,
|
||||
};
|
||||
// Keep the panel on screen when the window shrank since it was placed.
|
||||
FloatFrame {
|
||||
x: x.min(ww - frame.width(f)).max(0.0),
|
||||
@@ -560,24 +577,29 @@ impl OpenCADStudio {
|
||||
frame.bar_x(f) + self.dock_float_menu_at.x,
|
||||
frame.y + self.dock_float_menu_at.y,
|
||||
);
|
||||
let menu_x = if at.x + DOCK_MENU_W <= ww { at.x } else { at.x - DOCK_MENU_W };
|
||||
let menu_x = if at.x + DOCK_MENU_W <= ww {
|
||||
at.x
|
||||
} else {
|
||||
at.x - DOCK_MENU_W
|
||||
};
|
||||
let menu_x = menu_x.clamp(0.0, (ww - DOCK_MENU_W).max(0.0));
|
||||
let menu_y = at.y.min(wh - FLOAT_MENU_H).max(0.0);
|
||||
let item = |label: Element<'static, Message>, press: DockMsg| -> Element<'static, Message> {
|
||||
button(label)
|
||||
.on_press(Message::Dock(press))
|
||||
.style(menu_row_style)
|
||||
.padding([5, 8])
|
||||
.width(Fill)
|
||||
.into()
|
||||
};
|
||||
let item =
|
||||
|label: Element<'static, Message>, press: DockMsg| -> Element<'static, Message> {
|
||||
button(label)
|
||||
.on_press(Message::Dock(press))
|
||||
.style(menu_row_style)
|
||||
.padding([5, 8])
|
||||
.width(Fill)
|
||||
.into()
|
||||
};
|
||||
let check: Element<'static, Message> = if f.docking {
|
||||
crate::ui::icons::themed(crate::ui::icons::CHECK, 12.0)
|
||||
} else {
|
||||
Space::new().width(12).height(12).into()
|
||||
};
|
||||
let docking = row![text(t!("Allow docking")).size(12).width(Fill), check]
|
||||
.align_y(iced::Center);
|
||||
let docking =
|
||||
row![text(t!("Allow docking")).size(12).width(Fill), check].align_y(iced::Center);
|
||||
let separator = container(Space::new())
|
||||
.width(Fill)
|
||||
.height(Length::Fixed(1.0))
|
||||
@@ -588,8 +610,14 @@ impl OpenCADStudio {
|
||||
let menu = column![
|
||||
item(docking.into(), DockMsg::FloatDockingToggle(id)),
|
||||
container(separator).padding([3, 4]),
|
||||
item(text(t!("Dock left")).size(12).into(), DockMsg::DockTo(id, DockSide::Left)),
|
||||
item(text(t!("Dock right")).size(12).into(), DockMsg::DockTo(id, DockSide::Right)),
|
||||
item(
|
||||
text(t!("Dock left")).size(12).into(),
|
||||
DockMsg::DockTo(id, DockSide::Left)
|
||||
),
|
||||
item(
|
||||
text(t!("Dock right")).size(12).into(),
|
||||
DockMsg::DockTo(id, DockSide::Right)
|
||||
),
|
||||
]
|
||||
.spacing(1)
|
||||
.padding(4);
|
||||
@@ -629,7 +657,10 @@ impl OpenCADStudio {
|
||||
.into()
|
||||
};
|
||||
let mut layers: Vec<Element<'_, Message>> = Vec::new();
|
||||
let group_drag = self.dock_drag.and_then(|d| d.movement()).and_then(|(_, g, _)| g);
|
||||
let group_drag = self
|
||||
.dock_drag
|
||||
.and_then(|d| d.movement())
|
||||
.and_then(|(_, g, _)| g);
|
||||
let marks_side = match target {
|
||||
DropTarget::Edge { side, .. } | DropTarget::Join { side, .. } => Some(side),
|
||||
DropTarget::Float { x, y } => {
|
||||
@@ -825,7 +856,9 @@ fn dock_icon_ghost(icons: &[crate::ui::dock::PanelId]) -> Element<'static, Messa
|
||||
.style(|theme: &Theme| {
|
||||
let palette = theme.palette();
|
||||
container::Style {
|
||||
background: Some(Background::Color(palette.primary.base.color.scale_alpha(0.22))),
|
||||
background: Some(Background::Color(
|
||||
palette.primary.base.color.scale_alpha(0.22),
|
||||
)),
|
||||
border: Border {
|
||||
color: palette.primary.base.color,
|
||||
width: 1.5,
|
||||
@@ -941,10 +974,10 @@ fn floating_title_bar(
|
||||
let bar = bar
|
||||
.push(container(title).width(Fill).height(Fill).padding([6, 0]))
|
||||
.push(container(crate::ui::icons::themed(id.icon(), 16.0)).center_x(Fill))
|
||||
.padding([4, 0])
|
||||
.align_x(iced::Center)
|
||||
.width(Length::Fixed(DOCK_FLOAT_BAR_W))
|
||||
.height(Fill);
|
||||
.padding([4, 0])
|
||||
.align_x(iced::Center)
|
||||
.width(Length::Fixed(DOCK_FLOAT_BAR_W))
|
||||
.height(Fill);
|
||||
mouse_area(container(bar).style(|theme: &Theme| container::Style {
|
||||
background: Some(Background::Color(theme.palette().background.weak.color)),
|
||||
..Default::default()
|
||||
@@ -986,7 +1019,6 @@ fn dock_divider(id: crate::ui::dock::PanelId) -> Element<'static, Message> {
|
||||
.into()
|
||||
}
|
||||
|
||||
|
||||
/// Width of the icon strip's pallet menu.
|
||||
const DOCK_MENU_W: f32 = 230.0;
|
||||
/// Rough height of a floating title bar's menu, to keep it on screen.
|
||||
@@ -1083,8 +1115,12 @@ fn dock_splitter(
|
||||
..Default::default()
|
||||
});
|
||||
mouse_area(line)
|
||||
.on_press(Message::Dock(crate::ui::dock::DockMsg::SplitGrab(side, gi, upper, lower)))
|
||||
.on_double_click(Message::Dock(crate::ui::dock::DockMsg::SplitReset(side, gi)))
|
||||
.on_press(Message::Dock(crate::ui::dock::DockMsg::SplitGrab(
|
||||
side, gi, upper, lower,
|
||||
)))
|
||||
.on_double_click(Message::Dock(crate::ui::dock::DockMsg::SplitReset(
|
||||
side, gi,
|
||||
)))
|
||||
.interaction(iced::mouse::Interaction::ResizingVertically)
|
||||
.into()
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user