|
@@ -17,6 +17,7 @@
|
|
|
#include <SceneAPI/SceneCore/Containers/Scene.h>
|
|
|
#include <SceneAPI/SceneCore/Containers/SceneManifest.h>
|
|
|
#include <SceneAPI/SceneCore/DataTypes/Groups/ISceneNodeGroup.h>
|
|
|
+#include <SceneAPI/SceneCore/DataTypes/Rules/IUnmodifiableRule.h>
|
|
|
#include <SceneAPI/SceneCore/Utilities/Reporting.h>
|
|
|
#include <SceneAPI/SceneCore/Events/ManifestMetaInfoBus.h>
|
|
|
#include <SceneAPI/SceneUI/RowWidgets/HeaderWidget.h>
|
|
@@ -43,7 +44,6 @@ namespace AZ
|
|
|
: QWidget(parent)
|
|
|
, ui(new Ui::HeaderWidget())
|
|
|
, m_target(nullptr)
|
|
|
- , m_nameIsEditable(false)
|
|
|
, m_sceneManifest(nullptr)
|
|
|
{
|
|
|
InitSceneUIHeaderWidgetResources();
|
|
@@ -54,7 +54,7 @@ namespace AZ
|
|
|
ui->m_headerLine->hide();
|
|
|
ui->m_headerLineSpacer->hide();
|
|
|
|
|
|
- ui->m_deleteButton->setIcon(QIcon(":/PropertyEditor/Resources/cross-small.png"));
|
|
|
+ ui->m_deleteButton->setIcon(QIcon(":/stylesheet/img/close_small.svg"));
|
|
|
connect(ui->m_deleteButton, &QToolButton::clicked, this, &HeaderWidget::DeleteObject);
|
|
|
ui->m_deleteButton->hide();
|
|
|
|
|
@@ -82,6 +82,39 @@ namespace AZ
|
|
|
return m_target;
|
|
|
}
|
|
|
|
|
|
+ bool HeaderWidget::ModifyTooltip(QString& toolTipString)
|
|
|
+ {
|
|
|
+ if (!m_target)
|
|
|
+ {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (m_target->RTTI_IsTypeOf(DataTypes::IGroup::TYPEINFO_Uuid()))
|
|
|
+ {
|
|
|
+ const DataTypes::IGroup* group = azrtti_cast<const DataTypes::IGroup*>(m_target);
|
|
|
+
|
|
|
+ const Containers::RuleContainer& rules = group->GetRuleContainerConst();
|
|
|
+ // Multiple rules might change the tooltip, so loop through all rules.
|
|
|
+ bool ruleChangedTooltip = false;
|
|
|
+ // Rules don't all have access to Qt
|
|
|
+ AZStd::string ruleTooltip;
|
|
|
+ for (size_t ruleIndex = 0; ruleIndex < rules.GetRuleCount(); ++ruleIndex)
|
|
|
+ {
|
|
|
+ if (rules.GetRule(ruleIndex)->ModifyTooltip(ruleTooltip))
|
|
|
+ {
|
|
|
+ ruleChangedTooltip = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (ruleChangedTooltip)
|
|
|
+ {
|
|
|
+ toolTipString = QString("%1%2").arg(ruleTooltip.c_str()).arg(toolTipString);
|
|
|
+ }
|
|
|
+
|
|
|
+ return ruleChangedTooltip;
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
void HeaderWidget::DeleteObject()
|
|
|
{
|
|
|
AZ_TraceContext("Delete target", GetSerializedName(m_target));
|
|
@@ -91,8 +124,10 @@ namespace AZ
|
|
|
Containers::SceneManifest::Index index = m_sceneManifest->FindIndex(m_target);
|
|
|
if (index != Containers::SceneManifest::s_invalidIndex)
|
|
|
{
|
|
|
- AZ_TraceContext("Manifest index", static_cast<int>(index));
|
|
|
ManifestWidget* root = ManifestWidget::FindRoot(this);
|
|
|
+
|
|
|
+ AZStd::vector<const AZ::SceneAPI::DataTypes::IManifestObject*> otherObjectsToRemove;
|
|
|
+ m_target->GetManifestObjectsToRemoveOnRemoved(otherObjectsToRemove, *m_sceneManifest);
|
|
|
// The manifest object could be a root element at the manifest page level so it needs to be
|
|
|
// removed from there as well in that case.
|
|
|
if (root->RemoveObject(m_sceneManifest->GetValue(index)) && m_sceneManifest->RemoveEntry(m_target))
|
|
@@ -101,6 +136,13 @@ namespace AZ
|
|
|
// Hide and disable the button so when users spam the delete button only a single click is recorded.
|
|
|
ui->m_deleteButton->hide();
|
|
|
ui->m_deleteButton->setEnabled(false);
|
|
|
+
|
|
|
+ for (auto* toRemove : otherObjectsToRemove)
|
|
|
+ {
|
|
|
+ index = m_sceneManifest->FindIndex(toRemove);
|
|
|
+ root->RemoveObject(m_sceneManifest->GetValue(index));
|
|
|
+ m_sceneManifest->RemoveEntry(toRemove);
|
|
|
+ }
|
|
|
return;
|
|
|
}
|
|
|
else
|
|
@@ -140,6 +182,19 @@ namespace AZ
|
|
|
{
|
|
|
ui->m_deleteButton->hide();
|
|
|
|
|
|
+ // If this widget has the unmodifiable rule, then this can't be deleted.
|
|
|
+ // Even though the delete button would be disabled, it's even more clear it can't be deleted if it's not visible.
|
|
|
+ if (m_target->RTTI_IsTypeOf(DataTypes::IGroup::TYPEINFO_Uuid()))
|
|
|
+ {
|
|
|
+ const DataTypes::IGroup* sceneNodeGroup = azrtti_cast<const DataTypes::IGroup*>(m_target);
|
|
|
+ const Containers::RuleContainer& rules = sceneNodeGroup->GetRuleContainerConst();
|
|
|
+ if (rules.FindFirstByType<AZ::SceneAPI::DataTypes::IUnmodifiableRule>())
|
|
|
+ {
|
|
|
+ // This header is unmodifiable, so leave the delete button hidden.
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
if (m_sceneManifest)
|
|
|
{
|
|
|
Containers::SceneManifest::Index index = m_sceneManifest->FindIndex(m_target);
|
|
@@ -196,8 +251,7 @@ namespace AZ
|
|
|
// show have a visual divider, and potentially the icon.
|
|
|
if (target->RTTI_IsTypeOf(DataTypes::IGroup::TYPEINFO_Uuid()))
|
|
|
{
|
|
|
- sceneNodeGroup = azrtti_cast<const DataTypes::IGroup*>(&target);
|
|
|
-
|
|
|
+ sceneNodeGroup = azrtti_cast<const DataTypes::IGroup*>(target);
|
|
|
AZ::SerializeContext* serializeContext = nullptr;
|
|
|
AZ::ComponentApplicationBus::BroadcastResult(serializeContext, &AZ::ComponentApplicationBus::Events::GetSerializeContext);
|
|
|
AZ_Assert(serializeContext, "No serialize context");
|