1
0
mirror of https://github.com/wolfpld/tracy.git synced 2025-03-20 07:40:02 +08:00
tracy/nfd/nfd_haiku.cpp
Jorge Acereda 85f14314d0 Filtering
2024-02-27 23:59:10 +01:00

81 lines
2.1 KiB
C++

#include "nfd.h"
#include <FilePanel.h>
#include <Window.h>
#include <Path.h>
#include <string.h>
nfdresult_t NFD_Init(void) {
return NFD_OKAY;
}
void NFD_Quit(void) {}
static nfdresult_t dialog(BFilePanel &p, nfdnchar_t **outPath,
const nfdnfilteritem_t *filterList,
nfdfiltersize_t filterCount) {
p.Show();
while (p.IsShowing())
usleep(100000);
entry_ref sel;
if (p.GetNextSelectedRef(&sel) == B_OK) {
BEntry e(&sel);
BPath path;
if (e.GetPath(&path) == B_OK) {
outPath[0] = strdup(path.Path());
return NFD_OKAY;
}
}
return NFD_CANCEL;
}
class NFDFilter : public BRefFilter {
const nfdnfilteritem_t * _filter;
nfdfiltersize_t _count;
public:
NFDFilter(const nfdnfilteritem_t *filterList, nfdfiltersize_t filterCount)
: _filter(filterList)
, _count(filterCount) {}
bool Filter(const entry_ref *ref, BNode *node, struct stat_beos *stat,
const char *mimeType) override {
BString name(ref->name);
if (node->IsDirectory())
return true;
for (auto i = 0; i < _count; i++)
if (name.EndsWith(_filter[0].spec))
return true;
return false;
}
};
nfdresult_t
NFD_OpenDialogN(nfdnchar_t **outPath, const nfdnfilteritem_t *filterList,
nfdfiltersize_t filterCount, const nfdnchar_t *defaultPath) {
NFDFilter f(filterList, filterCount);
BFilePanel p(B_OPEN_PANEL, NULL, NULL, 0, false, NULL, &f, true, true);
p.Window()->SetTitle(filterList[0].name);
if (defaultPath)
p.SetPanelDirectory(defaultPath);
return dialog(p, outPath, filterList, filterCount);
}
nfdresult_t NFD_SaveDialogN(nfdnchar_t** outPath,
const nfdnfilteritem_t* filterList,
nfdfiltersize_t filterCount,
const nfdnchar_t* defaultPath,
const nfdnchar_t* defaultName) {
NFDFilter f(filterList, filterCount);
BFilePanel p(B_SAVE_PANEL, NULL, NULL, 0, false, NULL, &f, true, true);
p.Window()->SetTitle(filterList[0].name);
if (defaultPath)
p.SetPanelDirectory(defaultPath);
if (defaultName)
p.SetSaveText(defaultName);
return dialog(p, outPath, filterList, filterCount);
}
void NFD_FreePathN(nfdnchar_t* filePath) {
free(filePath);
}