[C++] 310 FLTK : 長整数型を引数とするcallback関数 その2

[M1 Mac, Ventura 13.3.1, clang 13.0.0, FLTK 1.3.8, NO IDE]

callback関数の引数に長整数を使うことで第1引数の動作関数に引数として追加できます。

任意の長整数により動作関数の内容を条件分けできます。例えばFileChooserで選んだファイルパスの表示先を変えることが出来たりします。

使用頻度は高くないですが、たまに使おうとすると殆ど忘れてしまっているので再度記事にしておきます。構造がややこしくて共同開発であれば現場を混乱させそうな内容です。

久しぶりにC++のコードを書きましたが、だいぶPythonになじんでいたので調子が出ないです。

// fileFcBtn
fileFcBtn = new Fl_Button(245,108,30,20,"...");
fileFcBtn->color(fl_rgb_color(112,128,144));
fileFcBtn->labelcolor(fl_rgb_color(255,239,213));
fileFcBtn->labelsize(14);
fileFcBtn->callback(FileChooserCB,1); // 長整数1を渡す

// toFcBtn
toFcBtn = new Fl_Button(245,143,30,20,"...");
toFcBtn->color(fl_rgb_color(112,128,144));
toFcBtn->labelcolor(fl_rgb_color(255,239,213));
toFcBtn->labelsize(14);
toFcBtn->callback(FileChooserCB,2); // 長整数2を渡す
void FileChooserCB(Fl_Widget*, long num) {
    int fc;
    string appdir = "/";
    int onoff_dir = dir_rbtn->value();

    if (onoff_dir == 1){
        fc = 4; // FileChooser::DIRECTORY
    } else {
        fc = 0; // FileChooser::SINGLE
    }

    int x_win = window->x_root();
    int y_win = window->y_root();
    cout<<"x_win "<< x_win <<" y_win "<< y_win <<endl;

    chooser = new FileChooser(appdir.c_str(), 
                        "*.*",
                        fc,
                        "File/Dir Chooser",490,380, num
                        );
    
    chooser->resize(x_win+85,y_win+50,490,380);
    chooser->set_modal();
    chooser->Fl_Window::show();

    while(chooser->Fl_Window::shown()){
        Fl::wait();
    }
}
FileChooser::FileChooser(const char *d, const char *p, 
int t, const char *title,int w,int h, long num)
	:Fl_Window(w,h,title),Fl_File_Chooser(d,p,t,title){

<中略>

btnOK = new Fl_Return_Button(313, 345, 85, 25, "OK");
		if (num==1){
			btnOK->callback((Fl_Callback*)btnOKCB);
		} else {
			btnOK->callback((Fl_Callback*)btnOKCB2);
		}
void btnOKCB(Fl_Return_Button*, void*)
{
	const char* file = inputFileName->value();

	file_input->value("");
	file_input->value(file);
	chooser->Fl_Window::hide();
}

void btnOKCB2(Fl_Return_Button*, void*)
{
	const char* file = inputFileName->value();

	to_input->value("");
	to_input->value(file);
	chooser->Fl_Window::hide();
}
FileChooser
FileChooser選択パスの表示先がFILE/DIR欄に固定されていてTO欄が使えていない
修正後はボタン別に表示先を変えられるようになった
類似記事