示例#1
0
void FileDialog::update_file_list() {
	
	tree->clear();
	dir_access->list_dir_begin();
	
	TreeItem *root = tree->create_item();
	Ref<Texture> folder = get_icon("folder");
	List<String> files;
	List<String> dirs;
	
	bool isdir;
	bool ishidden;
	bool show_hidden = show_hidden_files;
	String item;

	while ((item=dir_access->get_next(&isdir))!="") {

		ishidden = dir_access->current_is_hidden();

		if (show_hidden || !ishidden) {
			if (!isdir)
				files.push_back(item);
			else
				dirs.push_back(item);
		}
	}
	
	dirs.sort_custom<NoCaseComparator>();
	files.sort_custom<NoCaseComparator>();
	
	while(!dirs.empty()) {
		
		if (dirs.front()->get()!=".") {
			TreeItem *ti=tree->create_item(root);
			ti->set_text(0,dirs.front()->get()+"/");
			ti->set_icon(0,folder);
			Dictionary d;
			d["name"]=dirs.front()->get();
			d["dir"]=true;
			ti->set_metadata(0,d);
		}
		dirs.pop_front();
		
	}
	
	dirs.clear();
	
	List<String> patterns;
	// build filter
	if (filter->get_selected()==filter->get_item_count()-1) {
		
		// match all 
	} else if (filters.size()>1 && filter->get_selected()==0) {
		// match all filters
		for (int i=0;i<filters.size();i++) {
			
			String f=filters[i].get_slice(";",0);
			for (int j=0;j<f.get_slice_count(",");j++) {
				
				patterns.push_back(f.get_slice(",",j).strip_edges());
			}
		}
	} else {
		int idx=filter->get_selected();
		if (filters.size()>1)
			idx--;
		
		if (idx>=0 && idx<filters.size()) {
			
			String f=filters[idx].get_slice(";",0);
			for (int j=0;j<f.get_slice_count(",");j++) {
				
				patterns.push_back(f.get_slice(",",j).strip_edges());
			}		
		}
	}


	String base_dir = dir_access->get_current_dir();
		
	
	while(!files.empty()) {
		
		bool match=patterns.empty();
		
		for(List<String>::Element *E=patterns.front();E;E=E->next()) {
			
			if (files.front()->get().matchn(E->get())) {
				
				match=true;
				break;
			}
		}
		
		if (match) {
			TreeItem *ti=tree->create_item(root);
			ti->set_text(0,files.front()->get());

			if (get_icon_func) {

				Ref<Texture> icon = get_icon_func(base_dir.plus_file(files.front()->get()));
				ti->set_icon(0,icon);
			}

			if (mode==MODE_OPEN_DIR) {
				ti->set_custom_color(0,get_color("files_disabled"));
				ti->set_selectable(0,false);
			}
			Dictionary d;
			d["name"]=files.front()->get();
			d["dir"]=false;
			ti->set_metadata(0,d);
			
			if (file->get_text()==files.front()->get())
				ti->select(0);
		}
		
		files.pop_front();
	}
	
	if (tree->get_root() && tree->get_root()->get_children())
		tree->get_root()->get_children()->select(0);
	
	files.clear();
	
}
void EditorFileDialog::update_file_list() {


	int thumbnail_size = EditorSettings::get_singleton()->get("file_dialog/thumbnail_size");
	Ref<Texture> folder_thumbnail;
	Ref<Texture> file_thumbnail;

	item_list->clear();

	if (display_mode==DISPLAY_THUMBNAILS) {

		item_list->set_max_columns(0);
		item_list->set_icon_mode(ItemList::ICON_MODE_TOP);
		item_list->set_fixed_column_width(thumbnail_size*3/2);
		item_list->set_max_text_lines(2);
		item_list->set_min_icon_size(Size2(thumbnail_size,thumbnail_size));

		if (!has_icon("ResizedFolder","EditorIcons")) {
			Ref<ImageTexture> folder = get_icon("FolderBig","EditorIcons");
			Image img = folder->get_data();
			img.resize(thumbnail_size,thumbnail_size);
			Ref<ImageTexture> resized_folder = Ref<ImageTexture>( memnew( ImageTexture));
			resized_folder->create_from_image(img,0);
			Theme::get_default()->set_icon("ResizedFolder","EditorIcons",resized_folder);
		}

		folder_thumbnail = get_icon("ResizedFolder","EditorIcons");

		if (!has_icon("ResizedFile","EditorIcons")) {
			Ref<ImageTexture> file = get_icon("FileBig","EditorIcons");
			Image img = file->get_data();
			img.resize(thumbnail_size,thumbnail_size);
			Ref<ImageTexture> resized_file = Ref<ImageTexture>( memnew( ImageTexture));
			resized_file->create_from_image(img,0);
			Theme::get_default()->set_icon("ResizedFile","EditorIcons",resized_file);
		}

		file_thumbnail = get_icon("ResizedFile","EditorIcons");

		preview_vb->hide();

	} else {

		item_list->set_icon_mode(ItemList::ICON_MODE_LEFT);
		item_list->set_max_columns(1);
		item_list->set_max_text_lines(1);
		item_list->set_fixed_column_width(0);
		item_list->set_min_icon_size(Size2());
		if (preview->get_texture().is_valid())
			preview_vb->show();

	}

	String cdir = dir_access->get_current_dir();
	bool skip_pp = access==ACCESS_RESOURCES && cdir=="res://";

	dir_access->list_dir_begin();


	Ref<Texture> folder = get_icon("folder","FileDialog");
	List<String> files;
	List<String> dirs;

	bool isdir;
	bool ishidden;
	bool show_hidden = show_hidden_files;
	String item;

	while ((item=dir_access->get_next(&isdir))!="") {

		ishidden = dir_access->current_is_hidden();

		if (show_hidden || !ishidden) {
			if (!isdir)
				files.push_back(item);
			else if (item!=".." || !skip_pp)
				dirs.push_back(item);
		}
	}

	dirs.sort_custom<NoCaseComparator>();
	files.sort_custom<NoCaseComparator>();

	while(!dirs.empty()) {

		if (dirs.front()->get()!=".") {
			item_list->add_item(dirs.front()->get()+"/");
			if (display_mode==DISPLAY_THUMBNAILS) {

				item_list->set_item_icon(item_list->get_item_count()-1,folder_thumbnail);
			} else {

				item_list->set_item_icon(item_list->get_item_count()-1,folder);
			}

			Dictionary d;
			d["name"]=dirs.front()->get();
			d["path"]=String();
			d["dir"]=true;
			item_list->set_item_metadata( item_list->get_item_count() -1, d);
		}
		dirs.pop_front();

	}

	dirs.clear();

	List<String> patterns;
	// build filter
	if (filter->get_selected()==filter->get_item_count()-1) {

		// match all
	} else if (filters.size()>1 && filter->get_selected()==0) {
		// match all filters
		for (int i=0;i<filters.size();i++) {

			String f=filters[i].get_slice(";",0);
			for (int j=0;j<f.get_slice_count(",");j++) {

				patterns.push_back(f.get_slice(",",j).strip_edges());
			}
		}
	} else {
		int idx=filter->get_selected();
		if (filters.size()>1)
			idx--;

		if (idx>=0 && idx<filters.size()) {

			String f=filters[idx].get_slice(";",0);
			for (int j=0;j<f.get_slice_count(",");j++) {

				patterns.push_back(f.get_slice(",",j).strip_edges());
			}
		}
	}


	String base_dir = dir_access->get_current_dir();


	while(!files.empty()) {

		bool match=patterns.empty();

		for(List<String>::Element *E=patterns.front();E;E=E->next()) {

			if (files.front()->get().matchn(E->get())) {

				match=true;
				break;
			}
		}

		if (match) {
			//TreeItem *ti=tree->create_item(root);
			//ti->set_text(0,files.front()->get());
			item_list->add_item(files.front()->get());

			if (get_icon_func) {


				Ref<Texture> icon = get_icon_func(base_dir.plus_file(files.front()->get()));
				//ti->set_icon(0,icon);
				if (display_mode==DISPLAY_THUMBNAILS) {

					item_list->set_item_icon(item_list->get_item_count()-1,file_thumbnail);
					item_list->set_item_tag_icon(item_list->get_item_count()-1,icon);
				} else {
					item_list->set_item_icon(item_list->get_item_count()-1,icon);
				}
			}

			if (mode==MODE_OPEN_DIR) {
				//disabled mode?
				//ti->set_custom_color(0,get_color("files_disabled"));
				//ti->set_selectable(0,false);
			}
			Dictionary d;
			d["name"]=files.front()->get();
			d["dir"]=false;
			String fullpath = base_dir.plus_file(files.front()->get());

			if (display_mode==DISPLAY_THUMBNAILS) {
				EditorResourcePreview::get_singleton()->queue_resource_preview(fullpath,this,"_thumbnail_result",fullpath);
			}
			d["path"]=base_dir.plus_file(files.front()->get());
			//ti->set_metadata(0,d);
			item_list->set_item_metadata(item_list->get_item_count()-1,d);

			if (file->get_text()==files.front()->get())
				item_list->set_current(item_list->get_item_count()-1);
		}

		files.pop_front();
	}

	if (favorites->get_current()>=0) {
		favorites->unselect(favorites->get_current());
	}

	favorite->set_pressed(false);
	fav_up->set_disabled(true);
	fav_down->set_disabled(true);
	for(int i=0;i<favorites->get_item_count();i++) {
		if (favorites->get_item_metadata(i)==base_dir) {
			favorites->select(i);
			favorite->set_pressed(true);
			if (i>0) {
				fav_up->set_disabled(false);
			}
			if (i<favorites->get_item_count()-1) {
				fav_down->set_disabled(false);
			}
			break;
		}

	}
	// ??
	//if (tree->get_root() && tree->get_root()->get_children())
	//	tree->get_root()->get_children()->select(0);

	files.clear();

}