Atom Tools: Changed ME preset browser dialog into generic asset grid dialog in ATF
Moving more potentially shared code out of the material editor into atom tools framework. This change consolidates the lighting preset browser, model preset browser, and the base dialogue that they shared into a single, grid based, asset selection dialog. AssetGridDialog should appear as a move and rename of PresetBrowserDialog but there are probably too many differences with new variable renames and SelectableAsset struct. Along the way I found examples showing that event bus broadcast accepted generic functions and lambdas. Used this to do a minor cleanup of the viewport settings inspector where the preset dialogs were initialized and other places that did several back to back bus calls. Signed-off-by: Guthrie Adams <guthadam@amazon.com>monroegm-disable-blank-issue-2
parent
878ba24a3f
commit
f20bf38f88
@ -0,0 +1,69 @@
|
||||
/*
|
||||
* 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
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#if !defined(Q_MOC_RUN)
|
||||
#include <AzCore/Asset/AssetCommon.h>
|
||||
#include <AzCore/std/containers/vector.h>
|
||||
#endif
|
||||
|
||||
#include <QDialog>
|
||||
#include <QString>
|
||||
|
||||
class QListWidgetItem;
|
||||
|
||||
namespace Ui
|
||||
{
|
||||
class AssetGridDialog;
|
||||
}
|
||||
|
||||
namespace AtomToolsFramework
|
||||
{
|
||||
//! Widget for managing and selecting from a library of assets
|
||||
class AssetGridDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
struct SelectableAsset
|
||||
{
|
||||
AZ::Data::AssetId m_assetId;
|
||||
QString m_title;
|
||||
};
|
||||
|
||||
using SelectableAssetVector = AZStd::vector<SelectableAsset>;
|
||||
|
||||
AssetGridDialog(
|
||||
const QString& title,
|
||||
const SelectableAssetVector& selectableAssets,
|
||||
const AZ::Data::AssetId& selectedAsset,
|
||||
const QSize& tileSize,
|
||||
QWidget* parent = nullptr);
|
||||
|
||||
~AssetGridDialog();
|
||||
|
||||
Q_SIGNALS:
|
||||
void AssetSelected(const AZ::Data::AssetId& assetId);
|
||||
|
||||
private:
|
||||
AZ_DISABLE_COPY_MOVE(AssetGridDialog);
|
||||
|
||||
QListWidgetItem* CreateListItem(const SelectableAsset& selectableAsset);
|
||||
void SetupAssetList();
|
||||
void SetupSearchWidget();
|
||||
void SetupDialogButtons();
|
||||
void ApplySearchFilter();
|
||||
void ShowSearchMenu(const QPoint& pos);
|
||||
void SelectCurrentAsset();
|
||||
void SelectInitialAsset();
|
||||
|
||||
QSize m_tileSize;
|
||||
AZ::Data::AssetId m_initialSelectedAsset;
|
||||
QScopedPointer<Ui::AssetGridDialog> m_ui;
|
||||
};
|
||||
} // namespace AtomToolsFramework
|
||||
@ -0,0 +1,179 @@
|
||||
/*
|
||||
* 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 <AssetGridDialog/ui_AssetGridDialog.h>
|
||||
#include <AtomToolsFramework/AssetGridDialog/AssetGridDialog.h>
|
||||
#include <AtomToolsFramework/Util/Util.h>
|
||||
#include <AzQtComponents/Components/Widgets/ElidingLabel.h>
|
||||
#include <AzQtComponents/Components/Widgets/LineEdit.h>
|
||||
#include <AzQtComponents/Components/Widgets/Text.h>
|
||||
#include <AzToolsFramework/AssetBrowser/Thumbnails/ProductThumbnail.h>
|
||||
#include <AzToolsFramework/Thumbnails/ThumbnailContext.h>
|
||||
#include <AzToolsFramework/Thumbnails/ThumbnailWidget.h>
|
||||
#include <AzToolsFramework/Thumbnails/ThumbnailerBus.h>
|
||||
|
||||
#include <QLabel>
|
||||
#include <QLineEdit>
|
||||
#include <QMenu>
|
||||
#include <QVBoxLayout>
|
||||
|
||||
namespace AtomToolsFramework
|
||||
{
|
||||
AssetGridDialog::AssetGridDialog(
|
||||
const QString& title,
|
||||
const SelectableAssetVector& selectableAssets,
|
||||
const AZ::Data::AssetId& selectedAsset,
|
||||
const QSize& tileSize,
|
||||
QWidget* parent)
|
||||
: QDialog(parent)
|
||||
, m_tileSize(tileSize)
|
||||
, m_initialSelectedAsset(selectedAsset)
|
||||
, m_ui(new Ui::AssetGridDialog)
|
||||
{
|
||||
m_ui->setupUi(this);
|
||||
|
||||
QSignalBlocker signalBlocker(this);
|
||||
|
||||
setWindowTitle(title);
|
||||
|
||||
SetupAssetList();
|
||||
SetupSearchWidget();
|
||||
SetupDialogButtons();
|
||||
setModal(true);
|
||||
|
||||
QListWidgetItem* selectedItem = nullptr;
|
||||
for (const auto& selectableAsset : selectableAssets)
|
||||
{
|
||||
QListWidgetItem* item = CreateListItem(selectableAsset);
|
||||
if (!selectedItem || m_initialSelectedAsset == selectableAsset.m_assetId)
|
||||
{
|
||||
selectedItem = item;
|
||||
}
|
||||
}
|
||||
|
||||
m_ui->m_assetList->sortItems();
|
||||
|
||||
if (selectedItem)
|
||||
{
|
||||
m_ui->m_assetList->setCurrentItem(selectedItem);
|
||||
m_ui->m_assetList->scrollToItem(selectedItem);
|
||||
}
|
||||
}
|
||||
|
||||
AssetGridDialog::~AssetGridDialog()
|
||||
{
|
||||
}
|
||||
|
||||
QListWidgetItem* AssetGridDialog::CreateListItem(const SelectableAsset& selectableAsset)
|
||||
{
|
||||
const int itemBorder = aznumeric_cast<int>(
|
||||
AtomToolsFramework::GetSettingOrDefault<AZ::u64>("/O3DE/Atom/AtomToolsFramework/AssetGridDialog/ItemBorder", 4));
|
||||
const int itemSpacing = aznumeric_cast<int>(
|
||||
AtomToolsFramework::GetSettingOrDefault<AZ::u64>("/O3DE/Atom/AtomToolsFramework/AssetGridDialog/ItemSpacing", 10));
|
||||
const int headerHeight = aznumeric_cast<int>(
|
||||
AtomToolsFramework::GetSettingOrDefault<AZ::u64>("/O3DE/Atom/AtomToolsFramework/AssetGridDialog/HeaderHeight", 15));
|
||||
|
||||
const QSize gridSize = m_ui->m_assetList->gridSize();
|
||||
m_ui->m_assetList->setGridSize(QSize(
|
||||
AZStd::max(gridSize.width(), m_tileSize.width() + itemSpacing),
|
||||
AZStd::max(gridSize.height(), m_tileSize.height() + itemSpacing + headerHeight)));
|
||||
|
||||
QListWidgetItem* item = new QListWidgetItem(m_ui->m_assetList);
|
||||
item->setData(Qt::DisplayRole, selectableAsset.m_title);
|
||||
item->setData(Qt::UserRole, QString(selectableAsset.m_assetId.ToString<AZStd::string>().c_str()));
|
||||
item->setSizeHint(m_tileSize + QSize(itemBorder, itemBorder + headerHeight));
|
||||
m_ui->m_assetList->addItem(item);
|
||||
|
||||
QWidget* itemWidget = new QWidget(m_ui->m_assetList);
|
||||
itemWidget->setLayout(new QVBoxLayout(itemWidget));
|
||||
itemWidget->layout()->setSpacing(0);
|
||||
itemWidget->layout()->setMargin(0);
|
||||
|
||||
AzQtComponents::ElidingLabel* header = new AzQtComponents::ElidingLabel(itemWidget);
|
||||
header->setText(selectableAsset.m_title);
|
||||
header->setFixedSize(QSize(m_tileSize.width(), headerHeight));
|
||||
header->setMargin(0);
|
||||
header->setStyleSheet("background-color: rgb(35, 35, 35)");
|
||||
AzQtComponents::Text::addPrimaryStyle(header);
|
||||
AzQtComponents::Text::addLabelStyle(header);
|
||||
itemWidget->layout()->addWidget(header);
|
||||
|
||||
AzToolsFramework::Thumbnailer::ThumbnailWidget* thumbnail = new AzToolsFramework::Thumbnailer::ThumbnailWidget(itemWidget);
|
||||
thumbnail->setFixedSize(m_tileSize);
|
||||
thumbnail->SetThumbnailKey(
|
||||
MAKE_TKEY(AzToolsFramework::AssetBrowser::ProductThumbnailKey, selectableAsset.m_assetId),
|
||||
AzToolsFramework::Thumbnailer::ThumbnailContext::DefaultContext);
|
||||
thumbnail->updateGeometry();
|
||||
itemWidget->layout()->addWidget(thumbnail);
|
||||
|
||||
m_ui->m_assetList->setItemWidget(item, itemWidget);
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
void AssetGridDialog::SetupAssetList()
|
||||
{
|
||||
m_ui->m_assetList->setFlow(QListView::LeftToRight);
|
||||
m_ui->m_assetList->setResizeMode(QListView::Adjust);
|
||||
m_ui->m_assetList->setGridSize(QSize(0, 0));
|
||||
m_ui->m_assetList->setWrapping(true);
|
||||
|
||||
QObject::connect(m_ui->m_assetList, &QListWidget::currentItemChanged, [this](){ SelectCurrentAsset(); });
|
||||
}
|
||||
|
||||
void AssetGridDialog::SetupSearchWidget()
|
||||
{
|
||||
m_ui->m_searchWidget->setReadOnly(false);
|
||||
m_ui->m_searchWidget->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
AzQtComponents::LineEdit::applySearchStyle(m_ui->m_searchWidget);
|
||||
connect(m_ui->m_searchWidget, &QLineEdit::textChanged, this, [this](){ ApplySearchFilter(); });
|
||||
connect(m_ui->m_searchWidget, &QWidget::customContextMenuRequested, this, [this](const QPoint& pos){ ShowSearchMenu(pos); });
|
||||
}
|
||||
|
||||
void AssetGridDialog::SetupDialogButtons()
|
||||
{
|
||||
connect(m_ui->m_buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
|
||||
connect(m_ui->m_buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
|
||||
connect(this, &QDialog::rejected, this, [this](){ SelectInitialAsset(); });
|
||||
}
|
||||
|
||||
void AssetGridDialog::ApplySearchFilter()
|
||||
{
|
||||
for (int index = 0; index < m_ui->m_assetList->count(); ++index)
|
||||
{
|
||||
QListWidgetItem* item = m_ui->m_assetList->item(index);
|
||||
const QString& title = item->data(Qt::DisplayRole).toString();
|
||||
const QString filter = m_ui->m_searchWidget->text();
|
||||
item->setHidden(!filter.isEmpty() && !title.contains(filter, Qt::CaseInsensitive));
|
||||
}
|
||||
}
|
||||
|
||||
void AssetGridDialog::ShowSearchMenu(const QPoint& pos)
|
||||
{
|
||||
QScopedPointer<QMenu> menu(m_ui->m_searchWidget->createStandardContextMenu());
|
||||
menu->setStyleSheet("background-color: #333333");
|
||||
menu->exec(m_ui->m_searchWidget->mapToGlobal(pos));
|
||||
}
|
||||
|
||||
void AssetGridDialog::SelectCurrentAsset()
|
||||
{
|
||||
auto item = m_ui->m_assetList->currentItem();
|
||||
if (item)
|
||||
{
|
||||
AZ::Data::AssetId assetId = AZ::Data::AssetId::CreateString(item->data(Qt::UserRole).toString().toUtf8().constData());
|
||||
emit AssetSelected(assetId);
|
||||
}
|
||||
}
|
||||
|
||||
void AssetGridDialog::SelectInitialAsset()
|
||||
{
|
||||
emit AssetSelected(m_initialSelectedAsset);
|
||||
}
|
||||
} // namespace AtomToolsFramework
|
||||
|
||||
#include <AtomToolsFramework/AssetGridDialog/moc_AssetGridDialog.cpp>
|
||||
@ -1,73 +0,0 @@
|
||||
/*
|
||||
* 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 <Atom/Feature/Utils/LightingPreset.h>
|
||||
#include <Atom/RPI.Edit/Common/AssetUtils.h>
|
||||
#include <AtomToolsFramework/Util/Util.h>
|
||||
#include <AzFramework/Application/Application.h>
|
||||
#include <Viewport/MaterialViewportRequestBus.h>
|
||||
#include <Window/PresetBrowserDialogs/LightingPresetBrowserDialog.h>
|
||||
|
||||
namespace MaterialEditor
|
||||
{
|
||||
LightingPresetBrowserDialog::LightingPresetBrowserDialog(QWidget* parent)
|
||||
: PresetBrowserDialog(parent)
|
||||
{
|
||||
QSignalBlocker signalBlocker(this);
|
||||
|
||||
setWindowTitle("Lighting Preset Browser");
|
||||
|
||||
MaterialViewportRequestBus::BroadcastResult(m_initialPreset, &MaterialViewportRequestBus::Events::GetLightingPresetSelection);
|
||||
|
||||
AZ::Render::LightingPresetPtrVector presets;
|
||||
MaterialViewportRequestBus::BroadcastResult(presets, &MaterialViewportRequestBus::Events::GetLightingPresets);
|
||||
AZStd::sort(presets.begin(), presets.end(), [](const auto& a, const auto& b) { return a->m_displayName < b->m_displayName; });
|
||||
|
||||
const int itemSize = aznumeric_cast<int>(
|
||||
AtomToolsFramework::GetSettingOrDefault<AZ::u64>("/O3DE/Atom/MaterialEditor/PresetBrowserDialog/LightingItemSize", 180));
|
||||
|
||||
QListWidgetItem* selectedItem = nullptr;
|
||||
for (const auto& preset : presets)
|
||||
{
|
||||
AZStd::string path;
|
||||
MaterialViewportRequestBus::BroadcastResult(path, &MaterialViewportRequestBus::Events::GetLightingPresetLastSavePath, preset);
|
||||
QListWidgetItem* item = CreateListItem(
|
||||
preset->m_displayName.c_str(), AZ::RPI::AssetUtils::MakeAssetId(path, 0).GetValue(), QSize(itemSize, itemSize));
|
||||
|
||||
m_listItemToPresetMap[item] = preset;
|
||||
|
||||
if (m_initialPreset == preset)
|
||||
{
|
||||
selectedItem = item;
|
||||
}
|
||||
}
|
||||
|
||||
if (selectedItem)
|
||||
{
|
||||
m_ui->m_presetList->setCurrentItem(selectedItem);
|
||||
m_ui->m_presetList->scrollToItem(selectedItem);
|
||||
}
|
||||
}
|
||||
|
||||
void LightingPresetBrowserDialog::SelectCurrentPreset()
|
||||
{
|
||||
auto presetItr = m_listItemToPresetMap.find(m_ui->m_presetList->currentItem());
|
||||
if (presetItr != m_listItemToPresetMap.end())
|
||||
{
|
||||
MaterialViewportRequestBus::Broadcast(&MaterialViewportRequestBus::Events::SelectLightingPreset, presetItr->second);
|
||||
}
|
||||
}
|
||||
|
||||
void LightingPresetBrowserDialog::SelectInitialPreset()
|
||||
{
|
||||
MaterialViewportRequestBus::Broadcast(&MaterialViewportRequestBus::Events::SelectLightingPreset, m_initialPreset);
|
||||
}
|
||||
|
||||
} // namespace MaterialEditor
|
||||
|
||||
#include <Window/PresetBrowserDialogs/moc_LightingPresetBrowserDialog.cpp>
|
||||
@ -1,36 +0,0 @@
|
||||
/*
|
||||
* 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
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#if !defined(Q_MOC_RUN)
|
||||
#include <Atom/Feature/Utils/LightingPreset.h>
|
||||
#include <AzCore/std/containers/vector.h>
|
||||
#include <Viewport/MaterialViewportNotificationBus.h>
|
||||
#endif
|
||||
|
||||
#include <Window/PresetBrowserDialogs/PresetBrowserDialog.h>
|
||||
|
||||
namespace MaterialEditor
|
||||
{
|
||||
//! Widget for managing and selecting from a library of preset assets
|
||||
class LightingPresetBrowserDialog : public PresetBrowserDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
LightingPresetBrowserDialog(QWidget* parent = nullptr);
|
||||
~LightingPresetBrowserDialog() = default;
|
||||
|
||||
private:
|
||||
void SelectCurrentPreset() override;
|
||||
void SelectInitialPreset() override;
|
||||
|
||||
AZ::Render::LightingPresetPtr m_initialPreset;
|
||||
AZStd::unordered_map<QListWidgetItem*, AZ::Render::LightingPresetPtr> m_listItemToPresetMap;
|
||||
};
|
||||
} // namespace MaterialEditor
|
||||
@ -1,69 +0,0 @@
|
||||
/*
|
||||
* 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 <Atom/Feature/Utils/ModelPreset.h>
|
||||
#include <AtomToolsFramework/Util/Util.h>
|
||||
#include <AzFramework/Application/Application.h>
|
||||
#include <Viewport/MaterialViewportRequestBus.h>
|
||||
#include <Window/PresetBrowserDialogs/ModelPresetBrowserDialog.h>
|
||||
|
||||
namespace MaterialEditor
|
||||
{
|
||||
ModelPresetBrowserDialog::ModelPresetBrowserDialog(QWidget* parent)
|
||||
: PresetBrowserDialog(parent)
|
||||
{
|
||||
QSignalBlocker signalBlocker(this);
|
||||
|
||||
setWindowTitle("Model Preset Browser");
|
||||
|
||||
MaterialViewportRequestBus::BroadcastResult(m_initialPreset, &MaterialViewportRequestBus::Events::GetModelPresetSelection);
|
||||
|
||||
AZ::Render::ModelPresetPtrVector presets;
|
||||
MaterialViewportRequestBus::BroadcastResult(presets, &MaterialViewportRequestBus::Events::GetModelPresets);
|
||||
AZStd::sort(presets.begin(), presets.end(), [](const auto& a, const auto& b) { return a->m_displayName < b->m_displayName; });
|
||||
|
||||
const int itemSize = aznumeric_cast<int>(
|
||||
AtomToolsFramework::GetSettingOrDefault<AZ::u64>("/O3DE/Atom/MaterialEditor/PresetBrowserDialog/ModelItemSize", 90));
|
||||
|
||||
QListWidgetItem* selectedItem = nullptr;
|
||||
for (const auto& preset : presets)
|
||||
{
|
||||
QListWidgetItem* item = CreateListItem(preset->m_displayName.c_str(), preset->m_modelAsset.GetId(), QSize(itemSize, itemSize));
|
||||
|
||||
m_listItemToPresetMap[item] = preset;
|
||||
|
||||
if (m_initialPreset == preset)
|
||||
{
|
||||
selectedItem = item;
|
||||
}
|
||||
}
|
||||
|
||||
if (selectedItem)
|
||||
{
|
||||
m_ui->m_presetList->setCurrentItem(selectedItem);
|
||||
m_ui->m_presetList->scrollToItem(selectedItem);
|
||||
}
|
||||
}
|
||||
|
||||
void ModelPresetBrowserDialog::SelectCurrentPreset()
|
||||
{
|
||||
auto presetItr = m_listItemToPresetMap.find(m_ui->m_presetList->currentItem());
|
||||
if (presetItr != m_listItemToPresetMap.end())
|
||||
{
|
||||
MaterialViewportRequestBus::Broadcast(&MaterialViewportRequestBus::Events::SelectModelPreset, presetItr->second);
|
||||
}
|
||||
}
|
||||
|
||||
void ModelPresetBrowserDialog::SelectInitialPreset()
|
||||
{
|
||||
MaterialViewportRequestBus::Broadcast(&MaterialViewportRequestBus::Events::SelectModelPreset, m_initialPreset);
|
||||
}
|
||||
|
||||
} // namespace MaterialEditor
|
||||
|
||||
#include <Window/PresetBrowserDialogs/moc_ModelPresetBrowserDialog.cpp>
|
||||
@ -1,36 +0,0 @@
|
||||
/*
|
||||
* 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
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#if !defined(Q_MOC_RUN)
|
||||
#include <Atom/Feature/Utils/ModelPreset.h>
|
||||
#include <AzCore/std/containers/vector.h>
|
||||
#include <Viewport/MaterialViewportNotificationBus.h>
|
||||
#endif
|
||||
|
||||
#include <Window/PresetBrowserDialogs/PresetBrowserDialog.h>
|
||||
|
||||
namespace MaterialEditor
|
||||
{
|
||||
//! Widget for managing and selecting from a library of preset assets
|
||||
class ModelPresetBrowserDialog : public PresetBrowserDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
ModelPresetBrowserDialog(QWidget* parent = nullptr);
|
||||
~ModelPresetBrowserDialog() = default;
|
||||
|
||||
private:
|
||||
void SelectCurrentPreset() override;
|
||||
void SelectInitialPreset() override;
|
||||
|
||||
AZ::Render::ModelPresetPtr m_initialPreset;
|
||||
AZStd::unordered_map<QListWidgetItem*, AZ::Render::ModelPresetPtr> m_listItemToPresetMap;
|
||||
};
|
||||
} // namespace MaterialEditor
|
||||
@ -1,133 +0,0 @@
|
||||
/*
|
||||
* 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 <AtomToolsFramework/Util/Util.h>
|
||||
#include <AzFramework/Application/Application.h>
|
||||
#include <AzQtComponents/Components/StyleManager.h>
|
||||
#include <AzQtComponents/Components/Widgets/ElidingLabel.h>
|
||||
#include <AzQtComponents/Components/Widgets/LineEdit.h>
|
||||
#include <AzQtComponents/Components/Widgets/Text.h>
|
||||
#include <AzToolsFramework/AssetBrowser/Thumbnails/ProductThumbnail.h>
|
||||
#include <AzToolsFramework/Thumbnails/ThumbnailContext.h>
|
||||
#include <AzToolsFramework/Thumbnails/ThumbnailWidget.h>
|
||||
#include <AzToolsFramework/Thumbnails/ThumbnailerBus.h>
|
||||
#include <Window/PresetBrowserDialogs/PresetBrowserDialog.h>
|
||||
|
||||
#include <QLabel>
|
||||
#include <QLineEdit>
|
||||
#include <QMenu>
|
||||
#include <QVBoxLayout>
|
||||
|
||||
namespace MaterialEditor
|
||||
{
|
||||
PresetBrowserDialog::PresetBrowserDialog(QWidget* parent)
|
||||
: QDialog(parent)
|
||||
, m_ui(new Ui::PresetBrowserDialog)
|
||||
{
|
||||
m_ui->setupUi(this);
|
||||
|
||||
QSignalBlocker signalBlocker(this);
|
||||
|
||||
SetupPresetList();
|
||||
SetupSearchWidget();
|
||||
SetupDialogButtons();
|
||||
setModal(true);
|
||||
}
|
||||
|
||||
void PresetBrowserDialog::SetupPresetList()
|
||||
{
|
||||
m_ui->m_presetList->setFlow(QListView::LeftToRight);
|
||||
m_ui->m_presetList->setResizeMode(QListView::Adjust);
|
||||
m_ui->m_presetList->setGridSize(QSize(0, 0));
|
||||
m_ui->m_presetList->setWrapping(true);
|
||||
|
||||
QObject::connect(m_ui->m_presetList, &QListWidget::currentItemChanged, [this](){ SelectCurrentPreset(); });
|
||||
}
|
||||
|
||||
QListWidgetItem* PresetBrowserDialog::CreateListItem(const QString& title, const AZ::Data::AssetId& assetId, const QSize& size)
|
||||
{
|
||||
const int itemBorder = aznumeric_cast<int>(
|
||||
AtomToolsFramework::GetSettingOrDefault<AZ::u64>("/O3DE/Atom/MaterialEditor/PresetBrowserDialog/ItemBorder", 4));
|
||||
const int itemSpacing = aznumeric_cast<int>(
|
||||
AtomToolsFramework::GetSettingOrDefault<AZ::u64>("/O3DE/Atom/MaterialEditor/PresetBrowserDialog/ItemSpacing", 10));
|
||||
const int headerHeight = aznumeric_cast<int>(
|
||||
AtomToolsFramework::GetSettingOrDefault<AZ::u64>("/O3DE/Atom/MaterialEditor/PresetBrowserDialog/HeaderHeight", 15));
|
||||
|
||||
const QSize gridSize = m_ui->m_presetList->gridSize();
|
||||
m_ui->m_presetList->setGridSize(QSize(
|
||||
AZStd::max(gridSize.width(), size.width() + itemSpacing),
|
||||
AZStd::max(gridSize.height(), size.height() + itemSpacing + headerHeight)));
|
||||
|
||||
QListWidgetItem* item = new QListWidgetItem(m_ui->m_presetList);
|
||||
item->setData(Qt::UserRole, title);
|
||||
item->setSizeHint(size + QSize(itemBorder, itemBorder + headerHeight));
|
||||
m_ui->m_presetList->addItem(item);
|
||||
|
||||
QWidget* itemWidget = new QWidget(m_ui->m_presetList);
|
||||
itemWidget->setLayout(new QVBoxLayout(itemWidget));
|
||||
itemWidget->layout()->setSpacing(0);
|
||||
itemWidget->layout()->setMargin(0);
|
||||
|
||||
AzQtComponents::ElidingLabel* header = new AzQtComponents::ElidingLabel(itemWidget);
|
||||
header->setText(title);
|
||||
header->setFixedSize(QSize(size.width(), headerHeight));
|
||||
header->setMargin(0);
|
||||
header->setStyleSheet("background-color: rgb(35, 35, 35)");
|
||||
AzQtComponents::Text::addPrimaryStyle(header);
|
||||
AzQtComponents::Text::addLabelStyle(header);
|
||||
itemWidget->layout()->addWidget(header);
|
||||
|
||||
AzToolsFramework::Thumbnailer::ThumbnailWidget* thumbnail = new AzToolsFramework::Thumbnailer::ThumbnailWidget(itemWidget);
|
||||
thumbnail->setFixedSize(size);
|
||||
thumbnail->SetThumbnailKey(
|
||||
MAKE_TKEY(AzToolsFramework::AssetBrowser::ProductThumbnailKey, assetId),
|
||||
AzToolsFramework::Thumbnailer::ThumbnailContext::DefaultContext);
|
||||
thumbnail->updateGeometry();
|
||||
itemWidget->layout()->addWidget(thumbnail);
|
||||
|
||||
m_ui->m_presetList->setItemWidget(item, itemWidget);
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
void PresetBrowserDialog::SetupSearchWidget()
|
||||
{
|
||||
m_ui->m_searchWidget->setReadOnly(false);
|
||||
m_ui->m_searchWidget->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
AzQtComponents::LineEdit::applySearchStyle(m_ui->m_searchWidget);
|
||||
connect(m_ui->m_searchWidget, &QLineEdit::textChanged, this, [this](){ ApplySearchFilter(); });
|
||||
connect(m_ui->m_searchWidget, &QWidget::customContextMenuRequested, this, [this](const QPoint& pos){ ShowSearchMenu(pos); });
|
||||
}
|
||||
|
||||
void PresetBrowserDialog::SetupDialogButtons()
|
||||
{
|
||||
connect(m_ui->m_buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
|
||||
connect(m_ui->m_buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
|
||||
connect(this, &QDialog::rejected, this, [this](){ SelectInitialPreset(); });
|
||||
}
|
||||
|
||||
void PresetBrowserDialog::ApplySearchFilter()
|
||||
{
|
||||
for (int index = 0; index < m_ui->m_presetList->count(); ++index)
|
||||
{
|
||||
QListWidgetItem* item = m_ui->m_presetList->item(index);
|
||||
const QString& title = item->data(Qt::UserRole).toString();
|
||||
const QString filter = m_ui->m_searchWidget->text();
|
||||
item->setHidden(!filter.isEmpty() && !title.contains(filter, Qt::CaseInsensitive));
|
||||
}
|
||||
}
|
||||
|
||||
void PresetBrowserDialog::ShowSearchMenu(const QPoint& pos)
|
||||
{
|
||||
QScopedPointer<QMenu> menu(m_ui->m_searchWidget->createStandardContextMenu());
|
||||
menu->setStyleSheet("background-color: #333333");
|
||||
menu->exec(m_ui->m_searchWidget->mapToGlobal(pos));
|
||||
}
|
||||
} // namespace MaterialEditor
|
||||
|
||||
#include <Window/PresetBrowserDialogs/moc_PresetBrowserDialog.cpp>
|
||||
@ -1,46 +0,0 @@
|
||||
/*
|
||||
* 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
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#if !defined(Q_MOC_RUN)
|
||||
#include <AzCore/Asset/AssetCommon.h>
|
||||
#include <AzCore/std/containers/vector.h>
|
||||
#include <QDialog>
|
||||
#endif
|
||||
|
||||
#include <Window/PresetBrowserDialogs/ui_PresetBrowserDialog.h>
|
||||
|
||||
class QImage;
|
||||
class QListWidgetItem;
|
||||
class QString;
|
||||
|
||||
namespace MaterialEditor
|
||||
{
|
||||
//! Widget for managing and selecting from a library of preset assets
|
||||
class PresetBrowserDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
PresetBrowserDialog(QWidget* parent = nullptr);
|
||||
~PresetBrowserDialog() = default;
|
||||
|
||||
protected:
|
||||
void SetupPresetList();
|
||||
QListWidgetItem* CreateListItem(const QString& title, const AZ::Data::AssetId& assetId, const QSize& size);
|
||||
|
||||
void SetupSearchWidget();
|
||||
void SetupDialogButtons();
|
||||
void ApplySearchFilter();
|
||||
void ShowSearchMenu(const QPoint& pos);
|
||||
virtual void SelectCurrentPreset() = 0;
|
||||
virtual void SelectInitialPreset() = 0;
|
||||
|
||||
QScopedPointer<Ui::PresetBrowserDialog> m_ui;
|
||||
};
|
||||
} // namespace MaterialEditor
|
||||
Loading…
Reference in New Issue