[C++] 127 FLTK : FileChooserの作成 複数ファイル削除

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

前回記事のコードでは複数ファイル削除に対応していなかったので修正しました。

C/C++ではメモリアドレスの使い回しがデフォルトなのでvectorを作成しても全ての要素が最後にpush_backしたものに上書きされます。これを回避するには都度new演算子でヒープ領域を確保しコピーする必要があります。

今回の方法ではクリックしたファイルしか削除できないため、shiftキーで範囲選択しても最初と最後以外のファイルは削除されずに残ります。

おそらくFl_File_Browserのメンバ関数を使えばウィジェットのデータあるいはユーザデータとして全選択ファイルパスのリストを作成できるかと思います。これは手間取りそうなので気が向いたら考えます。

#include <FileChooser.h>
#include <FileChooser2.h>
#include <btnAction.h>

int BrowserType;
char pathname[FL_PATH_MAX]; // ホームディレクトリ格納
char pathname2[FL_PATH_MAX]; // 選択ファイルパス格納
vector<const char*> filepaths; // 複数選択ファイルパス格納

void fileListShow(const char* dirname)
{	
	// 設定ディレクトリの読込&全ファイル表示
	FileBrowser->load(dirname);

	// 設定ディレクトリの絶対パス表示
	fl_filename_absolute(pathname, sizeof(pathname), dirname);
	cout << "pathname " << pathname << endl;

	inputFileName->value(dirname);
}

void BrowserTypeSet(int t) {
	cout << "int t " << t << endl;

	BrowserType = t;
	if (t == FileChooser::MULTI){
		filepaths.clear();
		FileBrowser->type(FL_MULTI_BROWSER);
	}else{
		FileBrowser->type(FL_HOLD_BROWSER);
	}

	if (t == FileChooser::CREATE){
		btnNew->activate();
	}else{
		btnNew->deactivate();
	}

	if (t == FileChooser::DIRECTORY){
		FileBrowser->filetype(Fl_File_Browser::DIRECTORIES);
	}else{
		FileBrowser->filetype(Fl_File_Browser::FILES);
	}
}

void FileBrowserCB()
{
	char *filename;
	char* name;

	// クリックしたファイルのファイル名を取得
	filename = (char *)FileBrowser->Fl_Browser::text(FileBrowser->Fl_Browser::value());
	cout << "filename " << filename << endl; 
	
	if (!filename) return;

	pathname2[0] = '\0';

	// ディレクトリ名にファイル名を結合
	strcat(pathname2 ,pathname);
	strcat(pathname2 ,"/");
	strcat(pathname2 ,filename);

	// 削除を選択してFL_MULTI_BROWSERになっている場合はヒープ領域を確保してコピーする
	if (BrowserType == 1) {
		char* name = new char[strlen(pathname2) + 1];
    	strcpy(name, pathname2);
		filepaths.push_back(name);
	}

	cout << "pathname " << pathname2 << endl; 

	//ファイルパスを表示
	inputFileName->value("");
	inputFileName->value(pathname2);

}

void btnOKCB(Fl_Return_Button*, void*)
{
	// FileChooserを閉じる
	chooser->Fl_Window::hide();
}