Route brush refresh view through app core

This commit is contained in:
2026-06-05 01:13:34 +02:00
parent d5403f082c
commit 31c26c3127
8 changed files with 384 additions and 11 deletions

View File

@@ -1364,6 +1364,30 @@ if(TARGET pano_cli)
LABELS "app;paint;integration;desktop-fast;fuzz"
WILL_FAIL TRUE)
add_test(NAME pano_cli_plan_brush_refresh_smoke
COMMAND pano_cli plan-brush-refresh --floating-picker --tip-flow 0.8 --tip-size 48 --r 0.2 --g 0.3 --b 0.4 --a 1)
set_tests_properties(pano_cli_plan_brush_refresh_smoke PROPERTIES
LABELS "app;paint;ui;integration;desktop-fast"
PASS_REGULAR_EXPRESSION "\"command\":\"plan-brush-refresh\".*\"updatesStrokeControls\":true.*\"updatesQuickFlow\":true.*\"updatesQuickSize\":true.*\"updatesQuickBrushPreview\":true.*\"updatesQuickColor\":true.*\"updatesFloatingPicker\":true.*\"updatesFloatingColorPanel\":false.*\"tipFlow\":0.8.*\"tipSize\":48.*\"r\":0.2.*\"g\":0.3.*\"b\":0.4.*\"a\":1")
add_test(NAME pano_cli_plan_brush_refresh_noop_smoke
COMMAND pano_cli plan-brush-refresh --no-color --no-brush-update --no-brush)
set_tests_properties(pano_cli_plan_brush_refresh_noop_smoke PROPERTIES
LABELS "app;paint;ui;integration;desktop-fast"
PASS_REGULAR_EXPRESSION "\"command\":\"plan-brush-refresh\".*\"updatesQuickBrushPreview\":false.*\"updatesQuickColor\":false.*\"noOp\":true")
add_test(NAME pano_cli_plan_brush_refresh_rejects_missing_brush
COMMAND pano_cli plan-brush-refresh --no-brush)
set_tests_properties(pano_cli_plan_brush_refresh_rejects_missing_brush PROPERTIES
LABELS "app;paint;ui;integration;desktop-fast;fuzz"
WILL_FAIL TRUE)
add_test(NAME pano_cli_plan_brush_refresh_rejects_bad_float
COMMAND pano_cli plan-brush-refresh --bad-float)
set_tests_properties(pano_cli_plan_brush_refresh_rejects_bad_float PROPERTIES
LABELS "app;paint;ui;integration;desktop-fast;fuzz"
WILL_FAIL TRUE)
add_test(NAME pano_cli_plan_brush_texture_list_add_smoke
COMMAND pano_cli plan-brush-texture-list --kind add --dir brushes --data-path data --source C:/Temp/soft.png)
set_tests_properties(pano_cli_plan_brush_texture_list_add_smoke PROPERTIES

View File

@@ -358,6 +358,98 @@ void stroke_settings_plan_updates_brush_preview(pp::tests::Harness& harness)
PP_EXPECT(harness, !plan.loads_brush_resources);
}
void brush_ui_refresh_projects_requested_surfaces(pp::tests::Harness& harness)
{
const auto view = pp::app::plan_brush_ui_refresh(pp::app::BrushUiRefreshInput {
.update_color = true,
.update_brush = true,
.has_current_brush = true,
.has_floating_picker = true,
.has_floating_color_panel = false,
.tip_flow = 0.9F,
.tip_size = 64.0F,
.r = 0.25F,
.g = 0.5F,
.b = 0.75F,
.a = 1.0F,
});
PP_EXPECT(harness, view);
if (view) {
PP_EXPECT(harness, view.value().updates_stroke_controls);
PP_EXPECT(harness, view.value().updates_quick_flow);
PP_EXPECT(harness, view.value().updates_quick_size);
PP_EXPECT(harness, view.value().updates_quick_brush_preview);
PP_EXPECT(harness, view.value().updates_quick_color);
PP_EXPECT(harness, view.value().updates_floating_picker);
PP_EXPECT(harness, !view.value().updates_floating_color_panel);
PP_EXPECT(harness, !view.value().no_op);
PP_EXPECT(harness, view.value().tip_flow == 0.9F);
PP_EXPECT(harness, view.value().tip_size == 64.0F);
PP_EXPECT(harness, view.value().r == 0.25F);
PP_EXPECT(harness, view.value().g == 0.5F);
PP_EXPECT(harness, view.value().b == 0.75F);
PP_EXPECT(harness, view.value().a == 1.0F);
}
const auto color_only = pp::app::plan_brush_ui_refresh(pp::app::BrushUiRefreshInput {
.update_color = true,
.update_brush = false,
.has_current_brush = true,
.has_floating_picker = false,
.has_floating_color_panel = true,
.r = 0.1F,
.g = 0.2F,
.b = 0.3F,
.a = 1.0F,
});
PP_EXPECT(harness, color_only);
if (color_only) {
PP_EXPECT(harness, !color_only.value().updates_stroke_controls);
PP_EXPECT(harness, !color_only.value().updates_quick_flow);
PP_EXPECT(harness, color_only.value().updates_quick_color);
PP_EXPECT(harness, !color_only.value().updates_floating_picker);
PP_EXPECT(harness, color_only.value().updates_floating_color_panel);
}
const auto no_op = pp::app::plan_brush_ui_refresh(pp::app::BrushUiRefreshInput {
.update_color = false,
.update_brush = false,
.has_current_brush = false,
});
PP_EXPECT(harness, no_op);
if (no_op) {
PP_EXPECT(harness, no_op.value().no_op);
PP_EXPECT(harness, !no_op.value().updates_quick_color);
PP_EXPECT(harness, !no_op.value().updates_quick_brush_preview);
}
}
void brush_ui_refresh_rejects_invalid_state(pp::tests::Harness& harness)
{
PP_EXPECT(harness, !pp::app::plan_brush_ui_refresh(pp::app::BrushUiRefreshInput {
.update_color = true,
.update_brush = false,
.has_current_brush = false,
}));
PP_EXPECT(harness, !pp::app::plan_brush_ui_refresh(pp::app::BrushUiRefreshInput {
.update_color = true,
.update_brush = false,
.has_current_brush = true,
.r = 1.25F,
.g = 0.0F,
.b = 0.0F,
.a = 1.0F,
}));
PP_EXPECT(harness, !pp::app::plan_brush_ui_refresh(pp::app::BrushUiRefreshInput {
.update_color = false,
.update_brush = true,
.has_current_brush = true,
.tip_flow = std::nanf(""),
.tip_size = 64.0F,
}));
}
void stroke_control_plans_validate_values_and_reject_breaking_points(pp::tests::Harness& harness)
{
const auto slider = pp::app::plan_brush_stroke_float_setting(
@@ -920,6 +1012,8 @@ int main()
harness.run("texture plan validates path and slot", texture_plan_validates_path_and_slot);
harness.run("preset plan preserves color and requires brush", preset_plan_preserves_color_and_requires_brush);
harness.run("stroke settings plan updates brush preview", stroke_settings_plan_updates_brush_preview);
harness.run("brush UI refresh projects requested surfaces", brush_ui_refresh_projects_requested_surfaces);
harness.run("brush UI refresh rejects invalid state", brush_ui_refresh_rejects_invalid_state);
harness.run("stroke control plans validate values and reject breaking points", stroke_control_plans_validate_values_and_reject_breaking_points);
harness.run("stroke panel view projects brush state", stroke_panel_view_projects_brush_state);
harness.run("stroke panel view rejects invalid brush state", stroke_panel_view_rejects_invalid_brush_state);