Route quick slider preview through app core

This commit is contained in:
2026-06-05 01:26:02 +02:00
parent 31c26c3127
commit e95861e9b7
9 changed files with 324 additions and 32 deletions

View File

@@ -2,6 +2,8 @@
#include "foundation/result.h"
#include <cmath>
namespace pp::app {
enum class QuickUiSlotKind {
@@ -35,6 +37,27 @@ struct QuickUiPlan {
bool mutates_quick_state = false;
};
struct QuickSliderPreviewInput {
bool ui_rtl = false;
float slider_x = 0.0F;
float slider_y = 0.0F;
float slider_height = 0.0F;
float zoom = 1.0F;
bool has_pen_mode = false;
bool has_line_mode = false;
};
struct QuickSliderPreviewPlan {
float cursor_x = 0.0F;
float cursor_y = 0.0F;
bool updates_pen_mode = false;
bool updates_line_mode = false;
bool draws_tip = false;
bool disables_pen_outline = false;
bool redraws_brush_preview = false;
bool invokes_change_callback = false;
};
class QuickUiServices {
public:
virtual ~QuickUiServices() = default;
@@ -45,6 +68,15 @@ public:
virtual void reset_state(bool fire_event) = 0;
};
[[nodiscard]] inline pp::foundation::Status validate_quick_slider_float(float value) noexcept
{
if (!std::isfinite(value)) {
return pp::foundation::Status::invalid_argument("quick slider preview value must be finite");
}
return pp::foundation::Status::success();
}
[[nodiscard]] inline pp::foundation::Status validate_quick_slot_count(int slot_count) noexcept
{
if (slot_count <= 0) {
@@ -68,6 +100,47 @@ public:
return pp::foundation::Status::success();
}
[[nodiscard]] inline pp::foundation::Result<QuickSliderPreviewPlan> plan_quick_slider_preview(
const QuickSliderPreviewInput& input)
{
const auto x_status = validate_quick_slider_float(input.slider_x);
if (!x_status.ok()) {
return pp::foundation::Result<QuickSliderPreviewPlan>::failure(x_status);
}
const auto y_status = validate_quick_slider_float(input.slider_y);
if (!y_status.ok()) {
return pp::foundation::Result<QuickSliderPreviewPlan>::failure(y_status);
}
const auto height_status = validate_quick_slider_float(input.slider_height);
if (!height_status.ok()) {
return pp::foundation::Result<QuickSliderPreviewPlan>::failure(height_status);
}
if (input.slider_height < 0.0F) {
return pp::foundation::Result<QuickSliderPreviewPlan>::failure(
pp::foundation::Status::invalid_argument("quick slider preview height must not be negative"));
}
const auto zoom_status = validate_quick_slider_float(input.zoom);
if (!zoom_status.ok()) {
return pp::foundation::Result<QuickSliderPreviewPlan>::failure(zoom_status);
}
if (input.zoom <= 0.0F) {
return pp::foundation::Result<QuickSliderPreviewPlan>::failure(
pp::foundation::Status::invalid_argument("quick slider preview zoom must be positive"));
}
const float offset = input.ui_rtl ? -100.0F : 100.0F;
QuickSliderPreviewPlan plan;
plan.cursor_x = (input.slider_x + offset) * input.zoom;
plan.cursor_y = (input.slider_y + input.slider_height * 0.5F) * input.zoom;
plan.updates_pen_mode = input.has_pen_mode;
plan.updates_line_mode = input.has_line_mode;
plan.draws_tip = input.has_pen_mode || input.has_line_mode;
plan.disables_pen_outline = input.has_pen_mode;
plan.redraws_brush_preview = true;
plan.invokes_change_callback = true;
return pp::foundation::Result<QuickSliderPreviewPlan>::success(plan);
}
[[nodiscard]] inline pp::foundation::Result<QuickUiPlan> plan_quick_slot_click(
QuickUiSlotKind slot_kind,
int current_index,