diff --git a/src/ScrollContainer.cpp b/src/ScrollContainer.cpp new file mode 100644 index 0000000..40889da --- /dev/null +++ b/src/ScrollContainer.cpp @@ -0,0 +1,33 @@ +#include "ScrollContainer.hpp" +#include "src/Styles.hpp" +#include +#include + +namespace Raven { + +void ScrollContainer::on_layout() { + if (!m_target) + return; + + m_target->rect().set_x(-m_scroll.x()); + m_target->rect().set_y(-m_scroll.y()); +} + +std::shared_ptr ScrollContainer::make_target() { + m_target = add(); + m_target->set_style(style()); + m_target->rect().update(); + + return m_target; +} + +void ScrollContainer::on_mouse_button(MouseButtonEvent &event) { + if (event.did_scroll_down()) { + set_scroll(Point(m_scroll.x(), m_scroll.y() + m_scroll_step)); + } else if (event.did_scroll_up()) { + set_scroll(Point(m_scroll.x(), m_scroll.y() - m_scroll_step)); + } +} + +} + diff --git a/src/ScrollContainer.hpp b/src/ScrollContainer.hpp new file mode 100644 index 0000000..435ef52 --- /dev/null +++ b/src/ScrollContainer.hpp @@ -0,0 +1,33 @@ +#pragma once + +#include "Widget.hpp" +#include "src/Point.hpp" +#include + +namespace Raven { + +class ScrollContainer : public Widget { +public: + ScrollContainer() + : Widget() {} + + void set_scroll(Point scroll) { m_scroll = scroll; reflow(); } + Point &scroll() { return m_scroll; } + + std::shared_ptr make_target(); + void set_target(std::shared_ptr target) { m_target = target; } + std::shared_ptr target() { return m_target; } + + void set_scroll_step(double scroll_step) { m_scroll_step = scroll_step; } + double scroll_step() { return m_scroll_step; } +protected: + void on_layout(); + void on_mouse_button(MouseButtonEvent &event); +private: + double m_scroll_step { 5.0 }; + Point m_scroll { 0, 0 }; + std::shared_ptr m_target { nullptr }; +}; + +} +