Route canvas cursor visibility through app core

This commit is contained in:
2026-06-05 01:39:36 +02:00
parent e95861e9b7
commit f42a6540be
8 changed files with 447 additions and 23 deletions

View File

@@ -258,6 +258,54 @@ pp::app::CanvasHotkeyKey canvas_hotkey_key(kKey key) noexcept
}
}
pp::app::CanvasToolMode canvas_tool_mode(kCanvasMode mode) noexcept
{
switch (mode) {
case kCanvasMode::Draw:
return pp::app::CanvasToolMode::draw;
case kCanvasMode::Erase:
return pp::app::CanvasToolMode::erase;
case kCanvasMode::Line:
return pp::app::CanvasToolMode::line;
case kCanvasMode::Camera:
return pp::app::CanvasToolMode::camera;
case kCanvasMode::Grid:
return pp::app::CanvasToolMode::grid;
case kCanvasMode::Copy:
return pp::app::CanvasToolMode::copy;
case kCanvasMode::Cut:
return pp::app::CanvasToolMode::cut;
case kCanvasMode::Fill:
return pp::app::CanvasToolMode::fill;
case kCanvasMode::MaskFree:
return pp::app::CanvasToolMode::mask_free;
case kCanvasMode::MaskLine:
return pp::app::CanvasToolMode::mask_line;
case kCanvasMode::FloodFill:
return pp::app::CanvasToolMode::flood_fill;
case kCanvasMode::COUNT:
return pp::app::CanvasToolMode::draw;
}
return pp::app::CanvasToolMode::draw;
}
pp::app::CanvasCursorVisibilityMode canvas_cursor_visibility_mode(NodeCanvas::kCursorVisibility mode) noexcept
{
switch (mode) {
case NodeCanvas::kCursorVisibility::Never:
return pp::app::CanvasCursorVisibilityMode::never;
case NodeCanvas::kCursorVisibility::SmallBrush:
return pp::app::CanvasCursorVisibilityMode::small_brush;
case NodeCanvas::kCursorVisibility::NotPainting:
return pp::app::CanvasCursorVisibilityMode::not_painting;
case NodeCanvas::kCursorVisibility::Always:
return pp::app::CanvasCursorVisibilityMode::always;
}
return pp::app::CanvasCursorVisibilityMode::never;
}
pp::app::CanvasHotkeyState canvas_hotkey_state(bool mouse_focused, int touch_finger_count = 0) noexcept
{
pp::app::CanvasHotkeyState state;
@@ -961,24 +1009,24 @@ void NodeCanvas::set_cursor_visibility(kCursorVisibility mode)
void NodeCanvas::update_cursor()
{
bool visible = true;
if (m_canvas->m_current_mode == kCanvasMode::Draw ||
m_canvas->m_current_mode == kCanvasMode::Erase)
{
if (m_cursor_visibility == kCursorVisibility::Always)
visible = true;
if (m_cursor_visibility == kCursorVisibility::Never)
visible = false;
if (m_cursor_visibility == kCursorVisibility::SmallBrush)
visible = m_canvas->m_current_brush->m_tip_size < 10;
if (m_cursor_visibility == kCursorVisibility::NotPainting)
visible = !m_canvas->get_mode<CanvasModePen>()->m_drawing;
if (App::I->keys[(int)kKey::KeyAlt] ||
m_canvas->get_mode<CanvasModePen>()->m_resizing ||
m_canvas->get_mode<CanvasModePen>()->m_picking)
visible = true;
auto* pen_mode = m_canvas->get_mode<CanvasModePen>();
const auto plan = pp::app::plan_canvas_cursor_visibility(pp::app::CanvasCursorVisibilityInput {
.mode = canvas_tool_mode(m_canvas->m_current_mode),
.visibility_mode = canvas_cursor_visibility_mode(m_cursor_visibility),
.has_current_brush = m_canvas->m_current_brush != nullptr,
.brush_tip_size = m_canvas->m_current_brush ? m_canvas->m_current_brush->m_tip_size : 0.0F,
.pen_is_drawing = pen_mode && pen_mode->m_drawing,
.alt_down = App::I && App::I->keys[(int)kKey::KeyAlt],
.pen_is_resizing = pen_mode && pen_mode->m_resizing,
.pen_is_picking = pen_mode && pen_mode->m_picking,
});
if (!plan) {
LOG("Canvas cursor visibility planning failed: %s", plan.status().message);
App::I->show_cursor();
return;
}
visible ? App::I->show_cursor() : App::I->hide_cursor();
plan.value().visible ? App::I->show_cursor() : App::I->hide_cursor();
}
void NodeCanvas::on_tick(float dt)