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/AssetBundler/source/ui/ComparisonDataWidget.cpp

462 lines
18 KiB
C++

/*
* Copyright (c) Contributors to the Open 3D Engine Project
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#include <source/ui/ComparisonDataWidget.h>
#include <source/ui/ui_ComparisonDataWidget.h>
#include <source/ui/NewFileDialog.h>
#include <QComboBox>
#include <QStringList>
namespace AssetBundler
{
//////////////////////////////////////////////////////////////////////////////////////////////////
// ComparisonDataWidget
//////////////////////////////////////////////////////////////////////////////////////////////////
const QStringList ComparisonTypeStringList = { "Default", "Delta", "Union", "Intersection", "Complement", "Wildcard", "Regex" };
ComparisonDataWidget::ComparisonDataWidget(
AZStd::shared_ptr<AzToolsFramework::AssetFileInfoListComparison> comparisonList,
size_t comparisonDataIndex,
const AZStd::string& defaultAssetListFileDirectory,
QWidget* parent)
: QWidget(parent)
, m_comparisonDataIndex(comparisonDataIndex)
, m_defaultAssetListFileDirectory(defaultAssetListFileDirectory)
{
m_ui.reset(new Ui::ComparisonDataWidget);
m_ui->setupUi(this);
m_comparisonList = comparisonList;
if (!IsComparisonDataIndexValid())
{
AZ_Error("AssetBundler", false,
"ComparisonData index ( %u ) is out of bounds. ComparisonData cannot be displayed.", m_comparisonDataIndex);
return;
}
// Due to initialization order, we need to hard-code this or else the value will be overwritten once this
// ComparisonDataWidget is added to the ComparisonDataCard, and the Card.qss file is applied
QString lineEditStyle("background-color: #CCCCCC;");
m_ui->nameLineEdit->setStyleSheet(lineEditStyle);
m_ui->firstInputLineEdit->setStyleSheet(lineEditStyle);
m_ui->secondInputLineEdit->setStyleSheet(lineEditStyle);
m_ui->filePatternLineEdit->setStyleSheet(lineEditStyle);
m_ui->firstInputLineEdit->setReadOnly(true);
m_ui->secondInputLineEdit->setReadOnly(true);
SetAllDisplayValues(m_comparisonList->GetComparisonList()[m_comparisonDataIndex]);
MouseWheelEventFilter* mouseWheelEventFilter = new MouseWheelEventFilter(this);
connect(m_ui->nameLineEdit, &QLineEdit::textEdited, this, &ComparisonDataWidget::OnNameLineEditChanged);
m_ui->comparisonTypeComboBox->installEventFilter(mouseWheelEventFilter);
connect(m_ui->comparisonTypeComboBox,
QOverload<int>::of(&QComboBox::currentIndexChanged),
this,
&ComparisonDataWidget::OnComparisonTypeComboBoxChanged);
m_ui->firstInputComboBox->installEventFilter(mouseWheelEventFilter);
connect(m_ui->firstInputComboBox,
QOverload<int>::of(&QComboBox::currentIndexChanged),
this,
&ComparisonDataWidget::OnFirstInputComboBoxChanged);
connect(m_ui->firstInputBrowseButton,
&QPushButton::pressed,
this,
&ComparisonDataWidget::OnFirstInputBrowseButtonPressed);
m_ui->secondInputComboBox->installEventFilter(mouseWheelEventFilter);
connect(m_ui->secondInputComboBox,
QOverload<int>::of(&QComboBox::currentIndexChanged),
this,
&ComparisonDataWidget::OnSecondInputComboBoxChanged);
connect(m_ui->secondInputBrowseButton, &QPushButton::pressed, this, &ComparisonDataWidget::OnSecondInputBrowseButtonPressed);
connect(m_ui->filePatternLineEdit, &QLineEdit::textEdited, this, &ComparisonDataWidget::OnFilePatternLineEditChanged);
}
void ComparisonDataWidget::UpdateListOfTokenNames()
{
using namespace AzToolsFramework;
if (!IsComparisonDataIndexValid())
{
return;
}
m_inputTokenNameList.clear();
m_ui->firstInputComboBox->clear();
m_ui->secondInputComboBox->clear();
// Store info about the current FirstInput and SecondInput values so we may auto-select them later
auto allComparisonDataSteps = m_comparisonList->GetComparisonList();
AZStd::string selectedFirstInput = allComparisonDataSteps.at(m_comparisonDataIndex).m_firstInput;
int selectedFirstInputIndex = 0;
AZStd::string selectedSecondInput = allComparisonDataSteps.at(m_comparisonDataIndex).m_secondInput;
int selectedSecondInputIndex = 0;
// Build list of all Token Names that have come before the current Comparison Step
m_inputTokenNameList.append(tr("Choose Asset List..."));
int currentComboBoxIndex = 1;
AZStd::string tokenName;
for (size_t i = 0; i < m_comparisonDataIndex; ++i)
{
tokenName = allComparisonDataSteps.at(i).m_output;
if (!AssetFileInfoListComparison::IsTokenFile(tokenName))
{
continue;
}
if (tokenName == selectedFirstInput)
{
selectedFirstInputIndex = currentComboBoxIndex;
}
if (tokenName == selectedSecondInput)
{
selectedSecondInputIndex = currentComboBoxIndex;
}
m_inputTokenNameList.append(RemoveTokenCharFromString(tokenName));
++currentComboBoxIndex;
}
// Update display with list of Token Names, and select current Token Name in both input combo boxes
m_ui->firstInputComboBox->insertItems(0, m_inputTokenNameList);
m_ui->firstInputComboBox->setCurrentIndex(selectedFirstInputIndex);
m_isFirstInputFileNameVisible = selectedFirstInputIndex == 0;
SetFirstInputFileVisibility(m_isFirstInputFileNameVisible);
m_ui->secondInputComboBox->insertItems(0, m_inputTokenNameList);
m_ui->secondInputComboBox->setCurrentIndex(selectedSecondInputIndex);
m_isSecondInputFileNameVisible = selectedSecondInputIndex == 0;
SetSecondInputFileVisibility(m_isSecondInputFileNameVisible);
}
void ComparisonDataWidget::SetAllDisplayValues(const AzToolsFramework::AssetFileInfoListComparison::ComparisonData& comparisonData)
{
using namespace AzToolsFramework;
// Name (Token value)
m_ui->nameLineEdit->setText(RemoveTokenCharFromString(comparisonData.m_output));
// Comparison Type
InitComparisonTypeComboBox(comparisonData);
// Inputs
UpdateListOfTokenNames();
m_ui->firstInputLineEdit->setText(QString(comparisonData.m_cachedFirstInputPath.c_str()));
m_ui->secondInputLineEdit->setText(QString(comparisonData.m_cachedSecondInputPath.c_str()));
// Update fields that are not always visible
UpdateOnComparisonTypeChanged(comparisonData.m_filePatternType != AssetFileInfoListComparison::FilePatternType::Default);
}
void ComparisonDataWidget::OnNameLineEditChanged()
{
if (!IsComparisonDataIndexValid())
{
return;
}
AZStd::string tokenName = m_ui->nameLineEdit->text().toUtf8().data();
AzToolsFramework::AssetFileInfoListComparison::FormatOutputToken(tokenName);
m_comparisonList->SetOutput(m_comparisonDataIndex, tokenName);
emit comparisonDataChanged();
emit comparisonDataTokenNameChanged(m_comparisonDataIndex);
}
void ComparisonDataWidget::UpdateOnComparisonTypeChanged(bool isFilePatternOperation)
{
using namespace AzToolsFramework;
if (!IsComparisonDataIndexValid())
{
return;
}
AssetFileInfoListComparison::ComparisonData comparisonData = m_comparisonList->GetComparisonList()[m_comparisonDataIndex];
m_ui->inputBLabel->setVisible(!isFilePatternOperation);
m_ui->secondInputComboBox->setVisible(!isFilePatternOperation);
SetSecondInputFileVisibility(!isFilePatternOperation && m_isSecondInputFileNameVisible);
m_ui->filePatternLabel->setVisible(isFilePatternOperation);
m_ui->filePatternLineEdit->setVisible(isFilePatternOperation);
m_ui->filePatternLineEdit->setText(comparisonData.m_filePattern.c_str());
}
void ComparisonDataWidget::InitComparisonTypeComboBox(
const AzToolsFramework::AssetFileInfoListComparison::ComparisonData& comparisonData)
{
using namespace AzToolsFramework;
m_ui->comparisonTypeComboBox->insertItems(0, ComparisonTypeStringList);
int initialSelectionIndex = ComparisonTypeIndex::Default;
if (comparisonData.m_filePatternType != AssetFileInfoListComparison::FilePatternType::Default
&& comparisonData.m_comparisonType == AssetFileInfoListComparison::ComparisonType::FilePattern)
{
if (comparisonData.m_filePatternType == AssetFileInfoListComparison::FilePatternType::Wildcard)
{
initialSelectionIndex = ComparisonTypeIndex::Wildcard;
}
else
{
initialSelectionIndex = ComparisonTypeIndex::Regex;
}
}
else
{
switch (comparisonData.m_comparisonType)
{
case AssetFileInfoListComparison::ComparisonType::Default:
break;
case AssetFileInfoListComparison::ComparisonType::Delta:
initialSelectionIndex = ComparisonTypeIndex::Delta;
break;
case AssetFileInfoListComparison::ComparisonType::Union:
initialSelectionIndex = ComparisonTypeIndex::Union;
break;
case AssetFileInfoListComparison::ComparisonType::Intersection:
initialSelectionIndex = ComparisonTypeIndex::Intersection;
break;
case AssetFileInfoListComparison::ComparisonType::Complement:
initialSelectionIndex = ComparisonTypeIndex::Complement;
break;
default:
AZ_Warning("AssetBundler", false,
"ComparisonType ( %u ) is not supported in the Asset Bundler", comparisonData.m_comparisonType);
}
}
m_ui->comparisonTypeComboBox->setCurrentIndex(initialSelectionIndex);
}
void ComparisonDataWidget::OnComparisonTypeComboBoxChanged(int index)
{
using namespace AzToolsFramework;
if (!IsComparisonDataIndexValid())
{
return;
}
bool isFilePattern = false;
switch (index)
{
case ComparisonTypeIndex::Default:
m_comparisonList->SetComparisonType(m_comparisonDataIndex, AssetFileInfoListComparison::ComparisonType::Default);
break;
case ComparisonTypeIndex::Delta:
m_comparisonList->SetComparisonType(m_comparisonDataIndex, AssetFileInfoListComparison::ComparisonType::Delta);
break;
case ComparisonTypeIndex::Union:
m_comparisonList->SetComparisonType(m_comparisonDataIndex, AssetFileInfoListComparison::ComparisonType::Union);
break;
case ComparisonTypeIndex::Intersection:
m_comparisonList->SetComparisonType(m_comparisonDataIndex, AssetFileInfoListComparison::ComparisonType::Intersection);
break;
case ComparisonTypeIndex::Complement:
m_comparisonList->SetComparisonType(m_comparisonDataIndex, AssetFileInfoListComparison::ComparisonType::Complement);
break;
case ComparisonTypeIndex::Wildcard:
m_comparisonList->SetComparisonType(m_comparisonDataIndex, AssetFileInfoListComparison::ComparisonType::FilePattern);
m_comparisonList->SetFilePatternType(m_comparisonDataIndex, AssetFileInfoListComparison::FilePatternType::Wildcard);
isFilePattern = true;
break;
case ComparisonTypeIndex::Regex:
m_comparisonList->SetComparisonType(m_comparisonDataIndex, AssetFileInfoListComparison::ComparisonType::FilePattern);
m_comparisonList->SetFilePatternType(m_comparisonDataIndex, AssetFileInfoListComparison::FilePatternType::Regex);
isFilePattern = true;
break;
}
UpdateOnComparisonTypeChanged(isFilePattern);
emit comparisonDataChanged();
}
void ComparisonDataWidget::OnFilePatternLineEditChanged()
{
if (!IsComparisonDataIndexValid())
{
return;
}
m_comparisonList->SetFilePattern(m_comparisonDataIndex, m_ui->filePatternLineEdit->text().toUtf8().data());
emit comparisonDataChanged();
}
void ComparisonDataWidget::OnFirstInputComboBoxChanged(int index)
{
AZStd::string firstInputValue;
if (!IsComparisonDataIndexValid())
{
return;
}
m_isFirstInputFileNameVisible = index == 0;
if (!m_isFirstInputFileNameVisible)
{
// The 0th index is the default value, which translates to an empty token string.
firstInputValue = m_ui->firstInputComboBox->currentText().toUtf8().data();
AzToolsFramework::AssetFileInfoListComparison::FormatOutputToken(firstInputValue);
}
SetFirstInputFileVisibility(m_isFirstInputFileNameVisible);
m_comparisonList->SetFirstInput(m_comparisonDataIndex, firstInputValue);
emit comparisonDataChanged();
}
void ComparisonDataWidget::SetFirstInputFileVisibility(bool isVisible)
{
m_ui->firstInputLineEdit->setVisible(isVisible);
m_ui->firstInputBrowseButton->setVisible(isVisible);
}
void ComparisonDataWidget::OnFirstInputBrowseButtonPressed()
{
if (!IsComparisonDataIndexValid())
{
return;
}
QString absoluteFilePath = BrowseButtonPressed();
if (absoluteFilePath.isEmpty())
{
// User canceled out of the dialog
return;
}
m_ui->firstInputLineEdit->setText(absoluteFilePath);
m_comparisonList->SetCachedFirstInputPath(m_comparisonDataIndex, absoluteFilePath.toUtf8().data());
}
void ComparisonDataWidget::OnSecondInputComboBoxChanged(int index)
{
if (!IsComparisonDataIndexValid())
{
return;
}
AZStd::string secondInputValue;
m_isSecondInputFileNameVisible = index == 0;
if (!m_isSecondInputFileNameVisible)
{
// The 0th index is the default value, which translates to an empty token string.
secondInputValue = m_ui->secondInputComboBox->currentText().toUtf8().data();
AzToolsFramework::AssetFileInfoListComparison::FormatOutputToken(secondInputValue);
}
SetSecondInputFileVisibility(m_isSecondInputFileNameVisible);
m_comparisonList->SetSecondInput(m_comparisonDataIndex, secondInputValue);
emit comparisonDataChanged();
}
void ComparisonDataWidget::SetSecondInputFileVisibility(bool isVisible)
{
m_ui->secondInputLineEdit->setVisible(isVisible);
m_ui->secondInputBrowseButton->setVisible(isVisible);
}
void ComparisonDataWidget::OnSecondInputBrowseButtonPressed()
{
if (!IsComparisonDataIndexValid())
{
return;
}
QString absoluteFilePath = BrowseButtonPressed();
if (absoluteFilePath.isEmpty())
{
// User canceled out of the dialog
return;
}
m_ui->secondInputLineEdit->setText(absoluteFilePath);
m_comparisonList->SetCachedSecondInputPath(m_comparisonDataIndex, absoluteFilePath.toUtf8().data());
}
QString ComparisonDataWidget::BrowseButtonPressed()
{
AZStd::string selectedPath = NewFileDialog::OSNewFileDialog(
this,
AzToolsFramework::AssetSeedManager::GetAssetListFileExtension(),
"Asset List",
m_defaultAssetListFileDirectory);
AzToolsFramework::RemovePlatformIdentifier(selectedPath);
return selectedPath.c_str();
}
bool ComparisonDataWidget::IsComparisonDataIndexValid()
{
return m_comparisonList->GetComparisonList().size() > m_comparisonDataIndex;
}
QString ComparisonDataWidget::RemoveTokenCharFromString(const AZStd::string& tokenName)
{
QString displayName = tokenName.c_str();
if (displayName.startsWith(AzToolsFramework::AssetFileInfoListComparison::GetTokenIdentifier()))
{
displayName.remove(0, 1);
}
return displayName;
}
//////////////////////////////////////////////////////////////////////////////////////////////////
// MouseWheelEventFilter
//////////////////////////////////////////////////////////////////////////////////////////////////
bool MouseWheelEventFilter::eventFilter(QObject* obj, QEvent* ev)
{
if (ev->type() == QEvent::Wheel)
{
return true;
}
return QObject::eventFilter(obj, ev);
}
//////////////////////////////////////////////////////////////////////////////////////////////////
// ComparisonDataCard
//////////////////////////////////////////////////////////////////////////////////////////////////
ComparisonDataCard::ComparisonDataCard(
AZStd::shared_ptr<AzToolsFramework::AssetFileInfoListComparison> comparisonList,
size_t comparisonDataIndex,
const AZStd::string& defaultAssetListFileDirectory,
QWidget* parent)
: AzQtComponents::Card(parent)
{
m_comparisonDataWidget = new ComparisonDataWidget(comparisonList, comparisonDataIndex, defaultAssetListFileDirectory, this);
setContentWidget(m_comparisonDataWidget);
connect(this, &AzQtComponents::Card::contextMenuRequested, this, &ComparisonDataCard::OnContextMenuRequested);
}
void ComparisonDataCard::OnContextMenuRequested(const QPoint& position)
{
emit comparisonDataCardContextMenuRequested(m_comparisonDataWidget->GetComparisonDataIndex(), position);
}
} // namespace AssetBundler
#include <source/ui/moc_ComparisonDataWidget.cpp>