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)>;