3
0

LoggingWindowTreeItems.cpp 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <AzFramework/StringFunc/StringFunc.h>
  9. #include <AzToolsFramework/API/EditorAssetSystemAPI.h>
  10. #include <GraphCanvas/Components/Nodes/NodeTitleBus.h>
  11. #include <GraphCanvas/Components/Slots/SlotBus.h>
  12. #include <GraphCanvas/Components/StyleBus.h>
  13. #include <GraphCanvas/Utils/GraphUtils.h>
  14. #include <Editor/View/Widgets/LoggingPanel/LoggingWindowTreeItems.h>
  15. #include <Editor/GraphCanvas/GraphCanvasEditorNotificationBusId.h>
  16. #include <Editor/Include/ScriptCanvas/GraphCanvas/NodeDescriptorBus.h>
  17. #include <Editor/View/Widgets/LoggingPanel/LoggingDataAggregator.h>
  18. #include <Editor/View/Widgets/AssetGraphSceneDataBus.h>
  19. #include <Editor/View/Widgets/NodePalette/NodePaletteModel.h>
  20. #include <ScriptCanvas/Bus/RequestBus.h>
  21. #include <ScriptCanvas/GraphCanvas/MappingBus.h>
  22. #include <Editor/GraphCanvas/GraphCanvasEditorNotificationBusId.h>
  23. namespace ScriptCanvasEditor
  24. {
  25. /////////////////////
  26. // DebugLogTreeItem
  27. /////////////////////
  28. bool DebugLogTreeItem::MatchesFilter(const DebugLogFilter& treeFilter)
  29. {
  30. DebugLogTreeItem* parent = static_cast<DebugLogTreeItem*>(GetParent());
  31. while (parent)
  32. {
  33. // We don't want to match against the root, since it always matches.
  34. // So only check things that have a valid parent.
  35. DebugLogTreeItem* nextParent = static_cast<DebugLogTreeItem*>(parent->GetParent());
  36. if (nextParent != nullptr && parent->OnMatchesFilter(treeFilter))
  37. {
  38. return true;
  39. }
  40. parent = static_cast<DebugLogTreeItem*>(parent->GetParent());
  41. }
  42. DebugLogTreeItem* currentItem = this;
  43. AZStd::unordered_set< DebugLogTreeItem* > children;
  44. while (currentItem)
  45. {
  46. if (currentItem->OnMatchesFilter(treeFilter))
  47. {
  48. return true;
  49. }
  50. for (int i = 0; i < currentItem->GetChildCount(); ++i)
  51. {
  52. children.insert(static_cast<DebugLogTreeItem*>(currentItem->FindChildByRow(i)));
  53. }
  54. if (!children.empty())
  55. {
  56. currentItem = (*children.begin());
  57. children.erase(children.begin());
  58. }
  59. else
  60. {
  61. currentItem = nullptr;
  62. }
  63. }
  64. return false;
  65. }
  66. const ScriptCanvas::Endpoint& DebugLogTreeItem::GetIncitingEndpoint() const
  67. {
  68. return m_incitingEndpoint;
  69. }
  70. bool DebugLogTreeItem::IsTriggeredBy(const ScriptCanvas::Endpoint& endpoint) const
  71. {
  72. return m_incitingEndpoint == endpoint;
  73. }
  74. Qt::ItemFlags DebugLogTreeItem::Flags([[maybe_unused]] const QModelIndex& index) const
  75. {
  76. return Qt::ItemFlag::ItemIsEnabled | Qt::ItemFlag::ItemIsSelectable;
  77. }
  78. int DebugLogTreeItem::GetColumnCount() const
  79. {
  80. return Column::Count;
  81. }
  82. void DebugLogTreeItem::SetIncitingEndpoint(const ScriptCanvas::Endpoint& endpoint)
  83. {
  84. m_incitingEndpoint = endpoint;
  85. }
  86. /////////////////////
  87. // DebugLogRootItem
  88. /////////////////////
  89. DebugLogRootItem::DebugLogRootItem()
  90. : m_updatePolicy(UpdatePolicy::Batched)
  91. {
  92. m_additionTimer.setSingleShot(true);
  93. m_additionTimer.setInterval(1000);
  94. QObject::connect(&m_additionTimer, &QTimer::timeout, [this]() { this->RedoLayout(); });
  95. }
  96. DebugLogRootItem::~DebugLogRootItem()
  97. {
  98. }
  99. ExecutionLogTreeItem* DebugLogRootItem::CreateExecutionItem
  100. ( [[maybe_unused]] const LoggingDataId& loggingDataId
  101. , [[maybe_unused]] const ScriptCanvas::NodeTypeIdentifier& nodeType
  102. , [[maybe_unused]] const ScriptCanvas::GraphInfo& graphInfo
  103. , [[maybe_unused]] const ScriptCanvas::NamedNodeId& nodeId)
  104. {
  105. ExecutionLogTreeItem* treeItem = nullptr;
  106. if (m_updatePolicy == UpdatePolicy::Batched)
  107. {
  108. if (!m_additionTimer.isActive())
  109. {
  110. m_additionTimer.start();
  111. }
  112. }
  113. return treeItem;
  114. }
  115. QVariant DebugLogRootItem::Data([[maybe_unused]] const QModelIndex& index, [[maybe_unused]] int role) const
  116. {
  117. return QVariant();
  118. }
  119. void DebugLogRootItem::ResetData()
  120. {
  121. SignalLayoutAboutToBeChanged();
  122. ClearChildren();
  123. SignalLayoutChanged();
  124. }
  125. void DebugLogRootItem::SetUpdatePolicy(UpdatePolicy updatePolicy)
  126. {
  127. if (m_updatePolicy != updatePolicy)
  128. {
  129. m_updatePolicy = updatePolicy;
  130. m_additionTimer.stop();
  131. }
  132. }
  133. DebugLogRootItem::UpdatePolicy DebugLogRootItem::GetUpdatePolicy() const
  134. {
  135. return m_updatePolicy;
  136. }
  137. void DebugLogRootItem::RedoLayout()
  138. {
  139. m_additionTimer.stop();
  140. SignalLayoutAboutToBeChanged();
  141. SignalLayoutChanged();
  142. }
  143. /////////////////////////
  144. // ExecutionLogTreeItem
  145. /////////////////////////
  146. ExecutionLogTreeItem::ExecutionLogTreeItem
  147. ( const LoggingDataId& loggingDataId
  148. , const ScriptCanvas::NodeTypeIdentifier& nodeType
  149. , const SourceHandle& graphInfo
  150. , const ScriptCanvas::NamedNodeId& nodeId)
  151. : m_loggingDataId(loggingDataId)
  152. , m_nodeType(nodeType)
  153. , m_graphInfo(graphInfo)
  154. , m_scriptCanvasAssetNodeId(nodeId)
  155. , m_iconPixmap(nullptr)
  156. {
  157. m_paletteConfiguration.m_iconPalette = "NodePaletteTypeIcon";
  158. m_paletteConfiguration.SetColorPalette("MethodNodeTitlePalette");
  159. AZ::NamedEntityId entityName;
  160. m_sourceEntityName = entityName.ToString().c_str();
  161. m_displayName = nodeId.m_name.c_str();
  162. ScrapeBehaviorContextData();
  163. ScrapeGraphCanvasData();
  164. m_inputName = "---";
  165. m_outputName = "---";
  166. GeneralAssetNotificationBus::Handler::BusConnect(graphInfo);
  167. }
  168. QVariant ExecutionLogTreeItem::Data(const QModelIndex& index, int role) const
  169. {
  170. switch (index.column())
  171. {
  172. case Column::NodeName:
  173. {
  174. if (role == Qt::DisplayRole
  175. || role == Qt::ToolTipRole)
  176. {
  177. return m_displayName;
  178. }
  179. else if (role == Qt::DecorationRole)
  180. {
  181. if (m_iconPixmap != nullptr)
  182. {
  183. return (*m_iconPixmap);
  184. }
  185. }
  186. }
  187. break;
  188. case Column::Input:
  189. {
  190. if (role == Qt::DisplayRole
  191. || role == Qt::ToolTipRole)
  192. {
  193. return m_inputName;
  194. }
  195. }
  196. break;
  197. case Column::Output:
  198. {
  199. if (role == Qt::DisplayRole
  200. || role == Qt::ToolTipRole)
  201. {
  202. return m_outputName;
  203. }
  204. }
  205. break;
  206. case Column::TimeStep:
  207. {
  208. if (role == Qt::DisplayRole
  209. || role == Qt::ToolTipRole)
  210. {
  211. return m_timeString;
  212. }
  213. }
  214. break;
  215. case Column::ScriptName:
  216. {
  217. if (role == Qt::DisplayRole)
  218. {
  219. return m_graphName;
  220. }
  221. else if (role == Qt::ToolTipRole)
  222. {
  223. return m_relativeGraphPath;
  224. }
  225. else if (role == Qt::ForegroundRole)
  226. {
  227. return QColor(42,132,252);
  228. }
  229. else if (role == Qt::FontRole)
  230. {
  231. QFont font;
  232. font.setUnderline(true);
  233. return font;
  234. }
  235. }
  236. break;
  237. case Column::SourceEntity:
  238. {
  239. if (role == Qt::DisplayRole
  240. || role == Qt::ToolTipRole)
  241. {
  242. return m_sourceEntityName;
  243. }
  244. }
  245. break;
  246. default:
  247. break;
  248. }
  249. return QVariant();
  250. }
  251. AZ::EntityId ExecutionLogTreeItem::GetNodeId() const
  252. {
  253. return m_scriptCanvasAssetNodeId;
  254. }
  255. void ExecutionLogTreeItem::RegisterAnnotation(const ScriptCanvas::AnnotateNodeSignal& annotationSignal, bool allowAddSignal)
  256. {
  257. // The QTreeView does have a setFirstColumnSpanned, but it doesn't seem dynamic, nor model driven.
  258. // So I don't want to use it.
  259. if (allowAddSignal)
  260. {
  261. CreateChildNode<NodeAnnotationTreeItem>(annotationSignal.m_annotationLevel, annotationSignal.m_annotation);
  262. }
  263. else
  264. {
  265. CreateChildNodeWithoutAddSignal<NodeAnnotationTreeItem>(annotationSignal.m_annotationLevel, annotationSignal.m_annotation);
  266. }
  267. }
  268. void ExecutionLogTreeItem::RegisterDataInput(const ScriptCanvas::Endpoint& incitingEndpoint, const ScriptCanvas::SlotId& slotId, AZStd::string_view slotName, AZStd::string_view dataString, bool allowAddSignal)
  269. {
  270. if (!HasExecutionInput() && !HasExecutionOutput())
  271. {
  272. ResolveWrapperNode();
  273. }
  274. DataLogTreeItem* dataTreeItem = nullptr;
  275. for (int i = 0; i < GetChildCount(); ++i)
  276. {
  277. DataLogTreeItem* testLogItem = azrtti_cast<DataLogTreeItem*>(FindChildByRow(i));
  278. if (testLogItem && !testLogItem->HasInput())
  279. {
  280. dataTreeItem = testLogItem;
  281. break;
  282. }
  283. }
  284. if (dataTreeItem == nullptr)
  285. {
  286. if (allowAddSignal)
  287. {
  288. dataTreeItem = CreateChildNode<DataLogTreeItem>(GetGraphIdentifier());
  289. }
  290. else
  291. {
  292. dataTreeItem = CreateChildNodeWithoutAddSignal<DataLogTreeItem>(GetGraphIdentifier());
  293. }
  294. }
  295. ScriptCanvas::Endpoint endpoint(m_scriptCanvasAssetNodeId, slotId);
  296. dataTreeItem->RegisterDataInput(incitingEndpoint, endpoint, slotName, dataString);
  297. }
  298. void ExecutionLogTreeItem::RegisterDataOutput(const ScriptCanvas::SlotId& slotId, AZStd::string_view slotName, AZStd::string_view dataString, bool allowAddSignal)
  299. {
  300. if (!HasExecutionInput() && !HasExecutionOutput())
  301. {
  302. ResolveWrapperNode();
  303. }
  304. DataLogTreeItem* dataTreeItem = nullptr;
  305. for (int i = 0; i < GetChildCount(); ++i)
  306. {
  307. DataLogTreeItem* testLogItem = azrtti_cast<DataLogTreeItem*>(FindChildByRow(i));
  308. if (testLogItem && !testLogItem->HasOutput())
  309. {
  310. dataTreeItem = testLogItem;
  311. break;
  312. }
  313. }
  314. if (dataTreeItem == nullptr)
  315. {
  316. if (allowAddSignal)
  317. {
  318. dataTreeItem = CreateChildNode<DataLogTreeItem>(GetGraphIdentifier());
  319. }
  320. else
  321. {
  322. dataTreeItem = CreateChildNodeWithoutAddSignal<DataLogTreeItem>(GetGraphIdentifier());
  323. }
  324. }
  325. ScriptCanvas::Endpoint endpoint(m_scriptCanvasAssetNodeId, slotId);
  326. dataTreeItem->RegisterDataOutput(endpoint, slotName, dataString);
  327. }
  328. void ExecutionLogTreeItem::RegisterExecutionInput(const ScriptCanvas::Endpoint& incitingEndpoint, const ScriptCanvas::SlotId& slotId, AZStd::string_view slotName, AZStd::chrono::milliseconds relativeExecution)
  329. {
  330. m_timeString = QTime::fromMSecsSinceStartOfDay(aznumeric_cast<int>(relativeExecution.count())).toString("mm:ss.zzz");
  331. m_inputSlot = slotId;
  332. m_inputName = slotName.data();
  333. SetIncitingEndpoint(incitingEndpoint);
  334. if (!HasExecutionOutput())
  335. {
  336. ResolveWrapperNode();
  337. }
  338. PopulateInputSlotData();
  339. SignalDataChanged();
  340. }
  341. bool ExecutionLogTreeItem::HasExecutionInput() const
  342. {
  343. return m_inputSlot.IsValid();
  344. }
  345. void ExecutionLogTreeItem::RegisterExecutionOutput(const ScriptCanvas::SlotId& slotId, AZStd::string_view slotName, AZStd::chrono::milliseconds relativeExecution)
  346. {
  347. if (!HasExecutionInput())
  348. {
  349. m_timeString = QTime::fromMSecsSinceStartOfDay(aznumeric_cast<int>(relativeExecution.count())).toString("mm:ss.zzz");
  350. }
  351. m_outputSlot = slotId;
  352. m_outputName = slotName.data();
  353. if (!HasExecutionInput())
  354. {
  355. ResolveWrapperNode();
  356. }
  357. PopulateOutputSlotData();
  358. SignalDataChanged();
  359. }
  360. bool ExecutionLogTreeItem::HasExecutionOutput() const
  361. {
  362. return m_outputSlot.IsValid();
  363. }
  364. void ExecutionLogTreeItem::OnStylesUnloaded()
  365. {
  366. m_iconPixmap = nullptr;
  367. }
  368. void ExecutionLogTreeItem::OnStylesLoaded()
  369. {
  370. GraphCanvas::StyleManagerRequestBus::EventResult(m_iconPixmap, ScriptCanvasEditor::AssetEditorId, &GraphCanvas::StyleManagerRequests::GetConfiguredPaletteIcon, m_paletteConfiguration);
  371. SignalDataChanged();
  372. }
  373. void ExecutionLogTreeItem::OnAssetVisualized()
  374. {
  375. ScrapeGraphCanvasData();
  376. for (int i = 0; i < GetChildCount(); ++i)
  377. {
  378. DataLogTreeItem* dataLogTreeItem = azrtti_cast<DataLogTreeItem*>(FindChildByRow(i));
  379. if (dataLogTreeItem)
  380. {
  381. dataLogTreeItem->ScrapeData();
  382. }
  383. }
  384. }
  385. void ExecutionLogTreeItem::OnAssetUnloaded()
  386. {
  387. EditorGraphNotificationBus::Handler::BusDisconnect();
  388. m_scriptCanvasNodeId.SetInvalid();
  389. m_graphCanvasGraphId.SetInvalid();
  390. m_graphCanvasNodeId.SetInvalid();
  391. for (int i = 0; i < GetChildCount(); ++i)
  392. {
  393. DataLogTreeItem* dataLogTreeItem = azrtti_cast<DataLogTreeItem*>(FindChildByRow(i));
  394. if (dataLogTreeItem)
  395. {
  396. dataLogTreeItem->InvalidateEditorIds();
  397. }
  398. }
  399. }
  400. void ExecutionLogTreeItem::OnGraphCanvasSceneDisplayed()
  401. {
  402. m_graphCanvasGraphId.SetInvalid();
  403. m_graphCanvasNodeId.SetInvalid();
  404. for (int i = 0; i < GetChildCount(); ++i)
  405. {
  406. DataLogTreeItem* dataLogTreeItem = azrtti_cast<DataLogTreeItem*>(FindChildByRow(i));
  407. if (dataLogTreeItem)
  408. {
  409. dataLogTreeItem->InvalidateGraphCanvasIds();
  410. }
  411. }
  412. ScrapeGraphCanvasData();
  413. }
  414. const ScriptCanvas::GraphIdentifier& ExecutionLogTreeItem::GetGraphIdentifier() const
  415. {
  416. return m_graphIdentifier;
  417. }
  418. AZ::Data::AssetId ExecutionLogTreeItem::GetAssetId() const
  419. {
  420. return m_graphInfo.Id();
  421. }
  422. AZ::EntityId ExecutionLogTreeItem::GetScriptCanvasAssetNodeId() const
  423. {
  424. return m_scriptCanvasAssetNodeId;
  425. }
  426. GraphCanvas::NodeId ExecutionLogTreeItem::GetGraphCanvasNodeId() const
  427. {
  428. return m_graphCanvasNodeId;
  429. }
  430. bool ExecutionLogTreeItem::OnMatchesFilter(const DebugLogFilter& treeFilter)
  431. {
  432. bool matches = false;
  433. matches = matches || (m_displayName.lastIndexOf(treeFilter.m_filter) >= 0);
  434. matches = matches || (m_inputName.lastIndexOf(treeFilter.m_filter) >= 0);
  435. matches = matches || (m_outputName.lastIndexOf(treeFilter.m_filter) >= 0);
  436. matches = matches || (m_graphName.lastIndexOf(treeFilter.m_filter) >= 0);
  437. matches = matches || (m_sourceEntityName.lastIndexOf(treeFilter.m_filter) >= 0);
  438. matches = matches || (m_timeString.lastIndexOf(treeFilter.m_filter) >= 0);
  439. return matches;
  440. }
  441. void ExecutionLogTreeItem::ResolveWrapperNode(bool refreshData)
  442. {
  443. if (m_graphCanvasNodeId.IsValid())
  444. {
  445. if (GraphCanvas::GraphUtils::IsWrapperNode(m_graphCanvasNodeId))
  446. {
  447. AZ::EntityId originalNodeId = m_graphCanvasNodeId;
  448. ScriptCanvas::SlotId slotId;
  449. if (HasExecutionInput())
  450. {
  451. slotId = m_inputSlot;
  452. }
  453. if (HasExecutionOutput())
  454. {
  455. slotId = m_outputSlot;
  456. }
  457. GraphCanvas::Endpoint endpoint;
  458. EBusHandlerNodeDescriptorRequestBus::EventResult(endpoint, m_graphCanvasNodeId, &EBusHandlerNodeDescriptorRequests::MapSlotToGraphCanvasEndpoint, slotId);
  459. if (endpoint.IsValid())
  460. {
  461. m_graphCanvasNodeId = endpoint.GetNodeId();
  462. }
  463. if (originalNodeId != m_graphCanvasNodeId && refreshData)
  464. {
  465. ScrapeGraphCanvasData();
  466. }
  467. }
  468. }
  469. }
  470. void ExecutionLogTreeItem::ScrapeBehaviorContextData()
  471. {
  472. if (m_graphName.isEmpty())
  473. {
  474. AZ::Data::AssetInfo assetInfo;
  475. AZ::Data::AssetCatalogRequestBus::BroadcastResult(assetInfo, &AZ::Data::AssetCatalogRequests::GetAssetInfoById, GetAssetId());
  476. AZStd::string fileName;
  477. AzFramework::StringFunc::Path::GetFileName(assetInfo.m_relativePath.c_str(), fileName);
  478. m_relativeGraphPath = assetInfo.m_relativePath.c_str();
  479. m_graphName = fileName.c_str();
  480. if (m_graphName.isEmpty())
  481. {
  482. m_graphName = "Unknown Canvas";
  483. m_relativeGraphPath = GetAssetId().ToString<AZStd::string>().c_str();
  484. }
  485. }
  486. const NodePaletteModelInformation* modelInformation = nullptr;
  487. GeneralRequestBus::BroadcastResult(modelInformation, &GeneralRequests::FindNodePaletteModelInformation, m_nodeType);
  488. if (modelInformation)
  489. {
  490. const CategoryInformation* categoryInformation = nullptr;
  491. GeneralRequestBus::BroadcastResult(categoryInformation, &GeneralRequests::FindNodePaletteCategoryInformation, modelInformation->m_categoryPath);
  492. m_displayName = QString(modelInformation->m_displayName.c_str());
  493. if (categoryInformation && categoryInformation->m_paletteOverride.compare(GraphCanvas::NodePaletteTreeItem::DefaultNodeTitlePalette) != 0)
  494. {
  495. m_paletteConfiguration.SetColorPalette(categoryInformation->m_paletteOverride);
  496. }
  497. else if (!modelInformation->m_titlePaletteOverride.empty())
  498. {
  499. m_paletteConfiguration.SetColorPalette(modelInformation->m_titlePaletteOverride);
  500. }
  501. else
  502. {
  503. m_paletteConfiguration.SetColorPalette(GraphCanvas::NodePaletteTreeItem::DefaultNodeTitlePalette);
  504. }
  505. }
  506. OnStylesLoaded();
  507. SignalDataChanged();
  508. }
  509. void ExecutionLogTreeItem::ScrapeGraphCanvasData()
  510. {
  511. if (!m_graphCanvasGraphId.IsValid())
  512. {
  513. GeneralRequestBus::BroadcastResult(m_graphCanvasGraphId
  514. , &GeneralRequests::FindGraphCanvasGraphIdByAssetId, SourceHandle(nullptr, GetAssetId().m_guid));
  515. if (!EditorGraphNotificationBus::Handler::BusIsConnected())
  516. {
  517. ScriptCanvas::ScriptCanvasId scriptCanvasId;
  518. GeneralRequestBus::BroadcastResult(scriptCanvasId
  519. , &GeneralRequests::FindScriptCanvasIdByAssetId, SourceHandle(nullptr, GetAssetId().m_guid));
  520. EditorGraphNotificationBus::Handler::BusConnect(scriptCanvasId);
  521. }
  522. }
  523. if (m_graphCanvasGraphId.IsValid())
  524. {
  525. if (!m_graphCanvasNodeId.IsValid())
  526. {
  527. AssetGraphSceneBus::BroadcastResult(m_scriptCanvasNodeId
  528. , &AssetGraphScene::FindEditorNodeIdByAssetNodeId
  529. , SourceHandle(nullptr, GetAssetId().m_guid), m_scriptCanvasAssetNodeId);
  530. SceneMemberMappingRequestBus::EventResult(m_graphCanvasNodeId, m_scriptCanvasNodeId, &SceneMemberMappingRequests::GetGraphCanvasEntityId);
  531. }
  532. if (m_graphCanvasNodeId.IsValid())
  533. {
  534. const bool refreshDisplayData = false;
  535. ResolveWrapperNode(refreshDisplayData);
  536. AZStd::string displayName;
  537. GraphCanvas::NodeTitleRequestBus::EventResult(displayName, m_graphCanvasNodeId, &GraphCanvas::NodeTitleRequests::GetTitle);
  538. if (!displayName.empty())
  539. {
  540. m_displayName = displayName.c_str();
  541. }
  542. GraphCanvas::NodeTitleRequestBus::Event(m_graphCanvasNodeId, &GraphCanvas::NodeTitleRequests::ConfigureIconConfiguration, m_paletteConfiguration);
  543. OnStylesLoaded();
  544. PopulateInputSlotData();
  545. PopulateOutputSlotData();
  546. SignalDataChanged();
  547. }
  548. }
  549. }
  550. void ExecutionLogTreeItem::PopulateInputSlotData()
  551. {
  552. if (m_graphCanvasNodeId.IsValid() && HasExecutionInput())
  553. {
  554. GraphCanvas::SlotId slotId;
  555. SlotMappingRequestBus::EventResult(slotId, m_graphCanvasNodeId, &SlotMappingRequests::MapToGraphCanvasId, m_inputSlot);
  556. AZStd::string inputName;
  557. GraphCanvas::SlotRequestBus::EventResult(inputName, slotId, &GraphCanvas::SlotRequests::GetName);
  558. if (!inputName.empty())
  559. {
  560. m_inputName = inputName.c_str();
  561. }
  562. }
  563. }
  564. void ExecutionLogTreeItem::PopulateOutputSlotData()
  565. {
  566. if (m_graphCanvasNodeId.IsValid() && HasExecutionOutput())
  567. {
  568. GraphCanvas::SlotId slotId;
  569. SlotMappingRequestBus::EventResult(slotId, m_graphCanvasNodeId, &SlotMappingRequests::MapToGraphCanvasId, m_outputSlot);
  570. AZStd::string outputName;
  571. GraphCanvas::SlotRequestBus::EventResult(outputName, slotId, &GraphCanvas::SlotRequests::GetName);
  572. if (!outputName.empty())
  573. {
  574. m_outputName = outputName.c_str();
  575. }
  576. }
  577. }
  578. ////////////////////
  579. // DataLogTreeItem
  580. ////////////////////
  581. DataLogTreeItem::DataLogTreeItem(const ScriptCanvas::GraphIdentifier& graphIdentifier)
  582. : m_graphIdentifier(graphIdentifier)
  583. {
  584. m_inputName = "---";
  585. m_outputName = "---";
  586. ScrapeData();
  587. }
  588. QVariant DataLogTreeItem::Data(const QModelIndex& index, int role) const
  589. {
  590. switch (index.column())
  591. {
  592. case Column::Input:
  593. {
  594. if (role == Qt::DisplayRole
  595. || role == Qt::ToolTipRole)
  596. {
  597. if (m_inputData.isEmpty())
  598. {
  599. return m_inputName;
  600. }
  601. return QString("%1 - (%2)").arg(m_inputName, m_inputData);
  602. }
  603. }
  604. break;
  605. case Column::Output:
  606. {
  607. if (role == Qt::DisplayRole
  608. || role == Qt::ToolTipRole)
  609. {
  610. if (m_outputData.isEmpty())
  611. {
  612. return m_outputName;
  613. }
  614. return QString("%1 - (%2)").arg(m_outputName, m_outputData);
  615. }
  616. }
  617. break;
  618. default:
  619. break;
  620. }
  621. return QVariant();
  622. }
  623. void DataLogTreeItem::RegisterDataInput(const ScriptCanvas::Endpoint& incitingEndpoint, const ScriptCanvas::Endpoint& endpoint, AZStd::string_view slotName, AZStd::string_view dataString)
  624. {
  625. SetIncitingEndpoint(incitingEndpoint);
  626. m_assetInputEndpoint = endpoint;
  627. m_inputName = slotName.data();
  628. m_inputData = dataString.data();
  629. ScrapeInputName();
  630. }
  631. bool DataLogTreeItem::HasInput() const
  632. {
  633. return m_assetInputEndpoint.IsValid();
  634. }
  635. void DataLogTreeItem::RegisterDataOutput(const ScriptCanvas::Endpoint& endpoint, AZStd::string_view slotName, AZStd::string_view dataString)
  636. {
  637. m_assetOutputEndpoint = endpoint;
  638. m_outputName = slotName.data();
  639. m_outputData = dataString.data();
  640. ScrapeOutputName();
  641. }
  642. bool DataLogTreeItem::HasOutput() const
  643. {
  644. return m_assetOutputEndpoint.IsValid();
  645. }
  646. bool DataLogTreeItem::OnMatchesFilter(const DebugLogFilter& treeFilter)
  647. {
  648. bool matches = false;
  649. matches = matches || (m_inputName.lastIndexOf(treeFilter.m_filter) >= 0);
  650. matches = matches || (m_inputData.lastIndexOf(treeFilter.m_filter) >= 0);
  651. matches = matches || (m_outputName.lastIndexOf(treeFilter.m_filter) >= 0);
  652. matches = matches || (m_outputData.lastIndexOf(treeFilter.m_filter) >= 0);
  653. return matches;
  654. }
  655. AZ::Data::AssetId DataLogTreeItem::GetAssetId() const
  656. {
  657. return m_graphIdentifier.m_assetId;
  658. }
  659. void DataLogTreeItem::ScrapeData()
  660. {
  661. if (!m_graphCanvasGraphId.IsValid())
  662. {
  663. GeneralRequestBus::BroadcastResult(m_graphCanvasGraphId
  664. , &GeneralRequests::FindGraphCanvasGraphIdByAssetId, SourceHandle(nullptr, m_graphIdentifier.m_assetId.m_guid));
  665. }
  666. ScrapeInputName();
  667. ScrapeOutputName();
  668. }
  669. void DataLogTreeItem::InvalidateEditorIds()
  670. {
  671. InvalidateGraphCanvasIds();
  672. }
  673. void DataLogTreeItem::InvalidateGraphCanvasIds()
  674. {
  675. m_graphCanvasGraphId.SetInvalid();
  676. }
  677. void DataLogTreeItem::ScrapeInputName()
  678. {
  679. if (m_graphCanvasGraphId.IsValid() && m_assetInputEndpoint.IsValid())
  680. {
  681. AZ::EntityId scriptCanvasNodeId;
  682. AssetGraphSceneBus::BroadcastResult(scriptCanvasNodeId, &AssetGraphScene::FindEditorNodeIdByAssetNodeId, SourceHandle(nullptr, GetAssetId().m_guid), m_assetInputEndpoint.GetNodeId());
  683. GraphCanvas::NodeId graphCanvasNodeId;
  684. SceneMemberMappingRequestBus::EventResult(graphCanvasNodeId, scriptCanvasNodeId, &SceneMemberMappingRequests::GetGraphCanvasEntityId);
  685. GraphCanvas::SlotId slotId;
  686. SlotMappingRequestBus::EventResult(slotId, graphCanvasNodeId, &SlotMappingRequests::MapToGraphCanvasId, m_assetInputEndpoint.GetSlotId());
  687. AZStd::string name;
  688. GraphCanvas::SlotRequestBus::EventResult(name, slotId, &GraphCanvas::SlotRequests::GetName);
  689. if (!name.empty())
  690. {
  691. m_inputName = name.c_str();
  692. }
  693. }
  694. }
  695. void DataLogTreeItem::ScrapeOutputName()
  696. {
  697. if (m_graphCanvasGraphId.IsValid() && m_assetOutputEndpoint.IsValid())
  698. {
  699. AZ::EntityId scriptCanvasNodeId;
  700. AssetGraphSceneBus::BroadcastResult(scriptCanvasNodeId, &AssetGraphScene::FindEditorNodeIdByAssetNodeId
  701. , SourceHandle(nullptr, GetAssetId().m_guid), m_assetOutputEndpoint.GetNodeId());
  702. GraphCanvas::NodeId graphCanvasNodeId;
  703. SceneMemberMappingRequestBus::EventResult(graphCanvasNodeId, scriptCanvasNodeId, &SceneMemberMappingRequests::GetGraphCanvasEntityId);
  704. GraphCanvas::SlotId slotId;
  705. SlotMappingRequestBus::EventResult(slotId, graphCanvasNodeId, &SlotMappingRequests::MapToGraphCanvasId, m_assetOutputEndpoint.GetSlotId());
  706. AZStd::string name;
  707. GraphCanvas::SlotRequestBus::EventResult(name, slotId, &GraphCanvas::SlotRequests::GetName);
  708. if (!name.empty())
  709. {
  710. m_outputName = name.c_str();
  711. }
  712. }
  713. }
  714. bool DataLogTreeItem::LessThan(const GraphCanvas::GraphCanvasTreeItem* graphItem) const
  715. {
  716. return !azrtti_istypeof<const NodeAnnotationTreeItem*>(graphItem);
  717. }
  718. ///////////////////////////
  719. // NodeAnnotationTreeItem
  720. ///////////////////////////
  721. NodeAnnotationTreeItem::NodeAnnotationTreeItem()
  722. : m_annotationLevel(ScriptCanvas::AnnotateNodeSignal::AnnotationLevel::Info)
  723. {
  724. }
  725. NodeAnnotationTreeItem::NodeAnnotationTreeItem(ScriptCanvas::AnnotateNodeSignal::AnnotationLevel annotationLevel, const AZStd::string& annotation)
  726. : m_annotationLevel(annotationLevel)
  727. , m_annotation(annotation.c_str())
  728. {
  729. switch (m_annotationLevel)
  730. {
  731. case ScriptCanvas::AnnotateNodeSignal::AnnotationLevel::Info:
  732. m_annotationIcon = QIcon(":/ScriptCanvasEditorResources/Resources/message_icon.png");
  733. break;
  734. case ScriptCanvas::AnnotateNodeSignal::AnnotationLevel::Warning:
  735. m_annotationIcon = QIcon(":/ScriptCanvasEditorResources/Resources/warning_symbol.png");
  736. break;
  737. case ScriptCanvas::AnnotateNodeSignal::AnnotationLevel::Error:
  738. m_annotationIcon = QIcon(":/ScriptCanvasEditorResources/Resources/error_icon.png");
  739. break;
  740. default:
  741. break;
  742. }
  743. }
  744. QVariant NodeAnnotationTreeItem::Data(const QModelIndex& index, int role) const
  745. {
  746. // We are spanned, we we only have a single column
  747. if (index.column() == DebugLogTreeItem::Column::NodeName)
  748. {
  749. switch (role)
  750. {
  751. case Qt::DecorationRole:
  752. {
  753. return m_annotationIcon;
  754. }
  755. case Qt::DisplayRole:
  756. {
  757. return m_annotation;
  758. }
  759. case Qt::ToolTipRole:
  760. {
  761. return m_annotation;
  762. }
  763. default:
  764. break;
  765. }
  766. }
  767. return QVariant();
  768. }
  769. bool NodeAnnotationTreeItem::OnMatchesFilter(const DebugLogFilter& treeFilter)
  770. {
  771. bool matches = false;
  772. matches = matches || (m_annotation.lastIndexOf(treeFilter.m_filter) >= 0);
  773. return matches;
  774. }
  775. }