VariableConfigurationWidget.cpp 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  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 <QAction>
  9. #include <QCompleter>
  10. #include <QEvent>
  11. #include <QGraphicsScene>
  12. #include <QGraphicsView>
  13. #include <QAction>
  14. #include <QMenu>
  15. #include <QMessageBox>
  16. #include <QScopedValueRollback>
  17. #include <QLineEdit>
  18. #include <QTimer>
  19. #include <QPushButton>
  20. #include <QHeaderView>
  21. #include <AzCore/Component/ComponentApplication.h>
  22. #include <AzCore/RTTI/BehaviorContext.h>
  23. #include <AzCore/UserSettings/UserSettings.h>
  24. #include <AzCore/Serialization/SerializeContext.h>
  25. #include <AzCore/Serialization/EditContext.h>
  26. #include <AzToolsFramework/Entity/EditorEntityContextPickingBus.h>
  27. #include <AzToolsFramework/ToolsComponents/EditorComponentBase.h>
  28. #include <GraphCanvas/Components/VisualBus.h>
  29. #include <GraphCanvas/Components/SceneBus.h>
  30. #include <GraphCanvas/Components/StyleBus.h>
  31. #include <Editor/View/Widgets/VariablePanel/VariableConfigurationWidget.h>
  32. #include <Editor/View/Widgets/VariablePanel/ui_VariableConfigurationWidget.h>
  33. #include <Data/Data.h>
  34. #include <Editor/GraphCanvas/GraphCanvasEditorNotificationBusId.h>
  35. #include <Editor/QtMetaTypes.h>
  36. #include <Editor/Settings.h>
  37. #include <Editor/Translation/TranslationHelper.h>
  38. #include <Editor/View/Widgets/DataTypePalette/DataTypePaletteModel.h>
  39. #include <Editor/View/Widgets/NodePalette/VariableNodePaletteTreeItemTypes.h>
  40. #include <Editor/View/Widgets/PropertyGridBus.h>
  41. #include <Editor/Include/ScriptCanvas/Bus/EditorScriptCanvasBus.h>
  42. #include <Editor/Include/ScriptCanvas/GraphCanvas/NodeDescriptorBus.h>
  43. #include <ScriptCanvas/Core/NodeBus.h>
  44. #include <ScriptCanvas/Data/DataRegistry.h>
  45. #include <ScriptCanvas/GraphCanvas/NodeDescriptorBus.h>
  46. #include <ScriptCanvas/Asset/RuntimeAsset.h>
  47. namespace ScriptCanvasEditor
  48. {
  49. ///////////////////////
  50. // VariableConfigurationWidget
  51. ///////////////////////
  52. VariableConfigurationWidget::VariableConfigurationWidget
  53. ( const ScriptCanvas::ScriptCanvasId& scriptCanvasId
  54. , const VariablePaletteRequests::VariableConfigurationInput& input
  55. , QWidget* parent)
  56. : AzQtComponents::StyledDialog(parent)
  57. , ui(new Ui::VariableConfigurationWidget())
  58. , m_scriptCanvasId(scriptCanvasId)
  59. , m_input(input)
  60. {
  61. ui->setupUi(this);
  62. {
  63. const auto windowTitle = AZStd::string::format("Pick %s name/type", input.m_configurationVariableTitle.c_str());
  64. setWindowTitle(QCoreApplication::translate("VariableConfigurationWidget", windowTitle.c_str(), nullptr));
  65. const auto labelText = AZStd::string::format("%s Name", input.m_configurationVariableTitle.c_str());
  66. ui->label->setText(QCoreApplication::translate("VariableConfigurationWidget", labelText.c_str(), nullptr));
  67. const auto slotPlaceHolderText = AZStd::string::format("Type the name for your %s here...", input.m_configurationVariableTitle.c_str());
  68. ui->slotName->setPlaceholderText(QCoreApplication::translate("VariableConfigurationWidget", slotPlaceHolderText.c_str(), nullptr));
  69. const auto label_2Text = AZStd::string::format("%s Type", input.m_configurationVariableTitle.c_str());
  70. ui->label_2->setText(QCoreApplication::translate("VariableConfigurationWidget", label_2Text.c_str(), nullptr));
  71. }
  72. ui->variablePalette->SetActiveScene(scriptCanvasId);
  73. ui->searchFilter->setClearButtonEnabled(true);
  74. QObject::connect(ui->searchFilter, &QLineEdit::textChanged, this, &VariableConfigurationWidget::OnQuickFilterChanged);
  75. QObject::connect(ui->slotName, &QLineEdit::returnPressed, this, &VariableConfigurationWidget::OnReturnPressed);
  76. QObject::connect(ui->slotName, &QLineEdit::textChanged, this, &VariableConfigurationWidget::OnNameChanged);
  77. QObject::connect(ui->variablePalette, &QTableView::clicked, this, [this]() { ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true); });
  78. QObject::connect(ui->variablePalette, &VariablePaletteTableView::CreateNamedVariable, this, [this](const AZStd::string& variableName, const ScriptCanvas::Data::Type& variableType)
  79. {
  80. // only emitted on container types
  81. OnCreateVariable(variableType);
  82. OnNameChanged(variableName.c_str());
  83. });
  84. // Tell the widget to auto create our context menu, for now
  85. setContextMenuPolicy(Qt::ActionsContextMenu);
  86. ui->searchFilter->setEnabled(true);
  87. QObject::connect(ui->variablePalette, &VariablePaletteTableView::CreateVariable, this, &VariableConfigurationWidget::OnCreateVariable);
  88. m_filterTimer.setInterval(250);
  89. m_filterTimer.setSingleShot(true);
  90. m_filterTimer.stop();
  91. QObject::connect(&m_filterTimer, &QTimer::timeout, this, &VariableConfigurationWidget::UpdateFilter);
  92. ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
  93. }
  94. VariableConfigurationWidget::~VariableConfigurationWidget()
  95. {
  96. }
  97. void VariableConfigurationWidget::PopulateVariablePalette(const AZStd::unordered_set< AZ::Uuid >& objectTypes)
  98. {
  99. ui->variablePalette->PopulateVariablePalette(objectTypes);
  100. }
  101. void VariableConfigurationWidget::OnEscape()
  102. {
  103. reject();
  104. }
  105. void VariableConfigurationWidget::focusOutEvent(QFocusEvent* )
  106. {
  107. reject();
  108. }
  109. const ScriptCanvas::ScriptCanvasId& VariableConfigurationWidget::GetActiveScriptCanvasId() const
  110. {
  111. return m_scriptCanvasId;
  112. }
  113. void VariableConfigurationWidget::ShowVariablePalette()
  114. {
  115. ClearFilter();
  116. ui->searchFilter->setPlaceholderText("Variable Type...");
  117. FocusOnSearchFilter();
  118. ui->searchFilter->setCompleter(ui->variablePalette->GetVariableCompleter());
  119. AzToolsFramework::EditorEvents::Bus::Handler::BusConnect();
  120. }
  121. void VariableConfigurationWidget::FocusOnSearchFilter()
  122. {
  123. ui->searchFilter->setFocus(Qt::FocusReason::MouseFocusReason);
  124. }
  125. void VariableConfigurationWidget::ClearFilter()
  126. {
  127. {
  128. QSignalBlocker blocker(ui->searchFilter);
  129. ui->searchFilter->setText("");
  130. }
  131. UpdateFilter();
  132. }
  133. void VariableConfigurationWidget::UpdateFilter()
  134. {
  135. ui->variablePalette->SetFilter(ui->searchFilter->userInputText());
  136. }
  137. void VariableConfigurationWidget::OnReturnPressed()
  138. {
  139. // Set the type to the slot
  140. if (!m_selectedType.IsNull())
  141. {
  142. m_slotName = ui->slotName->text().toUtf8().data();
  143. accept();
  144. }
  145. }
  146. AZ::Uuid VariableConfigurationWidget::GetSelectedType() const
  147. {
  148. return m_selectedType;
  149. }
  150. AZStd::string VariableConfigurationWidget::GetSlotName() const
  151. {
  152. return m_slotName;
  153. }
  154. void VariableConfigurationWidget::SetSlotName(AZStd::string name)
  155. {
  156. m_slotName = name;
  157. ui->slotName->setText(QString(name.c_str()));
  158. }
  159. void VariableConfigurationWidget::OnQuickFilterChanged(const QString& text)
  160. {
  161. if (text.isEmpty())
  162. {
  163. //If field was cleared, update immediately
  164. UpdateFilter();
  165. return;
  166. }
  167. m_filterTimer.stop();
  168. m_filterTimer.start();
  169. }
  170. void VariableConfigurationWidget::OnNameChanged(const QString& text)
  171. {
  172. bool nameInUse = false;
  173. const AZStd::unordered_map<ScriptCanvas::VariableId, ScriptCanvas::GraphVariable>* properties = nullptr;
  174. ScriptCanvas::GraphVariableManagerRequestBus::EventResult(properties, m_scriptCanvasId, &ScriptCanvas::GraphVariableManagerRequests::GetVariables);
  175. int numInUse = 0;
  176. if (properties)
  177. {
  178. for (const auto& variablePair : (*properties))
  179. {
  180. if (&variablePair.second != m_input.m_graphVariable)
  181. {
  182. AZStd::string testName = text.toUtf8().data();
  183. if (testName.compare(variablePair.second.GetVariableName()) == 0)
  184. {
  185. nameInUse = true;
  186. ++numInUse;
  187. }
  188. }
  189. else
  190. {
  191. // the variable being renamed is the one being modified, so it can use its own name
  192. break;
  193. }
  194. }
  195. }
  196. m_slotName = text.toUtf8().data();
  197. if (nameInUse)
  198. {
  199. m_slotName.append(AZStd::string::format(" (%d)", numInUse));
  200. ui->slotName->setText(m_slotName.c_str());
  201. }
  202. }
  203. void VariableConfigurationWidget::OnContextMenuRequested(const QPoint&)
  204. {
  205. }
  206. void VariableConfigurationWidget::OnCreateVariable(ScriptCanvas::Data::Type varType)
  207. {
  208. m_selectedType = varType.GetAZType();
  209. }
  210. #include <Editor/View/Widgets/VariablePanel/moc_VariableConfigurationWidget.cpp>
  211. }