VariableConfigurationWidget.cpp 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  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. accept();
  84. });
  85. // Tell the widget to auto create our context menu, for now
  86. setContextMenuPolicy(Qt::ActionsContextMenu);
  87. ui->searchFilter->setEnabled(true);
  88. QObject::connect(ui->variablePalette, &VariablePaletteTableView::CreateVariable, this, &VariableConfigurationWidget::OnCreateVariable);
  89. m_filterTimer.setInterval(250);
  90. m_filterTimer.setSingleShot(true);
  91. m_filterTimer.stop();
  92. QObject::connect(&m_filterTimer, &QTimer::timeout, this, &VariableConfigurationWidget::UpdateFilter);
  93. ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
  94. }
  95. VariableConfigurationWidget::~VariableConfigurationWidget()
  96. {
  97. }
  98. void VariableConfigurationWidget::PopulateVariablePalette(const AZStd::unordered_set< AZ::Uuid >& objectTypes)
  99. {
  100. ui->variablePalette->PopulateVariablePalette(objectTypes);
  101. }
  102. void VariableConfigurationWidget::OnEscape()
  103. {
  104. reject();
  105. }
  106. void VariableConfigurationWidget::focusOutEvent(QFocusEvent* )
  107. {
  108. reject();
  109. }
  110. const ScriptCanvas::ScriptCanvasId& VariableConfigurationWidget::GetActiveScriptCanvasId() const
  111. {
  112. return m_scriptCanvasId;
  113. }
  114. void VariableConfigurationWidget::ShowVariablePalette()
  115. {
  116. ClearFilter();
  117. ui->searchFilter->setPlaceholderText("Variable Type...");
  118. FocusOnSearchFilter();
  119. ui->searchFilter->setCompleter(ui->variablePalette->GetVariableCompleter());
  120. AzToolsFramework::EditorEvents::Bus::Handler::BusConnect();
  121. }
  122. void VariableConfigurationWidget::FocusOnSearchFilter()
  123. {
  124. ui->searchFilter->setFocus(Qt::FocusReason::MouseFocusReason);
  125. }
  126. void VariableConfigurationWidget::ClearFilter()
  127. {
  128. {
  129. QSignalBlocker blocker(ui->searchFilter);
  130. ui->searchFilter->setText("");
  131. }
  132. UpdateFilter();
  133. }
  134. void VariableConfigurationWidget::UpdateFilter()
  135. {
  136. ui->variablePalette->SetFilter(ui->searchFilter->userInputText());
  137. }
  138. void VariableConfigurationWidget::OnReturnPressed()
  139. {
  140. // Set the type to the slot
  141. if (!m_selectedType.IsNull())
  142. {
  143. m_slotName = ui->slotName->text().toUtf8().data();
  144. accept();
  145. }
  146. }
  147. AZ::Uuid VariableConfigurationWidget::GetSelectedType() const
  148. {
  149. return m_selectedType;
  150. }
  151. AZStd::string VariableConfigurationWidget::GetSlotName() const
  152. {
  153. return m_slotName;
  154. }
  155. void VariableConfigurationWidget::SetSlotName(AZStd::string name)
  156. {
  157. m_slotName = name;
  158. ui->slotName->setText(QString(name.c_str()));
  159. }
  160. void VariableConfigurationWidget::OnQuickFilterChanged(const QString& text)
  161. {
  162. if (text.isEmpty())
  163. {
  164. //If field was cleared, update immediately
  165. UpdateFilter();
  166. return;
  167. }
  168. m_filterTimer.stop();
  169. m_filterTimer.start();
  170. }
  171. void VariableConfigurationWidget::OnNameChanged(const QString& text)
  172. {
  173. bool nameInUse = false;
  174. const AZStd::unordered_map<ScriptCanvas::VariableId, ScriptCanvas::GraphVariable>* properties = nullptr;
  175. ScriptCanvas::GraphVariableManagerRequestBus::EventResult(properties, m_scriptCanvasId, &ScriptCanvas::GraphVariableManagerRequests::GetVariables);
  176. int numInUse = 0;
  177. if (properties)
  178. {
  179. for (const auto& variablePair : (*properties))
  180. {
  181. if (&variablePair.second != m_input.m_graphVariable)
  182. {
  183. AZStd::string testName = text.toUtf8().data();
  184. if (testName.compare(variablePair.second.GetVariableName()) == 0)
  185. {
  186. nameInUse = true;
  187. ++numInUse;
  188. }
  189. }
  190. else
  191. {
  192. // the variable being renamed is the one being modified, so it can use its own name
  193. break;
  194. }
  195. }
  196. }
  197. m_slotName = text.toUtf8().data();
  198. if (nameInUse)
  199. {
  200. m_slotName.append(AZStd::string::format(" (%d)", numInUse));
  201. ui->slotName->setText(m_slotName.c_str());
  202. }
  203. }
  204. void VariableConfigurationWidget::OnContextMenuRequested(const QPoint&)
  205. {
  206. }
  207. void VariableConfigurationWidget::OnCreateVariable(ScriptCanvas::Data::Type varType)
  208. {
  209. m_selectedType = varType.GetAZType();
  210. }
  211. #include <Editor/View/Widgets/VariablePanel/moc_VariableConfigurationWidget.cpp>
  212. }