diff --git a/Gems/ScriptCanvas/Code/Editor/Components/GraphUpgrade.cpp b/Gems/ScriptCanvas/Code/Editor/Components/GraphUpgrade.cpp index 2754cc9777..0e5f11fa40 100644 --- a/Gems/ScriptCanvas/Code/Editor/Components/GraphUpgrade.cpp +++ b/Gems/ScriptCanvas/Code/Editor/Components/GraphUpgrade.cpp @@ -519,7 +519,7 @@ namespace ScriptCanvasEditor if (validationResults.HasErrors()) { - AZ::Interface::Get()->GraphNeedsManualUpgrade(sm->m_asset.GetId()); + sm->MarkError("Failed to Parse"); for (auto& err : validationResults.GetEvents()) { @@ -735,7 +735,7 @@ namespace ScriptCanvasEditor { AZ::SystemTickBus::Handler::BusDisconnect(); - OnComplete(exitStatus); + OnComplete(m_error.empty() ? exitStatus : IState::ExitStatus::Skipped); } } diff --git a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Bus/EditorScriptCanvasBus.h b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Bus/EditorScriptCanvasBus.h index 7c47c77b3e..02edce4974 100644 --- a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Bus/EditorScriptCanvasBus.h +++ b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Bus/EditorScriptCanvasBus.h @@ -215,20 +215,6 @@ namespace ScriptCanvasEditor using EditorLoggingComponentNotificationBus = AZ::EBus; - class IUpgradeRequests - { - public: - AZ_TYPE_INFO(IUpgradeRequests, "{D25318F2-4DDA-4E76-98CB-6D561BB6234D}"); - - using AssetList = AZStd::list; - - virtual void ClearGraphsThatNeedUpgrade() = 0; - virtual void GraphNeedsManualUpgrade(const AZ::Data::AssetId&) = 0; - virtual const AZStd::vector& GetGraphsThatNeedManualUpgrade() const = 0; - virtual bool IsUpgrading() = 0; - virtual void SetIsUpgrading(bool isUpgrading) = 0; - }; - class UpgradeNotifications : public AZ::EBusTraits { diff --git a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/GraphUpgrade.h b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/GraphUpgrade.h index 89ee0f3b55..f67bc11244 100644 --- a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/GraphUpgrade.h +++ b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/GraphUpgrade.h @@ -133,18 +133,23 @@ namespace ScriptCanvasEditor bool GetVerbose() const; + const AZStd::string GetError() const { return m_error; } + void SetVerbose(bool isVerbose); const AZStd::string& GetDebugPrefix() const; void SetDebugPrefix(AZStd::string_view); + void MarkError(AZStd::string_view error) { m_error = error; } + AZStd::shared_ptr m_currentState = nullptr; AZStd::vector> m_states; private: bool m_isVerbose = true; AZStd::string m_debugPrefix; + AZStd::string m_error; }; //! This state machine will collect and share a variety of data from the EditorGraph diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp b/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp index ee539aa5fa..4da806f2e8 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp @@ -3435,18 +3435,18 @@ namespace ScriptCanvasEditor void MainWindow::RunUpgradeTool() { + using namespace VersionExplorer; auto versionExplorer = aznew VersionExplorer::Controller(this); versionExplorer->exec(); - // update and fix this - // Manual correction -// size_t assetsThatNeedManualInspection = AZ::Interface::Get()->GetGraphsThatNeedManualUpgrade().size(); -// // If there are graphs that need manual correction, show the helper -// if (assetsThatNeedManualInspection > 0) -// { -// UpgradeHelper* upgradeHelper = new UpgradeHelper(this); -// upgradeHelper->show(); -// } + const ModificationResults* result = nullptr; + ModelRequestsBus::BroadcastResult(result, &ModelRequestsTraits::GetResults); + if (result && !result->m_failures.empty()) + { + // If there are graphs that need manual correction, show the helper + UpgradeHelper* upgradeHelper = new UpgradeHelper(this); + upgradeHelper->show(); + } delete versionExplorer; } diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Controller.cpp b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Controller.cpp index f3ea605451..9d7224373f 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Controller.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Controller.cpp @@ -58,6 +58,7 @@ namespace ScriptCanvasEditor m_view->progressBar->setValue(0); m_view->progressBar->setVisible(false); + UpgradeNotificationsBus::Handler::BusConnect(); ModelNotificationsBus::Handler::BusConnect(); } @@ -78,8 +79,8 @@ namespace ScriptCanvasEditor for (auto& entry : *logs) { - auto line = "\n" + entry; - textCursor.insertText(line.c_str()); + textCursor.insertText("\n"); + textCursor.insertText(entry.c_str()); } scrollBar->setValue(scrollBar->maximum()); @@ -253,6 +254,7 @@ namespace ScriptCanvasEditor m_view->progressBar->setVisible(true); ++m_handledAssetCount; m_view->progressBar->setValue(m_handledAssetCount); + AddLogEntries(); } void Controller::OnGraphUpgradeComplete(AZ::Data::Asset& asset, bool skipped) @@ -408,7 +410,7 @@ namespace ScriptCanvasEditor void Controller::OnUpgradeBegin ( const ModifyConfiguration& config - , [[maybe_unused]] const AZStd::vector& assets) + , [[maybe_unused]] const WorkingAssets& assets) { for (int row = 0; row < m_view->tableWidget->rowCount(); ++row) { @@ -447,6 +449,7 @@ namespace ScriptCanvasEditor , result.m_failures.size())); m_view->spinner->SetText(spinnerText); SetSpinnerIsBusy(false); + AddLogEntries(); } void Controller::OnUpgradeDependenciesGathered(const AZ::Data::AssetInfo& info, Result result) @@ -472,11 +475,12 @@ namespace ScriptCanvasEditor m_view->progressBar->setVisible(true); ++m_handledAssetCount; m_view->progressBar->setValue(m_handledAssetCount); + AddLogEntries(); } void Controller::OnUpgradeDependencySortBegin ( [[maybe_unused]] const ModifyConfiguration& config - , const AZStd::vector& assets) + , const WorkingAssets& assets) { m_handledAssetCount = 0; m_view->progressBar->setVisible(true); @@ -502,7 +506,7 @@ namespace ScriptCanvasEditor void Controller::OnUpgradeDependencySortEnd ( [[maybe_unused]] const ModifyConfiguration& config - , const AZStd::vector& assets + , const WorkingAssets& assets , [[maybe_unused]] const AZStd::vector& sortedOrder) { m_handledAssetCount = 0; @@ -522,6 +526,7 @@ namespace ScriptCanvasEditor QString spinnerText = QStringLiteral("Upgrade in progress - gathering dependencies is complete"); m_view->spinner->SetText(spinnerText); SetSpinnerIsBusy(false); + AddLogEntries(); } void Controller::SetRowBusy(int index) diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Controller.h b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Controller.h index 1b8b109759..0fb3ce1bf4 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Controller.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Controller.h @@ -50,7 +50,7 @@ namespace ScriptCanvasEditor AZ_CLASS_ALLOCATOR(Controller, AZ::SystemAllocator, 0); explicit Controller(QWidget* parent = nullptr); - + private: static constexpr int ColumnAsset = 0; static constexpr int ColumnAction = 1; @@ -61,7 +61,6 @@ namespace ScriptCanvasEditor int m_handledAssetCount = 0; void AddLogEntries(); - void OnButtonPressClose(); void OnButtonPressScan(); void OnButtonPressUpgrade(); @@ -78,15 +77,13 @@ namespace ScriptCanvasEditor void OnScannedGraphResult(const AZ::Data::AssetInfo& info); // for single operation UI updates, just check the assets size, or note it on the request - void OnUpgradeBegin(const ModifyConfiguration& config, const AZStd::vector& assets) override; + void OnUpgradeBegin(const ModifyConfiguration& config, const WorkingAssets& assets) override; void OnUpgradeComplete(const ModificationResults& results) override; void OnUpgradeDependenciesGathered(const AZ::Data::AssetInfo& info, Result result) override; - void OnUpgradeDependencySortBegin - ( const ModifyConfiguration& config - , const AZStd::vector& assets) override; + void OnUpgradeDependencySortBegin(const ModifyConfiguration& config, const WorkingAssets& assets) override; void OnUpgradeDependencySortEnd ( const ModifyConfiguration& config - , const AZStd::vector& assets + , const WorkingAssets& assets , const AZStd::vector& sortedOrder) override; void OnUpgradeModificationBegin(const ModifyConfiguration& config, const AZ::Data::AssetInfo& info) override; void OnUpgradeModificationEnd(const ModifyConfiguration& config, const AZ::Data::AssetInfo& info, ModificationResult result) override; diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Model.cpp b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Model.cpp index b88d147d6d..ed17293ab7 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Model.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Model.cpp @@ -61,10 +61,16 @@ namespace ScriptCanvasEditor ScriptCanvas::Grammar::g_saveRawTranslationOuputToFile = false; } + const ModificationResults* Model::GetResults() + { + return !IsWorking() ? &m_modResults : nullptr; + } + void Model::Idle() { m_state = State::Idle; m_keepEditorAlive.reset(); + m_log.Deactivate(); } bool Model::IsReadyToModify() const @@ -95,7 +101,9 @@ namespace ScriptCanvasEditor return; } + m_modResults = {}; m_state = State::Modifying; + m_log.Activate(); m_keepEditorAlive = AZStd::make_unique(); auto results = m_scanner->TakeResult(); m_modifier = AZStd::make_unique(modification, AZStd::move(results.m_unfiltered), [this](){ OnModificationComplete(); }); @@ -124,6 +132,7 @@ namespace ScriptCanvasEditor } m_state = State::Scanning; + m_log.Activate(); m_keepEditorAlive = AZStd::make_unique(); m_scanner = AZStd::make_unique(config, [this](){ OnScanComplete(); }); } diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Model.h b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Model.h index 637c77648a..e11f8857e7 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Model.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Model.h @@ -43,6 +43,8 @@ namespace ScriptCanvasEditor Model(); + const ModificationResults* GetResults() override; + void Modify(const ModifyConfiguration& modification) override; void Scan(const ScanConfiguration& config) override; @@ -64,6 +66,8 @@ namespace ScriptCanvasEditor AZStd::unique_ptr m_settingsCache; AZStd::unique_ptr m_keepEditorAlive; + ModificationResults m_modResults; + void CacheSettings(); void Idle(); bool IsReadyToModify() const; diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/ModelTraits.h b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/ModelTraits.h index 6eedba647f..026748c344 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/ModelTraits.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/ModelTraits.h @@ -14,6 +14,14 @@ namespace ScriptCanvasEditor { namespace VersionExplorer { + struct WorkingAsset + { + AZ::Data::Asset asset; + AZ::Data::AssetInfo info; + }; + + using WorkingAssets = AZStd::vector; + struct ModifyConfiguration { AZStd::function)> modification; @@ -30,13 +38,11 @@ namespace ScriptCanvasEditor AZStd::string errorMessage; }; - class ModificationNotificationsTraits - : public AZ::EBusTraits + struct ModificationResults { - public: - virtual void ModificationComplete(const ModificationResult& result) = 0; + AZStd::vector m_successes; + AZStd::vector m_failures; }; - using ModificationNotificationsBus = AZ::EBus; struct ScanConfiguration { @@ -44,25 +50,10 @@ namespace ScriptCanvasEditor bool reportFilteredGraphs = false; }; - class ModelRequestsTraits - : public AZ::EBusTraits - { - public: - virtual void Modify(const ModifyConfiguration& modification) = 0; - virtual void Scan(const ScanConfiguration& filter) = 0; - }; - using ModelRequestsBus = AZ::EBus; - - struct ModificationResults - { - AZStd::vector m_successes; - AZStd::vector m_failures; - }; - struct ScanResult { AZStd::vector m_catalogAssets; - AZStd::vector m_unfiltered; + WorkingAssets m_unfiltered; AZStd::vector m_filteredAssets; AZStd::vector m_loadErrors; }; @@ -73,6 +64,24 @@ namespace ScriptCanvasEditor Success }; + class ModificationNotificationsTraits + : public AZ::EBusTraits + { + public: + virtual void ModificationComplete(const ModificationResult& result) = 0; + }; + using ModificationNotificationsBus = AZ::EBus; + + class ModelRequestsTraits + : public AZ::EBusTraits + { + public: + virtual const ModificationResults* GetResults() = 0; + virtual void Modify(const ModifyConfiguration& modification) = 0; + virtual void Scan(const ScanConfiguration& filter) = 0; + }; + using ModelRequestsBus = AZ::EBus; + class ModelNotificationsTraits : public AZ::EBusTraits { @@ -83,15 +92,13 @@ namespace ScriptCanvasEditor virtual void OnScanLoadFailure(const AZ::Data::AssetInfo& info) = 0; virtual void OnScanUnFilteredGraph(const AZ::Data::AssetInfo& info) = 0; - virtual void OnUpgradeBegin(const ModifyConfiguration& config, const AZStd::vector& assets) = 0; + virtual void OnUpgradeBegin(const ModifyConfiguration& config, const WorkingAssets& assets) = 0; virtual void OnUpgradeComplete(const ModificationResults& results) = 0; virtual void OnUpgradeDependenciesGathered(const AZ::Data::AssetInfo& info, Result result) = 0; - virtual void OnUpgradeDependencySortBegin - ( const ModifyConfiguration& config - , const AZStd::vector& assets) = 0; + virtual void OnUpgradeDependencySortBegin(const ModifyConfiguration& config, const WorkingAssets& assets) = 0; virtual void OnUpgradeDependencySortEnd ( const ModifyConfiguration& config - , const AZStd::vector& assets + , const WorkingAssets& assets , const AZStd::vector& sortedOrder) = 0; virtual void OnUpgradeModificationBegin(const ModifyConfiguration& config, const AZ::Data::AssetInfo& info) = 0; virtual void OnUpgradeModificationEnd(const ModifyConfiguration& config, const AZ::Data::AssetInfo& info, ModificationResult result) = 0; diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Modifier.cpp b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Modifier.cpp index 4096508b8b..1bd33bbe49 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Modifier.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Modifier.cpp @@ -23,7 +23,7 @@ namespace ScriptCanvasEditor { Modifier::Modifier ( const ModifyConfiguration& modification - , AZStd::vector&& assets + , WorkingAssets&& assets , AZStd::function onComplete) : m_state(State::GatheringDependencies) , m_config(modification) @@ -38,8 +38,8 @@ namespace ScriptCanvasEditor const AZ::Data::AssetInfo& Modifier::GetCurrentAsset() const { return m_state == State::GatheringDependencies - ? m_assets[m_assetIndex] - : m_assets[m_dependencyOrderedAssetIndicies[m_assetIndex]]; + ? m_assets[m_assetIndex].info + : m_assets[m_dependencyOrderedAssetIndicies[m_assetIndex]].info; } AZStd::unordered_set& Modifier::GetOrCreateDependencyIndexSet() @@ -183,6 +183,7 @@ namespace ScriptCanvasEditor { ModelNotificationsBus::Broadcast ( &ModelNotificationsTraits::OnUpgradeModificationEnd, m_config, GetCurrentAsset(), m_result); + ModificationNotificationsBus::Handler::BusDisconnect(); m_modifyState = ModifyState::Idle; ++m_assetIndex; m_result = {}; @@ -271,7 +272,7 @@ namespace ScriptCanvasEditor for (size_t index = 0; index != m_assets.size(); ++index) { - m_assetInfoIndexById.insert({ m_assets[index].m_assetId.m_guid, index }); + m_assetInfoIndexById.insert({ m_assets[index].info.m_assetId.m_guid, index }); } } else diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Modifier.h b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Modifier.h index f318627cbe..2a8a12e3cf 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Modifier.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Modifier.h @@ -26,7 +26,7 @@ namespace ScriptCanvasEditor Modifier ( const ModifyConfiguration& modification - , AZStd::vector&& assets + , WorkingAssets&& assets , AZStd::function onComplete); const ModificationResults& GetResult() const; @@ -66,7 +66,7 @@ namespace ScriptCanvasEditor size_t m_assetIndex = 0; AZStd::function m_onComplete; // asset infos in scanned order - AZStd::vector m_assets; + WorkingAssets m_assets; // dependency sorted order indices into the asset vector AZStd::vector m_dependencyOrderedAssetIndicies; // dependency indices by asset info index (only exist if graphs have them) diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Scanner.cpp b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Scanner.cpp index 26765a9f97..bc69f6e634 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Scanner.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Scanner.cpp @@ -45,7 +45,7 @@ namespace ScriptCanvasEditor else { VE_LOG("Scanner: Included: %s ", GetCurrentAsset().m_relativePath.c_str()); - m_result.m_unfiltered.push_back(GetCurrentAsset()); + m_result.m_unfiltered.push_back({ asset, GetCurrentAsset() }); ModelNotificationsBus::Broadcast(&ModelNotificationsTraits::OnScanUnFilteredGraph, GetCurrentAsset()); } } diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/UpgradeHelper.cpp b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/UpgradeHelper.cpp index 9670bb2f1f..14bc1c4dc8 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/UpgradeHelper.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/UpgradeHelper.cpp @@ -6,37 +6,32 @@ * */ +#include +#include #include #include -#include #include -#include #include -#include "UpgradeHelper.h" - #include #include #include #include - #include #include - +#include +#include #include #include #include - -#include - +#include #include +#include +#include #include #include - #include #include -#include -#include namespace ScriptCanvasEditor { @@ -52,40 +47,47 @@ namespace ScriptCanvasEditor m_ui->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); int rows = 0; - auto& graphsToUpgrade = AZ::Interface::Get()->GetGraphsThatNeedManualUpgrade(); - for (auto& assetId : graphsToUpgrade) + const VersionExplorer::ModificationResults* result = nullptr; + VersionExplorer::ModelRequestsBus::BroadcastResult(result, &VersionExplorer::ModelRequestsTraits::GetResults); + + if (result && !result->m_failures.empty()) { - auto assetInfo = ScriptCanvasEditor::AssetHelpers::GetAssetInfo(assetId); - m_ui->tableWidget->insertRow(rows); + for (auto& failedUpdate : result->m_failures) + { + auto& assetInfo = failedUpdate.assetInfo; + auto assetId = assetInfo.m_assetId; - connect(m_ui->closeButton, &QPushButton::pressed, this, &QDialog::accept); - connect(m_ui->tableWidget, &QTableWidget::itemDoubleClicked, this, [this, rows, assetId](QTableWidgetItem* item) - { - if (item && item->data(Qt::UserRole).toInt() == rows) + m_ui->tableWidget->insertRow(rows); + + connect(m_ui->closeButton, &QPushButton::pressed, this, &QDialog::accept); + connect(m_ui->tableWidget, &QTableWidget::itemDoubleClicked, this, [this, rows, assetId](QTableWidgetItem* item) { - OpenGraph(assetId); + if (item && item->data(Qt::UserRole).toInt() == rows) + { + OpenGraph(assetId); + } } - } - ); + ); - auto openGraph = [this, assetId] { - OpenGraph(assetId); - }; + auto openGraph = [this, assetId] { + OpenGraph(assetId); + }; - QTableWidgetItem* rowName = new QTableWidgetItem(tr(assetInfo.m_relativePath.c_str())); - rowName->setData(Qt::UserRole, rows); - m_ui->tableWidget->setItem(rows, 0, rowName); + QTableWidgetItem* rowName = new QTableWidgetItem(tr(assetInfo.m_relativePath.c_str())); + rowName->setData(Qt::UserRole, rows); + m_ui->tableWidget->setItem(rows, 0, rowName); - QToolButton* rowGoToButton = new QToolButton(this); - rowGoToButton->setIcon(QIcon(":/stylesheet/img/UI20/open-in-internal-app.svg")); - rowGoToButton->setToolTip("Open Graph"); - - connect(rowGoToButton, &QToolButton::clicked, openGraph); + QToolButton* rowGoToButton = new QToolButton(this); + rowGoToButton->setIcon(QIcon(":/stylesheet/img/UI20/open-in-internal-app.svg")); + rowGoToButton->setToolTip("Open Graph"); - m_ui->tableWidget->setCellWidget(rows, 1, rowGoToButton); + connect(rowGoToButton, &QToolButton::clicked, openGraph); - ++rows; + m_ui->tableWidget->setCellWidget(rows, 1, rowGoToButton); + + ++rows; + } } }