Skip to content

Part of #978: the Color Wheel panel offers a box view with a color field and a channel strip - #7602

Open
dotCooCoo wants to merge 2 commits into
storytold:mainfrom
dotCooCoo:feat/color-wheel-box
Open

dotCooCoo wants to merge 2 commits into
storytold:mainfrom
dotCooCoo:feat/color-wheel-box

Conversation

@dotCooCoo

Copy link
Copy Markdown
Contributor

What and why

Part of #978. The Color Wheel panel (#2279) gains a box view, VectorCraft's own alternative to the wheel.

  • The panel menu gains Wheel View and Box View, and Box Channel (Hue, Saturation, Brightness, Red, Green, Blue), which is available while the box shows.
  • The box takes the wheel's place: a color field with a 22 pt channel strip at its right. The field shows the other two components on the Color Picker's axes (Hue: saturation across and brightness up; Red: blue across and green up). A click or drag in the field sets those two components, and the strip sets the channel. A drag is one undo step, and picks go through the same paint commands and color model rules as the wheel's.
  • With no color to edit (None, a pattern or a "?" proxy), the field and the strip show no markers and read 0 to screen readers, as the wheel does.
  • ui.colorWheel {view?, channel?} sets the view and the channel and returns {view, channel}. Params that are not an object, another key or a value off the list are an error and change nothing. Both settings are kept with the preferences; a saved value this build does not know reads as that key's default without losing the other preferences.
  • The strip takes the arrow keys after a click and offers screen readers its increment, decrement and set-value actions. The Color Picker's channel slider uses the same widget (channel_slider_stepped), so it now takes the arrow keys and offers those actions too.
  • New strings have rows in the complete catalogs. docs/mcp.md, docs/control-protocol.md and the Color Wheel line in docs/target-app-parity.md describe the change.

How it was tested

New tests in crates/ui-egui/src/panels/tests_color_wheel_box.rs (13) cover the field's axes for Hue and Red, a drag as one undo step, the strip's arrow keys and screen-reader actions, the strip with a None fill, ui.colorWheel's settings and errors, the saved settings read key by key, the panel menu, the box's mapping for every channel, the translated errors, and the Color Picker's channel slider taking the arrow keys. The tests were shown failing with each of these broken in turn: the ui.colorWheel dispatch, the param checks, the per-key settings reader, the strip's key handling, the strip's no-color state, the field's vertical axis, a catalog row, and the Color Picker's stepped slider.

On Linux, on main at a47d7eec:

  • cargo fmt --all -- --check
  • cargo clippy -p vectorcraft-ui-egui -p vectorcraft-mcp --all-targets -- -D warnings
  • cargo test -p vectorcraft-ui-egui -p vectorcraft-mcp --no-fail-fast: 4850 passed, 0 failed, 2 ignored, in 11 test binaries.
  • cargo xtask ui-commands --check, cargo xtask brands, cargo xtask assets and cargo xtask layers

Checklist

  • cargo xtask ci passes (fmt, clippy, tests, assets, brands, layers, wasm).
  • No panics in shipped code: no unwrap(), expect(), panic!, unreachable!, todo! or
    unimplemented! outside tests, and no unchecked indexing on data from files, parameters or
    messages. Errors are returned as Result and shown to the user
    (why and how).
  • Clean-room: nothing copied from Adobe products or GPL/AGPL code (AGENTS.md).
  • Every new asset has a row in ASSETS.md.

… color field and a channel strip

The Color Wheel panel's menu gains Wheel View and Box View, and Box
Channel with Hue, Saturation, Brightness, Red, Green and Blue while the
box shows. The box takes the wheel's place: a color field with a 22 pt
channel strip at its right. The field shows the other two components on
the Color Picker's axes (Hue: saturation across and brightness up; Red:
blue across and green up). A click or drag in the field sets those two,
and the strip sets the channel; a drag is one undo step, and picks go
through the same paint commands and color model rules as the wheel's.
With no color to edit, the field and the strip show no markers and read
0 to screen readers, as the wheel does.

ui.colorWheel {view?, channel?} sets the view and the channel and
returns them. Params that are not an object, another key or a value off
the list are an error and change nothing. Both settings are kept with
the preferences, and a saved value the build does not know reads as
that key's default without losing the other preferences.

The strip takes the arrow keys after a click and offers screen readers
its increment, decrement and set-value actions. The Color Picker's
channel slider uses the same widget, so it now takes the arrow keys and
offers those actions too. New strings have rows in the complete
catalogs, and docs/mcp.md and docs/control-protocol.md describe the
command.
@coderabbitai

coderabbitai Bot commented Nov 14, 2026 •

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 6 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used all 10 included reviews currently available.

Learn how review limits work.

Review configuration:

Run configuration

Commits

Reviewing files that changed from the base of the PR and between bbb5a38 and 674b3ba.

Files ignored due to path filters: 28

  • crates/ui-egui/src/i18n/bg.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/bs.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/ca.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/cs.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/da.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/de.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/el.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/es.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/fi.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/fr.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/gu.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/hi.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/hu.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/id.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/it.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/ja.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/ka.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/ko.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/nl.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/pl.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/pt-br.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/ru.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/sv.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/tr.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/uk.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/vi.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/zh-hans.tsv is excluded by !**/*.tsv
  • crates/ui-egui/src/i18n/zh-hant.tsv is excluded by !**/*.tsv
Files selected for processing: 14

  • crates/mcp/src/ui_catalog.rs
  • crates/ui-egui/src/dialogs.rs
  • crates/ui-egui/src/dialogs/color_picker.rs
  • crates/ui-egui/src/menus/run.rs
  • crates/ui-egui/src/menus/ui_commands.rs
  • crates/ui-egui/src/panels.rs
  • crates/ui-egui/src/panels/color_wheel.rs
  • crates/ui-egui/src/panels/tests_color_wheel_box.rs
  • crates/ui-egui/src/state.rs
  • crates/ui-egui/src/widgets.rs
  • crates/ui-egui/src/widgets/color.rs
  • docs/control-protocol.md
  • docs/mcp.md
  • docs/target-app-parity.md
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

With a None fill, a set-value action, a key or an increment on the box
view's channel strip that leaves the number at the last solid color's
value now sets the fill, as the field and the hue ring do.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant