メインコンテンツまでスキップ

ftxui のdom

tui 描画に ftxui の Screen を取り入れたが、 さらに dom もとり入れた。

ftxui の dom は、 HTML の dom とは無関係で、描画レイアウトの node tree 。

using Element = std::shared_ptr<Node>

となっていて Screen に対して描画できる。

auto screen = ftxui::Screen::Create(ftxui::Dimension::Full());

ftxui::Element tree = dom();
ftxui::Render(screen, tree);

必要に応じてカスタムの Node を作る。 レイアウトを ftxui に任せて、cell 描画だけカスタムすることが可能だ。

class Content : public ftxui::Node{
void Render(ftxui::Screen &screen) override;
};

縦に、tabbar - content(flex) - statusbar というレイアウトを組めた。 content は 独立したローカル Screen を持つようになったので、 Screen 原点の管理を省略できる。

スクロールとカーソル管理を書き直す必要があるが、 この機に w3m のわりと複雑なロジックを単純なものに変えてしまう。

Content COLS/LINES ScrollViewport xywh Cursor XY

の8つの int を数字で管理するだけでよいのではないか。 Line のリンクリストに対する pointer よりもシンプルに。 カーソル周辺の cell の文字幅が得られればいいので以下のような関数で 都度取得すればよいでしょう。

using GetCellWidth = std::function<int (int row, int col)>;