fix scroll node, improve animation panel

This commit is contained in:
2019-10-18 22:53:17 +02:00
parent 266573e9b4
commit 467e83b69e
8 changed files with 176 additions and 67 deletions

View File

@@ -4,14 +4,6 @@
#include "event.h"
#include "shader.h"
NodeScroll::NodeScroll()
{
m_drag_start = glm::vec2(0);
m_offset_start = glm::vec2(0);
m_offset = glm::vec2(0);
m_mask = glm::vec2(0, 1);
}
Node* NodeScroll::clone_instantiate() const
{
return new NodeScroll;
@@ -22,8 +14,15 @@ void NodeScroll::fix_scroll()
auto pad = GetPadding();
glm::vec2 padoff = { pad.y + pad.w, pad.x + pad.z };
auto rect = get_children_rect();
m_offset = glm::clamp(m_offset, - zw(rect) + zw(m_clip_uncut) - padoff, { 0, 0 });
m_pos_offset_childred = m_offset;
if (rect.w > 0 && rect.z > 0)
{
m_offset = glm::clamp(m_offset, -zw(rect) + zw(m_clip_uncut) - padoff, { 0, 0 });
m_pos_offset_childred = m_offset;
}
else
{
m_pos_offset_childred = m_offset = { 0, 0 };
}
}
void NodeScroll::clone_copy(Node* dest) const
@@ -31,6 +30,8 @@ void NodeScroll::clone_copy(Node* dest) const
NodeBorder::clone_copy(dest);
auto n = static_cast<NodeScroll*>(dest);
n->m_scrollbar_color = m_scrollbar_color;
n->m_mask = m_mask;
n->m_direction = m_direction;
}
void NodeScroll::parse_attributes(kAttribute ka, const tinyxml2::XMLAttribute* attr)
@@ -48,6 +49,18 @@ void NodeScroll::parse_attributes(kAttribute ka, const tinyxml2::XMLAttribute* a
m_scrollbar_color = col;
break;
}
case kAttribute::ScrollDir:
if (strcmpi(attr->Value(), "vertical") == 0 || strcmpi(attr->Value(), "v") == 0)
{
m_direction = kScrollDirection::Vertical;
m_mask = { 0, 1 };
}
else if (strcmpi(attr->Value(), "horizontal") == 0 || strcmpi(attr->Value(), "h") == 0)
{
m_direction = kScrollDirection::Horizontal;
m_mask = { 1, 0 };
}
break;
default:
break;
}
@@ -57,13 +70,33 @@ void NodeScroll::on_tick(float dt)
{
auto pad = GetPadding();
auto rect = get_children_rect();
// fix scrollbar
float sz = m_size.y - (pad[0] + pad[2]);
float new_pad = rect.w == 0 || rect.w <= sz + 2 ? 5 : 35;
if (pad[1] != new_pad)
if (rect.w > 0 && rect.z > 0)
{
YGNodeStyleSetPadding(y_node, YGEdgeRight, new_pad);
app_redraw();
// fix scrollbar
if (m_direction == kScrollDirection::Vertical)
{
float szv = m_size.y - (pad[0] + pad[2]);
float new_padv = rect.w == 0 || rect.w <= szv + 2 ? 5 : 35;
if (pad[1] != new_padv)
{
YGNodeStyleSetPadding(y_node, YGEdgeRight, new_padv);
app_redraw();
}
}
else
{
float szh = m_size.x - (pad[3] + pad[1]);
float new_padh = rect.z == 0 || rect.z <= szh + 2 ? 5 : 35;
if (pad[2] != new_padh)
{
YGNodeStyleSetPadding(y_node, YGEdgeBottom, new_padh);
app_redraw();
}
}
}
else
{
SetPadding(0, 0, 0, 0);
}
}
@@ -71,21 +104,42 @@ void NodeScroll::draw()
{
NodeBorder::draw();
fix_scroll();
glm::vec4 rect = get_children_rect();
glm::vec4 pad = GetPadding();
float sz = m_size.y - (pad[0] + pad[2]);
float h = glm::max(30.f, sz / rect.w * sz);
float offset_percent = m_offset.y / (rect.w - sz);
float pr = YGNodeLayoutGetPadding(y_node, YGEdgeRight) - 5;
glDisable(GL_BLEND);
ShaderManager::use(kShader::Color);
ShaderManager::u_mat4(kShaderUniform::MVP, m_proj
* glm::translate(glm::vec3(m_pos.x + m_size.x - pr, m_pos.y - offset_percent * (sz - h) + pad[0], 0))
* glm::scale(glm::vec3(pr, h, 1))
* glm::translate(glm::vec3(.5, .5, 0))
);
ShaderManager::u_vec4(kShaderUniform::Col, m_scrollbar_color);
m_plane.draw_fill();
if (rect.w > 0 && rect.z > 0)
{
glDisable(GL_BLEND);
ShaderManager::use(kShader::Color);
if (m_direction == kScrollDirection::Vertical)
{
float sz = m_size.y - (pad[0] + pad[2]);
float h = glm::max(30.f, sz / rect.w * sz);
float offset_percent = m_offset.y / (rect.w - sz);
float pr = YGNodeLayoutGetPadding(y_node, YGEdgeRight) - 5;
ShaderManager::u_mat4(kShaderUniform::MVP, m_proj
* glm::translate(glm::vec3(m_pos.x + m_size.x - pr, m_pos.y - offset_percent * (sz - h) + pad[0], 0))
* glm::scale(glm::vec3(pr, h, 1))
* glm::translate(glm::vec3(.5, .5, 0))
);
}
else
{
float sz = m_size.x - (pad[3] + pad[1]);
float h = glm::max(30.f, sz / rect.z * sz);
float offset_percent = m_offset.x / (rect.z - sz);
float pr = YGNodeLayoutGetPadding(y_node, YGEdgeBottom) - 5;
ShaderManager::u_mat4(kShaderUniform::MVP, m_proj
* glm::translate(glm::vec3(m_pos.x - offset_percent * (sz - h) + pad[3], m_pos.y + m_size.y - pr, 0))
* glm::scale(glm::vec3(h, pr, 1))
* glm::translate(glm::vec3(.5, .5, 0))
);
}
ShaderManager::u_vec4(kShaderUniform::Col, m_scrollbar_color);
m_plane.draw_fill();
}
}
kEventResult NodeScroll::handle_event(Event* e)
@@ -101,7 +155,10 @@ kEventResult NodeScroll::handle_event(Event* e)
m_drag_start = me->m_pos;
m_offset_start = m_offset;
// if click on the scroll area use scrolling direction, otherwise natural
m_scroll_dir = (me->m_pos.x - m_pos.x) > (m_size.x - YGNodeLayoutGetPadding(y_node, YGEdgeRight)) ? -1 : 1;
if (m_direction == kScrollDirection::Vertical)
m_drag_dir = (me->m_pos.x - m_pos.x) > (m_size.x - YGNodeLayoutGetPadding(y_node, YGEdgeRight)) ? -1 : 1;
else
m_drag_dir = (me->m_pos.y - m_pos.y) > (m_size.y - YGNodeLayoutGetPadding(y_node, YGEdgeBottom)) ? -1 : 1;
mouse_capture();
break;
case kEventType::MouseMove:
@@ -109,9 +166,20 @@ kEventResult NodeScroll::handle_event(Event* e)
{
glm::vec4 rect = get_children_rect();
glm::vec4 pad = GetPadding();
float speed = m_scroll_dir < 0 ? rect.w / (m_size.y - (pad[0] + pad[2])) : 1;
m_offset = m_offset_start + (me->m_pos - m_drag_start) * m_mask * m_scroll_dir * speed;
fix_scroll();
if (rect.w > 0 && rect.z > 0)
{
if (m_direction == kScrollDirection::Vertical)
{
float speed = m_drag_dir < 0 ? rect.w / (m_size.y - (pad[0] + pad[2])) : 1;
m_offset = m_offset_start + (me->m_pos - m_drag_start) * m_mask * m_drag_dir * speed;
}
else
{
float speed = m_drag_dir < 0 ? rect.z / (m_size.x - (pad[3] + pad[1])) : 1;
m_offset = m_offset_start + (me->m_pos - m_drag_start) * m_mask * m_drag_dir * speed;
}
fix_scroll();
}
}
break;
case kEventType::MouseUpL: