Jelajahi Sumber

Adds Warning Dialog When Following an External Link in Project Manager (#6003)

Signed-off-by: Alex Peterson <[email protected]>
AMZN-nggieber 3 tahun lalu
induk
melakukan
b3bf02a4d5

+ 5 - 5
Code/Tools/ProjectManager/Resources/ProjectManager.qss

@@ -232,6 +232,11 @@ QTabBar::tab:focus {
                             stop: 0 #555555, stop: 1.0 #777777);
 }
 
+#dialogSubTitle {
+    font-size:14px;
+    font-weight:600;
+}
+
 #horizontalSeparatingLine {
     color: #666666;
 }
@@ -604,11 +609,6 @@ QProgressBar::chunk {
                             stop: 0 #951D1F, stop: 1.0 #C92724);
 }
 
-#gemCatalogDialogSubTitle {
-    font-size:14px;
-    font-weight:600;
-}
-
 /************** Filter Tag widget **************/
 
 #FilterTagWidgetTextLabel {

+ 98 - 0
Code/Tools/ProjectManager/Source/ExternalLinkDialog.cpp

@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+
+#include <ExternalLinkDialog.h>
+#include <LinkWidget.h>
+#include <ProjectManagerSettings.h>
+
+#include <AzCore/Settings/SettingsRegistry.h>
+
+#include <QDialogButtonBox>
+#include <QLabel>
+#include <QPushButton>
+#include <QHBoxLayout>
+#include <QVBoxLayout>
+#include <QVariant>
+#include <QIcon>
+#include <QCheckBox>
+
+namespace O3DE::ProjectManager
+{
+    ExternalLinkDialog::ExternalLinkDialog(const QUrl& url, QWidget* parent)
+        : QDialog(parent)
+    {
+        setWindowTitle(tr("Leaving O3DE"));
+        setObjectName("ExternalLinkDialog");
+        setAttribute(Qt::WA_DeleteOnClose);
+        setModal(true);
+
+        QHBoxLayout* hLayout = new QHBoxLayout();
+        hLayout->setMargin(30);
+        hLayout->setAlignment(Qt::AlignTop);
+        setLayout(hLayout);
+
+        QVBoxLayout* warningLayout = new QVBoxLayout();
+        warningLayout->setMargin(0);
+        warningLayout->setAlignment(Qt::AlignTop);
+        hLayout->addLayout(warningLayout);
+
+        QLabel* warningIcon = new QLabel(this);
+        warningIcon->setPixmap(QIcon(":/Warning.svg").pixmap(32, 32));
+        warningLayout->addWidget(warningIcon);
+
+        warningLayout->addStretch();
+
+        QVBoxLayout* layout = new QVBoxLayout();
+        layout->setMargin(0);
+        layout->setAlignment(Qt::AlignTop);
+        hLayout->addLayout(layout);
+
+        // Body
+        QLabel* subTitleLabel = new QLabel(tr("You are about to leave O3DE Project Manager to visit an external link."));
+        subTitleLabel->setObjectName("dialogSubTitle");
+        layout->addWidget(subTitleLabel);
+
+        layout->addSpacing(10);
+
+        QLabel* bodyLabel = new QLabel(tr("If you trust this source, you can proceed to this link, or click \"Cancel\" to return."));
+        layout->addWidget(bodyLabel);
+
+        // Don't actually set linkUrl we are just using LinkLabel superficially here
+        LinkLabel* linkLabel = new LinkLabel(url.toString(), {}, 12);
+        layout->addWidget(linkLabel);
+
+        layout->addSpacing(40);
+
+        QCheckBox* skipDialogCheckbox = new QCheckBox(tr("Do not show this again"));
+        layout->addWidget(skipDialogCheckbox);
+        connect(skipDialogCheckbox, &QCheckBox::stateChanged, this, &ExternalLinkDialog::SetSkipDialogSetting);
+
+        // Buttons
+        QDialogButtonBox* dialogButtons = new QDialogButtonBox();
+        dialogButtons->setObjectName("footer");
+        layout->addWidget(dialogButtons);
+
+        QPushButton* cancelButton = dialogButtons->addButton(tr("Cancel"), QDialogButtonBox::RejectRole);
+        cancelButton->setProperty("secondary", true);
+        QPushButton* acceptButton = dialogButtons->addButton(tr("Proceed"), QDialogButtonBox::ApplyRole);
+
+        connect(cancelButton, &QPushButton::clicked, this, &QDialog::reject);
+        connect(acceptButton, &QPushButton::clicked, this, &QDialog::accept);
+    }
+
+    void ExternalLinkDialog::SetSkipDialogSetting(bool state)
+    {
+        auto settingsRegistry = AZ::SettingsRegistry::Get();
+        if (settingsRegistry)
+        {
+            QString settingsKey = GetExternalLinkWarningKey();
+            settingsRegistry->Set(settingsKey.toStdString().c_str(), state);
+            SaveProjectManagerSettings();
+        }
+    }
+} // namespace O3DE::ProjectManager

