[C++] 149 FLTK : スクロールバー内包ウィジェット Fl_Text_Display

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

Fl_Multiline_Outputがスクロールバーを内包しないことを知り少なからず落胆しましたが、気を取り直してFl_Text_DisplayでGUIを再構築しました。

字面からのイメージで適当に組んでみたら、たまたま上手くいきました。

表示文字列のstringを作成してFl_Text_Bufferに放り込み、Fl_Text_Displayで表示するという流れです。

初期状態はWindowと同じ色ですが、Fl_Text_Bufferを読み込むと設定した色に変わります。

Fl_Text_Display *textDisplay;
Fl_Text_Buffer *textBuffer;
string bufferstr;

void formatConvert(){
    string path2;
    textBuffer = new Fl_Text_Buffer(0, 12800);

    // フォーマットリストのindex取得
    int formatNum = choice->value();

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

    // stringへ変換
    string path_str = string(path);

    // ファイルパスに半角スペースが含まれる場合はアンダースコアに置き換えたファイル名に変更
    if (path_str.find(" ") != std::string::npos)
    {
        path2 = spt.splitJoin2(path_str, " ", "_", 0, -1);

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

    cout << "path2 "<< path2 << endl;

    // 自製ライブラリSplitによりファイル名から拡張子を削除
    string prefix = spt.splitJoin(path2, ".", 0, -2);
    cout << "prefix "<< prefix << endl;

    // 変換先のファイルパス作成
    string path3 = prefix + fmt[formatNum];
    cout << "path3 "<< path3 << endl;

    // ファイル変換コマンド作成
    string cmd = "/opt/homebrew/Cellar/ffmpeg/5.1/bin/ffmpeg -y -i " + path2 + " -f " + fmt[formatNum] + " " + path3 + " && echo ffmpeg完了";
    cout << "cmd: "<< cmd << endl;

    string appendstr = "cmd: " + cmd + "\n";
    bufferstr += appendstr;
    cout << "bufferstr: " << bufferstr << endl;

    textBuffer->append(bufferstr.c_str());
    textDisplay->buffer(textBuffer);

    outputTextMake(cmd);
    browser->load(outputText);
    int line_num = browser->size();
    browser->bottomline(line_num);

    cout << "フォーマット変換完了!" << endl;
}
Fl_Text_Display* textDisplay = new Fl_Text_Display(10,165,340,130,"My Output");
    textDisplay->color(fl_rgb_color(188,226,232)); // みずいろ
    textDisplay->textsize(12);
    textDisplay->wrap_mode(Fl_Text_Display::WRAP_AT_BOUNDS, 0); // 折り返し設定
    textDisplay->labelsize(10);
    textDisplay->labelcolor(fl_rgb_color(255,255,255));
    textDisplay->align(Fl_Align(FL_ALIGN_TOP_RIGHT));