sakura
sakura copied to clipboard
ミニマップを CEditView から分離できないか検討したい
やりたいこと
ミニマップとは、[設定]→[ミニマップを表示]でビューの右側に表示される、縦長で編集不可のビューのことです。文書の全体像が一目で分かるように極小フォントを使って描画され、マウスクリックひとつで該当箇所までスクロールできるようになっています。
このミニマップ、エディタの編集画面とは大きく機能が異なりますが、プログラム上では編集画面と同じコードを共有して作られています。具体的には CEditView の m_bMiniMap フラグをいろいろな場所で判定してすべての動作を切り替えており、現在は39箇所で判定を行っています。編集画面とミニマップのコードが共有されていることにより、どちらか一方に対しての機能の追加・修正の際にもう一方を壊していないか注意深く確認する必要が生まれているため、これを解決したい課題とみてミニマップを別のクラスに分離できないかを検討したいと思っています。
現在のミニマップのおおまかな仕様
- 文書の内容を極小フォントで描画します。
- 編集画面に表示されている範囲の背景に色が付きます。
- 行番号・ルーラーは表示されません。
- 文字の間隔・行の間隔は0固定です。
- 行の折り返しはしません。
- マウスホイール操作で10行分スクロールします。
- 横方向のスクロールはできません。
- マウスクリックで該当行まで編集画面がスクロールします。
- マウスドラッグに追従して編集画面がスクロールします。
- マウスホバーで該当行以下4行の内容をツールチップに表示します。
- TSV/CSVモードでも通常と同じタブ幅を使います。
- 余談ですが、CFigure_Comma::DispSpace と CFigure_Tab::DispSpace には、タブ表示幅の計算のために CLayoutMgr を一時生成するぶっとんだ処理が存在します。
- ファイルのドラッグ&ドロップは受け付けません。
課題
普通の編集画面とミニマップの間で共通の処理の大部分が描画です。ミニマップを分離するには描画コードを CEditView から分離する必要があります。現在のミニマップがややこしい実装になっているのは、もしかすると各部に分岐を組み込むよりも描画を分離するほうが大変だったための次善策である可能性があり、本当に実現できるかどうかはよく分かっていません。 仮に分離して動作するものができあがったとしても、レビューを誰がどうやってやるのかが問題になるかもしれません。UIの処理なので自動テストが困難ですし、CEditView からミニマップだけをとりだしても十分巨大と言えるコード量になりそうです。
参考資料
PatchUnicode / #864 ミニマップ PatchUnicode / #1000 ミニマップが印刷プレビューで表示されたままになる
「できたらいいなー」ぐらいのふんわりした提起です。いま手元でやってますという話ではありません。
類似品に印刷プレビューなんてものもありますね。
というか、印刷プレビューを雑な実装で残しておいたのを参考に作られたのがミニマップだと思っています。
ふんわりふわふわで良ければ、できたらいいなぁ、と思っています。
ミニマップの実装クラスを分割する #1748