70 lines
1.8 KiB
C++
70 lines
1.8 KiB
C++
#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<MouseEvent*>(e);
|
|
auto ge = static_cast<GestureEvent*>(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;
|
|
}
|