improve scrollbar detection and scroll behavior
This commit is contained in:
@@ -24,6 +24,35 @@ void NodeScroll::fix_scroll()
|
||||
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;
|
||||
|
||||
// fix scrollbar
|
||||
float sz = m_size.y - (pad[0] + pad[2]);
|
||||
if (rect.w == 0 || rect.w <= sz)
|
||||
{
|
||||
YGNodeStyleSetPadding(y_node, YGEdgeRight, 5);
|
||||
return;
|
||||
}
|
||||
YGNodeStyleSetPadding(y_node, YGEdgeRight, 35);
|
||||
}
|
||||
|
||||
void NodeScroll::loaded()
|
||||
{
|
||||
fix_scroll();
|
||||
}
|
||||
|
||||
void NodeScroll::added(Node* parent)
|
||||
{
|
||||
fix_scroll();
|
||||
}
|
||||
|
||||
void NodeScroll::on_child_added(Node* child)
|
||||
{
|
||||
fix_scroll();
|
||||
}
|
||||
|
||||
void NodeScroll::on_child_removed(Node* child)
|
||||
{
|
||||
fix_scroll();
|
||||
}
|
||||
|
||||
void NodeScroll::handle_resize(glm::vec2 old_size, glm::vec2 new_size)
|
||||
@@ -35,15 +64,10 @@ void NodeScroll::handle_resize(glm::vec2 old_size, glm::vec2 new_size)
|
||||
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]);
|
||||
if (rect.w == 0 || rect.w <= sz)
|
||||
{
|
||||
YGNodeStyleSetPadding(y_node, YGEdgeRight, 5);
|
||||
return;
|
||||
}
|
||||
YGNodeStyleSetPadding(y_node, YGEdgeRight, 35);
|
||||
float h = sz / rect.w * sz;
|
||||
float offset_percent = m_offset.y / (rect.w - sz);
|
||||
float pr = YGNodeLayoutGetPadding(y_node, YGEdgeRight) - 5;
|
||||
@@ -71,7 +95,7 @@ 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_size.x - YGNodeLayoutGetPadding(y_node, YGEdgeRight) + 5) ? -1 : 1;
|
||||
m_scroll_dir = (me->m_pos.x - m_pos.x) > (m_size.x - YGNodeLayoutGetPadding(y_node, YGEdgeRight)) ? -1 : 1;
|
||||
mouse_capture();
|
||||
break;
|
||||
case kEventType::MouseMove:
|
||||
@@ -79,7 +103,7 @@ kEventResult NodeScroll::handle_event(Event* e)
|
||||
{
|
||||
glm::vec4 rect = get_children_rect();
|
||||
glm::vec4 pad = GetPadding();
|
||||
float speed = rect.w / (m_size.y - (pad[0] + pad[2]));
|
||||
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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user