diff --git a/crates/oa-desktop/src/app/architecture_authoring/palette.rs b/crates/oa-desktop/src/app/architecture_authoring/palette.rs index a2bbb3df..df754ee3 100644 --- a/crates/oa-desktop/src/app/architecture_authoring/palette.rs +++ b/crates/oa-desktop/src/app/architecture_authoring/palette.rs @@ -1,5 +1,6 @@ //! Compact neutral tool palette. Tool state never changes its allocated width. use super::*; +use crate::connection_tool::Tool; use iced::{ Point, Rectangle, Size, Theme, mouse, widget::{ @@ -11,7 +12,7 @@ use iced::{ #[derive(Clone, Copy)] enum Icon { Element(Kind), - Arrow, + Connection(Tool), Existing, Select, Collapse(bool), @@ -76,10 +77,63 @@ impl canvas::Program for Icon { ); } } - Self::Arrow => { - f.stroke(&line(&[(1., 8.), (14., 8.), (10., 4.)]), stroke); - f.stroke(&line(&[(14., 8.), (10., 12.)]), stroke); - } + Self::Connection(connection) => match connection { + // The OA and SA work-flow tools share a visual family; they + // never coexist in a palette. Keep their small glyph legible. + Tool::Interaction | Tool::FunctionalExchange => { + for x in [1., 11.] { + f.stroke( + &Path::rounded_rectangle( + Point::new(x, 5.), + Size::new(4., 6.), + 1.5.into(), + ), + stroke, + ); + } + f.stroke(&line(&[(5., 8.), (10., 8.)]), stroke); + f.stroke(&line(&[(7.5, 5.5), (10., 8.), (7.5, 10.5)]), stroke); + } + Tool::CommunicationMean => { + // Participant endpoints, without implying a fixed direction. + for x in [1., 11.] { + f.stroke( + &Path::rectangle(Point::new(x, 4.), Size::new(4., 8.)), + stroke, + ); + } + f.stroke(&line(&[(5., 8.), (11., 8.)]), stroke); + } + Tool::BoundaryExchange => { + // Ports on facing participant boundaries. Standard exchanges + // are unoriented, so the generic tool has no arrowhead. + for x in [2., 14.] { + f.stroke(&line(&[(x, 2.), (x, 14.)]), stroke); + } + for x in [1., 12.] { + f.stroke( + &Path::rectangle(Point::new(x, 6.), Size::new(3., 4.)), + stroke, + ); + } + f.stroke(&line(&[(4., 8.), (12., 8.)]), stroke); + } + Tool::Allocation => { + // Work enters a performer: allocation can appear as nesting + // rather than a relationship line in allocated-work views. + f.stroke(&line(&[(1., 2.), (1., 14.), (15., 14.), (15., 2.)]), stroke); + f.stroke( + &Path::rounded_rectangle( + Point::new(5., 9.), + Size::new(6., 3.), + 1.into(), + ), + stroke, + ); + f.stroke(&line(&[(8., 1.), (8., 7.)]), stroke); + f.stroke(&line(&[(5., 4.), (8., 7.), (11., 4.)]), stroke); + } + }, Self::Existing => { f.stroke( &Path::rectangle(Point::new(1., 1.), Size::new(10., 10.)), @@ -234,7 +288,7 @@ pub fn view(app: &App) -> Element<'_, Message> { } content = content.push(tool( app, - Icon::Arrow, + Icon::Connection(*connection), connection.label(), Message::Connection(crate::connection_edit::Event::Choose(Some(*connection))), app.connection diff --git a/harness/connection-icons-20260925.md b/harness/connection-icons-20260925.md new file mode 100644 index 00000000..3df8e369 --- /dev/null +++ b/harness/connection-icons-20260925.md @@ -0,0 +1,11 @@ +# Connection tool icons + +Branch candidate for [#41](http://217.177.34.108:3000/sorokin.oleg.edu/ARCADIA-Studio/issues/41), based on published Windows preview source `715036e132677dd2bc2fb37ed316d93dc9987aec`. This is not integrated or native acceptance. + +The reported collapsed palette repeats one arrow for three different tools. Extend the existing Rust/Iced canvas glyphs at their actual 16×16 size: work endpoints plus an arrow for Interaction/Functional exchange, neutral participant endpoints for Communication means, facing component ports for Boundary exchange, and work entering a performer for Allocation. The first pair never coexist in one perspective. Unoriented generic tools must not imply a fixed direction. + +Letter badges were rejected as language-dependent and cramped. Different arrow/dash styles risk confusing tool identity with relation direction. Native endpoint/container shapes fit the existing icon system without font or asset dependencies. Preserve button dimensions, explicit labels/tooltips, ordering, messages, availability and selection rules. + +Independent source critique found no blocker and confirmed the tool semantics and Iced API use. Actual-size legibility remains unverified, particularly the exchange arrow, port details and possible download/import interpretation of Allocation. Verify enabled, disabled, hovered and selected palettes in both perspectives, expansion/collapse, tool activation, representative relation creation and cancellation. Existing keyboard/accessibility behavior must be checked, not inferred from hover labels. Reuse semantic connection tests; geometry hashes alone are not an identification or usability evaluator. + +Linux remains excluded by the existing user pause. Live ownership and integration status belong to the linked issue.