diff options
Diffstat (limited to 'scene/gui/file_dialog.cpp')
| -rw-r--r-- | scene/gui/file_dialog.cpp | 183 |
1 files changed, 104 insertions, 79 deletions
diff --git a/scene/gui/file_dialog.cpp b/scene/gui/file_dialog.cpp index 705ce55d4..393f14bee 100644 --- a/scene/gui/file_dialog.cpp +++ b/scene/gui/file_dialog.cpp @@ -5,7 +5,7 @@ /* GODOT ENGINE */ /* http://www.godotengine.org */ /*************************************************************************/ -/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ /* */ /* Permission is hereby granted, free of charge, to any person obtaining */ /* a copy of this software and associated documentation files (the */ @@ -164,7 +164,7 @@ void FileDialog::_action_pressed() { TreeItem *ti=tree->get_next_selected(NULL); String fbase=dir_access->get_current_dir(); - DVector<String> files; + PoolVector<String> files; while(ti) { files.push_back( fbase.plus_file(ti->get_text(0)) ); @@ -186,15 +186,17 @@ void FileDialog::_action_pressed() { hide(); }else if (mode==MODE_OPEN_ANY || mode==MODE_OPEN_DIR) { - String path=dir_access->get_current_dir(); - /*if (tree->get_selected()) { - Dictionary d = tree->get_selected()->get_metadata(0); + + path=path.replace("\\","/"); + + if (TreeItem* item = tree->get_selected()) { + Dictionary d = item->get_metadata(0); if (d["dir"]) { - path=path+"/"+String(d["name"]); + path=path.plus_file(d["name"]); } - }*/ - path=path.replace("\\","/"); + } + emit_signal("dir_selected",path); hide(); } @@ -258,7 +260,7 @@ void FileDialog::_action_pressed() { } if (dir_access->file_exists(f)) { - confirm_save->set_text("File Exists, Overwrite?"); + confirm_save->set_text(RTR("File Exists, Overwrite?")); confirm_save->popup_centered(Size2(200,80)); } else { @@ -339,22 +341,27 @@ void FileDialog::update_file_list() { } } + if (dirs.find("..")==NULL) { + //may happen if lacking permissions + dirs.push_back(".."); + } + dirs.sort_custom<NoCaseComparator>(); files.sort_custom<NoCaseComparator>(); while(!dirs.empty()) { + String& dir_name = dirs.front()->get(); + TreeItem *ti=tree->create_item(root); + ti->set_text(0,dir_name+"/"); + ti->set_icon(0,folder); - 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(); + Dictionary d; + d["name"]=dir_name; + d["dir"]=true; + + ti->set_metadata(0,d); + dirs.pop_front(); } dirs.clear(); @@ -396,11 +403,12 @@ void FileDialog::update_file_list() { while(!files.empty()) { bool match=patterns.empty(); + String match_str; for(List<String>::Element *E=patterns.front();E;E=E->next()) { if (files.front()->get().matchn(E->get())) { - + match_str=E->get(); match=true; break; } @@ -425,14 +433,14 @@ void FileDialog::update_file_list() { d["dir"]=false; ti->set_metadata(0,d); - if (file->get_text()==files.front()->get()) + if (file->get_text()==files.front()->get() || match_str==files.front()->get()) ti->select(0); } files.pop_front(); } - if (tree->get_root() && tree->get_root()->get_children()) + if (tree->get_root() && tree->get_root()->get_children() && tree->get_selected()==NULL) tree->get_root()->get_children()->select(0); files.clear(); @@ -463,19 +471,19 @@ void FileDialog::update_filters() { if (max_filters<filters.size()) all_filters+=", ..."; - filter->add_item("All Recognized ( "+all_filters+" )"); + filter->add_item(RTR("All Recognized")+" ( "+all_filters+" )"); } for(int i=0;i<filters.size();i++) { String flt=filters[i].get_slice(";",0).strip_edges(); String desc=filters[i].get_slice(";",1).strip_edges(); if (desc.length()) - filter->add_item(desc+" ( "+flt+" )"); + filter->add_item(String(XL_MESSAGE(desc))+" ( "+flt+" )"); else filter->add_item("( "+flt+" )"); } - filter->add_item("All Files (*)"); + filter->add_item(RTR("All Files (*)")); } @@ -493,6 +501,16 @@ void FileDialog::add_filter(const String& p_filter) { } +void FileDialog::set_filters(const Vector<String>& p_filters){ + filters=p_filters; + update_filters(); + invalidate(); +} + +Vector<String> FileDialog::get_filters() const{ + return filters; +} + String FileDialog::get_current_dir() const { return dir->get_text(); @@ -548,11 +566,11 @@ void FileDialog::set_mode(Mode p_mode) { mode=p_mode; switch(mode) { - case MODE_OPEN_FILE: get_ok()->set_text("Open"); set_title("Open a File"); makedir->hide(); break; - case MODE_OPEN_FILES: get_ok()->set_text("Open"); set_title("Open File(s)"); makedir->hide(); break; - case MODE_OPEN_DIR: get_ok()->set_text("Open"); set_title("Open a Directory"); makedir->show(); break; - case MODE_OPEN_ANY: get_ok()->set_text("Open"); set_title("Open a File or Directory"); makedir->show(); break; - case MODE_SAVE_FILE: get_ok()->set_text("Save"); set_title("Save a File"); makedir->show(); break; + case MODE_OPEN_FILE: get_ok()->set_text(RTR("Open")); set_title(RTR("Open a File")); makedir->hide(); break; + case MODE_OPEN_FILES: get_ok()->set_text(RTR("Open")); set_title(RTR("Open File(s)")); makedir->hide(); break; + case MODE_OPEN_DIR: get_ok()->set_text(RTR("Open")); set_title(RTR("Open a Directory")); makedir->show(); break; + case MODE_OPEN_ANY: get_ok()->set_text(RTR("Open")); set_title(RTR("Open a File or Directory")); makedir->show(); break; + case MODE_SAVE_FILE: get_ok()->set_text(RTR("Save")); set_title(RTR("Save a File")); makedir->show(); break; } if (mode==MODE_OPEN_FILES) { @@ -597,7 +615,7 @@ void FileDialog::set_access(Access p_access) { void FileDialog::invalidate() { - if (is_visible()) { + if (is_visible_in_tree()) { update_file_list(); invalidated=false; } else { @@ -668,42 +686,44 @@ bool FileDialog::default_show_hidden_files=false; void FileDialog::_bind_methods() { - ObjectTypeDB::bind_method(_MD("_unhandled_input"),&FileDialog::_unhandled_input); + ClassDB::bind_method(_MD("_unhandled_input"),&FileDialog::_unhandled_input); - ObjectTypeDB::bind_method(_MD("_tree_selected"),&FileDialog::_tree_selected); - ObjectTypeDB::bind_method(_MD("_tree_db_selected"),&FileDialog::_tree_dc_selected); - ObjectTypeDB::bind_method(_MD("_dir_entered"),&FileDialog::_dir_entered); - ObjectTypeDB::bind_method(_MD("_file_entered"),&FileDialog::_file_entered); - ObjectTypeDB::bind_method(_MD("_action_pressed"),&FileDialog::_action_pressed); - ObjectTypeDB::bind_method(_MD("_cancel_pressed"),&FileDialog::_cancel_pressed); - ObjectTypeDB::bind_method(_MD("_filter_selected"),&FileDialog::_filter_selected); - ObjectTypeDB::bind_method(_MD("_save_confirm_pressed"),&FileDialog::_save_confirm_pressed); + ClassDB::bind_method(_MD("_tree_selected"),&FileDialog::_tree_selected); + ClassDB::bind_method(_MD("_tree_db_selected"),&FileDialog::_tree_dc_selected); + ClassDB::bind_method(_MD("_dir_entered"),&FileDialog::_dir_entered); + ClassDB::bind_method(_MD("_file_entered"),&FileDialog::_file_entered); + ClassDB::bind_method(_MD("_action_pressed"),&FileDialog::_action_pressed); + ClassDB::bind_method(_MD("_cancel_pressed"),&FileDialog::_cancel_pressed); + ClassDB::bind_method(_MD("_filter_selected"),&FileDialog::_filter_selected); + ClassDB::bind_method(_MD("_save_confirm_pressed"),&FileDialog::_save_confirm_pressed); - ObjectTypeDB::bind_method(_MD("clear_filters"),&FileDialog::clear_filters); - ObjectTypeDB::bind_method(_MD("add_filter","filter"),&FileDialog::add_filter); - ObjectTypeDB::bind_method(_MD("get_current_dir"),&FileDialog::get_current_dir); - ObjectTypeDB::bind_method(_MD("get_current_file"),&FileDialog::get_current_file); - ObjectTypeDB::bind_method(_MD("get_current_path"),&FileDialog::get_current_path); - ObjectTypeDB::bind_method(_MD("set_current_dir","dir"),&FileDialog::set_current_dir); - ObjectTypeDB::bind_method(_MD("set_current_file","file"),&FileDialog::set_current_file); - ObjectTypeDB::bind_method(_MD("set_current_path","path"),&FileDialog::set_current_path); - ObjectTypeDB::bind_method(_MD("set_mode","mode"),&FileDialog::set_mode); - ObjectTypeDB::bind_method(_MD("get_mode"),&FileDialog::get_mode); - ObjectTypeDB::bind_method(_MD("get_vbox:VBoxContainer"),&FileDialog::get_vbox); - ObjectTypeDB::bind_method(_MD("set_access","access"),&FileDialog::set_access); - ObjectTypeDB::bind_method(_MD("get_access"),&FileDialog::get_access); - ObjectTypeDB::bind_method(_MD("set_show_hidden_files","show"),&FileDialog::set_show_hidden_files); - ObjectTypeDB::bind_method(_MD("is_showing_hidden_files"),&FileDialog::is_showing_hidden_files); - ObjectTypeDB::bind_method(_MD("_select_drive"),&FileDialog::_select_drive); - ObjectTypeDB::bind_method(_MD("_make_dir"),&FileDialog::_make_dir); - ObjectTypeDB::bind_method(_MD("_make_dir_confirm"),&FileDialog::_make_dir_confirm); - ObjectTypeDB::bind_method(_MD("_update_file_list"),&FileDialog::update_file_list); - ObjectTypeDB::bind_method(_MD("_update_dir"),&FileDialog::update_dir); + ClassDB::bind_method(_MD("clear_filters"),&FileDialog::clear_filters); + ClassDB::bind_method(_MD("add_filter","filter"),&FileDialog::add_filter); + ClassDB::bind_method(_MD("set_filters","filters"),&FileDialog::set_filters); + ClassDB::bind_method(_MD("get_filters"),&FileDialog::get_filters); + ClassDB::bind_method(_MD("get_current_dir"),&FileDialog::get_current_dir); + ClassDB::bind_method(_MD("get_current_file"),&FileDialog::get_current_file); + ClassDB::bind_method(_MD("get_current_path"),&FileDialog::get_current_path); + ClassDB::bind_method(_MD("set_current_dir","dir"),&FileDialog::set_current_dir); + ClassDB::bind_method(_MD("set_current_file","file"),&FileDialog::set_current_file); + ClassDB::bind_method(_MD("set_current_path","path"),&FileDialog::set_current_path); + ClassDB::bind_method(_MD("set_mode","mode"),&FileDialog::set_mode); + ClassDB::bind_method(_MD("get_mode"),&FileDialog::get_mode); + ClassDB::bind_method(_MD("get_vbox:VBoxContainer"),&FileDialog::get_vbox); + ClassDB::bind_method(_MD("set_access","access"),&FileDialog::set_access); + ClassDB::bind_method(_MD("get_access"),&FileDialog::get_access); + ClassDB::bind_method(_MD("set_show_hidden_files","show"),&FileDialog::set_show_hidden_files); + ClassDB::bind_method(_MD("is_showing_hidden_files"),&FileDialog::is_showing_hidden_files); + ClassDB::bind_method(_MD("_select_drive"),&FileDialog::_select_drive); + ClassDB::bind_method(_MD("_make_dir"),&FileDialog::_make_dir); + ClassDB::bind_method(_MD("_make_dir_confirm"),&FileDialog::_make_dir_confirm); + ClassDB::bind_method(_MD("_update_file_list"),&FileDialog::update_file_list); + ClassDB::bind_method(_MD("_update_dir"),&FileDialog::update_dir); - ObjectTypeDB::bind_method(_MD("invalidate"),&FileDialog::invalidate); + ClassDB::bind_method(_MD("invalidate"),&FileDialog::invalidate); ADD_SIGNAL(MethodInfo("file_selected",PropertyInfo( Variant::STRING,"path"))); - ADD_SIGNAL(MethodInfo("files_selected",PropertyInfo( Variant::STRING_ARRAY,"paths"))); + ADD_SIGNAL(MethodInfo("files_selected",PropertyInfo( Variant::POOL_STRING_ARRAY,"paths"))); ADD_SIGNAL(MethodInfo("dir_selected",PropertyInfo( Variant::STRING,"dir"))); BIND_CONSTANT( MODE_OPEN_FILE ); @@ -717,6 +737,11 @@ void FileDialog::_bind_methods() { BIND_CONSTANT( ACCESS_USERDATA ); BIND_CONSTANT( ACCESS_FILESYSTEM ); + ADD_PROPERTY( PropertyInfo(Variant::INT, "mode", PROPERTY_HINT_ENUM, "Open one,Open many,Open folder,Open any,Save"),_SCS("set_mode"),_SCS("get_mode") ); + ADD_PROPERTY( PropertyInfo(Variant::INT, "access", PROPERTY_HINT_ENUM, "Resources,User data,File system"),_SCS("set_access"),_SCS("get_access") ); + ADD_PROPERTY( PropertyInfo(Variant::POOL_STRING_ARRAY, "filters"),_SCS("set_filters"),_SCS("get_filters") ); + ADD_PROPERTY( PropertyInfo(Variant::BOOL, "show_hidden_files"),_SCS("set_show_hidden_files"),_SCS("is_showing_hidden_files") ); + } @@ -739,10 +764,10 @@ FileDialog::FileDialog() { VBoxContainer *vbc = memnew( VBoxContainer ); add_child(vbc); - set_child_rect(vbc); + mode=MODE_SAVE_FILE; - set_title("Save a File"); + set_title(RTR("Save a File")); dir = memnew(LineEdit); HBoxContainer *pathhb = memnew( HBoxContainer ); @@ -758,24 +783,24 @@ FileDialog::FileDialog() { drives->connect("item_selected",this,"_select_drive"); makedir = memnew( Button ); - makedir->set_text("Create Folder"); + makedir->set_text(RTR("Create Folder")); makedir->connect("pressed",this,"_make_dir"); pathhb->add_child(makedir); - vbc->add_margin_child("Path:",pathhb); + vbc->add_margin_child(RTR("Path:"),pathhb); tree = memnew(Tree); tree->set_hide_root(true); - vbc->add_margin_child("Directories & Files:",tree,true); + vbc->add_margin_child(RTR("Directories & Files:"),tree,true); file = memnew(LineEdit); //add_child(file); - vbc->add_margin_child("File:",file); + vbc->add_margin_child(RTR("File:"),file); filter = memnew( OptionButton ); //add_child(filter); - vbc->add_margin_child("Filter:",filter); + vbc->add_margin_child(RTR("Filter:"),filter); filter->set_clip_text(true);//too many extensions overflow it dir_access = DirAccess::create(DirAccess::ACCESS_RESOURCES); @@ -800,21 +825,21 @@ FileDialog::FileDialog() { confirm_save->connect("confirmed", this,"_save_confirm_pressed"); makedialog = memnew( ConfirmationDialog ); - makedialog->set_title("Create Folder"); + makedialog->set_title(RTR("Create Folder")); VBoxContainer *makevb= memnew( VBoxContainer ); makedialog->add_child(makevb); - makedialog->set_child_rect(makevb); + makedirname = memnew( LineEdit ); - makevb->add_margin_child("Name:",makedirname); + makevb->add_margin_child(RTR("Name:"),makedirname); add_child(makedialog); makedialog->register_text_enter(makedirname); makedialog->connect("confirmed",this,"_make_dir_confirm"); mkdirerr = memnew( AcceptDialog ); - mkdirerr->set_text("Could not create folder."); + mkdirerr->set_text(RTR("Could not create folder.")); add_child(mkdirerr); exterr = memnew( AcceptDialog ); - exterr->set_text("Must use a valid extension."); + exterr->set_text(RTR("Must use a valid extension.")); add_child(exterr); @@ -843,11 +868,11 @@ FileDialog::~FileDialog() { void LineEditFileChooser::_bind_methods() { - ObjectTypeDB::bind_method(_MD("_browse"),&LineEditFileChooser::_browse); - ObjectTypeDB::bind_method(_MD("_chosen"),&LineEditFileChooser::_chosen); - ObjectTypeDB::bind_method(_MD("get_button:Button"),&LineEditFileChooser::get_button); - ObjectTypeDB::bind_method(_MD("get_line_edit:LineEdit"),&LineEditFileChooser::get_line_edit); - ObjectTypeDB::bind_method(_MD("get_file_dialog:FileDialog"),&LineEditFileChooser::get_file_dialog); + ClassDB::bind_method(_MD("_browse"),&LineEditFileChooser::_browse); + ClassDB::bind_method(_MD("_chosen"),&LineEditFileChooser::_chosen); + ClassDB::bind_method(_MD("get_button:Button"),&LineEditFileChooser::get_button); + ClassDB::bind_method(_MD("get_line_edit:LineEdit"),&LineEditFileChooser::get_line_edit); + ClassDB::bind_method(_MD("get_file_dialog:FileDialog"),&LineEditFileChooser::get_file_dialog); } |
