自作エディターを作る! エディットエンジンの分離
今回はキーの入力と操作の解析クラスをエディットエンジンから分離するところをやっていきます。
前回のおさらい
今回は前回の記事で言っていたように、CEditEngineから、キーを受け取って対応する操作の処理を分離するところをやっていきます。
まずクラスの変更点を前回の記事から持ってきます。
- class CEditControl - これからはこいつがキー入力を受け取る。キー入力を受け取って、CEditEngineに操作メッセージを投げる。編集結果のコンソールへの描画も行う。(描画は他のクラスに投げちゃってもいいかも)
- class CEditEngine(変更) - キー入力の処理とか画面描画とかはやめて、エディタ的なバッファへの操作、表示ページ管理とかをやる。
ついでにクラス図をもう一度貼っておきます。
main関数から直接CEditEngineを呼び出すのではなく、CEditControlから間接的にCEditEngineを呼び出すようになっていますね。
コーディング
実際にコーディングしていきます。いくつか特徴的なところをピックアップしていきます。
なお、今回のcommitは下記です。
main()
main()関数では、CEditControlクラスを作成してrunしています。
gist9fb9bcee3884e2a4496b806c4e53a997
CEditControl.cpp
run() -> command_loop() -> keygen_command_mode()と処理が降りていきます。
動作としてはcommand_loop()でループを回してキー入力を受け付けて、処理をしていくイメージです。受け取った入力はkey_gen_command()になげて対応するメッセージをCEditEngineに投げる予定です。
現在はCEditEngine側にメッセージハンドラを用意していないので、PublicにしたPageUp()/Down()をそのまま呼び出しています。
またkeygen_command_mode()とモード名がついている理由ですが、表示するテキストをそのまま操作する挿入モードと、キーバインドに従った操作を行うコマンドモードをそれぞれ切り替えようと考えているからです。
gistec6d21b3379fb9ea059957b1b7a1a11b
次にやること
次回はとりあえず見た目をある程度整理しようかな、と思います。
- 1行目に編集中のファイル名を表示する。パスまるごと出すけれど、マックスなん文字目まで出そうかな? プロンプトの横幅45%くらいまでならいいかな?
- プロンプトの縦幅を取得して、表示する行数を可変にしたい。
- 現在のモードを一番下に表示したい。挿入モードかコマンドモードか。
ところで見たままモードでの編集で、ソースコード入れる方法ってなかなか大変ですね。とりあえずGistを貼り付ける方向でやってみたけど、他にもっといい方法ないんかな?