aboutsummaryrefslogtreecommitdiff
path: root/src/tui/layout.hh
diff options
context:
space:
mode:
Diffstat (limited to 'src/tui/layout.hh')
-rw-r--r--src/tui/layout.hh53
1 files changed, 52 insertions, 1 deletions
diff --git a/src/tui/layout.hh b/src/tui/layout.hh
index 5feb0cd..7e02e76 100644
--- a/src/tui/layout.hh
+++ b/src/tui/layout.hh
@@ -31,6 +31,8 @@
namespace ricochet::tui::detail {
+class DocumentText;
+
using HitTarget = std::variant<LinkId, ControlId>;
struct LayoutPoint
@@ -46,6 +48,22 @@ struct LayoutHit
std::optional<HitTarget> target {};
};
+struct ScrollWindow
+{
+ BlockId block {};
+ std::int64_t left { 0 };
+ std::int64_t width { 0 };
+ std::int64_t offset { 0 };
+ std::int64_t maximum { 0 };
+};
+
+enum class WordMotion : std::uint8_t
+{
+ Next,
+ Previous,
+ End
+};
+
struct LayoutGlyph
{
LayoutPoint position {};
@@ -63,6 +81,10 @@ struct LayoutGlyph
bool decoration { false };
bool line_break { false };
bool fill { false };
+ bool word_start { false };
+ bool word_end { false };
+ // Inner-to-outer windows allow a code block inside a table to be revealed.
+ std::vector<ScrollWindow> scrolls {};
};
struct LayoutData
@@ -88,11 +110,40 @@ public:
std::size_t rows() const;
std::optional<LayoutPoint> locate( const DisplayPosition& position ) const;
std::optional<LayoutHit> hit( LayoutPoint point ) const;
- void append_frame( Frame& frame, std::size_t first_row, CellPoint origin, ScreenSize viewport ) const;
+ DisplayPosition first() const;
+ DisplayPosition last() const;
+ DisplayPosition adjacent( const DisplayPosition& position, int direction ) const;
+ DisplayPosition word( const DisplayPosition& position, WordMotion motion ) const;
+ DisplayPosition on_row( LayoutPoint point ) const;
+ 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<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;
+ void append_frame( Frame& frame,
+ std::size_t first_row,
+ CellPoint origin,
+ ScreenSize viewport,
+ const DocumentText& content,
+ std::optional<DocumentRange> selection,
+ const DisplayPosition& cursor,
+ std::optional<HitTarget> focus = {} ) const;
private:
+ struct ReadingPosition
+ {
+ std::size_t index { 0 };
+ bool at_start { true };
+ };
+ ReadingPosition reading_position( const DisplayPosition& position ) const;
+ std::size_t nearest_stop( LayoutPoint point ) const;
+ const LayoutGlyph& cursor_glyph( const DisplayPosition& position ) const;
+ DisplayPosition stop( std::size_t index ) const;
+
int columns_;
LayoutData data_;
+ std::vector<std::size_t> stops_ {};
};
} // namespace ricochet::tui::detail