diff --git a/data/layout.xml b/data/layout.xml index 42f3e56..8695b3c 100644 --- a/data/layout.xml +++ b/data/layout.xml @@ -1500,12 +1500,12 @@ Here's a list of what's available in this release. - + - + diff --git a/src/node.cpp b/src/node.cpp index a69fdf3..2ef2ad8 100644 --- a/src/node.cpp +++ b/src/node.cpp @@ -92,7 +92,7 @@ kEventResult Node::on_event(Event* e) { kEventResult ret = kEventResult::Available; - if (current_mouse_capture) + if (current_mouse_capture && current_mouse_capture != this) { if (e->m_cat == kEventCategory::MouseEvent && child_mouse_focus != current_mouse_capture && diff --git a/src/node_image.cpp b/src/node_image.cpp index 8289155..0c41871 100644 --- a/src/node_image.cpp +++ b/src/node_image.cpp @@ -100,7 +100,7 @@ void NodeImage::draw() ShaderManager::use(kShader::Texture); } ShaderManager::u_int(kShaderUniform::Tex, 0); - ShaderManager::u_mat4(kShaderUniform::MVP, m_mvp); + ShaderManager::u_mat4(kShaderUniform::MVP, m_mvp * glm::scale(glm::vec3(m_scale, 1.f))); m_plane.draw_fill(); sampler.unbind(); TextureManager::get(m_tex_id).unbind(); diff --git a/src/node_image.h b/src/node_image.h index e4bdeaa..3a32248 100644 --- a/src/node_image.h +++ b/src/node_image.h @@ -15,6 +15,7 @@ public: glm::vec4 m_region; glm::vec2 m_off; glm::vec2 m_sz; + glm::vec2 m_scale = { 1.f, 1.f }; std::string m_path; uint16_t m_tex_id; static void static_init(); diff --git a/src/node_panel_quick.cpp b/src/node_panel_quick.cpp index 3f2b3c5..29292ce 100644 --- a/src/node_panel_quick.cpp +++ b/src/node_panel_quick.cpp @@ -41,7 +41,8 @@ void NodePanelQuick::init_controls() m_slider_size = find("quick-size"); m_slider_size->on_value_changed = [this](Node* target, float value) { - auto newpos = (m_slider_flow->m_pos + glm::vec2(100.f, m_slider_flow->m_size.y / 2.f)) * App::I.zoom; + float off = m_slider_flow->m_pos.x > App::I.width / 2.f ? -100.f : 100.f; + auto newpos = (m_slider_flow->m_pos + glm::vec2(off, m_slider_flow->m_size.y / 2.f)) * App::I.zoom; if (auto m = dynamic_cast(Canvas::I->modes[(int)Canvas::I->m_current_mode][0])) { m->m_cur_pos = newpos; @@ -59,7 +60,8 @@ void NodePanelQuick::init_controls() }; m_slider_flow = find("quick-flow"); m_slider_flow->on_value_changed = [this](Node* target, float value) { - auto newpos = (m_slider_flow->m_pos + glm::vec2(100.f, m_slider_flow->m_size.y / 2.f)) * App::I.zoom; + float off = m_slider_flow->m_pos.x > App::I.width / 2.f ? -100.f : 100.f; + auto newpos = (m_slider_flow->m_pos + glm::vec2(off, m_slider_flow->m_size.y / 2.f)) * App::I.zoom; if (auto m = dynamic_cast(Canvas::I->modes[(int)Canvas::I->m_current_mode][0])) { m->m_cur_pos = newpos; @@ -131,34 +133,50 @@ void NodePanelQuick::handle_button_brush_click(Node* button) // if the box is already selected show the popup + auto popup = App::I.presets; auto screen = root()->m_size; - glm::vec2 pos = button->m_pos + glm::vec2(button->m_size.x, 0); - root()->add_child(App::I.presets); + glm::vec2 tick_sz = { 16, 32 }; + glm::vec2 tick_pos = button->m_pos + glm::vec2(button->m_size.x, 0); + glm::vec2 popup_pos = { tick_pos.x + tick_sz.x, tick_pos.y }; + auto tick = root()->add_child(); tick->SetPositioning(YGPositionTypeAbsolute); - tick->SetSize(16, 32); - tick->SetPosition(pos.x, pos.y + (button->m_size.y - 32) * 0.5f); + tick->SetPosition(tick_pos.x, tick_pos.y + (button->m_size.y - tick_sz.y) * 0.5f); + tick->SetSize(tick_sz); 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 - 90.f) : 400.f; - App::I.presets->SetHeight(glm::max(hh, 400.f)); - root()->update(); - if ((pos.y + App::I.presets->m_size.y) > screen.y) - pos.y = screen.y - App::I.presets->m_size.y; - if (pos.y < 0) - pos.y = 0; - App::I.presets->SetPosition(pos.x + 16, pos.y); - App::I.presets->SetPositioning(YGPositionTypeAbsolute); - App::I.presets->m_mouse_ignore = false; - App::I.presets->m_flood_events = true; - App::I.presets->m_capture_children = false; - App::I.presets->mouse_capture(); - root()->update(); + tick->m_scale = { 1, 1 }; - App::I.presets->on_popup_close = [this, tick](Node*) { + float hh = popup->m_container->m_children.size() > 10 ? (screen.y / App::I.zoom - 90.f) : 400.f; + popup->SetHeight(glm::max(hh, 400.f)); + popup->SetPositioning(YGPositionTypeAbsolute); + popup->SetPosition(popup_pos); + root()->add_child(popup); + + root()->update(); + popup->tick(0); + popup->update(); + + if (tick_pos.x + popup->m_size.x > screen.x) + { + tick_pos = button->m_pos - glm::vec2(tick_sz.x, 0); + popup_pos = { tick_pos.x - popup->GetWidth(), tick_pos.y }; + tick->m_scale.x = -1.f; + } + popup_pos = glm::clamp(popup_pos, { 0, 0 }, screen - popup->m_size); + popup->SetPosition(popup_pos); + tick->SetPosition(tick_pos.x, tick_pos.y + (button->m_size.y - tick_sz.y) * 0.5f); + popup->update(); + + popup->m_mouse_ignore = false; + popup->m_flood_events = true; + popup->m_capture_children = false; + popup->mouse_capture(); + + popup->on_popup_close = [this, tick](Node*) { tick->destroy(); }; - App::I.presets->on_brush_changed = [this, button](Node* target, std::shared_ptr& b) { + popup->on_brush_changed = [this, button](Node* target, std::shared_ptr& b) { auto pr = static_cast(button->m_children[0].get()); *pr->m_brush = *b; pr->m_brush->load(); @@ -184,26 +202,44 @@ void NodePanelQuick::handle_button_color_click(Node* target) } // if the box is already selected show the popup - + auto popup = m_picker; auto screen = root()->m_size; - glm::vec2 pos = target->m_pos + glm::vec2(target->m_size.x, 0); - root()->add_child(m_picker); + glm::vec2 tick_sz = { 16, 32 }; + glm::vec2 tick_pos = target->m_pos + glm::vec2(target->m_size.x, 0); + glm::vec2 popup_pos = { tick_pos.x + tick_sz.x, tick_pos.y - 140.f }; + auto tick = root()->add_child(); tick->SetPositioning(YGPositionTypeAbsolute); - tick->SetSize(16, 32); - tick->SetPosition(pos.x, pos.y + (target->m_size.y - 32) * 0.5f); + tick->SetPosition(tick_pos.x, tick_pos.y + (target->m_size.y - tick_sz.y) * 0.5f); + tick->SetSize(tick_sz); tick->set_image("data/ui/popup-tick.png"); - //float hh = m_picker->m_container->m_children.size() > 10 ? App::I.height / App::I.zoom * .75f : 400.f; - //m_picker->SetHeight(4); - root()->update(); - pos.y -= 130; - if ((pos.y + m_picker->m_size.y) > screen.y) - pos.y = screen.y - m_picker->m_size.y; - if (pos.y < 0) - pos.y = 0; - m_picker->SetPosition(pos.x + 16, pos.y); - m_picker->mouse_capture(); + tick->m_scale = { 1, 1 }; + + //float hh = popup->m_container->m_children.size() > 10 ? (screen.y / App::I.zoom - 90.f) : 400.f; + //popup->SetHeight(glm::max(hh, 400.f)); + popup->SetPositioning(YGPositionTypeAbsolute); + popup->SetPosition(popup_pos); + root()->add_child(popup); + root()->update(); + popup->tick(0); + popup->update(); + + if (tick_pos.x + popup->m_size.x > screen.x) + { + tick_pos = target->m_pos - glm::vec2(tick_sz.x, 0); + popup_pos = { tick_pos.x - popup->GetWidth(), tick_pos.y - 140.f }; + tick->m_scale.x = -1.f; + } + popup_pos = glm::clamp(popup_pos, { 0, 0 }, screen - popup->m_size); + popup->SetPosition(popup_pos); + tick->SetPosition(tick_pos.x, tick_pos.y + (target->m_size.y - tick_sz.y) * 0.5f); + popup->update(); + + popup->m_mouse_ignore = false; + popup->m_flood_events = true; + popup->m_capture_children = false; + popup->mouse_capture(); auto c = static_cast(target->m_children[0].get()); m_picker->set_color(c->m_color);