From 6159e71eeddcfadff58208d7a6192970f3923bd1 Mon Sep 17 00:00:00 2001 From: omigamedev Date: Thu, 31 Jan 2019 15:09:49 +0100 Subject: [PATCH] improve scrollbar detection and scroll behavior --- src/app_layout.cpp | 2 -- src/node.cpp | 6 ++++++ src/node.h | 2 ++ src/node_scroll.cpp | 40 ++++++++++++++++++++++++++++++++-------- src/node_scroll.h | 4 ++++ 5 files changed, 44 insertions(+), 10 deletions(-) diff --git a/src/app_layout.cpp b/src/app_layout.cpp index 37f7efd..920a286 100644 --- a/src/app_layout.cpp +++ b/src/app_layout.cpp @@ -822,8 +822,6 @@ void App::initLayout() brush_update(); - TextureManager::load("data/paper.jpg"); - // hacky thing to make the toolbar buttons not steal events when moving cursor fast if (auto* toolbar = layout[main_id]->find("toolbar")) toolbar->m_flood_events = true; diff --git a/src/node.cpp b/src/node.cpp index 578526f..16a8bea 100644 --- a/src/node.cpp +++ b/src/node.cpp @@ -241,6 +241,7 @@ void Node::add_child(Node* n) n->m_manager = m_manager; YGNodeInsertChild(y_node, n->y_node, YGNodeGetChildCount(y_node)); n->added(this); + on_child_added(n); } 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; YGNodeInsertChild(y_node, n->y_node, index); n->added(this); + on_child_added(n); } void Node::add_child(std::shared_ptr n) @@ -259,6 +261,7 @@ void Node::add_child(std::shared_ptr n) n->m_manager = m_manager; YGNodeInsertChild(y_node, n->y_node, YGNodeGetChildCount(y_node)); n->added(this); + on_child_added(n.get()); } void Node::add_child(std::shared_ptr n, int index) @@ -268,6 +271,7 @@ void Node::add_child(std::shared_ptr n, int index) n->m_manager = m_manager; YGNodeInsertChild(y_node, n->y_node, index); n->added(this); + on_child_added(n.get()); } void Node::remove_child(Node* n) @@ -277,6 +281,7 @@ void Node::remove_child(Node* n) { n->removed(this); YGNodeRemoveChild(y_node, n->y_node); + on_child_removed(n); m_children.erase(i); } } @@ -287,6 +292,7 @@ void Node::remove_all_children() { n->removed(this); YGNodeRemoveChild(y_node, n->y_node); + on_child_removed(n.get()); } m_children.clear(); } diff --git a/src/node.h b/src/node.h index b3c2656..06e9311 100644 --- a/src/node.h +++ b/src/node.h @@ -224,6 +224,8 @@ public: virtual void loaded(); virtual void added(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); void tick(float dt); void app_redraw(); diff --git a/src/node_scroll.cpp b/src/node_scroll.cpp index ebcda4a..5883120 100644 --- a/src/node_scroll.cpp +++ b/src/node_scroll.cpp @@ -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(); } diff --git a/src/node_scroll.h b/src/node_scroll.h index 69d1baa..b3d6b71 100644 --- a/src/node_scroll.h +++ b/src/node_scroll.h @@ -15,5 +15,9 @@ public: virtual kEventResult handle_event(Event* e) override; virtual void draw() 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(); };