[C++] 168 FLTK : Fl_Text_DisplayとFl_Browserの最終行表示

[M1 Mac, Big Sur 11.6.8, clang 13.0.0, FLTK 1.3.8, NO IDE]

開発中のビデオツールアプリでFl_Text_DisplayとFl_Browserの最終行を常に表示するようにしました。

Fl_Browser(下図下)の方はすぐに方法が分かったものの、Fl_Text_Display(下図右上)はFl_Text_Bufferの方でしか行数を把握できないと知るまで時間がかかり難航しました。

Fl_Text_Display::scroll関数の第1引数を10000行などあり得ない大きな数字に設定しても最終行表示は可能ですが、さすがに荒っぽいやり方なので行数を正確にカウントしました。

これくらいの機能は用意されていて当たり前と考えがちですが、簡易ツールのFLTKには通用しませんでした。使いこなせるかどうかはユーザーの工夫次第でしょう。

人気面でwxWidgetsに水を開けられてしまうのも致し方なしです。

void inspect(){
    char    count[100];

    // 対象ファイルパス取得
    const char* path = input_line->value();
    cout << "path "<< path << endl;

    string path_str = string(path);
    bufferstr += "path_str: " + path_str + "\n";

    // path内半角スペースをアンダースコアへ置き換え
    string path2 = underScoreReplace(string(path_str));
    bufferstr += "path2: " + path2 + "\n";

    // 元ファイルをリネーム
    rename(path, path2.c_str());

    // ファイル情報出力コマンド作成
    string cmd = "/opt/homebrew/Cellar/ffmpeg/5.1/bin/ffprobe -i " + path2 + " 2>&1 && echo ffprobe完了";
    
    // cmdをtextBufferに追記
    string appendstr = "cmd: " + cmd + "\n";
    bufferstr += appendstr;
    cout << "bufferstr: " << bufferstr << endl;
    textBuffer->append(bufferstr.c_str());

    // 文字数と行数をカウントしtextBufferに追記
    int length_buf = textBuffer -> length();
    int num_lines = textBuffer -> count_lines(0, length_buf);

    printf("length_buf %d num_lines %d\n",length_buf,num_lines);
    sprintf(count, "length_buf %d num_lines %d\n",length_buf,num_lines);
    textBuffer->append(count);

    // textDisplayを最終行表示する
    textDisplay->buffer(textBuffer);
    textDisplay->scroll(num_lines + 1, 0);
    
    // cmd実行
    outputTextMake(cmd);

    // browserを最終行表示する
    browser->load(outputText);
    int line_num = browser->size();
    browser->bottomline(line_num);

    cout << "inspect完了!" << endl;

}