#include "pch.h" #include "log.h" #include "node_scroll.h" #include "event.h" Node* NodeScroll::clone_instantiate() const { return new NodeScroll; } 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; } kEventResult NodeScroll::handle_event(Event* e) { NodeBorder::handle_event(e); auto me = static_cast(e); auto ge = static_cast(e); auto loc = (me->m_pos - m_pos) * root()->m_zoom; switch (e->m_type) { case kEventType::MouseDownL: m_dragging = true; m_drag_start = me->m_pos; m_offset_start = m_offset; mouse_capture(); break; case kEventType::MouseMove: if (m_dragging) { m_offset = m_offset_start + (me->m_pos - m_drag_start) * m_mask; fix_scroll(); } break; case kEventType::MouseUpL: mouse_release(); m_dragging = false; break; case kEventType::MouseScroll: m_offset += me->m_scroll_delta * 50; fix_scroll(); break; case kEventType::GestureStart: m_offset_start = m_offset; mouse_capture(); break; case kEventType::GestureMove: m_offset = m_offset_start + ge->m_pos_delta * m_mask; fix_scroll(); break; case kEventType::GestureEnd: mouse_release(); break; case kEventType::MouseCancel: mouse_release(); m_dragging = false; break; default: return kEventResult::Available; break; } return kEventResult::Consumed; }