[C++] 326 BBS閲覧アプリの製作 その12 レスのGUI表示 Fl_Text_Display

[M1 Mac, MacOS Ventura 13.3.1, clang 14.0.3]

レスを右下に表示できるようになりました。

シフトJISのdatファイルとして一旦保存してしまうと、UTF-8への変換が自分のスキルではかなり難しいので、文字列の状態で変換してからファイルにしました。macOSは日本語を扱う上で不利になることが多いです。

これで基本機能の実装は完了です。だらだら作って4日半でした。GUIは丸一日掛かりました。

レス表示欄は生データそのままなのでかなり見づらいです。テキスト整形は今後の課題とします。

extern vector<tuple<string, string, string, string>> numTitlePostnumID;
extern string id, num, title, postnum, boardURL;
extern vector<tuple<string, string, string>> urlNameCat;
extern Fl_Text_Display* contentDisplay;

void button_cb(Fl_Widget *w, void*) {
    string selectID;
    const char* label = w->label();

    cout << "label: " << label << endl;

    for (const auto& tuple : numTitlePostnumID) {
        if (std::get<1>(tuple) == label) {
            selectID = std::get<3>(tuple);
        }
    }

    string url = boardURL + "dat/" + selectID + ".dat";
    std::string datBuffer;

    string filename = "/Users/[ユーザ名]/BBS_Browser/" + selectID + ".dat";

    cout << "url: " << url << endl;
    cout << "filename: " << filename << endl;

    CURL* curl = curl_easy_init();
    if (curl) {
        curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &datBuffer);
        CURLcode res = curl_easy_perform(curl);
        if (res != CURLE_OK) {
            std::cerr << "Error: " << curl_easy_strerror(res) << std::endl;
            return;
        }

        curl_easy_cleanup(curl);

    } else {
        std::cerr << "Failed to initialize curl" << std::endl;

        return;
    }

    // 文字コードをCP932からUTF-8へ変換
    datBuffer = ConvertShiftJISToUTF8(datBuffer);

    std::ofstream file(filename, std::ios::binary);
    file << datBuffer;
    file.close();

    // ファイル内容表示
    std::ifstream ifile(filename);
    if (!ifile.is_open()) {
        cout << "ファイルopen失敗" << endl;

        return;
    }

    Fl_Text_Buffer* buffer = new Fl_Text_Buffer();
    contentDisplay->buffer(buffer);

    string line;
    while (std::getline(ifile, line)) {
        buffer->append(line.c_str());
        buffer->append("\n");
    }

    // 現在の行数を取得
    int lineCount = contentDisplay -> buffer() -> count_lines(0, contentDisplay -> buffer() -> length());
    // 最終行が見えるようにスクロールを設定
    contentDisplay -> scroll(lineCount, 0);

    ifile.close();

    return;
}