You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Code/Tools/AssetProcessor/native/ui/SourceAssetTreeItemData.cpp

109 lines
4.2 KiB
C++

/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include "SourceAssetTreeItemData.h"
#include <AzCore/std/smart_ptr/make_shared.h>
#include <QDir>
namespace AssetProcessor
{
AZStd::shared_ptr<SourceAssetTreeItemData> SourceAssetTreeItemData::MakeShared(
const AzToolsFramework::AssetDatabase::SourceDatabaseEntry* sourceInfo,
const AzToolsFramework::AssetDatabase::ScanFolderDatabaseEntry* scanFolderInfo,
const AZStd::string& assetDbName,
QString name,
bool isFolder)
{
return AZStd::make_shared<SourceAssetTreeItemData>(sourceInfo, scanFolderInfo, assetDbName, name, isFolder);
}
SourceAssetTreeItemData::SourceAssetTreeItemData(
const AzToolsFramework::AssetDatabase::SourceDatabaseEntry* sourceInfo,
const AzToolsFramework::AssetDatabase::ScanFolderDatabaseEntry* scanFolderInfo,
const AZStd::string& assetDbName,
QString name,
bool isFolder) :
AssetTreeItemData(assetDbName, name, isFolder, sourceInfo ? sourceInfo->m_sourceGuid : AZ::Uuid::CreateNull())
{
if (sourceInfo && scanFolderInfo)
{
m_hasDatabaseInfo = true;
m_sourceInfo = *sourceInfo;
m_scanFolderInfo = *scanFolderInfo;
}
else
{
m_hasDatabaseInfo = false;
}
}
QString BuildAbsolutePathToFile(const AZStd::shared_ptr<const SourceAssetTreeItemData> file)
{
QDir scanFolder(file->m_scanFolderInfo.m_scanFolder.c_str());
QString sourceName = file->m_sourceInfo.m_sourceName.c_str();
return scanFolder.filePath(sourceName);
}
AZ::Outcome<QString> GetAbsolutePathToSource(const AssetTreeItem& source)
{
if (source.getChildCount() > 0)
{
// Folders are special case, they only exist in the interface and don't exist in the asset database.
// Figure out a path to this folder by finding a descendant that isn't a folder, taking the absolute
// path of that file, and stripping off the path after this folder.
size_t directoriesToRemove = 0;
const AssetTreeItem* searchForFile = &source;
while (searchForFile)
{
if (searchForFile->getChildCount() == 0)
{
const AZStd::shared_ptr<const SourceAssetTreeItemData> sourceItemData =
AZStd::rtti_pointer_cast<const SourceAssetTreeItemData>(searchForFile->GetData());
if (!sourceItemData)
{
return AZ::Failure();
}
QFileInfo fileInfo(BuildAbsolutePathToFile(sourceItemData));
QDir fileFolder(fileInfo.absoluteDir());
// The file found wasn't a directory, it was removed when absolute dir was called on the QFileInfo above.
while (directoriesToRemove > 1)
{
fileFolder.cdUp();
--directoriesToRemove;
}
return AZ::Success(fileFolder.absolutePath());
}
else
{
searchForFile = searchForFile->GetChild(0);
}
++directoriesToRemove;
}
return AZ::Failure();
}
else
{
const AZStd::shared_ptr<const SourceAssetTreeItemData> sourceItemData = AZStd::rtti_pointer_cast<const SourceAssetTreeItemData>(source.GetData());
if (!sourceItemData)
{
return AZ::Failure();
}
return AZ::Success(BuildAbsolutePathToFile(sourceItemData));
}
}
}