void EditorFileSystem::scan_sources() { if (scanning || scanning_sources|| thread) return; sources_changed.clear(); scanning_sources=true; scanning_sources_done=false; abort_scan=false; if (!use_threads) { if (filesystem) { EditorProgressBG pr("sources","ScanSources",1000); ScanProgress sp; sp.progress=≺ sp.hi=1; sp.low=0; scan_total=0; _scan_fs_changes(filesystem,sp); if (_update_scan_actions()) emit_signal("filesystem_changed"); } scanning_sources=false; scanning_sources_done=true; emit_signal("sources_changed",sources_changed.size()>0); } else { ERR_FAIL_COND(thread_sources); set_process(true); scan_total=0; Thread::Settings s; s.priority=Thread::PRIORITY_LOW; thread_sources = Thread::create(_thread_func_sources,this,s); //tree->hide(); //print_line("SCAN BEGIN!"); //progress->show(); } }
void EditorFileSystem::scan() { if (bool(Globals::get_singleton()->get("debug/disable_scan"))) return; if (scanning || scanning_sources|| thread) return; abort_scan=false; if (!use_threads) { scanning=true; scan_total=0; _scan_filesystem(); if (filesystem) memdelete(filesystem); // file_type_cache.clear(); filesystem=new_filesystem; new_filesystem=NULL; _update_scan_actions(); scanning=false; emit_signal("filesystem_changed"); emit_signal("sources_changed",sources_changed.size()>0); } else { ERR_FAIL_COND(thread); set_process(true); Thread::Settings s; scanning=true; scan_total=0; s.priority=Thread::PRIORITY_LOW; thread = Thread::create(_thread_func,this,s); //tree->hide(); //progress->show(); } }
void EditorFileSystem::_notification(int p_what) { switch(p_what) { case NOTIFICATION_ENTER_TREE: { scan(); } break; case NOTIFICATION_EXIT_TREE: { if (use_threads && thread) { //abort thread if in progress abort_scan=true; while(scanning) { OS::get_singleton()->delay_usec(1000); } Thread::wait_to_finish(thread); memdelete(thread); thread=NULL; WARN_PRINT("Scan thread aborted..."); set_process(false); } if (filesystem) memdelete(filesystem); if (new_filesystem) memdelete(new_filesystem); filesystem=NULL; new_filesystem=NULL; } break; case NOTIFICATION_PROCESS: { if (use_threads) { if (scanning_sources) { if (scanning_sources_done) { scanning_sources=false; set_process(false); Thread::wait_to_finish(thread_sources); memdelete(thread_sources); thread_sources=NULL; if (_update_scan_actions()) emit_signal("filesystem_changed"); //print_line("sources changed: "+itos(sources_changed.size())); emit_signal("sources_changed",sources_changed.size()>0); } } else if (!scanning) { set_process(false); if (filesystem) memdelete(filesystem); filesystem=new_filesystem; new_filesystem=NULL; Thread::wait_to_finish(thread); memdelete(thread); thread=NULL; _update_scan_actions(); emit_signal("filesystem_changed"); emit_signal("sources_changed",sources_changed.size()>0); //print_line("initial sources changed: "+itos(sources_changed.size())); } else { //progress->set_text("Scanning...\n"+itos(total*100)+"%"); } } } break; } }
void EditorFileSystem::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: { call_deferred("scan"); //this should happen after every editor node entered the tree } break; case NOTIFICATION_EXIT_TREE: { if (use_threads && thread) { //abort thread if in progress abort_scan = true; while (scanning) { OS::get_singleton()->delay_usec(1000); } Thread::wait_to_finish(thread); memdelete(thread); thread = NULL; WARN_PRINTS("Scan thread aborted..."); set_process(false); } if (filesystem) memdelete(filesystem); if (new_filesystem) memdelete(new_filesystem); filesystem = NULL; new_filesystem = NULL; } break; case NOTIFICATION_PROCESS: { if (use_threads) { if (scanning_changes) { if (scanning_changes_done) { scanning_changes = false; set_process(false); Thread::wait_to_finish(thread_sources); memdelete(thread_sources); thread_sources = NULL; if (_update_scan_actions()) emit_signal("filesystem_changed"); emit_signal("sources_changed", sources_changed.size() > 0); } } else if (!scanning) { set_process(false); if (filesystem) memdelete(filesystem); filesystem = new_filesystem; new_filesystem = NULL; Thread::wait_to_finish(thread); memdelete(thread); thread = NULL; _update_scan_actions(); emit_signal("filesystem_changed"); emit_signal("sources_changed", sources_changed.size() > 0); } } } break; } }