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/Gems/LandscapeCanvas/Code/Source/Editor/Menus/SceneContextMenuActions.cpp

92 lines
3.7 KiB
C++

/*
* 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
*
*/
// AZ
#include <AzToolsFramework/API/ToolsApplicationAPI.h>
// GraphModel
#include <GraphModel/GraphModelBus.h>
// Landscape Canvas
#include <Editor/Core/Core.h>
#include <Editor/Nodes/BaseNode.h>
#include <Editor/Menus/SceneContextMenuActions.h>
namespace LandscapeCanvasEditor
{
FindSelectedNodesAction::FindSelectedNodesAction(QObject* parent)
: GraphCanvas::ContextMenuAction("", parent)
{
UpdateActionState();
QString tooltip = QObject::tr("Select the corresponding node(s) in the graph based on the Vegetation Entities that are selected in the Editor");
setToolTip(tooltip);
setStatusTip(tooltip);
}
GraphCanvas::ActionGroupId FindSelectedNodesAction::GetActionGroupId() const
{
return AZ_CRC("SceneActionGroup", 0x284f71aa);
}
void FindSelectedNodesAction::RefreshAction(const GraphCanvas::GraphId& graphId, const AZ::EntityId& targetId)
{
AZ_UNUSED(graphId);
AZ_UNUSED(targetId);
UpdateActionState();
}
GraphCanvas::ContextMenuAction::SceneReaction FindSelectedNodesAction::TriggerAction(const GraphCanvas::GraphId& graphId, [[maybe_unused]] const AZ::Vector2& scenePos)
{
// Find the selected Entities in the Editor
AzToolsFramework::EntityIdList selectedEntities;
AzToolsFramework::ToolsApplicationRequests::Bus::BroadcastResult(selectedEntities, &AzToolsFramework::ToolsApplicationRequests::GetSelectedEntities);
// Retrieve all the nodes in our scene
GraphModel::NodePtrList nodeList;
GraphModelIntegration::GraphControllerRequestBus::EventResult(nodeList, graphId, &GraphModelIntegration::GraphControllerRequests::GetNodes);
// Find the nodes in our scene that correspond to the Entities
GraphModel::NodePtrList nodesToSelect;
for (const auto& node : nodeList)
{
auto baseNodePtr = static_cast<LandscapeCanvas::BaseNode*>(node.get());
auto it = AZStd::find(selectedEntities.begin(), selectedEntities.end(), baseNodePtr->GetVegetationEntityId());
if (it != selectedEntities.end())
{
nodesToSelect.push_back(node);
}
}
if (nodesToSelect.empty())
{
QString warningMessage = selectedEntities.size() > 1 ? QObject::tr("The selected Entities are not present in the graph") : QObject::tr("The selected Entity is not present in the graph");
AZ_Warning("LandscapeCanvas", false, warningMessage.toUtf8().constData());
}
else
{
GraphModelIntegration::GraphControllerRequestBus::Event(graphId, &GraphModelIntegration::GraphControllerRequests::ClearSelection);
GraphModelIntegration::GraphControllerRequestBus::Event(graphId, &GraphModelIntegration::GraphControllerRequests::SetSelected, nodesToSelect, true);
GraphModelIntegration::GraphControllerRequestBus::Event(graphId, &GraphModelIntegration::GraphControllerRequests::CenterOnNodes, nodesToSelect);
}
return GraphCanvas::ContextMenuAction::SceneReaction::Nothing;
}
void FindSelectedNodesAction::UpdateActionState()
{
AzToolsFramework::EntityIdList selectedEntities;
AzToolsFramework::ToolsApplicationRequests::Bus::BroadcastResult(selectedEntities, &AzToolsFramework::ToolsApplicationRequests::GetSelectedEntities);
setText(selectedEntities.size() > 1 ? QObject::tr("Find Selected Entities in Graph") : QObject::tr("Find Selected Entity in Graph"));
setEnabled(!selectedEntities.empty());
}
}