improve scrollbar detection and scroll behavior
This commit is contained in:
@@ -822,8 +822,6 @@ void App::initLayout()
|
|||||||
|
|
||||||
brush_update();
|
brush_update();
|
||||||
|
|
||||||
TextureManager::load("data/paper.jpg");
|
|
||||||
|
|
||||||
// hacky thing to make the toolbar buttons not steal events when moving cursor fast
|
// hacky thing to make the toolbar buttons not steal events when moving cursor fast
|
||||||
if (auto* toolbar = layout[main_id]->find<Node>("toolbar"))
|
if (auto* toolbar = layout[main_id]->find<Node>("toolbar"))
|
||||||
toolbar->m_flood_events = true;
|
toolbar->m_flood_events = true;
|
||||||
|
|||||||
@@ -241,6 +241,7 @@ void Node::add_child(Node* n)
|
|||||||
n->m_manager = m_manager;
|
n->m_manager = m_manager;
|
||||||
YGNodeInsertChild(y_node, n->y_node, YGNodeGetChildCount(y_node));
|
YGNodeInsertChild(y_node, n->y_node, YGNodeGetChildCount(y_node));
|
||||||
n->added(this);
|
n->added(this);
|
||||||
|
on_child_added(n);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Node::add_child(Node* n, int index)
|
void Node::add_child(Node* n, int index)
|
||||||
@@ -250,6 +251,7 @@ void Node::add_child(Node* n, int index)
|
|||||||
n->m_manager = m_manager;
|
n->m_manager = m_manager;
|
||||||
YGNodeInsertChild(y_node, n->y_node, index);
|
YGNodeInsertChild(y_node, n->y_node, index);
|
||||||
n->added(this);
|
n->added(this);
|
||||||
|
on_child_added(n);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Node::add_child(std::shared_ptr<Node> n)
|
void Node::add_child(std::shared_ptr<Node> n)
|
||||||
@@ -259,6 +261,7 @@ void Node::add_child(std::shared_ptr<Node> n)
|
|||||||
n->m_manager = m_manager;
|
n->m_manager = m_manager;
|
||||||
YGNodeInsertChild(y_node, n->y_node, YGNodeGetChildCount(y_node));
|
YGNodeInsertChild(y_node, n->y_node, YGNodeGetChildCount(y_node));
|
||||||
n->added(this);
|
n->added(this);
|
||||||
|
on_child_added(n.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Node::add_child(std::shared_ptr<Node> n, int index)
|
void Node::add_child(std::shared_ptr<Node> n, int index)
|
||||||
@@ -268,6 +271,7 @@ void Node::add_child(std::shared_ptr<Node> n, int index)
|
|||||||
n->m_manager = m_manager;
|
n->m_manager = m_manager;
|
||||||
YGNodeInsertChild(y_node, n->y_node, index);
|
YGNodeInsertChild(y_node, n->y_node, index);
|
||||||
n->added(this);
|
n->added(this);
|
||||||
|
on_child_added(n.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Node::remove_child(Node* n)
|
void Node::remove_child(Node* n)
|
||||||
@@ -277,6 +281,7 @@ void Node::remove_child(Node* n)
|
|||||||
{
|
{
|
||||||
n->removed(this);
|
n->removed(this);
|
||||||
YGNodeRemoveChild(y_node, n->y_node);
|
YGNodeRemoveChild(y_node, n->y_node);
|
||||||
|
on_child_removed(n);
|
||||||
m_children.erase(i);
|
m_children.erase(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -287,6 +292,7 @@ void Node::remove_all_children()
|
|||||||
{
|
{
|
||||||
n->removed(this);
|
n->removed(this);
|
||||||
YGNodeRemoveChild(y_node, n->y_node);
|
YGNodeRemoveChild(y_node, n->y_node);
|
||||||
|
on_child_removed(n.get());
|
||||||
}
|
}
|
||||||
m_children.clear();
|
m_children.clear();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -224,6 +224,8 @@ public:
|
|||||||
virtual void loaded();
|
virtual void loaded();
|
||||||
virtual void added(Node* parent);
|
virtual void added(Node* parent);
|
||||||
virtual void removed(Node* parent);
|
virtual void removed(Node* parent);
|
||||||
|
virtual void on_child_added(Node* child) { };
|
||||||
|
virtual void on_child_removed(Node* child) { };
|
||||||
const Node* init_template(const char* id);
|
const Node* init_template(const char* id);
|
||||||
void tick(float dt);
|
void tick(float dt);
|
||||||
void app_redraw();
|
void app_redraw();
|
||||||
|
|||||||
@@ -24,6 +24,35 @@ void NodeScroll::fix_scroll()
|
|||||||
auto rect = get_children_rect();
|
auto rect = get_children_rect();
|
||||||
m_offset = glm::clamp(m_offset, - zw(rect) + zw(m_clip_uncut) - padoff, { 0, 0 });
|
m_offset = glm::clamp(m_offset, - zw(rect) + zw(m_clip_uncut) - padoff, { 0, 0 });
|
||||||
m_pos_offset_childred = m_offset;
|
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)
|
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()
|
void NodeScroll::draw()
|
||||||
{
|
{
|
||||||
NodeBorder::draw();
|
NodeBorder::draw();
|
||||||
|
fix_scroll();
|
||||||
glm::vec4 rect = get_children_rect();
|
glm::vec4 rect = get_children_rect();
|
||||||
glm::vec4 pad = GetPadding();
|
glm::vec4 pad = GetPadding();
|
||||||
float sz = m_size.y - (pad[0] + pad[2]);
|
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 h = sz / rect.w * sz;
|
||||||
float offset_percent = m_offset.y / (rect.w - sz);
|
float offset_percent = m_offset.y / (rect.w - sz);
|
||||||
float pr = YGNodeLayoutGetPadding(y_node, YGEdgeRight) - 5;
|
float pr = YGNodeLayoutGetPadding(y_node, YGEdgeRight) - 5;
|
||||||
@@ -71,7 +95,7 @@ kEventResult NodeScroll::handle_event(Event* e)
|
|||||||
m_drag_start = me->m_pos;
|
m_drag_start = me->m_pos;
|
||||||
m_offset_start = m_offset;
|
m_offset_start = m_offset;
|
||||||
// if click on the scroll area use scrolling direction, otherwise natural
|
// 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();
|
mouse_capture();
|
||||||
break;
|
break;
|
||||||
case kEventType::MouseMove:
|
case kEventType::MouseMove:
|
||||||
@@ -79,7 +103,7 @@ kEventResult NodeScroll::handle_event(Event* e)
|
|||||||
{
|
{
|
||||||
glm::vec4 rect = get_children_rect();
|
glm::vec4 rect = get_children_rect();
|
||||||
glm::vec4 pad = GetPadding();
|
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;
|
m_offset = m_offset_start + (me->m_pos - m_drag_start) * m_mask * m_scroll_dir * speed;
|
||||||
fix_scroll();
|
fix_scroll();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,5 +15,9 @@ public:
|
|||||||
virtual kEventResult handle_event(Event* e) override;
|
virtual kEventResult handle_event(Event* e) override;
|
||||||
virtual void draw() override;
|
virtual void draw() override;
|
||||||
virtual void handle_resize(glm::vec2 old_size, glm::vec2 new_size) override;
|
virtual void handle_resize(glm::vec2 old_size, glm::vec2 new_size) override;
|
||||||
|
virtual void on_child_added(Node* child) override;
|
||||||
|
virtual void on_child_removed(Node* child) override;
|
||||||
|
virtual void added(Node* parent) override;
|
||||||
|
virtual void loaded() override;
|
||||||
void fix_scroll();
|
void fix_scroll();
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user