summaryrefslogtreecommitdiff
path: root/src/layout/algorithm/tiled/scrolling/ScrollingAlgorithm.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/layout/algorithm/tiled/scrolling/ScrollingAlgorithm.hpp')
-rw-r--r--src/layout/algorithm/tiled/scrolling/ScrollingAlgorithm.hpp137
1 files changed, 137 insertions, 0 deletions
diff --git a/src/layout/algorithm/tiled/scrolling/ScrollingAlgorithm.hpp b/src/layout/algorithm/tiled/scrolling/ScrollingAlgorithm.hpp
new file mode 100644
index 00000000..a2a9316e
--- /dev/null
+++ b/src/layout/algorithm/tiled/scrolling/ScrollingAlgorithm.hpp
@@ -0,0 +1,137 @@
+#pragma once
+
+#include "../../TiledAlgorithm.hpp"
+#include "../../../../managers/HookSystemManager.hpp"
+#include "../../../../helpers/math/Direction.hpp"
+#include "ScrollTapeController.hpp"
+
+#include <vector>
+
+namespace Layout::Tiled {
+ class CScrollingAlgorithm;
+ struct SColumnData;
+ struct SScrollingData;
+
+ struct SScrollingTargetData {
+ SScrollingTargetData(SP<ITarget> t, SP<SColumnData> col) : target(t), column(col) {
+ ;
+ }
+
+ WP<ITarget> target;
+ WP<SColumnData> column;
+ bool ignoreFullscreenChecks = false;
+
+ CBox layoutBox;
+ };
+
+ struct SColumnData {
+ SColumnData(SP<SScrollingData> data) : scrollingData(data) {
+ ;
+ }
+
+ void add(SP<ITarget> t);
+ void add(SP<ITarget> t, int after);
+ void add(SP<SScrollingTargetData> w);
+ void add(SP<SScrollingTargetData> w, int after);
+ void remove(SP<ITarget> t);
+ bool has(SP<ITarget> t);
+ size_t idx(SP<ITarget> t);
+
+ // index of lowest target that is above y.
+ size_t idxForHeight(float y);
+
+ void up(SP<SScrollingTargetData> w);
+ void down(SP<SScrollingTargetData> w);
+
+ SP<SScrollingTargetData> next(SP<SScrollingTargetData> w);
+ SP<SScrollingTargetData> prev(SP<SScrollingTargetData> w);
+
+ std::vector<SP<SScrollingTargetData>> targetDatas;
+ WP<SScrollingData> scrollingData;
+ WP<SScrollingTargetData> lastFocusedTarget;
+
+ WP<SColumnData> self;
+
+ // Helper methods to access controller-managed data
+ float getColumnWidth() const;
+ void setColumnWidth(float width);
+ float getTargetSize(size_t idx) const;
+ void setTargetSize(size_t idx, float size);
+ float getTargetSize(SP<SScrollingTargetData> target) const;
+ void setTargetSize(SP<SScrollingTargetData> target, float size);
+ };
+
+ struct SScrollingData {
+ SScrollingData(CScrollingAlgorithm* algo);
+
+ std::vector<SP<SColumnData>> columns;
+
+ UP<CScrollTapeController> controller;
+
+ SP<SColumnData> add();
+ SP<SColumnData> add(int after);
+ int64_t idx(SP<SColumnData> c);
+ void remove(SP<SColumnData> c);
+ double maxWidth();
+ SP<SColumnData> next(SP<SColumnData> c);
+ SP<SColumnData> prev(SP<SColumnData> c);
+ SP<SColumnData> atCenter();
+
+ bool visible(SP<SColumnData> c);
+ void centerCol(SP<SColumnData> c);
+ void fitCol(SP<SColumnData> c);
+ void centerOrFitCol(SP<SColumnData> c);
+
+ void recalculate(bool forceInstant = false);
+
+ CScrollingAlgorithm* algorithm = nullptr;
+ WP<SScrollingData> self;
+ std::optional<double> lockedCameraOffset;
+ };
+
+ class CScrollingAlgorithm : public ITiledAlgorithm {
+ public:
+ CScrollingAlgorithm();
+ virtual ~CScrollingAlgorithm();
+
+ virtual void newTarget(SP<ITarget> target);
+ virtual void movedTarget(SP<ITarget> target, std::optional<Vector2D> focalPoint = std::nullopt);
+ virtual void removeTarget(SP<ITarget> target);
+
+ virtual void resizeTarget(const Vector2D& Δ, SP<ITarget> target, eRectCorner corner = CORNER_NONE);
+ virtual void recalculate();
+
+ virtual SP<ITarget> getNextCandidate(SP<ITarget> old);
+
+ virtual std::expected<void, std::string> layoutMsg(const std::string_view& sv);
+ virtual std::optional<Vector2D> predictSizeForNewTarget();
+
+ virtual void swapTargets(SP<ITarget> a, SP<ITarget> b);
+ virtual void moveTargetInDirection(SP<ITarget> t, Math::eDirection dir, bool silent);
+
+ CBox usableArea();
+
+ private:
+ SP<SScrollingData> m_scrollingData;
+
+ SP<HOOK_CALLBACK_FN> m_configCallback;
+ SP<HOOK_CALLBACK_FN> m_focusCallback;
+ SP<HOOK_CALLBACK_FN> m_mouseButtonCallback;
+
+ struct {
+ std::vector<float> configuredWidths;
+ } m_config;
+
+ eScrollDirection getDynamicDirection();
+
+ SP<SScrollingTargetData> findBestNeighbor(SP<SScrollingTargetData> pCurrent, SP<SColumnData> pTargetCol);
+ SP<SScrollingTargetData> dataFor(SP<ITarget> t);
+ SP<SScrollingTargetData> closestNode(const Vector2D& posGlobglobgabgalab);
+
+ void focusTargetUpdate(SP<ITarget> target);
+ void moveTargetTo(SP<ITarget> t, Math::eDirection dir, bool silent);
+ void focusOnInput(SP<ITarget> target, bool hardInput);
+
+ friend struct SScrollingData;
+ };
+};