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/Sandbox/Editor/LevelTreeModel.cpp

176 lines
5.0 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 "EditorDefs.h"
#include "LevelTreeModel.h"
// Editor
#include "LevelFileDialog.h"
// Folder in which levels are stored
static const char kLevelsFolder[] = "Levels";
LevelTreeModelFilter::LevelTreeModelFilter(QObject* parent)
: QSortFilterProxyModel(parent)
{
}
QVariant LevelTreeModelFilter::data(const QModelIndex& index, int role) const
{
if (!sourceModel())
{
return QVariant();
}
return sourceModel()->data(mapToSource(index), role);
}
bool LevelTreeModelFilter::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const
{
if (m_filterText.isEmpty())
{
return true;
}
QModelIndex idx = sourceModel()->index(source_row, 0, source_parent);
if (!idx.isValid())
{
return false;
}
const QString text = idx.data(Qt::DisplayRole).toString();
if (text.contains(m_filterText, Qt::CaseInsensitive))
{
return true;
}
// Recurse into the children
const int count = sourceModel()->rowCount(idx);
for (int i = 0; i < count; ++i)
{
if (filterAcceptsRow(i, idx))
{
return true;
}
}
return false;
}
void LevelTreeModelFilter::setFilterText(const QString& text)
{
QString lowerText = text.toLower();
if (m_filterText != lowerText)
{
m_filterText = lowerText;
invalidateFilter();
}
}
LevelTreeModel::LevelTreeModel(QObject* parent)
: QStandardItemModel(parent)
{
}
LevelTreeModel::~LevelTreeModel()
{
}
QVariant LevelTreeModel::data(const QModelIndex& index, int role) const
{
if (role == Qt::DecorationRole)
{
const bool isLevelFolder = index.data(LevelTreeModel::IsLevelFolderRole).toBool();
if (isLevelFolder)
{
return QIcon(":/img/tree_view_level.png");
}
else
{
return QIcon(":/img/tree_view_folder.png");
}
}
return QStandardItemModel::data(index, role);
}
void LevelTreeModel::ReloadTree(bool recurseIfNoLevels)
{
clear();
QString levelsFolder = QString("%1/%2").arg(Path::GetEditingGameDataFolder().c_str()).arg(kLevelsFolder);
QStandardItem* root = new QStandardItem(kLevelsFolder);
root->setData(levelsFolder, FullPathRole);
root->setEditable(false);
invisibleRootItem()->appendRow(root);
ReloadTree(root, recurseIfNoLevels);
}
void LevelTreeModel::ReloadTree(QStandardItem* root, bool recurseIfNoLevels)
{
QStringList levelFiles;
const QString parentFullPath = root->data(FullPathRole).toString();
const bool isLevelFolder = CLevelFileDialog::CheckLevelFolder(parentFullPath, &levelFiles);
root->setData(isLevelFolder, IsLevelFolderRole);
// Recurse to sub folders if this is not a level folder
// Also recurse to sub folders if we detected a level folder
// but there are no level files in it in open mode
if (!isLevelFolder || (recurseIfNoLevels && levelFiles.empty()))
{
QDir currentDir(parentFullPath);
currentDir.setFilter(QDir::NoDot | QDir::NoDotDot | QDir::Dirs);
const QStringList subFolders = currentDir.entryList();
foreach (const QString &subFolder, subFolders)
{
auto child = new QStandardItem(subFolder);
child->setData(parentFullPath + "/" + subFolder, FullPathRole);
child->setEditable(false);
root->appendRow(child);
ReloadTree(child, recurseIfNoLevels);
}
}
else
{
// eTreeImage_Level
// Support for legacy folder structure: Multiple cry files in level folder
if (recurseIfNoLevels && levelFiles.size() > 1)
{
foreach (const QString &levelFile, levelFiles)
{
auto child = new QStandardItem(levelFile);
child->setData(root->data(FullPathRole).toString() + "/" + levelFile, FullPathRole);
child->setData(false, IsLevelFolderRole);
child->setEditable(false);
root->appendRow(child);
}
}
}
}
void LevelTreeModel::AddItem(const QString& name, const QModelIndex& parent)
{
auto item = new QStandardItem(name);
item->setData(false, IsLevelFolderRole);
item->setEditable(false);
QStandardItem* parentItem = itemFromIndex(parent);
if (parentItem)
{
const QString parentPath = parent.data(FullPathRole).toString();
item->setData(parentPath + "/" + name, FullPathRole);
parentItem->appendRow(item);
}
}
#include <moc_LevelTreeModel.cpp>