From d0dd80099cfde8cf71f232ca671a48401855d8d5 Mon Sep 17 00:00:00 2001 From: AMZN-Phil Date: Fri, 2 Jul 2021 16:07:26 -0700 Subject: [PATCH] Open editor button and new project and failed warnings. Signed-off-by: AMZN-Phil --- .../Source/ProjectBuilderController.cpp | 8 ++ .../Source/ProjectBuilderController.h | 1 + .../Source/ProjectBuilderWorker.cpp | 2 +- .../Source/ProjectButtonWidget.cpp | 113 +++++++++++++++++- .../Source/ProjectButtonWidget.h | 18 +++ .../Tools/ProjectManager/Source/ProjectInfo.h | 3 + .../ProjectManager/Source/ProjectsScreen.cpp | 17 ++- 7 files changed, 155 insertions(+), 7 deletions(-) diff --git a/Code/Tools/ProjectManager/Source/ProjectBuilderController.cpp b/Code/Tools/ProjectManager/Source/ProjectBuilderController.cpp index 00e2e5d68d..33defeec8b 100644 --- a/Code/Tools/ProjectManager/Source/ProjectBuilderController.cpp +++ b/Code/Tools/ProjectManager/Source/ProjectBuilderController.cpp @@ -92,10 +92,18 @@ namespace O3DE::ProjectManager // Open application assigned to this file type QDesktopServices::openUrl(QUrl("file:///" + m_worker->GetLogFilePath())); } + + m_projectInfo.m_buildFailed = true; + m_projectInfo.m_logUrl = QUrl("file:///" + m_worker->GetLogFilePath()); + emit NotifyBuildProject(m_projectInfo); } else { QMessageBox::critical(m_parent, tr("Project Failed to Build!"), result); + + m_projectInfo.m_buildFailed = true; + m_projectInfo.m_logUrl = QUrl(); + emit NotifyBuildProject(m_projectInfo); } emit Done(false); diff --git a/Code/Tools/ProjectManager/Source/ProjectBuilderController.h b/Code/Tools/ProjectManager/Source/ProjectBuilderController.h index c3e3026b34..15ad5412b3 100644 --- a/Code/Tools/ProjectManager/Source/ProjectBuilderController.h +++ b/Code/Tools/ProjectManager/Source/ProjectBuilderController.h @@ -38,6 +38,7 @@ namespace O3DE::ProjectManager signals: void Done(bool success = true); + void NotifyBuildProject(const ProjectInfo& projectInfo); private: ProjectInfo m_projectInfo; diff --git a/Code/Tools/ProjectManager/Source/ProjectBuilderWorker.cpp b/Code/Tools/ProjectManager/Source/ProjectBuilderWorker.cpp index 45034686c3..63899035e0 100644 --- a/Code/Tools/ProjectManager/Source/ProjectBuilderWorker.cpp +++ b/Code/Tools/ProjectManager/Source/ProjectBuilderWorker.cpp @@ -14,7 +14,7 @@ namespace O3DE::ProjectManager { - const QString ProjectBuilderWorker::BuildCancelled = ProjectBuilderWorker::tr("Build Cancelled."); + const QString ProjectBuilderWorker::BuildCancelled = QObject::tr("Build Cancelled."); ProjectBuilderWorker::ProjectBuilderWorker(const ProjectInfo& projectInfo) : QObject() diff --git a/Code/Tools/ProjectManager/Source/ProjectButtonWidget.cpp b/Code/Tools/ProjectManager/Source/ProjectButtonWidget.cpp index 68a43b3b52..cce9da5734 100644 --- a/Code/Tools/ProjectManager/Source/ProjectButtonWidget.cpp +++ b/Code/Tools/ProjectManager/Source/ProjectButtonWidget.cpp @@ -11,6 +11,7 @@ #include #include +#include #include #include #include @@ -20,6 +21,7 @@ #include #include #include +#include namespace O3DE::ProjectManager { @@ -40,8 +42,57 @@ namespace O3DE::ProjectManager m_overlayLabel->setVisible(false); vLayout->addWidget(m_overlayLabel); + m_buildOverlayLayout = new QVBoxLayout(); + m_buildOverlayLayout->addSpacing(10); + + QHBoxLayout* horizontalMessageLayout = new QHBoxLayout(); + + horizontalMessageLayout->addSpacing(10); + m_warningIcon = new QLabel(this); + m_warningIcon->setPixmap(QIcon(":/Warning.svg").pixmap(20, 20)); + m_warningIcon->setAlignment(Qt::AlignTop); + m_warningIcon->setVisible(false); + horizontalMessageLayout->addWidget(m_warningIcon); + + horizontalMessageLayout->addSpacing(10); + + m_warningText = new QLabel("", this); + m_warningText->setObjectName("projectWarningOverlay"); + m_warningText->setWordWrap(true); + m_warningText->setAlignment(Qt::AlignLeft); + m_warningText->setVisible(false); + connect(m_warningText, &QLabel::linkActivated, this, &LabelButton::OnLinkActivated); + horizontalMessageLayout->addWidget(m_warningText); + + QSpacerItem* textSpacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding); + horizontalMessageLayout->addSpacerItem(textSpacer); + + m_buildOverlayLayout->addLayout(horizontalMessageLayout); + + QSpacerItem* buttonSpacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding); + m_buildOverlayLayout->addSpacerItem(buttonSpacer); + + QHBoxLayout* horizontalOpenEditorButtonLayout = new QHBoxLayout(); + horizontalOpenEditorButtonLayout->addSpacing(34); + m_openEditorButton = new QPushButton(tr("Open Editor"), this); + m_openEditorButton->setObjectName("openEditorButton"); + m_openEditorButton->setDefault(true); + m_openEditorButton->setVisible(false); + horizontalOpenEditorButtonLayout->addWidget(m_openEditorButton); + horizontalOpenEditorButtonLayout->addSpacing(34); + m_buildOverlayLayout->addLayout(horizontalOpenEditorButtonLayout); + + QHBoxLayout* horizontalButtonLayout = new QHBoxLayout(); + horizontalButtonLayout->addSpacing(34); m_actionButton = new QPushButton(tr("Project Action"), this); m_actionButton->setVisible(false); + horizontalButtonLayout->addWidget(m_actionButton); + horizontalButtonLayout->addSpacing(34); + + m_buildOverlayLayout->addLayout(horizontalButtonLayout); + m_buildOverlayLayout->addSpacing(16); + + vLayout->addItem(m_buildOverlayLayout); m_progressBar = new QProgressBar(this); m_progressBar->setObjectName("labelButtonProgressBar"); @@ -73,16 +124,41 @@ namespace O3DE::ProjectManager return m_overlayLabel; } + void LabelButton::SetLogUrl(const QUrl& url) + { + m_logUrl = url; + } + QProgressBar* LabelButton::GetProgressBar() { return m_progressBar; } + QPushButton* LabelButton::GetOpenEditorButton() + { + return m_openEditorButton; + } + QPushButton* LabelButton::GetActionButton() { return m_actionButton; } + QLabel* LabelButton::GetWarningLabel() + { + return m_warningText; + } + + QLabel* LabelButton::GetWarningIcon() + { + return m_warningIcon; + } + + void LabelButton::OnLinkActivated(const QString& /*link*/) + { + QDesktopServices::openUrl(m_logUrl); + } + ProjectButton::ProjectButton(const ProjectInfo& projectInfo, QWidget* parent, bool processing) : QFrame(parent) , m_projectInfo(projectInfo) @@ -110,7 +186,6 @@ namespace O3DE::ProjectManager m_projectImageLabel = new LabelButton(this); m_projectImageLabel->setFixedSize(ProjectPreviewImageWidth, ProjectPreviewImageHeight); m_projectImageLabel->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); - connect(m_projectImageLabel, &LabelButton::triggered, [this]() { emit OpenProject(m_projectInfo.m_path); }); vLayout->addWidget(m_projectImageLabel); QString projectPreviewPath = QDir(m_projectInfo.m_path).filePath(m_projectInfo.m_iconPath); @@ -145,6 +220,8 @@ namespace O3DE::ProjectManager void ProjectButton::ReadySetup() { + connect(m_projectImageLabel->GetOpenEditorButton(), &QPushButton::clicked, [this](){ emit OpenProject(m_projectInfo.m_path); }); + QMenu* menu = new QMenu(this); menu->addAction(tr("Edit Project Settings..."), this, [this]() { emit EditProject(m_projectInfo.m_path); }); menu->addAction(tr("Build"), this, [this]() { emit BuildProject(m_projectInfo); }); @@ -170,9 +247,6 @@ namespace O3DE::ProjectManager QPushButton* projectActionButton = m_projectImageLabel->GetActionButton(); if (!m_actionButtonConnection) { - QSpacerItem* buttonSpacer = new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding); - m_projectImageLabel->layout()->addItem(buttonSpacer); - m_projectImageLabel->layout()->addWidget(projectActionButton); projectActionButton->setVisible(true); } else @@ -186,6 +260,27 @@ namespace O3DE::ProjectManager void ProjectButton::SetProjectBuildButtonAction() { + m_projectImageLabel->GetWarningLabel()->setText(tr("Building project required.")); + m_projectImageLabel->GetWarningIcon()->setVisible(true); + m_projectImageLabel->GetWarningLabel()->setVisible(true); + SetProjectButtonAction(tr("Build Project"), [this]() { emit BuildProject(m_projectInfo); }); + } + + void ProjectButton::ShowBuildFailed(bool show, const QUrl& logUrl) + { + if (!logUrl.isEmpty()) + { + m_projectImageLabel->GetWarningLabel()->setText(tr("Failed to build. Click to view logs.")); + } + else + { + m_projectImageLabel->GetWarningLabel()->setText(tr("Project failed to build.")); + } + + m_projectImageLabel->GetWarningLabel()->setTextInteractionFlags(Qt::LinksAccessibleByMouse); + m_projectImageLabel->GetWarningIcon()->setVisible(show); + m_projectImageLabel->GetWarningLabel()->setVisible(show); + m_projectImageLabel->SetLogUrl(logUrl); SetProjectButtonAction(tr("Build Project"), [this]() { emit BuildProject(m_projectInfo); }); } @@ -209,6 +304,16 @@ namespace O3DE::ProjectManager m_projectImageLabel->GetProgressBar()->setValue(progress); } + void ProjectButton::enterEvent(QEvent* /*event*/) + { + m_projectImageLabel->GetOpenEditorButton()->setVisible(true); + } + + void ProjectButton::leaveEvent(QEvent* /*event*/) + { + m_projectImageLabel->GetOpenEditorButton()->setVisible(false); + } + LabelButton* ProjectButton::GetLabelButton() { return m_projectImageLabel; diff --git a/Code/Tools/ProjectManager/Source/ProjectButtonWidget.h b/Code/Tools/ProjectManager/Source/ProjectButtonWidget.h index b3b4b2bcf6..a99984c12f 100644 --- a/Code/Tools/ProjectManager/Source/ProjectButtonWidget.h +++ b/Code/Tools/ProjectManager/Source/ProjectButtonWidget.h @@ -20,6 +20,9 @@ QT_FORWARD_DECLARE_CLASS(QPixmap) QT_FORWARD_DECLARE_CLASS(QAction) QT_FORWARD_DECLARE_CLASS(QProgressBar) +QT_FORWARD_DECLARE_CLASS(QLayout) +QT_FORWARD_DECLARE_CLASS(QVBoxLayout) +QT_FORWARD_DECLARE_CLASS(QEvent) namespace O3DE::ProjectManager { @@ -34,21 +37,32 @@ namespace O3DE::ProjectManager void SetEnabled(bool enabled); void SetOverlayText(const QString& text); + void SetLogUrl(const QUrl& url); QLabel* GetOverlayLabel(); QProgressBar* GetProgressBar(); + QPushButton* GetOpenEditorButton(); QPushButton* GetActionButton(); + QLabel* GetWarningLabel(); + QLabel* GetWarningIcon(); + QLayout* GetBuildOverlayLayout(); signals: void triggered(); public slots: void mousePressEvent(QMouseEvent* event) override; + void OnLinkActivated(const QString& link); private: + QVBoxLayout* m_buildOverlayLayout; QLabel* m_overlayLabel; QProgressBar* m_progressBar; + QPushButton* m_openEditorButton; QPushButton* m_actionButton; + QLabel* m_warningText; + QLabel* m_warningIcon; + QUrl m_logUrl; bool m_enabled = true; }; @@ -63,6 +77,7 @@ namespace O3DE::ProjectManager void SetProjectButtonAction(const QString& text, AZStd::function lambda); void SetProjectBuildButtonAction(); + void ShowBuildFailed(bool show, const QUrl& logUrl); void SetLaunchButtonEnabled(bool enabled); void SetButtonOverlayText(const QString& text); @@ -81,11 +96,14 @@ namespace O3DE::ProjectManager void BaseSetup(); void ProcessingSetup(); void ReadySetup(); + void enterEvent(QEvent* event) override; + void leaveEvent(QEvent* event) override; void BuildThisProject(); ProjectInfo m_projectInfo; LabelButton* m_projectImageLabel; QFrame* m_projectFooter; + QLayout* m_requiresBuildLayout; QMetaObject::Connection m_actionButtonConnection; }; diff --git a/Code/Tools/ProjectManager/Source/ProjectInfo.h b/Code/Tools/ProjectManager/Source/ProjectInfo.h index d78ef54c83..a6a661420b 100644 --- a/Code/Tools/ProjectManager/Source/ProjectInfo.h +++ b/Code/Tools/ProjectManager/Source/ProjectInfo.h @@ -9,6 +9,7 @@ #if !defined(Q_MOC_RUN) #include +#include #include #include #endif @@ -54,5 +55,7 @@ namespace O3DE::ProjectManager // Used in project creation bool m_needsBuild = false; //! Does this project need to be built + bool m_buildFailed = false; + QUrl m_logUrl; }; } // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/ProjectsScreen.cpp b/Code/Tools/ProjectManager/Source/ProjectsScreen.cpp index da30758308..a31cd8b263 100644 --- a/Code/Tools/ProjectManager/Source/ProjectsScreen.cpp +++ b/Code/Tools/ProjectManager/Source/ProjectsScreen.cpp @@ -193,7 +193,19 @@ namespace O3DE::ProjectManager } else if (RequiresBuildProjectIterator(project.m_path) != m_requiresBuild.end()) { - projectButtonWidget->SetProjectBuildButtonAction(); + auto buildProjectIterator = RequiresBuildProjectIterator(project.m_path); + if (buildProjectIterator != m_requiresBuild.end()) + { + if (buildProjectIterator->m_buildFailed) + { + projectButtonWidget->ShowBuildFailed(true, buildProjectIterator->m_logUrl); + } + else + { + projectButtonWidget->SetProjectBuildButtonAction(); + } + } + } } @@ -418,7 +430,7 @@ namespace O3DE::ProjectManager void ProjectsScreen::SuggestBuildProjectMsg(const ProjectInfo& projectInfo, bool showMessage) { - if (RequiresBuildProjectIterator(projectInfo.m_path) == m_requiresBuild.end()) + if (RequiresBuildProjectIterator(projectInfo.m_path) == m_requiresBuild.end() || projectInfo.m_buildFailed) { m_requiresBuild.append(projectInfo); } @@ -517,6 +529,7 @@ namespace O3DE::ProjectManager m_currentBuilder = new ProjectBuilderController(projectInfo, nullptr, this); ResetProjectsContent(); connect(m_currentBuilder, &ProjectBuilderController::Done, this, &ProjectsScreen::ProjectBuildDone); + connect(m_currentBuilder, &ProjectBuilderController::NotifyBuildProject, this, &ProjectsScreen::SuggestBuildProject); m_currentBuilder->Start(); }