Menu

#939 折りたたみ

open
nobody
None
5
2014-12-23
2014-12-20
syat
No

行を折りたたむ機能をつけます。
・タイプ別設定―カラーの「折りたたみ」を有効にすると行番号の右にバーが出ます。
・折りたたみはアウトライン解析からのものと、範囲選択して「折りたたみの追加」するユーザ定義のものがあります。(メニューに追加し忘れましたが編集系コマンド)
・折りたたみの単位は行で、桁の折りたたみには対応しません。開始行≠終了行とします。
・同じ開始行に複数の折りたたみは追加不可。
・アウトライン解析を更新すると折りたたみも更新されます。

残課題
・検索、置換など他機能との競合があまり考慮されていない
・折りたたみ開閉のたびに全レイアウトを作り直していて遅い

1 Attachments

Discussion

  • Moca

    Moca - 2014-12-20

    さっそく試してみました。
    折り畳みのまま置換・検索・行移動などしたいですが、どうすべきなんでしょうかね。
    対象行だったら展開するほうがいいのかな?
    ・すべて縮小がほしい
    ・すべて展開がほしい
    ・ミニマップにも折り畳みマークがついてる
    ・Commandの再描画で他のビューおよびミニマップが更新されない
    ・アウトライン解析後にアウトラインの折り畳みがすべて展開される
    ・アウトライン解析後に折り畳みに従った再描画がたりない
    ・アウトライン解析がファイルツリー・ブックマーク一覧だったときも折り畳みが更新される
    ・1行しかない折り畳みができ、しかも改行すると下の行に折り畳みマークが移動する
    ・折りたたむと行を超えた色分けで折りたたまれた部分の解析がスキップされて全部コメント色になったりする
    (・行番号表示がレイアウトの時、レイアウト行番号が折り返し後の番号になるのはなんか違う気がするがそれでいいきもする)
    (・フォントを大きくしても折り畳みマークが大きくならない)

     
  • Moca

    Moca - 2014-12-20

    CLayoutMgr::LogicToLayoutを修正しないといけないかも。
    というのも、
    // 2013.05.12 m_pLayoutPrevReferを見る
    if( nCaretPosY <= m_nPrevReferLine && m_pLayoutPrevRefer
    && m_pLayoutPrevRefer->GetLogicLineNo() <= ptLogic.y ){
    // ヒントより現在位置のほうが後ろか同じぐらいで近い
    nCaretPosY = CLayoutInt(ptLogic.y - m_pLayoutPrevRefer->GetLogicLineNo()) + m_nPrevReferLine;
    この部分で、「現在行+10ロジック行ならレイアウトも10行先のはず」としてLogic行数をLayoutに足し算しています。
    がその前提がくずれるからです。

    (追記)
    直前のこの時点でアウトでした。
    nCaretPosY = t_max(CLayoutInt(ptLogic.y), nLineHint);

     

    Last edit: Moca 2014-12-20
  • syat

    syat - 2014-12-21

    ・ミニマップにも折り畳みマークがついてる
    ・アウトライン解析後に折り畳みに従った再描画がたりない
    ・アウトライン解析がファイルツリー・ブックマーク一覧だったときも折り畳みが更新される
    ・1行しかない折り畳みができ、しかも改行すると下の行に折り畳みマークが移動する

    ひとまず簡単なものから直しました。

    ・すべて縮小がほしい
    ・すべて展開がほしい

    これは全選択して「折りたたみの展開」「折りたたみの縮小」でできます。

    ・Commandの再描画で他のビューおよびミニマップが更新されない

    手順が違うかもしれませんが再現できませんでした。

    ・アウトライン解析後にアウトラインの折り畳みがすべて展開される

    アウトライン解析も再解析後に全クローズするので、類似の仕様ということで・・・汗
    うまく引き継げるとよいんですけどね。

    他、メニューにコマンド追加したり、細かなバグを修正しました。

     

    Last edit: syat 2014-12-21
  • Moca

    Moca - 2014-12-22

    簡単なバグの修正は確認しました。Good++
    ・Commandの再描画で他のビューおよびミニマップが更新されない
    すみません。Readraw()のコード部分を見てそう判断したんですが、1つ上の行にOnChangeSettingsがあるので、問題ありませんでした。Readraw()が不要かも...は最新で修正されてました。
    OnChangeSettingが呼ばれると、タイプ別フォントの幅データがクリアされるはずで、
    他にも背景画像再読み込みとかも発生するので、もうチョイ軽いメソッドを呼んだ方がいいと思う。
    細かく見てないけどCEditWnd::ChangeLayoutParam(をラップした新関数)とかどうでしょうか。

    ・RefreshFromOutline
    ファイルツリーの追加で、別ファイルの行番号も追加できるようにしたため、
    ファイル名が設定されてる場合は、自分のファイルかチェックする必要があるようになりました。
    ダミー要素のFUNCINFO_NOCLIPTEXTと
    ドキュメント化してないけど行番号がマイナスになっている場合はタグジャンプしない要素も考慮が必要かもしれないです。
    あとサポートしなくてもいいかもしれないけど、アウトラインデータはプラグイン等の関係で、行番号順に並んでいるとは限らないはずです。
    (CDlgFuncList側の行番号選択部分は順番が違っても動作するようにたぶん以前修正しました)
    一度行番号・Depathだけ抽出して、並び替えるとか。

    [+]マークの行にカーソルがあるときに、[+]をマウスですばやく開閉すると右単語選択みたいな動作をする
    たぶんダブルクリックが動作してるんだと思う。
    ・ファイルの末尾のほうで展開・縮小すると画面が下にずれてまっ白になる

     
  • syat

    syat - 2014-12-23

    このパッチは次リリースに間に合わないので、次々版目指してじっくりがんばります。

    ・ファイルの末尾のほうで展開・縮小すると画面が下にずれてまっ白になる

    カーソル位置が縮小で折りたたまれたとき、折りたたみ開始位置に移動するようにしました。
    また、折りたたみ最終行にEOFがある場合、折りたたんで次行に文字追加するとおかしなことになるので、折りたためるのは最終行の1行前までという制約をつけました。

    CLayoutMgr::LogicToLayoutを修正しないといけないかも。
    直前のこの時点でアウトでした。
    nCaretPosY = t_max(CLayoutInt(ptLogic.y), nLineHint);

    これまではレイアウト行数≧ロジック行数でしたが、今回から通じなくなりますね。
    そもそもLogicToLayoutに折りたたまれた部分のロジック位置を渡された場合、どういう結果になるのかを決めなきゃなんないです。
    折りたたみ終了行の次行行頭にマップすればいいのかな??

     

    Last edit: syat 2014-12-23

Log in to post a comment.

Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.