[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();
}