65,187
社区成员




#include <nana/gui/wvl.hpp>
#include <nana/gui/widgets/treebox.hpp>
#include <nana/filesystem/file_iterator.hpp>
typedef nana::gui::treebox<int> treebox_t;
class treebox_trigger
: public treebox_t::event_trigger_type
{
public:
treebox_trigger(treebox_t &tbox)
: treebox_(tbox)
{}
void expand(nana::gui::widget &widget, node_type node, bool exp)
{
if(!exp) return; //如果没有展开则退出
nana::string path = treebox_.make_key_path(node, STR("/")) + STR("/");
//遍历path目录下的子目录
nana::filesystem::file_iterator i(path), end;
for(; i != end; ++i)
{
if(false == i->directory) continue; //不是文件夹,跳过。
node_type child = treebox_.insert(node, i->name, i->name, 0);
if(0 == child) continue;
//继续在子文件夹中遍历,如果该子目录下找到文件夹,就将该文件夹插入到child项中,
//这样child项的前面就会出现一个箭头,表示该目录可以展开并显示其中的子目录。
nana::filesystem::file_iterator u(path + i->name);
for(; u != end; ++u)
{
if(false == u->directory) continue; //不是目录这跳过。
treebox_.insert(child, u->name, u->name, 0);
break; //跳出循环,只需要插入一个用来表示该目录下还包含有目录。
}
}
}
private:
treebox_t &treebox_;
};
int main()
{
using namespace nana::gui;
form fm(API::make_center(300, 300),
appear::decorate<appear::taskbar, appear::sizable>());
fm.caption(STR("Nana C++ Library - Treebox Sample."));
treebox_t tbox(fm, 0, 0, 300, 300);
#if defined(NANA_WINDOWS)
treebox_t::node_type node = tbox.insert(STR("C:"), STR("Local Drive(C:)"), 0);
nana::filesystem::file_iterator i(STR("C:\\")), end;
#elif defined(NANA_LINUX)
treebox_t::node_type node = tbox.insert(STR("/"), STR("Root/"), 0);
nana::filesystem::file_iterator i(STR("/")), end;
#endif
for(; i != end; ++i)
{
if(false == i->directory) continue;
tbox.insert(node, i->name, i->name, 0);
break;
}
treebox_trigger tt(tbox);
tbox.event_trigger(tt);
fm.show();
exec();
}