aboutsummaryrefslogtreecommitdiff
path: root/ricochet/src/tui/layout.hh
diff options
context:
space:
mode:
authorRichard Qin <richard.qin.x@gmail.com>2026-10-26 20:38:32 +0800
committerRichard Qin <richard.qin.x@gmail.com>2026-10-26 20:38:32 +0800
commit032b82c13e157a048ac13a540dfd18be9667fe49 (patch)
treed8bec1f88fcd529a300bb71316c18ecaf0806b63 /ricochet/src/tui/layout.hh
parent2e6dc81391c5dbb787cfd793ad5823904b3b9c94 (diff)
downloadrcc-project-032b82c13e157a048ac13a540dfd18be9667fe49.tar.gz
rcc-project-032b82c13e157a048ac13a540dfd18be9667fe49.tar.xz
feat(tui): add object focus traversal and link activation
Diffstat (limited to 'ricochet/src/tui/layout.hh')
-rw-r--r--ricochet/src/tui/layout.hh15
1 files changed, 15 insertions, 0 deletions
diff --git a/ricochet/src/tui/layout.hh b/ricochet/src/tui/layout.hh
index 7e02e76..f5db28c 100644
--- a/ricochet/src/tui/layout.hh
+++ b/ricochet/src/tui/layout.hh
@@ -48,6 +48,12 @@ struct LayoutHit
std::optional<HitTarget> target {};
};
+struct FocusStep
+{
+ DisplayPosition position {};
+ bool wrapped { false };
+};
+
struct ScrollWindow
{
BlockId block {};
@@ -118,6 +124,7 @@ public:
DisplayPosition line_edge( const DisplayPosition& position, bool end ) const;
DocumentRange unit( const DisplayPosition& position ) const;
std::optional<HitTarget> target( const DisplayPosition& position ) const;
+ std::optional<FocusStep> focus( const DisplayPosition& position, bool backward ) const;
std::optional<LayoutPoint> cursor_cell( const DisplayPosition& position ) const;
std::vector<HorizontalScroll> reveal( const DisplayPosition& position ) const;
std::vector<HorizontalScroll> pan( const DisplayPosition& position, int direction ) const;
@@ -141,9 +148,17 @@ private:
const LayoutGlyph& cursor_glyph( const DisplayPosition& position ) const;
DisplayPosition stop( std::size_t index ) const;
+ struct FocusEntry
+ {
+ HitTarget target {};
+ std::size_t stop { 0 };
+ };
+
int columns_;
LayoutData data_;
std::vector<std::size_t> stops_ {};
+ // First reading stop per enabled object, independent of viewport clipping.
+ std::vector<FocusEntry> focus_ {};
};
} // namespace ricochet::tui::detail