From b26a814208ccc3a8d1104d97c6ffd392e983b93d Mon Sep 17 00:00:00 2001 From: omigamedev Date: Thu, 21 Nov 2019 10:22:48 +0100 Subject: [PATCH] add cursor visibility mode --- data/layout.xml | 6 +++++- src/app_layout.cpp | 12 ++++++++++++ src/canvas.h | 4 ++++ src/canvas_modes.cpp | 8 +++++--- src/canvas_modes.h | 3 ++- src/node_canvas.cpp | 35 +++++++++++++++++++++++++++++------ src/node_canvas.h | 3 +++ src/node_panel_stroke.cpp | 1 + 8 files changed, 61 insertions(+), 11 deletions(-) diff --git a/data/layout.xml b/data/layout.xml index 2c99fd5..c312562 100644 --- a/data/layout.xml +++ b/data/layout.xml @@ -249,7 +249,7 @@ - + @@ -270,6 +270,10 @@ + + + + diff --git a/src/app_layout.cpp b/src/app_layout.cpp index 16f149d..9055ca1 100644 --- a/src/app_layout.cpp +++ b/src/app_layout.cpp @@ -1016,6 +1016,18 @@ void App::init_menu_tools() Settings::save(); }; } + + if (auto mode = popup_time->find("tools-show-cursor")) + { + mode->set_index(Settings::value_or("show-cursor", 0)); + + mode->on_select = [mode](Node* target, int index) + { + App::I->canvas->set_cursor_visibility((NodeCanvas::kCursorVisibility)index); + Settings::set("show-cursor", Serializer::Integer(index)); + Settings::save(); + }; + } }; popup_exp->find("clear-grids")->on_click = [this, popup_exp](Node*) { diff --git a/src/canvas.h b/src/canvas.h index 9a913cf..251fb41 100644 --- a/src/canvas.h +++ b/src/canvas.h @@ -175,6 +175,10 @@ public: if (I->on_mode_changed) I->on_mode_changed(prev, mode); } + template static T* get_mode(int index = 0) + { + return dynamic_cast(modes[(int)I->m_current_mode][index]); + } std::vector m_layers_snapshot; diff --git a/src/canvas_modes.cpp b/src/canvas_modes.cpp index 63cfeb2..65ccc4d 100644 --- a/src/canvas_modes.cpp +++ b/src/canvas_modes.cpp @@ -159,9 +159,10 @@ void CanvasModePen::on_MouseEvent(MouseEvent* me, glm::vec2& loc) else { App::I->render_task_async([loc, pr = me->m_pressure] - { - Canvas::I->stroke_start({ loc, 0 }, pr); - }); + { + Canvas::I->stroke_start({ loc, 0 }, pr); + }); + m_drawing = true; } m_dragging = true; node->mouse_capture(); @@ -184,6 +185,7 @@ void CanvasModePen::on_MouseEvent(MouseEvent* me, glm::vec2& loc) App::I->brush_update(true, false); Canvas::I->pick_end(); } + m_drawing = false; m_dragging = false; m_picking = false; break; diff --git a/src/canvas_modes.h b/src/canvas_modes.h index b936ab6..dcde6ae 100644 --- a/src/canvas_modes.h +++ b/src/canvas_modes.h @@ -82,7 +82,6 @@ class CanvasModePen : public CanvasMode float m_zoom_canvas = 1.f; float m_zoom_start; // resizing the tip - bool m_resizing = false; public: CanvasModePen() { hide_curor = true; m_picking = false; } @@ -91,7 +90,9 @@ public: virtual void on_Draw(const glm::mat4& ortho, const glm::mat4& proj, const glm::mat4& camera) override; virtual void enter(kCanvasMode prev) override; virtual void leave(kCanvasMode next) override; + bool m_resizing = false; bool m_picking = false; + bool m_drawing = false; glm::vec2 m_cur_pos; bool m_draw_outline = true; }; diff --git a/src/node_canvas.cpp b/src/node_canvas.cpp index 8a92ed3..b6cb81b 100644 --- a/src/node_canvas.cpp +++ b/src/node_canvas.cpp @@ -13,6 +13,7 @@ Node* NodeCanvas::clone_instantiate() const void NodeCanvas::init() { m_density = Settings::value_or("vp-scale", 1.f); + m_cursor_visibility = (kCursorVisibility)Settings::value_or("show-cursor", 0); m_mouse_ignore = false; m_canvas = std::make_unique(); @@ -561,6 +562,7 @@ kEventResult NodeCanvas::handle_event(Event* e) case kEventType::MouseUpR: case kEventType::MouseCancel: m_canvas->m_cur_pos = loc; + update_cursor(); for (auto& mode : *m_canvas->m_mode) mode->on_MouseEvent(me, loc); break; @@ -569,9 +571,7 @@ kEventResult NodeCanvas::handle_event(Event* e) App::I->show_cursor(); break; case kEventType::MouseFocus: - (*m_canvas->m_mode)[0]->hide_curor && - !App::I->keys[(int)kKey::KeyAlt] ? - App::I->hide_cursor() : App::I->show_cursor(); + update_cursor(); break; case kEventType::KeyDown: if (ke->m_key == kKey::KeyE) @@ -585,9 +585,7 @@ kEventResult NodeCanvas::handle_event(Event* e) mode->on_KeyEvent(ke); break; case kEventType::KeyUp: - if (ke->m_key == kKey::KeyAlt && m_mouse_focus) - (*m_canvas->m_mode)[0]->hide_curor ? - App::I->hide_cursor() : App::I->show_cursor(); + update_cursor(); if (ke->m_key == kKey::KeyE) Canvas::set_mode(kCanvasMode::Draw); if (ke->m_key == kKey::KeyTab) @@ -668,6 +666,31 @@ void NodeCanvas::set_density(float d) create_buffers(); } +void NodeCanvas::set_cursor_visibility(kCursorVisibility mode) +{ + m_cursor_visibility = mode; +} + +void NodeCanvas::update_cursor() +{ + bool visible = true; + 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 && + m_canvas->m_current_mode == kCanvasMode::Draw || + m_canvas->m_current_mode == kCanvasMode::Erase) + { + visible = !m_canvas->get_mode()->m_drawing || + m_canvas->get_mode()->m_resizing || + m_canvas->get_mode()->m_picking; + } + visible ? App::I->show_cursor() : App::I->hide_cursor(); +} + void NodeCanvas::on_tick(float dt) { m_outline_pan = glm::fract(m_outline_pan + dt * 0.01f); diff --git a/src/node_canvas.h b/src/node_canvas.h index a067e40..26d06e8 100644 --- a/src/node_canvas.h +++ b/src/node_canvas.h @@ -5,6 +5,7 @@ class NodeCanvas : public Node { public: + enum class kCursorVisibility { Never, SmallBrush, NotPainting, Always } m_cursor_visibility; std::unique_ptr m_canvas; RTT m_blender_rtt; RTT m_cache_rtt; @@ -32,4 +33,6 @@ public: void reset_camera(); void create_buffers(); void set_density(float d); + void set_cursor_visibility(kCursorVisibility mode); + void update_cursor(); }; diff --git a/src/node_panel_stroke.cpp b/src/node_panel_stroke.cpp index e06ec3d..1876df0 100644 --- a/src/node_panel_stroke.cpp +++ b/src/node_panel_stroke.cpp @@ -183,6 +183,7 @@ void NodePanelStroke::init_controls() tick->set_image("data/ui/popup-tick.png"); float hh = App::I->presets->m_container->m_children.size() > 10 ? App::I->height / App::I->zoom * .75f : 400.f; App::I->presets->SetHeight(glm::max(hh, 400.f)); + App::I->presets->SetWidth(300); root()->update(); if ((pos.y + App::I->presets->m_size.y) > screen.y) pos.y = screen.y - App::I->presets->m_size.y;