Route canvas input policy through platform services
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user