123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462 |
- /*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * 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>
|