Route canvas input policy through platform services

This commit is contained in:
2026-06-04 18:26:21 +02:00
parent e52fd3cbb5
commit 4bd29bee9f
10 changed files with 122 additions and 26 deletions

View File

@@ -192,6 +192,8 @@ public:
[[nodiscard]] bool uses_ppbr_export_data_directory_override() const;
[[nodiscard]] bool platform_supports_sonarpen() const;
void start_platform_sonarpen();
[[nodiscard]] bool draws_canvas_tip_for_input(kEventSource source, kEventType type) const;
[[nodiscard]] float adjust_canvas_input_pressure(float pressure) const;
void pick_dir(std::function<void(std::string path)> callback);
void display_file(std::string path);
void share_file(std::string path);

View File

@@ -211,6 +211,19 @@ void App::start_platform_sonarpen()
active_platform_services().start_sonarpen();
}
bool App::draws_canvas_tip_for_input(kEventSource source, kEventType type) const
{
return active_platform_services().draws_canvas_tip_for_pointer(
source == kEventSource::Mouse,
source == kEventSource::Stylus,
type == kEventType::MouseUpL);
}
float App::adjust_canvas_input_pressure(float pressure) const
{
return active_platform_services().adjust_canvas_input_pressure(pressure);
}
void App::pick_dir(std::function<void(std::string path)> callback)
{
redraw = true;

View File

@@ -140,21 +140,13 @@ void CanvasModePen::on_GestureEvent(GestureEvent* ge)
void CanvasModePen::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
{
#if defined(__IOS__)
m_draw_tip = (me->m_source == kEventSource::Mouse && me->m_type != kEventType::MouseUpL);
#else
m_draw_tip = (me->m_source == kEventSource::Mouse || me->m_source == kEventSource::Stylus);
#endif
m_draw_tip = App::I->draws_canvas_tip_for_input(me->m_source, me->m_type);
m_draw_outline = true;
if (Canvas::I->m_touch_lock && me->m_source == kEventSource::Touch)
return;
#if _WIN32
// curve https://www.wolframalpha.com/input/?i=plot+(1-(x-1)%5E2)%5E2+from+x%3D0+to+1
auto curve = [](float x, float max) { return x > max ? 1.f : glm::pow(1.f - glm::pow(x / max - 1.f, 2.f), 2.f); };
me->m_pressure = curve(me->m_pressure, 0.95f);
#endif
me->m_pressure = App::I->adjust_canvas_input_pressure(me->m_pressure);
switch (me->m_type)
{
@@ -344,11 +336,7 @@ void CanvasModePen::enter(kCanvasMode prev)
void CanvasModeLine::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
{
#if defined(__IOS__)
m_draw_tip = (me->m_source == kEventSource::Mouse && me->m_type != kEventType::MouseUpL);
#else
m_draw_tip = (me->m_source == kEventSource::Mouse || me->m_source == kEventSource::Stylus);
#endif
m_draw_tip = App::I->draws_canvas_tip_for_input(me->m_source, me->m_type);
if (Canvas::I->m_touch_lock && me->m_source == kEventSource::Touch)
return;
switch (me->m_type)
@@ -1636,11 +1624,7 @@ void CanvasModeTransform::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
void CanvasModeFloodFill::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
{
#if defined(__IOS__)
m_draw_tip = (me->m_source == kEventSource::Mouse && me->m_type != kEventType::MouseUpL);
#else
m_draw_tip = (me->m_source == kEventSource::Mouse || me->m_source == kEventSource::Stylus);
#endif
m_draw_tip = App::I->draws_canvas_tip_for_input(me->m_source, me->m_type);
if (Canvas::I->m_touch_lock && me->m_source == kEventSource::Touch)
return;

View File

@@ -71,6 +71,11 @@ public:
[[nodiscard]] virtual bool uses_ppbr_export_data_directory_override() = 0;
[[nodiscard]] virtual bool supports_sonarpen() = 0;
virtual void start_sonarpen() = 0;
[[nodiscard]] virtual bool draws_canvas_tip_for_pointer(
bool is_mouse,
bool is_stylus,
bool is_left_button_release) = 0;
[[nodiscard]] virtual float adjust_canvas_input_pressure(float pressure) = 0;
[[nodiscard]] virtual PreparedFileTarget prepare_writable_file(
std::string_view type,
std::string_view default_name,

View File

@@ -499,6 +499,25 @@ public:
#endif
}
[[nodiscard]] bool draws_canvas_tip_for_pointer(
bool is_mouse,
bool is_stylus,
bool is_left_button_release) override
{
#if defined(__IOS__)
(void)is_stylus;
return is_mouse && !is_left_button_release;
#else
(void)is_left_button_release;
return is_mouse || is_stylus;
#endif
}
[[nodiscard]] float adjust_canvas_input_pressure(float pressure) override
{
return pressure;
}
[[nodiscard]] pp::platform::PreparedFileTarget prepare_writable_file(
std::string_view type,
std::string_view default_name,

View File

@@ -496,6 +496,23 @@ public:
{
}
[[nodiscard]] bool draws_canvas_tip_for_pointer(
bool is_mouse,
bool is_stylus,
bool is_left_button_release) override
{
(void)is_left_button_release;
return is_mouse || is_stylus;
}
[[nodiscard]] float adjust_canvas_input_pressure(float pressure) override
{
const auto curve = [](float x, float max) {
return x > max ? 1.f : glm::pow(1.f - glm::pow(x / max - 1.f, 2.f), 2.f);
};
return curve(pressure, 0.95f);
}
[[nodiscard]] pp::platform::PreparedFileTarget prepare_writable_file(
std::string_view type,
std::string_view default_name,