Route stroke panel view through app core

This commit is contained in:
2026-06-05 01:01:56 +02:00
parent 75fd7faeb0
commit d5403f082c
8 changed files with 556 additions and 80 deletions

View File

@@ -4,6 +4,7 @@
#include <cmath>
#include <string>
#include <string_view>
#include <utility>
namespace {
@@ -409,6 +410,74 @@ void stroke_control_plans_validate_values_and_reject_breaking_points(pp::tests::
PP_EXPECT(harness, !pp::app::plan_brush_stroke_blend_mode(pp::app::BrushStrokeBlendSetting::pattern, 64));
}
void stroke_panel_view_projects_brush_state(pp::tests::Harness& harness)
{
pp::app::BrushStrokePanelInput input;
input.float_values.push_back(pp::app::BrushStrokeFloatValue {
.setting = pp::app::BrushStrokeFloatSetting::tip_size,
.value = 42.5F,
});
input.float_values.push_back(pp::app::BrushStrokeFloatValue {
.setting = pp::app::BrushStrokeFloatSetting::jitter_scatter,
.value = 0.75F,
});
input.bool_values.push_back(pp::app::BrushStrokeBoolValue {
.setting = pp::app::BrushStrokeBoolSetting::dual_enabled,
.value = true,
});
input.bool_values.push_back(pp::app::BrushStrokeBoolValue {
.setting = pp::app::BrushStrokeBoolSetting::pattern_random_offset,
.value = false,
});
input.blend_values.push_back(pp::app::BrushStrokeBlendValue {
.setting = pp::app::BrushStrokeBlendSetting::tip,
.blend_mode = 4,
});
input.blend_values.push_back(pp::app::BrushStrokeBlendValue {
.setting = pp::app::BrushStrokeBlendSetting::pattern,
.blend_mode = 8,
});
input.tip_thumbnail_path = "data/brushes/thumbs/soft.png";
input.dual_thumbnail_path = "data/brushes/thumbs/hard.png";
input.pattern_thumbnail_path = "data/patterns/thumbs/noise.png";
const auto view = pp::app::plan_brush_stroke_panel_view(std::move(input));
PP_EXPECT(harness, view);
if (view) {
PP_EXPECT(harness, view.value().float_values.size() == 2);
PP_EXPECT(harness, view.value().bool_values.size() == 2);
PP_EXPECT(harness, view.value().blend_values.size() == 2);
PP_EXPECT(harness, view.value().float_values[0].setting == pp::app::BrushStrokeFloatSetting::tip_size);
PP_EXPECT(harness, view.value().float_values[0].value == 42.5F);
PP_EXPECT(harness, view.value().bool_values[0].setting == pp::app::BrushStrokeBoolSetting::dual_enabled);
PP_EXPECT(harness, view.value().bool_values[0].value);
PP_EXPECT(harness, view.value().blend_values[1].setting == pp::app::BrushStrokeBlendSetting::pattern);
PP_EXPECT(harness, view.value().blend_values[1].blend_mode == 8);
PP_EXPECT(harness, view.value().tip_thumbnail_path == "data/brushes/thumbs/soft.png");
PP_EXPECT(harness, view.value().dual_thumbnail_path == "data/brushes/thumbs/hard.png");
PP_EXPECT(harness, view.value().pattern_thumbnail_path == "data/patterns/thumbs/noise.png");
PP_EXPECT(harness, view.value().updates_preview);
PP_EXPECT(harness, view.value().updates_thumbnails);
}
}
void stroke_panel_view_rejects_invalid_brush_state(pp::tests::Harness& harness)
{
pp::app::BrushStrokePanelInput bad_float;
bad_float.float_values.push_back(pp::app::BrushStrokeFloatValue {
.setting = pp::app::BrushStrokeFloatSetting::tip_flow,
.value = std::nanf(""),
});
PP_EXPECT(harness, !pp::app::plan_brush_stroke_panel_view(std::move(bad_float)));
pp::app::BrushStrokePanelInput bad_blend;
bad_blend.blend_values.push_back(pp::app::BrushStrokeBlendValue {
.setting = pp::app::BrushStrokeBlendSetting::dual,
.blend_mode = 64,
});
PP_EXPECT(harness, !pp::app::plan_brush_stroke_panel_view(std::move(bad_blend)));
}
void texture_list_add_plans_target_paths_and_rejects_bad_input(pp::tests::Harness& harness)
{
const auto plan = pp::app::plan_brush_texture_list_add(
@@ -852,6 +921,8 @@ int main()
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("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);
harness.run("texture list add plans target paths and rejects bad input", texture_list_add_plans_target_paths_and_rejects_bad_input);
harness.run("texture list remove and move plans handle edges", texture_list_remove_and_move_plans_handle_edges);
harness.run("preset list plans add select move remove and clear", preset_list_plans_add_select_move_remove_and_clear);