Add brush UI service boundary
This commit is contained in:
@@ -37,6 +37,16 @@ struct BrushUiPlan {
|
||||
bool update_brush_ui = false;
|
||||
};
|
||||
|
||||
class BrushUiServices {
|
||||
public:
|
||||
virtual ~BrushUiServices() = default;
|
||||
|
||||
virtual void set_tip_color(float r, float g, float b, float a) = 0;
|
||||
virtual void set_texture(BrushUiTextureSlot slot, std::string_view path, std::string_view thumbnail_path) = 0;
|
||||
virtual void replace_brush_from_preset(bool preserve_existing_color, bool load_resources) = 0;
|
||||
virtual void refresh_brush_ui(bool update_color_ui, bool update_brush_ui) = 0;
|
||||
};
|
||||
|
||||
[[nodiscard]] inline pp::foundation::Status validate_brush_ui_color_channel(float value) noexcept
|
||||
{
|
||||
if (!std::isfinite(value) || value < 0.0F || value > 1.0F) {
|
||||
@@ -119,4 +129,43 @@ struct BrushUiPlan {
|
||||
return plan;
|
||||
}
|
||||
|
||||
[[nodiscard]] inline pp::foundation::Status execute_brush_ui_plan(
|
||||
const BrushUiPlan& plan,
|
||||
BrushUiServices& services)
|
||||
{
|
||||
switch (plan.operation) {
|
||||
case BrushUiOperation::set_tip_color:
|
||||
{
|
||||
for (const auto value : { plan.r, plan.g, plan.b, plan.a }) {
|
||||
const auto channel_status = validate_brush_ui_color_channel(value);
|
||||
if (!channel_status.ok()) {
|
||||
return channel_status;
|
||||
}
|
||||
}
|
||||
services.set_tip_color(plan.r, plan.g, plan.b, plan.a);
|
||||
services.refresh_brush_ui(plan.update_color_ui, plan.update_brush_ui);
|
||||
return pp::foundation::Status::success();
|
||||
}
|
||||
|
||||
case BrushUiOperation::set_texture:
|
||||
if (plan.path.empty()) {
|
||||
return pp::foundation::Status::invalid_argument("brush texture path must not be empty");
|
||||
}
|
||||
services.set_texture(plan.texture_slot, plan.path, plan.thumbnail_path);
|
||||
services.refresh_brush_ui(plan.update_color_ui, plan.update_brush_ui);
|
||||
return pp::foundation::Status::success();
|
||||
|
||||
case BrushUiOperation::replace_brush_from_preset:
|
||||
services.replace_brush_from_preset(plan.preserves_existing_color, plan.loads_brush_resources);
|
||||
services.refresh_brush_ui(plan.update_color_ui, plan.update_brush_ui);
|
||||
return pp::foundation::Status::success();
|
||||
|
||||
case BrushUiOperation::stroke_settings_changed:
|
||||
services.refresh_brush_ui(plan.update_color_ui, plan.update_brush_ui);
|
||||
return pp::foundation::Status::success();
|
||||
}
|
||||
|
||||
return pp::foundation::Status::invalid_argument("unknown brush UI operation");
|
||||
}
|
||||
|
||||
} // namespace pp::app
|
||||
|
||||
Reference in New Issue
Block a user