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