/* * 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 #include #include #include #include #include #include #include #include #include #include namespace AZ { namespace SceneAPI { namespace UI { ManifestWidget::ManifestWidget(SerializeContext* serializeContext, QWidget* parent) : QWidget(parent) , ui(new Ui::ManifestWidget()) , m_serializeContext(serializeContext) { ui->setupUi(this); AzQtComponents::TabWidget::applySecondaryStyle(ui->m_tabs, false); } ManifestWidget::~ManifestWidget() { } void ManifestWidget::BuildFromScene(const AZStd::shared_ptr& scene) { AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Editor); ui->m_tabs->clear(); m_pages.clear(); m_scene = scene; if (!scene) { return; } BuildPages(); Containers::SceneManifest& manifest = scene->GetManifest(); for (auto& value : manifest.GetValueStorage()) { AddObject(value); } for (ManifestWidgetPage* page : m_pages) { page->RefreshPage(); } // Make sure to reset the active tab if the active tab is now empty ManifestWidgetPage* currentPage = qobject_cast(ui->m_tabs->currentWidget()); if (currentPage == nullptr || currentPage->ObjectCount() == 0) { for (ManifestWidgetPage* page : m_pages) { if (page->ObjectCount() > 0) { ui->m_tabs->setCurrentWidget(page); break; } } } } bool ManifestWidget::AddObject(const AZStd::shared_ptr& object) { AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::Editor); for (ManifestWidgetPage* page : m_pages) { if (page->SupportsType(object)) { return page->AddObject(object); } } return false; } bool ManifestWidget::RemoveObject(const AZStd::shared_ptr& object) { for (ManifestWidgetPage* page : m_pages) { if (page->SupportsType(object)) { return page->RemoveObject(object); } } return false; } AZStd::shared_ptr ManifestWidget::GetScene() { return m_scene; } AZStd::shared_ptr ManifestWidget::GetScene() const { return m_scene; } ManifestWidget* ManifestWidget::FindRoot(QWidget* child) { while (child != nullptr) { ManifestWidget* manifestWidget = qobject_cast(child); if (manifestWidget) { return manifestWidget; } else { child = child->parentWidget(); } } return nullptr; } const ManifestWidget* ManifestWidget::FindRoot(const QWidget* child) { while (child != nullptr) { const ManifestWidget* manifestWidget = qobject_cast(child); if (manifestWidget) { return manifestWidget; } else { child = child->parentWidget(); } } return nullptr; } void ManifestWidget::BuildPages() { if (!m_scene) { return; } Events::ManifestMetaInfo::CategoryRegistrationList categories; EBUS_EVENT(Events::ManifestMetaInfoBus, GetCategoryAssignments, categories, *m_scene); AZStd::sort(categories.begin(), categories.end(), [](const Events::ManifestMetaInfo::CategoryRegistration& lhs, const Events::ManifestMetaInfo::CategoryRegistration& rhs) { return (rhs.m_preferredOrder - lhs.m_preferredOrder) > 0; } ); AZStd::string currentCategory; AZStd::vector types; for (auto& category : categories) { if (category.m_categoryName != currentCategory) { // Skip first occurrence. if (!currentCategory.empty()) { ManifestWidgetPage* page = new ManifestWidgetPage(m_serializeContext, AZStd::move(types)); AddPage(currentCategory.c_str(), page); } currentCategory = category.m_categoryName; AZ_Assert(types.empty(), "Expecting vectors to be empty after being moved."); } types.push_back(category.m_categoryTargetGroupId); } // Add final page if (!currentCategory.empty()) { ManifestWidgetPage* page = new ManifestWidgetPage(m_serializeContext, AZStd::move(types)); AddPage(currentCategory.c_str(), page); } } void ManifestWidget::AddPage(const QString& category, ManifestWidgetPage* page) { m_pages.push_back(page); ui->m_tabs->addTab(page, category); } } // namespace UI } // namespace SceneAPI } // namespace AZ #include