summaryrefslogtreecommitdiff
path: root/src/layout/algorithm/tiled/scrolling/ScrollTapeController.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/layout/algorithm/tiled/scrolling/ScrollTapeController.cpp')
-rw-r--r--src/layout/algorithm/tiled/scrolling/ScrollTapeController.cpp53
1 files changed, 36 insertions, 17 deletions
diff --git a/src/layout/algorithm/tiled/scrolling/ScrollTapeController.cpp b/src/layout/algorithm/tiled/scrolling/ScrollTapeController.cpp
index 657b6542..722b9bd8 100644
--- a/src/layout/algorithm/tiled/scrolling/ScrollTapeController.cpp
+++ b/src/layout/algorithm/tiled/scrolling/ScrollTapeController.cpp
@@ -147,14 +147,10 @@ double CScrollTapeController::calculateStripSize(size_t stripIndex, const CBox&
return usablePrimary * m_strips[stripIndex].size;
}
-CBox CScrollTapeController::calculateTargetBox(size_t stripIndex, size_t targetIndex, const CBox& usableArea, const Vector2D& workspaceOffset, bool fullscreenOnOne) {
+CBox CScrollTapeController::calculateStripBox(size_t stripIndex, const CBox& usableArea, const Vector2D& workspaceOffset, bool fullscreenOnOne) {
if (stripIndex >= m_strips.size())
return {};
- const auto& strip = m_strips[stripIndex];
- if (targetIndex >= strip.targetSizes.size())
- return {};
-
const double usableSecondary = getSecondary(usableArea.size());
const double usablePrimary = getPrimary(usableArea.size());
const double cameraOffset = calculateCameraOffset(usableArea, fullscreenOnOne);
@@ -163,13 +159,6 @@ CBox CScrollTapeController::calculateTargetBox(size_t stripIndex, size_t targetI
double primaryPos = calculateStripStart(stripIndex, usableArea, fullscreenOnOne);
double primarySize = calculateStripSize(stripIndex, usableArea, fullscreenOnOne);
- // calculate position along secondary axis (within strip)
- double secondaryPos = 0.0;
- for (size_t i = 0; i < targetIndex; ++i) {
- secondaryPos += strip.targetSizes[i] * usableSecondary;
- }
- double secondarySize = strip.targetSizes[targetIndex] * usableSecondary;
-
// apply camera offset based on direction
// for RIGHT/DOWN: scroll offset moves content left/up (subtract)
// for LEFT/UP: scroll offset moves content right/down (different coordinate system)
@@ -185,8 +174,8 @@ CBox CScrollTapeController::calculateTargetBox(size_t stripIndex, size_t targetI
}
// create the box in primary/secondary coordinates
- Vector2D pos = makeVector(primaryPos, secondaryPos);
- Vector2D size = makeVector(primarySize, secondarySize);
+ Vector2D pos = makeVector(primaryPos, 0.0);
+ Vector2D size = makeVector(primarySize, usableSecondary);
// translate to workspace position
pos = pos + workspaceOffset;
@@ -194,6 +183,35 @@ CBox CScrollTapeController::calculateTargetBox(size_t stripIndex, size_t targetI
return CBox{pos, size};
}
+CBox CScrollTapeController::calculateTargetBox(size_t stripIndex, size_t targetIndex, const CBox& usableArea, const Vector2D& workspaceOffset, bool fullscreenOnOne) {
+ if (stripIndex >= m_strips.size())
+ return {};
+
+ const auto& strip = m_strips[stripIndex];
+ if (targetIndex >= strip.targetSizes.size())
+ return {};
+
+ CBox stripBox = calculateStripBox(stripIndex, usableArea, workspaceOffset, fullscreenOnOne);
+ const double usableSecondary = getSecondary(usableArea.size());
+
+ double secondaryPos = 0.0;
+ for (size_t i = 0; i < targetIndex; ++i) {
+ secondaryPos += strip.targetSizes[i] * usableSecondary;
+ }
+
+ const double secondarySize = strip.targetSizes[targetIndex] * usableSecondary;
+
+ if (isPrimaryHorizontal()) {
+ stripBox.y = workspaceOffset.y + secondaryPos;
+ stripBox.h = secondarySize;
+ } else {
+ stripBox.x = workspaceOffset.x + secondaryPos;
+ stripBox.w = secondarySize;
+ }
+
+ return stripBox;
+}
+
double CScrollTapeController::calculateCameraOffset(const CBox& usableArea, bool fullscreenOnOne) {
const double maxExtent = calculateMaxExtent(usableArea, fullscreenOnOne);
const double usablePrimary = getPrimary(usableArea.size());
@@ -275,13 +293,14 @@ size_t CScrollTapeController::getStripAtCenter(const CBox& usableArea, bool full
return 0;
const double usablePrimary = getPrimary(usableArea.size());
- double currentPos = m_offset;
+ const double viewCenter = m_offset + usablePrimary / 2.0;
+ double currentEnd = 0.0;
for (size_t i = 0; i < m_strips.size(); ++i) {
const double stripSize = calculateStripSize(i, usableArea, fullscreenOnOne);
- currentPos += stripSize;
+ currentEnd += stripSize;
- if (currentPos >= usablePrimary / 2.0 - 2.0)
+ if (currentEnd >= viewCenter - 2.0)
return i;
}