本文整理汇总了C++中FileSystem::ScanDir方法的典型用法代码示例。如果您正苦于以下问题:C++ FileSystem::ScanDir方法的具体用法?C++ FileSystem::ScanDir怎么用?C++ FileSystem::ScanDir使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类FileSystem
的用法示例。
在下文中一共展示了FileSystem::ScanDir方法的14个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: RefreshFiles
void FileSelector::RefreshFiles()
{
FileSystem* fileSystem = GetSubsystem<FileSystem>();
ignoreEvents_ = true;
fileList_->RemoveAllItems();
fileEntries_.Clear();
Vector<String> directories;
Vector<String> files;
fileSystem->ScanDir(directories, path_, "*", SCAN_DIRS, false);
fileSystem->ScanDir(files, path_, GetFilter(), SCAN_FILES, false);
fileEntries_.Reserve(directories.Size() + files.Size());
for (unsigned i = 0; i < directories.Size(); ++i)
{
FileSelectorEntry newEntry;
newEntry.name_ = directories[i];
newEntry.directory_ = true;
fileEntries_.Push(newEntry);
}
for (unsigned i = 0; i < files.Size(); ++i)
{
FileSelectorEntry newEntry;
newEntry.name_ = files[i];
newEntry.directory_ = false;
fileEntries_.Push(newEntry);
}
// Sort and add to the list view
// While items are being added, disable layout update for performance optimization
Sort(fileEntries_.Begin(), fileEntries_.End(), CompareEntries);
UIElement* listContent = fileList_->GetContentElement();
listContent->DisableLayoutUpdate();
for (unsigned i = 0; i < fileEntries_.Size(); ++i)
{
String displayName;
if (fileEntries_[i].directory_)
displayName = "<DIR> " + fileEntries_[i].name_;
else
displayName = fileEntries_[i].name_;
Text* entryText = new Text(context_);
fileList_->AddItem(entryText);
entryText->SetText(displayName);
entryText->SetStyle("FileSelectorListText");
}
listContent->EnableLayoutUpdate();
listContent->UpdateLayout();
ignoreEvents_ = false;
// Clear filename from the previous dir so that there is no confusion
SetFileName(String::EMPTY);
lastUsedFilter_ = GetFilter();
}
示例2: PruneOrphanedDotAssetFiles
void AssetDatabase::PruneOrphanedDotAssetFiles()
{
if (project_.Null())
{
LOGDEBUG("AssetDatabase::PruneOrphanedDotAssetFiles - called without project loaded");
return;
}
FileSystem* fs = GetSubsystem<FileSystem>();
const String& resourcePath = project_->GetResourcePath();
Vector<String> allResults;
fs->ScanDir(allResults, resourcePath, "*.asset", SCAN_FILES, true);
for (unsigned i = 0; i < allResults.Size(); i++)
{
String dotAssetFilename = resourcePath + allResults[i];
String assetFilename = ReplaceExtension(dotAssetFilename, "");
// remove orphaned asset files
if (!fs->FileExists(assetFilename) && !fs->DirExists(assetFilename))
{
LOGINFOF("Removing orphaned asset file: %s", dotAssetFilename.CString());
fs->Delete(dotAssetFilename);
}
}
}
示例3: FileSystem_ScanDir
static int FileSystem_ScanDir(duk_context* ctx)
{
duk_push_this(ctx);
FileSystem* fs = js_to_class_instance<FileSystem>(ctx, -1, 0);
if ( !duk_is_string(ctx, 0) || !duk_is_string(ctx, 1) ||
!duk_is_number(ctx, 2) || !duk_is_boolean(ctx, 3))
{
duk_push_string(ctx, "FileSystem::ScanDir bad args");
duk_throw(ctx);
}
const char* pathName = duk_to_string(ctx, 0);
const char* filter = duk_to_string(ctx, 1);
unsigned flags = duk_to_number(ctx, 2);
bool recursive = duk_to_boolean(ctx, 3) ? true : false;
Vector<String> result;
fs->ScanDir(result, pathName, filter, flags, recursive);
duk_push_array(ctx);
for (unsigned i = 0; i < result.Size(); i++)
{
duk_push_string(ctx, result[i].CString());
duk_put_prop_index(ctx, -2, i);
}
return 1;
}
示例4: ScanHeaders
void JSBModule::ScanHeaders()
{
JSBind* jsbind = GetSubsystem<JSBind>();
FileSystem* fs = GetSubsystem<FileSystem>();
const String& sourceRoot = jsbind->GetSourceRootFolder();
for (unsigned i = 0; i < sourceDirs_.Size(); i++)
{
const String& dir = sourceRoot + sourceDirs_[i] + "/";
Vector<String> fileNames;
fs->ScanDir(fileNames, dir, "*.h", SCAN_FILES, false);
for (unsigned k = 0; k < fileNames.Size(); k++)
{
String filepath = dir + fileNames[k];
SharedPtr<JSBHeader> header(new JSBHeader(context_, this, filepath));
// Parse the C++ header
header->Parse();
headers_.Push(header);
}
}
}
示例5: BuildManaged
bool BuildWindows::BuildManaged(const String& buildPath)
{
ToolEnvironment* tenv = GetSubsystem<ToolEnvironment>();
ToolSystem* toolSystem = GetSubsystem<ToolSystem>();
FileSystem* fileSystem = GetSubsystem<FileSystem>();
Project* project = toolSystem->GetProject();
ProjectSettings* settings = project->GetProjectSettings();
String projectPath = project->GetProjectPath();
#ifdef ATOMIC_DEBUG
String config = "Debug";
#else
String config = "Release";
#endif
String managedBins = projectPath + ToString("AtomicNET/%s/Bin/Desktop/", config.CString());
String managedExe = managedBins + settings->GetName() + ".exe";
if (!fileSystem->FileExists(managedExe))
{
FailBuild(ToString("Error building managed project, please compile the %s binary %s before building", config.CString(), managedExe.CString()));
return false;
}
StringVector results;
StringVector filtered;
fileSystem->ScanDir(results, managedBins, "", SCAN_FILES, false);
StringVector filterList;
StringVector::Iterator itr = results.Begin();
while (itr != results.End())
{
unsigned i;
for (i = 0; i < filterList.Size(); i++)
{
if (itr->Contains(filterList[i]))
break;
}
if (i == filterList.Size())
filtered.Push(*itr);
itr++;
}
for (unsigned i = 0; i < filtered.Size(); i++)
{
String filename = filtered[i];
if (!BuildCopyFile(managedBins + filename, buildPath_ + "/" + filename))
return false;
}
return true;
}
示例6: ScanResourceDirectory
void BuildBase::ScanResourceDirectory(const String& resourceDir)
{
Vector<String> fileNames;
FileSystem* fileSystem = GetSubsystem<FileSystem>();
fileSystem->ScanDir(fileNames, resourceDir, "*.*", SCAN_FILES, true);
for (unsigned i = 0; i < fileNames.Size(); i++)
{
const String& filename = fileNames[i];
for (unsigned j = 0; j < resourceEntries_.Size(); j++)
{
const BuildResourceEntry* entry = resourceEntries_[j];
if (entry->packagePath_ == filename)
{
BuildWarn(ToString("Resource Path: %s already exists", filename.CString()));
continue;
}
}
// TODO: Add additional filters
if (GetExtension(filename) == ".psd")
continue;
BuildResourceEntry* newEntry = new BuildResourceEntry;
// BEGIN LICENSE MANAGEMENT
if (GetExtension(filename) == ".mdl")
{
containsMDL_ = true;
}
// END LICENSE MANAGEMENT
newEntry->absolutePath_ = resourceDir + filename;
newEntry->resourceDir_ = resourceDir;
if (resourceDir.EndsWith("/Cache/"))
newEntry->packagePath_ = "Cache/" + filename;
else
newEntry->packagePath_ = filename;
resourceEntries_.Push(newEntry);
//LOGINFOF("Adding resource: %s : %s", newEntry->absolutePath_.CString(), newEntry->packagePath_.CString());
}
}
示例7: PreloadClassAssemblies
bool CSComponentAssembly::PreloadClassAssemblies()
{
// TEMPORARY SOLUTION, Desktop only
ATOMIC_LOGINFO("Preloading Class Assemblies");
Context* context = ScriptSystem::GetContext();
assert(context);
ResourceCache* cache = context->GetSubsystem<ResourceCache>();
FileSystem* fileSystem = context->GetSubsystem<FileSystem>();
const StringVector& resourceDirs = cache->GetResourceDirs();
for (unsigned i = 0; i < resourceDirs.Size(); i++)
{
const String& resourceDir = resourceDirs[i];
ATOMIC_LOGINFOF("Scanning: %s", resourceDir.CString());
StringVector results;
fileSystem->ScanDir(results, resourceDir, "*.dll", SCAN_FILES, true);
for (unsigned j = 0; j < results.Size(); j++)
{
// FIXME: This filtering is necessary as we're loading setting project root folder as a resource dir
// https://github.com/AtomicGameEngine/AtomicGameEngine/issues/1037
String filter = results[j].ToLower();
if (filter.StartsWith("atomicnet/") || filter.StartsWith("resources/"))
{
ATOMIC_LOGINFOF("Skipping Assembly: %s (https://github.com/AtomicGameEngine/AtomicGameEngine/issues/1037)", results[j].CString());
continue;
}
ATOMIC_LOGINFOF("Loading Assembly: %s", results[j].CString());
cache->GetResource<CSComponentAssembly>(results[j]);
}
}
return true;
}
示例8: AddResourceDir
bool ResourceCache::AddResourceDir(const String& pathName)
{
FileSystem* fileSystem = GetSubsystem<FileSystem>();
if (!fileSystem || !fileSystem->DirExists(pathName))
{
LOGERROR("Could not open directory " + pathName);
return false;
}
String fixedPath = AddTrailingSlash(pathName);
// Check that the same path does not already exist
for (unsigned i = 0; i < resourceDirs_.Size(); ++i)
{
if (!resourceDirs_[i].Compare(fixedPath, false))
return true;
}
resourceDirs_.Push(fixedPath);
// Scan the path for files recursively and add their hash-to-name mappings
Vector<String> fileNames;
fileSystem->ScanDir(fileNames, fixedPath, "*.*", SCAN_FILES, true);
for (unsigned i = 0; i < fileNames.Size(); ++i)
StoreNameHash(fileNames[i]);
// If resource auto-reloading active, create a file watcher for the directory
if (autoReloadResources_)
{
SharedPtr<FileWatcher> watcher(new FileWatcher(context_));
watcher->StartWatching(fixedPath, true);
fileWatchers_.Push(watcher);
}
LOGINFO("Added resource path " + fixedPath);
return true;
}
示例9: Scan
void AssetDatabase::Scan()
{
PruneOrphanedDotAssetFiles();
FileSystem* fs = GetSubsystem<FileSystem>();
const String& resourcePath = project_->GetResourcePath();
Vector<String> allResults;
fs->ScanDir(allResults, resourcePath, "", SCAN_FILES | SCAN_DIRS, true);
Vector<String> filteredResults;
filteredResults.Push(RemoveTrailingSlash(resourcePath));
for (unsigned i = 0; i < allResults.Size(); i++)
{
allResults[i] = resourcePath + allResults[i];
const String& path = allResults[i];
if (path.StartsWith(".") || path.EndsWith("."))
continue;
String ext = GetExtension(path);
if (ext == ".asset")
continue;
filteredResults.Push(path);
}
for (unsigned i = 0; i < filteredResults.Size(); i++)
{
const String& path = filteredResults[i];
String dotAssetFilename = GetDotAssetFilename(path);
if (!fs->FileExists(dotAssetFilename))
{
// new asset
SharedPtr<Asset> asset(new Asset(context_));
if (asset->SetPath(path))
AddAsset(asset);
}
else
{
SharedPtr<File> file(new File(context_, dotAssetFilename));
SharedPtr<JSONFile> json(new JSONFile(context_));
json->Load(*file);
file->Close();
JSONValue root = json->GetRoot();
assert(root.Get("version").GetInt() == ASSET_VERSION);
String guid = root.Get("guid").GetString();
if (!GetAssetByGUID(guid))
{
SharedPtr<Asset> asset(new Asset(context_));
asset->SetPath(path);
AddAsset(asset);
}
}
}
PreloadAssets();
if (ImportDirtyAssets())
Scan();
}
示例10: ImportAnimations
bool ModelImporter::ImportAnimations()
{
if (!animationInfo_.Size())
{
if (!ImportAnimation(asset_->GetPath(), "RootAnim"))
return false;
}
// embedded animations
for (unsigned i = 0; i < animationInfo_.Size(); i++)
{
const SharedPtr<AnimationImportInfo>& info = animationInfo_[i];
if (!ImportAnimation(asset_->GetPath(), info->GetName(), info->GetStartTime(), info->GetEndTime()))
return false;
}
// add @ animations
FileSystem* fs = GetSubsystem<FileSystem>();
String pathName, fileName, ext;
SplitPath(asset_->GetPath(), pathName, fileName, ext);
Vector<String> results;
fs->ScanDir(results, pathName, ext, SCAN_FILES, false);
for (unsigned i = 0; i < results.Size(); i++)
{
const String& result = results[i];
if (result.Contains("@"))
{
Vector<String> components = GetFileName(result).Split('@');
if (components.Size() == 2 && components[1].Length() && components[0] == fileName)
{
String animationName = components[1];
AssetDatabase* db = GetSubsystem<AssetDatabase>();
Asset* asset = db->GetAssetByPath(pathName + result);
assert(asset);
assert(asset->GetImporter()->GetType() == ModelImporter::GetTypeStatic());
ModelImporter* importer = (ModelImporter*) asset->GetImporter();
if (!importer->animationInfo_.Size())
{
if (!ImportAnimation(asset->GetPath(), animationName))
return false;
}
else
{
// embedded animations
for (unsigned i = 0; i < importer->animationInfo_.Size(); i++)
{
const SharedPtr<AnimationImportInfo>& info = importer->animationInfo_[i];
if (!ImportAnimation(asset->GetPath(), info->GetName(), info->GetStartTime(), info->GetEndTime()))
return false;
}
}
}
}
}
return true;
}
示例11: Start
void AtomicTool::Start()
{
// Subscribe to events
SubscribeToEvent(E_COMMANDERROR, HANDLER(AtomicTool, HandleCommandError));
SubscribeToEvent(E_COMMANDFINISHED, HANDLER(AtomicTool, HandleCommandFinished));
SubscribeToEvent(E_LICENSE_EULAREQUIRED, HANDLER(AtomicTool, HandleLicenseEulaRequired));
SubscribeToEvent(E_LICENSE_ACTIVATIONREQUIRED, HANDLER(AtomicTool, HandleLicenseActivationRequired));
SubscribeToEvent(E_LICENSE_ERROR, HANDLER(AtomicTool, HandleLicenseError));
SubscribeToEvent(E_LICENSE_SUCCESS, HANDLER(AtomicTool, HandleLicenseSuccess));
const Vector<String>& arguments = GetArguments();
ToolSystem* tsystem = new ToolSystem(context_);
context_->RegisterSubsystem(tsystem);
ToolEnvironment* env = new ToolEnvironment(context_);
context_->RegisterSubsystem(env);
//#ifdef ATOMIC_DEV_BUILD
if (!env->InitFromJSON())
{
ErrorExit(ToString("Unable to initialize tool environment from %s", env->GetDevConfigFilename().CString()));
return;
}
if (!cliDataPath_.Length())
{
cliDataPath_ = env->GetRootSourceDir() + "/Resources/";
}
//#endif
tsystem->SetCLI();
tsystem->SetDataPath(cliDataPath_);
if (activationKey_.Length())
{
DoActivation();
return;
} else if (deactivate_)
{
DoDeactivation();
return;
}
BuildSystem* buildSystem = GetSubsystem<BuildSystem>();
SharedPtr<CommandParser> parser(new CommandParser(context_));
SharedPtr<Command> cmd(parser->Parse(arguments));
if (!cmd)
{
String error = "No command found";
if (parser->GetErrorMessage().Length())
error = parser->GetErrorMessage();
ErrorExit(error);
return;
}
if (cmd->RequiresProjectLoad())
{
FileSystem* fileSystem = GetSubsystem<FileSystem>();
String projectDirectory = fileSystem->GetCurrentDir();
Vector<String> projectFiles;
fileSystem->ScanDir(projectFiles, projectDirectory, "*.atomic", SCAN_FILES, false);
if (!projectFiles.Size())
{
ErrorExit(ToString("No .atomic project file in %s", projectDirectory.CString()));
return;
}
else if (projectFiles.Size() > 1)
{
ErrorExit(ToString("Multiple .atomic project files found in %s", projectDirectory.CString()));
return;
}
String projectFile = projectDirectory + "/" + projectFiles[0];
if (!tsystem->LoadProject(projectFile))
{
//ErrorExit(ToString("Failed to load project: %s", projectFile.CString()));
//return;
}
// Set the build path
String buildFolder = projectDirectory + "/" + "Build";
buildSystem->SetBuildPath(buildFolder);
if (!fileSystem->DirExists(buildFolder))
{
fileSystem->CreateDir(buildFolder);
if (!fileSystem->DirExists(buildFolder))
//.........这里部分代码省略.........
示例12: CheckJSErrors
bool CEJavascript::CheckJSErrors(bool fullCheck)
{
errors_.Clear();
Editor* editor = GetSubsystem<Editor>();
Project* project = editor->GetProject();
FileSystem* fileSystem = GetSubsystem<FileSystem>();
if (!project)
{
modifiedJS_.Clear();
return true;
}
Vector<String>& filesToCheck = modifiedJS_;
Vector<String> allFiles;
if (fullCheck)
{
filesToCheck = allFiles;
String componentsPath = AddTrailingSlash(project->GetComponentsPath());
String scriptsPath = AddTrailingSlash(project->GetScriptsPath());
String modulesPath = AddTrailingSlash(project->GetModulesPath());
Vector<String> files;
fileSystem->ScanDir(files, componentsPath, "*.js", SCAN_FILES, true );
for (unsigned i = 0; i < files.Size(); i++)
allFiles.Push(componentsPath + files[i]);
fileSystem->ScanDir(files, scriptsPath, "*.js", SCAN_FILES, true );
for (unsigned i = 0; i < files.Size(); i++)
allFiles.Push(scriptsPath + files[i]);
fileSystem->ScanDir(files, modulesPath, "*.js", SCAN_FILES, true );
for (unsigned i = 0; i < files.Size(); i++)
allFiles.Push(modulesPath + files[i]);
}
bool ok = true;
for (unsigned j = 0; j < filesToCheck.Size(); j++)
{
String source;
String fullpath = filesToCheck[j];
ReadZeroTerminatedSourceFile(fullpath, source);
duk_get_global_string(ctx_, "__clockwork_parse_error_check");
duk_push_string(ctx_, source.CString());
if (duk_pcall(ctx_, 1))
{
printf("Error: %s\n", duk_safe_to_string(ctx_, -1));
}
else
{
if (duk_is_boolean(ctx_, -1))
{
// error
if (duk_to_boolean(ctx_, -1))
ok = false;
}
else if (duk_is_object(ctx_, -1))
{
ok = false;
JSError error;
error.fullpath = fullpath;
duk_get_prop_string(ctx_, -1, "message");
error.message = duk_to_string(ctx_, -1);
duk_pop(ctx_);
duk_get_prop_string(ctx_, -1, "loc");
duk_get_prop_string(ctx_, -1, "line");
error.line = duk_to_number(ctx_, -1);
duk_get_prop_string(ctx_, -2, "column");
error.column = duk_to_number(ctx_, -1);
duk_get_prop_string(ctx_, -4, "raisedAt");
error.tokenPos = duk_to_number(ctx_, -1);
duk_pop_3(ctx_);
errors_.Push(error);
}
else
{
// what to do?
}
}
// ignore result
duk_pop(ctx_);
}
modifiedJS_.Clear();
//.........这里部分代码省略.........
示例13: BuildAtomicNET
void BuildWindows::BuildAtomicNET()
{
// AtomicNET
FileSystem* fileSystem = GetSubsystem<FileSystem>();
ToolEnvironment* tenv = GetSubsystem<ToolEnvironment>();
ToolSystem* tsystem = GetSubsystem<ToolSystem>();
Project* project = tsystem->GetProject();
String projectResources = project->GetResourcePath();
String assembliesPath = projectResources + "Assemblies/";
// if no assemblies path, no need to install AtomicNET
if (!fileSystem->DirExists(assembliesPath))
return;
Vector<String> results;
fileSystem->ScanDir(results, assembliesPath, "*.dll", SCAN_FILES, true);
// if no assembiles in Assemblies path, no need to install AtomicNET
if (!results.Size())
return;
BuildLog("Building AtomicNET");
fileSystem->CreateDir(buildPath_ + "/AtomicPlayer_Resources/AtomicNET");
fileSystem->CreateDir(buildPath_ + "/AtomicPlayer_Resources/AtomicNET/Atomic");
fileSystem->CreateDir(buildPath_ + "/AtomicPlayer_Resources/AtomicNET/Atomic/Assemblies");
fileSystem->CopyDir(tenv->GetNETCoreCLRAbsPath(), buildPath_ + "/AtomicPlayer_Resources/AtomicNET/CoreCLR");
fileSystem->CopyDir(tenv->GetNETTPAPaths(), buildPath_ + "/AtomicPlayer_Resources/AtomicNET/Atomic/TPA");
// Atomic Assemblies
const String& assemblyLoadPaths = tenv->GetNETAssemblyLoadPaths();
Vector<String> paths = assemblyLoadPaths.Split(';');
for (unsigned i = 0; i < paths.Size(); i++)
{
Vector<String> loadResults;
fileSystem->ScanDir(loadResults, paths[i], "*.dll", SCAN_FILES, true);
for (unsigned j = 0; j < loadResults.Size(); j++)
{
String pathName, fileName, ext;
SplitPath(loadResults[j], pathName, fileName, ext);
if (fileName != "AtomicNETEngine")
continue;
fileSystem->Copy(paths[i] + "/" + loadResults[j], ToString("%s/AtomicPlayer_Resources/AtomicNET/Atomic/Assemblies/%s.dll", buildPath_.CString(), fileName.CString()));
}
}
// Project assemblied
for (unsigned i = 0; i < results.Size(); i++)
{
String pathName, fileName, ext;
SplitPath(results[i], pathName, fileName, ext);
fileSystem->Copy(assembliesPath + results[i], ToString("%s/AtomicPlayer_Resources/AtomicNET/Atomic/Assemblies/%s.dll", buildPath_.CString(), fileName.CString()));
}
}
示例14: DumpAPI
void Script::DumpAPI(DumpMode mode, const String& sourceTree)
{
// Does not use LOGRAW macro here to ensure the messages are always dumped regardless of CLOCKWORK_LOGGING compiler directive
// and of Log subsystem availability
// Dump event descriptions and attribute definitions in Doxygen mode. For events, this means going through the header files,
// as the information is not available otherwise.
/// \todo Dump events + attributes before the actual script API because the remarks (readonly / writeonly) seem to throw off
// Doxygen parsing and the following page definition(s) may not be properly recognized
if (mode == DOXYGEN)
{
Log::WriteRaw("namespace Clockwork\n{\n\n/**\n");
FileSystem* fileSystem = GetSubsystem<FileSystem>();
Vector<String> headerFileNames;
String path = AddTrailingSlash(sourceTree);
if (!path.Empty())
path.Append("Source/Clockwork/");
fileSystem->ScanDir(headerFileNames, path, "*.h", SCAN_FILES, true);
/// \hack Rename any Events2D to 2DEvents to work with the event category creation correctly (currently PhysicsEvents2D)
Vector<HeaderFile> headerFiles;
for (unsigned i = 0; i < headerFileNames.Size(); ++i)
{
HeaderFile entry;
entry.fileName = headerFileNames[i];
entry.sectionName = GetFileNameAndExtension(entry.fileName).Replaced("Events2D", "2DEvents");
if (entry.sectionName.EndsWith("Events.h"))
headerFiles.Push(entry);
}
if (!headerFiles.Empty())
{
Log::WriteRaw("\n\\page EventList Event list\n");
Sort(headerFiles.Begin(), headerFiles.End(), CompareHeaderFiles);
for (unsigned i = 0; i < headerFiles.Size(); ++i)
{
SharedPtr<File> file(new File(context_, path + headerFiles[i].fileName, FILE_READ));
if (!file->IsOpen())
continue;
const String& sectionName = headerFiles[i].sectionName;
unsigned start = sectionName.Find('/') + 1;
unsigned end = sectionName.Find("Events.h");
Log::WriteRaw("\n## %" + sectionName.Substring(start, end - start) + " events\n");
while (!file->IsEof())
{
String line = file->ReadLine();
if (line.StartsWith("EVENT"))
{
Vector<String> parts = line.Split(',');
if (parts.Size() == 2)
Log::WriteRaw("\n### " + parts[1].Substring(0, parts[1].Length() - 1).Trimmed() + "\n");
}
if (line.Contains("PARAM"))
{
Vector<String> parts = line.Split(',');
if (parts.Size() == 2)
{
String paramName = parts[1].Substring(0, parts[1].Find(')')).Trimmed();
String paramType = parts[1].Substring(parts[1].Find("// ") + 3);
if (!paramName.Empty() && !paramType.Empty())
Log::WriteRaw("- %" + paramName + " : " + paramType + "\n");
}
}
}
}
Log::WriteRaw("\n");
}
Log::WriteRaw("\n\\page AttributeList Attribute list\n");
const HashMap<StringHash, Vector<AttributeInfo> >& attributes = context_->GetAllAttributes();
Vector<String> objectTypes;
for (HashMap<StringHash, Vector<AttributeInfo> >::ConstIterator i = attributes.Begin(); i != attributes.End(); ++i)
objectTypes.Push(context_->GetTypeName(i->first_));
Sort(objectTypes.Begin(), objectTypes.End());
for (unsigned i = 0; i < objectTypes.Size(); ++i)
{
const Vector<AttributeInfo>& attrs = attributes.Find(objectTypes[i])->second_;
unsigned usableAttrs = 0;
for (unsigned j = 0; j < attrs.Size(); ++j)
{
// Attributes that are not shown in the editor are typically internal and not usable for eg. attribute
// animation
if (attrs[j].mode_ & AM_NOEDIT)
continue;
++usableAttrs;
}
if (!usableAttrs)
continue;
//.........这里部分代码省略.........