+ 28 - 0
Code/Tools/ProjectManager/Source/ExternalLinkDialog.h

@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+
+#pragma once
+
+#if !defined(Q_MOC_RUN)
+#include <QDialog>
+#endif
+
+namespace O3DE::ProjectManager
+{
+    class ExternalLinkDialog
+        : public QDialog
+    {
+        Q_OBJECT // AUTOMOC
+    public:
+        explicit ExternalLinkDialog(const QUrl& url, QWidget* parent = nullptr);
+        ~ExternalLinkDialog() = default;
+
+    private slots:
+        void SetSkipDialogSetting(bool state);
+    };
+} // namespace O3DE::ProjectManager

+ 1 - 1
Code/Tools/ProjectManager/Source/GemCatalog/GemUninstallDialog.cpp

@@ -31,7 +31,7 @@ namespace O3DE::ProjectManager
 
         // Body
         QLabel* subTitleLabel = new QLabel(tr("Are you sure you want to uninstall %1?").arg(gemName));
-        subTitleLabel->setObjectName("gemCatalogDialogSubTitle");
+        subTitleLabel->setObjectName("dialogSubTitle");
         layout->addWidget(subTitleLabel);
 
         layout->addSpacing(10);

+ 1 - 1
Code/Tools/ProjectManager/Source/GemCatalog/GemUpdateDialog.cpp

@@ -32,7 +32,7 @@ namespace O3DE::ProjectManager
         // Body
         QLabel* subTitleLabel = new QLabel(tr("%1 to the latest version of %2?").arg(
                                            updateAvaliable ? tr("Update") : tr("Force update"), gemName));
-        subTitleLabel->setObjectName("gemCatalogDialogSubTitle");
+        subTitleLabel->setObjectName("dialogSubTitle");
         layout->addWidget(subTitleLabel);
 
         layout->addSpacing(10);

+ 28 - 1
Code/Tools/ProjectManager/Source/LinkWidget.cpp

@@ -7,6 +7,11 @@
  */
 
 #include <LinkWidget.h>
+#include <ExternalLinkDialog.h>
+#include <ProjectManagerSettings.h>
+
+#include <AzCore/Settings/SettingsRegistry.h>
+
 #include <QDesktopServices>
 #include <QEvent>
 #include <QMouseEvent>
@@ -26,7 +31,29 @@ namespace O3DE::ProjectManager
     {
         if (m_url.isValid())
         {
-            QDesktopServices::openUrl(m_url);
+            // Check if user request not to be shown external link warning dialog
+            bool skipDialog = false;
+            auto settingsRegistry = AZ::SettingsRegistry::Get();
+
+            if (settingsRegistry)
+            {
+                QString settingsKey = GetExternalLinkWarningKey();
+                settingsRegistry->Get(skipDialog, settingsKey.toStdString().c_str());
+            }
+
+            if (!skipDialog)
+            {
+                // Style does not apply if LinkLabel is parent so use parentWidget as parent instead
+                ExternalLinkDialog* linkDialog = new ExternalLinkDialog(m_url.toString(), parentWidget());
+                if (linkDialog->exec() == QDialog::Accepted)
+                {
+                    QDesktopServices::openUrl(m_url);
+                }
+            }
+            else
+            {
+                QDesktopServices::openUrl(m_url);
+            }
         }
 
         emit clicked();

+ 6 - 1
Code/Tools/ProjectManager/Source/ProjectManagerSettings.cpp

@@ -6,7 +6,7 @@
  *
  */
 
-#include "ProjectManagerSettings.h"
+#include <ProjectManagerSettings.h>
 
 #include <AzCore/Settings/SettingsRegistryMergeUtils.h>
 #include <AzCore/IO/ByteContainerStream.h>
@@ -51,4 +51,9 @@ namespace O3DE::ProjectManager
     {
         return QString("%1/Projects/%2/BuiltSuccessfully").arg(ProjectManagerKeyPrefix).arg(projectName);
     }
+
+    QString GetExternalLinkWarningKey()
+    {
+        return QString("%1/SkipExternalLinkWarning").arg(ProjectManagerKeyPrefix);
+    }
 }

+ 1 - 0
Code/Tools/ProjectManager/Source/ProjectManagerSettings.h

@@ -18,4 +18,5 @@ namespace O3DE::ProjectManager
 
     void SaveProjectManagerSettings();
     QString GetProjectBuiltSuccessfullyKey(const QString& projectName);
+    QString GetExternalLinkWarningKey();
 }

+ 2 - 0
Code/Tools/ProjectManager/project_manager_files.cmake

@@ -78,6 +78,8 @@ set(FILES
     Source/TagWidget.cpp
     Source/TemplateButtonWidget.h
     Source/TemplateButtonWidget.cpp
+    Source/ExternalLinkDialog.h
+    Source/ExternalLinkDialog.cpp
     Source/GemCatalog/GemCatalogHeaderWidget.h
     Source/GemCatalog/GemCatalogHeaderWidget.cpp
     Source/GemCatalog/GemCatalogScreen.h